@slotted/styles 0.1.0-beta.1 → 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
package/src/form/form.css CHANGED
@@ -14,10 +14,10 @@
14
14
  * Both stand anywhere inside the form, and so do other families' parts of
15
15
  * the same names — a `table`'s summary row, a `section`'s actions. The two
16
16
  * carry the family's identifier, and every rule names them by it: a rule
17
- * that reached `[data-part='summary']` as any descendant painted a table's
17
+ * that reached `[data-part-summary]` as any descendant painted a table's
18
18
  * totals as an error panel.
19
19
  */
20
- [data-ui='form'][data-part='root'] {
20
+ [data-ui-form][data-part-root] {
21
21
  --_font-size: var(--slotted-control-font-size-md, 13px);
22
22
 
23
23
  /**
@@ -48,7 +48,7 @@
48
48
  * with `aria-busy`, because the pointer is where a reader who just pressed
49
49
  * the button already is.
50
50
  */
51
- [data-ui='form'][data-part='root'][data-loading] {
51
+ [data-ui-form][data-part-root][data-loading] {
52
52
  cursor: progress;
53
53
  }
54
54
 
@@ -63,7 +63,7 @@
63
63
  * they read it. The tone tokens are the theme's, so the panel answers the
64
64
  * scheme switch instead of being a red box that turns black.
65
65
  */
66
- [data-ui='form'][data-part='summary'] {
66
+ [data-ui-form][data-part-summary] {
67
67
  background-color: var(--slotted-form-summary-background, var(--slotted-tone-danger-surface));
68
68
  border: var(--slotted-control-border-width, 1px) solid
69
69
  var(--slotted-form-summary-border-color, var(--slotted-tone-danger-border));
@@ -88,12 +88,12 @@
88
88
  * announced, and the ring is the family's own: a `tabindex="-1"` target that
89
89
  * showed nothing on focus would move a reader somewhere they cannot see.
90
90
  */
91
- [data-ui='form'][data-part='summary']:focus-visible {
91
+ [data-ui-form][data-part-summary]:focus-visible {
92
92
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
93
93
  outline-offset: var(--slotted-focus-ring-offset, 2px);
94
94
  }
95
95
 
96
- [data-ui='form'][data-part='summary'] > [data-part='summary-title'] {
96
+ [data-ui-form][data-part-summary] > [data-part-summary-title] {
97
97
  font-family: var(
98
98
  --slotted-font-family-heading,
99
99
  var(--slotted-font-family-sans, ui-sans-serif, system-ui, sans-serif)
@@ -104,7 +104,7 @@
104
104
  margin: 0;
105
105
  }
106
106
 
107
- [data-ui='form'][data-part='summary'] > [data-part='summary-list'] {
107
+ [data-ui-form][data-part-summary] > [data-part-summary-list] {
108
108
  display: flex;
109
109
  flex-direction: column;
110
110
  gap: var(--slotted-space-2, 0.25rem);
@@ -130,31 +130,41 @@
130
130
  padding-inline-start: 0;
131
131
  }
132
132
 
133
- [data-ui='form'][data-part='summary']
134
- > [data-part='summary-list']
135
- > li
136
- > [data-part='summary-item'] {
133
+ [data-ui-form][data-part-summary] > [data-part-summary-list] > li > [data-part-summary-item] {
137
134
  color: inherit;
138
135
  text-decoration-line: underline;
139
136
  text-underline-offset: var(--slotted-space-1, 0.125rem);
140
137
  }
141
138
 
142
- [data-ui='form'][data-part='summary']
143
- > [data-part='summary-list']
139
+ [data-ui-form][data-part-summary]
140
+ > [data-part-summary-list]
144
141
  > li
145
- > [data-part='summary-item']:hover:not(:disabled) {
142
+ > [data-part-summary-item]:hover:not(:disabled) {
146
143
  text-decoration-thickness: var(--slotted-border-width-thick, 2px);
147
144
  }
148
145
 
149
- [data-ui='form'][data-part='summary']
150
- > [data-part='summary-list']
146
+ [data-ui-form][data-part-summary]
147
+ > [data-part-summary-list]
151
148
  > li
152
- > [data-part='summary-item']:focus-visible {
149
+ > [data-part-summary-item]:focus-visible {
153
150
  border-radius: var(--slotted-radius-xs, 2px);
154
151
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
155
152
  outline-offset: var(--slotted-focus-ring-offset, 2px);
156
153
  }
157
154
 
155
+ /**
156
+ * Two fields written one after the other directly inside the form stand
157
+ * apart by a step of the space scale. The root is a block and drew no
158
+ * distance at all, so a form written from the minimal example rendered its
159
+ * fields touching. A layout the page draws itself — a grid of two columns, a
160
+ * stack with its own gap — is not a field, and keeps its own spacing.
161
+ */
162
+ [data-ui-form][data-part-root]
163
+ > :is([data-ui-field], [data-ui-field-group])
164
+ + :is([data-ui-field], [data-ui-field-group]) {
165
+ margin-block-start: var(--slotted-form-field-gap, var(--slotted-space-6, 1rem));
166
+ }
167
+
158
168
  /* ── The action row ───────────────────────────────────────────────────
159
169
  *
160
170
  * Its own container, because the question it answers is how much room the
@@ -162,7 +172,7 @@
162
172
  * forbids a custom property in a container condition, which
163
173
  * `docs/token-foundation.md` rule 4 records.
164
174
  */
165
- [data-ui='form'][data-part='actions'] {
175
+ [data-ui-form][data-part-actions] {
166
176
  display: flex;
167
177
  flex-wrap: wrap;
168
178
  gap: var(--slotted-space-4, 0.5rem);
@@ -170,15 +180,15 @@
170
180
  margin-block-start: var(--slotted-space-8, 1.5rem);
171
181
  }
172
182
 
173
- [data-ui='form'][data-part='actions'][data-align='start'] {
183
+ [data-ui-form][data-part-actions][data-align='start'] {
174
184
  justify-content: flex-start;
175
185
  }
176
186
 
177
- [data-ui='form'][data-part='actions'][data-align='between'] {
187
+ [data-ui-form][data-part-actions][data-align='between'] {
178
188
  justify-content: space-between;
179
189
  }
180
190
 
181
- [data-ui='form'][data-part='actions'][data-align='stretch'] > * {
191
+ [data-ui-form][data-part-actions][data-align='stretch'] > * {
182
192
  flex: 1 1 0;
183
193
  }
184
194
 
@@ -194,11 +204,11 @@
194
204
  * action they came to take belongs first.
195
205
  */
196
206
  @container slotted-form (max-width: 360px) {
197
- [data-ui='form'][data-part='actions'] {
207
+ [data-ui-form][data-part-actions] {
198
208
  flex-direction: column-reverse;
199
209
  }
200
210
 
201
- [data-ui='form'][data-part='actions'] > * {
211
+ [data-ui-form][data-part-actions] > * {
202
212
  inline-size: 100%;
203
213
  }
204
214
  }
@@ -210,7 +220,7 @@
210
220
  * panel with nothing but its border.
211
221
  */
212
222
  @media (forced-colors: active) {
213
- [data-ui='form'][data-part='summary'] {
223
+ [data-ui-form][data-part-summary] {
214
224
  border-color: CanvasText;
215
225
  border-inline-start-color: Highlight;
216
226
  }
@@ -10,6 +10,7 @@
10
10
  "--slotted-font-family-sans",
11
11
  "--slotted-font-weight-semibold",
12
12
  "--slotted-form-color",
13
+ "--slotted-form-field-gap",
13
14
  "--slotted-form-summary-background",
14
15
  "--slotted-form-summary-border-color",
15
16
  "--slotted-form-summary-color",
@@ -21,7 +21,7 @@
21
21
  * browser, an iframe without `allow="fullscreen"`, a refused request. The
22
22
  * two ways are one component; only `data-mode` tells them apart.
23
23
  */
24
- [data-ui='fullscreen'][data-part='root'][data-fullscreen] {
24
+ [data-ui-fullscreen][data-part-root][data-fullscreen] {
25
25
  /* The region is the viewport in full screen, so the viewport is what the
26
26
  inset answers: the page step on a desktop, down to the small step on a
27
27
  phone, where twenty-four pixels a side is an eighth of the width. */
@@ -75,7 +75,7 @@
75
75
  * (the automatic minimum of a flex item), so content taller than the screen
76
76
  * still scrolls in the region.
77
77
  */
78
- [data-ui='fullscreen'][data-part='root'][data-fullscreen] {
78
+ [data-ui-fullscreen][data-part-root][data-fullscreen] {
79
79
  display: flex;
80
80
  flex-direction: column;
81
81
  }
@@ -95,8 +95,7 @@
95
95
  * full screen; a descendant selector on the part alone turned an open list
96
96
  * into a grid. A flex share only reaches a direct child in any case.
97
97
  */
98
- [data-ui='fullscreen'][data-part='root'][data-fullscreen]
99
- > [data-ui='fullscreen'][data-part='content'] {
98
+ [data-ui-fullscreen][data-part-root][data-fullscreen] > [data-ui-fullscreen][data-part-content] {
100
99
  display: grid;
101
100
  flex: 1 0 auto;
102
101
  grid-template-columns: minmax(0, 1fr);
@@ -115,9 +114,9 @@
115
114
  * menu opened, and the panel would drop to its own height under it. The
116
115
  * root is always appended last.
117
116
  */
118
- [data-ui='fullscreen'][data-part='root'][data-fullscreen]
117
+ [data-ui-fullscreen][data-part-root][data-fullscreen]
119
118
  > :first-child:is(:last-child, :has(+ [data-slotted-portal]:last-child)):not(
120
- [data-part='trigger'],
119
+ [data-part-trigger],
121
120
  img,
122
121
  video,
123
122
  canvas
@@ -131,7 +130,7 @@
131
130
  * gives a video in full screen. It may shrink below its natural height,
132
131
  * which a photograph taller than the screen has to.
133
132
  */
134
- [data-ui='fullscreen'][data-part='root'][data-fullscreen]
133
+ [data-ui-fullscreen][data-part-root][data-fullscreen]
135
134
  > :is(img, video, canvas):first-child:is(
136
135
  :last-child,
137
136
  :has(+ [data-slotted-portal]:last-child)
@@ -142,7 +141,7 @@
142
141
  object-fit: contain;
143
142
  }
144
143
 
145
- [data-ui='fullscreen'][data-part='root']::backdrop {
144
+ [data-ui-fullscreen][data-part-root]::backdrop {
146
145
  background-color: var(--slotted-fullscreen-surface, var(--slotted-surface, Canvas));
147
146
  }
148
147
 
@@ -161,7 +160,7 @@
161
160
  * page and never covered it. Nothing else here is `!important` — the ground,
162
161
  * the edge and the inset stay the consumer's to change in full screen.
163
162
  */
164
- [data-ui='fullscreen'][data-part='root'][data-mode='layout'] {
163
+ [data-ui-fullscreen][data-part-root][data-mode='layout'] {
165
164
  animation: slotted-fullscreen-enter var(--slotted-duration-short) var(--slotted-easing-enter);
166
165
  block-size: auto !important;
167
166
  inline-size: auto !important;
@@ -199,7 +198,7 @@
199
198
  * control scale's, the same box `toggle` and `button` stand in, so the
200
199
  * control sits in a toolbar beside them without a pixel of difference.
201
200
  */
202
- [data-ui='fullscreen'][data-part='trigger'] {
201
+ [data-ui-fullscreen][data-part-trigger] {
203
202
  --_height: var(--slotted-control-height-md, 34px);
204
203
  --_padding-inline: var(--slotted-control-padding-inline-md, 13px);
205
204
  --_font-size: var(--slotted-control-font-size-md, 13px);
@@ -247,7 +246,7 @@
247
246
 
248
247
  /* ── Size ─────────────────────────────────────────────────────────────── */
249
248
 
250
- [data-ui='fullscreen'][data-part='trigger'][data-size='sm'] {
249
+ [data-ui-fullscreen][data-part-trigger][data-size='sm'] {
251
250
  --_height: var(--slotted-control-height-sm, 30px);
252
251
  --_padding-inline: var(--slotted-control-padding-inline-sm, 10px);
253
252
  --_font-size: var(--slotted-control-font-size-sm, 12px);
@@ -255,7 +254,7 @@
255
254
  --_gap: var(--slotted-control-gap-sm, 6px);
256
255
  }
257
256
 
258
- [data-ui='fullscreen'][data-part='trigger'][data-size='lg'] {
257
+ [data-ui-fullscreen][data-part-trigger][data-size='lg'] {
259
258
  --_height: var(--slotted-control-height-lg, 38px);
260
259
  --_padding-inline: var(--slotted-control-padding-inline-lg, 16px);
261
260
  --_font-size: var(--slotted-control-font-size-lg, 14px);
@@ -271,7 +270,7 @@
271
270
  * consumer's icon placed in its stead, each at the control's icon step and
272
271
  * in the host's ink.
273
272
  */
274
- [data-ui='fullscreen'] [data-part='icon'] {
273
+ [data-ui-fullscreen] [data-part-icon] {
275
274
  --slotted-icon-size: var(--_icon-size);
276
275
 
277
276
  block-size: var(--_icon-size);
@@ -281,7 +280,7 @@
281
280
  inline-size: var(--_icon-size);
282
281
  }
283
282
 
284
- [data-ui='fullscreen'] [data-part='icon'] > * {
283
+ [data-ui-fullscreen] [data-part-icon] > * {
285
284
  block-size: 100%;
286
285
  display: block;
287
286
  inline-size: 100%;
@@ -292,7 +291,7 @@
292
291
  * container is shorter than a translated label; the string stays whole in
293
292
  * the DOM and in the accessible name.
294
293
  */
295
- [data-ui='fullscreen'] [data-part='label'] {
294
+ [data-ui-fullscreen] [data-part-label] {
296
295
  min-inline-size: 0;
297
296
  overflow: hidden;
298
297
  text-overflow: ellipsis;
@@ -304,12 +303,12 @@
304
303
  * reader. The label is visually hidden rather than removed, which keeps
305
304
  * the accessible name the label the state gives it.
306
305
  */
307
- [data-ui='fullscreen'][data-part='trigger'][data-icon-only] {
306
+ [data-ui-fullscreen][data-part-trigger][data-icon-only] {
308
307
  inline-size: var(--_height);
309
308
  padding-inline: 0;
310
309
  }
311
310
 
312
- [data-ui='fullscreen'][data-part='trigger'][data-icon-only] [data-part='label'] {
311
+ [data-ui-fullscreen][data-part-trigger][data-icon-only] [data-part-label] {
313
312
  block-size: 1px;
314
313
  clip-path: inset(50%);
315
314
  inline-size: 1px;
@@ -326,7 +325,7 @@
326
325
  * screen needs its own ground, or the edge is all that separates the words
327
326
  * from what is behind them.
328
327
  */
329
- [data-ui='fullscreen'][data-part='trigger'][data-variant='outline'] {
328
+ [data-ui-fullscreen][data-part-trigger][data-variant='outline'] {
330
329
  background-color: var(--slotted-control-surface, ButtonFace);
331
330
  border-color: var(
332
331
  --slotted-fullscreen-trigger-border-color,
@@ -337,14 +336,14 @@
337
336
 
338
337
  /* ── Hover and press, held back for disabled ─────────────────────────── */
339
338
 
340
- [data-ui='fullscreen'][data-part='trigger']:hover:not(:disabled):not([data-disabled]) {
339
+ [data-ui-fullscreen][data-part-trigger]:hover:not(:disabled):not([data-disabled]) {
341
340
  background-color: var(
342
341
  --slotted-fullscreen-trigger-hover-background,
343
342
  var(--slotted-tone-secondary-subtle-hover, ButtonFace)
344
343
  );
345
344
  }
346
345
 
347
- [data-ui='fullscreen'][data-part='trigger']:active:not(:disabled):not([data-disabled]) {
346
+ [data-ui-fullscreen][data-part-trigger]:active:not(:disabled):not([data-disabled]) {
348
347
  background-color: var(
349
348
  --slotted-fullscreen-trigger-active-background,
350
349
  var(--slotted-tone-secondary-subtle-active, ButtonFace)
@@ -354,22 +353,22 @@
354
353
 
355
354
  /* ── Focus ────────────────────────────────────────────────────────────── */
356
355
 
357
- [data-ui='fullscreen'][data-part='trigger']:focus-visible {
356
+ [data-ui-fullscreen][data-part-trigger]:focus-visible {
358
357
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
359
358
  outline-offset: var(--slotted-focus-ring-offset, 2px);
360
359
  }
361
360
 
362
361
  /* ── Disabled ─────────────────────────────────────────────────────────── */
363
362
 
364
- [data-ui='fullscreen'][data-part='trigger']:disabled,
365
- [data-ui='fullscreen'][data-part='trigger'][data-disabled] {
363
+ [data-ui-fullscreen][data-part-trigger]:disabled,
364
+ [data-ui-fullscreen][data-part-trigger][data-disabled] {
366
365
  background-color: transparent;
367
366
  color: var(--slotted-disabled-foreground, GrayText);
368
367
  cursor: not-allowed;
369
368
  }
370
369
 
371
- [data-ui='fullscreen'][data-part='trigger'][data-variant='outline']:disabled,
372
- [data-ui='fullscreen'][data-part='trigger'][data-variant='outline'][data-disabled] {
370
+ [data-ui-fullscreen][data-part-trigger][data-variant='outline']:disabled,
371
+ [data-ui-fullscreen][data-part-trigger][data-variant='outline'][data-disabled] {
373
372
  border-color: var(--slotted-disabled-border, GrayText);
374
373
  box-shadow: none;
375
374
  }
package/src/grid/grid.css CHANGED
@@ -12,7 +12,7 @@
12
12
  * `auto-fit` is used here so a single child fills the row rather than sitting
13
13
  * alone at its minimum.
14
14
  */
15
- [data-ui='grid'] {
15
+ [data-ui-grid] {
16
16
  --_gap: var(--slotted-space-6, 1rem);
17
17
  --_min-item: var(--slotted-grid-min-item-width-md, 16rem);
18
18
 
@@ -37,7 +37,7 @@
37
37
  * `auto-fill` is used here so two children in a three-column grid occupy two
38
38
  * thirds of it rather than stretching across the whole row.
39
39
  */
40
- [data-ui='grid'][data-columns] {
40
+ [data-ui-grid][data-columns] {
41
41
  grid-template-columns: repeat(
42
42
  auto-fill,
43
43
  minmax(
@@ -55,55 +55,55 @@
55
55
  }
56
56
 
57
57
  /* Separation is a step on the scale, never a length the consumer states. */
58
- [data-ui='grid'][data-gap='0'] {
58
+ [data-ui-grid][data-gap='0'] {
59
59
  --_gap: 0;
60
60
  }
61
61
 
62
- [data-ui='grid'][data-gap='1'] {
62
+ [data-ui-grid][data-gap='1'] {
63
63
  --_gap: var(--slotted-space-1, 0.125rem);
64
64
  }
65
65
 
66
- [data-ui='grid'][data-gap='2'] {
66
+ [data-ui-grid][data-gap='2'] {
67
67
  --_gap: var(--slotted-space-2, 0.25rem);
68
68
  }
69
69
 
70
- [data-ui='grid'][data-gap='3'] {
70
+ [data-ui-grid][data-gap='3'] {
71
71
  --_gap: var(--slotted-space-3, 0.375rem);
72
72
  }
73
73
 
74
- [data-ui='grid'][data-gap='4'] {
74
+ [data-ui-grid][data-gap='4'] {
75
75
  --_gap: var(--slotted-space-4, 0.5rem);
76
76
  }
77
77
 
78
- [data-ui='grid'][data-gap='5'] {
78
+ [data-ui-grid][data-gap='5'] {
79
79
  --_gap: var(--slotted-space-5, 0.75rem);
80
80
  }
81
81
 
82
- [data-ui='grid'][data-gap='6'] {
82
+ [data-ui-grid][data-gap='6'] {
83
83
  --_gap: var(--slotted-space-6, 1rem);
84
84
  }
85
85
 
86
- [data-ui='grid'][data-gap='7'] {
86
+ [data-ui-grid][data-gap='7'] {
87
87
  --_gap: var(--slotted-space-7, 1.25rem);
88
88
  }
89
89
 
90
- [data-ui='grid'][data-gap='8'] {
90
+ [data-ui-grid][data-gap='8'] {
91
91
  --_gap: var(--slotted-space-8, 1.5rem);
92
92
  }
93
93
 
94
- [data-ui='grid'][data-gap='9'] {
94
+ [data-ui-grid][data-gap='9'] {
95
95
  --_gap: var(--slotted-space-9, 2rem);
96
96
  }
97
97
 
98
- [data-ui='grid'][data-gap='10'] {
98
+ [data-ui-grid][data-gap='10'] {
99
99
  --_gap: var(--slotted-space-10, 2.5rem);
100
100
  }
101
101
 
102
- [data-ui='grid'][data-gap='11'] {
102
+ [data-ui-grid][data-gap='11'] {
103
103
  --_gap: var(--slotted-space-11, 3rem);
104
104
  }
105
105
 
106
- [data-ui='grid'][data-gap='12'] {
106
+ [data-ui-grid][data-gap='12'] {
107
107
  --_gap: var(--slotted-space-12, 4rem);
108
108
  }
109
109
 
@@ -113,23 +113,23 @@
113
113
  * these are cell minima rather than reading measure, which `container` owns.
114
114
  * A theme retunes any of them through its token.
115
115
  */
116
- [data-ui='grid'][data-min-item-width='xs'] {
116
+ [data-ui-grid][data-min-item-width='xs'] {
117
117
  --_min-item: var(--slotted-grid-min-item-width-xs, 8rem);
118
118
  }
119
119
 
120
- [data-ui='grid'][data-min-item-width='sm'] {
120
+ [data-ui-grid][data-min-item-width='sm'] {
121
121
  --_min-item: var(--slotted-grid-min-item-width-sm, 12rem);
122
122
  }
123
123
 
124
- [data-ui='grid'][data-min-item-width='md'] {
124
+ [data-ui-grid][data-min-item-width='md'] {
125
125
  --_min-item: var(--slotted-grid-min-item-width-md, 16rem);
126
126
  }
127
127
 
128
- [data-ui='grid'][data-min-item-width='lg'] {
128
+ [data-ui-grid][data-min-item-width='lg'] {
129
129
  --_min-item: var(--slotted-grid-min-item-width-lg, 20rem);
130
130
  }
131
131
 
132
- [data-ui='grid'][data-min-item-width='xl'] {
132
+ [data-ui-grid][data-min-item-width='xl'] {
133
133
  --_min-item: var(--slotted-grid-min-item-width-xl, 24rem);
134
134
  }
135
135
 
@@ -139,35 +139,35 @@
139
139
  * distributes tracks: the tracks already fill the row, so there is nothing
140
140
  * between them to distribute.
141
141
  */
142
- [data-ui='grid'][data-align='start'] {
142
+ [data-ui-grid][data-align='start'] {
143
143
  align-items: start;
144
144
  }
145
145
 
146
- [data-ui='grid'][data-align='center'] {
146
+ [data-ui-grid][data-align='center'] {
147
147
  align-items: center;
148
148
  }
149
149
 
150
- [data-ui='grid'][data-align='end'] {
150
+ [data-ui-grid][data-align='end'] {
151
151
  align-items: end;
152
152
  }
153
153
 
154
- [data-ui='grid'][data-align='stretch'] {
154
+ [data-ui-grid][data-align='stretch'] {
155
155
  align-items: stretch;
156
156
  }
157
157
 
158
- [data-ui='grid'][data-justify='start'] {
158
+ [data-ui-grid][data-justify='start'] {
159
159
  justify-items: start;
160
160
  }
161
161
 
162
- [data-ui='grid'][data-justify='center'] {
162
+ [data-ui-grid][data-justify='center'] {
163
163
  justify-items: center;
164
164
  }
165
165
 
166
- [data-ui='grid'][data-justify='end'] {
166
+ [data-ui-grid][data-justify='end'] {
167
167
  justify-items: end;
168
168
  }
169
169
 
170
- [data-ui='grid'][data-justify='stretch'] {
170
+ [data-ui-grid][data-justify='stretch'] {
171
171
  justify-items: stretch;
172
172
  }
173
173
  }
@@ -46,7 +46,7 @@
46
46
  * highlighted row — that caps the share: 0.075 leaves 7.078:1, 0.08 leaves
47
47
  * 7.001:1, and 0.12 leaves 6.540:1.
48
48
  */
49
- [data-ui='highlight'] [data-part='match'] {
49
+ [data-ui-highlight] [data-part-match] {
50
50
  background-color: var(
51
51
  --slotted-highlight-background,
52
52
  color-mix(
@@ -87,7 +87,7 @@
87
87
  * sits inside the fill and reads as nothing, which the capture showed. An
88
88
  * outline is not used: R3 reserves it for the focus ring.
89
89
  */
90
- [data-ui='highlight'] [data-part='match'][data-current] {
90
+ [data-ui-highlight] [data-part-match][data-current] {
91
91
  background-color: var(--slotted-highlight-current-background, var(--slotted-tone-accent-solid));
92
92
  color: var(--slotted-highlight-current-color, var(--slotted-tone-accent-on-solid));
93
93
  text-decoration-line: none;
@@ -104,7 +104,7 @@
104
104
  * already carries `data-disabled`, and the family reads it from there rather
105
105
  * than asking the host to say it twice.
106
106
  */
107
- [data-ui='highlight']:is([data-disabled], [data-disabled] *) [data-part='match'] {
107
+ [data-ui-highlight]:is([data-disabled], [data-disabled] *) [data-part-match] {
108
108
  background-color: var(--slotted-highlight-disabled-background, transparent);
109
109
  color: inherit;
110
110
  /* Restated for the current match, which gave the rule up for its fill. */
@@ -120,14 +120,14 @@
120
120
  * active find match in.
121
121
  */
122
122
  @media (forced-colors: active) {
123
- [data-ui='highlight'] [data-part='match'],
124
- [data-ui='highlight']:is([data-disabled], [data-disabled] *) [data-part='match'] {
123
+ [data-ui-highlight] [data-part-match],
124
+ [data-ui-highlight]:is([data-disabled], [data-disabled] *) [data-part-match] {
125
125
  background-color: Mark;
126
126
  color: MarkText;
127
127
  forced-color-adjust: none;
128
128
  }
129
129
 
130
- [data-ui='highlight'] [data-part='match'][data-current] {
130
+ [data-ui-highlight] [data-part-match][data-current] {
131
131
  background-color: Highlight;
132
132
  color: HighlightText;
133
133
  }
@@ -4,7 +4,7 @@
4
4
  * preview of where it goes, or of who it names.
5
5
  *
6
6
  * root ─ the trigger ─ <a> ─ data-open
7
- * └─ [data-ui='popover'] ─ unchanged, autoFocus off ─┐
7
+ * └─ [data-ui-popover] ─ unchanged, autoFocus off ─┐
8
8
  * │ header / body / footer — the consumer's │
9
9
  * │ arrow │
10
10
  * └───────────────────────────────────────────────┘
@@ -20,7 +20,7 @@
20
20
  * the family renders its own anchor, it owes the reader a link that reads as
21
21
  * one and says, while the card shows, which word the card is about.
22
22
  */
23
- [data-ui='hover-card'] {
23
+ [data-ui-hover-card] {
24
24
  --_text: var(--slotted-hover-card-color, var(--slotted-tone-accent-text, LinkText));
25
25
  /* The underline at rest is the text at less than half strength, as
26
26
  `link` draws it: present enough to say "link", quiet enough that a
@@ -59,7 +59,7 @@
59
59
 
60
60
  /* Hover fills the underline. The card itself waits for `openDelay`, so this
61
61
  is the only thing that answers the pointer at once. */
62
- [data-ui='hover-card']:not([data-disabled]):hover {
62
+ [data-ui-hover-card]:not([data-disabled]):hover {
63
63
  text-decoration-color: currentColor;
64
64
  }
65
65
 
@@ -69,13 +69,13 @@
69
69
  * grows by one step of space without moving the line it sits on. A padding
70
70
  * would have reflowed the paragraph on every open.
71
71
  */
72
- [data-ui='hover-card'][data-open] {
72
+ [data-ui-hover-card][data-open] {
73
73
  background-color: var(--_tint);
74
74
  box-shadow: 0 0 0 var(--_halo) var(--_tint);
75
75
  text-decoration-color: currentColor;
76
76
  }
77
77
 
78
- [data-ui='hover-card']:focus-visible {
78
+ [data-ui-hover-card]:focus-visible {
79
79
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
80
80
  outline-offset: var(--slotted-focus-ring-offset, 2px);
81
81
  }
@@ -86,7 +86,7 @@
86
86
  * colour instead, which is the one thing forced colours keep.
87
87
  */
88
88
  @media (forced-colors: active) {
89
- [data-ui='hover-card'][data-open] {
89
+ [data-ui-hover-card][data-open] {
90
90
  text-decoration-thickness: var(--slotted-border-width-thick, 2px);
91
91
  }
92
92
  }