Skip to content

Commit 5b9f410

Browse files
committed
feat(tabs): add classic variant
1 parent 4aa3088 commit 5b9f410

File tree

2 files changed

+71
-48
lines changed

2 files changed

+71
-48
lines changed

src/components/tabs/TabsList.vue

Lines changed: 69 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { ColorType } from '../types'
44
export interface TabsListProps {
55
size?: '1' | '2'
66
color?: ColorType
7-
variant?: 'outline' | 'surface' | 'soft'
7+
variant?: 'classic' | 'outline' | 'surface' | 'soft'
88
highContrast?: boolean
99
}
1010
</script>
@@ -40,39 +40,63 @@ const resetClass = buildPropsClass(props, ['variant', 'size', 'highContrast'])
4040
font-style: normal;
4141
scrollbar-width: none;
4242
}
43+
4344
.ui-TabList::-webkit-scrollbar {
4445
display: none;
4546
}
4647
47-
.ui-TabList:where(.r-variant-outline, .r-variant-soft) {
48-
display: flex;
49-
box-shadow: inset 0 -1px 0 0 var(--gray-a5);
48+
.ui-TabList:where(.r-size-1) {
49+
font-size: var(--font-size-1);
50+
line-height: var(--line-height-1);
51+
letter-spacing: var(--letter-spacing-1);
52+
--tab-height: var(--space-6);
53+
--tab-padding-x: var(--space-1);
54+
--tab-radius: max(var(--radius-2), var(--radius-full));
55+
--tab-item-radius: var(--radius-1);
56+
--tab-inner-padding-x: var(--space-1);
57+
--tab-inner-height: var(--space-5);
58+
}
59+
.ui-TabList:where(.r-size-2) {
60+
font-size: var(--font-size-2);
61+
line-height: var(--line-height-2);
62+
letter-spacing: var(--letter-spacing-2);
63+
--tab-height: var(--space-7);
64+
--tab-padding-x: var(--space-2);
65+
--tab-radius: max(var(--radius-3), var(--radius-full));
66+
--tab-item-radius: var(--radius-2);
67+
--tab-inner-padding-x: var(--space-2);
68+
--tab-inner-height: calc(var(--space-6) - var(--space-1));
5069
}
5170
52-
.ui-TabList:where(.r-variant-surface) {
71+
.ui-TabsIndicator {
72+
position: absolute;
73+
left: 0;
74+
transition-property: width, transform;
75+
transform: translateX(var(--reka-tabs-indicator-position));
76+
width: var(--reka-tabs-indicator-size);
77+
}
78+
79+
/** classic & surface */
80+
.ui-TabList:where(.r-variant-surface, .r-variant-classic) {
5381
position: relative;
5482
display: inline-flex;
5583
align-items: center;
5684
justify-content: center;
5785
vertical-align: top;
5886
flex-shrink: 0;
59-
box-shadow: inset 0 0 0 1px var(--gray-a6);
6087
border-radius: var(--tab-radius);
6188
}
6289
63-
.ui-TabsIndicator {
64-
position: absolute;
65-
left: 0;
66-
transition-property: width, transform;
67-
transform: translateX(var(--reka-tabs-indicator-position));
68-
width: var(--reka-tabs-indicator-size);
90+
.ui-TabList:where(.r-variant-classic) {
91+
background-color: var(--accent-a3);
92+
padding-left: var(--tab-padding-x);
93+
padding-right: var(--tab-padding-x);
6994
}
7095
71-
.ui-TabList:where(.r-variant-outline) :where(.ui-TabsIndicator) {
72-
bottom: 0;
73-
height: 2px;
74-
background-color: var(--accent-indicator);
75-
transition-duration: 300ms;
96+
.ui-TabList:where(.r-variant-surface) {
97+
--tab-item-radius: 0;
98+
--tab-inner-height: var(--tab-height);
99+
box-shadow: inset 0 0 0 1px var(--gray-a6);
76100
}
77101
78102
.ui-TabList:where(.r-variant-surface) :where(.ui-TabsIndicator) {
@@ -82,52 +106,51 @@ const resetClass = buildPropsClass(props, ['variant', 'size', 'highContrast'])
82106
transition-duration: 100ms;
83107
}
84108
85-
.ui-TabList:where(.r-variant-soft) :where(.ui-TabsIndicator) {
109+
.ui-TabList:where(.r-variant-classic) :where(.ui-TabsIndicator) {
86110
top: calc((var(--tab-height) - var(--tab-inner-height)) / 2);
87111
height: var(--tab-inner-height);
88-
background-color: var(--accent-a3);
112+
background-color: var(--color-panel-solid);
113+
box-shadow:
114+
0 0 0 0.5px var(--black-a1),
115+
0 1px 1px 0 var(--gray-a2),
116+
0 2px 1px -1px var(--black-a1),
117+
0 1px 3px 0 var(--black-a1);
89118
border-radius: var(--tab-item-radius);
90119
transition-duration: 100ms;
91120
}
92121
93-
.ui-TabList:where(.r-size-1) {
94-
font-size: var(--font-size-1);
95-
line-height: var(--line-height-1);
96-
letter-spacing: var(--letter-spacing-1);
97-
--tab-height: var(--space-6);
98-
--tab-padding-x: var(--space-1);
99-
--tab-radius: max(var(--radius-2), var(--radius-full));
100-
--tab-item-radius: var(--radius-1);
101-
--tab-inner-padding-x: var(--space-1);
102-
--tab-inner-height: var(--space-5);
103-
}
104-
.ui-TabList:where(.r-size-2) {
105-
font-size: var(--font-size-2);
106-
line-height: var(--line-height-2);
107-
letter-spacing: var(--letter-spacing-2);
108-
--tab-height: var(--space-7);
109-
--tab-padding-x: var(--space-2);
110-
--tab-radius: max(var(--radius-3), var(--radius-full));
111-
--tab-item-radius: var(--radius-2);
112-
--tab-inner-padding-x: var(--space-2);
113-
--tab-inner-height: calc(var(--space-6) - var(--space-1));
122+
.ui-TabList:where(.r-variant-surface.r-size-1),
123+
.ui-TabList:where(.r-variant-soft.r-size-1) {
124+
--tab-inner-padding-x: calc(var(--space-2) / 4 * 3);
114125
}
115126
116-
.ui-TabList:where(.r-variant-surface) {
117-
--tab-item-radius: 0;
118-
--tab-inner-height: var(--tab-height);
127+
/** soft & outline */
128+
.ui-TabList:where(.r-variant-outline, .r-variant-soft) {
129+
display: flex;
130+
box-shadow: inset 0 -1px 0 0 var(--gray-a5);
119131
}
120132
121133
.ui-TabList:where(.r-variant-soft) {
122134
padding-left: var(--tab-padding-x);
123135
padding-right: var(--tab-padding-x);
124136
}
125137
126-
.ui-TabList:where(.r-variant-surface.r-size-1),
127-
.ui-TabList:where(.r-variant-soft.r-size-1) {
128-
--tab-inner-padding-x: calc(var(--space-2) / 4 * 3);
138+
.ui-TabList:where(.r-variant-soft) :where(.ui-TabsIndicator) {
139+
top: calc((var(--tab-height) - var(--tab-inner-height)) / 2);
140+
height: var(--tab-inner-height);
141+
background-color: var(--accent-a3);
142+
border-radius: var(--tab-item-radius);
143+
transition-duration: 100ms;
144+
}
145+
146+
.ui-TabList:where(.r-variant-outline) :where(.ui-TabsIndicator) {
147+
bottom: 0;
148+
height: 2px;
149+
background-color: var(--accent-indicator);
150+
transition-duration: 300ms;
129151
}
130152
153+
/** high contrast */
131154
:where(.ui-TabList.r-variant-outline.r-high-contrast) .ui-TabsIndicator {
132155
background-color: var(--accent-12);
133156
}

src/components/tabs/TabsTrigger.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ const forwarded = useForwardProps(props)
7979
}
8080
8181
@media (hover: hover) {
82-
.ui-TabList:where(.r-variant-outline) :where(.ui-TabTrigger:hover) {
82+
.ui-TabList:where(.r-variant-outline, .r-variant-classic) :where(.ui-TabTrigger:hover) {
8383
color: var(--gray-12);
8484
}
8585
.ui-TabList:where(.r-variant-surface, .r-variant-soft) :where(.ui-TabTrigger:hover) {
@@ -103,7 +103,7 @@ const forwarded = useForwardProps(props)
103103
padding-right: var(--tab-padding-x);
104104
}
105105
106-
.ui-TabList:where(.r-variant-outline) :where(.ui-TabTrigger[data-state='active']) {
106+
.ui-TabList:where(.r-variant-classic, .r-variant-outline) :where(.ui-TabTrigger[data-state='active']) {
107107
color: var(--gray-12);
108108
}
109109

0 commit comments

Comments
 (0)