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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +31 -32
  4. package/src/action-sheet/action-sheet.css +36 -36
  5. package/src/alert/alert.css +35 -35
  6. package/src/app-shell/app-shell.css +280 -299
  7. package/src/aspect-ratio/aspect-ratio.css +9 -9
  8. package/src/attachment/attachment.css +91 -99
  9. package/src/avatar/avatar.css +41 -41
  10. package/src/avatar-group/avatar-group.css +21 -22
  11. package/src/badge/badge.css +37 -37
  12. package/src/breadcrumb/breadcrumb.css +37 -37
  13. package/src/button/button.css +88 -69
  14. package/src/button-group/button-group.css +69 -73
  15. package/src/calendar/calendar.css +93 -103
  16. package/src/card/card.css +54 -61
  17. package/src/carousel/carousel.css +150 -161
  18. package/src/cascader/cascader.css +147 -151
  19. package/src/chart/chart.css +225 -240
  20. package/src/checkbox/checkbox.css +119 -124
  21. package/src/checkbox-group/checkbox-group.css +7 -7
  22. package/src/code-block/code-block.css +81 -85
  23. package/src/collapsible/collapsible.css +69 -76
  24. package/src/color-picker/color-picker.css +83 -91
  25. package/src/column-manager/column-manager.css +106 -114
  26. package/src/combobox/combobox.css +99 -101
  27. package/src/command-palette/command-palette.css +84 -90
  28. package/src/container/container.css +24 -24
  29. package/src/context-menu/context-menu.css +8 -8
  30. package/src/currency-field/currency-field.css +99 -104
  31. package/src/dashboard-grid/dashboard-grid.css +104 -107
  32. package/src/data-grid/data-grid.css +458 -456
  33. package/src/data-grid/data-grid.tokens.json +2 -0
  34. package/src/data-list/data-list.css +67 -69
  35. package/src/date-field/date-field.css +50 -50
  36. package/src/date-picker/date-picker.css +40 -42
  37. package/src/date-range-picker/date-range-picker.css +114 -118
  38. package/src/datetime-field/datetime-field.css +73 -78
  39. package/src/datetime-picker/datetime-picker.css +61 -63
  40. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  41. package/src/description-list/description-list.css +61 -64
  42. package/src/detail-panel/detail-panel.css +70 -70
  43. package/src/dialog/dialog.css +300 -148
  44. package/src/divider/divider.css +18 -18
  45. package/src/drawer/drawer.css +186 -209
  46. package/src/entity-picker/entity-picker.css +220 -239
  47. package/src/event-calendar/event-calendar.css +343 -385
  48. package/src/field/field.css +74 -78
  49. package/src/field-group/field-group.css +22 -25
  50. package/src/filter-bar/filter-bar.css +193 -209
  51. package/src/form/form.css +21 -24
  52. package/src/fullscreen/fullscreen.css +24 -25
  53. package/src/grid/grid.css +28 -28
  54. package/src/highlight/highlight.css +6 -6
  55. package/src/hover-card/hover-card.css +6 -6
  56. package/src/icon/icon.css +15 -15
  57. package/src/image/image.css +39 -39
  58. package/src/import-export-center/import-export-center.css +135 -156
  59. package/src/inline/inline.css +27 -27
  60. package/src/inline-message/inline-message.css +28 -28
  61. package/src/kbd/kbd.css +26 -26
  62. package/src/link/link.css +15 -15
  63. package/src/list/list.css +20 -20
  64. package/src/list-item/list-item.css +66 -66
  65. package/src/listbox/listbox.css +56 -59
  66. package/src/loading-overlay/loading-overlay.css +75 -92
  67. package/src/markdown/markdown.css +17 -17
  68. package/src/menu/menu.css +63 -65
  69. package/src/menubar/menubar.css +13 -13
  70. package/src/message/message.css +174 -202
  71. package/src/message-scroller/message-scroller.css +41 -42
  72. package/src/multi-select/multi-select.css +131 -137
  73. package/src/navigation-menu/navigation-menu.css +167 -188
  74. package/src/notification-center/notification-center.css +134 -148
  75. package/src/number-field/number-field.css +76 -81
  76. package/src/otp-input/otp-input.css +48 -48
  77. package/src/page/page.css +23 -23
  78. package/src/page-header/page-header.css +219 -280
  79. package/src/pagination/pagination.css +68 -72
  80. package/src/popover/popover.css +40 -49
  81. package/src/progress-indicator/progress-indicator.css +85 -90
  82. package/src/prompt-composer/prompt-composer.css +94 -99
  83. package/src/prose/prose.css +71 -75
  84. package/src/radio-group/radio-group.css +98 -103
  85. package/src/rating/rating.css +132 -132
  86. package/src/result-state/result-state.css +74 -77
  87. package/src/saved-views/saved-views.css +41 -47
  88. package/src/scroll-area/scroll-area.css +32 -35
  89. package/src/section/section.css +16 -16
  90. package/src/segmented-control/segmented-control.css +77 -79
  91. package/src/select/select.css +113 -115
  92. package/src/side-navigation/side-navigation.css +170 -180
  93. package/src/skeleton/skeleton.css +47 -48
  94. package/src/slider/slider.css +86 -88
  95. package/src/sparkline/sparkline.css +32 -32
  96. package/src/spinner/spinner.css +4 -4
  97. package/src/split-button/split-button.css +26 -31
  98. package/src/splitter/splitter.css +35 -35
  99. package/src/stack/stack.css +24 -24
  100. package/src/stat-card/stat-card.css +102 -103
  101. package/src/status-indicator/status-indicator.css +28 -28
  102. package/src/stepper/stepper.css +58 -62
  103. package/src/switch/switch.css +86 -92
  104. package/src/table/table.css +189 -198
  105. package/src/table-of-contents/table-of-contents.css +51 -54
  106. package/src/tabs/tabs.css +143 -162
  107. package/src/tag/tag.css +67 -71
  108. package/src/tags-input/tags-input.css +124 -74
  109. package/src/tags-input/tags-input.tokens.json +6 -1
  110. package/src/text-field/text-field.css +108 -126
  111. package/src/textarea/textarea.css +26 -26
  112. package/src/time-field/time-field.css +67 -67
  113. package/src/time-picker/time-picker.css +56 -58
  114. package/src/time-range-picker/time-range-picker.css +126 -133
  115. package/src/timeline/timeline.css +244 -266
  116. package/src/toast/toast.css +81 -90
  117. package/src/toggle/toggle.css +29 -33
  118. package/src/toggle-group/toggle-group.css +67 -71
  119. package/src/toolbar/toolbar.css +30 -35
  120. package/src/tooltip/tooltip.css +26 -26
  121. package/src/top-navigation/top-navigation.css +243 -259
  122. package/src/tour/tour.css +51 -60
  123. package/src/transfer/transfer.css +160 -164
  124. package/src/tree/tree.css +103 -111
  125. package/src/typography/typography.css +36 -36
  126. package/src/upload/upload.css +224 -224
  127. package/src/visually-hidden/visually-hidden.css +1 -1
  128. package/src/wizard/wizard.css +185 -197
@@ -13,7 +13,7 @@
13
13
  * both `Message` and `Bubble`, and two answers to one question can disagree
14
14
  * (`docs/history/designs/2026-09-30-message-design.md` §2.2).
15
15
  */
16
- [data-ui='message'][data-part='root'] {
16
+ [data-ui-message][data-part-root] {
17
17
  /**
18
18
  * The avatar column is the small avatar step, which the theme restates per
19
19
  * density; ReUI's 32 has no step there (dossier §3), and a row that follows
@@ -62,16 +62,15 @@
62
62
  * `MessageAvatar` in each of them (`c-message-6`); the column is read here
63
63
  * from the DOM instead.
64
64
  */
65
- [data-ui='message'][data-part='root']:has(> [data-part='avatar']),
66
- [data-ui='message'][data-part='group']:has([data-part='avatar'])
67
- > [data-ui='message'][data-part='root'] {
65
+ [data-ui-message][data-part-root]:has(> [data-part-avatar]),
66
+ [data-ui-message][data-part-group]:has([data-part-avatar]) > [data-ui-message][data-part-root] {
68
67
  grid-template-areas: 'avatar body';
69
68
  grid-template-columns: var(--_avatar-size) minmax(0, 1fr);
70
69
  }
71
70
 
72
- [data-ui='message'][data-part='root'][data-align='end']:has(> [data-part='avatar']),
73
- [data-ui='message'][data-part='group']:has([data-part='avatar'])
74
- > [data-ui='message'][data-part='root'][data-align='end'] {
71
+ [data-ui-message][data-part-root][data-align='end']:has(> [data-part-avatar]),
72
+ [data-ui-message][data-part-group]:has([data-part-avatar])
73
+ > [data-ui-message][data-part-root][data-align='end'] {
75
74
  grid-template-areas: 'body avatar';
76
75
  grid-template-columns: minmax(0, 1fr) var(--_avatar-size);
77
76
  }
@@ -81,7 +80,7 @@
81
80
  * rather than of the footer under it: in a run it marks where the run ends,
82
81
  * which is where the reader's eye arrives.
83
82
  */
84
- [data-ui='message'][data-part='root'] > [data-part='avatar'] {
83
+ [data-ui-message][data-part-root] > [data-part-avatar] {
85
84
  grid-area: avatar;
86
85
  display: flex;
87
86
  align-self: end;
@@ -90,12 +89,12 @@
90
89
  min-block-size: var(--_avatar-size);
91
90
  }
92
91
 
93
- [data-ui='message'][data-part='root']:has(> [data-part='body'] > [data-part='footer'])
94
- > [data-part='avatar'] {
92
+ [data-ui-message][data-part-root]:has(> [data-part-body] > [data-part-footer])
93
+ > [data-part-avatar] {
95
94
  margin-block-end: calc(var(--_meta-leading) + var(--_stack-gap));
96
95
  }
97
96
 
98
- [data-ui='message'][data-part='root'] > [data-part='body'] {
97
+ [data-ui-message][data-part-root] > [data-part-body] {
99
98
  grid-area: body;
100
99
  display: flex;
101
100
  flex-direction: column;
@@ -104,7 +103,7 @@
104
103
  min-inline-size: 0;
105
104
  }
106
105
 
107
- [data-ui='message'][data-part='root'][data-align='end'] > [data-part='body'] {
106
+ [data-ui-message][data-part-root][data-align='end'] > [data-part-body] {
108
107
  align-items: flex-end;
109
108
  }
110
109
 
@@ -116,7 +115,7 @@
116
115
  * sender's side drawn in, it reads as one speaker holding the floor. The
117
116
  * gap between runs belongs to whatever stacks them — the scroller gives it.
118
117
  */
119
- [data-ui='message'][data-part='group'] {
118
+ [data-ui-message][data-part-group] {
120
119
  display: flex;
121
120
  flex-direction: column;
122
121
  gap: var(--slotted-message-run-gap, var(--slotted-space-1, 0.125rem));
@@ -125,7 +124,7 @@
125
124
 
126
125
  /* ── Header and footer ──────────────────────────────────────────────── */
127
126
 
128
- [data-ui='message'][data-part='root'] :is([data-part='header'], [data-part='footer']) {
127
+ [data-ui-message][data-part-root] :is([data-part-header], [data-part-footer]) {
129
128
  display: flex;
130
129
  flex-wrap: wrap;
131
130
  align-items: center;
@@ -139,8 +138,7 @@
139
138
  line-height: var(--_meta-leading);
140
139
  }
141
140
 
142
- [data-ui='message'][data-part='root'][data-align='end']
143
- :is([data-part='header'], [data-part='footer']) {
141
+ [data-ui-message][data-part-root][data-align='end'] :is([data-part-header], [data-part-footer]) {
144
142
  justify-content: flex-end;
145
143
  }
146
144
 
@@ -150,7 +148,7 @@
150
148
  * read aloud, copied with the name and wrapped onto a line of its own.
151
149
  * ReUI asks the consumer to write the dot (`c-message-3`).
152
150
  */
153
- [data-ui='message'][data-part='root'] [data-part='header'] > * + [data-part='time']::before {
151
+ [data-ui-message][data-part-root] [data-part-header] > * + [data-part-time]::before {
154
152
  content: '';
155
153
  display: inline-block;
156
154
  inline-size: var(--slotted-space-2, 0.25rem);
@@ -162,14 +160,14 @@
162
160
  vertical-align: middle;
163
161
  }
164
162
 
165
- [data-ui='message'][data-part='root'] [data-part='author'] {
163
+ [data-ui-message][data-part-root] [data-part-author] {
166
164
  min-inline-size: 0;
167
165
  overflow: hidden;
168
166
  text-overflow: ellipsis;
169
167
  white-space: nowrap;
170
168
  }
171
169
 
172
- [data-ui='message'][data-part='root'] [data-part='time'] {
170
+ [data-ui-message][data-part-root] [data-part-time] {
173
171
  font-variant-numeric: tabular-nums;
174
172
  white-space: nowrap;
175
173
  }
@@ -183,14 +181,11 @@
183
181
  * word of twelve pixels is two voices saying one thing, and the two never
184
182
  * shared a centre line.
185
183
  */
186
- [data-ui='message'][data-part='root'] [data-part='footer'] > [data-part='receipt'] {
184
+ [data-ui-message][data-part-root] [data-part-footer] > [data-part-receipt] {
187
185
  white-space: nowrap;
188
186
  }
189
187
 
190
- [data-ui='message'][data-part='root']
191
- [data-part='footer']
192
- > [data-part='receipt']
193
- > [data-ui='icon'] {
188
+ [data-ui-message][data-part-root] [data-part-footer] > [data-part-receipt] > [data-ui-icon] {
194
189
  display: none;
195
190
  }
196
191
 
@@ -200,7 +195,7 @@
200
195
  * not with the words inside it — so the note reads as the bubble's caption.
201
196
  * The control that sends it again stands beside the surface (`retry`).
202
197
  */
203
- [data-ui='message'][data-part='root'][data-invalid] > [data-part='body'] > [data-part='footer'] {
198
+ [data-ui-message][data-part-root][data-invalid] > [data-part-body] > [data-part-footer] {
204
199
  padding-inline: var(--slotted-space-2, 0.25rem);
205
200
  color: var(--slotted-tone-danger-text);
206
201
  }
@@ -212,7 +207,7 @@
212
207
  * always on a screen that cannot hover: a reveal by hover alone would hide
213
208
  * them from the keyboard and from a finger.
214
209
  */
215
- [data-ui='message'][data-part='root'] [data-part='actions'] {
210
+ [data-ui-message][data-part-root] [data-part-actions] {
216
211
  display: inline-flex;
217
212
  align-items: center;
218
213
  gap: var(--slotted-space-1, 0.125rem);
@@ -220,15 +215,15 @@
220
215
  }
221
216
 
222
217
  @media (hover: hover) {
223
- [data-ui='message'][data-part='root'][data-actions='hover'] [data-part='actions'] {
218
+ [data-ui-message][data-part-root][data-actions='hover'] [data-part-actions] {
224
219
  opacity: 0;
225
220
  }
226
221
 
227
- [data-ui='message'][data-part='root'][data-actions='hover']:is(
222
+ [data-ui-message][data-part-root][data-actions='hover']:is(
228
223
  :hover:not([data-disabled]),
229
224
  :focus-within
230
225
  )
231
- [data-part='actions'] {
226
+ [data-part-actions] {
232
227
  opacity: 1;
233
228
  transition-timing-function: var(--slotted-easing-enter, ease-out);
234
229
  }
@@ -248,7 +243,7 @@
248
243
  * moves only while the step is current, and under reduced motion the words
249
244
  * stand in the plain ink.
250
245
  */
251
- [data-ui='message'][data-part='root'] [data-part='activity'] {
246
+ [data-ui-message][data-part-root] [data-part-activity] {
252
247
  display: inline-flex;
253
248
  flex-direction: column;
254
249
  gap: var(--slotted-space-3, 0.375rem);
@@ -265,7 +260,7 @@
265
260
  line-height: round(up, calc(1em * var(--slotted-line-height-md, 1.5)), 1px);
266
261
  }
267
262
 
268
- [data-ui='message'][data-part='root'] [data-part='activity-step'] {
263
+ [data-ui-message][data-part-root] [data-part-activity-step] {
269
264
  display: flex;
270
265
  align-items: center;
271
266
  gap: var(--slotted-space-4, 0.5rem);
@@ -282,7 +277,7 @@
282
277
  }
283
278
 
284
279
  /** The mark column: a tick, or the ring, in one box so the words line up. */
285
- [data-ui='message'][data-part='root'] [data-part='activity-step'] > :first-child {
280
+ [data-ui-message][data-part-root] [data-part-activity-step] > :first-child {
286
281
  --slotted-icon-size: var(--_glyph-size);
287
282
  --slotted-spinner-size: var(--_glyph-size);
288
283
 
@@ -293,19 +288,19 @@
293
288
  block-size: var(--_glyph-size);
294
289
  }
295
290
 
296
- [data-ui='message'][data-part='root'] [data-part='activity-step'][data-complete] > :first-child {
291
+ [data-ui-message][data-part-root] [data-part-activity-step][data-complete] > :first-child {
297
292
  color: var(--slotted-tone-success-text);
298
293
  }
299
294
 
300
- [data-ui='message'][data-part='root'] [data-part='activity-step'][data-current] {
295
+ [data-ui-message][data-part-root] [data-part-activity-step][data-current] {
301
296
  color: var(--slotted-text);
302
297
  }
303
298
 
304
- [data-ui='message'][data-part='root'] [data-part='activity-step'][data-current] > :first-child {
299
+ [data-ui-message][data-part-root] [data-part-activity-step][data-current] > :first-child {
305
300
  color: var(--slotted-tone-accent-text);
306
301
  }
307
302
 
308
- [data-ui='message'][data-part='root'] [data-part='activity-step'][data-current] > :last-child {
303
+ [data-ui-message][data-part-root] [data-part-activity-step][data-current] > :last-child {
309
304
  --_base: color-mix(in oklab, var(--slotted-text) 72%, var(--slotted-text-muted));
310
305
 
311
306
  background-image: linear-gradient(
@@ -337,20 +332,19 @@
337
332
  * `2 de 3` between two inner controls. The chevron is one glyph turned for
338
333
  * the previous control, and a right-to-left document turns both.
339
334
  */
340
- [data-ui='message'][data-part='root'] [data-part='versions'] {
335
+ [data-ui-message][data-part-root] [data-part-versions] {
341
336
  display: inline-flex;
342
337
  align-items: center;
343
338
  color: var(--slotted-text-muted);
344
339
  }
345
340
 
346
- [data-ui='message'][data-part='root'] [data-part='version-label'] {
341
+ [data-ui-message][data-part-root] [data-part-version-label] {
347
342
  padding-inline: var(--slotted-space-2, 0.25rem);
348
343
  font-variant-numeric: tabular-nums;
349
344
  white-space: nowrap;
350
345
  }
351
346
 
352
- [data-ui='message'][data-part='root']
353
- :is([data-part='version-previous'], [data-part='version-next']) {
347
+ [data-ui-message][data-part-root] :is([data-part-version-previous], [data-part-version-next]) {
354
348
  display: inline-grid;
355
349
  place-items: center;
356
350
  inline-size: var(--_inner-size);
@@ -367,45 +361,45 @@
367
361
  color var(--slotted-duration-short) var(--slotted-easing-standard, ease);
368
362
  }
369
363
 
370
- [data-ui='message'][data-part='root']
371
- :is([data-part='version-previous'], [data-part='version-next'])
372
- > [data-ui='icon'] {
364
+ [data-ui-message][data-part-root]
365
+ :is([data-part-version-previous], [data-part-version-next])
366
+ > [data-ui-icon] {
373
367
  --slotted-icon-size: var(--_glyph-size);
374
368
  }
375
369
 
376
- [data-ui='message'][data-part='root'] [data-part='version-previous'] > [data-ui='icon'] {
370
+ [data-ui-message][data-part-root] [data-part-version-previous] > [data-ui-icon] {
377
371
  scale: -1 1;
378
372
  }
379
373
 
380
- [data-ui='message'][data-part='root']:dir(rtl)
381
- :is([data-part='version-previous'], [data-part='version-next'])
382
- > [data-ui='icon'] {
374
+ [data-ui-message][data-part-root]:dir(rtl)
375
+ :is([data-part-version-previous], [data-part-version-next])
376
+ > [data-ui-icon] {
383
377
  scale: -1 1;
384
378
  }
385
379
 
386
- [data-ui='message'][data-part='root']:dir(rtl) [data-part='version-previous'] > [data-ui='icon'] {
380
+ [data-ui-message][data-part-root]:dir(rtl) [data-part-version-previous] > [data-ui-icon] {
387
381
  scale: 1 1;
388
382
  }
389
383
 
390
- [data-ui='message'][data-part='root']
391
- :is([data-part='version-previous'], [data-part='version-next']):hover:not(:disabled) {
384
+ [data-ui-message][data-part-root]
385
+ :is([data-part-version-previous], [data-part-version-next]):hover:not(:disabled) {
392
386
  background-color: var(--slotted-tone-secondary-subtle-hover);
393
387
  color: var(--slotted-text);
394
388
  }
395
389
 
396
- [data-ui='message'][data-part='root']
397
- :is([data-part='version-previous'], [data-part='version-next']):active:not(:disabled) {
390
+ [data-ui-message][data-part-root]
391
+ :is([data-part-version-previous], [data-part-version-next]):active:not(:disabled) {
398
392
  background-color: var(--slotted-tone-secondary-subtle-active);
399
393
  color: var(--slotted-text);
400
394
  }
401
395
 
402
- [data-ui='message'][data-part='root']
403
- :is([data-part='version-previous'], [data-part='version-next']):disabled {
396
+ [data-ui-message][data-part-root]
397
+ :is([data-part-version-previous], [data-part-version-next]):disabled {
404
398
  color: var(--slotted-disabled-foreground);
405
399
  }
406
400
 
407
- [data-ui='message'][data-part='root']
408
- :is([data-part='version-previous'], [data-part='version-next']):focus-visible {
401
+ [data-ui-message][data-part-root]
402
+ :is([data-part-version-previous], [data-part-version-next]):focus-visible {
409
403
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color);
410
404
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
411
405
  }
@@ -426,7 +420,7 @@
426
420
  * avatar at the top beside the name, the words unframed under it, and a
427
421
  * band under the pointer that says which message the actions belong to.
428
422
  */
429
- [data-ui='message'][data-part='root'][data-layout='thread'] {
423
+ [data-ui-message][data-part-root][data-layout='thread'] {
430
424
  --_avatar-size: var(--slotted-message-thread-avatar-size, var(--slotted-avatar-size-md, 36px));
431
425
  --_pad-inline: 0px;
432
426
 
@@ -436,18 +430,18 @@
436
430
  transition: background-color var(--slotted-duration-short) var(--slotted-easing-standard, ease);
437
431
  }
438
432
 
439
- [data-ui='message'][data-part='root'][data-layout='thread'] > [data-part='avatar'] {
433
+ [data-ui-message][data-part-root][data-layout='thread'] > [data-part-avatar] {
440
434
  align-self: start;
441
435
  margin-block-end: 0;
442
436
  }
443
437
 
444
- [data-ui='message'][data-part='root'][data-layout='thread'] [data-part='author'] {
438
+ [data-ui-message][data-part-root][data-layout='thread'] [data-part-author] {
445
439
  color: var(--slotted-text);
446
440
  font-size: var(--slotted-control-font-size-md, 13px);
447
441
  font-weight: var(--slotted-font-weight-semibold, 600);
448
442
  }
449
443
 
450
- [data-ui='message'][data-part='root'][data-layout='thread']:hover:not([data-disabled]) {
444
+ [data-ui-message][data-part-root][data-layout='thread']:hover:not([data-disabled]) {
451
445
  background-color: var(--slotted-tone-secondary-subtle-hover);
452
446
  }
453
447
 
@@ -459,14 +453,14 @@
459
453
  * A plate that is always painted, on a touch screen or with `always`, floated
460
454
  * over the words and covered them at 360 pixels.
461
455
  */
462
- [data-ui='message'][data-part='root'][data-layout='thread'] > [data-part='actions'] {
456
+ [data-ui-message][data-part-root][data-layout='thread'] > [data-part-actions] {
463
457
  grid-column: body;
464
458
  justify-self: start;
465
459
  }
466
460
 
467
461
  @media (hover: hover) {
468
- [data-ui='message'][data-part='root'][data-layout='thread'][data-actions='hover']
469
- > [data-part='actions'] {
462
+ [data-ui-message][data-part-root][data-layout='thread'][data-actions='hover']
463
+ > [data-part-actions] {
470
464
  position: absolute;
471
465
  inset-block-start: calc(var(--slotted-space-2, 0.25rem) * -1);
472
466
  inset-inline-end: var(--slotted-space-4, 0.5rem);
@@ -480,7 +474,7 @@
480
474
 
481
475
  /* ══ The bubble ════════════════════════════════════════════════════════ */
482
476
 
483
- [data-ui='message'][data-part='bubble'] {
477
+ [data-ui-message][data-part-bubble] {
484
478
  /**
485
479
  * The five tones, read into the roles a painting needs. `soft` writes in
486
480
  * the page's ink on the accent and secondary grounds — a paragraph set in
@@ -538,14 +532,14 @@
538
532
  max-inline-size: var(--slotted-message-bubble-share, 80%);
539
533
  }
540
534
 
541
- [data-ui='message'][data-part='bubble'][data-tone='accent'] {
535
+ [data-ui-message][data-part-bubble][data-tone='accent'] {
542
536
  --_solid: var(--slotted-tone-accent-solid);
543
537
  --_on-solid: var(--slotted-tone-accent-on-solid);
544
538
  --_surface: var(--slotted-tone-accent-surface);
545
539
  --_border: var(--slotted-tone-accent-border);
546
540
  }
547
541
 
548
- [data-ui='message'][data-part='bubble'][data-tone='success'] {
542
+ [data-ui-message][data-part-bubble][data-tone='success'] {
549
543
  --_solid: var(--slotted-tone-success-solid);
550
544
  --_on-solid: var(--slotted-tone-success-on-solid);
551
545
  --_surface: var(--slotted-tone-success-surface);
@@ -553,7 +547,7 @@
553
547
  --_soft-ink: var(--slotted-tone-success-text);
554
548
  }
555
549
 
556
- [data-ui='message'][data-part='bubble'][data-tone='warning'] {
550
+ [data-ui-message][data-part-bubble][data-tone='warning'] {
557
551
  --_solid: var(--slotted-tone-warning-solid);
558
552
  --_on-solid: var(--slotted-tone-warning-on-solid);
559
553
  --_surface: var(--slotted-tone-warning-surface);
@@ -561,7 +555,7 @@
561
555
  --_soft-ink: var(--slotted-tone-warning-text);
562
556
  }
563
557
 
564
- [data-ui='message'][data-part='bubble'][data-tone='danger'] {
558
+ [data-ui-message][data-part-bubble][data-tone='danger'] {
565
559
  --_solid: var(--slotted-tone-danger-solid);
566
560
  --_on-solid: var(--slotted-tone-danger-on-solid);
567
561
  --_surface: var(--slotted-tone-danger-surface);
@@ -580,7 +574,7 @@
580
574
  * page's ground, `plain` no box at all — the unframed assistant answer that
581
575
  * takes the whole row.
582
576
  */
583
- [data-ui='message'][data-part='bubble'] > [data-part='content'] {
577
+ [data-ui-message][data-part-bubble] > [data-part-content] {
584
578
  --_ground: var(--_surface);
585
579
  --_ink: var(--_soft-ink);
586
580
  --_edge: color-mix(in oklab, var(--_surface), var(--slotted-border-subtle));
@@ -615,25 +609,25 @@
615
609
  unicode-bidi: plaintext;
616
610
  }
617
611
 
618
- [data-ui='message'][data-part='bubble'][data-variant='solid'] > [data-part='content'] {
612
+ [data-ui-message][data-part-bubble][data-variant='solid'] > [data-part-content] {
619
613
  --_ground: var(--_solid);
620
614
  --_ink: var(--_on-solid);
621
615
  --_edge: var(--_solid);
622
616
  }
623
617
 
624
- [data-ui='message'][data-part='bubble'][data-variant='outline'] > [data-part='content'] {
618
+ [data-ui-message][data-part-bubble][data-variant='outline'] > [data-part-content] {
625
619
  --_ground: var(--slotted-surface);
626
620
  --_ink: var(--slotted-text);
627
621
  --_edge: var(--_border);
628
622
  }
629
623
 
630
- [data-ui='message'][data-part='bubble'][data-variant='plain'] {
624
+ [data-ui-message][data-part-bubble][data-variant='plain'] {
631
625
  --_pad-inline: 0px;
632
626
 
633
627
  max-inline-size: 100%;
634
628
  }
635
629
 
636
- [data-ui='message'][data-part='bubble'][data-variant='plain'] > [data-part='content'] {
630
+ [data-ui-message][data-part-bubble][data-variant='plain'] > [data-part-content] {
637
631
  --_ground: transparent;
638
632
  --_ink: var(--slotted-text);
639
633
  --_edge: transparent;
@@ -647,13 +641,11 @@
647
641
  * The bubble sits on the sender's side, and so does everything it carries:
648
642
  * the corners that join a run are the ones that face the avatar.
649
643
  */
650
- [data-ui='message'][data-part='root'][data-align='end'] [data-part='bubble'] {
644
+ [data-ui-message][data-part-root][data-align='end'] [data-part-bubble] {
651
645
  align-items: flex-end;
652
646
  }
653
647
 
654
- [data-ui='message'][data-part='root'][data-align='end']
655
- [data-part='bubble']
656
- > [data-part='content'] {
648
+ [data-ui-message][data-part-root][data-align='end'] [data-part-bubble] > [data-part-content] {
657
649
  border-start-start-radius: var(--_radius);
658
650
  border-start-end-radius: var(--_top-side);
659
651
  border-end-start-radius: var(--_radius);
@@ -668,19 +660,19 @@
668
660
  * of a group. A run reads as one speaker by its shape, with no position
669
661
  * prop on each message (Chatscope asks for `first`, `normal`, `last`).
670
662
  */
671
- [data-ui='message'][data-part='bubble']:has(~ [data-part='bubble']),
672
- [data-ui='message'][data-part='group']
673
- > [data-ui='message'][data-part='root']:not(:last-child)
674
- > [data-part='body']
675
- > [data-part='bubble']:not(:has(~ [data-part='bubble'])) {
663
+ [data-ui-message][data-part-bubble]:has(~ [data-part-bubble]),
664
+ [data-ui-message][data-part-group]
665
+ > [data-ui-message][data-part-root]:not(:last-child)
666
+ > [data-part-body]
667
+ > [data-part-bubble]:not(:has(~ [data-part-bubble])) {
676
668
  --_bottom-side: var(--_radius-joined);
677
669
  }
678
670
 
679
- [data-ui='message'][data-part='bubble'] ~ [data-part='bubble'],
680
- [data-ui='message'][data-part='group']
681
- > [data-ui='message'][data-part='root']:not(:first-child)
682
- > [data-part='body']
683
- > [data-part='bubble']:not([data-part='bubble'] ~ [data-part='bubble']) {
671
+ [data-ui-message][data-part-bubble] ~ [data-part-bubble],
672
+ [data-ui-message][data-part-group]
673
+ > [data-ui-message][data-part-root]:not(:first-child)
674
+ > [data-part-body]
675
+ > [data-part-bubble]:not([data-part-bubble] ~ [data-part-bubble]) {
684
676
  --_top-side: var(--_radius-joined);
685
677
  }
686
678
 
@@ -694,7 +686,7 @@
694
686
  * `light`, 0.044 under the secondary ground, over the 0.02 step
695
687
  * `theme-conformance` asks of a hover, and the press twice that.
696
688
  */
697
- [data-ui='message'][data-part='bubble'] > [data-part='content']:is(button, a) {
689
+ [data-ui-message][data-part-bubble] > [data-part-content]:is(button, a) {
698
690
  --_ground-hover: color-mix(
699
691
  in oklab,
700
692
  var(--_ink) var(--slotted-message-state-layer-hover, 6%),
@@ -713,25 +705,24 @@
713
705
  border-color var(--slotted-duration-short) var(--slotted-easing-standard, ease);
714
706
  }
715
707
 
716
- [data-ui='message'][data-part='bubble'][data-variant='plain']
717
- > [data-part='content']:is(button, a) {
708
+ [data-ui-message][data-part-bubble][data-variant='plain'] > [data-part-content]:is(button, a) {
718
709
  padding-block: var(--slotted-space-1, 0.125rem);
719
710
  padding-inline: var(--slotted-space-2, 0.25rem);
720
711
  margin-inline: calc(var(--slotted-space-2, 0.25rem) * -1);
721
712
  border-radius: var(--slotted-radius-sm, 4px);
722
713
  }
723
714
 
724
- [data-ui='message'][data-part='bubble']
725
- > [data-part='content']:is(button, a):hover:not(:disabled):not([data-disabled]) {
715
+ [data-ui-message][data-part-bubble]
716
+ > [data-part-content]:is(button, a):hover:not(:disabled):not([data-disabled]) {
726
717
  background-color: var(--_ground-hover);
727
718
  }
728
719
 
729
- [data-ui='message'][data-part='bubble']
730
- > [data-part='content']:is(button, a):active:not(:disabled):not([data-disabled]) {
720
+ [data-ui-message][data-part-bubble]
721
+ > [data-part-content]:is(button, a):active:not(:disabled):not([data-disabled]) {
731
722
  background-color: var(--_ground-active);
732
723
  }
733
724
 
734
- [data-ui='message'][data-part='bubble'] > [data-part='content']:is(button, a):focus-visible {
725
+ [data-ui-message][data-part-bubble] > [data-part-content]:is(button, a):focus-visible {
735
726
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color);
736
727
  outline-offset: var(--slotted-focus-ring-offset, 2px);
737
728
  }
@@ -752,7 +743,7 @@
752
743
  * beside a line of text, the hanging meta read as misaligned. Read is the one state that changes the ink: full strength on a
753
744
  * solid fill, the accent on a tinted one; the other marks differ by shape.
754
745
  */
755
- [data-ui='message'][data-part='bubble'] [data-part='meta'] {
746
+ [data-ui-message][data-part-bubble] [data-part-meta] {
756
747
  /*
757
748
  * Ninety per cent of the bubble's ink: the lowest share at which the hour
758
749
  * keeps 4.5:1 on every fill — 4.50 on the accent in `dark`, 5.74 in
@@ -778,11 +769,11 @@
778
769
  translate: 0 1px;
779
770
  }
780
771
 
781
- [data-ui='message'][data-part='bubble'][data-variant='solid'] [data-part='meta'] {
772
+ [data-ui-message][data-part-bubble][data-variant='solid'] [data-part-meta] {
782
773
  --_read-ink: var(--_on-solid);
783
774
  }
784
775
 
785
- [data-ui='message'][data-part='bubble'] [data-part='meta'] [data-part='receipt'] {
776
+ [data-ui-message][data-part-bubble] [data-part-meta] [data-part-receipt] {
786
777
  display: inline-grid;
787
778
  place-items: center;
788
779
  }
@@ -792,17 +783,11 @@
792
783
  * the two share one box and one centre; two ticks at twelve pixels were two
793
784
  * scratches.
794
785
  */
795
- [data-ui='message'][data-part='bubble']
796
- [data-part='meta']
797
- [data-part='receipt']
798
- > [data-ui='icon'] {
786
+ [data-ui-message][data-part-bubble] [data-part-meta] [data-part-receipt] > [data-ui-icon] {
799
787
  --slotted-icon-size: var(--slotted-control-icon-size-sm, 14px);
800
788
  }
801
789
 
802
- [data-ui='message'][data-part='bubble']
803
- [data-part='meta']
804
- [data-part='receipt']
805
- > span:not([data-ui]) {
790
+ [data-ui-message][data-part-bubble] [data-part-meta] [data-part-receipt] > span:not([data-ui]) {
806
791
  position: absolute;
807
792
  inline-size: 1px;
808
793
  block-size: 1px;
@@ -811,17 +796,15 @@
811
796
  white-space: nowrap;
812
797
  }
813
798
 
814
- [data-ui='message'][data-part='bubble']
815
- [data-part='meta']
816
- [data-part='receipt'][data-status='read'] {
799
+ [data-ui-message][data-part-bubble] [data-part-meta] [data-part-receipt][data-status='read'] {
817
800
  color: var(--_read-ink);
818
801
  }
819
802
 
820
803
  /** A clock that breathes while the message is on its way. */
821
- [data-ui='message'][data-part='bubble']
822
- [data-part='meta']
823
- [data-part='receipt'][data-status='sending']
824
- > [data-ui='icon'] {
804
+ [data-ui-message][data-part-bubble]
805
+ [data-part-meta]
806
+ [data-part-receipt][data-status='sending']
807
+ > [data-ui-icon] {
825
808
  animation: slotted-message-pending var(--slotted-duration-loop-slow)
826
809
  var(--slotted-easing-standard, ease) infinite alternate;
827
810
  }
@@ -837,7 +820,7 @@
837
820
  }
838
821
 
839
822
  /** The meta of an unframed reply has no surface to ride in; it is the footer's. */
840
- [data-ui='message'][data-part='bubble'][data-variant='plain'] [data-part='meta'] {
823
+ [data-ui-message][data-part-bubble][data-variant='plain'] [data-part-meta] {
841
824
  display: none;
842
825
  }
843
826
 
@@ -853,8 +836,7 @@
853
836
  * text jump twice when a reply streaming above it reflows the column. The
854
837
  * chevron turning is the motion that answers the press.
855
838
  */
856
- [data-ui='message'][data-part='bubble'][data-clamped]:not([data-revealed])
857
- > [data-part='content'] {
839
+ [data-ui-message][data-part-bubble][data-clamped]:not([data-revealed]) > [data-part-content] {
858
840
  display: -webkit-box;
859
841
  -webkit-box-orient: vertical;
860
842
  -webkit-line-clamp: var(--slotted-message-max-lines, 6);
@@ -868,7 +850,7 @@
868
850
  overflow-clip-margin: content-box;
869
851
  }
870
852
 
871
- [data-ui='message'][data-part='bubble'] > [data-part='more'] {
853
+ [data-ui-message][data-part-bubble] > [data-part-more] {
872
854
  display: inline-flex;
873
855
  align-items: center;
874
856
  gap: var(--slotted-space-1, 0.125rem);
@@ -886,25 +868,25 @@
886
868
  transition: color var(--slotted-duration-short) var(--slotted-easing-standard, ease);
887
869
  }
888
870
 
889
- [data-ui='message'][data-part='bubble'] > [data-part='more'] > [data-ui='icon'] {
871
+ [data-ui-message][data-part-bubble] > [data-part-more] > [data-ui-icon] {
890
872
  --slotted-icon-size: var(--slotted-control-icon-size-sm, 14px);
891
873
 
892
874
  transition: rotate var(--slotted-duration-medium) var(--slotted-easing-standard, ease);
893
875
  }
894
876
 
895
- [data-ui='message'][data-part='bubble'][data-revealed] > [data-part='more'] > [data-ui='icon'] {
877
+ [data-ui-message][data-part-bubble][data-revealed] > [data-part-more] > [data-ui-icon] {
896
878
  rotate: 180deg;
897
879
  }
898
880
 
899
- [data-ui='message'][data-part='bubble'] > [data-part='more']:hover:not(:disabled) {
881
+ [data-ui-message][data-part-bubble] > [data-part-more]:hover:not(:disabled) {
900
882
  color: var(--slotted-text);
901
883
  }
902
884
 
903
- [data-ui='message'][data-part='bubble'] > [data-part='more']:active:not(:disabled) {
885
+ [data-ui-message][data-part-bubble] > [data-part-more]:active:not(:disabled) {
904
886
  color: var(--slotted-tone-accent-text);
905
887
  }
906
888
 
907
- [data-ui='message'][data-part='bubble'] > [data-part='more']:focus-visible {
889
+ [data-ui-message][data-part-bubble] > [data-part-more]:focus-visible {
908
890
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color);
909
891
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
910
892
  }
@@ -917,7 +899,7 @@
917
899
  * the accent fill included, where a rail in the ink would be the only
918
900
  * saturated stroke in the thread.
919
901
  */
920
- [data-ui='message'][data-part='bubble'] [data-part='quote'] {
902
+ [data-ui-message][data-part-bubble] [data-part-quote] {
921
903
  display: block;
922
904
  box-sizing: border-box;
923
905
  inline-size: 100%;
@@ -940,25 +922,25 @@
940
922
  -webkit-line-clamp: 3;
941
923
  }
942
924
 
943
- [data-ui='message'][data-part='bubble'] [data-part='quote-author'] {
925
+ [data-ui-message][data-part-bubble] [data-part-quote-author] {
944
926
  display: block;
945
927
  font-weight: var(--slotted-font-weight-semibold, 600);
946
928
  }
947
929
 
948
- [data-ui='message'][data-part='bubble'] button[data-part='quote'] {
930
+ [data-ui-message][data-part-bubble] button[data-part-quote] {
949
931
  cursor: pointer;
950
932
  transition: background-color var(--slotted-duration-short) var(--slotted-easing-standard, ease);
951
933
  }
952
934
 
953
- [data-ui='message'][data-part='bubble'] button[data-part='quote']:hover:not(:disabled) {
935
+ [data-ui-message][data-part-bubble] button[data-part-quote]:hover:not(:disabled) {
954
936
  background-color: color-mix(in oklab, currentColor 13%, transparent);
955
937
  }
956
938
 
957
- [data-ui='message'][data-part='bubble'] button[data-part='quote']:active:not(:disabled) {
939
+ [data-ui-message][data-part-bubble] button[data-part-quote]:active:not(:disabled) {
958
940
  background-color: color-mix(in oklab, currentColor 18%, transparent);
959
941
  }
960
942
 
961
- [data-ui='message'][data-part='bubble'] button[data-part='quote']:focus-visible {
943
+ [data-ui-message][data-part-bubble] button[data-part-quote]:focus-visible {
962
944
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color);
963
945
  outline-offset: var(--slotted-focus-ring-offset, 2px);
964
946
  }
@@ -986,11 +968,11 @@
986
968
  * stands lit and the typing dots stand at three strengths, so the state is
987
969
  * still drawn.
988
970
  */
989
- [data-ui='message'][data-part='bubble'] [data-part='stream'] {
971
+ [data-ui-message][data-part-bubble] [data-part-stream] {
990
972
  white-space: pre-wrap;
991
973
  }
992
974
 
993
- [data-ui='message'][data-part='bubble'] [data-part='stream-chunk'] {
975
+ [data-ui-message][data-part-bubble] [data-part-stream-chunk] {
994
976
  animation: slotted-message-word var(--slotted-duration-long) var(--slotted-easing-standard) both;
995
977
  }
996
978
 
@@ -1006,7 +988,7 @@
1006
988
  }
1007
989
  }
1008
990
 
1009
- [data-ui='message'][data-part='bubble'] [data-part='caret'] {
991
+ [data-ui-message][data-part-bubble] [data-part-caret] {
1010
992
  --_dot: round(nearest, 0.6em, 2px);
1011
993
 
1012
994
  display: inline-block;
@@ -1026,9 +1008,9 @@
1026
1008
  }
1027
1009
 
1028
1010
  /* `filter`, not `opacity`: the breath animates opacity, and an animation outranks the rule. */
1029
- [data-ui='message'][data-part='bubble']
1030
- [data-part='stream']:has(> [data-part='stream-chunk'])
1031
- + [data-part='caret'] {
1011
+ [data-ui-message][data-part-bubble]
1012
+ [data-part-stream]:has(> [data-part-stream-chunk])
1013
+ + [data-part-caret] {
1032
1014
  filter: opacity(0);
1033
1015
  transition: filter var(--slotted-duration-short) var(--slotted-easing-exit);
1034
1016
  }
@@ -1059,7 +1041,7 @@
1059
1041
  * before, in the bubble of the person writing. The wave travels half a dot:
1060
1042
  * enough to read as a voice, not so much that the bubble seems to bounce.
1061
1043
  */
1062
- [data-ui='message'][data-part='bubble'] [data-part='typing'] {
1044
+ [data-ui-message][data-part-bubble] [data-part-typing] {
1063
1045
  --_dot: round(calc(var(--_leading) / 3), 1px);
1064
1046
 
1065
1047
  display: inline-flex;
@@ -1077,7 +1059,7 @@
1077
1059
  * behind. The circles are the surface's own fill and edge, so they answer
1078
1060
  * every painting and every scheme with the bubble.
1079
1061
  */
1080
- [data-ui='message'][data-part='bubble'] > [data-part='content']:has(> [data-part='typing']) {
1062
+ [data-ui-message][data-part-bubble] > [data-part-content]:has(> [data-part-typing]) {
1081
1063
  position: relative;
1082
1064
  padding-inline: calc(var(--_pad-inline) + var(--slotted-space-1, 0.125rem));
1083
1065
  transition:
@@ -1090,10 +1072,8 @@
1090
1072
  }
1091
1073
  }
1092
1074
 
1093
- [data-ui='message'][data-part='bubble']
1094
- > [data-part='content']:has(> [data-part='typing'])::before,
1095
- [data-ui='message'][data-part='bubble']
1096
- > [data-part='content']:has(> [data-part='typing'])::after {
1075
+ [data-ui-message][data-part-bubble] > [data-part-content]:has(> [data-part-typing])::before,
1076
+ [data-ui-message][data-part-bubble] > [data-part-content]:has(> [data-part-typing])::after {
1097
1077
  content: '';
1098
1078
  position: absolute;
1099
1079
  box-sizing: border-box;
@@ -1104,16 +1084,14 @@
1104
1084
  var(--slotted-easing-standard, ease) infinite alternate;
1105
1085
  }
1106
1086
 
1107
- [data-ui='message'][data-part='bubble']
1108
- > [data-part='content']:has(> [data-part='typing'])::before {
1087
+ [data-ui-message][data-part-bubble] > [data-part-content]:has(> [data-part-typing])::before {
1109
1088
  inset-block-end: calc(var(--slotted-space-1, 0.125rem) * -1);
1110
1089
  inset-inline-start: calc(var(--slotted-space-1, 0.125rem) * -1);
1111
1090
  inline-size: var(--slotted-space-4, 0.5rem);
1112
1091
  block-size: var(--slotted-space-4, 0.5rem);
1113
1092
  }
1114
1093
 
1115
- [data-ui='message'][data-part='bubble']
1116
- > [data-part='content']:has(> [data-part='typing'])::after {
1094
+ [data-ui-message][data-part-bubble] > [data-part-content]:has(> [data-part-typing])::after {
1117
1095
  inset-block-end: calc(var(--slotted-space-3, 0.375rem) * -1);
1118
1096
  inset-inline-start: calc(var(--slotted-space-3, 0.375rem) * -1);
1119
1097
  inline-size: var(--slotted-space-2, 0.25rem);
@@ -1122,9 +1100,9 @@
1122
1100
  }
1123
1101
 
1124
1102
  /** The line under a writing bubble clears the trail. */
1125
- [data-ui='message'][data-part='root']
1126
- > [data-part='body']:has(> [data-part='bubble'] [data-part='typing'])
1127
- > [data-part='footer'] {
1103
+ [data-ui-message][data-part-root]
1104
+ > [data-part-body]:has(> [data-part-bubble] [data-part-typing])
1105
+ > [data-part-footer] {
1128
1106
  margin-block-start: var(--slotted-space-2, 0.25rem);
1129
1107
  }
1130
1108
 
@@ -1138,7 +1116,7 @@
1138
1116
  }
1139
1117
  }
1140
1118
 
1141
- [data-ui='message'][data-part='bubble'] [data-part='typing'] > span {
1119
+ [data-ui-message][data-part-bubble] [data-part-typing] > span {
1142
1120
  inline-size: var(--_dot);
1143
1121
  block-size: var(--_dot);
1144
1122
  border-radius: var(--slotted-radius-full, 9999px);
@@ -1148,11 +1126,11 @@
1148
1126
  var(--slotted-easing-standard, ease) infinite;
1149
1127
  }
1150
1128
 
1151
- [data-ui='message'][data-part='bubble'] [data-part='typing'] > span:nth-child(2) {
1129
+ [data-ui-message][data-part-bubble] [data-part-typing] > span:nth-child(2) {
1152
1130
  animation-delay: calc(var(--slotted-duration-loop) / 6);
1153
1131
  }
1154
1132
 
1155
- [data-ui='message'][data-part='bubble'] [data-part='typing'] > span:nth-child(3) {
1133
+ [data-ui-message][data-part-bubble] [data-part-typing] > span:nth-child(3) {
1156
1134
  animation-delay: calc(var(--slotted-duration-loop) / 3);
1157
1135
  }
1158
1136
 
@@ -1178,7 +1156,7 @@
1178
1156
  * line. It is the way to send it again, and its arrow turns a little under
1179
1157
  * the pointer toward the way it will go.
1180
1158
  */
1181
- [data-ui='message'][data-part='bubble'] > [data-part='retry'] {
1159
+ [data-ui-message][data-part-bubble] > [data-part-retry] {
1182
1160
  --_size: max(var(--slotted-target-min, 24px), var(--slotted-control-inner-size-md, 24px));
1183
1161
  --_ground: var(--slotted-tone-danger-solid);
1184
1162
 
@@ -1206,13 +1184,11 @@
1206
1184
  transition: background-color var(--slotted-duration-short) var(--slotted-easing-standard, ease);
1207
1185
  }
1208
1186
 
1209
- [data-ui='message'][data-part='root'][data-align='end']
1210
- [data-part='bubble']
1211
- > [data-part='retry'] {
1187
+ [data-ui-message][data-part-root][data-align='end'] [data-part-bubble] > [data-part-retry] {
1212
1188
  inset-inline: auto calc(100% + var(--slotted-space-4, 0.5rem));
1213
1189
  }
1214
1190
 
1215
- [data-ui='message'][data-part='bubble'] > [data-part='retry'] > [data-ui='icon'] {
1191
+ [data-ui-message][data-part-bubble] > [data-part-retry] > [data-ui-icon] {
1216
1192
  --slotted-icon-size: var(--slotted-control-icon-size-sm, 14px);
1217
1193
 
1218
1194
  transition: rotate var(--slotted-duration-medium) var(--slotted-easing-emphasized, ease);
@@ -1223,8 +1199,8 @@
1223
1199
  * the 0.02 `theme-conformance` asks; the control's ink laid over the fill at
1224
1200
  * fourteen per cent answers visibly in every scheme.
1225
1201
  */
1226
- [data-ui='message'][data-part='bubble']
1227
- > [data-part='retry']:hover:not(:disabled):not([data-disabled]) {
1202
+ [data-ui-message][data-part-bubble]
1203
+ > [data-part-retry]:hover:not(:disabled):not([data-disabled]) {
1228
1204
  background-color: color-mix(
1229
1205
  in oklab,
1230
1206
  var(--slotted-tone-danger-on-solid) var(--slotted-message-retry-state-layer, 14%),
@@ -1232,48 +1208,46 @@
1232
1208
  );
1233
1209
  }
1234
1210
 
1235
- [data-ui='message'][data-part='bubble']
1236
- > [data-part='retry']:hover:not(:disabled):not([data-disabled])
1237
- > [data-ui='icon'] {
1211
+ [data-ui-message][data-part-bubble]
1212
+ > [data-part-retry]:hover:not(:disabled):not([data-disabled])
1213
+ > [data-ui-icon] {
1238
1214
  rotate: -45deg;
1239
1215
  }
1240
1216
 
1241
- [data-ui='message'][data-part='bubble']
1242
- > [data-part='retry']:active:not(:disabled):not([data-disabled]) {
1217
+ [data-ui-message][data-part-bubble]
1218
+ > [data-part-retry]:active:not(:disabled):not([data-disabled]) {
1243
1219
  background-color: var(--slotted-tone-danger-solid-active);
1244
1220
  }
1245
1221
 
1246
- [data-ui='message'][data-part='bubble'] > [data-part='retry']:focus-visible {
1222
+ [data-ui-message][data-part-bubble] > [data-part-retry]:focus-visible {
1247
1223
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color);
1248
1224
  outline-offset: var(--slotted-focus-ring-offset, 2px);
1249
1225
  }
1250
1226
 
1251
1227
  @media (prefers-reduced-motion: reduce) {
1252
- [data-ui='message'][data-part='bubble'] [data-part='caret'],
1253
- [data-ui='message'][data-part='bubble'] [data-part='stream-chunk'],
1254
- [data-ui='message'][data-part='bubble'] [data-part='typing'] > span,
1255
- [data-ui='message'][data-part='bubble']
1256
- > [data-part='content']:has(> [data-part='typing'])::before,
1257
- [data-ui='message'][data-part='bubble']
1258
- > [data-part='content']:has(> [data-part='typing'])::after,
1259
- [data-ui='message'][data-part='bubble']
1260
- [data-part='meta']
1261
- [data-part='receipt'][data-status='sending']
1262
- > [data-ui='icon'] {
1228
+ [data-ui-message][data-part-bubble] [data-part-caret],
1229
+ [data-ui-message][data-part-bubble] [data-part-stream-chunk],
1230
+ [data-ui-message][data-part-bubble] [data-part-typing] > span,
1231
+ [data-ui-message][data-part-bubble] > [data-part-content]:has(> [data-part-typing])::before,
1232
+ [data-ui-message][data-part-bubble] > [data-part-content]:has(> [data-part-typing])::after,
1233
+ [data-ui-message][data-part-bubble]
1234
+ [data-part-meta]
1235
+ [data-part-receipt][data-status='sending']
1236
+ > [data-ui-icon] {
1263
1237
  animation: none;
1264
1238
  }
1265
1239
 
1266
- [data-ui='message'][data-part='root'] [data-part='activity-step'][data-current] > :last-child {
1240
+ [data-ui-message][data-part-root] [data-part-activity-step][data-current] > :last-child {
1267
1241
  animation: none;
1268
1242
  background-image: none;
1269
1243
  color: inherit;
1270
1244
  }
1271
1245
 
1272
- [data-ui='message'][data-part='bubble'] [data-part='typing'] > span:nth-child(2) {
1246
+ [data-ui-message][data-part-bubble] [data-part-typing] > span:nth-child(2) {
1273
1247
  opacity: 0.55;
1274
1248
  }
1275
1249
 
1276
- [data-ui='message'][data-part='bubble'] [data-part='typing'] > span:nth-child(3) {
1250
+ [data-ui-message][data-part-bubble] [data-part-typing] > span:nth-child(3) {
1277
1251
  opacity: 0.8;
1278
1252
  }
1279
1253
  }
@@ -1288,11 +1262,11 @@
1288
1262
  * it (`c-bubble-4`). The pill draws its own edge and lift rather than a
1289
1263
  * ring in the colour of a card it assumes it is on.
1290
1264
  */
1291
- [data-ui='message'][data-part='bubble']:has(> [data-part='reactions']) {
1265
+ [data-ui-message][data-part-bubble]:has(> [data-part-reactions]) {
1292
1266
  padding-block-end: calc(var(--_reactions-size) - var(--_pad-block, 8px) / 2);
1293
1267
  }
1294
1268
 
1295
- [data-ui='message'][data-part='bubble'] > [data-part='reactions'] {
1269
+ [data-ui-message][data-part-bubble] > [data-part-reactions] {
1296
1270
  display: inline-flex;
1297
1271
  align-items: center;
1298
1272
  gap: var(--slotted-space-1, 0.125rem);
@@ -1306,9 +1280,7 @@
1306
1280
  box-shadow: var(--slotted-shadow-xs);
1307
1281
  }
1308
1282
 
1309
- [data-ui='message'][data-part='root'][data-align='end']
1310
- [data-part='bubble']
1311
- > [data-part='reactions'] {
1283
+ [data-ui-message][data-part-root][data-align='end'] [data-part-bubble] > [data-part-reactions] {
1312
1284
  inset-inline: var(--_pad-inline, 12px) auto;
1313
1285
  }
1314
1286
 
@@ -1316,11 +1288,11 @@
1316
1288
  * In a thread there is no surface to straddle: the reactions are a row in
1317
1289
  * the flow under the words, the way Slack and GitHub set them.
1318
1290
  */
1319
- [data-ui='message'][data-part='bubble'][data-variant='plain']:has(> [data-part='reactions']) {
1291
+ [data-ui-message][data-part-bubble][data-variant='plain']:has(> [data-part-reactions]) {
1320
1292
  padding-block-end: 0;
1321
1293
  }
1322
1294
 
1323
- [data-ui='message'][data-part='bubble'][data-variant='plain'] > [data-part='reactions'] {
1295
+ [data-ui-message][data-part-bubble][data-variant='plain'] > [data-part-reactions] {
1324
1296
  position: static;
1325
1297
  padding: 0;
1326
1298
  border: 0;
@@ -1329,7 +1301,7 @@
1329
1301
  translate: none;
1330
1302
  }
1331
1303
 
1332
- [data-ui='message'][data-part='bubble'] [data-part='reaction'] {
1304
+ [data-ui-message][data-part-bubble] [data-part-reaction] {
1333
1305
  display: inline-flex;
1334
1306
  align-items: center;
1335
1307
  gap: var(--slotted-space-1, 0.125rem);
@@ -1354,13 +1326,13 @@
1354
1326
  color var(--slotted-duration-short) var(--slotted-easing-standard, ease);
1355
1327
  }
1356
1328
 
1357
- [data-ui='message'][data-part='bubble'][data-variant='plain'] [data-part='reaction'] {
1329
+ [data-ui-message][data-part-bubble][data-variant='plain'] [data-part-reaction] {
1358
1330
  --_reaction-ground: var(--slotted-surface);
1359
1331
 
1360
1332
  border-color: var(--slotted-border-subtle);
1361
1333
  }
1362
1334
 
1363
- [data-ui='message'][data-part='bubble'] [data-part='reaction-count'] {
1335
+ [data-ui-message][data-part-bubble] [data-part-reaction-count] {
1364
1336
  color: var(--slotted-text-muted);
1365
1337
  font-weight: var(--slotted-font-weight-medium, 500);
1366
1338
  font-variant-numeric: tabular-nums;
@@ -1372,8 +1344,8 @@
1372
1344
  * ink laid over it at six and twelve per cent, so a pressed reaction answers
1373
1345
  * a hover and a press as clearly as a bare one and the two never match.
1374
1346
  */
1375
- [data-ui='message'][data-part='bubble']
1376
- [data-part='reaction']:hover:not(:disabled):not([data-disabled]) {
1347
+ [data-ui-message][data-part-bubble]
1348
+ [data-part-reaction]:hover:not(:disabled):not([data-disabled]) {
1377
1349
  background-color: color-mix(
1378
1350
  in oklab,
1379
1351
  var(--slotted-text) var(--slotted-message-state-layer-hover, 6%),
@@ -1381,8 +1353,8 @@
1381
1353
  );
1382
1354
  }
1383
1355
 
1384
- [data-ui='message'][data-part='bubble']
1385
- [data-part='reaction']:active:not(:disabled):not([data-disabled]) {
1356
+ [data-ui-message][data-part-bubble]
1357
+ [data-part-reaction]:active:not(:disabled):not([data-disabled]) {
1386
1358
  background-color: color-mix(
1387
1359
  in oklab,
1388
1360
  var(--slotted-text) var(--slotted-message-state-layer-active, 12%),
@@ -1395,24 +1367,24 @@
1395
1367
  * edge, and the count in the accent's ink. The pair carries the ratio the
1396
1368
  * ground alone cannot (`docs/token-foundation.md` › Semantic colour).
1397
1369
  */
1398
- [data-ui='message'][data-part='bubble'] [data-part='reaction'][data-pressed] {
1370
+ [data-ui-message][data-part-bubble] [data-part-reaction][data-pressed] {
1399
1371
  --_reaction-ground: var(--slotted-tone-accent-surface);
1400
1372
 
1401
1373
  border-color: var(--slotted-tone-accent-border);
1402
1374
  }
1403
1375
 
1404
- [data-ui='message'][data-part='bubble']
1405
- [data-part='reaction'][data-pressed]
1406
- > [data-part='reaction-count'] {
1376
+ [data-ui-message][data-part-bubble]
1377
+ [data-part-reaction][data-pressed]
1378
+ > [data-part-reaction-count] {
1407
1379
  color: var(--slotted-tone-accent-text);
1408
1380
  }
1409
1381
 
1410
- [data-ui='message'][data-part='bubble'] [data-part='reaction']:is(:disabled, [data-disabled]) {
1382
+ [data-ui-message][data-part-bubble] [data-part-reaction]:is(:disabled, [data-disabled]) {
1411
1383
  color: var(--slotted-disabled-foreground);
1412
1384
  cursor: default;
1413
1385
  }
1414
1386
 
1415
- [data-ui='message'][data-part='bubble'] [data-part='reaction']:focus-visible {
1387
+ [data-ui-message][data-part-bubble] [data-part-reaction]:focus-visible {
1416
1388
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color);
1417
1389
  outline-offset: var(--slotted-focus-ring-offset, 2px);
1418
1390
  }
@@ -1425,28 +1397,28 @@
1425
1397
  * reader chose.
1426
1398
  */
1427
1399
  @media (forced-colors: active) {
1428
- [data-ui='message'][data-part='bubble'] > [data-part='content'] {
1400
+ [data-ui-message][data-part-bubble] > [data-part-content] {
1429
1401
  border-color: CanvasText;
1430
1402
  }
1431
1403
 
1432
1404
  /* A background is the system's to repaint; the dot is ink, so it keeps the text's colour. */
1433
- [data-ui='message'][data-part='bubble'] [data-part='caret'] {
1405
+ [data-ui-message][data-part-bubble] [data-part-caret] {
1434
1406
  forced-color-adjust: none;
1435
1407
  background-color: CanvasText;
1436
1408
  }
1437
1409
 
1438
- [data-ui='message'][data-part='bubble'][data-variant='plain'] > [data-part='content'] {
1410
+ [data-ui-message][data-part-bubble][data-variant='plain'] > [data-part-content] {
1439
1411
  border-color: transparent;
1440
1412
  }
1441
1413
 
1442
- [data-ui='message'][data-part='bubble'] [data-part='reaction'][data-pressed] {
1414
+ [data-ui-message][data-part-bubble] [data-part-reaction][data-pressed] {
1443
1415
  border-color: Highlight;
1444
1416
  forced-color-adjust: none;
1445
1417
  background-color: Highlight;
1446
1418
  color: HighlightText;
1447
1419
  }
1448
1420
 
1449
- [data-ui='message'][data-part='bubble'] [data-part='quote'] {
1421
+ [data-ui-message][data-part-bubble] [data-part-quote] {
1450
1422
  border: var(--slotted-border-width-thin, 1px) solid CanvasText;
1451
1423
  }
1452
1424
  }