diff --git a/packages/materials/src/libs/page-tab/index.module.css b/packages/materials/src/libs/page-tab/index.module.css index abf56a5f..d2baf651 100644 --- a/packages/materials/src/libs/page-tab/index.module.css +++ b/packages/materials/src/libs/page-tab/index.module.css @@ -95,3 +95,27 @@ .chrome-tab_dark .chrome-tab-divider { background-color: rgba(255, 255, 255, 0.9); } + +.slider-tab { + background-color: transparent; + height: 100%; + border-bottom: 2px solid transparent; +} + +.slider-tab_dark { + background-color: transparent; +} + +.slider-tab:hover { + color: var(--soy-primary-color); +} + +.slider-tab_active { + color: var(--soy-primary-color); + background-color: var(--soy-primary-color-opacity1); + border-bottom-color: var(--soy-primary-color); +} + +.slider-tab_active_dark { + background-color: var(--soy-primary-color-opacity2); +} diff --git a/packages/materials/src/libs/page-tab/index.module.css.d.ts b/packages/materials/src/libs/page-tab/index.module.css.d.ts index ab45c0a9..47c59994 100644 --- a/packages/materials/src/libs/page-tab/index.module.css.d.ts +++ b/packages/materials/src/libs/page-tab/index.module.css.d.ts @@ -10,6 +10,10 @@ declare const styles: { readonly 'chrome-tab_dark': string; readonly 'chrome-tab-divider': string; readonly 'svg-close': string; + readonly 'slider-tab': string; + readonly 'slider-tab_active': string; + readonly 'slider-tab_active_dark': string; + readonly 'slider-tab_dark': string; }; export default styles; diff --git a/packages/materials/src/libs/page-tab/index.vue b/packages/materials/src/libs/page-tab/index.vue index 8c7b98d2..c1f6b626 100644 --- a/packages/materials/src/libs/page-tab/index.vue +++ b/packages/materials/src/libs/page-tab/index.vue @@ -5,6 +5,7 @@ import type { PageTabMode, PageTabProps } from '../../types'; import { ACTIVE_COLOR, createTabCssVars } from './shared'; import ChromeTab from './chrome-tab.vue'; import ButtonTab from './button-tab.vue'; +import SliderTab from './slider-tab.vue'; import SvgClose from './svg-close.vue'; import style from './index.module.css'; @@ -26,7 +27,7 @@ interface Emits { const emit = defineEmits(); const activeTabComponent = computed(() => { - const { mode, chromeClass, buttonClass } = props; + const { mode, chromeClass, buttonClass, sliderClass } = props; const tabComponentMap = { chrome: { @@ -36,6 +37,10 @@ const activeTabComponent = computed(() => { button: { component: ButtonTab, class: buttonClass + }, + slider: { + component: SliderTab, + class: sliderClass } } satisfies Record; @@ -45,7 +50,7 @@ const activeTabComponent = computed(() => { const cssVars = computed(() => createTabCssVars(props.activeColor)); const bindProps = computed(() => { - const { chromeClass: _chromeCls, buttonClass: _btnCls, ...rest } = props; + const { chromeClass: _chromeCls, buttonClass: _btnCls, sliderClass: _sliderCls, ...rest } = props; return rest; }); diff --git a/packages/materials/src/libs/page-tab/slider-tab.vue b/packages/materials/src/libs/page-tab/slider-tab.vue new file mode 100644 index 00000000..3521e5f3 --- /dev/null +++ b/packages/materials/src/libs/page-tab/slider-tab.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/packages/materials/src/types/index.ts b/packages/materials/src/types/index.ts index 583f0907..a66f3a50 100644 --- a/packages/materials/src/types/index.ts +++ b/packages/materials/src/types/index.ts @@ -239,7 +239,7 @@ export type LayoutCssVars = { * * @default chrome */ -export type PageTabMode = 'button' | 'chrome'; +export type PageTabMode = 'button' | 'chrome' | 'slider'; export interface PageTabProps { /** Whether is dark mode */ @@ -262,6 +262,8 @@ export interface PageTabProps { buttonClass?: string; /** The class of the chrome tab */ chromeClass?: string; + /** The class of the title tab */ + sliderClass?: string; /** Whether the tab is active */ active?: boolean; /** The color of the active tab */ diff --git a/src/constants/app.ts b/src/constants/app.ts index af35e990..b8aafc4f 100644 --- a/src/constants/app.ts +++ b/src/constants/app.ts @@ -40,7 +40,8 @@ export const themeScrollModeOptions = transformRecordToOption(themeScrollModeRec export const themeTabModeRecord: Record = { chrome: 'theme.layout.tab.mode.chrome', - button: 'theme.layout.tab.mode.button' + button: 'theme.layout.tab.mode.button', + slider: 'theme.layout.tab.mode.slider' }; export const themeTabModeOptions = transformRecordToOption(themeTabModeRecord); diff --git a/src/layouts/modules/global-tab/index.vue b/src/layouts/modules/global-tab/index.vue index ef5bb910..2446f133 100644 --- a/src/layouts/modules/global-tab/index.vue +++ b/src/layouts/modules/global-tab/index.vue @@ -169,7 +169,9 @@ init();