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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +31 -32
  4. package/src/action-sheet/action-sheet.css +36 -36
  5. package/src/alert/alert.css +43 -35
  6. package/src/alert/alert.tokens.json +5 -0
  7. package/src/app-shell/app-shell.css +356 -301
  8. package/src/aspect-ratio/aspect-ratio.css +9 -9
  9. package/src/attachment/attachment.css +91 -99
  10. package/src/avatar/avatar.css +71 -41
  11. package/src/avatar/avatar.tokens.json +7 -0
  12. package/src/avatar-group/avatar-group.css +21 -22
  13. package/src/badge/badge.css +45 -37
  14. package/src/badge/badge.tokens.json +5 -0
  15. package/src/breadcrumb/breadcrumb.css +37 -37
  16. package/src/button/button.css +139 -64
  17. package/src/button/button.tokens.json +10 -0
  18. package/src/button-group/button-group.css +76 -72
  19. package/src/button-group/button-group.tokens.json +2 -0
  20. package/src/calendar/calendar.css +93 -103
  21. package/src/card/card.css +54 -61
  22. package/src/carousel/carousel.css +150 -161
  23. package/src/cascader/cascader.css +152 -153
  24. package/src/cascader/cascader.tokens.json +1 -0
  25. package/src/chart/chart.css +242 -239
  26. package/src/chart/chart.tokens.json +1 -0
  27. package/src/checkbox/checkbox.css +119 -124
  28. package/src/checkbox-group/checkbox-group.css +7 -7
  29. package/src/code-block/code-block.css +81 -85
  30. package/src/collapsible/collapsible.css +69 -76
  31. package/src/color-picker/color-picker.css +83 -91
  32. package/src/column-manager/column-manager.css +106 -114
  33. package/src/combobox/combobox.css +132 -107
  34. package/src/combobox/combobox.tokens.json +1 -0
  35. package/src/command-palette/command-palette.css +84 -90
  36. package/src/container/container.css +24 -24
  37. package/src/context-menu/context-menu.css +8 -8
  38. package/src/currency-field/currency-field.css +210 -88
  39. package/src/currency-field/currency-field.tokens.json +13 -0
  40. package/src/dashboard-grid/dashboard-grid.css +148 -116
  41. package/src/data-grid/data-grid.css +504 -469
  42. package/src/data-grid/data-grid.tokens.json +2 -0
  43. package/src/data-list/data-list.css +81 -70
  44. package/src/data-list/data-list.tokens.json +2 -1
  45. package/src/date-field/date-field.css +55 -52
  46. package/src/date-field/date-field.tokens.json +1 -0
  47. package/src/date-picker/date-picker.css +40 -42
  48. package/src/date-range-picker/date-range-picker.css +114 -118
  49. package/src/datetime-field/datetime-field.css +78 -80
  50. package/src/datetime-field/datetime-field.tokens.json +1 -0
  51. package/src/datetime-picker/datetime-picker.css +61 -63
  52. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  53. package/src/description-list/description-list.css +61 -64
  54. package/src/detail-panel/detail-panel.css +70 -70
  55. package/src/dialog/dialog.css +334 -153
  56. package/src/dialog/dialog.tokens.json +5 -0
  57. package/src/divider/divider.css +18 -18
  58. package/src/drawer/drawer.css +186 -209
  59. package/src/entity-picker/entity-picker.css +238 -241
  60. package/src/entity-picker/entity-picker.tokens.json +1 -0
  61. package/src/event-calendar/event-calendar.css +343 -385
  62. package/src/field/field.css +74 -78
  63. package/src/field-group/field-group.css +22 -25
  64. package/src/filter-bar/filter-bar.css +193 -209
  65. package/src/form/form.css +34 -24
  66. package/src/form/form.tokens.json +1 -0
  67. package/src/fullscreen/fullscreen.css +24 -25
  68. package/src/grid/grid.css +28 -28
  69. package/src/highlight/highlight.css +6 -6
  70. package/src/hover-card/hover-card.css +6 -6
  71. package/src/icon/icon.css +19 -15
  72. package/src/icon/icon.tokens.json +1 -0
  73. package/src/image/image.css +39 -39
  74. package/src/import-export-center/import-export-center.css +135 -156
  75. package/src/inline/inline.css +27 -27
  76. package/src/inline-message/inline-message.css +52 -28
  77. package/src/inline-message/inline-message.tokens.json +4 -0
  78. package/src/kbd/kbd.css +30 -26
  79. package/src/link/link.css +15 -15
  80. package/src/list/list.css +44 -17
  81. package/src/list/list.tokens.json +4 -0
  82. package/src/list-item/list-item.css +80 -66
  83. package/src/list-item/list-item.tokens.json +7 -0
  84. package/src/listbox/listbox.css +56 -59
  85. package/src/loading-overlay/loading-overlay.css +75 -92
  86. package/src/markdown/markdown.css +17 -17
  87. package/src/menu/menu.css +83 -63
  88. package/src/menubar/menubar.css +13 -13
  89. package/src/message/message.css +182 -202
  90. package/src/message/message.tokens.json +5 -0
  91. package/src/message-scroller/message-scroller.css +41 -42
  92. package/src/multi-select/multi-select.css +152 -145
  93. package/src/multi-select/multi-select.tokens.json +1 -0
  94. package/src/navigation-menu/navigation-menu.css +167 -188
  95. package/src/notification-center/notification-center.css +140 -148
  96. package/src/notification-center/notification-center.tokens.json +3 -0
  97. package/src/number-field/number-field.css +84 -83
  98. package/src/number-field/number-field.tokens.json +1 -0
  99. package/src/otp-input/otp-input.css +67 -57
  100. package/src/otp-input/otp-input.tokens.json +1 -0
  101. package/src/page/page.css +23 -23
  102. package/src/page-header/page-header.css +268 -281
  103. package/src/page-header/page-header.tokens.json +1 -0
  104. package/src/pagination/pagination.css +68 -72
  105. package/src/popover/popover.css +40 -49
  106. package/src/progress-indicator/progress-indicator.css +177 -120
  107. package/src/progress-indicator/progress-indicator.tokens.json +1 -1
  108. package/src/prompt-composer/prompt-composer.css +221 -102
  109. package/src/prompt-composer/prompt-composer.tokens.json +15 -0
  110. package/src/prose/prose.css +71 -75
  111. package/src/radio-group/radio-group.css +98 -103
  112. package/src/rating/rating.css +136 -132
  113. package/src/rating/rating.tokens.json +1 -0
  114. package/src/result-state/result-state.css +74 -77
  115. package/src/runtime-properties.mjs +2 -0
  116. package/src/saved-views/saved-views.css +41 -47
  117. package/src/scroll-area/scroll-area.css +39 -32
  118. package/src/section/section.css +161 -41
  119. package/src/section/section.tokens.json +7 -2
  120. package/src/segmented-control/segmented-control.css +254 -97
  121. package/src/segmented-control/segmented-control.tokens.json +15 -11
  122. package/src/select/select.css +118 -117
  123. package/src/select/select.tokens.json +1 -0
  124. package/src/side-navigation/side-navigation.css +179 -182
  125. package/src/side-navigation/side-navigation.tokens.json +1 -0
  126. package/src/skeleton/skeleton.css +47 -48
  127. package/src/slider/slider.css +86 -88
  128. package/src/sparkline/sparkline.css +62 -40
  129. package/src/sparkline/sparkline.tokens.json +2 -0
  130. package/src/spinner/spinner.css +39 -182
  131. package/src/spinner/spinner.tokens.json +0 -2
  132. package/src/split-button/split-button.css +30 -31
  133. package/src/split-button/split-button.tokens.json +1 -0
  134. package/src/splitter/splitter.css +35 -35
  135. package/src/stack/stack.css +24 -24
  136. package/src/stat-card/stat-card.css +341 -224
  137. package/src/stat-card/stat-card.tokens.json +3 -0
  138. package/src/status-indicator/status-indicator.css +28 -28
  139. package/src/stepper/stepper.css +58 -62
  140. package/src/switch/switch.css +86 -92
  141. package/src/table/table.css +310 -165
  142. package/src/table/table.tokens.json +6 -0
  143. package/src/table-of-contents/table-of-contents.css +51 -54
  144. package/src/tabs/tabs.css +330 -302
  145. package/src/tabs/tabs.tokens.json +8 -5
  146. package/src/tag/tag.css +79 -71
  147. package/src/tag/tag.tokens.json +9 -0
  148. package/src/tags-input/tags-input.css +145 -82
  149. package/src/tags-input/tags-input.tokens.json +7 -1
  150. package/src/text-field/text-field.css +132 -136
  151. package/src/text-field/text-field.tokens.json +1 -0
  152. package/src/textarea/textarea.css +31 -28
  153. package/src/textarea/textarea.tokens.json +1 -0
  154. package/src/time-field/time-field.css +72 -69
  155. package/src/time-field/time-field.tokens.json +1 -0
  156. package/src/time-picker/time-picker.css +56 -58
  157. package/src/time-range-picker/time-range-picker.css +126 -133
  158. package/src/timeline/timeline.css +254 -266
  159. package/src/timeline/timeline.tokens.json +5 -0
  160. package/src/toast/toast.css +89 -90
  161. package/src/toast/toast.tokens.json +5 -0
  162. package/src/toggle/toggle.css +62 -25
  163. package/src/toggle/toggle.tokens.json +8 -0
  164. package/src/toggle-group/toggle-group.css +106 -60
  165. package/src/toggle-group/toggle-group.tokens.json +10 -0
  166. package/src/toolbar/toolbar.css +30 -35
  167. package/src/tooltip/tooltip.css +26 -26
  168. package/src/top-navigation/top-navigation.css +243 -259
  169. package/src/tour/tour.css +51 -60
  170. package/src/transfer/transfer.css +160 -164
  171. package/src/tree/tree.css +103 -111
  172. package/src/typography/typography.css +40 -36
  173. package/src/typography/typography.tokens.json +1 -0
  174. package/src/upload/upload.css +224 -224
  175. package/src/visually-hidden/visually-hidden.css +1 -1
  176. package/src/wizard/wizard.css +185 -197
@@ -14,7 +14,7 @@
14
14
  * order is the browser's locale rather than the application's. The value
15
15
  * reaches a form through a hidden input carrying `HH:mm:ss`.
16
16
  */
17
- [data-ui='time-field'][data-part='root'] {
17
+ [data-ui-time-field][data-part-root] {
18
18
  /**
19
19
  * Type, height, inline padding, gap and glyph size come from the control
20
20
  * scales — the only ones the theme restates per density — so a time in a
@@ -70,7 +70,7 @@
70
70
  * begin from it — the arithmetic `text-field` records, holding at every step
71
71
  * and every density.
72
72
  */
73
- [data-ui='time-field'][data-part='root']:has(> [data-part='clear']:last-child) {
73
+ [data-ui-time-field][data-part-root]:has(> [data-part-clear]:last-child) {
74
74
  padding-inline-end: max(
75
75
  0px,
76
76
  calc(var(--_padding-inline) - (var(--_action-size) - var(--_icon-size)) / 2)
@@ -82,7 +82,7 @@
82
82
  * and puts the time at the reading edge, so an empty field and a full one
83
83
  * start in the same place.
84
84
  */
85
- [data-ui='time-field'] [data-part='segments'] {
85
+ [data-ui-time-field] [data-part-segments] {
86
86
  align-items: center;
87
87
  /* It says what it is before it is pressed. A time is typed, so the pointer
88
88
  over it is a caret — and the row rather than only the segments, because
@@ -124,7 +124,7 @@
124
124
  * the document — which is the reason every other family in this library
125
125
  * reaches for it too.
126
126
  */
127
- [data-ui='time-field'] [data-part='segments']:dir(rtl) {
127
+ [data-ui-time-field] [data-part-segments]:dir(rtl) {
128
128
  justify-content: flex-end;
129
129
  }
130
130
 
@@ -135,7 +135,7 @@
135
135
  * single digit becomes two: `1ch` is the advance of a digit in a tabular
136
136
  * face, and `--_digits` is how many the field can hold.
137
137
  */
138
- [data-ui='time-field'] [data-part='segment'] {
138
+ [data-ui-time-field] [data-part-segment] {
139
139
  --_digits: 2;
140
140
 
141
141
  background-color: transparent;
@@ -175,7 +175,7 @@
175
175
  * digit face is dropped here for the same reason: tabular figures inside a
176
176
  * word letter-space it.
177
177
  */
178
- [data-ui='time-field'] [data-part='segment'][data-field='dayPeriod'] {
178
+ [data-ui-time-field] [data-part-segment][data-field='dayPeriod'] {
179
179
  font-variant-numeric: normal;
180
180
  min-inline-size: var(--slotted-time-field-period-min-inline-size, 2ch);
181
181
  /* An abbreviation, in whatever case the locale itself writes it. */
@@ -188,7 +188,7 @@
188
188
  * placeholder is the format — `hh:mm` in the reader's own words rather than
189
189
  * in English — and a time being typed has to keep saying what is missing.
190
190
  */
191
- [data-ui='time-field'] [data-part='segment'][data-placeholder] {
191
+ [data-ui-time-field] [data-part-segment][data-placeholder] {
192
192
  color: var(--slotted-time-field-placeholder-color, var(--slotted-text-muted, GrayText));
193
193
  }
194
194
 
@@ -197,7 +197,7 @@
197
197
  * name already carries the whole time in words, so a screen reader reading
198
198
  * "colon" between two numbers would be reading punctuation aloud.
199
199
  */
200
- [data-ui='time-field'] [data-part='literal'] {
200
+ [data-ui-time-field] [data-part-literal] {
201
201
  color: var(--slotted-time-field-literal-color, var(--slotted-text-muted, GrayText));
202
202
  flex: 0 0 auto;
203
203
  /* Its own bidi run: a colon between two numbers takes the paragraph's
@@ -216,7 +216,7 @@
216
216
  * It is a real `input`, so a mobile keyboard opens and the platform supplies
217
217
  * every text-editing key the reader already knows.
218
218
  */
219
- [data-ui='time-field'] [data-part='duration'] {
219
+ [data-ui-time-field] [data-part-duration] {
220
220
  appearance: none;
221
221
  background-color: transparent;
222
222
  border: 0;
@@ -240,11 +240,11 @@
240
240
 
241
241
  /* Left-to-right content in a right-to-left field still sits at the reading
242
242
  edge, which is the treatment every form gives a phone number or an IBAN. */
243
- [data-ui='time-field'] [data-part='duration']:dir(rtl) {
243
+ [data-ui-time-field] [data-part-duration]:dir(rtl) {
244
244
  text-align: right;
245
245
  }
246
246
 
247
- [data-ui='time-field'] [data-part='duration']::placeholder {
247
+ [data-ui-time-field] [data-part-duration]::placeholder {
248
248
  color: var(--slotted-time-field-placeholder-color, var(--slotted-text-muted, GrayText));
249
249
  }
250
250
 
@@ -256,7 +256,7 @@
256
256
  * library already has for "and then"; it is direction-sensitive, so it turns
257
257
  * with the document rather than pointing out of it.
258
258
  */
259
- [data-ui='time-field'] [data-part='preview'] {
259
+ [data-ui-time-field] [data-part-preview] {
260
260
  /**
261
261
  * One line box, not a flex row. The chevron sits *in* the line rather than
262
262
  * beside it, which is the only way it can be aligned to the text at all —
@@ -293,7 +293,7 @@
293
293
  * marked `directional`: it points along the reading direction, so the `icon`
294
294
  * family turns it in a right-to-left context.
295
295
  */
296
- [data-ui='time-field'] [data-part='preview'] > [data-ui='icon'] {
296
+ [data-ui-time-field] [data-part-preview] > [data-ui-icon] {
297
297
  --slotted-icon-size: var(--_mark);
298
298
 
299
299
  margin-inline-end: var(--slotted-space-1, 0.125rem);
@@ -307,7 +307,7 @@
307
307
  * `docs/component-features.md` §2.5 refuses that, and a reader on a screen
308
308
  * reader hears the same words the sighted reader sees.
309
309
  */
310
- [data-ui='time-field'] [data-part='preview'][data-crosses-midnight] {
310
+ [data-ui-time-field] [data-part-preview][data-crosses-midnight] {
311
311
  color: var(--slotted-time-field-preview-next-color, var(--slotted-tone-warning-text));
312
312
  }
313
313
 
@@ -317,7 +317,7 @@
317
317
  * border is the accent the preview is written in, so the two marks are one
318
318
  * statement rather than two.
319
319
  */
320
- [data-ui='time-field'][data-part='root'][data-relative] {
320
+ [data-ui-time-field][data-part-root][data-relative] {
321
321
  border-color: var(
322
322
  --slotted-time-field-relative-border-color,
323
323
  var(--slotted-tone-accent-border)
@@ -330,7 +330,7 @@
330
330
  * holding an `md` control is a field and a control disagreeing about one row.
331
331
  */
332
332
 
333
- [data-ui='time-field'][data-part='root'][data-size='sm'] {
333
+ [data-ui-time-field][data-part-root][data-size='sm'] {
334
334
  --_font-size: var(--slotted-control-font-size-sm, 12px);
335
335
  --_height: var(--slotted-control-height-sm, 30px);
336
336
  --_padding-inline: var(--slotted-control-padding-inline-sm, 10px);
@@ -338,7 +338,7 @@
338
338
  --_icon-size: max(var(--_icon-floor), var(--slotted-control-icon-size-sm, 14px));
339
339
  }
340
340
 
341
- [data-ui='time-field'][data-part='root'][data-size='md'] {
341
+ [data-ui-time-field][data-part-root][data-size='md'] {
342
342
  --_font-size: var(--slotted-control-font-size-md, 13px);
343
343
  --_height: var(--slotted-control-height-md, 34px);
344
344
  --_padding-inline: var(--slotted-control-padding-inline-md, 13px);
@@ -346,7 +346,7 @@
346
346
  --_icon-size: max(var(--_icon-floor), var(--slotted-control-icon-size-md, 16px));
347
347
  }
348
348
 
349
- [data-ui='time-field'][data-part='root'][data-size='lg'] {
349
+ [data-ui-time-field][data-part-root][data-size='lg'] {
350
350
  --_font-size: var(--slotted-control-font-size-lg, 14px);
351
351
  --_height: var(--slotted-control-height-lg, 38px);
352
352
  --_padding-inline: var(--slotted-control-padding-inline-lg, 16px);
@@ -360,7 +360,7 @@
360
360
  * shows one frame twice rather than two frames.
361
361
  */
362
362
 
363
- [data-ui='time-field'][data-part='root'][data-variant='subtle'] {
363
+ [data-ui-time-field][data-part-root][data-variant='subtle'] {
364
364
  background-color: var(
365
365
  --slotted-time-field-subtle-background,
366
366
  var(--slotted-surface-sunken, Canvas)
@@ -371,7 +371,7 @@
371
371
  );
372
372
  }
373
373
 
374
- [data-ui='time-field'][data-part='root'][data-variant='plain'] {
374
+ [data-ui-time-field][data-part-root][data-variant='plain'] {
375
375
  background-color: transparent;
376
376
  border-color: transparent;
377
377
  border-radius: var(--slotted-radius-none, 0px);
@@ -384,8 +384,8 @@
384
384
  * the value: an adornment annotates, and a reader looking for the time
385
385
  * should not have to step over it.
386
386
  */
387
- [data-ui='time-field'] > [data-part='start'],
388
- [data-ui='time-field'] > [data-part='end'] {
387
+ [data-ui-time-field] > [data-part-start],
388
+ [data-ui-time-field] > [data-part-end] {
389
389
  --slotted-icon-size: var(--_icon-size);
390
390
 
391
391
  align-items: center;
@@ -397,8 +397,8 @@
397
397
  unicode-bidi: plaintext;
398
398
  }
399
399
 
400
- [data-ui='time-field'] > [data-part='start'] > svg,
401
- [data-ui='time-field'] > [data-part='end'] > svg {
400
+ [data-ui-time-field] > [data-part-start] > svg,
401
+ [data-ui-time-field] > [data-part-end] > svg {
402
402
  block-size: var(--_icon-size);
403
403
  inline-size: var(--_icon-size);
404
404
  }
@@ -409,7 +409,7 @@
409
409
  * character, and held to the target minimum by the family rather than by the
410
410
  * page.
411
411
  */
412
- [data-ui='time-field'] > [data-part='clear'] {
412
+ [data-ui-time-field] > [data-part-clear] {
413
413
  align-items: center;
414
414
  appearance: none;
415
415
  background-color: transparent;
@@ -439,7 +439,7 @@
439
439
  * larger one alone, which is the correction `docs/token-foundation.md`
440
440
  * leaves to the family rather than to the theme.
441
441
  */
442
- [data-ui='time-field'] > [data-part='clear']::after {
442
+ [data-ui-time-field] > [data-part-clear]::after {
443
443
  content: '';
444
444
  inset: min(0px, calc((100% - var(--slotted-target-min, 24px)) / 2));
445
445
  position: absolute;
@@ -450,28 +450,28 @@
450
450
  the hit area above grows to 44 pixels around them. After an end
451
451
  adornment — a picker's trigger — it does not reach back across it. */
452
452
  @media (pointer: coarse) {
453
- [data-ui='time-field'] > [data-part='clear']::after {
453
+ [data-ui-time-field] > [data-part-clear]::after {
454
454
  inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
455
455
  }
456
456
 
457
- [data-ui='time-field'] > [data-part='end'] + [data-part='clear']::after {
457
+ [data-ui-time-field] > [data-part-end] + [data-part-clear]::after {
458
458
  inset-inline-start: 0;
459
459
  }
460
460
  }
461
461
 
462
462
  /* The cross is drawn at the control's own icon step. */
463
- [data-ui='time-field'] > [data-part='clear'] {
463
+ [data-ui-time-field] > [data-part-clear] {
464
464
  --slotted-icon-size: var(--_icon-size);
465
465
  }
466
466
 
467
- [data-ui='time-field'] > [data-part='clear']:hover:not(:disabled):not([data-disabled]) {
467
+ [data-ui-time-field] > [data-part-clear]:hover:not(:disabled):not([data-disabled]) {
468
468
  background-color: var(
469
469
  --slotted-time-field-action-hover-background,
470
470
  var(--slotted-tone-secondary-subtle-hover)
471
471
  );
472
472
  }
473
473
 
474
- [data-ui='time-field'] > [data-part='clear']:active:not(:disabled):not([data-disabled]) {
474
+ [data-ui-time-field] > [data-part-clear]:active:not(:disabled):not([data-disabled]) {
475
475
  background-color: var(
476
476
  --slotted-time-field-action-active-background,
477
477
  var(--slotted-tone-secondary-subtle-active)
@@ -484,7 +484,7 @@
484
484
  * and a ring around the whole frame would sit still while focus moved inside
485
485
  * it.
486
486
  */
487
- [data-ui='time-field'] > [data-part='clear']:focus-visible {
487
+ [data-ui-time-field] > [data-part-clear]:focus-visible {
488
488
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
489
489
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
490
490
  }
@@ -495,13 +495,13 @@
495
495
  * one it can meet, which is the order `STATE_PRECEDENCE` sets.
496
496
  */
497
497
 
498
- [data-ui='time-field'][data-part='root']:hover:not([data-disabled]):not([data-readonly]):not(
498
+ [data-ui-time-field][data-part-root]:hover:not([data-disabled]):not([data-readonly]):not(
499
499
  [data-invalid]
500
500
  ) {
501
501
  border-color: var(--slotted-time-field-hover-border-color, var(--slotted-tone-accent-border));
502
502
  }
503
503
 
504
- [data-ui='time-field'][data-part='root'][data-variant='subtle']:hover:not([data-disabled]):not(
504
+ [data-ui-time-field][data-part-root][data-variant='subtle']:hover:not([data-disabled]):not(
505
505
  [data-readonly]
506
506
  ):not([data-invalid]) {
507
507
  background-color: var(
@@ -510,7 +510,7 @@
510
510
  );
511
511
  }
512
512
 
513
- [data-ui='time-field'][data-part='root'][data-variant='plain']:hover:not([data-disabled]):not(
513
+ [data-ui-time-field][data-part-root][data-variant='plain']:hover:not([data-disabled]):not(
514
514
  [data-readonly]
515
515
  ):not([data-invalid]) {
516
516
  background-color: var(
@@ -536,12 +536,12 @@
536
536
  * had before the press. The expression is an `input` and takes the frame's
537
537
  * ring on `:focus-within` for the same reason from the other side.
538
538
  */
539
- [data-ui='time-field'][data-part='root']:has([data-part='segment']:focus),
540
- [data-ui='time-field'][data-part='root']:has([data-part='duration']:focus) {
539
+ [data-ui-time-field][data-part-root]:has([data-part-segment]:focus),
540
+ [data-ui-time-field][data-part-root]:has([data-part-duration]:focus) {
541
541
  box-shadow: var(--slotted-control-shadow-focus-geometry, 0 1px 4px -1px)
542
542
  var(--slotted-focus-ring-color, Highlight);
543
543
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
544
- outline-offset: var(--slotted-focus-ring-offset, 2px);
544
+ outline-offset: var(--slotted-control-focus-ring-offset, var(--slotted-focus-ring-offset, 2px));
545
545
  }
546
546
 
547
547
  /**
@@ -551,13 +551,13 @@
551
551
  * shadow that appears only under focus is a cell that changes size when it
552
552
  * is used.
553
553
  */
554
- [data-ui='time-field'][data-part='root'][data-variant='plain']:has([data-part='segment']:focus),
555
- [data-ui='time-field'][data-part='root'][data-variant='plain']:has([data-part='duration']:focus) {
554
+ [data-ui-time-field][data-part-root][data-variant='plain']:has([data-part-segment]:focus),
555
+ [data-ui-time-field][data-part-root][data-variant='plain']:has([data-part-duration]:focus) {
556
556
  box-shadow: none;
557
557
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
558
558
  }
559
559
 
560
- [data-ui='time-field'] [data-part='segment']:focus {
560
+ [data-ui-time-field] [data-part-segment]:focus {
561
561
  background-color: var(
562
562
  --slotted-time-field-segment-focus-background,
563
563
  var(--slotted-tone-accent-solid)
@@ -573,7 +573,7 @@
573
573
  * ring is retargeted rather than repainted, so the frame's outline, the
574
574
  * shadow under it and the ring on the clear button all move at once.
575
575
  */
576
- [data-ui='time-field'][data-part='root'][data-invalid] {
576
+ [data-ui-time-field][data-part-root][data-invalid] {
577
577
  --slotted-focus-ring-color: var(
578
578
  --slotted-time-field-invalid-focus-ring-color,
579
579
  var(--slotted-focus-ring-color-invalid, Highlight)
@@ -598,19 +598,19 @@
598
598
  box-shadow: var(--_invalid-edge);
599
599
  }
600
600
 
601
- [data-ui='time-field'][data-part='root'][data-invalid]:has([data-part='segment']:focus),
602
- [data-ui='time-field'][data-part='root'][data-invalid]:has([data-part='duration']:focus) {
601
+ [data-ui-time-field][data-part-root][data-invalid]:has([data-part-segment]:focus),
602
+ [data-ui-time-field][data-part-root][data-invalid]:has([data-part-duration]:focus) {
603
603
  box-shadow:
604
604
  var(--_invalid-edge),
605
605
  var(--slotted-control-shadow-focus-geometry, 0 1px 4px -1px)
606
606
  var(--slotted-focus-ring-color, Highlight);
607
607
  }
608
608
 
609
- [data-ui='time-field'][data-part='root'][data-variant='plain'][data-invalid]:has(
610
- [data-part='segment']:focus
609
+ [data-ui-time-field][data-part-root][data-variant='plain'][data-invalid]:has(
610
+ [data-part-segment]:focus
611
611
  ),
612
- [data-ui='time-field'][data-part='root'][data-variant='plain'][data-invalid]:has(
613
- [data-part='duration']:focus
612
+ [data-ui-time-field][data-part-root][data-variant='plain'][data-invalid]:has(
613
+ [data-part-duration]:focus
614
614
  ) {
615
615
  /* The ring lies inside the box here, over the border and an edge as wide as
616
616
  it; the edge reaches past the ring. */
@@ -628,25 +628,28 @@
628
628
  * control draws its ring double, which a valid ring is not.
629
629
  */
630
630
  @media (forced-colors: active) {
631
- [data-ui='time-field'][data-part='root'][data-invalid] {
631
+ [data-ui-time-field][data-part-root][data-invalid] {
632
632
  outline: var(--_invalid-edge-width) solid CanvasText;
633
633
  outline-offset: calc(
634
634
  -1 * (var(--slotted-control-border-width, 1px) + var(--_invalid-edge-width))
635
635
  );
636
636
  }
637
637
 
638
- [data-ui='time-field'][data-part='root'][data-invalid]:has([data-part='segment']:focus),
639
- [data-ui='time-field'][data-part='root'][data-invalid]:has([data-part='duration']:focus) {
638
+ [data-ui-time-field][data-part-root][data-invalid]:has([data-part-segment]:focus),
639
+ [data-ui-time-field][data-part-root][data-invalid]:has([data-part-duration]:focus) {
640
640
  outline: calc(var(--slotted-focus-ring-width, 2px) + var(--_invalid-edge-width)) double
641
641
  var(--slotted-focus-ring-color, Highlight);
642
- outline-offset: var(--slotted-focus-ring-offset, 2px);
642
+ outline-offset: var(
643
+ --slotted-control-focus-ring-offset,
644
+ var(--slotted-focus-ring-offset, 2px)
645
+ );
643
646
  }
644
647
 
645
- [data-ui='time-field'][data-part='root'][data-variant='plain'][data-invalid]:has(
646
- [data-part='segment']:focus
648
+ [data-ui-time-field][data-part-root][data-variant='plain'][data-invalid]:has(
649
+ [data-part-segment]:focus
647
650
  ),
648
- [data-ui='time-field'][data-part='root'][data-variant='plain'][data-invalid]:has(
649
- [data-part='duration']:focus
651
+ [data-ui-time-field][data-part-root][data-variant='plain'][data-invalid]:has(
652
+ [data-part-duration]:focus
650
653
  ) {
651
654
  outline: calc(var(--slotted-focus-ring-width, 2px) + var(--_invalid-edge-width)) double
652
655
  var(--slotted-focus-ring-color, Highlight);
@@ -661,13 +664,13 @@
661
664
  * mistakable for disabled: the value is still real and still submitted. The
662
665
  * ground says "not yours to change" and the ink says nothing at all.
663
666
  */
664
- [data-ui='time-field'][data-part='root'][data-readonly],
665
- [data-ui='time-field'][data-part='root'][data-readonly] [data-part='segments'],
666
- [data-ui='time-field'][data-part='root'][data-readonly] [data-part='segment'] {
667
+ [data-ui-time-field][data-part-root][data-readonly],
668
+ [data-ui-time-field][data-part-root][data-readonly] [data-part-segments],
669
+ [data-ui-time-field][data-part-root][data-readonly] [data-part-segment] {
667
670
  cursor: default;
668
671
  }
669
672
 
670
- [data-ui='time-field'][data-part='root'][data-readonly] {
673
+ [data-ui-time-field][data-part-root][data-readonly] {
671
674
  background-color: var(
672
675
  --slotted-time-field-readonly-background,
673
676
  var(--slotted-tone-secondary-subtle-hover)
@@ -679,7 +682,7 @@
679
682
  * time nobody can read is a field nobody can check, and a disabled form
680
683
  * still has to say what it holds.
681
684
  */
682
- [data-ui='time-field'][data-part='root'][data-disabled] {
685
+ [data-ui-time-field][data-part-root][data-disabled] {
683
686
  background-color: var(
684
687
  --slotted-time-field-disabled-background,
685
688
  var(--slotted-disabled-background)
@@ -691,28 +694,28 @@
691
694
  cursor: not-allowed;
692
695
  }
693
696
 
694
- [data-ui='time-field'][data-part='root'][data-disabled] [data-part='segments'],
695
- [data-ui='time-field'][data-part='root'][data-disabled] [data-part='segment'] {
697
+ [data-ui-time-field][data-part-root][data-disabled] [data-part-segments],
698
+ [data-ui-time-field][data-part-root][data-disabled] [data-part-segment] {
696
699
  cursor: not-allowed;
697
700
  }
698
701
 
699
- [data-ui='time-field'][data-part='root'][data-disabled] > [data-part='start'],
700
- [data-ui='time-field'][data-part='root'][data-disabled] > [data-part='end'],
701
- [data-ui='time-field'][data-part='root'][data-disabled] [data-part='literal'],
702
- [data-ui='time-field'][data-part='root'][data-disabled] [data-part='segment'][data-placeholder] {
702
+ [data-ui-time-field][data-part-root][data-disabled] > [data-part-start],
703
+ [data-ui-time-field][data-part-root][data-disabled] > [data-part-end],
704
+ [data-ui-time-field][data-part-root][data-disabled] [data-part-literal],
705
+ [data-ui-time-field][data-part-root][data-disabled] [data-part-segment][data-placeholder] {
703
706
  color: var(--slotted-disabled-foreground);
704
707
  }
705
708
 
706
709
  @media (forced-colors: active) {
707
710
  /* A transparent border has no system colour to be remapped to, so the
708
711
  `plain` control would lose its only edge where an edge matters most. */
709
- [data-ui='time-field'][data-part='root'][data-variant='plain'] {
712
+ [data-ui-time-field][data-part-root][data-variant='plain'] {
710
713
  border-color: ButtonBorder;
711
714
  }
712
715
 
713
716
  /* The preview's two tones both map to the same system ink, so the border
714
717
  is what is left to say the control is in a different mode. */
715
- [data-ui='time-field'][data-part='root'][data-relative] {
718
+ [data-ui-time-field][data-part-root][data-relative] {
716
719
  border-color: Highlight;
717
720
  }
718
721
  }
@@ -2,6 +2,7 @@
2
2
  "--slotted-border-subtle",
3
3
  "--slotted-control-border-color",
4
4
  "--slotted-control-border-width",
5
+ "--slotted-control-focus-ring-offset",
5
6
  "--slotted-control-font-family",
6
7
  "--slotted-control-font-size-lg",
7
8
  "--slotted-control-font-size-md",