@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
@@ -35,7 +35,7 @@
35
35
  * a dialog is the ordinary case, and a descendant rule would paint the inner
36
36
  * panel's header with the outer panel's tone.
37
37
  */
38
- [data-ui='dialog'] {
38
+ [data-ui-dialog] {
39
39
  /**
40
40
  * The panel's measure, per size step. Five named steps rather than the
41
41
  * pixel string Material, Carbon and Ant all take: a theme can retune a
@@ -52,8 +52,12 @@
52
52
  --_measure: var(--slotted-dialog-measure, 32rem);
53
53
  /** The air between the panel and the edge of the layer. */
54
54
  --_layer-padding: var(--slotted-space-8, 1.5rem);
55
- /** The panel's own inset, which every row reads. */
56
- --_padding-inline: var(--slotted-space-8, 1.5rem);
55
+ /**
56
+ * The panel's own inset, which every row reads. The panel draws none of it
57
+ * itself: the header, the body and the footer carry it, and a layout of the
58
+ * consumer's own that skips them reads the same two public tokens.
59
+ */
60
+ --_padding-inline: var(--slotted-dialog-padding-inline, var(--slotted-space-8, 1.5rem));
57
61
  /**
58
62
  * Three insets, not one number used three times, because the three rows
59
63
  * hold three different things.
@@ -72,7 +76,7 @@
72
76
  * paragraph reads as a slab around a button: twenty above and below a
73
77
  * thirty-four pixel control is a seventy-four pixel bar for one line.
74
78
  */
75
- --_padding-block: var(--slotted-space-7, 1.25rem);
79
+ --_padding-block: var(--slotted-dialog-padding-block, var(--slotted-space-7, 1.25rem));
76
80
  --_header-padding-block: var(--slotted-space-6, 1rem);
77
81
  --_footer-padding-block: var(--slotted-space-5, 0.75rem);
78
82
  --_gap: var(--slotted-space-5, 0.75rem);
@@ -155,7 +159,7 @@
155
159
  * `data-open` either, and a hidden layer in that frame refuses the focus
156
160
  * scope's initial focus.
157
161
  */
158
- [data-ui='dialog'][inert] {
162
+ [data-ui-dialog][inert] {
159
163
  content-visibility: hidden;
160
164
  pointer-events: none;
161
165
  }
@@ -168,32 +172,32 @@
168
172
  * pointer, and a press on the page is the outside press the dismissal policy
169
173
  * answers.
170
174
  */
171
- [data-ui='dialog']:not([data-modal]) {
175
+ [data-ui-dialog]:not([data-modal]) {
172
176
  pointer-events: none;
173
177
  }
174
178
 
175
- [data-ui='dialog']:not([data-modal]) > [data-part='backdrop'] {
179
+ [data-ui-dialog]:not([data-modal]) > [data-part-backdrop] {
176
180
  visibility: hidden;
177
181
  }
178
182
 
179
- [data-ui='dialog']:not([data-modal]) > [data-part='viewport'] > [data-part='content'] {
183
+ [data-ui-dialog]:not([data-modal]) > [data-part-viewport] > [data-part-content] {
180
184
  pointer-events: auto;
181
185
  }
182
186
 
183
- [data-ui='dialog'][data-size='sm'] {
187
+ [data-ui-dialog][data-size='sm'] {
184
188
  --_measure: var(--slotted-dialog-measure, 24rem);
185
- --_padding-inline: var(--slotted-space-7, 1.25rem);
186
- --_padding-block: var(--slotted-space-6, 1rem);
189
+ --_padding-inline: var(--slotted-dialog-padding-inline-sm, var(--slotted-space-7, 1.25rem));
190
+ --_padding-block: var(--slotted-dialog-padding-block-sm, var(--slotted-space-6, 1rem));
187
191
  --_header-padding-block: var(--slotted-space-5, 0.75rem);
188
192
  --_footer-padding-block: var(--slotted-space-4, 0.5rem);
189
193
  --_title-font-size: var(--slotted-font-size-lg, 1rem);
190
194
  }
191
195
 
192
- [data-ui='dialog'][data-size='lg'] {
196
+ [data-ui-dialog][data-size='lg'] {
193
197
  --_measure: var(--slotted-dialog-measure, 42rem);
194
198
  }
195
199
 
196
- [data-ui='dialog'][data-size='xl'] {
200
+ [data-ui-dialog][data-size='xl'] {
197
201
  --_measure: var(--slotted-dialog-measure, 56rem);
198
202
  }
199
203
 
@@ -201,7 +205,7 @@
201
205
  * `full` is the step a dialog that is a document takes: the panel spends the
202
206
  * whole layer minus its padding, and the measure stops capping it.
203
207
  */
204
- [data-ui='dialog'][data-size='full'] {
208
+ [data-ui-dialog][data-size='full'] {
205
209
  --_measure: var(--slotted-dialog-measure, none);
206
210
  }
207
211
 
@@ -214,7 +218,7 @@
214
218
  * is `none` in that mode, and a panel separated only by elevation would sit
215
219
  * on an opaque ground with nothing to mark its edge.
216
220
  */
217
- [data-ui='dialog'] > [data-part='backdrop'] {
221
+ [data-ui-dialog] > [data-part-backdrop] {
218
222
  grid-area: 1 / 1;
219
223
  background: var(--slotted-dialog-scrim, var(--slotted-scrim, Canvas));
220
224
  opacity: 0;
@@ -234,7 +238,7 @@
234
238
  * The panel below arrives over the same duration and the same curve, so the
235
239
  * two halves of one layer arrive together.
236
240
  */
237
- [data-ui='dialog'][data-open] > [data-part='backdrop'] {
241
+ [data-ui-dialog][data-open] > [data-part-backdrop] {
238
242
  opacity: 1;
239
243
  transition: opacity var(--slotted-duration-long) var(--slotted-easing-standard);
240
244
  }
@@ -248,7 +252,7 @@
248
252
  * start edge as soon as the item cannot fit, which is the only reading that
249
253
  * keeps the title reachable at 200% zoom and in a short window.
250
254
  */
251
- [data-ui='dialog'] > [data-part='viewport'] {
255
+ [data-ui-dialog] > [data-part-viewport] {
252
256
  grid-area: 1 / 1;
253
257
  display: grid;
254
258
  grid-template-columns: minmax(0, 1fr);
@@ -268,7 +272,7 @@
268
272
  overscroll-behavior: contain;
269
273
  }
270
274
 
271
- [data-ui='dialog'][data-placement='top'] > [data-part='viewport'] {
275
+ [data-ui-dialog][data-placement='top'] > [data-part-viewport] {
272
276
  align-content: safe start;
273
277
  }
274
278
 
@@ -280,7 +284,16 @@
280
284
  */
281
285
  /* ── The panel ────────────────────────────────────────────────────────── */
282
286
 
283
- [data-ui='dialog'] > [data-part='viewport'] > [data-part='content'] {
287
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] {
288
+ /**
289
+ * The inset the rows carry, stated where a layout of the consumer's own can
290
+ * read it: the panel draws no padding, so content written straight inside
291
+ * it reads `--slotted-dialog-inset-inline` for its padding and stands
292
+ * in the column the header, the body and the footer stand in.
293
+ */
294
+ --slotted-dialog-inset-inline: var(--_padding-inline);
295
+ --slotted-dialog-inset-block: var(--_padding-block);
296
+
284
297
  display: grid;
285
298
  grid-template-rows: auto minmax(0, 1fr) auto;
286
299
  inline-size: 100%;
@@ -355,7 +368,7 @@
355
368
  * the edge it sits on, and it is on the same rule now for the same reason:
356
369
  * the type inside it is what the slide was resampling (DG4).
357
370
  */
358
- [data-ui='dialog'][data-open] > [data-part='viewport'] > [data-part='content'] {
371
+ [data-ui-dialog][data-open] > [data-part-viewport] > [data-part-content] {
359
372
  opacity: 1;
360
373
  transition: opacity var(--slotted-duration-long) var(--slotted-easing-standard);
361
374
  }
@@ -369,10 +382,20 @@
369
382
  * travelling, and there is no travel to stop (DG4).
370
383
  */
371
384
 
372
- [data-ui='dialog'][data-scroll='viewport'] > [data-part='viewport'] > [data-part='content'] {
385
+ [data-ui-dialog][data-scroll='viewport'] > [data-part-viewport] > [data-part-content] {
373
386
  max-block-size: none;
374
387
  }
375
388
 
389
+ /**
390
+ * A form written around the header, the body and the footer, so Enter in
391
+ * any field and the footer's submit belong to one form. It draws no box:
392
+ * its children are the panel's rows, and every rule of a part is written a
393
+ * second time through it, so the parts keep the panel's inset and rows.
394
+ */
395
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > form {
396
+ display: contents;
397
+ }
398
+
376
399
  /* ── The header ───────────────────────────────────────────────────────── */
377
400
 
378
401
  /**
@@ -396,7 +419,8 @@
396
419
  * `interpolate-size`. The cost is a rule over a footer that sometimes has
397
420
  * nothing above it to separate.
398
421
  */
399
- [data-ui='dialog'] > [data-part='viewport'] > [data-part='content'] > [data-part='header'] {
422
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > form > [data-part-header],
423
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > [data-part-header] {
400
424
  display: grid;
401
425
  grid-template-columns: auto minmax(0, 1fr) auto auto;
402
426
  align-items: start;
@@ -421,16 +445,28 @@
421
445
  * where the mark would have gone, and moved as soon as a tone was set. Where
422
446
  * it goes is now a rule rather than an accident of the grid.
423
447
  */
424
- [data-ui='dialog']
425
- > [data-part='viewport']
426
- > [data-part='content']
427
- > [data-part='header']
448
+ [data-ui-dialog]
449
+ > [data-part-viewport]
450
+ > [data-part-content]
451
+ > form
452
+ > [data-part-header]
428
453
  > *:not(
429
- [data-part='icon'],
430
- [data-part='title'],
431
- [data-part='description'],
432
- [data-part='fullscreen'],
433
- [data-part='close']
454
+ [data-part-icon],
455
+ [data-part-title],
456
+ [data-part-description],
457
+ [data-part-fullscreen],
458
+ [data-part-close]
459
+ ),
460
+ [data-ui-dialog]
461
+ > [data-part-viewport]
462
+ > [data-part-content]
463
+ > [data-part-header]
464
+ > *:not(
465
+ [data-part-icon],
466
+ [data-part-title],
467
+ [data-part-description],
468
+ [data-part-fullscreen],
469
+ [data-part-close]
434
470
  ) {
435
471
  grid-column: 2;
436
472
  /**
@@ -453,11 +489,17 @@
453
489
  * colours every tone becomes one system colour and the silhouette is all
454
490
  * that is left.
455
491
  */
456
- [data-ui='dialog']
457
- > [data-part='viewport']
458
- > [data-part='content']
459
- > [data-part='header']
460
- > [data-part='icon'] {
492
+ [data-ui-dialog]
493
+ > [data-part-viewport]
494
+ > [data-part-content]
495
+ > form
496
+ > [data-part-header]
497
+ > [data-part-icon],
498
+ [data-ui-dialog]
499
+ > [data-part-viewport]
500
+ > [data-part-content]
501
+ > [data-part-header]
502
+ > [data-part-icon] {
461
503
  --slotted-icon-size: var(--_status-size);
462
504
 
463
505
  grid-column: 1;
@@ -478,23 +520,27 @@
478
520
  margin-inline-end: var(--_mark-gap);
479
521
  }
480
522
 
481
- [data-ui='dialog'][data-tone='accent'] {
523
+ [data-ui-dialog][data-tone='accent'] {
482
524
  --_tone-color: var(--slotted-tone-accent-text, CanvasText);
483
525
  }
484
526
 
485
- [data-ui='dialog'][data-tone='secondary'] {
527
+ [data-ui-dialog][data-tone='secondary'] {
486
528
  --_tone-color: var(--slotted-tone-secondary-text, CanvasText);
487
529
  }
488
530
 
489
- [data-ui='dialog'][data-tone='success'] {
531
+ [data-ui-dialog][data-tone='success'] {
490
532
  --_tone-color: var(--slotted-tone-success-text, CanvasText);
491
533
  }
492
534
 
493
- [data-ui='dialog'][data-tone='warning'] {
535
+ [data-ui-dialog][data-tone='info'] {
536
+ --_tone-color: var(--slotted-tone-info-text, CanvasText);
537
+ }
538
+
539
+ [data-ui-dialog][data-tone='warning'] {
494
540
  --_tone-color: var(--slotted-tone-warning-text, CanvasText);
495
541
  }
496
542
 
497
- [data-ui='dialog'][data-tone='danger'] {
543
+ [data-ui-dialog][data-tone='danger'] {
498
544
  --_tone-color: var(--slotted-tone-danger-text, CanvasText);
499
545
  }
500
546
 
@@ -506,11 +552,17 @@
506
552
  * panel past the layer, and the panel is centred, so both of its edges leave
507
553
  * the screen at once.
508
554
  */
509
- [data-ui='dialog']
510
- > [data-part='viewport']
511
- > [data-part='content']
512
- > [data-part='header']
513
- > [data-part='title'] {
555
+ [data-ui-dialog]
556
+ > [data-part-viewport]
557
+ > [data-part-content]
558
+ > form
559
+ > [data-part-header]
560
+ > [data-part-title],
561
+ [data-ui-dialog]
562
+ > [data-part-viewport]
563
+ > [data-part-content]
564
+ > [data-part-header]
565
+ > [data-part-title] {
514
566
  grid-column: 2;
515
567
  grid-row: 1;
516
568
  margin: 0;
@@ -529,11 +581,17 @@
529
581
  color: var(--slotted-dialog-title-color, var(--slotted-text, CanvasText));
530
582
  }
531
583
 
532
- [data-ui='dialog']
533
- > [data-part='viewport']
534
- > [data-part='content']
535
- > [data-part='header']
536
- > [data-part='description'] {
584
+ [data-ui-dialog]
585
+ > [data-part-viewport]
586
+ > [data-part-content]
587
+ > form
588
+ > [data-part-header]
589
+ > [data-part-description],
590
+ [data-ui-dialog]
591
+ > [data-part-viewport]
592
+ > [data-part-content]
593
+ > [data-part-header]
594
+ > [data-part-description] {
537
595
  grid-column: 2;
538
596
  grid-row: 2;
539
597
  margin: 0;
@@ -552,11 +610,18 @@
552
610
  * weight instead, which is what both product confirmations in the survey do
553
611
  * with a span of their own.
554
612
  */
555
- [data-ui='dialog']
556
- > [data-part='viewport']
557
- > [data-part='content']
558
- > [data-part='header']
559
- > [data-part='description']
613
+ [data-ui-dialog]
614
+ > [data-part-viewport]
615
+ > [data-part-content]
616
+ > form
617
+ > [data-part-header]
618
+ > [data-part-description]
619
+ :is(strong, b),
620
+ [data-ui-dialog]
621
+ > [data-part-viewport]
622
+ > [data-part-content]
623
+ > [data-part-header]
624
+ > [data-part-description]
560
625
  :is(strong, b) {
561
626
  font-weight: var(--slotted-font-weight-semibold, 600);
562
627
  color: var(--slotted-dialog-title-color, var(--slotted-text, CanvasText));
@@ -572,11 +637,17 @@
572
637
  * in an `icon` box, sized here through the icon token so the box and the
573
638
  * formula above read one length.
574
639
  */
575
- [data-ui='dialog']
576
- > [data-part='viewport']
577
- > [data-part='content']
578
- > [data-part='header']
579
- > [data-part='close'] {
640
+ [data-ui-dialog]
641
+ > [data-part-viewport]
642
+ > [data-part-content]
643
+ > form
644
+ > [data-part-header]
645
+ > [data-part-close],
646
+ [data-ui-dialog]
647
+ > [data-part-viewport]
648
+ > [data-part-content]
649
+ > [data-part-header]
650
+ > [data-part-close] {
580
651
  --slotted-icon-size: var(--_icon-size);
581
652
 
582
653
  grid-column: 4;
@@ -604,11 +675,17 @@
604
675
  var(--slotted-control-transition-easing, var(--slotted-easing-standard));
605
676
  }
606
677
 
607
- [data-ui='dialog']
608
- > [data-part='viewport']
609
- > [data-part='content']
610
- > [data-part='header']
611
- > [data-part='close']:not(:disabled):hover {
678
+ [data-ui-dialog]
679
+ > [data-part-viewport]
680
+ > [data-part-content]
681
+ > form
682
+ > [data-part-header]
683
+ > [data-part-close]:not(:disabled):hover,
684
+ [data-ui-dialog]
685
+ > [data-part-viewport]
686
+ > [data-part-content]
687
+ > [data-part-header]
688
+ > [data-part-close]:not(:disabled):hover {
612
689
  /* The ground moves under the pointer and nothing else does (R2). */
613
690
  background-color: var(
614
691
  --slotted-dialog-close-hover-background,
@@ -616,22 +693,34 @@
616
693
  );
617
694
  }
618
695
 
619
- [data-ui='dialog']
620
- > [data-part='viewport']
621
- > [data-part='content']
622
- > [data-part='header']
623
- > [data-part='close']:not(:disabled):active {
696
+ [data-ui-dialog]
697
+ > [data-part-viewport]
698
+ > [data-part-content]
699
+ > form
700
+ > [data-part-header]
701
+ > [data-part-close]:not(:disabled):active,
702
+ [data-ui-dialog]
703
+ > [data-part-viewport]
704
+ > [data-part-content]
705
+ > [data-part-header]
706
+ > [data-part-close]:not(:disabled):active {
624
707
  background-color: var(
625
708
  --slotted-dialog-close-active-background,
626
709
  var(--slotted-tone-secondary-subtle-active)
627
710
  );
628
711
  }
629
712
 
630
- [data-ui='dialog']
631
- > [data-part='viewport']
632
- > [data-part='content']
633
- > [data-part='header']
634
- > [data-part='close']:focus-visible {
713
+ [data-ui-dialog]
714
+ > [data-part-viewport]
715
+ > [data-part-content]
716
+ > form
717
+ > [data-part-header]
718
+ > [data-part-close]:focus-visible,
719
+ [data-ui-dialog]
720
+ > [data-part-viewport]
721
+ > [data-part-content]
722
+ > [data-part-header]
723
+ > [data-part-close]:focus-visible {
635
724
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
636
725
  outline-offset: calc(-1 * var(--slotted-focus-ring-offset, 2px));
637
726
  }
@@ -652,11 +741,17 @@
652
741
  * glyph is the binding's, chosen from the state: the mark says what the
653
742
  * press does next, so it is the opposite of the state the panel is in.
654
743
  */
655
- [data-ui='dialog']
656
- > [data-part='viewport']
657
- > [data-part='content']
658
- > [data-part='header']
659
- > [data-part='fullscreen'] {
744
+ [data-ui-dialog]
745
+ > [data-part-viewport]
746
+ > [data-part-content]
747
+ > form
748
+ > [data-part-header]
749
+ > [data-part-fullscreen],
750
+ [data-ui-dialog]
751
+ > [data-part-viewport]
752
+ > [data-part-content]
753
+ > [data-part-header]
754
+ > [data-part-fullscreen] {
660
755
  --slotted-icon-size: var(--_icon-size);
661
756
 
662
757
  grid-column: 3;
@@ -687,20 +782,33 @@
687
782
  * glyph on every side, and a second gap between them would set them further
688
783
  * apart than either is from the words.
689
784
  */
690
- [data-ui='dialog']
691
- > [data-part='viewport']
692
- > [data-part='content']
693
- > [data-part='header']
694
- > [data-part='fullscreen']
695
- + [data-part='close'] {
785
+ [data-ui-dialog]
786
+ > [data-part-viewport]
787
+ > [data-part-content]
788
+ > form
789
+ > [data-part-header]
790
+ > [data-part-fullscreen]
791
+ + [data-part-close],
792
+ [data-ui-dialog]
793
+ > [data-part-viewport]
794
+ > [data-part-content]
795
+ > [data-part-header]
796
+ > [data-part-fullscreen]
797
+ + [data-part-close] {
696
798
  margin-inline-start: 0;
697
799
  }
698
800
 
699
- [data-ui='dialog']
700
- > [data-part='viewport']
701
- > [data-part='content']
702
- > [data-part='header']
703
- > [data-part='fullscreen']:not(:disabled):hover {
801
+ [data-ui-dialog]
802
+ > [data-part-viewport]
803
+ > [data-part-content]
804
+ > form
805
+ > [data-part-header]
806
+ > [data-part-fullscreen]:not(:disabled):hover,
807
+ [data-ui-dialog]
808
+ > [data-part-viewport]
809
+ > [data-part-content]
810
+ > [data-part-header]
811
+ > [data-part-fullscreen]:not(:disabled):hover {
704
812
  /* The ground moves under the pointer and nothing else does (R2). */
705
813
  background-color: var(
706
814
  --slotted-dialog-close-hover-background,
@@ -708,22 +816,34 @@
708
816
  );
709
817
  }
710
818
 
711
- [data-ui='dialog']
712
- > [data-part='viewport']
713
- > [data-part='content']
714
- > [data-part='header']
715
- > [data-part='fullscreen']:not(:disabled):active {
819
+ [data-ui-dialog]
820
+ > [data-part-viewport]
821
+ > [data-part-content]
822
+ > form
823
+ > [data-part-header]
824
+ > [data-part-fullscreen]:not(:disabled):active,
825
+ [data-ui-dialog]
826
+ > [data-part-viewport]
827
+ > [data-part-content]
828
+ > [data-part-header]
829
+ > [data-part-fullscreen]:not(:disabled):active {
716
830
  background-color: var(
717
831
  --slotted-dialog-close-active-background,
718
832
  var(--slotted-tone-secondary-subtle-active)
719
833
  );
720
834
  }
721
835
 
722
- [data-ui='dialog']
723
- > [data-part='viewport']
724
- > [data-part='content']
725
- > [data-part='header']
726
- > [data-part='fullscreen']:focus-visible {
836
+ [data-ui-dialog]
837
+ > [data-part-viewport]
838
+ > [data-part-content]
839
+ > form
840
+ > [data-part-header]
841
+ > [data-part-fullscreen]:focus-visible,
842
+ [data-ui-dialog]
843
+ > [data-part-viewport]
844
+ > [data-part-content]
845
+ > [data-part-header]
846
+ > [data-part-fullscreen]:focus-visible {
727
847
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
728
848
  outline-offset: calc(-1 * var(--slotted-focus-ring-offset, 2px));
729
849
  }
@@ -735,38 +855,63 @@
735
855
  * controls touch, so neither reaches across the edge they share.
736
856
  */
737
857
  @media (pointer: coarse) {
738
- [data-ui='dialog']
739
- > [data-part='viewport']
740
- > [data-part='content']
741
- > [data-part='header']
742
- > :is([data-part='close'], [data-part='fullscreen']) {
858
+ [data-ui-dialog]
859
+ > [data-part-viewport]
860
+ > [data-part-content]
861
+ > form
862
+ > [data-part-header]
863
+ > :is([data-part-close], [data-part-fullscreen]),
864
+ [data-ui-dialog]
865
+ > [data-part-viewport]
866
+ > [data-part-content]
867
+ > [data-part-header]
868
+ > :is([data-part-close], [data-part-fullscreen]) {
743
869
  position: relative;
744
870
  }
745
871
 
746
- [data-ui='dialog']
747
- > [data-part='viewport']
748
- > [data-part='content']
749
- > [data-part='header']
750
- > :is([data-part='close'], [data-part='fullscreen'])::before {
872
+ [data-ui-dialog]
873
+ > [data-part-viewport]
874
+ > [data-part-content]
875
+ > form
876
+ > [data-part-header]
877
+ > :is([data-part-close], [data-part-fullscreen])::before,
878
+ [data-ui-dialog]
879
+ > [data-part-viewport]
880
+ > [data-part-content]
881
+ > [data-part-header]
882
+ > :is([data-part-close], [data-part-fullscreen])::before {
751
883
  content: '';
752
884
  inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
753
885
  position: absolute;
754
886
  }
755
887
 
756
- [data-ui='dialog']
757
- > [data-part='viewport']
758
- > [data-part='content']
759
- > [data-part='header']
760
- > [data-part='fullscreen']:has(+ [data-part='close'])::before {
888
+ [data-ui-dialog]
889
+ > [data-part-viewport]
890
+ > [data-part-content]
891
+ > form
892
+ > [data-part-header]
893
+ > [data-part-fullscreen]:has(+ [data-part-close])::before,
894
+ [data-ui-dialog]
895
+ > [data-part-viewport]
896
+ > [data-part-content]
897
+ > [data-part-header]
898
+ > [data-part-fullscreen]:has(+ [data-part-close])::before {
761
899
  inset-inline-end: 0;
762
900
  }
763
901
 
764
- [data-ui='dialog']
765
- > [data-part='viewport']
766
- > [data-part='content']
767
- > [data-part='header']
768
- > [data-part='fullscreen']
769
- + [data-part='close']::before {
902
+ [data-ui-dialog]
903
+ > [data-part-viewport]
904
+ > [data-part-content]
905
+ > form
906
+ > [data-part-header]
907
+ > [data-part-fullscreen]
908
+ + [data-part-close]::before,
909
+ [data-ui-dialog]
910
+ > [data-part-viewport]
911
+ > [data-part-content]
912
+ > [data-part-header]
913
+ > [data-part-fullscreen]
914
+ + [data-part-close]::before {
770
915
  inset-inline-start: 0;
771
916
  }
772
917
  }
@@ -779,15 +924,21 @@
779
924
  * `dismissable-layer` covers the modal case; this covers the non-modal one,
780
925
  * where the page behind is not locked at all.
781
926
  */
782
- [data-ui='dialog']
783
- > [data-part='viewport']
784
- > [data-part='content']
785
- > [data-part='body']:not(:first-child) {
927
+ [data-ui-dialog]
928
+ > [data-part-viewport]
929
+ > [data-part-content]
930
+ > form
931
+ > [data-part-body]:not(:first-child),
932
+ [data-ui-dialog]
933
+ > [data-part-viewport]
934
+ > [data-part-content]
935
+ > [data-part-body]:not(:first-child) {
786
936
  border-block-start: var(--_rule-size) solid
787
937
  var(--slotted-dialog-rule-color, var(--slotted-border-subtle, ButtonBorder));
788
938
  }
789
939
 
790
- [data-ui='dialog'] > [data-part='viewport'] > [data-part='content'] > [data-part='body'] {
940
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > form > [data-part-body],
941
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > [data-part-body] {
791
942
  min-block-size: 0;
792
943
  overflow-x: hidden;
793
944
  overflow-y: auto;
@@ -801,10 +952,15 @@
801
952
  color: var(--slotted-dialog-body-color, var(--slotted-text, CanvasText));
802
953
  }
803
954
 
804
- [data-ui='dialog'][data-scroll='viewport']
805
- > [data-part='viewport']
806
- > [data-part='content']
807
- > [data-part='body'] {
955
+ [data-ui-dialog][data-scroll='viewport']
956
+ > [data-part-viewport]
957
+ > [data-part-content]
958
+ > form
959
+ > [data-part-body],
960
+ [data-ui-dialog][data-scroll='viewport']
961
+ > [data-part-viewport]
962
+ > [data-part-content]
963
+ > [data-part-body] {
808
964
  overflow: visible;
809
965
  }
810
966
 
@@ -815,10 +971,12 @@
815
971
  * header, the close button and Escape all stay operable: a loading dialog a
816
972
  * reader cannot leave is the worse failure of the two.
817
973
  */
818
- [data-ui='dialog'][data-loading]
819
- > [data-part='viewport']
820
- > [data-part='content']
821
- > [data-part='body'] {
974
+ [data-ui-dialog][data-loading]
975
+ > [data-part-viewport]
976
+ > [data-part-content]
977
+ > form
978
+ > [data-part-body],
979
+ [data-ui-dialog][data-loading] > [data-part-viewport] > [data-part-content] > [data-part-body] {
822
980
  min-block-size: var(--slotted-space-12, 4rem);
823
981
  }
824
982
 
@@ -830,7 +988,8 @@
830
988
  * reason `content` is bounded — an unbounded panel pushes it past the fold,
831
989
  * which is the whole failure the three-row grid exists to prevent.
832
990
  */
833
- [data-ui='dialog'] > [data-part='viewport'] > [data-part='content'] > [data-part='footer'] {
991
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > form > [data-part-footer],
992
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > [data-part-footer] {
834
993
  display: flex;
835
994
  flex-wrap: wrap;
836
995
  align-items: center;
@@ -841,10 +1000,15 @@
841
1000
  background: var(--slotted-dialog-footer-surface, var(--slotted-surface-sunken, Canvas));
842
1001
  }
843
1002
 
844
- [data-ui='dialog']
845
- > [data-part='viewport']
846
- > [data-part='content']
847
- > [data-part='footer']:not(:first-child) {
1003
+ [data-ui-dialog]
1004
+ > [data-part-viewport]
1005
+ > [data-part-content]
1006
+ > form
1007
+ > [data-part-footer]:not(:first-child),
1008
+ [data-ui-dialog]
1009
+ > [data-part-viewport]
1010
+ > [data-part-content]
1011
+ > [data-part-footer]:not(:first-child) {
848
1012
  border-block-start: var(--_rule-size) solid
849
1013
  var(--slotted-dialog-rule-color, var(--slotted-border-subtle, ButtonBorder));
850
1014
  }
@@ -872,7 +1036,7 @@
872
1036
  * writes their own three-row grid, which is the whole of what they are taking
873
1037
  * over.
874
1038
  */
875
- [data-ui='dialog'][data-surface='plain'] > [data-part='viewport'] > [data-part='content'] {
1039
+ [data-ui-dialog][data-surface='plain'] > [data-part-viewport] > [data-part-content] {
876
1040
  display: block;
877
1041
  background: none;
878
1042
  border: 0;
@@ -881,10 +1045,15 @@
881
1045
  overflow: visible;
882
1046
  }
883
1047
 
884
- [data-ui='dialog'][data-surface='plain']
885
- > [data-part='viewport']
886
- > [data-part='content']
887
- > :is([data-part='header'], [data-part='body'], [data-part='footer']) {
1048
+ [data-ui-dialog][data-surface='plain']
1049
+ > [data-part-viewport]
1050
+ > [data-part-content]
1051
+ > form
1052
+ > :is([data-part-header], [data-part-body], [data-part-footer]),
1053
+ [data-ui-dialog][data-surface='plain']
1054
+ > [data-part-viewport]
1055
+ > [data-part-content]
1056
+ > :is([data-part-header], [data-part-body], [data-part-footer]) {
888
1057
  background: none;
889
1058
  border: 0;
890
1059
  padding: 0;
@@ -909,16 +1078,18 @@
909
1078
  * a literal because `@container (max-inline-size: var(--x))` is invalid CSS.
910
1079
  */
911
1080
  @container slotted-dialog (max-inline-size: 30rem) {
912
- [data-ui='dialog'][data-full-screen='narrow'] > [data-part='viewport'] {
1081
+ [data-ui-dialog][data-full-screen='narrow'] > [data-part-viewport] {
913
1082
  align-content: stretch;
914
1083
  padding: 0;
915
1084
  }
916
1085
 
917
- [data-ui='dialog'][data-full-screen='narrow'] > [data-part='viewport'] > [data-part='content'] {
1086
+ [data-ui-dialog][data-full-screen='narrow'] > [data-part-viewport] > [data-part-content] {
918
1087
  max-inline-size: none;
919
1088
  block-size: 100%;
920
1089
  border-radius: 0;
921
1090
  border: 0;
1091
+ box-sizing: border-box;
1092
+ padding-block-end: var(--slotted-keyboard-inset, 0px);
922
1093
  }
923
1094
  }
924
1095
 
@@ -930,14 +1101,14 @@
930
1101
  * owns both — a panel that animated its own box would animate `inset`,
931
1102
  * `inline-size` and `block-size`, which is the rule R7 exists to state.
932
1103
  */
933
- [data-ui='dialog'][data-full-screen='always'] > [data-part='viewport'],
934
- [data-ui='dialog'][data-fullscreen] > [data-part='viewport'] {
1104
+ [data-ui-dialog][data-full-screen='always'] > [data-part-viewport],
1105
+ [data-ui-dialog][data-fullscreen] > [data-part-viewport] {
935
1106
  align-content: stretch;
936
1107
  padding: 0;
937
1108
  }
938
1109
 
939
- [data-ui='dialog'][data-full-screen='always'] > [data-part='viewport'] > [data-part='content'],
940
- [data-ui='dialog'][data-fullscreen] > [data-part='viewport'] > [data-part='content'] {
1110
+ [data-ui-dialog][data-full-screen='always'] > [data-part-viewport] > [data-part-content],
1111
+ [data-ui-dialog][data-fullscreen] > [data-part-viewport] > [data-part-content] {
941
1112
  max-inline-size: none;
942
1113
  block-size: 100%;
943
1114
  border-radius: 0;
@@ -948,6 +1119,16 @@
948
1119
  * layer, which on a phone is a stray line under the browser chrome.
949
1120
  */
950
1121
  border: 0;
1122
+ /**
1123
+ * The virtual keyboard. `observeKeyboardInset` in `@slotted/core/measure`
1124
+ * measures what the keyboard covers, the binding writes it on the open
1125
+ * layer, and the panel's rows end above the keys: a full-screen panel is
1126
+ * the layout viewport's height, and the keyboard shrinks only the visual
1127
+ * one. Nought under `interactive-widget=resizes-content`, whose layout
1128
+ * already shrank.
1129
+ */
1130
+ box-sizing: border-box;
1131
+ padding-block-end: var(--slotted-keyboard-inset, 0px);
951
1132
  }
952
1133
 
953
1134
  /* ── Forced colours ───────────────────────────────────────────────────── */
@@ -960,7 +1141,7 @@
960
1141
  * a system border is read at.
961
1142
  */
962
1143
  @media (forced-colors: active) {
963
- [data-ui='dialog'] > [data-part='viewport'] > [data-part='content'] {
1144
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] {
964
1145
  border-color: CanvasText;
965
1146
  border-width: var(--slotted-border-width-thick, 2px);
966
1147
  }