@digiko-npm/designsystem 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/designsystem.css +6683 -4515
  2. package/dist/designsystem.min.css +2 -2
  3. package/package.json +18 -3
  4. package/src/components/accordion.css +129 -128
  5. package/src/components/alert.css +137 -134
  6. package/src/components/avatar.css +77 -77
  7. package/src/components/badge.css +52 -52
  8. package/src/components/bottom-nav.css +71 -71
  9. package/src/components/bottom-sheet.css +146 -0
  10. package/src/components/breadcrumb.css +61 -61
  11. package/src/components/button.css +162 -154
  12. package/src/components/card.css +94 -72
  13. package/src/components/chip.css +38 -38
  14. package/src/components/collapsible.css +96 -100
  15. package/src/components/color-picker.css +82 -0
  16. package/src/components/combobox.css +418 -0
  17. package/src/components/command.css +141 -140
  18. package/src/components/copy-button.css +106 -0
  19. package/src/components/datepicker.css +257 -251
  20. package/src/components/description-list.css +89 -87
  21. package/src/components/divider.css +45 -45
  22. package/src/components/drawer.css +185 -174
  23. package/src/components/drop-zone.css +85 -84
  24. package/src/components/dropdown.css +148 -140
  25. package/src/components/empty-state.css +50 -50
  26. package/src/components/field.css +35 -0
  27. package/src/components/gallery.css +257 -0
  28. package/src/components/icon-btn.css +2 -1
  29. package/src/components/index.css +14 -3
  30. package/src/components/input.css +205 -146
  31. package/src/components/kbd.css +10 -10
  32. package/src/components/modal.css +92 -90
  33. package/src/components/nav.css +140 -137
  34. package/src/components/number-input.css +163 -0
  35. package/src/components/pagination.css +152 -139
  36. package/src/components/pin-input.css +136 -0
  37. package/src/components/popover.css +72 -72
  38. package/src/components/progress.css +128 -129
  39. package/src/components/result.css +53 -57
  40. package/src/components/scroll-area.css +73 -0
  41. package/src/components/search.css +10 -4
  42. package/src/components/segmented-control.css +93 -0
  43. package/src/components/skeleton.css +58 -58
  44. package/src/components/slider.css +102 -100
  45. package/src/components/sortable.css +44 -45
  46. package/src/components/spinner.css +27 -27
  47. package/src/components/star-rating.css +121 -0
  48. package/src/components/stat-card.css +38 -25
  49. package/src/components/table.css +288 -3
  50. package/src/components/tabs.css +121 -121
  51. package/src/components/tag.css +124 -124
  52. package/src/components/timeline.css +99 -99
  53. package/src/components/toast.css +37 -38
  54. package/src/components/toggle.css +88 -88
  55. package/src/components/toolbar.css +137 -121
  56. package/src/components/tooltip.css +150 -150
  57. package/src/components/truncated-text.css +75 -0
  58. package/src/tokens/colors.css +1 -1
  59. package/src/tokens/tokens.json +413 -0
@@ -8,34 +8,47 @@
8
8
  border: 1px solid var(--ds-color-border);
9
9
  border-radius: var(--ds-radius-xl);
10
10
  padding: var(--ds-space-5);
11
- }
11
+ container-type: inline-size;
12
12
 
13
- .ds-stat-card__label {
14
- font-size: var(--ds-text-sm);
15
- color: var(--ds-color-text-tertiary);
16
- }
13
+ &__label {
14
+ font-size: var(--ds-text-sm);
15
+ color: var(--ds-color-text-tertiary);
16
+ }
17
17
 
18
- .ds-stat-card__value {
19
- font-family: var(--ds-font-display);
20
- font-weight: var(--ds-font-display-weight);
21
- font-size: var(--ds-text-2xl);
22
- color: var(--ds-color-text);
23
- margin-block-start: var(--ds-space-1);
24
- }
18
+ &__value {
19
+ font-family: var(--ds-font-display);
20
+ font-weight: var(--ds-font-display-weight);
21
+ font-size: var(--ds-text-2xl);
22
+ color: var(--ds-color-text);
23
+ margin-block-start: var(--ds-space-1);
24
+ }
25
25
 
26
- .ds-stat-card__detail {
27
- font-size: var(--ds-text-xs);
28
- color: var(--ds-color-text-tertiary);
29
- margin-block-start: var(--ds-space-0-5);
26
+ &__detail {
27
+ font-size: var(--ds-text-xs);
28
+ color: var(--ds-color-text-tertiary);
29
+ margin-block-start: var(--ds-space-0-5);
30
+ }
31
+
32
+ &__icon {
33
+ width: 2.5rem;
34
+ height: 2.5rem;
35
+ border-radius: var(--ds-radius-xl);
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ background-color: var(--ds-color-bg-elevated);
40
+ color: var(--ds-color-text-secondary);
41
+ }
30
42
  }
31
43
 
32
- .ds-stat-card__icon {
33
- width: 2.5rem;
34
- height: 2.5rem;
35
- border-radius: var(--ds-radius-xl);
36
- display: flex;
37
- align-items: center;
38
- justify-content: center;
39
- background-color: var(--ds-color-bg-elevated);
40
- color: var(--ds-color-text-secondary);
44
+ /* Container query: compact when narrow */
45
+ @container (max-width: 150px) {
46
+ .ds-stat-card__value {
47
+ font-size: var(--ds-text-lg);
48
+ }
49
+
50
+ .ds-stat-card__icon {
51
+ width: 2rem;
52
+ height: 2rem;
53
+ }
41
54
  }
@@ -1,13 +1,56 @@
1
1
  /* ==========================================================================
2
2
  Component: Table
3
+ Data table with sorting, selection, sticky headers, striping, and
4
+ responsive stacking. Composes with ds-pagination, ds-skeleton, ds-checkbox,
5
+ ds-icon-btn, and ds-empty-state for a full data-table experience.
6
+
7
+ ARIA requirements (consumer responsibility):
8
+ - Use <table> with role="grid" for interactive tables
9
+ - Sort headers: <th aria-sort="ascending|descending|none"> + <button> inside
10
+ - Select-all checkbox: aria-label="Select all rows"
11
+ - Row checkbox: aria-label="Select row [identifier]"
12
+ - Expandable rows: aria-expanded="true|false" on trigger
13
+
14
+ Usage:
15
+ <div class="ds-table-wrapper">
16
+ <table class="ds-table">
17
+ <thead>
18
+ <tr>
19
+ <th class="ds-table__cell--checkbox"><input class="ds-checkbox" /></th>
20
+ <th><button class="ds-table__sort ds-table__sort--asc">Name</button></th>
21
+ <th>Email</th>
22
+ <th class="ds-table__cell--shrink">Actions</th>
23
+ </tr>
24
+ </thead>
25
+ <tbody>
26
+ <tr class="ds-table__row--selected">
27
+ <td class="ds-table__cell--checkbox"><input class="ds-checkbox" /></td>
28
+ <td>John</td>
29
+ <td>john@example.com</td>
30
+ <td class="ds-table__cell--shrink">...</td>
31
+ </tr>
32
+ </tbody>
33
+ </table>
34
+ </div>
35
+
36
+ Modifiers:
37
+ .ds-table--compact — Reduced padding
38
+ .ds-table--dense — Even more compact (minimal padding)
39
+ .ds-table--striped — Alternating row backgrounds
40
+ .ds-table--bordered — Cell borders
41
+ .ds-table--sticky-header — Sticky thead with backdrop blur
42
+ .ds-table--hoverable — Explicit hover class (hover is on by default)
43
+ .ds-table--no-hover — Disable row hover
3
44
  ========================================================================== */
4
45
 
5
46
  .ds-table {
6
47
  width: 100%;
7
48
  text-align: start;
8
49
  font-size: var(--ds-text-sm);
50
+ border-collapse: collapse;
9
51
  }
10
52
 
53
+ /* --- Header cells --- */
11
54
  .ds-table th {
12
55
  padding: var(--ds-space-3) var(--ds-space-4);
13
56
  font-weight: var(--ds-weight-medium);
@@ -16,28 +59,210 @@
16
59
  text-transform: uppercase;
17
60
  letter-spacing: var(--ds-tracking-wide);
18
61
  border-block-end: 1px solid var(--ds-color-border);
62
+ text-align: start;
63
+ white-space: nowrap;
19
64
  }
20
65
 
66
+ /* --- Body cells --- */
21
67
  .ds-table td {
22
68
  padding: var(--ds-space-3) var(--ds-space-4);
23
69
  color: var(--ds-color-text);
24
70
  border-block-end: 1px solid var(--ds-color-border-subtle);
71
+ vertical-align: middle;
25
72
  }
26
73
 
74
+ /* --- Row hover (default on) --- */
27
75
  .ds-table tbody tr {
28
- transition: background-color var(--ds-duration-normal) var(--ds-ease-default);
76
+ transition: background-color var(--ds-duration-fast) var(--ds-ease-default);
29
77
  }
30
78
 
31
79
  .ds-table tbody tr:hover {
32
80
  background-color: var(--ds-color-overlay-subtle);
33
81
  }
34
82
 
83
+ .ds-table--no-hover tbody tr:hover {
84
+ background-color: transparent;
85
+ }
86
+
87
+ /* --- Selected row --- */
88
+ .ds-table__row--selected {
89
+ background-color: var(--ds-color-overlay-subtle);
90
+ }
91
+
92
+ .ds-table__row--selected td {
93
+ border-block-end-color: var(--ds-color-border);
94
+ }
95
+
96
+ /* --- Sort header button --- */
97
+ .ds-table__sort {
98
+ display: inline-flex;
99
+ align-items: center;
100
+ gap: var(--ds-space-1);
101
+ padding: 0;
102
+ border: none;
103
+ background: transparent;
104
+ color: inherit;
105
+ font: inherit;
106
+ text-transform: inherit;
107
+ letter-spacing: inherit;
108
+ cursor: pointer;
109
+ white-space: nowrap;
110
+ transition: color var(--ds-duration-fast) var(--ds-ease-default);
111
+ }
112
+
113
+ .ds-table__sort:hover {
114
+ color: var(--ds-color-text-secondary);
115
+ }
116
+
117
+ .ds-table__sort:focus-visible {
118
+ outline: none;
119
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
120
+ border-radius: var(--ds-radius-sm);
121
+ scroll-margin-block: var(--ds-space-16, 4rem);
122
+ }
123
+
124
+ /* Sort indicator — neutral chevron via ::after */
125
+ .ds-table__sort::after {
126
+ content: "";
127
+ display: inline-block;
128
+ width: 0;
129
+ height: 0;
130
+ border-inline-start: 4px solid transparent;
131
+ border-inline-end: 4px solid transparent;
132
+ border-block-start: 4px solid currentColor;
133
+ opacity: 0.3;
134
+ transition: opacity var(--ds-duration-fast) var(--ds-ease-default);
135
+ }
136
+
137
+ .ds-table__sort:hover::after {
138
+ opacity: 0.6;
139
+ }
140
+
141
+ /* Ascending */
142
+ .ds-table__sort--asc {
143
+ color: var(--ds-color-text);
144
+ }
145
+
146
+ .ds-table__sort--asc::after {
147
+ border-block-start: none;
148
+ border-block-end: 4px solid currentColor;
149
+ opacity: 1;
150
+ }
151
+
152
+ /* Descending */
153
+ .ds-table__sort--desc {
154
+ color: var(--ds-color-text);
155
+ }
156
+
157
+ .ds-table__sort--desc::after {
158
+ border-block-start: 4px solid currentColor;
159
+ border-block-end: none;
160
+ opacity: 1;
161
+ }
162
+
163
+ /* --- Special cell types --- */
164
+
165
+ /* Shrink cell: action buttons, icons, checkboxes */
166
+ .ds-table__cell--shrink {
167
+ width: 1%;
168
+ white-space: nowrap;
169
+ }
170
+
171
+ /* Number cell: right-aligned with tabular numbers */
172
+ .ds-table__cell--number {
173
+ text-align: end;
174
+ font-variant-numeric: tabular-nums;
175
+ font-feature-settings: "tnum" 1;
176
+ }
177
+
178
+ /* Checkbox cell: narrow centered */
179
+ .ds-table__cell--checkbox {
180
+ width: 1%;
181
+ padding-inline-end: 0;
182
+ vertical-align: middle;
183
+ }
184
+
185
+ /* --- Empty state row --- */
186
+ .ds-table__empty {
187
+ text-align: center;
188
+ padding: var(--ds-space-12) var(--ds-space-4);
189
+ color: var(--ds-color-text-tertiary);
190
+ }
191
+
192
+ .ds-table__empty td {
193
+ border-block-end: none;
194
+ }
195
+
196
+ /* --- Loading skeleton rows --- */
197
+ .ds-table__loading td {
198
+ color: transparent;
199
+ position: relative;
200
+ }
201
+
202
+ .ds-table__loading td::after {
203
+ content: "";
204
+ position: absolute;
205
+ inset-block-start: 50%;
206
+ inset-inline-start: var(--ds-space-4);
207
+ inset-inline-end: var(--ds-space-4);
208
+ height: 0.75rem;
209
+ transform: translateY(-50%);
210
+ background: var(--ds-color-bg-muted);
211
+ border-radius: var(--ds-radius-sm);
212
+ animation: ds-table-skeleton-pulse 1.5s ease-in-out infinite;
213
+ }
214
+
215
+ @keyframes ds-table-skeleton-pulse {
216
+ 0%, 100% { opacity: 1; }
217
+ 50% { opacity: 0.4; }
218
+ }
219
+
220
+ /* --- Compact modifier --- */
35
221
  .ds-table--compact th,
36
222
  .ds-table--compact td {
37
223
  padding: var(--ds-space-2) var(--ds-space-3);
38
- font-size: var(--ds-text-sm);
39
224
  }
40
225
 
226
+ /* --- Dense modifier --- */
227
+ .ds-table--dense th,
228
+ .ds-table--dense td {
229
+ padding: var(--ds-space-1-5) var(--ds-space-2);
230
+ font-size: var(--ds-text-xs);
231
+ }
232
+
233
+ /* --- Striped modifier --- */
234
+ .ds-table--striped tbody tr:nth-child(even) {
235
+ background-color: var(--ds-color-overlay-subtle);
236
+ }
237
+
238
+ .ds-table--striped tbody tr:hover {
239
+ background-color: var(--ds-color-overlay-hover);
240
+ }
241
+
242
+ /* --- Bordered modifier --- */
243
+ .ds-table--bordered th,
244
+ .ds-table--bordered td {
245
+ border: 1px solid var(--ds-color-border-subtle);
246
+ }
247
+
248
+ .ds-table--bordered th {
249
+ border-block-end-color: var(--ds-color-border);
250
+ }
251
+
252
+ /* --- Sticky header modifier --- */
253
+ .ds-table--sticky-header thead {
254
+ position: sticky;
255
+ inset-block-start: 0;
256
+ z-index: var(--ds-z-sticky);
257
+ }
258
+
259
+ .ds-table--sticky-header th {
260
+ background-color: var(--ds-color-surface);
261
+ backdrop-filter: blur(var(--ds-blur-md));
262
+ -webkit-backdrop-filter: blur(var(--ds-blur-md));
263
+ }
264
+
265
+ /* --- Table wrapper --- */
41
266
  .ds-table-wrapper {
42
267
  overflow-x: auto;
43
268
  border: 1px solid var(--ds-color-border);
@@ -45,4 +270,64 @@
45
270
  background-color: var(--ds-color-surface);
46
271
  }
47
272
 
48
- .ds-table-wrapper .ds-table { margin: 0; }
273
+ .ds-table-wrapper .ds-table {
274
+ margin: 0;
275
+ }
276
+
277
+ /* Remove outer borders when inside wrapper (wrapper provides them) */
278
+ .ds-table-wrapper .ds-table tr:last-child td {
279
+ border-block-end: none;
280
+ }
281
+
282
+ /* --- Table footer (pagination area) --- */
283
+ .ds-table-footer {
284
+ display: flex;
285
+ align-items: center;
286
+ justify-content: space-between;
287
+ gap: var(--ds-space-4);
288
+ padding: var(--ds-space-3) var(--ds-space-4);
289
+ border-block-start: 1px solid var(--ds-color-border);
290
+ font-size: var(--ds-text-sm);
291
+ color: var(--ds-color-text-tertiary);
292
+ }
293
+
294
+ /* --- Responsive: card-style stacking on mobile --- */
295
+ @media (max-width: 767px) {
296
+ .ds-table--stack thead {
297
+ display: none;
298
+ }
299
+
300
+ .ds-table--stack tbody tr {
301
+ display: flex;
302
+ flex-direction: column;
303
+ gap: var(--ds-space-1);
304
+ padding: var(--ds-space-3) var(--ds-space-4);
305
+ border-block-end: 1px solid var(--ds-color-border);
306
+ }
307
+
308
+ .ds-table--stack td {
309
+ display: flex;
310
+ align-items: baseline;
311
+ gap: var(--ds-space-2);
312
+ padding: 0;
313
+ border: none;
314
+ }
315
+
316
+ .ds-table--stack td::before {
317
+ content: attr(data-label);
318
+ flex-shrink: 0;
319
+ min-width: 8rem;
320
+ font-size: var(--ds-text-xs);
321
+ font-weight: var(--ds-weight-medium);
322
+ color: var(--ds-color-text-tertiary);
323
+ text-transform: uppercase;
324
+ letter-spacing: var(--ds-tracking-wide);
325
+ }
326
+ }
327
+
328
+ /* --- Reduced motion --- */
329
+ @media (prefers-reduced-motion: reduce) {
330
+ .ds-table__loading td::after {
331
+ animation: none;
332
+ }
333
+ }
@@ -16,73 +16,73 @@
16
16
  align-items: stretch;
17
17
  border-block-end: 1px solid var(--ds-color-border);
18
18
  gap: var(--ds-space-0);
19
- }
20
-
21
- /* --- Pill variant --- */
22
-
23
- .ds-tabs--pills {
24
- border-block-end: none;
25
- gap: var(--ds-space-1);
26
- background-color: var(--ds-color-bg-elevated);
27
- border-radius: var(--ds-radius-lg);
28
- padding: var(--ds-space-1);
29
- }
30
-
31
- .ds-tabs--pills .ds-tab {
32
- border-block-end: none;
33
- border-radius: var(--ds-radius-md);
34
- padding: var(--ds-space-1-5) var(--ds-space-3);
35
- }
36
-
37
- .ds-tabs--pills .ds-tab:hover {
38
- background-color: var(--ds-color-overlay-hover);
39
- }
40
-
41
- .ds-tabs--pills .ds-tab--active {
42
- background-color: var(--ds-color-surface);
43
- color: var(--ds-color-text);
44
- box-shadow: var(--ds-shadow-sm);
45
- border-block-end: none;
46
- }
47
-
48
- /* --- Vertical variant --- */
49
-
50
- .ds-tabs--vertical {
51
- flex-direction: column;
52
- border-block-end: none;
53
- border-inline-end: 1px solid var(--ds-color-border);
54
- gap: var(--ds-space-0-5);
55
- }
56
-
57
- .ds-tabs--vertical .ds-tab {
58
- border-block-end: none;
59
- border-inline-end: 2px solid transparent;
60
- padding: var(--ds-space-2) var(--ds-space-4);
61
- text-align: start;
62
- }
63
-
64
- .ds-tabs--vertical .ds-tab--active {
65
- border-block-end: none;
66
- border-inline-end-color: var(--ds-color-interactive);
67
- color: var(--ds-color-text);
68
- }
69
-
70
- /* --- Small variant --- */
71
-
72
- .ds-tabs--sm .ds-tab {
73
- padding: var(--ds-space-1-5) var(--ds-space-3);
74
- font-size: var(--ds-text-xs);
75
- }
76
-
77
- /* --- Full width variant --- */
78
-
79
- .ds-tabs--full {
80
- width: 100%;
81
- }
82
19
 
83
- .ds-tabs--full .ds-tab {
84
- flex: 1;
85
- justify-content: center;
20
+ /* --- Pill variant --- */
21
+
22
+ &--pills {
23
+ border-block-end: none;
24
+ gap: var(--ds-space-1);
25
+ background-color: var(--ds-color-bg-elevated);
26
+ border-radius: var(--ds-radius-lg);
27
+ padding: var(--ds-space-1);
28
+
29
+ & .ds-tab {
30
+ border-block-end: none;
31
+ border-radius: var(--ds-radius-md);
32
+ padding: var(--ds-space-1-5) var(--ds-space-3);
33
+
34
+ &:hover {
35
+ background-color: var(--ds-color-overlay-hover);
36
+ }
37
+
38
+ &--active {
39
+ background-color: var(--ds-color-surface);
40
+ color: var(--ds-color-text);
41
+ box-shadow: var(--ds-shadow-sm);
42
+ border-block-end: none;
43
+ }
44
+ }
45
+ }
46
+
47
+ /* --- Vertical variant --- */
48
+
49
+ &--vertical {
50
+ flex-direction: column;
51
+ border-block-end: none;
52
+ border-inline-end: 1px solid var(--ds-color-border);
53
+ gap: var(--ds-space-0-5);
54
+
55
+ & .ds-tab {
56
+ border-block-end: none;
57
+ border-inline-end: 2px solid transparent;
58
+ padding: var(--ds-space-2) var(--ds-space-4);
59
+ text-align: start;
60
+
61
+ &--active {
62
+ border-block-end: none;
63
+ border-inline-end-color: var(--ds-color-interactive);
64
+ color: var(--ds-color-text);
65
+ }
66
+ }
67
+ }
68
+
69
+ /* --- Small variant --- */
70
+
71
+ &--sm .ds-tab {
72
+ padding: var(--ds-space-1-5) var(--ds-space-3);
73
+ font-size: var(--ds-text-xs);
74
+ }
75
+
76
+ /* --- Full width variant --- */
77
+
78
+ &--full {
79
+ width: 100%;
80
+
81
+ & .ds-tab {
82
+ flex: 1;
83
+ justify-content: center;
84
+ }
85
+ }
86
86
  }
87
87
 
88
88
  /* --- Individual Tab --- */
@@ -106,62 +106,62 @@
106
106
  white-space: nowrap;
107
107
  transition: all var(--ds-duration-fast) var(--ds-ease-default);
108
108
  margin-block-end: -1px;
109
- }
110
-
111
- .ds-tab:hover {
112
- color: var(--ds-color-text);
113
- }
114
-
115
- .ds-tab:focus-visible {
116
- outline: none;
117
- box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
118
- border-radius: var(--ds-radius-sm);
119
- scroll-margin-block: var(--ds-space-16, 4rem);
120
- }
121
109
 
122
- .ds-tab--active {
123
- color: var(--ds-color-text);
124
- border-block-end-color: var(--ds-color-interactive);
125
- }
126
-
127
- .ds-tab:disabled,
128
- .ds-tab[aria-disabled="true"] {
129
- opacity: var(--ds-opacity-disabled);
130
- cursor: not-allowed;
131
- pointer-events: none;
132
- }
133
-
134
- /* --- Tab Icon --- */
135
-
136
- .ds-tab__icon {
137
- display: inline-flex;
138
- align-items: center;
139
- justify-content: center;
140
- width: 1rem;
141
- height: 1rem;
142
- flex-shrink: 0;
143
- color: currentColor;
144
- }
145
-
146
- /* --- Tab Count Badge --- */
147
-
148
- .ds-tab__count {
149
- display: inline-flex;
150
- align-items: center;
151
- justify-content: center;
152
- padding: var(--ds-space-0) var(--ds-space-1-5);
153
- font-size: var(--ds-text-xs);
154
- font-weight: var(--ds-weight-medium);
155
- line-height: var(--ds-leading-snug);
156
- color: var(--ds-color-text-tertiary);
157
- background-color: var(--ds-color-bg-elevated);
158
- border-radius: var(--ds-radius-full);
159
- min-width: 1.25rem;
160
- }
161
-
162
- .ds-tab--active .ds-tab__count {
163
- color: var(--ds-color-text-secondary);
164
- background-color: var(--ds-color-overlay-active);
110
+ &:hover {
111
+ color: var(--ds-color-text);
112
+ }
113
+
114
+ &:focus-visible {
115
+ outline: none;
116
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
117
+ border-radius: var(--ds-radius-sm);
118
+ scroll-margin-block: var(--ds-space-16, 4rem);
119
+ }
120
+
121
+ &--active {
122
+ color: var(--ds-color-text);
123
+ border-block-end-color: var(--ds-color-interactive);
124
+ }
125
+
126
+ &:disabled,
127
+ &[aria-disabled="true"] {
128
+ opacity: var(--ds-opacity-disabled);
129
+ cursor: not-allowed;
130
+ pointer-events: none;
131
+ }
132
+
133
+ /* --- Tab Icon --- */
134
+
135
+ &__icon {
136
+ display: inline-flex;
137
+ align-items: center;
138
+ justify-content: center;
139
+ width: 1rem;
140
+ height: 1rem;
141
+ flex-shrink: 0;
142
+ color: currentColor;
143
+ }
144
+
145
+ /* --- Tab Count Badge --- */
146
+
147
+ &__count {
148
+ display: inline-flex;
149
+ align-items: center;
150
+ justify-content: center;
151
+ padding: var(--ds-space-0) var(--ds-space-1-5);
152
+ font-size: var(--ds-text-xs);
153
+ font-weight: var(--ds-weight-medium);
154
+ line-height: var(--ds-leading-snug);
155
+ color: var(--ds-color-text-tertiary);
156
+ background-color: var(--ds-color-bg-elevated);
157
+ border-radius: var(--ds-radius-full);
158
+ min-width: 1.25rem;
159
+ }
160
+
161
+ &--active &__count {
162
+ color: var(--ds-color-text-secondary);
163
+ background-color: var(--ds-color-overlay-active);
164
+ }
165
165
  }
166
166
 
167
167
  /* --- Tab Panel --- */