@slotted/styles 0.1.0-beta.0 → 0.1.0-beta.10

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 (176) 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 +43 -35
  6. package/src/alert/alert.tokens.json +5 -0
  7. package/src/app-shell/app-shell.css +356 -301
  8. package/src/aspect-ratio/aspect-ratio.css +9 -9
  9. package/src/attachment/attachment.css +91 -99
  10. package/src/avatar/avatar.css +71 -41
  11. package/src/avatar/avatar.tokens.json +7 -0
  12. package/src/avatar-group/avatar-group.css +21 -22
  13. package/src/badge/badge.css +45 -37
  14. package/src/badge/badge.tokens.json +5 -0
  15. package/src/breadcrumb/breadcrumb.css +37 -37
  16. package/src/button/button.css +139 -64
  17. package/src/button/button.tokens.json +10 -0
  18. package/src/button-group/button-group.css +76 -72
  19. package/src/button-group/button-group.tokens.json +2 -0
  20. package/src/calendar/calendar.css +93 -103
  21. package/src/card/card.css +54 -61
  22. package/src/carousel/carousel.css +150 -161
  23. package/src/cascader/cascader.css +152 -153
  24. package/src/cascader/cascader.tokens.json +1 -0
  25. package/src/chart/chart.css +242 -239
  26. package/src/chart/chart.tokens.json +1 -0
  27. package/src/checkbox/checkbox.css +119 -124
  28. package/src/checkbox-group/checkbox-group.css +7 -7
  29. package/src/code-block/code-block.css +81 -85
  30. package/src/collapsible/collapsible.css +69 -76
  31. package/src/color-picker/color-picker.css +83 -91
  32. package/src/column-manager/column-manager.css +106 -114
  33. package/src/combobox/combobox.css +132 -107
  34. package/src/combobox/combobox.tokens.json +1 -0
  35. package/src/command-palette/command-palette.css +84 -90
  36. package/src/container/container.css +24 -24
  37. package/src/context-menu/context-menu.css +8 -8
  38. package/src/currency-field/currency-field.css +210 -88
  39. package/src/currency-field/currency-field.tokens.json +13 -0
  40. package/src/dashboard-grid/dashboard-grid.css +148 -116
  41. package/src/data-grid/data-grid.css +504 -469
  42. package/src/data-grid/data-grid.tokens.json +2 -0
  43. package/src/data-list/data-list.css +81 -70
  44. package/src/data-list/data-list.tokens.json +2 -1
  45. package/src/date-field/date-field.css +55 -52
  46. package/src/date-field/date-field.tokens.json +1 -0
  47. package/src/date-picker/date-picker.css +40 -42
  48. package/src/date-range-picker/date-range-picker.css +114 -118
  49. package/src/datetime-field/datetime-field.css +78 -80
  50. package/src/datetime-field/datetime-field.tokens.json +1 -0
  51. package/src/datetime-picker/datetime-picker.css +61 -63
  52. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  53. package/src/description-list/description-list.css +61 -64
  54. package/src/detail-panel/detail-panel.css +70 -70
  55. package/src/dialog/dialog.css +334 -153
  56. package/src/dialog/dialog.tokens.json +5 -0
  57. package/src/divider/divider.css +18 -18
  58. package/src/drawer/drawer.css +186 -209
  59. package/src/entity-picker/entity-picker.css +238 -241
  60. package/src/entity-picker/entity-picker.tokens.json +1 -0
  61. package/src/event-calendar/event-calendar.css +343 -385
  62. package/src/field/field.css +74 -78
  63. package/src/field-group/field-group.css +22 -25
  64. package/src/filter-bar/filter-bar.css +193 -209
  65. package/src/form/form.css +34 -24
  66. package/src/form/form.tokens.json +1 -0
  67. package/src/fullscreen/fullscreen.css +24 -25
  68. package/src/grid/grid.css +28 -28
  69. package/src/highlight/highlight.css +6 -6
  70. package/src/hover-card/hover-card.css +6 -6
  71. package/src/icon/icon.css +19 -15
  72. package/src/icon/icon.tokens.json +1 -0
  73. package/src/image/image.css +39 -39
  74. package/src/import-export-center/import-export-center.css +135 -156
  75. package/src/inline/inline.css +27 -27
  76. package/src/inline-message/inline-message.css +52 -28
  77. package/src/inline-message/inline-message.tokens.json +4 -0
  78. package/src/kbd/kbd.css +30 -26
  79. package/src/link/link.css +15 -15
  80. package/src/list/list.css +44 -17
  81. package/src/list/list.tokens.json +4 -0
  82. package/src/list-item/list-item.css +80 -66
  83. package/src/list-item/list-item.tokens.json +7 -0
  84. package/src/listbox/listbox.css +56 -59
  85. package/src/loading-overlay/loading-overlay.css +75 -92
  86. package/src/markdown/markdown.css +17 -17
  87. package/src/menu/menu.css +83 -63
  88. package/src/menubar/menubar.css +13 -13
  89. package/src/message/message.css +182 -202
  90. package/src/message/message.tokens.json +5 -0
  91. package/src/message-scroller/message-scroller.css +41 -42
  92. package/src/multi-select/multi-select.css +152 -145
  93. package/src/multi-select/multi-select.tokens.json +1 -0
  94. package/src/navigation-menu/navigation-menu.css +167 -188
  95. package/src/notification-center/notification-center.css +140 -148
  96. package/src/notification-center/notification-center.tokens.json +3 -0
  97. package/src/number-field/number-field.css +84 -83
  98. package/src/number-field/number-field.tokens.json +1 -0
  99. package/src/otp-input/otp-input.css +67 -57
  100. package/src/otp-input/otp-input.tokens.json +1 -0
  101. package/src/page/page.css +23 -23
  102. package/src/page-header/page-header.css +268 -281
  103. package/src/page-header/page-header.tokens.json +1 -0
  104. package/src/pagination/pagination.css +68 -72
  105. package/src/popover/popover.css +40 -49
  106. package/src/progress-indicator/progress-indicator.css +177 -120
  107. package/src/progress-indicator/progress-indicator.tokens.json +1 -1
  108. package/src/prompt-composer/prompt-composer.css +221 -102
  109. package/src/prompt-composer/prompt-composer.tokens.json +15 -0
  110. package/src/prose/prose.css +71 -75
  111. package/src/radio-group/radio-group.css +98 -103
  112. package/src/rating/rating.css +136 -132
  113. package/src/rating/rating.tokens.json +1 -0
  114. package/src/result-state/result-state.css +74 -77
  115. package/src/runtime-properties.mjs +2 -0
  116. package/src/saved-views/saved-views.css +41 -47
  117. package/src/scroll-area/scroll-area.css +39 -32
  118. package/src/section/section.css +161 -41
  119. package/src/section/section.tokens.json +7 -2
  120. package/src/segmented-control/segmented-control.css +254 -97
  121. package/src/segmented-control/segmented-control.tokens.json +15 -11
  122. package/src/select/select.css +118 -117
  123. package/src/select/select.tokens.json +1 -0
  124. package/src/side-navigation/side-navigation.css +179 -182
  125. package/src/side-navigation/side-navigation.tokens.json +1 -0
  126. package/src/skeleton/skeleton.css +47 -48
  127. package/src/slider/slider.css +86 -88
  128. package/src/sparkline/sparkline.css +62 -40
  129. package/src/sparkline/sparkline.tokens.json +2 -0
  130. package/src/spinner/spinner.css +39 -182
  131. package/src/spinner/spinner.tokens.json +0 -2
  132. package/src/split-button/split-button.css +30 -31
  133. package/src/split-button/split-button.tokens.json +1 -0
  134. package/src/splitter/splitter.css +35 -35
  135. package/src/stack/stack.css +24 -24
  136. package/src/stat-card/stat-card.css +341 -224
  137. package/src/stat-card/stat-card.tokens.json +3 -0
  138. package/src/status-indicator/status-indicator.css +28 -28
  139. package/src/stepper/stepper.css +58 -62
  140. package/src/switch/switch.css +86 -92
  141. package/src/table/table.css +310 -165
  142. package/src/table/table.tokens.json +6 -0
  143. package/src/table-of-contents/table-of-contents.css +51 -54
  144. package/src/tabs/tabs.css +330 -302
  145. package/src/tabs/tabs.tokens.json +8 -5
  146. package/src/tag/tag.css +79 -71
  147. package/src/tag/tag.tokens.json +9 -0
  148. package/src/tags-input/tags-input.css +145 -82
  149. package/src/tags-input/tags-input.tokens.json +7 -1
  150. package/src/text-field/text-field.css +132 -136
  151. package/src/text-field/text-field.tokens.json +1 -0
  152. package/src/textarea/textarea.css +31 -28
  153. package/src/textarea/textarea.tokens.json +1 -0
  154. package/src/time-field/time-field.css +72 -69
  155. package/src/time-field/time-field.tokens.json +1 -0
  156. package/src/time-picker/time-picker.css +56 -58
  157. package/src/time-range-picker/time-range-picker.css +126 -133
  158. package/src/timeline/timeline.css +254 -266
  159. package/src/timeline/timeline.tokens.json +5 -0
  160. package/src/toast/toast.css +89 -90
  161. package/src/toast/toast.tokens.json +5 -0
  162. package/src/toggle/toggle.css +62 -25
  163. package/src/toggle/toggle.tokens.json +8 -0
  164. package/src/toggle-group/toggle-group.css +106 -60
  165. package/src/toggle-group/toggle-group.tokens.json +10 -0
  166. package/src/toolbar/toolbar.css +30 -35
  167. package/src/tooltip/tooltip.css +26 -26
  168. package/src/top-navigation/top-navigation.css +243 -259
  169. package/src/tour/tour.css +51 -60
  170. package/src/transfer/transfer.css +160 -164
  171. package/src/tree/tree.css +103 -111
  172. package/src/typography/typography.css +40 -36
  173. package/src/typography/typography.tokens.json +1 -0
  174. package/src/upload/upload.css +224 -224
  175. package/src/visually-hidden/visually-hidden.css +1 -1
  176. package/src/wizard/wizard.css +185 -197
@@ -19,7 +19,7 @@
19
19
  * with child combinators so a `label` or a `root` of theirs is never
20
20
  * restyled.
21
21
  */
22
- [data-ui='saved-views'] {
22
+ [data-ui-saved-views] {
23
23
  --_text: var(--slotted-text, CanvasText);
24
24
  --_muted: var(--slotted-text-muted, GrayText);
25
25
  --_hover: var(--slotted-tone-secondary-subtle-hover, ButtonFace);
@@ -48,7 +48,7 @@
48
48
  * The trigger and revert on one row that wraps: at 240 pixels the revert
49
49
  * control drops under the trigger rather than pushing it out of the box.
50
50
  */
51
- [data-ui='saved-views'][data-part='root'] {
51
+ [data-ui-saved-views][data-part-root] {
52
52
  display: inline-flex;
53
53
  flex-wrap: wrap;
54
54
  align-items: center;
@@ -62,7 +62,7 @@
62
62
  * control shadow and the control surface, so the view in use reads as a
63
63
  * value the reader can change rather than as a heading.
64
64
  */
65
- [data-ui='saved-views'] > [data-part='trigger'] {
65
+ [data-ui-saved-views] > [data-part-trigger] {
66
66
  display: inline-flex;
67
67
  align-items: center;
68
68
  gap: var(--_gap);
@@ -86,7 +86,7 @@
86
86
  }
87
87
 
88
88
  /** Truncated on one line; the whole name stays in the DOM and in the button's name. */
89
- [data-ui='saved-views'] > [data-part='trigger'] > [data-label] {
89
+ [data-ui-saved-views] > [data-part-trigger] > [data-label] {
90
90
  min-inline-size: 0;
91
91
  overflow: hidden;
92
92
  text-overflow: ellipsis;
@@ -94,21 +94,21 @@
94
94
  }
95
95
 
96
96
  /** The chevron, an `icon` after the name, turning over while the layer is open. */
97
- [data-ui='saved-views'] > [data-part='trigger'] > [data-ui='icon'] {
97
+ [data-ui-saved-views] > [data-part-trigger] > [data-ui-icon] {
98
98
  margin-inline-end: calc(var(--slotted-space-2, 0.25rem) * -1);
99
99
  color: var(--_muted);
100
100
  transition: rotate var(--_duration) var(--_easing);
101
101
  }
102
102
 
103
- [data-ui='saved-views'][data-open] > [data-part='trigger'] > [data-ui='icon'] {
103
+ [data-ui-saved-views][data-open] > [data-part-trigger] > [data-ui-icon] {
104
104
  rotate: 180deg;
105
105
  }
106
106
 
107
- [data-ui='saved-views'] > [data-part='trigger']:hover:not(:disabled) {
107
+ [data-ui-saved-views] > [data-part-trigger]:hover:not(:disabled) {
108
108
  background: var(--_hover);
109
109
  }
110
110
 
111
- [data-ui='saved-views'] > [data-part='trigger']:active:not(:disabled) {
111
+ [data-ui-saved-views] > [data-part-trigger]:active:not(:disabled) {
112
112
  background: var(--_active);
113
113
  transition-duration: var(--slotted-duration-instant);
114
114
  }
@@ -118,7 +118,7 @@
118
118
  * the regular weight, so the name stays the loudest thing in the control
119
119
  * and the state is never colour alone.
120
120
  */
121
- [data-ui='saved-views'] > [data-part='trigger'] > [data-part='modified'] {
121
+ [data-ui-saved-views] > [data-part-trigger] > [data-part-modified] {
122
122
  display: inline-flex;
123
123
  flex: none;
124
124
  align-items: center;
@@ -130,7 +130,7 @@
130
130
  font-weight: var(--slotted-font-weight-regular, 400);
131
131
  }
132
132
 
133
- [data-ui='saved-views'] > [data-part='trigger'] > [data-part='modified']::before {
133
+ [data-ui-saved-views] > [data-part-trigger] > [data-part-modified]::before {
134
134
  content: '';
135
135
  flex: none;
136
136
  inline-size: var(--slotted-space-4, 0.5rem);
@@ -140,7 +140,7 @@
140
140
  }
141
141
 
142
142
  /** Revert: a ghost control with the counter-clockwise arrow, at the trigger's height. */
143
- [data-ui='saved-views'] > [data-part='revert'] {
143
+ [data-ui-saved-views] > [data-part-revert] {
144
144
  display: inline-flex;
145
145
  align-items: center;
146
146
  gap: var(--slotted-space-3, 0.375rem);
@@ -159,17 +159,17 @@
159
159
  transition: background-color var(--_duration) var(--_easing);
160
160
  }
161
161
 
162
- [data-ui='saved-views'] > [data-part='revert']:hover:not(:disabled) {
162
+ [data-ui-saved-views] > [data-part-revert]:hover:not(:disabled) {
163
163
  background: var(--slotted-tone-accent-subtle-hover, ButtonFace);
164
164
  }
165
165
 
166
- [data-ui='saved-views'] > [data-part='revert']:active:not(:disabled) {
166
+ [data-ui-saved-views] > [data-part-revert]:active:not(:disabled) {
167
167
  background: var(--slotted-tone-accent-subtle-active, ButtonFace);
168
168
  transition-duration: var(--slotted-duration-instant);
169
169
  }
170
170
 
171
- [data-ui='saved-views'] > [data-part='trigger']:focus-visible,
172
- [data-ui='saved-views'] > [data-part='revert']:focus-visible {
171
+ [data-ui-saved-views] > [data-part-trigger]:focus-visible,
172
+ [data-ui-saved-views] > [data-part-revert]:focus-visible {
173
173
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
174
174
  outline-offset: var(--slotted-focus-ring-offset, 2px);
175
175
  }
@@ -182,7 +182,7 @@
182
182
  * would change width as views are renamed. The padding keeps a row's hover
183
183
  * ground off the popover's rounded edge.
184
184
  */
185
- [data-ui='saved-views'][data-part='panel'] {
185
+ [data-ui-saved-views][data-part-panel] {
186
186
  display: grid;
187
187
  /* One track that grows to the token and gives way to zero: the panel's
188
188
  min-content is nothing and its max-content the token, so a popover
@@ -193,7 +193,7 @@
193
193
  padding: var(--slotted-space-2, 0.25rem);
194
194
  }
195
195
 
196
- [data-ui='saved-views'][data-part='panel'] > [data-part='list'] {
196
+ [data-ui-saved-views][data-part-panel] > [data-part-list] {
197
197
  display: grid;
198
198
  gap: var(--slotted-space-1, 0.125rem);
199
199
  margin: 0;
@@ -202,7 +202,7 @@
202
202
  }
203
203
 
204
204
  /** A row: the view's name across, its actions at the inline end. */
205
- [data-ui='saved-views'][data-part='panel'] > [data-part='list'] > [data-part='item'] {
205
+ [data-ui-saved-views][data-part-panel] > [data-part-list] > [data-part-item] {
206
206
  display: grid;
207
207
  grid-template-columns: minmax(0, 1fr) auto;
208
208
  align-items: start;
@@ -210,9 +210,7 @@
210
210
  margin: 0;
211
211
  }
212
212
 
213
- [data-ui='saved-views'][data-part='panel']
214
- > [data-part='list']
215
- > [data-part='item'][data-editing] {
213
+ [data-ui-saved-views][data-part-panel] > [data-part-list] > [data-part-item][data-editing] {
216
214
  grid-template-columns: minmax(0, 1fr);
217
215
  }
218
216
 
@@ -224,7 +222,7 @@
224
222
  * binding draws the check on the view in use alone, and the name keeps the
225
223
  * second column whether the check stands before it or not.
226
224
  */
227
- [data-ui='saved-views'][data-part='panel'] [data-part='apply'] {
225
+ [data-ui-saved-views][data-part-panel] [data-part-apply] {
228
226
  display: grid;
229
227
  grid-template-columns: var(--_icon-size-sm) minmax(0, max-content) auto;
230
228
  justify-content: start;
@@ -256,37 +254,35 @@
256
254
  * half the band, the midpoint of cap height and x-height, so its centre is
257
255
  * the band's.
258
256
  */
259
- [data-ui='saved-views'][data-part='panel'] [data-part='apply'] > [data-ui='icon'] {
257
+ [data-ui-saved-views][data-part-panel] [data-part-apply] > [data-ui-icon] {
260
258
  color: var(--slotted-tone-accent-text);
261
259
  translate: 0 calc(var(--_icon-size-sm) / 2 - (1cap + 1ex) / 4);
262
260
  }
263
261
 
264
- [data-ui='saved-views'][data-part='panel']
265
- [data-part='item'][data-current]
266
- > [data-part='apply'] {
262
+ [data-ui-saved-views][data-part-panel] [data-part-item][data-current] > [data-part-apply] {
267
263
  font-weight: var(--slotted-font-weight-medium, 500);
268
264
  }
269
265
 
270
266
  /** A long name wraps inside the row; nothing is cut. */
271
- [data-ui='saved-views'][data-part='panel'] [data-part='apply'] > [data-label] {
267
+ [data-ui-saved-views][data-part-panel] [data-part-apply] > [data-label] {
272
268
  grid-column: 2;
273
269
  min-inline-size: 0;
274
270
  overflow-wrap: anywhere;
275
271
  }
276
272
 
277
- [data-ui='saved-views'][data-part='panel'] [data-part='apply']:hover:not(:disabled),
278
- [data-ui='saved-views'][data-part='panel'] [data-part='actions']:hover:not(:disabled) {
273
+ [data-ui-saved-views][data-part-panel] [data-part-apply]:hover:not(:disabled),
274
+ [data-ui-saved-views][data-part-panel] [data-part-actions]:hover:not(:disabled) {
279
275
  background: var(--_hover);
280
276
  }
281
277
 
282
- [data-ui='saved-views'][data-part='panel'] [data-part='apply']:active:not(:disabled),
283
- [data-ui='saved-views'][data-part='panel'] [data-part='actions']:active:not(:disabled) {
278
+ [data-ui-saved-views][data-part-panel] [data-part-apply]:active:not(:disabled),
279
+ [data-ui-saved-views][data-part-panel] [data-part-actions]:active:not(:disabled) {
284
280
  background: var(--_active);
285
281
  transition-duration: var(--slotted-duration-instant);
286
282
  }
287
283
 
288
284
  /** The pin: the view a visit opens on. The word beside it is for the ear only. */
289
- [data-ui='saved-views'][data-part='panel'] [data-part='apply'] > [data-part='default-mark'] {
285
+ [data-ui-saved-views][data-part-panel] [data-part-apply] > [data-part-default-mark] {
290
286
  /* A flex box, so the pin `icon` inside is laid out as an item and not on
291
287
  a line of its own that would stand taller than the mark. */
292
288
  display: flex;
@@ -299,9 +295,7 @@
299
295
  color: var(--_muted);
300
296
  }
301
297
 
302
- [data-ui='saved-views'][data-part='panel']
303
- [data-part='default-mark']
304
- > span:not([data-ui='icon']) {
298
+ [data-ui-saved-views][data-part-panel] [data-part-default-mark] > span:not([data-ui-icon]) {
305
299
  position: absolute;
306
300
  inline-size: 1px;
307
301
  block-size: 1px;
@@ -314,7 +308,7 @@
314
308
  * The row's menu: a square at the small control height with the ellipsis
315
309
  * `icon`, muted at rest and on the text ink under the pointer.
316
310
  */
317
- [data-ui='saved-views'][data-part='panel'] [data-part='actions'] {
311
+ [data-ui-saved-views][data-part-panel] [data-part-actions] {
318
312
  display: inline-grid;
319
313
  place-items: center;
320
314
  box-sizing: border-box;
@@ -332,14 +326,14 @@
332
326
  color var(--_duration) var(--_easing);
333
327
  }
334
328
 
335
- [data-ui='saved-views'][data-part='panel'] [data-part='actions'][data-open],
336
- [data-ui='saved-views'][data-part='panel'] [data-part='actions']:hover:not(:disabled) {
329
+ [data-ui-saved-views][data-part-panel] [data-part-actions][data-open],
330
+ [data-ui-saved-views][data-part-panel] [data-part-actions]:hover:not(:disabled) {
337
331
  color: var(--_text);
338
332
  }
339
333
 
340
334
  /** Drawn inward: the rows sit one space step apart and an outward ring would cross the next. */
341
- [data-ui='saved-views'][data-part='panel'] [data-part='apply']:focus-visible,
342
- [data-ui='saved-views'][data-part='panel'] [data-part='actions']:focus-visible {
335
+ [data-ui-saved-views][data-part-panel] [data-part-apply]:focus-visible,
336
+ [data-ui-saved-views][data-part-panel] [data-part-actions]:focus-visible {
343
337
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
344
338
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
345
339
  }
@@ -351,8 +345,8 @@
351
345
  * view; and the confirmation, in the row being deleted. Both stand on the
352
346
  * sunken surface so the row reads as one being edited.
353
347
  */
354
- [data-ui='saved-views'][data-part='panel'] [data-part='form'],
355
- [data-ui='saved-views'][data-part='panel'] [data-part='confirm'] {
348
+ [data-ui-saved-views][data-part-panel] [data-part-form],
349
+ [data-ui-saved-views][data-part-panel] [data-part-confirm] {
356
350
  display: grid;
357
351
  gap: var(--slotted-space-4, 0.5rem);
358
352
  margin: 0;
@@ -361,13 +355,13 @@
361
355
  background: var(--slotted-surface-sunken, Canvas);
362
356
  }
363
357
 
364
- [data-ui='saved-views'][data-part='panel'] [data-part='confirm'] > p {
358
+ [data-ui-saved-views][data-part-panel] [data-part-confirm] > p {
365
359
  margin: 0;
366
360
  overflow-wrap: anywhere;
367
361
  }
368
362
 
369
- [data-ui='saved-views'][data-part='panel']
370
- :is([data-part='form'], [data-part='confirm'])
363
+ [data-ui-saved-views][data-part-panel]
364
+ :is([data-part-form], [data-part-confirm])
371
365
  > [data-buttons] {
372
366
  display: flex;
373
367
  flex-wrap: wrap;
@@ -376,7 +370,7 @@
376
370
  }
377
371
 
378
372
  /** Save as new view… then Save, at the inline end, under a rule. */
379
- [data-ui='saved-views'][data-part='panel'] > [data-part='footer'] {
373
+ [data-ui-saved-views][data-part-panel] > [data-part-footer] {
380
374
  display: flex;
381
375
  flex-wrap: wrap;
382
376
  justify-content: flex-end;
@@ -387,7 +381,7 @@
387
381
  }
388
382
 
389
383
  @media (forced-colors: active) {
390
- [data-ui='saved-views'] > [data-part='trigger'] > [data-part='modified']::before {
384
+ [data-ui-saved-views] > [data-part-trigger] > [data-part-modified]::before {
391
385
  forced-color-adjust: none;
392
386
  }
393
387
  }
@@ -34,7 +34,7 @@
34
34
  * mask is not on. `root` is that element: it holds the border, the radius and
35
35
  * the maximum, and `viewport` inside it holds the scroll and the veil.
36
36
  */
37
- [data-ui='scroll-area'] {
37
+ [data-ui-scroll-area] {
38
38
  /**
39
39
  * How far the veil reaches in from an edge that has content behind it.
40
40
  *
@@ -77,7 +77,7 @@
77
77
  min-inline-size: 0;
78
78
  }
79
79
 
80
- [data-ui='scroll-area'] > [data-part='viewport'] {
80
+ [data-ui-scroll-area] > [data-part-viewport] {
81
81
  /**
82
82
  * One length per logical edge: the veil's reach where that end of the
83
83
  * content is out of view, and nothing where it is showing.
@@ -205,7 +205,7 @@
205
205
  * attribute form would then paint the veil on the edge the reader can already
206
206
  * see.
207
207
  */
208
- [data-ui='scroll-area']:dir(rtl) > [data-part='viewport'] {
208
+ [data-ui-scroll-area]:dir(rtl) > [data-part-viewport] {
209
209
  --_fade-left: var(--_scroll-area-fade-inline-end);
210
210
  --_fade-right: var(--_scroll-area-fade-inline-start);
211
211
  }
@@ -220,21 +220,21 @@
220
220
  * `@supports` is needed for that — an unknown declaration is discarded at
221
221
  * parse time and the cascade does the rest.
222
222
  */
223
- [data-ui='scroll-area'][data-axis='block'] > [data-part='viewport'] {
223
+ [data-ui-scroll-area][data-axis='block'] > [data-part-viewport] {
224
224
  overflow-x: hidden;
225
225
  overflow-y: auto;
226
226
  overflow-inline: hidden;
227
227
  overflow-block: auto;
228
228
  }
229
229
 
230
- [data-ui='scroll-area'][data-axis='inline'] > [data-part='viewport'] {
230
+ [data-ui-scroll-area][data-axis='inline'] > [data-part-viewport] {
231
231
  overflow-x: auto;
232
232
  overflow-y: hidden;
233
233
  overflow-inline: auto;
234
234
  overflow-block: hidden;
235
235
  }
236
236
 
237
- [data-ui='scroll-area'][data-axis='both'] > [data-part='viewport'] {
237
+ [data-ui-scroll-area][data-axis='both'] > [data-part-viewport] {
238
238
  overflow: auto;
239
239
  }
240
240
 
@@ -243,17 +243,17 @@
243
243
  * "reserve the bar whether or not it is needed". It is stated per axis so it
244
244
  * does not turn a one-axis area into a two-axis one.
245
245
  */
246
- [data-ui='scroll-area'][data-scrollbars='always'][data-axis='block'] > [data-part='viewport'] {
246
+ [data-ui-scroll-area][data-scrollbars='always'][data-axis='block'] > [data-part-viewport] {
247
247
  overflow-y: scroll;
248
248
  overflow-block: scroll;
249
249
  }
250
250
 
251
- [data-ui='scroll-area'][data-scrollbars='always'][data-axis='inline'] > [data-part='viewport'] {
251
+ [data-ui-scroll-area][data-scrollbars='always'][data-axis='inline'] > [data-part-viewport] {
252
252
  overflow-x: scroll;
253
253
  overflow-inline: scroll;
254
254
  }
255
255
 
256
- [data-ui='scroll-area'][data-scrollbars='always'][data-axis='both'] > [data-part='viewport'] {
256
+ [data-ui-scroll-area][data-scrollbars='always'][data-axis='both'] > [data-part-viewport] {
257
257
  overflow: scroll;
258
258
  }
259
259
 
@@ -266,7 +266,7 @@
266
266
  * and why this value is worth having at all: an area with no bar and no veil
267
267
  * says nothing.
268
268
  */
269
- [data-ui='scroll-area'][data-scrollbars='none'] > [data-part='viewport'] {
269
+ [data-ui-scroll-area][data-scrollbars='none'] > [data-part-viewport] {
270
270
  scrollbar-width: none;
271
271
  }
272
272
 
@@ -279,7 +279,7 @@
279
279
  * state — `packages/styles/src/states.test.mjs` — rather than a state this
280
280
  * family holds: a scrollport is not a control and has no disabled form.
281
281
  */
282
- [data-ui='scroll-area'][data-scrollbars='hover'] > [data-part='viewport'] {
282
+ [data-ui-scroll-area][data-scrollbars='hover'] > [data-part-viewport] {
283
283
  scrollbar-color: transparent transparent;
284
284
  transition:
285
285
  scrollbar-color var(--slotted-duration-short) var(--slotted-easing-standard),
@@ -289,29 +289,28 @@
289
289
  --_scroll-area-fade-inline-end var(--slotted-duration-short) var(--slotted-easing-standard);
290
290
  }
291
291
 
292
- [data-ui='scroll-area'][data-scrollbars='hover']:not([data-disabled]):hover
293
- > [data-part='viewport'],
294
- [data-ui='scroll-area'][data-scrollbars='hover']:focus-within > [data-part='viewport'] {
292
+ [data-ui-scroll-area][data-scrollbars='hover']:not([data-disabled]):hover > [data-part-viewport],
293
+ [data-ui-scroll-area][data-scrollbars='hover']:focus-within > [data-part-viewport] {
295
294
  scrollbar-color: var(--_thumb) var(--_track);
296
295
  }
297
296
 
298
297
  /* ── The gutter ────────────────────────────────────────────────────────── */
299
298
 
300
- [data-ui='scroll-area'][data-gutter='auto'] > [data-part='viewport'] {
299
+ [data-ui-scroll-area][data-gutter='auto'] > [data-part-viewport] {
301
300
  scrollbar-gutter: auto;
302
301
  }
303
302
 
304
- [data-ui='scroll-area'][data-gutter='both-edges'] > [data-part='viewport'] {
303
+ [data-ui-scroll-area][data-gutter='both-edges'] > [data-part-viewport] {
305
304
  scrollbar-gutter: stable both-edges;
306
305
  }
307
306
 
308
307
  /* ── Scroll chaining ───────────────────────────────────────────────────── */
309
308
 
310
- [data-ui='scroll-area'][data-overscroll='auto'] > [data-part='viewport'] {
309
+ [data-ui-scroll-area][data-overscroll='auto'] > [data-part-viewport] {
311
310
  overscroll-behavior: auto;
312
311
  }
313
312
 
314
- [data-ui='scroll-area'][data-overscroll='none'] > [data-part='viewport'] {
313
+ [data-ui-scroll-area][data-overscroll='none'] > [data-part-viewport] {
315
314
  overscroll-behavior: none;
316
315
  }
317
316
 
@@ -322,31 +321,31 @@
322
321
  * code block. These come after the two above, so a chosen `none` holds the
323
322
  * scrolling axis and lets the other through.
324
323
  */
325
- [data-ui='scroll-area'][data-axis='inline'] > [data-part='viewport'] {
324
+ [data-ui-scroll-area][data-axis='inline'] > [data-part-viewport] {
326
325
  overscroll-behavior-y: auto;
327
326
  overscroll-behavior-block: auto;
328
327
  }
329
328
 
330
- [data-ui='scroll-area'][data-axis='block'] > [data-part='viewport'] {
329
+ [data-ui-scroll-area][data-axis='block'] > [data-part-viewport] {
331
330
  overscroll-behavior-x: auto;
332
331
  overscroll-behavior-inline: auto;
333
332
  }
334
333
 
335
334
  /* ── The veil, edge by edge ────────────────────────────────────────────── */
336
335
 
337
- [data-ui='scroll-area'][data-at-block-start] > [data-part='viewport'] {
336
+ [data-ui-scroll-area][data-at-block-start] > [data-part-viewport] {
338
337
  --_scroll-area-fade-block-start: 0px;
339
338
  }
340
339
 
341
- [data-ui='scroll-area'][data-at-block-end] > [data-part='viewport'] {
340
+ [data-ui-scroll-area][data-at-block-end] > [data-part-viewport] {
342
341
  --_scroll-area-fade-block-end: 0px;
343
342
  }
344
343
 
345
- [data-ui='scroll-area'][data-at-inline-start] > [data-part='viewport'] {
344
+ [data-ui-scroll-area][data-at-inline-start] > [data-part-viewport] {
346
345
  --_scroll-area-fade-inline-start: 0px;
347
346
  }
348
347
 
349
- [data-ui='scroll-area'][data-at-inline-end] > [data-part='viewport'] {
348
+ [data-ui-scroll-area][data-at-inline-end] > [data-part-viewport] {
350
349
  --_scroll-area-fade-inline-end: 0px;
351
350
  }
352
351
 
@@ -355,7 +354,7 @@
355
354
  * scroller holds what the reader has already passed, and a product that
356
355
  * would rather not dim it says so here.
357
356
  */
358
- [data-ui='scroll-area'][data-fade='end'] > [data-part='viewport'] {
357
+ [data-ui-scroll-area][data-fade='end'] > [data-part-viewport] {
359
358
  --_scroll-area-fade-block-start: 0px;
360
359
  --_scroll-area-fade-inline-start: 0px;
361
360
  }
@@ -365,7 +364,7 @@
365
364
  * the element on its own compositing layer, and a long list pays for that on
366
365
  * every frame.
367
366
  */
368
- [data-ui='scroll-area'][data-fade='none'] > [data-part='viewport'],
367
+ [data-ui-scroll-area][data-fade='none'] > [data-part-viewport],
369
368
  /**
370
369
  * A vertical writing mode turns the box, and a gradient cannot be given a
371
370
  * logical direction. Rather than veil the wrong two edges, the family veils
@@ -373,7 +372,7 @@
373
372
  * affordance there draws it from them. The binding writes `data-sideways`
374
373
  * because only script can read a writing mode.
375
374
  */
376
- [data-ui='scroll-area'][data-sideways] > [data-part='viewport'] {
375
+ [data-ui-scroll-area][data-sideways] > [data-part-viewport] {
377
376
  mask-image: none;
378
377
  }
379
378
 
@@ -391,7 +390,7 @@
391
390
  * `min-inline-size: fit-content` so a row wider than the scrollport widens
392
391
  * this box with it, and the inset survives at the far end.
393
392
  */
394
- [data-ui='scroll-area'] > [data-part='viewport'] > [data-part='content'] {
393
+ [data-ui-scroll-area] > [data-part-viewport] > [data-part-content] {
395
394
  box-sizing: border-box;
396
395
  min-inline-size: fit-content;
397
396
  padding: var(--slotted-scroll-area-inset, var(--slotted-space-5, 0.75rem));
@@ -410,8 +409,16 @@
410
409
  *
411
410
  * `:has()` rather than `:focus-within`, because a link inside the content is
412
411
  * focus *within* the area and is not the area being focused.
412
+ *
413
+ * The ring is drawn for a focus from the keyboard: a click on the content
414
+ * focuses the viewport too, and the next Shift would make it match
415
+ * `:focus-visible` (`createFocusOrigin`). The browser's own ring on the
416
+ * viewport is suppressed: the frame draws the one ring.
413
417
  */
414
- [data-ui='scroll-area']:has(> [data-part='viewport']:focus-visible) {
418
+ [data-ui-scroll-area] > [data-part-viewport]:focus {
419
+ outline: none;
420
+ }
421
+ [data-ui-scroll-area]:has(> [data-part-viewport]:focus-visible[data-focus-origin='keyboard']) {
415
422
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
416
423
  outline-offset: var(--slotted-focus-ring-offset, 2px);
417
424
  }
@@ -425,8 +432,8 @@
425
432
  * sentence.
426
433
  */
427
434
  @media print {
428
- [data-ui='scroll-area'],
429
- [data-ui='scroll-area'] > [data-part='viewport'] {
435
+ [data-ui-scroll-area],
436
+ [data-ui-scroll-area] > [data-part-viewport] {
430
437
  max-block-size: none;
431
438
  max-inline-size: none;
432
439
  overflow: visible;
@@ -440,7 +447,7 @@
440
447
  * the system's own, which is what `scrollbar-color: auto` means.
441
448
  */
442
449
  @media (forced-colors: active) {
443
- [data-ui='scroll-area'] > [data-part='viewport'] {
450
+ [data-ui-scroll-area] > [data-part-viewport] {
444
451
  mask-image: none;
445
452
  scrollbar-color: auto;
446
453
  }