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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +31 -32
  4. package/src/action-sheet/action-sheet.css +36 -36
  5. package/src/alert/alert.css +43 -35
  6. package/src/alert/alert.tokens.json +5 -0
  7. package/src/app-shell/app-shell.css +356 -301
  8. package/src/aspect-ratio/aspect-ratio.css +9 -9
  9. package/src/attachment/attachment.css +91 -99
  10. package/src/avatar/avatar.css +71 -41
  11. package/src/avatar/avatar.tokens.json +7 -0
  12. package/src/avatar-group/avatar-group.css +21 -22
  13. package/src/badge/badge.css +45 -37
  14. package/src/badge/badge.tokens.json +5 -0
  15. package/src/breadcrumb/breadcrumb.css +37 -37
  16. package/src/button/button.css +139 -64
  17. package/src/button/button.tokens.json +10 -0
  18. package/src/button-group/button-group.css +76 -72
  19. package/src/button-group/button-group.tokens.json +2 -0
  20. package/src/calendar/calendar.css +93 -103
  21. package/src/card/card.css +54 -61
  22. package/src/carousel/carousel.css +150 -161
  23. package/src/cascader/cascader.css +152 -153
  24. package/src/cascader/cascader.tokens.json +1 -0
  25. package/src/chart/chart.css +242 -239
  26. package/src/chart/chart.tokens.json +1 -0
  27. package/src/checkbox/checkbox.css +119 -124
  28. package/src/checkbox-group/checkbox-group.css +7 -7
  29. package/src/code-block/code-block.css +81 -85
  30. package/src/collapsible/collapsible.css +69 -76
  31. package/src/color-picker/color-picker.css +83 -91
  32. package/src/column-manager/column-manager.css +106 -114
  33. package/src/combobox/combobox.css +132 -107
  34. package/src/combobox/combobox.tokens.json +1 -0
  35. package/src/command-palette/command-palette.css +84 -90
  36. package/src/container/container.css +24 -24
  37. package/src/context-menu/context-menu.css +8 -8
  38. package/src/currency-field/currency-field.css +210 -88
  39. package/src/currency-field/currency-field.tokens.json +13 -0
  40. package/src/dashboard-grid/dashboard-grid.css +148 -116
  41. package/src/data-grid/data-grid.css +504 -469
  42. package/src/data-grid/data-grid.tokens.json +2 -0
  43. package/src/data-list/data-list.css +81 -70
  44. package/src/data-list/data-list.tokens.json +2 -1
  45. package/src/date-field/date-field.css +55 -52
  46. package/src/date-field/date-field.tokens.json +1 -0
  47. package/src/date-picker/date-picker.css +40 -42
  48. package/src/date-range-picker/date-range-picker.css +114 -118
  49. package/src/datetime-field/datetime-field.css +78 -80
  50. package/src/datetime-field/datetime-field.tokens.json +1 -0
  51. package/src/datetime-picker/datetime-picker.css +61 -63
  52. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  53. package/src/description-list/description-list.css +61 -64
  54. package/src/detail-panel/detail-panel.css +70 -70
  55. package/src/dialog/dialog.css +334 -153
  56. package/src/dialog/dialog.tokens.json +5 -0
  57. package/src/divider/divider.css +18 -18
  58. package/src/drawer/drawer.css +186 -209
  59. package/src/entity-picker/entity-picker.css +238 -241
  60. package/src/entity-picker/entity-picker.tokens.json +1 -0
  61. package/src/event-calendar/event-calendar.css +343 -385
  62. package/src/field/field.css +74 -78
  63. package/src/field-group/field-group.css +22 -25
  64. package/src/filter-bar/filter-bar.css +193 -209
  65. package/src/form/form.css +34 -24
  66. package/src/form/form.tokens.json +1 -0
  67. package/src/fullscreen/fullscreen.css +24 -25
  68. package/src/grid/grid.css +28 -28
  69. package/src/highlight/highlight.css +6 -6
  70. package/src/hover-card/hover-card.css +6 -6
  71. package/src/icon/icon.css +19 -15
  72. package/src/icon/icon.tokens.json +1 -0
  73. package/src/image/image.css +39 -39
  74. package/src/import-export-center/import-export-center.css +135 -156
  75. package/src/inline/inline.css +27 -27
  76. package/src/inline-message/inline-message.css +52 -28
  77. package/src/inline-message/inline-message.tokens.json +4 -0
  78. package/src/kbd/kbd.css +30 -26
  79. package/src/link/link.css +15 -15
  80. package/src/list/list.css +44 -17
  81. package/src/list/list.tokens.json +4 -0
  82. package/src/list-item/list-item.css +80 -66
  83. package/src/list-item/list-item.tokens.json +7 -0
  84. package/src/listbox/listbox.css +56 -59
  85. package/src/loading-overlay/loading-overlay.css +75 -92
  86. package/src/markdown/markdown.css +17 -17
  87. package/src/menu/menu.css +83 -63
  88. package/src/menubar/menubar.css +13 -13
  89. package/src/message/message.css +182 -202
  90. package/src/message/message.tokens.json +5 -0
  91. package/src/message-scroller/message-scroller.css +41 -42
  92. package/src/multi-select/multi-select.css +152 -145
  93. package/src/multi-select/multi-select.tokens.json +1 -0
  94. package/src/navigation-menu/navigation-menu.css +167 -188
  95. package/src/notification-center/notification-center.css +140 -148
  96. package/src/notification-center/notification-center.tokens.json +3 -0
  97. package/src/number-field/number-field.css +84 -83
  98. package/src/number-field/number-field.tokens.json +1 -0
  99. package/src/otp-input/otp-input.css +67 -57
  100. package/src/otp-input/otp-input.tokens.json +1 -0
  101. package/src/page/page.css +23 -23
  102. package/src/page-header/page-header.css +268 -281
  103. package/src/page-header/page-header.tokens.json +1 -0
  104. package/src/pagination/pagination.css +68 -72
  105. package/src/popover/popover.css +40 -49
  106. package/src/progress-indicator/progress-indicator.css +177 -120
  107. package/src/progress-indicator/progress-indicator.tokens.json +1 -1
  108. package/src/prompt-composer/prompt-composer.css +221 -102
  109. package/src/prompt-composer/prompt-composer.tokens.json +15 -0
  110. package/src/prose/prose.css +71 -75
  111. package/src/radio-group/radio-group.css +98 -103
  112. package/src/rating/rating.css +136 -132
  113. package/src/rating/rating.tokens.json +1 -0
  114. package/src/result-state/result-state.css +74 -77
  115. package/src/runtime-properties.mjs +2 -0
  116. package/src/saved-views/saved-views.css +41 -47
  117. package/src/scroll-area/scroll-area.css +39 -32
  118. package/src/section/section.css +161 -41
  119. package/src/section/section.tokens.json +7 -2
  120. package/src/segmented-control/segmented-control.css +254 -97
  121. package/src/segmented-control/segmented-control.tokens.json +15 -11
  122. package/src/select/select.css +118 -117
  123. package/src/select/select.tokens.json +1 -0
  124. package/src/side-navigation/side-navigation.css +179 -182
  125. package/src/side-navigation/side-navigation.tokens.json +1 -0
  126. package/src/skeleton/skeleton.css +47 -48
  127. package/src/slider/slider.css +86 -88
  128. package/src/sparkline/sparkline.css +62 -40
  129. package/src/sparkline/sparkline.tokens.json +2 -0
  130. package/src/spinner/spinner.css +39 -182
  131. package/src/spinner/spinner.tokens.json +0 -2
  132. package/src/split-button/split-button.css +30 -31
  133. package/src/split-button/split-button.tokens.json +1 -0
  134. package/src/splitter/splitter.css +35 -35
  135. package/src/stack/stack.css +24 -24
  136. package/src/stat-card/stat-card.css +341 -224
  137. package/src/stat-card/stat-card.tokens.json +3 -0
  138. package/src/status-indicator/status-indicator.css +28 -28
  139. package/src/stepper/stepper.css +58 -62
  140. package/src/switch/switch.css +86 -92
  141. package/src/table/table.css +310 -165
  142. package/src/table/table.tokens.json +6 -0
  143. package/src/table-of-contents/table-of-contents.css +51 -54
  144. package/src/tabs/tabs.css +330 -302
  145. package/src/tabs/tabs.tokens.json +8 -5
  146. package/src/tag/tag.css +79 -71
  147. package/src/tag/tag.tokens.json +9 -0
  148. package/src/tags-input/tags-input.css +145 -82
  149. package/src/tags-input/tags-input.tokens.json +7 -1
  150. package/src/text-field/text-field.css +132 -136
  151. package/src/text-field/text-field.tokens.json +1 -0
  152. package/src/textarea/textarea.css +31 -28
  153. package/src/textarea/textarea.tokens.json +1 -0
  154. package/src/time-field/time-field.css +72 -69
  155. package/src/time-field/time-field.tokens.json +1 -0
  156. package/src/time-picker/time-picker.css +56 -58
  157. package/src/time-range-picker/time-range-picker.css +126 -133
  158. package/src/timeline/timeline.css +254 -266
  159. package/src/timeline/timeline.tokens.json +5 -0
  160. package/src/toast/toast.css +89 -90
  161. package/src/toast/toast.tokens.json +5 -0
  162. package/src/toggle/toggle.css +62 -25
  163. package/src/toggle/toggle.tokens.json +8 -0
  164. package/src/toggle-group/toggle-group.css +106 -60
  165. package/src/toggle-group/toggle-group.tokens.json +10 -0
  166. package/src/toolbar/toolbar.css +30 -35
  167. package/src/tooltip/tooltip.css +26 -26
  168. package/src/top-navigation/top-navigation.css +243 -259
  169. package/src/tour/tour.css +51 -60
  170. package/src/transfer/transfer.css +160 -164
  171. package/src/tree/tree.css +103 -111
  172. package/src/typography/typography.css +40 -36
  173. package/src/typography/typography.tokens.json +1 -0
  174. package/src/upload/upload.css +224 -224
  175. package/src/visually-hidden/visually-hidden.css +1 -1
  176. package/src/wizard/wizard.css +185 -197
@@ -23,14 +23,10 @@
23
23
  }
24
24
 
25
25
  /**
26
- * Where the travelling bar of an indeterminate indicator starts and how long
27
- * it is, as percentages of the track.
28
- *
29
- * The keyframes move these two numbers rather than the bar's own box, because
30
- * two things read them: the plain bar sets its inset and its length from them,
31
- * and the wavy bar cuts a window out of its path at the same two numbers. One
32
- * clock, read twice, is what keeps a wavy bar and a plain one travelling the
33
- * same journey.
26
+ * Where the travelling bar of an indeterminate wavy indicator starts and how
27
+ * long it is, as percentages of the track: the wavy bar cuts a window out of
28
+ * its path at the two numbers. The plain bar travels the same journey by
29
+ * `translate` and `scale`, which the compositor runs.
34
30
  */
35
31
  @property --slotted-progress-indicator-travel-start {
36
32
  syntax: '<number>';
@@ -97,7 +93,7 @@
97
93
  * authored stylesheet has to know which of three things it is painting, and
98
94
  * a prop would be a fourth way to pick a component already picked.
99
95
  */
100
- [data-ui='progress-indicator'][data-part='root'] {
96
+ [data-ui-progress-indicator][data-part-root] {
101
97
  /**
102
98
  * The ink, and it is the tone's `text` role rather than its `solid` one.
103
99
  * Two reasons, and the second is the one that decides it. The indicator is
@@ -123,8 +119,9 @@
123
119
  * scheme instead, because the ink is the far end of each scheme's own
124
120
  * range. Twenty-four per cent is measured rather than chosen: it is the
125
121
  * lowest ratio at which the track separates from the page in all three
126
- * schemes at the 2-pixel `sm` thickness, and low enough that a column of
127
- * bars does not read as a column of filled bars.
122
+ * schemes at a 2-pixel bar, half the thinnest one this family draws,
123
+ * and low enough that a column of bars does not read as a column of
124
+ * filled bars.
128
125
  */
129
126
  --_track-color: var(
130
127
  --slotted-progress-indicator-track-color,
@@ -152,14 +149,14 @@
152
149
  --_font-size: var(--slotted-control-font-size-md, 13px);
153
150
  --_text-gap: var(--slotted-space-4, 0.5rem);
154
151
  --_row-gap: var(--slotted-space-3, 0.375rem);
155
- --_thickness: var(--slotted-progress-indicator-thickness, var(--slotted-space-2, 0.25rem));
152
+ --_thickness: var(--slotted-progress-indicator-thickness, var(--slotted-space-3, 0.375rem));
156
153
  --_size: var(--slotted-progress-indicator-size, var(--slotted-control-height-md, 34px));
157
154
  --_radius: var(--slotted-progress-indicator-radius, var(--slotted-radius-full, 9999px));
158
155
  /**
159
156
  * M3's indicator–track gap, and the stop indicator's diameter, are both
160
157
  * 4dp at the 4dp track. Making them one thickness is the proportional form
161
- * of that decision rather than a copy of the number: a 4-pixel gap in a
162
- * 2-pixel bar would be wider than the bar is tall.
158
+ * of that decision rather than a copy of the number: a fixed 4-pixel gap
159
+ * would be the whole `sm` bar and half the `lg` one.
163
160
  */
164
161
  --_gap: var(--slotted-progress-indicator-gap, var(--_thickness));
165
162
 
@@ -230,7 +227,7 @@
230
227
  * user agent's `[hidden]`, and a family that painted through its own
231
228
  * withdrawal would flash exactly what the delay exists to prevent.
232
229
  */
233
- [data-ui='progress-indicator'][hidden] {
230
+ [data-ui-progress-indicator][hidden] {
234
231
  display: none;
235
232
  }
236
233
 
@@ -252,23 +249,27 @@
252
249
  * It is the same substitution `badge` and `status-indicator` make for their
253
250
  * own neutral marks, for the same reason.
254
251
  */
255
- [data-ui='progress-indicator'][data-part='root'][data-tone='secondary'] {
252
+ [data-ui-progress-indicator][data-part-root][data-tone='secondary'] {
256
253
  --_ink: var(--slotted-progress-indicator-indicator-color, var(--slotted-border-strong));
257
254
  }
258
255
 
259
- [data-ui='progress-indicator'][data-part='root'][data-tone='success'] {
256
+ [data-ui-progress-indicator][data-part-root][data-tone='success'] {
260
257
  --_ink: var(--slotted-progress-indicator-indicator-color, var(--slotted-tone-success-text));
261
258
  }
262
259
 
263
- [data-ui='progress-indicator'][data-part='root'][data-tone='warning'] {
260
+ [data-ui-progress-indicator][data-part-root][data-tone='info'] {
261
+ --_ink: var(--slotted-progress-indicator-indicator-color, var(--slotted-tone-info-text));
262
+ }
263
+
264
+ [data-ui-progress-indicator][data-part-root][data-tone='warning'] {
264
265
  --_ink: var(--slotted-progress-indicator-indicator-color, var(--slotted-tone-warning-text));
265
266
  }
266
267
 
267
- [data-ui='progress-indicator'][data-part='root'][data-tone='danger'] {
268
+ [data-ui-progress-indicator][data-part-root][data-tone='danger'] {
268
269
  --_ink: var(--slotted-progress-indicator-indicator-color, var(--slotted-tone-danger-text));
269
270
  }
270
271
 
271
- [data-ui='progress-indicator'][data-part='root'][data-buffered] {
272
+ [data-ui-progress-indicator][data-part-root][data-buffered] {
272
273
  --_buffer-color: var(
273
274
  --slotted-progress-indicator-buffer-color,
274
275
  color-mix(in oklab, var(--_ink) 52%, var(--slotted-surface))
@@ -278,21 +279,21 @@
278
279
  /* ── Size ─────────────────────────────────────────────────────────────
279
280
  *
280
281
  * One axis, three geometries. The bar reads a thickness from the space
281
- * scale — 2, 4 and 8 pixels, and M3's own default track is the middle one —
282
+ * scale — 4, 6 and 8 pixels, so no step draws a hairline in a table cell —
282
283
  * while the circle and the loader read the control height scale, so a
283
284
  * spinner standing beside a button is the same height as the button at
284
285
  * every density. Neither needs a scale of this family's own, and the
285
286
  * component layer of the token contract stays as `avatar` left it.
286
287
  */
287
288
 
288
- [data-ui='progress-indicator'][data-part='root'][data-size='sm'] {
289
+ [data-ui-progress-indicator][data-part-root][data-size='sm'] {
289
290
  --_font-size: var(--slotted-control-font-size-sm, 12px);
290
291
  --_text-gap: var(--slotted-space-3, 0.375rem);
291
- --_thickness: var(--slotted-progress-indicator-thickness, var(--slotted-space-1, 0.125rem));
292
+ --_thickness: var(--slotted-progress-indicator-thickness, var(--slotted-space-2, 0.25rem));
292
293
  --_size: var(--slotted-progress-indicator-size, var(--slotted-control-height-sm, 30px));
293
294
  }
294
295
 
295
- [data-ui='progress-indicator'][data-part='root'][data-size='lg'] {
296
+ [data-ui-progress-indicator][data-part-root][data-size='lg'] {
296
297
  --_font-size: var(--slotted-control-font-size-lg, 14px);
297
298
  --_row-gap: var(--slotted-space-4, 0.5rem);
298
299
  --_thickness: var(--slotted-progress-indicator-thickness, var(--slotted-space-4, 0.5rem));
@@ -312,7 +313,7 @@
312
313
  * character, so a grid column sized to its content collapses to that
313
314
  * character.
314
315
  */
315
- [data-ui='progress-indicator'] [data-part='label'] {
316
+ [data-ui-progress-indicator] [data-part-label] {
316
317
  color: var(--slotted-text, CanvasText);
317
318
  min-inline-size: 0;
318
319
  overflow-wrap: break-word;
@@ -325,7 +326,7 @@
325
326
  * is the muted step, because the number annotates the bar rather than
326
327
  * naming it.
327
328
  */
328
- [data-ui='progress-indicator'] [data-part='value'] {
329
+ [data-ui-progress-indicator] [data-part-value] {
329
330
  color: var(--slotted-text-muted, GrayText);
330
331
  font-variant-numeric: tabular-nums;
331
332
  white-space: nowrap;
@@ -343,7 +344,7 @@
343
344
  * inline end, which is the right edge of an English page and the left edge
344
345
  * of an Arabic one, with no mirrored rule to write.
345
346
  */
346
- [data-ui='progress-indicator'][data-part='root'][data-shape='linear'] {
347
+ [data-ui-progress-indicator][data-part-root][data-shape='linear'] {
347
348
  align-items: baseline;
348
349
  column-gap: var(--_text-gap);
349
350
  display: grid;
@@ -351,16 +352,16 @@
351
352
  row-gap: var(--_row-gap);
352
353
  }
353
354
 
354
- [data-ui='progress-indicator'][data-shape='linear'] > [data-part='label'] {
355
+ [data-ui-progress-indicator][data-shape='linear'] > [data-part-label] {
355
356
  grid-column: 1;
356
357
  }
357
358
 
358
- [data-ui='progress-indicator'][data-shape='linear'] > [data-part='value'] {
359
+ [data-ui-progress-indicator][data-shape='linear'] > [data-part-value] {
359
360
  grid-column: 2;
360
361
  justify-self: end;
361
362
  }
362
363
 
363
- [data-ui='progress-indicator'][data-shape='linear'] > [data-part='track'] {
364
+ [data-ui-progress-indicator][data-shape='linear'] > [data-part-track] {
364
365
  grid-column: 1 / -1;
365
366
  }
366
367
 
@@ -378,7 +379,7 @@
378
379
  * block axis has to let a crest out. A single `clip` is what sliced the
379
380
  * crests flat in the first capture of this family.
380
381
  */
381
- [data-ui='progress-indicator'][data-shape='linear'] [data-part='track'] {
382
+ [data-ui-progress-indicator][data-shape='linear'] [data-part-track] {
382
383
  background-color: var(--_buffer-color);
383
384
  block-size: var(--_thickness);
384
385
  border-radius: var(--_radius);
@@ -396,7 +397,7 @@
396
397
  * notch — the shape M3 took in 2024 and the one no other surveyed
397
398
  * implementation draws.
398
399
  */
399
- [data-ui='progress-indicator'][data-shape='linear'] [data-part='track']::before {
400
+ [data-ui-progress-indicator][data-shape='linear'] [data-part-track]::before {
400
401
  background-color: var(--_track-color);
401
402
  border-radius: inherit;
402
403
  content: '';
@@ -412,7 +413,7 @@
412
413
  * and it is the detail that makes a bar at four per cent read as four per
413
414
  * cent of something rather than as a stray mark.
414
415
  */
415
- [data-ui='progress-indicator'][data-shape='linear'] [data-part='track']::after {
416
+ [data-ui-progress-indicator][data-shape='linear'] [data-part-track]::after {
416
417
  background-color: var(--_ink);
417
418
  border-radius: var(--slotted-radius-full, 9999px);
418
419
  content: '';
@@ -422,7 +423,7 @@
422
423
  position: absolute;
423
424
  }
424
425
 
425
- [data-ui='progress-indicator'][data-shape='linear'] [data-part='indicator'] {
426
+ [data-ui-progress-indicator][data-shape='linear'] [data-part-indicator] {
426
427
  background-color: var(--_ink);
427
428
  block-size: 100%;
428
429
  border-radius: inherit;
@@ -445,47 +446,95 @@
445
446
  * way along it. Keyed on the number, it goes when the fill arrives.
446
447
  */
447
448
  @container style(--slotted-progress-indicator-percent: 100) {
448
- [data-ui='progress-indicator'][data-shape='linear'] [data-part='track']::before,
449
- [data-ui='progress-indicator'][data-shape='linear'] [data-part='track']::after {
449
+ [data-ui-progress-indicator][data-shape='linear'] [data-part-track]::before,
450
+ [data-ui-progress-indicator][data-shape='linear'] [data-part-track]::after {
450
451
  content: none;
451
452
  }
452
453
  }
453
454
 
454
455
  /**
455
456
  * Indeterminate: the whole track shows, there is no end to mark, and the
456
- * indicator becomes a short bar travelling the length of it. It is absolutely
457
- * positioned so the travel is one property — the decision the family this
458
- * one replaces recorded, and `inset-inline-start` is why a translation runs
459
- * the way the document reads instead of the way the screen does.
457
+ * indicator becomes a short bar travelling the length of it.
460
458
  */
461
- [data-ui='progress-indicator'][data-shape='linear'][data-indeterminate]
462
- [data-part='track']::before {
459
+ [data-ui-progress-indicator][data-shape='linear'][data-indeterminate] [data-part-track]::before {
463
460
  inset-inline-start: 0;
464
461
  }
465
462
 
466
- [data-ui='progress-indicator'][data-shape='linear'][data-indeterminate]
467
- [data-part='track']::after {
463
+ [data-ui-progress-indicator][data-shape='linear'][data-indeterminate] [data-part-track]::after {
468
464
  content: none;
469
465
  }
470
466
 
471
- [data-ui='progress-indicator'][data-shape='linear'][data-indeterminate] [data-part='indicator'] {
472
- animation: slotted-progress-indicator-travel var(--slotted-duration-loop-slow)
467
+ /**
468
+ * The bar is the whole track, scaled to its length from the inline start
469
+ * and translated along it. `translate` and `scale` are the only properties
470
+ * the animation moves, so the compositor runs it: the bar is the sign that
471
+ * the page is busy, and a bar moved by its inset and its width needed a
472
+ * layout on the main thread every frame and froze under any long task.
473
+ * Two properties with keyframes of their own keep the journey the
474
+ * registered numbers draw for the wavy bar: the travel eases once from end
475
+ * to end, the length swells and shrinks in two steps.
476
+ */
477
+ [data-ui-progress-indicator][data-shape='linear'][data-indeterminate]:not([data-wave])
478
+ [data-part-indicator] {
479
+ animation: slotted-progress-indicator-glide var(--slotted-duration-loop-slow)
473
480
  var(--slotted-easing-standard) infinite;
474
- inline-size: calc(1% * var(--slotted-progress-indicator-travel-size));
481
+ inline-size: 100%;
475
482
  inset-block: 0;
476
- inset-inline-start: calc(1% * var(--slotted-progress-indicator-travel-start));
483
+ inset-inline-start: 0;
477
484
  position: absolute;
485
+ scale: 0.14 1;
486
+ transform-origin: left;
487
+ translate: -14% 0;
488
+ }
489
+
490
+ /* Translation and origin are physical: a right-to-left track runs the
491
+ mirrored journey from its right edge. */
492
+ [data-ui-progress-indicator][data-shape='linear'][data-indeterminate]:not([data-wave])
493
+ [data-part-indicator]:dir(rtl) {
494
+ animation-name: slotted-progress-indicator-glide-rtl;
495
+ transform-origin: right;
496
+ translate: 14% 0;
497
+ }
498
+
499
+ @keyframes slotted-progress-indicator-glide {
500
+ 0% {
501
+ scale: 0.14 1;
502
+ translate: -14% 0;
503
+ }
504
+
505
+ 45% {
506
+ scale: 0.46 1;
507
+ }
508
+
509
+ 100% {
510
+ scale: 0.14 1;
511
+ translate: 100% 0;
512
+ }
513
+ }
514
+
515
+ @keyframes slotted-progress-indicator-glide-rtl {
516
+ 0% {
517
+ scale: 0.14 1;
518
+ translate: 14% 0;
519
+ }
520
+
521
+ 45% {
522
+ scale: 0.46 1;
523
+ }
524
+
525
+ 100% {
526
+ scale: 0.14 1;
527
+ translate: -100% 0;
528
+ }
478
529
  }
479
530
 
480
531
  /**
481
- * A short bar that grows as it crosses and shrinks as it leaves, which is
482
- * M3's disjoint indicator drawn with one bar rather than two. The width
483
- * changes because a bar of constant length reads as a scrollbar being
484
- * dragged; a bar that swells in the middle of its journey reads as
485
- * something in progress.
486
- *
487
- * The keyframes move the two registered numbers rather than the box, so the
488
- * wavy bar can cut its window at the same two numbers.
532
+ * The journey as two registered numbers, for the wavy bar, which cuts a
533
+ * window out of its path at them: a short bar that grows as it crosses and
534
+ * shrinks as it leaves, M3's disjoint indicator drawn with one bar rather
535
+ * than two. The width changes because a bar of constant length reads as a
536
+ * scrollbar being dragged; a bar that swells in the middle of its journey
537
+ * reads as something in progress. `glide` draws the same journey.
489
538
  */
490
539
  @keyframes slotted-progress-indicator-travel {
491
540
  0% {
@@ -514,7 +563,7 @@
514
563
  * The stacking layer is a token, so an application's own stacking contract
515
564
  * still decides. Every router progress bar in the field types a number here.
516
565
  */
517
- [data-ui='progress-indicator'][data-part='root'][data-placement='page'] {
566
+ [data-ui-progress-indicator][data-part-root][data-placement='page'] {
518
567
  --_radius: var(--slotted-progress-indicator-radius, var(--slotted-radius-none, 0px));
519
568
  --_track-color: var(--slotted-progress-indicator-track-color, transparent);
520
569
  --_gap: var(--slotted-progress-indicator-gap, 0);
@@ -525,7 +574,7 @@
525
574
  z-index: var(--slotted-z-index-sticky, 100);
526
575
  }
527
576
 
528
- [data-ui='progress-indicator'][data-placement='page'] [data-part='track']::after {
577
+ [data-ui-progress-indicator][data-placement='page'] [data-part-track]::after {
529
578
  content: none;
530
579
  }
531
580
 
@@ -547,7 +596,7 @@
547
596
  * the edge. `app-shell` writes it for a content region that scrolls with
548
597
  * the document. It is a composition value, not a design token.
549
598
  */
550
- [data-ui='progress-indicator'][data-part='root']:is(
599
+ [data-ui-progress-indicator][data-part-root]:is(
551
600
  [data-placement='edge-start'],
552
601
  [data-placement='edge-end']
553
602
  ) {
@@ -559,16 +608,16 @@
559
608
  position: var(--slotted-progress-indicator-position, absolute);
560
609
  }
561
610
 
562
- [data-ui='progress-indicator'][data-part='root'][data-placement='edge-start'] {
611
+ [data-ui-progress-indicator][data-part-root][data-placement='edge-start'] {
563
612
  inset-block-start: 0;
564
613
  }
565
614
 
566
- [data-ui='progress-indicator'][data-part='root'][data-placement='edge-end'] {
615
+ [data-ui-progress-indicator][data-part-root][data-placement='edge-end'] {
567
616
  inset-block-end: 0;
568
617
  }
569
618
 
570
- [data-ui='progress-indicator']:is([data-placement='edge-start'], [data-placement='edge-end'])
571
- [data-part='track']::after {
619
+ [data-ui-progress-indicator]:is([data-placement='edge-start'], [data-placement='edge-end'])
620
+ [data-part-track]::after {
572
621
  content: none;
573
622
  }
574
623
 
@@ -595,7 +644,7 @@
595
644
  * back into its edge rather than on the frame it is asked to. The theme
596
645
  * collapses both steps under `prefers-reduced-motion`.
597
646
  */
598
- [data-ui='progress-indicator'][data-part='root']:is(
647
+ [data-ui-progress-indicator][data-part-root]:is(
599
648
  [data-placement='page'],
600
649
  [data-placement='edge-start'],
601
650
  [data-placement='edge-end']
@@ -615,11 +664,11 @@
615
664
  }
616
665
  }
617
666
 
618
- [data-ui='progress-indicator'][data-part='root'][data-placement='edge-end'] {
667
+ [data-ui-progress-indicator][data-part-root][data-placement='edge-end'] {
619
668
  --_withdrawn: inset(100% 0 0 0);
620
669
  }
621
670
 
622
- [data-ui='progress-indicator'][data-part='root']:is(
671
+ [data-ui-progress-indicator][data-part-root]:is(
623
672
  [data-placement='page'],
624
673
  [data-placement='edge-start'],
625
674
  [data-placement='edge-end']
@@ -641,8 +690,8 @@
641
690
  * centred in it would be four-pixel type. Ant Design and MUI both put it
642
691
  * inside because both draw rings twice this size.
643
692
  */
644
- [data-ui='progress-indicator'][data-part='root'][data-shape='circular'],
645
- [data-ui='progress-indicator'][data-part='root'][data-shape='morph'] {
693
+ [data-ui-progress-indicator][data-part-root][data-shape='circular'],
694
+ [data-ui-progress-indicator][data-part-root][data-shape='morph'] {
646
695
  align-items: center;
647
696
  column-gap: var(--_text-gap);
648
697
  display: inline-flex;
@@ -656,7 +705,7 @@
656
705
  * and this family's circle are the same object, and Button can stop drawing
657
706
  * its own.
658
707
  */
659
- [data-ui='progress-indicator'][data-shape='circular'] svg {
708
+ [data-ui-progress-indicator][data-shape='circular'] svg {
660
709
  --_stroke: var(--slotted-progress-indicator-stroke, 6);
661
710
 
662
711
  block-size: var(--_size);
@@ -668,8 +717,8 @@
668
717
  rotate: -90deg;
669
718
  }
670
719
 
671
- [data-ui='progress-indicator'][data-shape='circular'] [data-part='track'],
672
- [data-ui='progress-indicator'][data-shape='circular'] [data-part='indicator'] {
720
+ [data-ui-progress-indicator][data-shape='circular'] [data-part-track],
721
+ [data-ui-progress-indicator][data-shape='circular'] [data-part-indicator] {
673
722
  fill: none;
674
723
  stroke-linecap: round;
675
724
  stroke-width: var(--_stroke);
@@ -679,7 +728,7 @@
679
728
  it by a second smoothing. */
680
729
  }
681
730
 
682
- [data-ui='progress-indicator'][data-shape='circular'] [data-part='indicator'] {
731
+ [data-ui-progress-indicator][data-shape='circular'] [data-part-indicator] {
683
732
  stroke: var(--_ink);
684
733
  stroke-dasharray: var(--_percent) 100;
685
734
  /**
@@ -697,7 +746,7 @@
697
746
  * path is four device pixels of a 44-pixel ring, which is the gap M3
698
747
  * specifies for the bar.
699
748
  */
700
- [data-ui='progress-indicator'][data-shape='circular'] [data-part='track'] {
749
+ [data-ui-progress-indicator][data-shape='circular'] [data-part-track] {
701
750
  /**
702
751
  * Three and two tenths of the path is four device pixels of a 44-pixel
703
752
  * ring, and it collapses to nothing at nought per cent by the same clamp
@@ -719,7 +768,7 @@
719
768
  * travel, not the stated value.
720
769
  */
721
770
  @container style(--slotted-progress-indicator-percent: 100) {
722
- [data-ui='progress-indicator'][data-shape='circular'] [data-part='track'] {
771
+ [data-ui-progress-indicator][data-shape='circular'] [data-part-track] {
723
772
  stroke: transparent;
724
773
  }
725
774
  }
@@ -734,16 +783,15 @@
734
783
  * do not divide into each other, so the sweep never repeats the same shape
735
784
  * in the same orientation.
736
785
  */
737
- [data-ui='progress-indicator'][data-shape='circular'][data-indeterminate] [data-part='track'] {
786
+ [data-ui-progress-indicator][data-shape='circular'][data-indeterminate] [data-part-track] {
738
787
  stroke: transparent;
739
788
  }
740
789
 
741
- [data-ui='progress-indicator'][data-shape='circular'][data-indeterminate] svg {
790
+ [data-ui-progress-indicator][data-shape='circular'][data-indeterminate] svg {
742
791
  animation: slotted-progress-indicator-turn var(--slotted-duration-loop) linear infinite;
743
792
  }
744
793
 
745
- [data-ui='progress-indicator'][data-shape='circular'][data-indeterminate]
746
- [data-part='indicator'] {
794
+ [data-ui-progress-indicator][data-shape='circular'][data-indeterminate] [data-part-indicator] {
747
795
  animation: slotted-progress-indicator-sweep var(--slotted-duration-loop-slow)
748
796
  var(--slotted-easing-standard) infinite;
749
797
  stroke-opacity: 1;
@@ -817,7 +865,7 @@
817
865
  * at fast and slow loads, and the geometry below carries the sign once per
818
866
  * shape.
819
867
  */
820
- [data-ui='progress-indicator'][data-part='root'][data-wave] {
868
+ [data-ui-progress-indicator][data-part-root][data-wave] {
821
869
  --slotted-progress-indicator-wave-amplitude: min(
822
870
  clamp(0, calc((var(--_percent) - 6) / 10), 1),
823
871
  clamp(0, calc((96 - var(--_percent)) / 12), 1)
@@ -831,7 +879,7 @@
831
879
  * throughout, which is what M3 draws: `hasWavyEffect(isDeterminate)` is the
832
880
  * flag that separates the two.
833
881
  */
834
- [data-ui='progress-indicator'][data-part='root'][data-wave][data-indeterminate] {
882
+ [data-ui-progress-indicator][data-part-root][data-wave][data-indeterminate] {
835
883
  --slotted-progress-indicator-wave-amplitude: 1;
836
884
  }
837
885
 
@@ -861,12 +909,12 @@
861
909
  * container the path measures itself against: `cqi` is how a dash stated in
862
910
  * thicknesses learns how many thicknesses the track is.
863
911
  */
864
- [data-ui='progress-indicator'][data-shape='linear'][data-wave] [data-part='track'] {
912
+ [data-ui-progress-indicator][data-shape='linear'][data-wave] [data-part-track] {
865
913
  container-type: inline-size;
866
914
  margin-block: calc(0.75 * var(--_thickness));
867
915
  }
868
916
 
869
- [data-ui='progress-indicator'][data-shape='linear'][data-wave] [data-part='indicator'] {
917
+ [data-ui-progress-indicator][data-shape='linear'][data-wave] [data-part-indicator] {
870
918
  /** One wavelength, in thicknesses. */
871
919
  --_wave-length: 10;
872
920
 
@@ -887,7 +935,7 @@
887
935
  * anchored to the inline start, and its centre is the one point that stays
888
936
  * inside the track.
889
937
  */
890
- [data-ui='progress-indicator'][data-shape='linear'][data-wave] [data-part='indicator']:dir(rtl) {
938
+ [data-ui-progress-indicator][data-shape='linear'][data-wave] [data-part-indicator]:dir(rtl) {
891
939
  transform: scaleX(-1);
892
940
  }
893
941
 
@@ -914,7 +962,7 @@
914
962
  * one thickness, and at nought it is not painted at all, by the same clamp
915
963
  * the ring uses on its own cap.
916
964
  */
917
- [data-ui='progress-indicator'][data-shape='linear'][data-wave] [data-part='indicator'] path {
965
+ [data-ui-progress-indicator][data-shape='linear'][data-wave] [data-part-indicator] path {
918
966
  /** The track's length, in thicknesses: a ratio of two lengths, read as a number. */
919
967
  --_track-units: tan(atan2(100cqi, var(--_thickness)));
920
968
  --_window-start: 0;
@@ -940,8 +988,8 @@
940
988
  * says at every moment of the fill's own transition. An indeterminate bar
941
989
  * carries a different path and is left to the markup.
942
990
  */
943
- [data-ui='progress-indicator'][data-shape='linear'][data-wave]:not([data-indeterminate])
944
- [data-part='indicator']
991
+ [data-ui-progress-indicator][data-shape='linear'][data-wave]:not([data-indeterminate])
992
+ [data-part-indicator]
945
993
  path {
946
994
  animation: slotted-progress-indicator-flatten-bar var(--_scrub) var(--_taper) both paused;
947
995
  animation-delay: calc(
@@ -954,16 +1002,16 @@
954
1002
  * is unknown — `IndeterminateActiveWaveWavelength` — so the markup carries
955
1003
  * the tighter path, and the window is the travelling bar's own two numbers.
956
1004
  */
957
- [data-ui='progress-indicator'][data-shape='linear'][data-wave][data-indeterminate]
958
- [data-part='indicator'] {
1005
+ [data-ui-progress-indicator][data-shape='linear'][data-wave][data-indeterminate]
1006
+ [data-part-indicator] {
959
1007
  --_wave-length: 5;
960
1008
 
961
1009
  animation: slotted-progress-indicator-travel var(--slotted-duration-loop-slow)
962
1010
  var(--slotted-easing-standard) infinite;
963
1011
  }
964
1012
 
965
- [data-ui='progress-indicator'][data-shape='linear'][data-wave][data-indeterminate]
966
- [data-part='indicator']
1013
+ [data-ui-progress-indicator][data-shape='linear'][data-wave][data-indeterminate]
1014
+ [data-part-indicator]
967
1015
  path {
968
1016
  --_window-start: var(--slotted-progress-indicator-travel-start);
969
1017
  --_window-size: var(--slotted-progress-indicator-travel-size);
@@ -983,7 +1031,7 @@
983
1031
  * wavy keeps its weight, and the crest may pass the viewBox by the tenth of
984
1032
  * a unit the stroke needs.
985
1033
  */
986
- [data-ui='progress-indicator'][data-shape='circular'][data-wave] svg {
1034
+ [data-ui-progress-indicator][data-shape='circular'][data-wave] svg {
987
1035
  --_stroke: var(--slotted-progress-indicator-stroke, 5);
988
1036
 
989
1037
  block-size: calc(1.2 * var(--_size));
@@ -1009,7 +1057,7 @@
1009
1057
  * far end fell into the gap as the pattern shifted, and a full ring opened
1010
1058
  * a hole at twelve o'clock.
1011
1059
  */
1012
- [data-ui='progress-indicator'][data-shape='circular'][data-wave] [data-part='indicator'] {
1060
+ [data-ui-progress-indicator][data-shape='circular'][data-wave] [data-part-indicator] {
1013
1061
  rotate: calc(-45deg * var(--slotted-progress-indicator-wave-phase));
1014
1062
  stroke-dasharray: var(--_percent) calc(100 - var(--_percent));
1015
1063
  stroke-dashoffset: calc(-12.5 * var(--slotted-progress-indicator-wave-phase));
@@ -1019,8 +1067,8 @@
1019
1067
  transform-origin: 50% 50%;
1020
1068
  }
1021
1069
 
1022
- [data-ui='progress-indicator'][data-shape='circular'][data-wave]:not([data-indeterminate])
1023
- [data-part='indicator'] {
1070
+ [data-ui-progress-indicator][data-shape='circular'][data-wave]:not([data-indeterminate])
1071
+ [data-part-indicator] {
1024
1072
  animation: slotted-progress-indicator-flatten-ring var(--_scrub) var(--_taper) both paused;
1025
1073
  animation-delay: calc(
1026
1074
  -1 * var(--_scrub) * (1 - var(--slotted-progress-indicator-wave-amplitude))
@@ -1045,7 +1093,7 @@
1045
1093
  * each pair must share a command list, and `progress.test.ts` holds both
1046
1094
  * copies to `@slotted/core/progress`.
1047
1095
  */
1048
- [data-ui='progress-indicator'][data-part='root'][data-wave] {
1096
+ [data-ui-progress-indicator][data-part-root][data-wave] {
1049
1097
  --_scrub: var(--slotted-duration-long);
1050
1098
  --_taper: cubic-bezier(0.45, 0, 0.55, 1);
1051
1099
  }
@@ -1089,7 +1137,7 @@
1089
1137
  * never shows the same shape in the same orientation twice — which is what
1090
1138
  * makes a five-second wait bearable to watch and a spinning ring not.
1091
1139
  */
1092
- [data-ui='progress-indicator'][data-shape='morph'] [data-part='track'] {
1140
+ [data-ui-progress-indicator][data-shape='morph'] [data-part-track] {
1093
1141
  block-size: var(--_size);
1094
1142
  border-radius: var(--slotted-radius-full, 9999px);
1095
1143
  display: grid;
@@ -1105,7 +1153,7 @@
1105
1153
  * pair the bar's own track holds and clears the 3:1 the loading indicator
1106
1154
  * documentation asks for between a contained shape and its container.
1107
1155
  */
1108
- [data-ui='progress-indicator'][data-shape='morph'][data-contained] [data-part='track'] {
1156
+ [data-ui-progress-indicator][data-shape='morph'][data-contained] [data-part-track] {
1109
1157
  background-color: var(--_track-color);
1110
1158
  }
1111
1159
 
@@ -1136,7 +1184,7 @@
1136
1184
  * each target and settle. Both animations take it, at the same period and on
1137
1185
  * the same keyframe boundaries, because in M3 they are one spring.
1138
1186
  */
1139
- [data-ui='progress-indicator'][data-shape='morph'] [data-part='track'] {
1187
+ [data-ui-progress-indicator][data-shape='morph'] [data-part-track] {
1140
1188
  animation: slotted-progress-indicator-drift calc(2 * var(--slotted-duration-loop-slow)) linear
1141
1189
  infinite;
1142
1190
  }
@@ -1150,7 +1198,7 @@
1150
1198
  * hurry, and a multiple of one inherits that where a fourth token would be a
1151
1199
  * scale step added for a single family.
1152
1200
  */
1153
- [data-ui='progress-indicator'][data-shape='morph'] [data-part='indicator'] {
1201
+ [data-ui-progress-indicator][data-shape='morph'] [data-part-indicator] {
1154
1202
  animation:
1155
1203
  slotted-progress-indicator-morph calc(2 * var(--slotted-duration-loop-slow))
1156
1204
  var(--slotted-easing-emphasized) infinite,
@@ -1176,7 +1224,7 @@
1176
1224
  * pixels. `round()` is what states that, and it states it once for the three
1177
1225
  * steps rather than as three numbers.
1178
1226
  */
1179
- [data-ui='progress-indicator'][data-shape='morph'][data-contained] [data-part='indicator'] {
1227
+ [data-ui-progress-indicator][data-shape='morph'][data-contained] [data-part-indicator] {
1180
1228
  --_shape: round(nearest, calc(0.79 * var(--_size)), 2px);
1181
1229
 
1182
1230
  block-size: var(--_shape);
@@ -1468,10 +1516,10 @@
1468
1516
  * `path` is left out: the wave's paths carry the paused ramp below, which
1469
1517
  * is a value and survives.
1470
1518
  */
1471
- [data-ui='progress-indicator'][data-part='root'],
1472
- [data-ui='progress-indicator'] [data-part='indicator']:not(path),
1473
- [data-ui='progress-indicator'] [data-part='track'],
1474
- [data-ui='progress-indicator'] svg {
1519
+ [data-ui-progress-indicator][data-part-root],
1520
+ [data-ui-progress-indicator] [data-part-indicator]:not(path),
1521
+ [data-ui-progress-indicator] [data-part-track],
1522
+ [data-ui-progress-indicator] svg {
1475
1523
  animation: none !important;
1476
1524
  }
1477
1525
 
@@ -1481,19 +1529,28 @@
1481
1529
  * than as a value: pinned to either end it would read as nought per cent
1482
1530
  * or as a hundred, which is a number this indicator does not have.
1483
1531
  */
1484
- [data-ui='progress-indicator'][data-shape='linear'][data-indeterminate]
1485
- [data-part='indicator'] {
1532
+ [data-ui-progress-indicator][data-shape='linear'][data-indeterminate] [data-part-indicator] {
1486
1533
  --slotted-progress-indicator-travel-size: 46;
1487
1534
  --slotted-progress-indicator-travel-start: 27;
1488
1535
  }
1489
1536
 
1537
+ [data-ui-progress-indicator][data-shape='linear'][data-indeterminate]:not([data-wave])
1538
+ [data-part-indicator] {
1539
+ scale: 0.46 1;
1540
+ translate: 27% 0;
1541
+ }
1542
+
1543
+ [data-ui-progress-indicator][data-shape='linear'][data-indeterminate]:not([data-wave])
1544
+ [data-part-indicator]:dir(rtl) {
1545
+ translate: -27% 0;
1546
+ }
1547
+
1490
1548
  /**
1491
1549
  * The same question for the arc, and the same answer: a third of the ring
1492
1550
  * is unmistakably a fraction of something rather than a full circle or an
1493
1551
  * empty one.
1494
1552
  */
1495
- [data-ui='progress-indicator'][data-shape='circular'][data-indeterminate]
1496
- [data-part='indicator'] {
1553
+ [data-ui-progress-indicator][data-shape='circular'][data-indeterminate] [data-part-indicator] {
1497
1554
  stroke-dasharray: 34 100;
1498
1555
  }
1499
1556
 
@@ -1502,7 +1559,7 @@
1502
1559
  * range survives, because it is a value rather than motion: a ring at four
1503
1560
  * per cent is a circle whether or not anything moves.
1504
1561
  */
1505
- [data-ui='progress-indicator'][data-part='root'][data-wave] {
1562
+ [data-ui-progress-indicator][data-part-root][data-wave] {
1506
1563
  animation: none;
1507
1564
  }
1508
1565
  }
@@ -1524,14 +1581,14 @@
1524
1581
  * with it, and a gap is a refinement rather than a meaning.
1525
1582
  */
1526
1583
  @media (forced-colors: active) {
1527
- [data-ui='progress-indicator'][data-shape='linear'] [data-part='track'] {
1584
+ [data-ui-progress-indicator][data-shape='linear'] [data-part-track] {
1528
1585
  background-color: Canvas;
1529
1586
  outline: var(--slotted-border-width-thin, 1px) solid ButtonBorder;
1530
1587
  outline-offset: calc(-1 * var(--slotted-border-width-thin, 1px));
1531
1588
  }
1532
1589
 
1533
- [data-ui='progress-indicator'][data-shape='linear'] [data-part='track']::before,
1534
- [data-ui='progress-indicator'][data-shape='linear'] [data-part='track']::after {
1590
+ [data-ui-progress-indicator][data-shape='linear'] [data-part-track]::before,
1591
+ [data-ui-progress-indicator][data-shape='linear'] [data-part-track]::after {
1535
1592
  content: none;
1536
1593
  }
1537
1594
 
@@ -1540,13 +1597,13 @@
1540
1597
  * draws its edge in a system colour, and an outline here would be a
1541
1598
  * second line beside the first.
1542
1599
  */
1543
- [data-ui='progress-indicator']:is([data-placement='edge-start'], [data-placement='edge-end'])
1544
- [data-part='track'] {
1600
+ [data-ui-progress-indicator]:is([data-placement='edge-start'], [data-placement='edge-end'])
1601
+ [data-part-track] {
1545
1602
  background-color: transparent;
1546
1603
  outline: none;
1547
1604
  }
1548
1605
 
1549
- [data-ui='progress-indicator'] [data-part='indicator'] {
1606
+ [data-ui-progress-indicator] [data-part-indicator] {
1550
1607
  background-color: Highlight;
1551
1608
  }
1552
1609
 
@@ -1555,20 +1612,20 @@
1555
1612
  * way the ring does: the box behind it stays clear and the path takes
1556
1613
  * the highlight.
1557
1614
  */
1558
- [data-ui='progress-indicator'][data-shape='linear'][data-wave] [data-part='indicator'] {
1615
+ [data-ui-progress-indicator][data-shape='linear'][data-wave] [data-part-indicator] {
1559
1616
  background-color: transparent;
1560
1617
  }
1561
1618
 
1562
- [data-ui='progress-indicator'][data-shape='linear'][data-wave] [data-part='indicator'] path {
1619
+ [data-ui-progress-indicator][data-shape='linear'][data-wave] [data-part-indicator] path {
1563
1620
  stroke: Highlight;
1564
1621
  }
1565
1622
 
1566
- [data-ui='progress-indicator'][data-shape='circular'] [data-part='indicator'] {
1623
+ [data-ui-progress-indicator][data-shape='circular'] [data-part-indicator] {
1567
1624
  background-color: transparent;
1568
1625
  stroke: Highlight;
1569
1626
  }
1570
1627
 
1571
- [data-ui='progress-indicator'][data-shape='circular'] [data-part='track'] {
1628
+ [data-ui-progress-indicator][data-shape='circular'] [data-part-track] {
1572
1629
  stroke: ButtonBorder;
1573
1630
  }
1574
1631
 
@@ -1577,7 +1634,7 @@
1577
1634
  * loader exists — and loses the container behind it, which in a forced
1578
1635
  * palette would be a `Canvas` disc on a `Canvas` page.
1579
1636
  */
1580
- [data-ui='progress-indicator'][data-shape='morph'][data-contained] [data-part='track'] {
1637
+ [data-ui-progress-indicator][data-shape='morph'][data-contained] [data-part-track] {
1581
1638
  background-color: Canvas;
1582
1639
  }
1583
1640
  }