@slotted/styles 0.1.0-beta.7 → 0.1.0-beta.9

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 (128) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +31 -32
  4. package/src/action-sheet/action-sheet.css +36 -36
  5. package/src/alert/alert.css +35 -35
  6. package/src/app-shell/app-shell.css +280 -299
  7. package/src/aspect-ratio/aspect-ratio.css +9 -9
  8. package/src/attachment/attachment.css +91 -99
  9. package/src/avatar/avatar.css +41 -41
  10. package/src/avatar-group/avatar-group.css +21 -22
  11. package/src/badge/badge.css +37 -37
  12. package/src/breadcrumb/breadcrumb.css +37 -37
  13. package/src/button/button.css +88 -69
  14. package/src/button-group/button-group.css +69 -73
  15. package/src/calendar/calendar.css +93 -103
  16. package/src/card/card.css +54 -61
  17. package/src/carousel/carousel.css +150 -161
  18. package/src/cascader/cascader.css +147 -151
  19. package/src/chart/chart.css +225 -240
  20. package/src/checkbox/checkbox.css +119 -124
  21. package/src/checkbox-group/checkbox-group.css +7 -7
  22. package/src/code-block/code-block.css +81 -85
  23. package/src/collapsible/collapsible.css +69 -76
  24. package/src/color-picker/color-picker.css +83 -91
  25. package/src/column-manager/column-manager.css +106 -114
  26. package/src/combobox/combobox.css +99 -101
  27. package/src/command-palette/command-palette.css +84 -90
  28. package/src/container/container.css +24 -24
  29. package/src/context-menu/context-menu.css +8 -8
  30. package/src/currency-field/currency-field.css +99 -104
  31. package/src/dashboard-grid/dashboard-grid.css +104 -107
  32. package/src/data-grid/data-grid.css +458 -456
  33. package/src/data-grid/data-grid.tokens.json +2 -0
  34. package/src/data-list/data-list.css +67 -69
  35. package/src/date-field/date-field.css +50 -50
  36. package/src/date-picker/date-picker.css +40 -42
  37. package/src/date-range-picker/date-range-picker.css +114 -118
  38. package/src/datetime-field/datetime-field.css +73 -78
  39. package/src/datetime-picker/datetime-picker.css +61 -63
  40. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  41. package/src/description-list/description-list.css +61 -64
  42. package/src/detail-panel/detail-panel.css +70 -70
  43. package/src/dialog/dialog.css +312 -148
  44. package/src/divider/divider.css +18 -18
  45. package/src/drawer/drawer.css +186 -209
  46. package/src/entity-picker/entity-picker.css +220 -239
  47. package/src/event-calendar/event-calendar.css +343 -385
  48. package/src/field/field.css +74 -78
  49. package/src/field-group/field-group.css +22 -25
  50. package/src/filter-bar/filter-bar.css +193 -209
  51. package/src/form/form.css +21 -24
  52. package/src/fullscreen/fullscreen.css +24 -25
  53. package/src/grid/grid.css +28 -28
  54. package/src/highlight/highlight.css +6 -6
  55. package/src/hover-card/hover-card.css +6 -6
  56. package/src/icon/icon.css +15 -15
  57. package/src/image/image.css +39 -39
  58. package/src/import-export-center/import-export-center.css +135 -156
  59. package/src/inline/inline.css +27 -27
  60. package/src/inline-message/inline-message.css +28 -28
  61. package/src/kbd/kbd.css +26 -26
  62. package/src/link/link.css +15 -15
  63. package/src/list/list.css +20 -20
  64. package/src/list-item/list-item.css +66 -66
  65. package/src/listbox/listbox.css +56 -59
  66. package/src/loading-overlay/loading-overlay.css +75 -92
  67. package/src/markdown/markdown.css +17 -17
  68. package/src/menu/menu.css +63 -65
  69. package/src/menubar/menubar.css +13 -13
  70. package/src/message/message.css +174 -202
  71. package/src/message-scroller/message-scroller.css +41 -42
  72. package/src/multi-select/multi-select.css +131 -137
  73. package/src/navigation-menu/navigation-menu.css +167 -188
  74. package/src/notification-center/notification-center.css +134 -148
  75. package/src/number-field/number-field.css +76 -81
  76. package/src/otp-input/otp-input.css +48 -48
  77. package/src/page/page.css +23 -23
  78. package/src/page-header/page-header.css +219 -280
  79. package/src/pagination/pagination.css +68 -72
  80. package/src/popover/popover.css +40 -49
  81. package/src/progress-indicator/progress-indicator.css +85 -90
  82. package/src/prompt-composer/prompt-composer.css +94 -99
  83. package/src/prose/prose.css +71 -75
  84. package/src/radio-group/radio-group.css +98 -103
  85. package/src/rating/rating.css +132 -132
  86. package/src/result-state/result-state.css +74 -77
  87. package/src/saved-views/saved-views.css +41 -47
  88. package/src/scroll-area/scroll-area.css +32 -35
  89. package/src/section/section.css +16 -16
  90. package/src/segmented-control/segmented-control.css +77 -79
  91. package/src/select/select.css +113 -115
  92. package/src/side-navigation/side-navigation.css +170 -180
  93. package/src/skeleton/skeleton.css +47 -48
  94. package/src/slider/slider.css +86 -88
  95. package/src/sparkline/sparkline.css +32 -32
  96. package/src/spinner/spinner.css +4 -4
  97. package/src/split-button/split-button.css +26 -31
  98. package/src/splitter/splitter.css +35 -35
  99. package/src/stack/stack.css +24 -24
  100. package/src/stat-card/stat-card.css +102 -103
  101. package/src/status-indicator/status-indicator.css +28 -28
  102. package/src/stepper/stepper.css +58 -62
  103. package/src/switch/switch.css +86 -92
  104. package/src/table/table.css +189 -198
  105. package/src/table-of-contents/table-of-contents.css +51 -54
  106. package/src/tabs/tabs.css +157 -172
  107. package/src/tag/tag.css +67 -71
  108. package/src/tags-input/tags-input.css +124 -74
  109. package/src/tags-input/tags-input.tokens.json +6 -1
  110. package/src/text-field/text-field.css +108 -126
  111. package/src/textarea/textarea.css +26 -26
  112. package/src/time-field/time-field.css +67 -67
  113. package/src/time-picker/time-picker.css +56 -58
  114. package/src/time-range-picker/time-range-picker.css +126 -133
  115. package/src/timeline/timeline.css +244 -266
  116. package/src/toast/toast.css +81 -90
  117. package/src/toggle/toggle.css +29 -33
  118. package/src/toggle-group/toggle-group.css +67 -71
  119. package/src/toolbar/toolbar.css +30 -35
  120. package/src/tooltip/tooltip.css +26 -26
  121. package/src/top-navigation/top-navigation.css +243 -259
  122. package/src/tour/tour.css +51 -60
  123. package/src/transfer/transfer.css +160 -164
  124. package/src/tree/tree.css +103 -111
  125. package/src/typography/typography.css +36 -36
  126. package/src/upload/upload.css +224 -224
  127. package/src/visually-hidden/visually-hidden.css +1 -1
  128. package/src/wizard/wizard.css +185 -197
package/src/tabs/tabs.css CHANGED
@@ -16,7 +16,7 @@
16
16
  * │ panel │
17
17
  * └──────────────────────────────────────────────────┘
18
18
  */
19
- [data-ui='tabs'] {
19
+ [data-ui-tabs] {
20
20
  /**
21
21
  * The control scales, read once at the root, so `size` and the three
22
22
  * densities are one decision each rather than one per rule.
@@ -95,7 +95,7 @@
95
95
  row-gap: var(--slotted-tabs-gap, var(--slotted-space-6, 1rem));
96
96
  }
97
97
 
98
- [data-ui='tabs'][data-size='sm'] {
98
+ [data-ui-tabs][data-size='sm'] {
99
99
  --_height: var(--slotted-control-height-sm, 30px);
100
100
  --_font-size: var(--slotted-control-font-size-sm, 0.8125rem);
101
101
  --_padding-inline: var(--slotted-control-padding-inline-sm, 0.625rem);
@@ -104,7 +104,7 @@
104
104
  --_inner-size: var(--slotted-control-inner-size-sm, 22px);
105
105
  }
106
106
 
107
- [data-ui='tabs'][data-size='lg'] {
107
+ [data-ui-tabs][data-size='lg'] {
108
108
  --_height: var(--slotted-control-height-lg, 40px);
109
109
  --_font-size: var(--slotted-control-font-size-lg, 1rem);
110
110
  --_padding-inline: var(--slotted-control-padding-inline-lg, 1rem);
@@ -123,7 +123,7 @@
123
123
  * the panel: the distance the row gap keeps in a horizontal family. Without
124
124
  * it the panel's first letter touched the track on the list's end edge.
125
125
  */
126
- [data-ui='tabs'][data-orientation='vertical'] {
126
+ [data-ui-tabs][data-orientation='vertical'] {
127
127
  /* The inset runs along the block axis, where a tab has no padding. */
128
128
  --_marker-inset: var(--slotted-tabs-marker-inset, 0px);
129
129
 
@@ -139,7 +139,7 @@
139
139
  * which is on the border box and therefore does not scroll with the tabs —
140
140
  * a track drawn on the content would slide away with the first tab.
141
141
  */
142
- [data-ui='tabs'] > [data-part='list'] {
142
+ [data-ui-tabs] > [data-part-list] {
143
143
  align-items: stretch;
144
144
  display: flex;
145
145
  gap: var(--slotted-tabs-list-gap, var(--_list-gap));
@@ -166,7 +166,7 @@
166
166
  scrollbar-width: thin;
167
167
  }
168
168
 
169
- [data-ui='tabs'][data-overflowing] > [data-part='list'] {
169
+ [data-ui-tabs][data-overflowing] > [data-part-list] {
170
170
  scrollbar-width: none;
171
171
  }
172
172
 
@@ -177,7 +177,7 @@
177
177
  * the padding the marker lies over the line, flush with the list's edge. The
178
178
  * shadow is the box's, so the line does not scroll with the tabs.
179
179
  */
180
- [data-ui='tabs'][data-variant='line'][data-track='line'] > [data-part='list'] {
180
+ [data-ui-tabs][data-variant='line'][data-track='line'] > [data-part-list] {
181
181
  /* How far the hover bar reaches past an item to stand on the track. */
182
182
  --_track-reach: var(--_track-size);
183
183
 
@@ -206,15 +206,15 @@
206
206
  * horizontal rule wants — a row of equal shares has a middle — and in a
207
207
  * column it produces a ragged left edge nobody can scan.
208
208
  */
209
- [data-ui='tabs'][data-orientation='vertical']
210
- > :where([data-part='list'])
211
- > :where([data-part='item'])
212
- > [data-part='tab'] {
209
+ [data-ui-tabs][data-orientation='vertical']
210
+ > :where([data-part-list])
211
+ > :where([data-part-item])
212
+ > [data-part-tab] {
213
213
  justify-content: start;
214
214
  text-align: start;
215
215
  }
216
216
 
217
- [data-ui='tabs'][data-orientation='vertical'] > [data-part='list'] {
217
+ [data-ui-tabs][data-orientation='vertical'] > [data-part-list] {
218
218
  flex-direction: column;
219
219
  grid-column: 1;
220
220
  grid-row: 1;
@@ -223,15 +223,15 @@
223
223
  }
224
224
 
225
225
  /* A shadow takes no logical offset, so the line's side is mirrored by hand. */
226
- [data-ui='tabs'][data-orientation='vertical'][data-variant='line'][data-track='line']
227
- > [data-part='list'] {
226
+ [data-ui-tabs][data-orientation='vertical'][data-variant='line'][data-track='line']
227
+ > [data-part-list] {
228
228
  box-shadow: inset calc(-1 * var(--_track-size)) 0 0 var(--_track-color);
229
229
  padding-block-end: 0;
230
230
  padding-inline-end: var(--_track-size);
231
231
  }
232
232
 
233
- [data-ui='tabs'][data-orientation='vertical'][data-variant='line'][data-track='line']:dir(rtl)
234
- > [data-part='list'] {
233
+ [data-ui-tabs][data-orientation='vertical'][data-variant='line'][data-track='line']:dir(rtl)
234
+ > [data-part-list] {
235
235
  box-shadow: inset var(--_track-size) 0 0 var(--_track-color);
236
236
  }
237
237
 
@@ -244,7 +244,7 @@
244
244
  * label is what gives way, and it is the only place a horizontal label ever
245
245
  * truncates.
246
246
  */
247
- [data-ui='tabs'][data-fit='equal'] > [data-part='list'] {
247
+ [data-ui-tabs][data-fit='equal'] > [data-part-list] {
248
248
  display: grid;
249
249
  grid-auto-columns: minmax(0, 1fr);
250
250
  grid-auto-flow: column;
@@ -253,15 +253,15 @@
253
253
  }
254
254
 
255
255
  /** Equal shares are shares of the line, so each item takes the one it is given. */
256
- [data-ui='tabs'][data-fit='equal'] > :where([data-part='list']) > [data-part='item'] {
256
+ [data-ui-tabs][data-fit='equal'] > :where([data-part-list]) > [data-part-item] {
257
257
  min-inline-size: 0;
258
258
  }
259
259
 
260
- [data-ui='tabs'][data-fit='equal']
261
- > :where([data-part='list'])
262
- > :where([data-part='item'])
263
- > :where([data-part='tab'])
264
- > [data-part='label'] {
260
+ [data-ui-tabs][data-fit='equal']
261
+ > :where([data-part-list])
262
+ > :where([data-part-item])
263
+ > :where([data-part-tab])
264
+ > [data-part-label] {
265
265
  overflow: hidden;
266
266
  text-overflow: ellipsis;
267
267
  white-space: nowrap;
@@ -274,7 +274,7 @@
274
274
  * contain a `button`: a dismissible tab needs a box for its second control.
275
275
  * It also carries the hover bar, under the tab and not the control.
276
276
  */
277
- [data-ui='tabs'] > :where([data-part='list']) > [data-part='item'] {
277
+ [data-ui-tabs] > :where([data-part-list]) > [data-part-item] {
278
278
  align-items: stretch;
279
279
  display: grid;
280
280
  grid-auto-flow: column;
@@ -288,7 +288,7 @@
288
288
  position: relative;
289
289
  }
290
290
 
291
- [data-ui='tabs'] > :where([data-part='list']) > :where([data-part='item']) > [data-part='tab'] {
291
+ [data-ui-tabs] > :where([data-part-list]) > :where([data-part-item]) > [data-part-tab] {
292
292
  align-items: center;
293
293
  appearance: none;
294
294
  background-color: transparent;
@@ -320,10 +320,10 @@
320
320
  * inset there: the control carries it instead, measured from the mark rather
321
321
  * than from the box.
322
322
  */
323
- [data-ui='tabs']
324
- > :where([data-part='list'])
325
- > [data-part='item']:has(> [data-part='dismiss'])
326
- > [data-part='tab'] {
323
+ [data-ui-tabs]
324
+ > :where([data-part-list])
325
+ > [data-part-item]:has(> [data-part-dismiss])
326
+ > [data-part-tab] {
327
327
  padding-inline-end: 0;
328
328
  }
329
329
 
@@ -333,11 +333,11 @@
333
333
  * needs something to be aligned against, and a label in another script needs
334
334
  * to read its own way inside a page that reads the other.
335
335
  */
336
- [data-ui='tabs']
337
- > :where([data-part='list'])
338
- > :where([data-part='item'])
339
- > :where([data-part='tab'])
340
- > [data-part='label'] {
336
+ [data-ui-tabs]
337
+ > :where([data-part-list])
338
+ > :where([data-part-item])
339
+ > :where([data-part-tab])
340
+ > [data-part-label] {
341
341
  min-inline-size: 0;
342
342
  unicode-bidi: plaintext;
343
343
  }
@@ -349,11 +349,11 @@
349
349
  * gives way. An icon box reads `--slotted-icon-size` from the slot, so it
350
350
  * takes the tab's icon step.
351
351
  */
352
- [data-ui='tabs']
353
- > :where([data-part='list'])
354
- > :where([data-part='item'])
355
- > :where([data-part='tab'])
356
- > :is([data-part='start'], [data-part='end']) {
352
+ [data-ui-tabs]
353
+ > :where([data-part-list])
354
+ > :where([data-part-item])
355
+ > :where([data-part-tab])
356
+ > :is([data-part-start], [data-part-end]) {
357
357
  --slotted-icon-size: var(--_icon-size);
358
358
 
359
359
  align-items: center;
@@ -372,10 +372,10 @@
372
372
  * meeting a line that runs under all of them. What that variant says on
373
373
  * hover is where the mark would go, and it says it on the item, below.
374
374
  */
375
- [data-ui='tabs']
376
- > :where([data-part='list'])
377
- > :where([data-part='item'])
378
- > [data-part='tab']:not(:disabled):not([aria-selected='true']):hover {
375
+ [data-ui-tabs]
376
+ > :where([data-part-list])
377
+ > :where([data-part-item])
378
+ > [data-part-tab]:not(:disabled):not([aria-selected='true']):hover {
379
379
  color: var(--slotted-tabs-hover-color, var(--slotted-text, CanvasText));
380
380
  }
381
381
 
@@ -385,20 +385,20 @@
385
385
  * and goes one step further on press is what a segmented control does —
386
386
  * the fill has a box to belong to and no line to meet.
387
387
  */
388
- [data-ui='tabs'][data-variant='contained']
389
- > :where([data-part='list'])
390
- > :where([data-part='item'])
391
- > [data-part='tab']:not(:disabled):not([aria-selected='true']):hover {
388
+ [data-ui-tabs][data-variant='contained']
389
+ > :where([data-part-list])
390
+ > :where([data-part-item])
391
+ > [data-part-tab]:not(:disabled):not([aria-selected='true']):hover {
392
392
  background-color: var(
393
393
  --slotted-tabs-hover-background,
394
394
  var(--slotted-tone-secondary-subtle-hover)
395
395
  );
396
396
  }
397
397
 
398
- [data-ui='tabs'][data-variant='contained']
399
- > :where([data-part='list'])
400
- > :where([data-part='item'])
401
- > [data-part='tab']:not(:disabled):active {
398
+ [data-ui-tabs][data-variant='contained']
399
+ > :where([data-part-list])
400
+ > :where([data-part-item])
401
+ > [data-part-tab]:not(:disabled):active {
402
402
  background-color: var(
403
403
  --slotted-tabs-active-background,
404
404
  var(--slotted-tone-secondary-subtle-active)
@@ -416,10 +416,10 @@
416
416
  * focus became one blue shape that said neither of the two things — the
417
417
  * capture is what showed it.
418
418
  */
419
- [data-ui='tabs']
420
- > :where([data-part='list'])
421
- > :where([data-part='item'])
422
- > [data-part='tab']:focus-visible {
419
+ [data-ui-tabs]
420
+ > :where([data-part-list])
421
+ > :where([data-part-item])
422
+ > [data-part-tab]:focus-visible {
423
423
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
424
424
  outline-offset: calc(-1 * (var(--slotted-focus-ring-offset, 2px) + var(--_marker-size)));
425
425
  }
@@ -430,25 +430,19 @@
430
430
  * and nothing about it reaches the edge the scroller clips at — and an inset
431
431
  * ring on a twenty-four pixel box would be drawn through the mark.
432
432
  */
433
- [data-ui='tabs']
434
- > :where([data-part='list'])
435
- > :where([data-part='item'])
436
- > [data-part='dismiss']:focus-visible {
433
+ [data-ui-tabs]
434
+ > :where([data-part-list])
435
+ > :where([data-part-item])
436
+ > [data-part-dismiss]:focus-visible {
437
437
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
438
438
  outline-offset: var(--slotted-focus-ring-offset, 2px);
439
439
  }
440
440
 
441
- [data-ui='tabs']
442
- > :where([data-part='list'])
443
- > [data-part='item'][data-selected]
444
- > [data-part='tab'] {
441
+ [data-ui-tabs] > :where([data-part-list]) > [data-part-item][data-selected] > [data-part-tab] {
445
442
  color: var(--slotted-tabs-selected-color, var(--slotted-tone-accent-text));
446
443
  }
447
444
 
448
- [data-ui='tabs']
449
- > :where([data-part='list'])
450
- > :where([data-part='item'])
451
- > [data-part='tab']:disabled {
445
+ [data-ui-tabs] > :where([data-part-list]) > :where([data-part-item]) > [data-part-tab]:disabled {
452
446
  color: var(--slotted-disabled-foreground, GrayText);
453
447
  cursor: not-allowed;
454
448
  }
@@ -469,9 +463,13 @@
469
463
  * end padding, so the end inset is nought there. Below the width of a short
470
464
  * label it keeps a minimum length, centred on the content. It stands
471
465
  * `--slotted-tabs-marker-offset` above the list's edge, over the track, and the axes are physical in this one rule
472
- * because the measurement is: the translate is from the list's left edge.
466
+ * because the measurement is: the position is from the list's left edge.
467
+ * Position and length are both layout properties, so one thread advances
468
+ * both edges in the same frame: a composited `translate` beside a
469
+ * main-thread `inline-size` drifted apart while the panel rendered, and the
470
+ * bar grew and shrank on its way between tabs of unequal widths.
473
471
  */
474
- [data-ui='tabs'] > :where([data-part='list']) > [data-part='marker'] {
472
+ [data-ui-tabs] > :where([data-part-list]) > [data-part-marker] {
475
473
  --_start-inset: var(--_marker-inset);
476
474
  --_end-inset: var(--_marker-inset);
477
475
  --_left-inset: var(--_start-inset);
@@ -483,26 +481,24 @@
483
481
  border-radius: var(--_marker-radius);
484
482
  inline-size: var(--_length);
485
483
  inset-block-end: calc(var(--_marker-lift, 0px) + var(--_marker-offset));
486
- left: 0;
484
+ left: calc(
485
+ var(--_indicator-start, 0px) + var(--_left-inset) + (var(--_span) - var(--_length)) / 2
486
+ );
487
487
  pointer-events: none;
488
488
  position: absolute;
489
- translate: calc(
490
- var(--_indicator-start, 0px) + var(--_left-inset) + (var(--_span) - var(--_length)) / 2
491
- )
492
- 0;
493
489
  }
494
490
 
495
- [data-ui='tabs']:dir(rtl) > :where([data-part='list']) > [data-part='marker'] {
491
+ [data-ui-tabs]:dir(rtl) > :where([data-part-list]) > [data-part-marker] {
496
492
  --_left-inset: var(--_end-inset);
497
493
  }
498
494
 
499
- [data-ui='tabs']:not([data-orientation='vertical'])
500
- > [data-part='list']:has(> [data-part='item'][data-selected] > [data-part='dismiss'])
501
- > [data-part='marker'] {
495
+ [data-ui-tabs]:not([data-orientation='vertical'])
496
+ > [data-part-list]:has(> [data-part-item][data-selected] > [data-part-dismiss])
497
+ > [data-part-marker] {
502
498
  --_end-inset: 0px;
503
499
  }
504
500
 
505
- [data-ui='tabs'] > :where([data-part='list']) > [data-part='marker'][hidden] {
501
+ [data-ui-tabs] > :where([data-part-list]) > [data-part-marker][hidden] {
506
502
  display: none;
507
503
  }
508
504
 
@@ -516,17 +512,18 @@
516
512
  * distance in its first frame and read as a jump. Under reduced motion it
517
513
  * jumps.
518
514
  */
519
- [data-ui='tabs'] > :where([data-part='list']) > [data-part='marker'][data-moving] {
515
+ [data-ui-tabs] > :where([data-part-list]) > [data-part-marker][data-moving] {
520
516
  --_marker-easing: var(--slotted-tabs-marker-easing, cubic-bezier(0.4, 0, 0.2, 1));
521
517
 
522
518
  transition:
523
- translate var(--slotted-duration-medium) var(--_marker-easing),
519
+ left var(--slotted-duration-medium) var(--_marker-easing),
520
+ top var(--slotted-duration-medium) var(--_marker-easing),
524
521
  inline-size var(--slotted-duration-medium) var(--_marker-easing),
525
522
  block-size var(--slotted-duration-medium) var(--_marker-easing);
526
523
  }
527
524
 
528
525
  @media (prefers-reduced-motion: reduce) {
529
- [data-ui='tabs'] > :where([data-part='list']) > [data-part='marker'][data-moving] {
526
+ [data-ui-tabs] > :where([data-part-list]) > [data-part-marker][data-moving] {
530
527
  transition: none;
531
528
  }
532
529
  }
@@ -540,7 +537,7 @@
540
537
  * stops at the tab where a closing control follows: that control is the
541
538
  * tab's inline padding on either side of the glyph.
542
539
  */
543
- [data-ui='tabs'] > :where([data-part='list']) > [data-part='item']::before {
540
+ [data-ui-tabs] > :where([data-part-list]) > [data-part-item]::before {
544
541
  background-color: var(--slotted-tabs-hover-marker-color, var(--slotted-border-strong));
545
542
  block-size: var(--_marker-size);
546
543
  border-radius: var(--_marker-radius);
@@ -557,26 +554,22 @@
557
554
  opacity var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);
558
555
  }
559
556
 
560
- [data-ui='tabs']:not([data-orientation='vertical'])
561
- > :where([data-part='list'])
562
- > [data-part='item']:has(> [data-part='dismiss'])::before {
557
+ [data-ui-tabs]:not([data-orientation='vertical'])
558
+ > :where([data-part-list])
559
+ > [data-part-item]:has(> [data-part-dismiss])::before {
563
560
  inset-inline-end: calc(2 * var(--_padding-inline) + var(--_icon-size));
564
561
  }
565
562
 
566
- [data-ui='tabs'][data-variant='line']
567
- > :where([data-part='list'])
568
- > [data-part='item']:not([data-selected]):has(
569
- > [data-part='tab']:not(:disabled):hover
570
- )::before {
563
+ [data-ui-tabs][data-variant='line']
564
+ > :where([data-part-list])
565
+ > [data-part-item]:not([data-selected]):has(> [data-part-tab]:not(:disabled):hover)::before {
571
566
  opacity: var(--slotted-tabs-hover-marker-opacity, 0.5);
572
567
  }
573
568
 
574
569
  /** Press takes the bar to the label's own ink: the two say one thing. */
575
- [data-ui='tabs'][data-variant='line']
576
- > :where([data-part='list'])
577
- > [data-part='item']:not([data-selected]):has(
578
- > [data-part='tab']:not(:disabled):active
579
- )::before {
570
+ [data-ui-tabs][data-variant='line']
571
+ > :where([data-part-list])
572
+ > [data-part-item]:not([data-selected]):has(> [data-part-tab]:not(:disabled):active)::before {
580
573
  background-color: var(--slotted-tabs-active-marker-color, var(--slotted-text));
581
574
  }
582
575
 
@@ -585,20 +578,19 @@
585
578
  * the block axis, where the inset defaults to nought because a tab has no
586
579
  * block padding.
587
580
  */
588
- [data-ui='tabs'][data-orientation='vertical']
589
- > :where([data-part='list'])
590
- > [data-part='marker'] {
581
+ [data-ui-tabs][data-orientation='vertical'] > :where([data-part-list]) > [data-part-marker] {
591
582
  block-size: var(--_length);
592
583
  inline-size: var(--_marker-size);
593
- inset-block: 0 auto;
584
+ inset-block: calc(
585
+ var(--_indicator-start, 0px) + var(--_start-inset) + (var(--_span) - var(--_length)) / 2
586
+ )
587
+ auto;
594
588
  inset-inline: auto calc(var(--_marker-lift, 0px) + var(--_marker-offset));
595
- translate: 0
596
- calc(var(--_indicator-start, 0px) + var(--_start-inset) + (var(--_span) - var(--_length)) / 2);
597
589
  }
598
590
 
599
- [data-ui='tabs'][data-orientation='vertical']
600
- > :where([data-part='list'])
601
- > [data-part='item']::before {
591
+ [data-ui-tabs][data-orientation='vertical']
592
+ > :where([data-part-list])
593
+ > [data-part-item]::before {
602
594
  block-size: auto;
603
595
  inline-size: var(--_marker-size);
604
596
  inset-block: var(--_marker-inset);
@@ -622,7 +614,7 @@
622
614
  * the first capture showed; the `line` variant keeps the full width, because
623
615
  * there the track is the edge of the panel below it.
624
616
  */
625
- [data-ui='tabs'][data-variant='contained'] > [data-part='list'] {
617
+ [data-ui-tabs][data-variant='contained'] > [data-part-list] {
626
618
  /* The marker underlines the label inside the selected surface, a step above its edge. */
627
619
  --_marker-lift: calc(2 * var(--slotted-space-1, 0.125rem));
628
620
 
@@ -633,15 +625,15 @@
633
625
  padding: var(--slotted-space-1, 0.125rem);
634
626
  }
635
627
 
636
- [data-ui='tabs'][data-variant='contained'] > :where([data-part='list']) > [data-part='item'] {
628
+ [data-ui-tabs][data-variant='contained'] > :where([data-part-list]) > [data-part-item] {
637
629
  border-radius: var(--slotted-radius-sm, 4px);
638
630
  transition: background-color var(--slotted-control-transition-duration)
639
631
  var(--slotted-control-transition-easing);
640
632
  }
641
633
 
642
- [data-ui='tabs'][data-variant='contained']
643
- > :where([data-part='list'])
644
- > [data-part='item'][data-selected] {
634
+ [data-ui-tabs][data-variant='contained']
635
+ > :where([data-part-list])
636
+ > [data-part-item][data-selected] {
645
637
  background-color: var(--slotted-tabs-contained-selected-background, var(--slotted-surface));
646
638
  box-shadow: var(--slotted-shadow-xs);
647
639
  }
@@ -664,10 +656,7 @@
664
656
  * Neutral, as the dialog's close and the paging controls: removing a tab
665
657
  * closes a view and destroys nothing, so the danger tone overstated it.
666
658
  */
667
- [data-ui='tabs']
668
- > :where([data-part='list'])
669
- > :where([data-part='item'])
670
- > [data-part='dismiss'] {
659
+ [data-ui-tabs] > :where([data-part-list]) > :where([data-part-item]) > [data-part-dismiss] {
671
660
  --slotted-icon-size: var(--_icon-size);
672
661
 
673
662
  align-items: center;
@@ -696,27 +685,24 @@
696
685
  is the one a mouse sees: a transparent box centred on the control reaches
697
686
  44 pixels, and the ground and the ring stay square. */
698
687
  @media (pointer: coarse) {
699
- [data-ui='tabs']
700
- > :where([data-part='list'])
701
- > :where([data-part='item'])
702
- > [data-part='dismiss'] {
688
+ [data-ui-tabs] > :where([data-part-list]) > :where([data-part-item]) > [data-part-dismiss] {
703
689
  position: relative;
704
690
  }
705
691
 
706
- [data-ui='tabs']
707
- > :where([data-part='list'])
708
- > :where([data-part='item'])
709
- > [data-part='dismiss']::after {
692
+ [data-ui-tabs]
693
+ > :where([data-part-list])
694
+ > :where([data-part-item])
695
+ > [data-part-dismiss]::after {
710
696
  content: '';
711
697
  inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
712
698
  position: absolute;
713
699
  }
714
700
  }
715
701
 
716
- [data-ui='tabs']
717
- > :where([data-part='list'])
718
- > :where([data-part='item'])
719
- > [data-part='dismiss']:not(:disabled):hover {
702
+ [data-ui-tabs]
703
+ > :where([data-part-list])
704
+ > :where([data-part-item])
705
+ > [data-part-dismiss]:not(:disabled):hover {
720
706
  background-color: var(
721
707
  --slotted-tabs-dismiss-hover-background,
722
708
  var(--slotted-tone-secondary-subtle-hover)
@@ -724,10 +710,10 @@
724
710
  color: var(--slotted-tabs-dismiss-hover-color, var(--slotted-text, CanvasText));
725
711
  }
726
712
 
727
- [data-ui='tabs']
728
- > :where([data-part='list'])
729
- > :where([data-part='item'])
730
- > [data-part='dismiss']:not(:disabled):active {
713
+ [data-ui-tabs]
714
+ > :where([data-part-list])
715
+ > :where([data-part-item])
716
+ > [data-part-dismiss]:not(:disabled):active {
731
717
  background-color: var(
732
718
  --slotted-tabs-dismiss-active-background,
733
719
  var(--slotted-tone-secondary-subtle-active)
@@ -735,10 +721,10 @@
735
721
  color: var(--slotted-tabs-dismiss-active-color, var(--slotted-text, CanvasText));
736
722
  }
737
723
 
738
- [data-ui='tabs']
739
- > :where([data-part='list'])
740
- > :where([data-part='item'])
741
- > [data-part='dismiss']:disabled {
724
+ [data-ui-tabs]
725
+ > :where([data-part-list])
726
+ > :where([data-part-item])
727
+ > [data-part-dismiss]:disabled {
742
728
  color: var(--slotted-disabled-foreground, GrayText);
743
729
  cursor: not-allowed;
744
730
  }
@@ -761,7 +747,7 @@
761
747
  * list as they move, and Cloudscape's own guidance warns against extra
762
748
  * stops before a tab list.
763
749
  */
764
- [data-ui='tabs'] > [data-part='scroll'] {
750
+ [data-ui-tabs] > [data-part-scroll] {
765
751
  --slotted-icon-size: var(--_icon-size);
766
752
 
767
753
  align-items: center;
@@ -793,31 +779,30 @@
793
779
  * is read from the control itself — a paging control at its end is
794
780
  * disabled — so the family needs no second signal for it.
795
781
  */
796
- [data-ui='tabs']:has(> [data-part='scroll'][data-direction='start']:not(:disabled))
797
- > [data-part='list'] {
782
+ [data-ui-tabs]:has(> [data-part-scroll][data-direction='start']:not(:disabled))
783
+ > [data-part-list] {
798
784
  mask-image: linear-gradient(to right, transparent, black var(--_fade));
799
785
  }
800
786
 
801
- [data-ui='tabs']:has(> [data-part='scroll'][data-direction='end']:not(:disabled))
802
- > [data-part='list'] {
787
+ [data-ui-tabs]:has(> [data-part-scroll][data-direction='end']:not(:disabled)) > [data-part-list] {
803
788
  mask-image: linear-gradient(to left, transparent, black var(--_fade));
804
789
  }
805
790
 
806
791
  /* The start edge is the right one in a right-to-left document. */
807
- [data-ui='tabs']:dir(rtl):has(> [data-part='scroll'][data-direction='start']:not(:disabled))
808
- > [data-part='list'] {
792
+ [data-ui-tabs]:dir(rtl):has(> [data-part-scroll][data-direction='start']:not(:disabled))
793
+ > [data-part-list] {
809
794
  mask-image: linear-gradient(to left, transparent, black var(--_fade));
810
795
  }
811
796
 
812
- [data-ui='tabs']:dir(rtl):has(> [data-part='scroll'][data-direction='end']:not(:disabled))
813
- > [data-part='list'] {
797
+ [data-ui-tabs]:dir(rtl):has(> [data-part-scroll][data-direction='end']:not(:disabled))
798
+ > [data-part-list] {
814
799
  mask-image: linear-gradient(to right, transparent, black var(--_fade));
815
800
  }
816
801
 
817
- [data-ui='tabs']:has(> [data-part='scroll'][data-direction='start']:not(:disabled)):has(
818
- > [data-part='scroll'][data-direction='end']:not(:disabled)
802
+ [data-ui-tabs]:has(> [data-part-scroll][data-direction='start']:not(:disabled)):has(
803
+ > [data-part-scroll][data-direction='end']:not(:disabled)
819
804
  )
820
- > [data-part='list'] {
805
+ > [data-part-list] {
821
806
  mask-image: linear-gradient(
822
807
  to right,
823
808
  transparent,
@@ -831,19 +816,19 @@
831
816
  for both axes. As wide as its glyph and as tall as the row, it stood 24
832
817
  wide and 44 tall beside tabs grown to the comfortable height. */
833
818
  @media (pointer: coarse) {
834
- [data-ui='tabs'] > [data-part='scroll'] {
819
+ [data-ui-tabs] > [data-part-scroll] {
835
820
  min-block-size: max(var(--slotted-target-comfortable, 44px), var(--_height));
836
821
  min-inline-size: max(var(--slotted-target-comfortable, 44px), var(--_height));
837
822
  }
838
823
  }
839
824
 
840
- [data-ui='tabs'] > [data-part='scroll'][data-direction='start'] {
825
+ [data-ui-tabs] > [data-part-scroll][data-direction='start'] {
841
826
  grid-column: 1;
842
827
  grid-row: 1;
843
828
  margin-inline-end: var(--slotted-tabs-actions-gap, var(--slotted-space-4, 0.5rem));
844
829
  }
845
830
 
846
- [data-ui='tabs'] > [data-part='scroll'][data-direction='end'] {
831
+ [data-ui-tabs] > [data-part-scroll][data-direction='end'] {
847
832
  grid-column: 3;
848
833
  margin-inline-start: var(--slotted-tabs-actions-gap, var(--slotted-space-4, 0.5rem));
849
834
  grid-row: 1;
@@ -858,26 +843,26 @@
858
843
  * own mirror holds: the two compose, so the start control points back in
859
844
  * both directions.
860
845
  */
861
- [data-ui='tabs'] > [data-part='scroll'][data-direction='start'] > [data-ui='icon'] {
846
+ [data-ui-tabs] > [data-part-scroll][data-direction='start'] > [data-ui-icon] {
862
847
  rotate: 0.5turn;
863
848
  }
864
849
 
865
850
  /* The ground moves under the pointer and nothing else does (R2). */
866
- [data-ui='tabs'] > [data-part='scroll']:not(:disabled):hover {
851
+ [data-ui-tabs] > [data-part-scroll]:not(:disabled):hover {
867
852
  background-color: var(
868
853
  --slotted-tabs-hover-background,
869
854
  var(--slotted-tone-secondary-subtle-hover)
870
855
  );
871
856
  }
872
857
 
873
- [data-ui='tabs'] > [data-part='scroll']:not(:disabled):active {
858
+ [data-ui-tabs] > [data-part-scroll]:not(:disabled):active {
874
859
  background-color: var(
875
860
  --slotted-tabs-active-background,
876
861
  var(--slotted-tone-secondary-subtle-active)
877
862
  );
878
863
  }
879
864
 
880
- [data-ui='tabs'] > [data-part='scroll']:focus-visible {
865
+ [data-ui-tabs] > [data-part-scroll]:focus-visible {
881
866
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
882
867
  outline-offset: calc(-1 * var(--slotted-focus-ring-width, 2px));
883
868
  }
@@ -888,18 +873,18 @@
888
873
  * not removed — so the list never moves under the pointer that is using
889
874
  * the other one.
890
875
  */
891
- [data-ui='tabs'] > [data-part='scroll']:disabled {
876
+ [data-ui-tabs] > [data-part-scroll]:disabled {
892
877
  cursor: default;
893
878
  visibility: hidden;
894
879
  }
895
880
 
896
- [data-ui='tabs'][data-orientation='vertical'] > [data-part='scroll'] {
881
+ [data-ui-tabs][data-orientation='vertical'] > [data-part-scroll] {
897
882
  display: none;
898
883
  }
899
884
 
900
885
  /* ── Actions, and the panels ──────────────────────────────────────────── */
901
886
 
902
- [data-ui='tabs'] > [data-part='actions'] {
887
+ [data-ui-tabs] > [data-part-actions] {
903
888
  align-items: center;
904
889
  align-self: center;
905
890
  display: flex;
@@ -909,7 +894,7 @@
909
894
  min-inline-size: 0;
910
895
  }
911
896
 
912
- [data-ui='tabs'][data-orientation='vertical'] > [data-part='actions'] {
897
+ [data-ui-tabs][data-orientation='vertical'] > [data-part-actions] {
913
898
  grid-column: 1;
914
899
  grid-row: 2;
915
900
  }
@@ -928,14 +913,14 @@
928
913
  * their own element, which is one declaration against a layout that
929
914
  * otherwise breaks for every reader on a narrow screen.
930
915
  */
931
- [data-ui='tabs'] > [data-part='panel'] {
916
+ [data-ui-tabs] > [data-part-panel] {
932
917
  grid-column: 1 / -1;
933
918
  grid-row: 2;
934
919
  min-inline-size: 0;
935
920
  overflow-wrap: anywhere;
936
921
  }
937
922
 
938
- [data-ui='tabs'][data-orientation='vertical'] > [data-part='panel'] {
923
+ [data-ui-tabs][data-orientation='vertical'] > [data-part-panel] {
939
924
  grid-column: 2;
940
925
  grid-row: 1 / -1;
941
926
  }
@@ -946,7 +931,7 @@
946
931
  * than relied on. It is the attribute and not a class because a screen
947
932
  * reader, find-in-page and `:target` all already understand it.
948
933
  */
949
- [data-ui='tabs'] > [data-part='panel'][hidden] {
934
+ [data-ui-tabs] > [data-part-panel][hidden] {
950
935
  display: none;
951
936
  }
952
937
 
@@ -956,7 +941,7 @@
956
941
  * own content and has no padding of its own, so an inset ring is drawn
957
942
  * through the first line of it.
958
943
  */
959
- [data-ui='tabs'] > [data-part='panel']:focus-visible {
944
+ [data-ui-tabs] > [data-part-panel]:focus-visible {
960
945
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
961
946
  outline-offset: var(--slotted-focus-ring-offset, 2px);
962
947
  }
@@ -969,7 +954,7 @@
969
954
  * panel instead, which needs a clipping viewport that traps horizontal
970
955
  * scrolling and fights the list's own scroll.
971
956
  */
972
- [data-ui='tabs'] > [data-part='panel']:not([hidden]) {
957
+ [data-ui-tabs] > [data-part-panel]:not([hidden]) {
973
958
  animation: slotted-tabs-panel-in var(--slotted-duration-short) var(--slotted-easing-enter);
974
959
  }
975
960
 
@@ -987,11 +972,11 @@
987
972
  * adds is the track: a disabled family should not read as a live one with
988
973
  * grey labels.
989
974
  */
990
- [data-ui='tabs'][data-disabled] {
975
+ [data-ui-tabs][data-disabled] {
991
976
  --_track-color: var(--slotted-disabled-border, GrayText);
992
977
  }
993
978
 
994
- [data-ui='tabs'][data-disabled][data-variant='contained'] > [data-part='list'] {
979
+ [data-ui-tabs][data-disabled][data-variant='contained'] > [data-part-list] {
995
980
  background-color: var(--slotted-disabled-background, Canvas);
996
981
  }
997
982
 
@@ -1000,7 +985,7 @@
1000
985
  * decoration in an unthemed page should disappear rather than shout, and a
1001
986
  * marker painted `GrayText` with no theme would be the loudest thing on it.
1002
987
  */
1003
- [data-ui='tabs'][data-disabled] > :where([data-part='list']) > [data-part='marker'] {
988
+ [data-ui-tabs][data-disabled] > :where([data-part-list]) > [data-part-marker] {
1004
989
  background-color: var(--slotted-disabled-border);
1005
990
  }
1006
991
 
@@ -1014,27 +999,27 @@
1014
999
  */
1015
1000
  @media (forced-colors: active) {
1016
1001
  /* A shadow is not drawn under forced colours: the track is a border again. */
1017
- [data-ui='tabs'][data-variant='line'][data-track='line'] > [data-part='list'] {
1002
+ [data-ui-tabs][data-variant='line'][data-track='line'] > [data-part-list] {
1018
1003
  border-block-end: var(--_track-size) solid CanvasText;
1019
1004
  padding-block-end: 0;
1020
1005
  }
1021
1006
 
1022
- [data-ui='tabs'][data-orientation='vertical'][data-variant='line'][data-track='line']
1023
- > [data-part='list'] {
1007
+ [data-ui-tabs][data-orientation='vertical'][data-variant='line'][data-track='line']
1008
+ > [data-part-list] {
1024
1009
  border-block-end: 0;
1025
1010
  border-inline-end: var(--_track-size) solid CanvasText;
1026
1011
  padding-inline-end: 0;
1027
1012
  }
1028
1013
 
1029
1014
  /* The marker's ground would flatten to Canvas with every other ground. */
1030
- [data-ui='tabs'] > :where([data-part='list']) > [data-part='marker'] {
1015
+ [data-ui-tabs] > :where([data-part-list]) > [data-part-marker] {
1031
1016
  background-color: Highlight;
1032
1017
  forced-color-adjust: none;
1033
1018
  }
1034
1019
 
1035
- [data-ui='tabs'][data-variant='contained']
1036
- > :where([data-part='list'])
1037
- > [data-part='item'][data-selected] {
1020
+ [data-ui-tabs][data-variant='contained']
1021
+ > :where([data-part-list])
1022
+ > [data-part-item][data-selected] {
1038
1023
  border: var(--slotted-border-width-thin, 1px) solid Highlight;
1039
1024
  }
1040
1025
  }