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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +35 -42
  4. package/src/action-sheet/action-sheet.css +36 -36
  5. package/src/alert/alert.css +43 -35
  6. package/src/alert/alert.tokens.json +5 -0
  7. package/src/app-shell/app-shell.css +356 -301
  8. package/src/aspect-ratio/aspect-ratio.css +9 -9
  9. package/src/attachment/attachment.css +91 -99
  10. package/src/avatar/avatar.css +71 -41
  11. package/src/avatar/avatar.tokens.json +7 -0
  12. package/src/avatar-group/avatar-group.css +21 -22
  13. package/src/badge/badge.css +45 -37
  14. package/src/badge/badge.tokens.json +5 -0
  15. package/src/breadcrumb/breadcrumb.css +37 -37
  16. package/src/button/button.css +149 -68
  17. package/src/button/button.tokens.json +10 -0
  18. package/src/button-group/button-group.css +79 -74
  19. package/src/button-group/button-group.tokens.json +2 -0
  20. package/src/calendar/calendar.css +93 -103
  21. package/src/card/card.css +54 -61
  22. package/src/carousel/carousel.css +150 -161
  23. package/src/cascader/cascader.css +152 -153
  24. package/src/cascader/cascader.tokens.json +1 -0
  25. package/src/chart/chart.css +242 -239
  26. package/src/chart/chart.tokens.json +1 -0
  27. package/src/checkbox/checkbox.css +119 -124
  28. package/src/checkbox-group/checkbox-group.css +7 -7
  29. package/src/code-block/code-block.css +81 -85
  30. package/src/collapsible/collapsible.css +69 -76
  31. package/src/color-picker/color-picker.css +83 -91
  32. package/src/column-manager/column-manager.css +106 -114
  33. package/src/combobox/combobox.css +132 -107
  34. package/src/combobox/combobox.tokens.json +1 -0
  35. package/src/command-palette/command-palette.css +103 -90
  36. package/src/command-palette/command-palette.tokens.json +1 -0
  37. package/src/container/container.css +24 -24
  38. package/src/context-menu/context-menu.css +8 -8
  39. package/src/currency-field/currency-field.css +210 -88
  40. package/src/currency-field/currency-field.tokens.json +13 -0
  41. package/src/dashboard-grid/dashboard-grid.css +148 -116
  42. package/src/data-grid/data-grid.css +535 -470
  43. package/src/data-grid/data-grid.tokens.json +4 -0
  44. package/src/data-list/data-list.css +81 -70
  45. package/src/data-list/data-list.tokens.json +2 -1
  46. package/src/date-field/date-field.css +55 -52
  47. package/src/date-field/date-field.tokens.json +1 -0
  48. package/src/date-picker/date-picker.css +40 -42
  49. package/src/date-range-picker/date-range-picker.css +114 -118
  50. package/src/datetime-field/datetime-field.css +78 -80
  51. package/src/datetime-field/datetime-field.tokens.json +1 -0
  52. package/src/datetime-picker/datetime-picker.css +61 -63
  53. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  54. package/src/description-list/description-list.css +61 -64
  55. package/src/detail-panel/detail-panel.css +86 -71
  56. package/src/detail-panel/detail-panel.tokens.json +2 -0
  57. package/src/dialog/dialog.css +372 -153
  58. package/src/dialog/dialog.tokens.json +6 -0
  59. package/src/divider/divider.css +18 -18
  60. package/src/drawer/drawer.css +205 -210
  61. package/src/drawer/drawer.tokens.json +1 -0
  62. package/src/entity-picker/entity-picker.css +238 -241
  63. package/src/entity-picker/entity-picker.tokens.json +1 -0
  64. package/src/event-calendar/event-calendar.css +343 -385
  65. package/src/field/field.css +74 -78
  66. package/src/field-group/field-group.css +22 -25
  67. package/src/filter-bar/filter-bar.css +193 -209
  68. package/src/form/form.css +34 -24
  69. package/src/form/form.tokens.json +1 -0
  70. package/src/fullscreen/fullscreen.css +24 -25
  71. package/src/grid/grid.css +28 -28
  72. package/src/highlight/highlight.css +6 -6
  73. package/src/hover-card/hover-card.css +6 -6
  74. package/src/icon/icon.css +19 -15
  75. package/src/icon/icon.tokens.json +1 -0
  76. package/src/image/image.css +39 -39
  77. package/src/import-export-center/import-export-center.css +135 -156
  78. package/src/inline/inline.css +27 -27
  79. package/src/inline-message/inline-message.css +52 -28
  80. package/src/inline-message/inline-message.tokens.json +4 -0
  81. package/src/kbd/kbd.css +30 -26
  82. package/src/link/link.css +15 -15
  83. package/src/list/list.css +44 -17
  84. package/src/list/list.tokens.json +4 -0
  85. package/src/list-item/list-item.css +80 -66
  86. package/src/list-item/list-item.tokens.json +7 -0
  87. package/src/listbox/listbox.css +56 -59
  88. package/src/loading-overlay/loading-overlay.css +75 -92
  89. package/src/markdown/markdown.css +17 -17
  90. package/src/menu/menu.css +83 -63
  91. package/src/menubar/menubar.css +13 -13
  92. package/src/message/message.css +182 -202
  93. package/src/message/message.tokens.json +5 -0
  94. package/src/message-scroller/message-scroller.css +41 -42
  95. package/src/multi-select/multi-select.css +152 -145
  96. package/src/multi-select/multi-select.tokens.json +1 -0
  97. package/src/navigation-menu/navigation-menu.css +167 -188
  98. package/src/notification-center/notification-center.css +140 -148
  99. package/src/notification-center/notification-center.tokens.json +3 -0
  100. package/src/number-field/number-field.css +84 -83
  101. package/src/number-field/number-field.tokens.json +1 -0
  102. package/src/otp-input/otp-input.css +67 -57
  103. package/src/otp-input/otp-input.tokens.json +1 -0
  104. package/src/page/page.css +39 -23
  105. package/src/page/page.tokens.json +1 -0
  106. package/src/page-header/page-header.css +323 -283
  107. package/src/page-header/page-header.tokens.json +5 -0
  108. package/src/pagination/pagination.css +68 -72
  109. package/src/popover/popover.css +40 -49
  110. package/src/progress-indicator/progress-indicator.css +177 -120
  111. package/src/progress-indicator/progress-indicator.tokens.json +1 -1
  112. package/src/prompt-composer/prompt-composer.css +221 -102
  113. package/src/prompt-composer/prompt-composer.tokens.json +15 -0
  114. package/src/prose/prose.css +71 -75
  115. package/src/radio-group/radio-group.css +98 -103
  116. package/src/rating/rating.css +136 -132
  117. package/src/rating/rating.tokens.json +1 -0
  118. package/src/result-state/result-state.css +74 -77
  119. package/src/runtime-properties.mjs +2 -0
  120. package/src/saved-views/saved-views.css +41 -47
  121. package/src/scroll-area/scroll-area.css +39 -32
  122. package/src/section/section.css +161 -41
  123. package/src/section/section.tokens.json +7 -2
  124. package/src/segmented-control/segmented-control.css +254 -97
  125. package/src/segmented-control/segmented-control.tokens.json +15 -11
  126. package/src/select/select.css +118 -117
  127. package/src/select/select.tokens.json +1 -0
  128. package/src/side-navigation/side-navigation.css +179 -182
  129. package/src/side-navigation/side-navigation.tokens.json +1 -0
  130. package/src/skeleton/skeleton.css +47 -48
  131. package/src/slider/slider.css +86 -88
  132. package/src/sparkline/sparkline.css +62 -40
  133. package/src/sparkline/sparkline.tokens.json +2 -0
  134. package/src/spinner/spinner.css +83 -180
  135. package/src/spinner/spinner.tokens.json +0 -1
  136. package/src/split-button/split-button.css +30 -31
  137. package/src/split-button/split-button.tokens.json +1 -0
  138. package/src/splitter/splitter.css +35 -35
  139. package/src/stack/stack.css +24 -24
  140. package/src/stat-card/stat-card.css +341 -224
  141. package/src/stat-card/stat-card.tokens.json +3 -0
  142. package/src/status-indicator/status-indicator.css +28 -28
  143. package/src/stepper/stepper.css +58 -62
  144. package/src/switch/switch.css +86 -92
  145. package/src/table/table.css +310 -165
  146. package/src/table/table.tokens.json +6 -0
  147. package/src/table-of-contents/table-of-contents.css +51 -54
  148. package/src/tabs/tabs.css +337 -302
  149. package/src/tabs/tabs.tokens.json +8 -5
  150. package/src/tag/tag.css +79 -71
  151. package/src/tag/tag.tokens.json +9 -0
  152. package/src/tags-input/tags-input.css +145 -82
  153. package/src/tags-input/tags-input.tokens.json +7 -1
  154. package/src/text-field/text-field.css +132 -136
  155. package/src/text-field/text-field.tokens.json +1 -0
  156. package/src/textarea/textarea.css +31 -28
  157. package/src/textarea/textarea.tokens.json +1 -0
  158. package/src/time-field/time-field.css +72 -69
  159. package/src/time-field/time-field.tokens.json +1 -0
  160. package/src/time-picker/time-picker.css +56 -58
  161. package/src/time-range-picker/time-range-picker.css +126 -133
  162. package/src/timeline/timeline.css +254 -266
  163. package/src/timeline/timeline.tokens.json +5 -0
  164. package/src/toast/toast.css +108 -90
  165. package/src/toast/toast.tokens.json +6 -0
  166. package/src/toggle/toggle.css +62 -25
  167. package/src/toggle/toggle.tokens.json +8 -0
  168. package/src/toggle-group/toggle-group.css +106 -60
  169. package/src/toggle-group/toggle-group.tokens.json +10 -0
  170. package/src/toolbar/toolbar.css +30 -35
  171. package/src/tooltip/tooltip.css +26 -26
  172. package/src/top-navigation/top-navigation.css +243 -259
  173. package/src/tour/tour.css +51 -60
  174. package/src/transfer/transfer.css +160 -164
  175. package/src/tree/tree.css +103 -111
  176. package/src/typography/typography.css +40 -36
  177. package/src/typography/typography.tokens.json +1 -0
  178. package/src/upload/upload.css +224 -224
  179. package/src/visually-hidden/visually-hidden.css +1 -1
  180. package/src/wizard/wizard.css +185 -197
@@ -35,7 +35,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%;
@@ -343,6 +356,21 @@
343
356
  */
344
357
  opacity: 0;
345
358
  transition: opacity var(--slotted-duration-short) var(--slotted-easing-exit);
359
+
360
+ /**
361
+ * A theme draws the panel as a material with a surface that has alpha and
362
+ * this filter, `none` unless set. The panel's own fade keeps the filter
363
+ * drawn; an ancestor's opacity below one is what removes it.
364
+ */
365
+ -webkit-backdrop-filter: var(--slotted-dialog-backdrop-filter, none);
366
+ backdrop-filter: var(--slotted-dialog-backdrop-filter, none);
367
+ }
368
+
369
+ @media (prefers-reduced-transparency: reduce), (forced-colors: active) {
370
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] {
371
+ -webkit-backdrop-filter: none;
372
+ backdrop-filter: none;
373
+ }
346
374
  }
347
375
 
348
376
  /**
@@ -355,7 +383,7 @@
355
383
  * the edge it sits on, and it is on the same rule now for the same reason:
356
384
  * the type inside it is what the slide was resampling (DG4).
357
385
  */
358
- [data-ui='dialog'][data-open] > [data-part='viewport'] > [data-part='content'] {
386
+ [data-ui-dialog][data-open] > [data-part-viewport] > [data-part-content] {
359
387
  opacity: 1;
360
388
  transition: opacity var(--slotted-duration-long) var(--slotted-easing-standard);
361
389
  }
@@ -369,10 +397,20 @@
369
397
  * travelling, and there is no travel to stop (DG4).
370
398
  */
371
399
 
372
- [data-ui='dialog'][data-scroll='viewport'] > [data-part='viewport'] > [data-part='content'] {
400
+ [data-ui-dialog][data-scroll='viewport'] > [data-part-viewport] > [data-part-content] {
373
401
  max-block-size: none;
374
402
  }
375
403
 
404
+ /**
405
+ * A form written around the header, the body and the footer, so Enter in
406
+ * any field and the footer's submit belong to one form. It draws no box:
407
+ * its children are the panel's rows, and every rule of a part is written a
408
+ * second time through it, so the parts keep the panel's inset and rows.
409
+ */
410
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > form {
411
+ display: contents;
412
+ }
413
+
376
414
  /* ── The header ───────────────────────────────────────────────────────── */
377
415
 
378
416
  /**
@@ -396,7 +434,8 @@
396
434
  * `interpolate-size`. The cost is a rule over a footer that sometimes has
397
435
  * nothing above it to separate.
398
436
  */
399
- [data-ui='dialog'] > [data-part='viewport'] > [data-part='content'] > [data-part='header'] {
437
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > form > [data-part-header],
438
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > [data-part-header] {
400
439
  display: grid;
401
440
  grid-template-columns: auto minmax(0, 1fr) auto auto;
402
441
  align-items: start;
@@ -421,16 +460,28 @@
421
460
  * where the mark would have gone, and moved as soon as a tone was set. Where
422
461
  * it goes is now a rule rather than an accident of the grid.
423
462
  */
424
- [data-ui='dialog']
425
- > [data-part='viewport']
426
- > [data-part='content']
427
- > [data-part='header']
463
+ [data-ui-dialog]
464
+ > [data-part-viewport]
465
+ > [data-part-content]
466
+ > form
467
+ > [data-part-header]
468
+ > *:not(
469
+ [data-part-icon],
470
+ [data-part-title],
471
+ [data-part-description],
472
+ [data-part-fullscreen],
473
+ [data-part-close]
474
+ ),
475
+ [data-ui-dialog]
476
+ > [data-part-viewport]
477
+ > [data-part-content]
478
+ > [data-part-header]
428
479
  > *:not(
429
- [data-part='icon'],
430
- [data-part='title'],
431
- [data-part='description'],
432
- [data-part='fullscreen'],
433
- [data-part='close']
480
+ [data-part-icon],
481
+ [data-part-title],
482
+ [data-part-description],
483
+ [data-part-fullscreen],
484
+ [data-part-close]
434
485
  ) {
435
486
  grid-column: 2;
436
487
  /**
@@ -453,11 +504,17 @@
453
504
  * colours every tone becomes one system colour and the silhouette is all
454
505
  * that is left.
455
506
  */
456
- [data-ui='dialog']
457
- > [data-part='viewport']
458
- > [data-part='content']
459
- > [data-part='header']
460
- > [data-part='icon'] {
507
+ [data-ui-dialog]
508
+ > [data-part-viewport]
509
+ > [data-part-content]
510
+ > form
511
+ > [data-part-header]
512
+ > [data-part-icon],
513
+ [data-ui-dialog]
514
+ > [data-part-viewport]
515
+ > [data-part-content]
516
+ > [data-part-header]
517
+ > [data-part-icon] {
461
518
  --slotted-icon-size: var(--_status-size);
462
519
 
463
520
  grid-column: 1;
@@ -478,23 +535,27 @@
478
535
  margin-inline-end: var(--_mark-gap);
479
536
  }
480
537
 
481
- [data-ui='dialog'][data-tone='accent'] {
538
+ [data-ui-dialog][data-tone='accent'] {
482
539
  --_tone-color: var(--slotted-tone-accent-text, CanvasText);
483
540
  }
484
541
 
485
- [data-ui='dialog'][data-tone='secondary'] {
542
+ [data-ui-dialog][data-tone='secondary'] {
486
543
  --_tone-color: var(--slotted-tone-secondary-text, CanvasText);
487
544
  }
488
545
 
489
- [data-ui='dialog'][data-tone='success'] {
546
+ [data-ui-dialog][data-tone='success'] {
490
547
  --_tone-color: var(--slotted-tone-success-text, CanvasText);
491
548
  }
492
549
 
493
- [data-ui='dialog'][data-tone='warning'] {
550
+ [data-ui-dialog][data-tone='info'] {
551
+ --_tone-color: var(--slotted-tone-info-text, CanvasText);
552
+ }
553
+
554
+ [data-ui-dialog][data-tone='warning'] {
494
555
  --_tone-color: var(--slotted-tone-warning-text, CanvasText);
495
556
  }
496
557
 
497
- [data-ui='dialog'][data-tone='danger'] {
558
+ [data-ui-dialog][data-tone='danger'] {
498
559
  --_tone-color: var(--slotted-tone-danger-text, CanvasText);
499
560
  }
500
561
 
@@ -506,11 +567,17 @@
506
567
  * panel past the layer, and the panel is centred, so both of its edges leave
507
568
  * the screen at once.
508
569
  */
509
- [data-ui='dialog']
510
- > [data-part='viewport']
511
- > [data-part='content']
512
- > [data-part='header']
513
- > [data-part='title'] {
570
+ [data-ui-dialog]
571
+ > [data-part-viewport]
572
+ > [data-part-content]
573
+ > form
574
+ > [data-part-header]
575
+ > [data-part-title],
576
+ [data-ui-dialog]
577
+ > [data-part-viewport]
578
+ > [data-part-content]
579
+ > [data-part-header]
580
+ > [data-part-title] {
514
581
  grid-column: 2;
515
582
  grid-row: 1;
516
583
  margin: 0;
@@ -529,11 +596,17 @@
529
596
  color: var(--slotted-dialog-title-color, var(--slotted-text, CanvasText));
530
597
  }
531
598
 
532
- [data-ui='dialog']
533
- > [data-part='viewport']
534
- > [data-part='content']
535
- > [data-part='header']
536
- > [data-part='description'] {
599
+ [data-ui-dialog]
600
+ > [data-part-viewport]
601
+ > [data-part-content]
602
+ > form
603
+ > [data-part-header]
604
+ > [data-part-description],
605
+ [data-ui-dialog]
606
+ > [data-part-viewport]
607
+ > [data-part-content]
608
+ > [data-part-header]
609
+ > [data-part-description] {
537
610
  grid-column: 2;
538
611
  grid-row: 2;
539
612
  margin: 0;
@@ -552,11 +625,18 @@
552
625
  * weight instead, which is what both product confirmations in the survey do
553
626
  * with a span of their own.
554
627
  */
555
- [data-ui='dialog']
556
- > [data-part='viewport']
557
- > [data-part='content']
558
- > [data-part='header']
559
- > [data-part='description']
628
+ [data-ui-dialog]
629
+ > [data-part-viewport]
630
+ > [data-part-content]
631
+ > form
632
+ > [data-part-header]
633
+ > [data-part-description]
634
+ :is(strong, b),
635
+ [data-ui-dialog]
636
+ > [data-part-viewport]
637
+ > [data-part-content]
638
+ > [data-part-header]
639
+ > [data-part-description]
560
640
  :is(strong, b) {
561
641
  font-weight: var(--slotted-font-weight-semibold, 600);
562
642
  color: var(--slotted-dialog-title-color, var(--slotted-text, CanvasText));
@@ -572,11 +652,17 @@
572
652
  * in an `icon` box, sized here through the icon token so the box and the
573
653
  * formula above read one length.
574
654
  */
575
- [data-ui='dialog']
576
- > [data-part='viewport']
577
- > [data-part='content']
578
- > [data-part='header']
579
- > [data-part='close'] {
655
+ [data-ui-dialog]
656
+ > [data-part-viewport]
657
+ > [data-part-content]
658
+ > form
659
+ > [data-part-header]
660
+ > [data-part-close],
661
+ [data-ui-dialog]
662
+ > [data-part-viewport]
663
+ > [data-part-content]
664
+ > [data-part-header]
665
+ > [data-part-close] {
580
666
  --slotted-icon-size: var(--_icon-size);
581
667
 
582
668
  grid-column: 4;
@@ -604,11 +690,17 @@
604
690
  var(--slotted-control-transition-easing, var(--slotted-easing-standard));
605
691
  }
606
692
 
607
- [data-ui='dialog']
608
- > [data-part='viewport']
609
- > [data-part='content']
610
- > [data-part='header']
611
- > [data-part='close']:not(:disabled):hover {
693
+ [data-ui-dialog]
694
+ > [data-part-viewport]
695
+ > [data-part-content]
696
+ > form
697
+ > [data-part-header]
698
+ > [data-part-close]:not(:disabled):hover,
699
+ [data-ui-dialog]
700
+ > [data-part-viewport]
701
+ > [data-part-content]
702
+ > [data-part-header]
703
+ > [data-part-close]:not(:disabled):hover {
612
704
  /* The ground moves under the pointer and nothing else does (R2). */
613
705
  background-color: var(
614
706
  --slotted-dialog-close-hover-background,
@@ -616,22 +708,34 @@
616
708
  );
617
709
  }
618
710
 
619
- [data-ui='dialog']
620
- > [data-part='viewport']
621
- > [data-part='content']
622
- > [data-part='header']
623
- > [data-part='close']:not(:disabled):active {
711
+ [data-ui-dialog]
712
+ > [data-part-viewport]
713
+ > [data-part-content]
714
+ > form
715
+ > [data-part-header]
716
+ > [data-part-close]:not(:disabled):active,
717
+ [data-ui-dialog]
718
+ > [data-part-viewport]
719
+ > [data-part-content]
720
+ > [data-part-header]
721
+ > [data-part-close]:not(:disabled):active {
624
722
  background-color: var(
625
723
  --slotted-dialog-close-active-background,
626
724
  var(--slotted-tone-secondary-subtle-active)
627
725
  );
628
726
  }
629
727
 
630
- [data-ui='dialog']
631
- > [data-part='viewport']
632
- > [data-part='content']
633
- > [data-part='header']
634
- > [data-part='close']:focus-visible {
728
+ [data-ui-dialog]
729
+ > [data-part-viewport]
730
+ > [data-part-content]
731
+ > form
732
+ > [data-part-header]
733
+ > [data-part-close]:focus-visible,
734
+ [data-ui-dialog]
735
+ > [data-part-viewport]
736
+ > [data-part-content]
737
+ > [data-part-header]
738
+ > [data-part-close]:focus-visible {
635
739
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
636
740
  outline-offset: calc(-1 * var(--slotted-focus-ring-offset, 2px));
637
741
  }
@@ -652,11 +756,17 @@
652
756
  * glyph is the binding's, chosen from the state: the mark says what the
653
757
  * press does next, so it is the opposite of the state the panel is in.
654
758
  */
655
- [data-ui='dialog']
656
- > [data-part='viewport']
657
- > [data-part='content']
658
- > [data-part='header']
659
- > [data-part='fullscreen'] {
759
+ [data-ui-dialog]
760
+ > [data-part-viewport]
761
+ > [data-part-content]
762
+ > form
763
+ > [data-part-header]
764
+ > [data-part-fullscreen],
765
+ [data-ui-dialog]
766
+ > [data-part-viewport]
767
+ > [data-part-content]
768
+ > [data-part-header]
769
+ > [data-part-fullscreen] {
660
770
  --slotted-icon-size: var(--_icon-size);
661
771
 
662
772
  grid-column: 3;
@@ -687,20 +797,33 @@
687
797
  * glyph on every side, and a second gap between them would set them further
688
798
  * apart than either is from the words.
689
799
  */
690
- [data-ui='dialog']
691
- > [data-part='viewport']
692
- > [data-part='content']
693
- > [data-part='header']
694
- > [data-part='fullscreen']
695
- + [data-part='close'] {
800
+ [data-ui-dialog]
801
+ > [data-part-viewport]
802
+ > [data-part-content]
803
+ > form
804
+ > [data-part-header]
805
+ > [data-part-fullscreen]
806
+ + [data-part-close],
807
+ [data-ui-dialog]
808
+ > [data-part-viewport]
809
+ > [data-part-content]
810
+ > [data-part-header]
811
+ > [data-part-fullscreen]
812
+ + [data-part-close] {
696
813
  margin-inline-start: 0;
697
814
  }
698
815
 
699
- [data-ui='dialog']
700
- > [data-part='viewport']
701
- > [data-part='content']
702
- > [data-part='header']
703
- > [data-part='fullscreen']:not(:disabled):hover {
816
+ [data-ui-dialog]
817
+ > [data-part-viewport]
818
+ > [data-part-content]
819
+ > form
820
+ > [data-part-header]
821
+ > [data-part-fullscreen]:not(:disabled):hover,
822
+ [data-ui-dialog]
823
+ > [data-part-viewport]
824
+ > [data-part-content]
825
+ > [data-part-header]
826
+ > [data-part-fullscreen]:not(:disabled):hover {
704
827
  /* The ground moves under the pointer and nothing else does (R2). */
705
828
  background-color: var(
706
829
  --slotted-dialog-close-hover-background,
@@ -708,22 +831,34 @@
708
831
  );
709
832
  }
710
833
 
711
- [data-ui='dialog']
712
- > [data-part='viewport']
713
- > [data-part='content']
714
- > [data-part='header']
715
- > [data-part='fullscreen']:not(:disabled):active {
834
+ [data-ui-dialog]
835
+ > [data-part-viewport]
836
+ > [data-part-content]
837
+ > form
838
+ > [data-part-header]
839
+ > [data-part-fullscreen]:not(:disabled):active,
840
+ [data-ui-dialog]
841
+ > [data-part-viewport]
842
+ > [data-part-content]
843
+ > [data-part-header]
844
+ > [data-part-fullscreen]:not(:disabled):active {
716
845
  background-color: var(
717
846
  --slotted-dialog-close-active-background,
718
847
  var(--slotted-tone-secondary-subtle-active)
719
848
  );
720
849
  }
721
850
 
722
- [data-ui='dialog']
723
- > [data-part='viewport']
724
- > [data-part='content']
725
- > [data-part='header']
726
- > [data-part='fullscreen']:focus-visible {
851
+ [data-ui-dialog]
852
+ > [data-part-viewport]
853
+ > [data-part-content]
854
+ > form
855
+ > [data-part-header]
856
+ > [data-part-fullscreen]:focus-visible,
857
+ [data-ui-dialog]
858
+ > [data-part-viewport]
859
+ > [data-part-content]
860
+ > [data-part-header]
861
+ > [data-part-fullscreen]:focus-visible {
727
862
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
728
863
  outline-offset: calc(-1 * var(--slotted-focus-ring-offset, 2px));
729
864
  }
@@ -735,38 +870,63 @@
735
870
  * controls touch, so neither reaches across the edge they share.
736
871
  */
737
872
  @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']) {
873
+ [data-ui-dialog]
874
+ > [data-part-viewport]
875
+ > [data-part-content]
876
+ > form
877
+ > [data-part-header]
878
+ > :is([data-part-close], [data-part-fullscreen]),
879
+ [data-ui-dialog]
880
+ > [data-part-viewport]
881
+ > [data-part-content]
882
+ > [data-part-header]
883
+ > :is([data-part-close], [data-part-fullscreen]) {
743
884
  position: relative;
744
885
  }
745
886
 
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 {
887
+ [data-ui-dialog]
888
+ > [data-part-viewport]
889
+ > [data-part-content]
890
+ > form
891
+ > [data-part-header]
892
+ > :is([data-part-close], [data-part-fullscreen])::before,
893
+ [data-ui-dialog]
894
+ > [data-part-viewport]
895
+ > [data-part-content]
896
+ > [data-part-header]
897
+ > :is([data-part-close], [data-part-fullscreen])::before {
751
898
  content: '';
752
899
  inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
753
900
  position: absolute;
754
901
  }
755
902
 
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 {
903
+ [data-ui-dialog]
904
+ > [data-part-viewport]
905
+ > [data-part-content]
906
+ > form
907
+ > [data-part-header]
908
+ > [data-part-fullscreen]:has(+ [data-part-close])::before,
909
+ [data-ui-dialog]
910
+ > [data-part-viewport]
911
+ > [data-part-content]
912
+ > [data-part-header]
913
+ > [data-part-fullscreen]:has(+ [data-part-close])::before {
761
914
  inset-inline-end: 0;
762
915
  }
763
916
 
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 {
917
+ [data-ui-dialog]
918
+ > [data-part-viewport]
919
+ > [data-part-content]
920
+ > form
921
+ > [data-part-header]
922
+ > [data-part-fullscreen]
923
+ + [data-part-close]::before,
924
+ [data-ui-dialog]
925
+ > [data-part-viewport]
926
+ > [data-part-content]
927
+ > [data-part-header]
928
+ > [data-part-fullscreen]
929
+ + [data-part-close]::before {
770
930
  inset-inline-start: 0;
771
931
  }
772
932
  }
@@ -779,15 +939,21 @@
779
939
  * `dismissable-layer` covers the modal case; this covers the non-modal one,
780
940
  * where the page behind is not locked at all.
781
941
  */
782
- [data-ui='dialog']
783
- > [data-part='viewport']
784
- > [data-part='content']
785
- > [data-part='body']:not(:first-child) {
942
+ [data-ui-dialog]
943
+ > [data-part-viewport]
944
+ > [data-part-content]
945
+ > form
946
+ > [data-part-body]:not(:first-child),
947
+ [data-ui-dialog]
948
+ > [data-part-viewport]
949
+ > [data-part-content]
950
+ > [data-part-body]:not(:first-child) {
786
951
  border-block-start: var(--_rule-size) solid
787
952
  var(--slotted-dialog-rule-color, var(--slotted-border-subtle, ButtonBorder));
788
953
  }
789
954
 
790
- [data-ui='dialog'] > [data-part='viewport'] > [data-part='content'] > [data-part='body'] {
955
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > form > [data-part-body],
956
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > [data-part-body] {
791
957
  min-block-size: 0;
792
958
  overflow-x: hidden;
793
959
  overflow-y: auto;
@@ -801,10 +967,15 @@
801
967
  color: var(--slotted-dialog-body-color, var(--slotted-text, CanvasText));
802
968
  }
803
969
 
804
- [data-ui='dialog'][data-scroll='viewport']
805
- > [data-part='viewport']
806
- > [data-part='content']
807
- > [data-part='body'] {
970
+ [data-ui-dialog][data-scroll='viewport']
971
+ > [data-part-viewport]
972
+ > [data-part-content]
973
+ > form
974
+ > [data-part-body],
975
+ [data-ui-dialog][data-scroll='viewport']
976
+ > [data-part-viewport]
977
+ > [data-part-content]
978
+ > [data-part-body] {
808
979
  overflow: visible;
809
980
  }
810
981
 
@@ -815,10 +986,12 @@
815
986
  * header, the close button and Escape all stay operable: a loading dialog a
816
987
  * reader cannot leave is the worse failure of the two.
817
988
  */
818
- [data-ui='dialog'][data-loading]
819
- > [data-part='viewport']
820
- > [data-part='content']
821
- > [data-part='body'] {
989
+ [data-ui-dialog][data-loading]
990
+ > [data-part-viewport]
991
+ > [data-part-content]
992
+ > form
993
+ > [data-part-body],
994
+ [data-ui-dialog][data-loading] > [data-part-viewport] > [data-part-content] > [data-part-body] {
822
995
  min-block-size: var(--slotted-space-12, 4rem);
823
996
  }
824
997
 
@@ -830,7 +1003,8 @@
830
1003
  * reason `content` is bounded — an unbounded panel pushes it past the fold,
831
1004
  * which is the whole failure the three-row grid exists to prevent.
832
1005
  */
833
- [data-ui='dialog'] > [data-part='viewport'] > [data-part='content'] > [data-part='footer'] {
1006
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > form > [data-part-footer],
1007
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] > [data-part-footer] {
834
1008
  display: flex;
835
1009
  flex-wrap: wrap;
836
1010
  align-items: center;
@@ -841,10 +1015,15 @@
841
1015
  background: var(--slotted-dialog-footer-surface, var(--slotted-surface-sunken, Canvas));
842
1016
  }
843
1017
 
844
- [data-ui='dialog']
845
- > [data-part='viewport']
846
- > [data-part='content']
847
- > [data-part='footer']:not(:first-child) {
1018
+ [data-ui-dialog]
1019
+ > [data-part-viewport]
1020
+ > [data-part-content]
1021
+ > form
1022
+ > [data-part-footer]:not(:first-child),
1023
+ [data-ui-dialog]
1024
+ > [data-part-viewport]
1025
+ > [data-part-content]
1026
+ > [data-part-footer]:not(:first-child) {
848
1027
  border-block-start: var(--_rule-size) solid
849
1028
  var(--slotted-dialog-rule-color, var(--slotted-border-subtle, ButtonBorder));
850
1029
  }
@@ -872,7 +1051,7 @@
872
1051
  * writes their own three-row grid, which is the whole of what they are taking
873
1052
  * over.
874
1053
  */
875
- [data-ui='dialog'][data-surface='plain'] > [data-part='viewport'] > [data-part='content'] {
1054
+ [data-ui-dialog][data-surface='plain'] > [data-part-viewport] > [data-part-content] {
876
1055
  display: block;
877
1056
  background: none;
878
1057
  border: 0;
@@ -881,10 +1060,38 @@
881
1060
  overflow: visible;
882
1061
  }
883
1062
 
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']) {
1063
+ /**
1064
+ * The children fade in the panel's place, at the panel's durations. A plain
1065
+ * panel paints nothing, so the picture is the same; what changes is that no
1066
+ * ancestor of a child's material is below full opacity, which in Chromium
1067
+ * would draw no backdrop filter until the fade ended — a command palette
1068
+ * drawn as a material showed the page sharp behind it for the whole fade.
1069
+ */
1070
+ [data-ui-dialog][data-surface='plain'] > [data-part-viewport] > [data-part-content] {
1071
+ opacity: 1;
1072
+ transition: none;
1073
+ }
1074
+ [data-ui-dialog][data-surface='plain'] > [data-part-viewport] > [data-part-content] > * {
1075
+ opacity: 0;
1076
+ transition: opacity var(--slotted-duration-short) var(--slotted-easing-exit);
1077
+ }
1078
+ [data-ui-dialog][data-surface='plain'][data-open]
1079
+ > [data-part-viewport]
1080
+ > [data-part-content]
1081
+ > * {
1082
+ opacity: 1;
1083
+ transition: opacity var(--slotted-duration-long) var(--slotted-easing-standard);
1084
+ }
1085
+
1086
+ [data-ui-dialog][data-surface='plain']
1087
+ > [data-part-viewport]
1088
+ > [data-part-content]
1089
+ > form
1090
+ > :is([data-part-header], [data-part-body], [data-part-footer]),
1091
+ [data-ui-dialog][data-surface='plain']
1092
+ > [data-part-viewport]
1093
+ > [data-part-content]
1094
+ > :is([data-part-header], [data-part-body], [data-part-footer]) {
888
1095
  background: none;
889
1096
  border: 0;
890
1097
  padding: 0;
@@ -909,16 +1116,18 @@
909
1116
  * a literal because `@container (max-inline-size: var(--x))` is invalid CSS.
910
1117
  */
911
1118
  @container slotted-dialog (max-inline-size: 30rem) {
912
- [data-ui='dialog'][data-full-screen='narrow'] > [data-part='viewport'] {
1119
+ [data-ui-dialog][data-full-screen='narrow'] > [data-part-viewport] {
913
1120
  align-content: stretch;
914
1121
  padding: 0;
915
1122
  }
916
1123
 
917
- [data-ui='dialog'][data-full-screen='narrow'] > [data-part='viewport'] > [data-part='content'] {
1124
+ [data-ui-dialog][data-full-screen='narrow'] > [data-part-viewport] > [data-part-content] {
918
1125
  max-inline-size: none;
919
1126
  block-size: 100%;
920
1127
  border-radius: 0;
921
1128
  border: 0;
1129
+ box-sizing: border-box;
1130
+ padding-block-end: var(--slotted-keyboard-inset, 0px);
922
1131
  }
923
1132
  }
924
1133
 
@@ -930,14 +1139,14 @@
930
1139
  * owns both — a panel that animated its own box would animate `inset`,
931
1140
  * `inline-size` and `block-size`, which is the rule R7 exists to state.
932
1141
  */
933
- [data-ui='dialog'][data-full-screen='always'] > [data-part='viewport'],
934
- [data-ui='dialog'][data-fullscreen] > [data-part='viewport'] {
1142
+ [data-ui-dialog][data-full-screen='always'] > [data-part-viewport],
1143
+ [data-ui-dialog][data-fullscreen] > [data-part-viewport] {
935
1144
  align-content: stretch;
936
1145
  padding: 0;
937
1146
  }
938
1147
 
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'] {
1148
+ [data-ui-dialog][data-full-screen='always'] > [data-part-viewport] > [data-part-content],
1149
+ [data-ui-dialog][data-fullscreen] > [data-part-viewport] > [data-part-content] {
941
1150
  max-inline-size: none;
942
1151
  block-size: 100%;
943
1152
  border-radius: 0;
@@ -948,6 +1157,16 @@
948
1157
  * layer, which on a phone is a stray line under the browser chrome.
949
1158
  */
950
1159
  border: 0;
1160
+ /**
1161
+ * The virtual keyboard. `observeKeyboardInset` in `@slotted/core/measure`
1162
+ * measures what the keyboard covers, the binding writes it on the open
1163
+ * layer, and the panel's rows end above the keys: a full-screen panel is
1164
+ * the layout viewport's height, and the keyboard shrinks only the visual
1165
+ * one. Nought under `interactive-widget=resizes-content`, whose layout
1166
+ * already shrank.
1167
+ */
1168
+ box-sizing: border-box;
1169
+ padding-block-end: var(--slotted-keyboard-inset, 0px);
951
1170
  }
952
1171
 
953
1172
  /* ── Forced colours ───────────────────────────────────────────────────── */
@@ -960,7 +1179,7 @@
960
1179
  * a system border is read at.
961
1180
  */
962
1181
  @media (forced-colors: active) {
963
- [data-ui='dialog'] > [data-part='viewport'] > [data-part='content'] {
1182
+ [data-ui-dialog] > [data-part-viewport] > [data-part-content] {
964
1183
  border-color: CanvasText;
965
1184
  border-width: var(--slotted-border-width-thick, 2px);
966
1185
  }