@slotted/styles 0.1.0-beta.1 → 0.1.0-beta.11

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 (180) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +35 -42
  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 +149 -68
  17. package/src/button/button.tokens.json +10 -0
  18. package/src/button-group/button-group.css +79 -74
  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 +103 -90
  36. package/src/command-palette/command-palette.tokens.json +1 -0
  37. package/src/container/container.css +24 -24
  38. package/src/context-menu/context-menu.css +8 -8
  39. package/src/currency-field/currency-field.css +210 -88
  40. package/src/currency-field/currency-field.tokens.json +13 -0
  41. package/src/dashboard-grid/dashboard-grid.css +148 -116
  42. package/src/data-grid/data-grid.css +535 -470
  43. package/src/data-grid/data-grid.tokens.json +4 -0
  44. package/src/data-list/data-list.css +81 -70
  45. package/src/data-list/data-list.tokens.json +2 -1
  46. package/src/date-field/date-field.css +55 -52
  47. package/src/date-field/date-field.tokens.json +1 -0
  48. package/src/date-picker/date-picker.css +40 -42
  49. package/src/date-range-picker/date-range-picker.css +114 -118
  50. package/src/datetime-field/datetime-field.css +78 -80
  51. package/src/datetime-field/datetime-field.tokens.json +1 -0
  52. package/src/datetime-picker/datetime-picker.css +61 -63
  53. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  54. package/src/description-list/description-list.css +61 -64
  55. package/src/detail-panel/detail-panel.css +86 -71
  56. package/src/detail-panel/detail-panel.tokens.json +2 -0
  57. package/src/dialog/dialog.css +372 -153
  58. package/src/dialog/dialog.tokens.json +6 -0
  59. package/src/divider/divider.css +18 -18
  60. package/src/drawer/drawer.css +205 -210
  61. package/src/drawer/drawer.tokens.json +1 -0
  62. package/src/entity-picker/entity-picker.css +238 -241
  63. package/src/entity-picker/entity-picker.tokens.json +1 -0
  64. package/src/event-calendar/event-calendar.css +343 -385
  65. package/src/field/field.css +74 -78
  66. package/src/field-group/field-group.css +22 -25
  67. package/src/filter-bar/filter-bar.css +193 -209
  68. package/src/form/form.css +34 -24
  69. package/src/form/form.tokens.json +1 -0
  70. package/src/fullscreen/fullscreen.css +24 -25
  71. package/src/grid/grid.css +28 -28
  72. package/src/highlight/highlight.css +6 -6
  73. package/src/hover-card/hover-card.css +6 -6
  74. package/src/icon/icon.css +19 -15
  75. package/src/icon/icon.tokens.json +1 -0
  76. package/src/image/image.css +39 -39
  77. package/src/import-export-center/import-export-center.css +135 -156
  78. package/src/inline/inline.css +27 -27
  79. package/src/inline-message/inline-message.css +52 -28
  80. package/src/inline-message/inline-message.tokens.json +4 -0
  81. package/src/kbd/kbd.css +30 -26
  82. package/src/link/link.css +15 -15
  83. package/src/list/list.css +44 -17
  84. package/src/list/list.tokens.json +4 -0
  85. package/src/list-item/list-item.css +80 -66
  86. package/src/list-item/list-item.tokens.json +7 -0
  87. package/src/listbox/listbox.css +56 -59
  88. package/src/loading-overlay/loading-overlay.css +75 -92
  89. package/src/markdown/markdown.css +17 -17
  90. package/src/menu/menu.css +83 -63
  91. package/src/menubar/menubar.css +13 -13
  92. package/src/message/message.css +182 -202
  93. package/src/message/message.tokens.json +5 -0
  94. package/src/message-scroller/message-scroller.css +41 -42
  95. package/src/multi-select/multi-select.css +152 -145
  96. package/src/multi-select/multi-select.tokens.json +1 -0
  97. package/src/navigation-menu/navigation-menu.css +167 -188
  98. package/src/notification-center/notification-center.css +140 -148
  99. package/src/notification-center/notification-center.tokens.json +3 -0
  100. package/src/number-field/number-field.css +84 -83
  101. package/src/number-field/number-field.tokens.json +1 -0
  102. package/src/otp-input/otp-input.css +67 -57
  103. package/src/otp-input/otp-input.tokens.json +1 -0
  104. package/src/page/page.css +39 -23
  105. package/src/page/page.tokens.json +1 -0
  106. package/src/page-header/page-header.css +323 -283
  107. package/src/page-header/page-header.tokens.json +5 -0
  108. package/src/pagination/pagination.css +68 -72
  109. package/src/popover/popover.css +40 -49
  110. package/src/progress-indicator/progress-indicator.css +177 -120
  111. package/src/progress-indicator/progress-indicator.tokens.json +1 -1
  112. package/src/prompt-composer/prompt-composer.css +221 -102
  113. package/src/prompt-composer/prompt-composer.tokens.json +15 -0
  114. package/src/prose/prose.css +71 -75
  115. package/src/radio-group/radio-group.css +98 -103
  116. package/src/rating/rating.css +136 -132
  117. package/src/rating/rating.tokens.json +1 -0
  118. package/src/result-state/result-state.css +74 -77
  119. package/src/runtime-properties.mjs +2 -0
  120. package/src/saved-views/saved-views.css +41 -47
  121. package/src/scroll-area/scroll-area.css +39 -32
  122. package/src/section/section.css +161 -41
  123. package/src/section/section.tokens.json +7 -2
  124. package/src/segmented-control/segmented-control.css +254 -97
  125. package/src/segmented-control/segmented-control.tokens.json +15 -11
  126. package/src/select/select.css +118 -117
  127. package/src/select/select.tokens.json +1 -0
  128. package/src/side-navigation/side-navigation.css +179 -182
  129. package/src/side-navigation/side-navigation.tokens.json +1 -0
  130. package/src/skeleton/skeleton.css +47 -48
  131. package/src/slider/slider.css +86 -88
  132. package/src/sparkline/sparkline.css +62 -40
  133. package/src/sparkline/sparkline.tokens.json +2 -0
  134. package/src/spinner/spinner.css +83 -180
  135. package/src/spinner/spinner.tokens.json +0 -1
  136. package/src/split-button/split-button.css +30 -31
  137. package/src/split-button/split-button.tokens.json +1 -0
  138. package/src/splitter/splitter.css +35 -35
  139. package/src/stack/stack.css +24 -24
  140. package/src/stat-card/stat-card.css +341 -224
  141. package/src/stat-card/stat-card.tokens.json +3 -0
  142. package/src/status-indicator/status-indicator.css +28 -28
  143. package/src/stepper/stepper.css +58 -62
  144. package/src/switch/switch.css +86 -92
  145. package/src/table/table.css +310 -165
  146. package/src/table/table.tokens.json +6 -0
  147. package/src/table-of-contents/table-of-contents.css +51 -54
  148. package/src/tabs/tabs.css +337 -302
  149. package/src/tabs/tabs.tokens.json +8 -5
  150. package/src/tag/tag.css +79 -71
  151. package/src/tag/tag.tokens.json +9 -0
  152. package/src/tags-input/tags-input.css +145 -82
  153. package/src/tags-input/tags-input.tokens.json +7 -1
  154. package/src/text-field/text-field.css +132 -136
  155. package/src/text-field/text-field.tokens.json +1 -0
  156. package/src/textarea/textarea.css +31 -28
  157. package/src/textarea/textarea.tokens.json +1 -0
  158. package/src/time-field/time-field.css +72 -69
  159. package/src/time-field/time-field.tokens.json +1 -0
  160. package/src/time-picker/time-picker.css +56 -58
  161. package/src/time-range-picker/time-range-picker.css +126 -133
  162. package/src/timeline/timeline.css +254 -266
  163. package/src/timeline/timeline.tokens.json +5 -0
  164. package/src/toast/toast.css +108 -90
  165. package/src/toast/toast.tokens.json +6 -0
  166. package/src/toggle/toggle.css +62 -25
  167. package/src/toggle/toggle.tokens.json +8 -0
  168. package/src/toggle-group/toggle-group.css +106 -60
  169. package/src/toggle-group/toggle-group.tokens.json +10 -0
  170. package/src/toolbar/toolbar.css +30 -35
  171. package/src/tooltip/tooltip.css +26 -26
  172. package/src/top-navigation/top-navigation.css +243 -259
  173. package/src/tour/tour.css +51 -60
  174. package/src/transfer/transfer.css +160 -164
  175. package/src/tree/tree.css +103 -111
  176. package/src/typography/typography.css +40 -36
  177. package/src/typography/typography.tokens.json +1 -0
  178. package/src/upload/upload.css +224 -224
  179. package/src/visually-hidden/visually-hidden.css +1 -1
  180. package/src/wizard/wizard.css +185 -197
@@ -35,7 +35,6 @@
35
35
  "--slotted-progress-indicator-wave-phase",
36
36
  "--slotted-radius-full",
37
37
  "--slotted-radius-none",
38
- "--slotted-space-1",
39
38
  "--slotted-space-2",
40
39
  "--slotted-space-3",
41
40
  "--slotted-space-4",
@@ -44,6 +43,7 @@
44
43
  "--slotted-text-muted",
45
44
  "--slotted-tone-accent-text",
46
45
  "--slotted-tone-danger-text",
46
+ "--slotted-tone-info-text",
47
47
  "--slotted-tone-success-text",
48
48
  "--slotted-tone-warning-text",
49
49
  "--slotted-z-index-sticky"
@@ -14,7 +14,7 @@
14
14
  * are the composer inside a form — a comment, a reply — and keep the
15
15
  * geometry of a one-line control.
16
16
  */
17
- [data-ui='prompt-composer'][data-part='root'] {
17
+ [data-ui-prompt-composer][data-part-root] {
18
18
  --_font-size: var(--slotted-control-font-size-md, 13px);
19
19
  --_height: var(--slotted-control-height-md, 34px);
20
20
  --_icon-size: var(--slotted-control-icon-size-md, 16px);
@@ -78,18 +78,17 @@
78
78
  transition:
79
79
  background-color var(--slotted-duration-medium) var(--slotted-easing-standard),
80
80
  border-color var(--slotted-duration-medium) var(--slotted-easing-standard),
81
- box-shadow var(--slotted-duration-medium) var(--slotted-easing-standard),
82
- outline-color var(--slotted-duration-medium) var(--slotted-easing-standard);
81
+ box-shadow var(--slotted-duration-medium) var(--slotted-easing-standard);
83
82
  }
84
83
 
85
- [data-ui='prompt-composer'][data-part='root'][data-size='sm'] {
84
+ [data-ui-prompt-composer][data-part-root][data-size='sm'] {
86
85
  --_font-size: var(--slotted-control-font-size-sm, 12px);
87
86
  --_height: var(--slotted-control-height-sm, 30px);
88
87
  --_icon-size: var(--slotted-control-icon-size-sm, 14px);
89
88
  --_inner-size: var(--slotted-control-inner-size-sm, 22px);
90
89
  }
91
90
 
92
- [data-ui='prompt-composer'][data-part='root'][data-size='lg'] {
91
+ [data-ui-prompt-composer][data-part-root][data-size='lg'] {
93
92
  --_font-size: var(--slotted-control-font-size-lg, 14px);
94
93
  --_height: var(--slotted-control-height-lg, 38px);
95
94
  --_icon-size: var(--slotted-control-icon-size-lg, 18px);
@@ -110,7 +109,7 @@
110
109
  * card's corner, and a card's corner around a round send draws two curves
111
110
  * that do not agree.
112
111
  */
113
- [data-ui='prompt-composer'][data-part='root'][data-variant='raised'] {
112
+ [data-ui-prompt-composer][data-part-root][data-variant='raised'] {
114
113
  --_button: calc(var(--_inner-size) + var(--slotted-space-2, 0.25rem));
115
114
  --_inset: var(--slotted-space-4, 0.5rem);
116
115
  --_padding-block: calc(var(--_inset) + var(--slotted-space-2, 0.25rem));
@@ -123,7 +122,7 @@
123
122
  );
124
123
  }
125
124
 
126
- [data-ui='prompt-composer'][data-part='root'][data-variant='subtle'] {
125
+ [data-ui-prompt-composer][data-part-root][data-variant='subtle'] {
127
126
  background-color: var(
128
127
  --slotted-prompt-composer-subtle-background,
129
128
  var(--slotted-surface-sunken, Canvas)
@@ -141,7 +140,7 @@
141
140
  * script measures a line. The band below stays where the reader's thumb
142
141
  * expects it.
143
142
  */
144
- [data-ui='prompt-composer'] > [data-part='input'] {
143
+ [data-ui-prompt-composer] > [data-part-input] {
145
144
  appearance: none;
146
145
  background: transparent;
147
146
  border: 0;
@@ -171,11 +170,11 @@
171
170
  unicode-bidi: plaintext;
172
171
  }
173
172
 
174
- [data-ui='prompt-composer'] > [data-part='input']::placeholder {
173
+ [data-ui-prompt-composer] > [data-part-input]::placeholder {
175
174
  color: var(--slotted-prompt-composer-placeholder-color, var(--slotted-text-muted, GrayText));
176
175
  }
177
176
 
178
- [data-ui='prompt-composer'] > [data-part='input']::selection {
177
+ [data-ui-prompt-composer] > [data-part-input]::selection {
179
178
  background-color: var(
180
179
  --slotted-prompt-composer-selection-background,
181
180
  var(--slotted-tone-accent-surface, Highlight)
@@ -183,14 +182,13 @@
183
182
  }
184
183
 
185
184
  /* A band above the value gives it back the block padding it already has. */
186
- [data-ui='prompt-composer'] > [data-part='header'] + [data-part='input'] {
185
+ [data-ui-prompt-composer] > [data-part-header] + [data-part-input] {
187
186
  padding-block-start: var(--_inset);
188
187
  }
189
188
 
190
189
  /* The band below sits on the last line: the value keeps its own air above
191
190
  the text and hands the air below it to the band's inset. */
192
- [data-ui='prompt-composer'][data-variant='raised']
193
- > [data-part='input']:has(+ [data-part='footer']) {
191
+ [data-ui-prompt-composer][data-variant='raised'] > [data-part-input]:has(+ [data-part-footer]) {
194
192
  padding-block-end: var(--slotted-space-2, 0.25rem);
195
193
  }
196
194
 
@@ -201,7 +199,7 @@
201
199
  * does not: the send stays on the line, and a narrow composer gives up the
202
200
  * space between the tools first.
203
201
  */
204
- [data-ui='prompt-composer'] > :is([data-part='header'], [data-part='footer']) {
202
+ [data-ui-prompt-composer] > :is([data-part-header], [data-part-footer]) {
205
203
  --slotted-icon-size: var(--_icon-size);
206
204
  --slotted-control-inner-size: var(--_button);
207
205
 
@@ -212,19 +210,19 @@
212
210
  padding: var(--_inset);
213
211
  }
214
212
 
215
- [data-ui='prompt-composer'] > [data-part='header'] {
213
+ [data-ui-prompt-composer] > [data-part-header] {
216
214
  flex-wrap: wrap;
217
215
  padding-block-end: 0;
218
216
  }
219
217
 
220
218
  /* A strip of attachments is the width the band has and scrolls inside it;
221
219
  a flex item otherwise keeps its content's width and crosses the frame. */
222
- [data-ui='prompt-composer'] > [data-part='header'] > * {
220
+ [data-ui-prompt-composer] > [data-part-header] > * {
223
221
  max-inline-size: 100%;
224
222
  min-inline-size: 0;
225
223
  }
226
224
 
227
- [data-ui='prompt-composer'] > [data-part='footer'] {
225
+ [data-ui-prompt-composer] > [data-part-footer] {
228
226
  flex-wrap: nowrap;
229
227
  padding-block-start: 0;
230
228
  }
@@ -237,9 +235,9 @@
237
235
  * padded when named by their own words, the rule `text-field` set; round
238
236
  * in the chat composer, a pill when they carry words.
239
237
  */
240
- [data-ui='prompt-composer']
241
- > :is([data-part='header'], [data-part='footer'])
242
- > :is([data-part='action'], [data-part='attach']) {
238
+ [data-ui-prompt-composer]
239
+ > :is([data-part-header], [data-part-footer])
240
+ > :is([data-part-action], [data-part-attach]) {
243
241
  align-items: center;
244
242
  appearance: none;
245
243
  background-color: transparent;
@@ -266,9 +264,9 @@
266
264
  -webkit-tap-highlight-color: transparent;
267
265
  }
268
266
 
269
- [data-ui='prompt-composer']
270
- > :is([data-part='header'], [data-part='footer'])
271
- > [data-part='action']:not([aria-label], [aria-labelledby]) {
267
+ [data-ui-prompt-composer]
268
+ > :is([data-part-header], [data-part-footer])
269
+ > [data-part-action]:not([aria-label], [aria-labelledby]) {
272
270
  color: var(--slotted-prompt-composer-action-label-color, var(--slotted-text, CanvasText));
273
271
  font-weight: var(--slotted-font-weight-medium, 500);
274
272
  padding-inline: var(--slotted-space-3, 0.375rem);
@@ -286,9 +284,9 @@
286
284
  * translate puts its centre at `(1cap + 1ex) / 4` above the baseline — the
287
285
  * midpoint of the capitals' and the lowercase letters' own centres.
288
286
  */
289
- [data-ui='prompt-composer']
290
- > :is([data-part='header'], [data-part='footer'])
291
- > [data-part='action']:not([aria-label], [aria-labelledby]) {
287
+ [data-ui-prompt-composer]
288
+ > :is([data-part-header], [data-part-footer])
289
+ > [data-part-action]:not([aria-label], [aria-labelledby]) {
292
290
  align-content: center;
293
291
  align-items: baseline;
294
292
  display: inline-grid;
@@ -296,64 +294,64 @@
296
294
  justify-content: center;
297
295
  }
298
296
 
299
- [data-ui='prompt-composer']
300
- > :is([data-part='header'], [data-part='footer'])
301
- > [data-part='action']:not([aria-label], [aria-labelledby])
302
- > [data-ui='icon'] {
297
+ [data-ui-prompt-composer]
298
+ > :is([data-part-header], [data-part-footer])
299
+ > [data-part-action]:not([aria-label], [aria-labelledby])
300
+ > [data-ui-icon] {
303
301
  margin-block-start: calc((1cap + 1ex) / 4 - var(--_icon-size) / 2);
304
302
  translate: 0 calc(var(--_icon-size) / 2 - (1cap + 1ex) / 4);
305
303
  }
306
304
 
307
305
  /* A pill carries its words a step further from its round ends. */
308
- [data-ui='prompt-composer'][data-variant='raised']
309
- > :is([data-part='header'], [data-part='footer'])
310
- > [data-part='action']:not([aria-label], [aria-labelledby]) {
306
+ [data-ui-prompt-composer][data-variant='raised']
307
+ > :is([data-part-header], [data-part-footer])
308
+ > [data-part-action]:not([aria-label], [aria-labelledby]) {
311
309
  padding-inline: var(--slotted-space-4, 0.5rem);
312
310
  }
313
311
 
314
312
  /* The target, recovered outside the paint: 24 pixels on a mouse, 44 on a
315
313
  finger, and never across the edge two buttons share. */
316
- [data-ui='prompt-composer']
317
- > :is([data-part='header'], [data-part='footer'])
318
- > :is([data-part='action'], [data-part='attach'], [data-part='submit'])::after {
314
+ [data-ui-prompt-composer]
315
+ > :is([data-part-header], [data-part-footer])
316
+ > :is([data-part-action], [data-part-attach], [data-part-submit])::after {
319
317
  content: '';
320
318
  inset: min(0px, calc((100% - var(--slotted-target-min, 24px)) / 2));
321
319
  position: absolute;
322
320
  }
323
321
 
324
322
  @media (pointer: coarse) {
325
- [data-ui='prompt-composer']
326
- > :is([data-part='header'], [data-part='footer'])
327
- > :is([data-part='action'], [data-part='attach'], [data-part='submit'])::after {
323
+ [data-ui-prompt-composer]
324
+ > :is([data-part-header], [data-part-footer])
325
+ > :is([data-part-action], [data-part-attach], [data-part-submit])::after {
328
326
  inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
329
327
  }
330
328
 
331
- [data-ui='prompt-composer']
332
- > :is([data-part='header'], [data-part='footer'])
333
- > :is([data-part='action'], [data-part='attach']):has(+ *)::after {
329
+ [data-ui-prompt-composer]
330
+ > :is([data-part-header], [data-part-footer])
331
+ > :is([data-part-action], [data-part-attach]):has(+ *)::after {
334
332
  inset-inline-end: 0;
335
333
  }
336
334
 
337
- [data-ui='prompt-composer']
338
- > :is([data-part='header'], [data-part='footer'])
335
+ [data-ui-prompt-composer]
336
+ > :is([data-part-header], [data-part-footer])
339
337
  > *
340
- + :is([data-part='action'], [data-part='attach'], [data-part='submit'])::after {
338
+ + :is([data-part-action], [data-part-attach], [data-part-submit])::after {
341
339
  inset-inline-start: 0;
342
340
  }
343
341
  }
344
342
 
345
- [data-ui='prompt-composer']
346
- > :is([data-part='header'], [data-part='footer'])
347
- > :is([data-part='action'], [data-part='attach']):hover:not(:disabled, [aria-expanded='true']) {
343
+ [data-ui-prompt-composer]
344
+ > :is([data-part-header], [data-part-footer])
345
+ > :is([data-part-action], [data-part-attach]):hover:not(:disabled, [aria-expanded='true']) {
348
346
  background-color: var(
349
347
  --slotted-prompt-composer-action-hover-background,
350
348
  var(--slotted-tone-secondary-subtle-hover)
351
349
  );
352
350
  }
353
351
 
354
- [data-ui='prompt-composer']
355
- > :is([data-part='header'], [data-part='footer'])
356
- > :is([data-part='action'], [data-part='attach']):is(:active, [aria-expanded='true']):not(
352
+ [data-ui-prompt-composer]
353
+ > :is([data-part-header], [data-part-footer])
354
+ > :is([data-part-action], [data-part-attach]):is(:active, [aria-expanded='true']):not(
357
355
  :disabled
358
356
  ) {
359
357
  background-color: var(
@@ -362,9 +360,9 @@
362
360
  );
363
361
  }
364
362
 
365
- [data-ui='prompt-composer']
366
- > :is([data-part='header'], [data-part='footer'])
367
- > :is([data-part='action'], [data-part='attach']):disabled {
363
+ [data-ui-prompt-composer]
364
+ > :is([data-part-header], [data-part-footer])
365
+ > :is([data-part-action], [data-part-attach]):disabled {
368
366
  color: var(--slotted-disabled-foreground);
369
367
  cursor: not-allowed;
370
368
  }
@@ -377,7 +375,7 @@
377
375
  * The mark and the ring share one grid cell, so the stop square stands in
378
376
  * the middle of the ring that says an answer is still arriving.
379
377
  */
380
- [data-ui='prompt-composer'] > [data-part='footer'] > [data-part='submit'] {
378
+ [data-ui-prompt-composer] > [data-part-footer] > [data-part-submit] {
381
379
  /* Alone, the ring is the glyph's size and stands where the arrow stood;
382
380
  around the stop square it grows to the disc (below). */
383
381
  --slotted-spinner-size: var(--_icon-size);
@@ -412,15 +410,15 @@
412
410
  -webkit-tap-highlight-color: transparent;
413
411
  }
414
412
 
415
- [data-ui='prompt-composer'] > [data-part='footer'] > [data-part='submit'] > * {
413
+ [data-ui-prompt-composer] > [data-part-footer] > [data-part-submit] > * {
416
414
  grid-area: 1 / 1;
417
415
  }
418
416
 
419
417
  /* Named by its own word — Comentar, Publicar — the send is a padded pill at
420
418
  the same height; named by aria-label it is the round mark. */
421
- [data-ui='prompt-composer']
422
- > [data-part='footer']
423
- > [data-part='submit']:not([aria-label], [aria-labelledby]) {
419
+ [data-ui-prompt-composer]
420
+ > [data-part-footer]
421
+ > [data-part-submit]:not([aria-label], [aria-labelledby]) {
424
422
  border-radius: var(--_action-radius);
425
423
  font: inherit;
426
424
  font-weight: var(--slotted-font-weight-medium, 500);
@@ -429,7 +427,7 @@
429
427
  padding-inline: var(--slotted-space-5, 0.75rem);
430
428
  }
431
429
 
432
- [data-ui='prompt-composer'] > [data-part='footer'] > [data-part='submit']:hover:not(:disabled) {
430
+ [data-ui-prompt-composer] > [data-part-footer] > [data-part-submit]:hover:not(:disabled) {
433
431
  background-color: var(
434
432
  --slotted-prompt-composer-submit-hover-background,
435
433
  var(--slotted-tone-accent-solid-hover, Highlight)
@@ -441,16 +439,16 @@
441
439
  * the button going in; the ground darkens a further step. A padded send
442
440
  * holds its words, so it takes the ground alone (R7).
443
441
  */
444
- [data-ui='prompt-composer'] > [data-part='footer'] > [data-part='submit']:active:not(:disabled) {
442
+ [data-ui-prompt-composer] > [data-part-footer] > [data-part-submit]:active:not(:disabled) {
445
443
  background-color: var(
446
444
  --slotted-prompt-composer-submit-active-background,
447
445
  var(--slotted-tone-accent-solid-active, Highlight)
448
446
  );
449
447
  }
450
448
 
451
- [data-ui='prompt-composer']
452
- > [data-part='footer']
453
- > [data-part='submit']:is([aria-label], [aria-labelledby]):active:not(:disabled) {
449
+ [data-ui-prompt-composer]
450
+ > [data-part-footer]
451
+ > [data-part-submit]:is([aria-label], [aria-labelledby]):active:not(:disabled) {
454
452
  scale: 0.9;
455
453
  }
456
454
 
@@ -459,23 +457,23 @@
459
457
  * over it: a hint of the movement the press will start, and nothing else
460
458
  * in the frame moves.
461
459
  */
462
- [data-ui='prompt-composer']
463
- > [data-part='footer']
464
- > [data-part='submit']
465
- > [data-ui='icon']:has([data-glyph='arrow-up']) {
460
+ [data-ui-prompt-composer]
461
+ > [data-part-footer]
462
+ > [data-part-submit]
463
+ > [data-ui-icon]:has([data-glyph='arrow-up']) {
466
464
  transition: translate var(--slotted-duration-short) var(--slotted-easing-standard);
467
465
  }
468
466
 
469
- [data-ui='prompt-composer']
470
- > [data-part='footer']
471
- > [data-part='submit']:hover:not(:disabled)
472
- > [data-ui='icon']:has([data-glyph='arrow-up']) {
467
+ [data-ui-prompt-composer]
468
+ > [data-part-footer]
469
+ > [data-part-submit]:hover:not(:disabled)
470
+ > [data-ui-icon]:has([data-glyph='arrow-up']) {
473
471
  translate: 0 calc(var(--slotted-border-width-thin, 1px) * -1);
474
472
  }
475
473
 
476
474
  /* Nothing to send: a quiet disc in the disabled ground, the arrow still
477
475
  legible, so the reader sees where the send will be before it wakes. */
478
- [data-ui='prompt-composer'] > [data-part='footer'] > [data-part='submit']:disabled {
476
+ [data-ui-prompt-composer] > [data-part-footer] > [data-part-submit]:disabled {
479
477
  background-color: var(
480
478
  --slotted-prompt-composer-submit-disabled-background,
481
479
  var(--slotted-disabled-background)
@@ -486,9 +484,7 @@
486
484
 
487
485
  /* While the request travels the button is busy, not unavailable: the ring
488
486
  stands where the arrow stood and the ground keeps the accent. */
489
- [data-ui='prompt-composer'][data-status='submitted']
490
- > [data-part='footer']
491
- > [data-part='submit'] {
487
+ [data-ui-prompt-composer][data-status='submitted'] > [data-part-footer] > [data-part-submit] {
492
488
  background-color: var(
493
489
  --slotted-prompt-composer-submit-background,
494
490
  var(--slotted-tone-accent-solid, Highlight)
@@ -502,9 +498,7 @@
502
498
 
503
499
  /* The ring around the stop square is drawn inside the disc, a stroke in
504
500
  from its edge, so the disc keeps its outline. */
505
- [data-ui='prompt-composer'][data-status='streaming']
506
- > [data-part='footer']
507
- > [data-part='submit'] {
501
+ [data-ui-prompt-composer][data-status='streaming'] > [data-part-footer] > [data-part-submit] {
508
502
  --slotted-spinner-size: calc(var(--_button) - 2 * var(--slotted-space-1, 2px));
509
503
  --slotted-icon-size: calc(var(--_icon-size) * 3 / 4);
510
504
  }
@@ -515,10 +509,10 @@
515
509
  * transparent, on the entering curve. The old mark is gone in the same
516
510
  * frame.
517
511
  */
518
- [data-ui='prompt-composer']
519
- > [data-part='footer']
520
- > [data-part='submit']
521
- > :is([data-ui='icon'], [data-ui='spinner']) {
512
+ [data-ui-prompt-composer]
513
+ > [data-part-footer]
514
+ > [data-part-submit]
515
+ > :is([data-ui-icon], [data-ui-spinner]) {
522
516
  transition:
523
517
  opacity var(--slotted-duration-short) var(--slotted-easing-enter),
524
518
  scale var(--slotted-duration-short) var(--slotted-easing-enter),
@@ -526,10 +520,10 @@
526
520
  }
527
521
 
528
522
  @starting-style {
529
- [data-ui='prompt-composer']
530
- > [data-part='footer']
531
- > [data-part='submit']
532
- > :is([data-ui='icon'], [data-ui='spinner']) {
523
+ [data-ui-prompt-composer]
524
+ > [data-part-footer]
525
+ > [data-part-submit]
526
+ > :is([data-ui-icon], [data-ui-spinner]) {
533
527
  opacity: 0;
534
528
  scale: 0.8;
535
529
  }
@@ -539,21 +533,21 @@
539
533
  inner control does: four pixels from the frame, an outward ring would
540
534
  land on the frame's edge. The solid send keeps it outside, where the
541
535
  ring stands against the frame's ground rather than against the accent. */
542
- [data-ui='prompt-composer']
543
- > :is([data-part='header'], [data-part='footer'])
544
- > :is([data-part='action'], [data-part='attach']):focus-visible {
536
+ [data-ui-prompt-composer]
537
+ > :is([data-part-header], [data-part-footer])
538
+ > :is([data-part-action], [data-part-attach]):focus-visible {
545
539
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
546
540
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
547
541
  }
548
542
 
549
- [data-ui='prompt-composer'] > [data-part='footer'] > [data-part='submit']:focus-visible {
543
+ [data-ui-prompt-composer] > [data-part-footer] > [data-part-submit]:focus-visible {
550
544
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
551
545
  outline-offset: var(--slotted-focus-ring-offset, 2px);
552
546
  }
553
547
 
554
548
  /* ── States of the frame ─────────────────────────────────────────────── */
555
549
 
556
- [data-ui='prompt-composer'][data-part='root']:hover:not([data-disabled]):not([data-readonly]):not(
550
+ [data-ui-prompt-composer][data-part-root]:hover:not([data-disabled]):not([data-readonly]):not(
557
551
  [data-invalid]
558
552
  ):not([data-drop-target]) {
559
553
  border-color: var(
@@ -569,10 +563,135 @@
569
563
  * the theme's large shadow, because a surface that is being written on
570
564
  * comes forward.
571
565
  */
572
- [data-ui='prompt-composer'][data-part='root']:has(> [data-part='input']:focus-visible) {
566
+ [data-ui-prompt-composer][data-part-root]:has(> [data-part-input]:focus-visible) {
573
567
  box-shadow: var(--_lift-focus);
574
568
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
575
- outline-offset: var(--slotted-focus-ring-offset, 2px);
569
+ outline-offset: var(--slotted-control-focus-ring-offset, var(--slotted-focus-ring-offset, 2px));
570
+ }
571
+
572
+ /* ── Emphasis: the ring ──────────────────────────────────────────────
573
+ *
574
+ * An AI input marked by a ring of turning hues and a soft glow, as Gemini
575
+ * and AI Studio mark theirs. The ring replaces the frame's border, its focus
576
+ * outline and its raised shadow; the controls inside keep their own focus
577
+ * rings. Two marks the binding draws, both `aria-hidden`: the ring, a band
578
+ * the width of `--slotted-prompt-composer-ring-width` cut out of a turning
579
+ * conic gradient, and the glow, the same gradient blurred and cut to what
580
+ * lies outside the frame. Each turns a square larger than its box by a
581
+ * `transform`, which the compositor runs at a constant speed.
582
+ */
583
+ [data-ui-prompt-composer][data-part-root][data-emphasis='ring'] {
584
+ --_ring-width: var(
585
+ --slotted-prompt-composer-ring-width,
586
+ var(--slotted-border-width-thick, 2px)
587
+ );
588
+ --_ring-reach: var(--slotted-prompt-composer-ring-glow-reach, var(--slotted-space-8, 1.5rem));
589
+ --_glow: var(--slotted-prompt-composer-ring-glow-opacity, 0.3);
590
+
591
+ border-color: transparent;
592
+ box-shadow: none;
593
+ isolation: isolate;
594
+ }
595
+
596
+ [data-ui-prompt-composer][data-part-root][data-emphasis='ring']:has(
597
+ > [data-part-input]:focus-visible
598
+ ) {
599
+ --_glow: var(--slotted-prompt-composer-ring-glow-opacity-focus, 0.55);
600
+
601
+ box-shadow: none;
602
+ outline: none;
603
+ }
604
+
605
+ [data-ui-prompt-composer][data-part-root][data-emphasis='ring']:is(
606
+ [data-loading],
607
+ [data-status='submitted'],
608
+ [data-status='streaming']
609
+ ) {
610
+ --_glow: var(--slotted-prompt-composer-ring-glow-opacity-busy, 0.75);
611
+ }
612
+
613
+ [data-ui-prompt-composer] > :is([data-part-ring], [data-part-glow]) {
614
+ border-radius: var(--_radius);
615
+ container-type: size;
616
+ overflow: hidden;
617
+ pointer-events: none;
618
+ position: absolute;
619
+ }
620
+
621
+ [data-ui-prompt-composer] > [data-part-ring] {
622
+ inset: calc(-1 * var(--slotted-control-border-width, 1px));
623
+ mask:
624
+ linear-gradient(#000 0 0) content-box exclude,
625
+ linear-gradient(#000 0 0);
626
+ padding: var(--_ring-width);
627
+ z-index: 1;
628
+ }
629
+
630
+ [data-ui-prompt-composer] > [data-part-glow] {
631
+ border-radius: calc(var(--_radius) + var(--_ring-reach));
632
+ filter: blur(calc(var(--_ring-reach) / 2));
633
+ inset: calc(-1 * var(--_ring-reach));
634
+ mask:
635
+ linear-gradient(#000 0 0) content-box exclude,
636
+ linear-gradient(#000 0 0);
637
+ opacity: var(--_glow);
638
+ padding: var(--_ring-reach);
639
+ transition: opacity var(--slotted-duration-medium) var(--slotted-easing-standard);
640
+ z-index: -1;
641
+ }
642
+
643
+ [data-ui-prompt-composer] > :is([data-part-ring], [data-part-glow])::before {
644
+ animation: slotted-prompt-composer-turn
645
+ var(--slotted-prompt-composer-ring-duration, var(--slotted-duration-loop-slow)) linear
646
+ infinite;
647
+ aspect-ratio: 1;
648
+ background: conic-gradient(
649
+ var(
650
+ --slotted-prompt-composer-ring-colors,
651
+ var(--slotted-data-1),
652
+ var(--slotted-data-3),
653
+ var(--slotted-data-5),
654
+ var(--slotted-data-2),
655
+ var(--slotted-data-1)
656
+ )
657
+ );
658
+ content: '';
659
+ inline-size: 150cqmax;
660
+ inset-block-start: 50%;
661
+ inset-inline-start: 50%;
662
+ position: absolute;
663
+ transform: translate(-50%, -50%) rotate(0turn);
664
+ }
665
+
666
+ @keyframes slotted-prompt-composer-turn {
667
+ to {
668
+ transform: translate(-50%, -50%) rotate(1turn);
669
+ }
670
+ }
671
+
672
+ @media (prefers-reduced-motion: reduce) {
673
+ [data-ui-prompt-composer] > :is([data-part-ring], [data-part-glow])::before {
674
+ animation: none;
675
+ }
676
+ }
677
+
678
+ /* The system's colours draw no gradient: the marks go, and the frame's own
679
+ border and focus outline return. */
680
+ @media (forced-colors: active) {
681
+ [data-ui-prompt-composer] > :is([data-part-ring], [data-part-glow]) {
682
+ display: none;
683
+ }
684
+
685
+ [data-ui-prompt-composer][data-part-root][data-emphasis='ring'] {
686
+ border-color: ButtonBorder;
687
+ }
688
+
689
+ [data-ui-prompt-composer][data-part-root][data-emphasis='ring']:has(
690
+ > [data-part-input]:focus-visible
691
+ ) {
692
+ outline: var(--slotted-focus-ring-width, 2px) solid Highlight;
693
+ outline-offset: var(--slotted-focus-ring-offset, 2px);
694
+ }
576
695
  }
577
696
 
578
697
  /**
@@ -583,11 +702,11 @@
583
702
  * moment. The dashed edge is a pseudo-element rather than an outline: the
584
703
  * outline is the focus ring's, and the two can be on at once.
585
704
  */
586
- [data-ui='prompt-composer'][data-part='root'] {
705
+ [data-ui-prompt-composer][data-part-root] {
587
706
  position: relative;
588
707
  }
589
708
 
590
- [data-ui='prompt-composer'][data-part='root']::before {
709
+ [data-ui-prompt-composer][data-part-root]::before {
591
710
  /* Unthemed, the dashed edge disappears rather than shouting in a system
592
711
  colour; the wash and the frame's edge still say where the drop lands. */
593
712
  border: var(--slotted-border-width-medium, 1.5px) dashed
@@ -606,12 +725,12 @@
606
725
  transition: opacity var(--slotted-duration-short) var(--slotted-easing-exit);
607
726
  }
608
727
 
609
- [data-ui='prompt-composer'][data-part='root'][data-drop-target]::before {
728
+ [data-ui-prompt-composer][data-part-root][data-drop-target]::before {
610
729
  opacity: 1;
611
730
  transition-timing-function: var(--slotted-easing-enter);
612
731
  }
613
732
 
614
- [data-ui='prompt-composer'][data-part='root'][data-drop-target] {
733
+ [data-ui-prompt-composer][data-part-root][data-drop-target] {
615
734
  background-color: var(
616
735
  --slotted-prompt-composer-drop-background,
617
736
  var(--slotted-tone-accent-surface, Canvas)
@@ -622,7 +741,7 @@
622
741
  );
623
742
  }
624
743
 
625
- [data-ui='prompt-composer'][data-part='root'][data-invalid] {
744
+ [data-ui-prompt-composer][data-part-root][data-invalid] {
626
745
  --slotted-focus-ring-color: var(
627
746
  --slotted-prompt-composer-invalid-focus-ring-color,
628
747
  var(--slotted-focus-ring-color-invalid, Highlight)
@@ -646,7 +765,7 @@
646
765
  * the large one in `raised` — and forced colours, which remove shadows, keep
647
766
  * a border. Nothing moves: the box is out of flow.
648
767
  */
649
- [data-ui='prompt-composer'][data-part='root'][data-invalid]::after {
768
+ [data-ui-prompt-composer][data-part-root][data-invalid]::after {
650
769
  border: var(--_invalid-edge-width) solid
651
770
  var(--slotted-prompt-composer-invalid-border-color, var(--slotted-tone-danger-border));
652
771
  border-radius: max(0px, calc(var(--_radius) - var(--slotted-control-border-width, 1px)));
@@ -656,7 +775,7 @@
656
775
  position: absolute;
657
776
  }
658
777
 
659
- [data-ui='prompt-composer'][data-part='root'][data-readonly] {
778
+ [data-ui-prompt-composer][data-part-root][data-readonly] {
660
779
  background-color: var(
661
780
  --slotted-prompt-composer-readonly-background,
662
781
  var(--slotted-tone-secondary-subtle-hover)
@@ -664,7 +783,7 @@
664
783
  cursor: default;
665
784
  }
666
785
 
667
- [data-ui='prompt-composer'][data-part='root'][data-disabled] {
786
+ [data-ui-prompt-composer][data-part-root][data-disabled] {
668
787
  background-color: var(
669
788
  --slotted-prompt-composer-disabled-background,
670
789
  var(--slotted-disabled-background)