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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/package.json +1 -1
  2. package/src/accordion/accordion.css +10 -10
  3. package/src/action-bar/action-bar.css +31 -32
  4. package/src/action-sheet/action-sheet.css +36 -36
  5. package/src/alert/alert.css +43 -35
  6. package/src/alert/alert.tokens.json +5 -0
  7. package/src/app-shell/app-shell.css +356 -301
  8. package/src/aspect-ratio/aspect-ratio.css +9 -9
  9. package/src/attachment/attachment.css +91 -99
  10. package/src/avatar/avatar.css +71 -41
  11. package/src/avatar/avatar.tokens.json +7 -0
  12. package/src/avatar-group/avatar-group.css +21 -22
  13. package/src/badge/badge.css +45 -37
  14. package/src/badge/badge.tokens.json +5 -0
  15. package/src/breadcrumb/breadcrumb.css +37 -37
  16. package/src/button/button.css +139 -64
  17. package/src/button/button.tokens.json +10 -0
  18. package/src/button-group/button-group.css +76 -72
  19. package/src/button-group/button-group.tokens.json +2 -0
  20. package/src/calendar/calendar.css +93 -103
  21. package/src/card/card.css +54 -61
  22. package/src/carousel/carousel.css +150 -161
  23. package/src/cascader/cascader.css +152 -153
  24. package/src/cascader/cascader.tokens.json +1 -0
  25. package/src/chart/chart.css +242 -239
  26. package/src/chart/chart.tokens.json +1 -0
  27. package/src/checkbox/checkbox.css +119 -124
  28. package/src/checkbox-group/checkbox-group.css +7 -7
  29. package/src/code-block/code-block.css +81 -85
  30. package/src/collapsible/collapsible.css +69 -76
  31. package/src/color-picker/color-picker.css +83 -91
  32. package/src/column-manager/column-manager.css +106 -114
  33. package/src/combobox/combobox.css +132 -107
  34. package/src/combobox/combobox.tokens.json +1 -0
  35. package/src/command-palette/command-palette.css +84 -90
  36. package/src/container/container.css +24 -24
  37. package/src/context-menu/context-menu.css +8 -8
  38. package/src/currency-field/currency-field.css +210 -88
  39. package/src/currency-field/currency-field.tokens.json +13 -0
  40. package/src/dashboard-grid/dashboard-grid.css +148 -116
  41. package/src/data-grid/data-grid.css +504 -469
  42. package/src/data-grid/data-grid.tokens.json +2 -0
  43. package/src/data-list/data-list.css +81 -70
  44. package/src/data-list/data-list.tokens.json +2 -1
  45. package/src/date-field/date-field.css +55 -52
  46. package/src/date-field/date-field.tokens.json +1 -0
  47. package/src/date-picker/date-picker.css +40 -42
  48. package/src/date-range-picker/date-range-picker.css +114 -118
  49. package/src/datetime-field/datetime-field.css +78 -80
  50. package/src/datetime-field/datetime-field.tokens.json +1 -0
  51. package/src/datetime-picker/datetime-picker.css +61 -63
  52. package/src/datetime-range-picker/datetime-range-picker.css +149 -156
  53. package/src/description-list/description-list.css +61 -64
  54. package/src/detail-panel/detail-panel.css +70 -70
  55. package/src/dialog/dialog.css +334 -153
  56. package/src/dialog/dialog.tokens.json +5 -0
  57. package/src/divider/divider.css +18 -18
  58. package/src/drawer/drawer.css +186 -209
  59. package/src/entity-picker/entity-picker.css +238 -241
  60. package/src/entity-picker/entity-picker.tokens.json +1 -0
  61. package/src/event-calendar/event-calendar.css +343 -385
  62. package/src/field/field.css +74 -78
  63. package/src/field-group/field-group.css +22 -25
  64. package/src/filter-bar/filter-bar.css +193 -209
  65. package/src/form/form.css +34 -24
  66. package/src/form/form.tokens.json +1 -0
  67. package/src/fullscreen/fullscreen.css +24 -25
  68. package/src/grid/grid.css +28 -28
  69. package/src/highlight/highlight.css +6 -6
  70. package/src/hover-card/hover-card.css +6 -6
  71. package/src/icon/icon.css +19 -15
  72. package/src/icon/icon.tokens.json +1 -0
  73. package/src/image/image.css +39 -39
  74. package/src/import-export-center/import-export-center.css +135 -156
  75. package/src/inline/inline.css +27 -27
  76. package/src/inline-message/inline-message.css +52 -28
  77. package/src/inline-message/inline-message.tokens.json +4 -0
  78. package/src/kbd/kbd.css +30 -26
  79. package/src/link/link.css +15 -15
  80. package/src/list/list.css +44 -17
  81. package/src/list/list.tokens.json +4 -0
  82. package/src/list-item/list-item.css +80 -66
  83. package/src/list-item/list-item.tokens.json +7 -0
  84. package/src/listbox/listbox.css +56 -59
  85. package/src/loading-overlay/loading-overlay.css +75 -92
  86. package/src/markdown/markdown.css +17 -17
  87. package/src/menu/menu.css +83 -63
  88. package/src/menubar/menubar.css +13 -13
  89. package/src/message/message.css +182 -202
  90. package/src/message/message.tokens.json +5 -0
  91. package/src/message-scroller/message-scroller.css +41 -42
  92. package/src/multi-select/multi-select.css +152 -145
  93. package/src/multi-select/multi-select.tokens.json +1 -0
  94. package/src/navigation-menu/navigation-menu.css +167 -188
  95. package/src/notification-center/notification-center.css +140 -148
  96. package/src/notification-center/notification-center.tokens.json +3 -0
  97. package/src/number-field/number-field.css +84 -83
  98. package/src/number-field/number-field.tokens.json +1 -0
  99. package/src/otp-input/otp-input.css +67 -57
  100. package/src/otp-input/otp-input.tokens.json +1 -0
  101. package/src/page/page.css +23 -23
  102. package/src/page-header/page-header.css +268 -281
  103. package/src/page-header/page-header.tokens.json +1 -0
  104. package/src/pagination/pagination.css +68 -72
  105. package/src/popover/popover.css +40 -49
  106. package/src/progress-indicator/progress-indicator.css +177 -120
  107. package/src/progress-indicator/progress-indicator.tokens.json +1 -1
  108. package/src/prompt-composer/prompt-composer.css +221 -102
  109. package/src/prompt-composer/prompt-composer.tokens.json +15 -0
  110. package/src/prose/prose.css +71 -75
  111. package/src/radio-group/radio-group.css +98 -103
  112. package/src/rating/rating.css +136 -132
  113. package/src/rating/rating.tokens.json +1 -0
  114. package/src/result-state/result-state.css +74 -77
  115. package/src/runtime-properties.mjs +2 -0
  116. package/src/saved-views/saved-views.css +41 -47
  117. package/src/scroll-area/scroll-area.css +39 -32
  118. package/src/section/section.css +161 -41
  119. package/src/section/section.tokens.json +7 -2
  120. package/src/segmented-control/segmented-control.css +254 -97
  121. package/src/segmented-control/segmented-control.tokens.json +15 -11
  122. package/src/select/select.css +118 -117
  123. package/src/select/select.tokens.json +1 -0
  124. package/src/side-navigation/side-navigation.css +179 -182
  125. package/src/side-navigation/side-navigation.tokens.json +1 -0
  126. package/src/skeleton/skeleton.css +47 -48
  127. package/src/slider/slider.css +86 -88
  128. package/src/sparkline/sparkline.css +62 -40
  129. package/src/sparkline/sparkline.tokens.json +2 -0
  130. package/src/spinner/spinner.css +39 -182
  131. package/src/spinner/spinner.tokens.json +0 -2
  132. package/src/split-button/split-button.css +30 -31
  133. package/src/split-button/split-button.tokens.json +1 -0
  134. package/src/splitter/splitter.css +35 -35
  135. package/src/stack/stack.css +24 -24
  136. package/src/stat-card/stat-card.css +341 -224
  137. package/src/stat-card/stat-card.tokens.json +3 -0
  138. package/src/status-indicator/status-indicator.css +28 -28
  139. package/src/stepper/stepper.css +58 -62
  140. package/src/switch/switch.css +86 -92
  141. package/src/table/table.css +310 -165
  142. package/src/table/table.tokens.json +6 -0
  143. package/src/table-of-contents/table-of-contents.css +51 -54
  144. package/src/tabs/tabs.css +330 -302
  145. package/src/tabs/tabs.tokens.json +8 -5
  146. package/src/tag/tag.css +79 -71
  147. package/src/tag/tag.tokens.json +9 -0
  148. package/src/tags-input/tags-input.css +145 -82
  149. package/src/tags-input/tags-input.tokens.json +7 -1
  150. package/src/text-field/text-field.css +132 -136
  151. package/src/text-field/text-field.tokens.json +1 -0
  152. package/src/textarea/textarea.css +31 -28
  153. package/src/textarea/textarea.tokens.json +1 -0
  154. package/src/time-field/time-field.css +72 -69
  155. package/src/time-field/time-field.tokens.json +1 -0
  156. package/src/time-picker/time-picker.css +56 -58
  157. package/src/time-range-picker/time-range-picker.css +126 -133
  158. package/src/timeline/timeline.css +254 -266
  159. package/src/timeline/timeline.tokens.json +5 -0
  160. package/src/toast/toast.css +89 -90
  161. package/src/toast/toast.tokens.json +5 -0
  162. package/src/toggle/toggle.css +62 -25
  163. package/src/toggle/toggle.tokens.json +8 -0
  164. package/src/toggle-group/toggle-group.css +106 -60
  165. package/src/toggle-group/toggle-group.tokens.json +10 -0
  166. package/src/toolbar/toolbar.css +30 -35
  167. package/src/tooltip/tooltip.css +26 -26
  168. package/src/top-navigation/top-navigation.css +243 -259
  169. package/src/tour/tour.css +51 -60
  170. package/src/transfer/transfer.css +160 -164
  171. package/src/tree/tree.css +103 -111
  172. package/src/typography/typography.css +40 -36
  173. package/src/typography/typography.tokens.json +1 -0
  174. package/src/upload/upload.css +224 -224
  175. package/src/visually-hidden/visually-hidden.css +1 -1
  176. package/src/wizard/wizard.css +185 -197
@@ -15,7 +15,7 @@
15
15
  * sunken surface, with each widget a raised card on it; the page decides
16
16
  * that ground, and every mark below is drawn to read on it.
17
17
  */
18
- [data-ui='dashboard-grid'] {
18
+ [data-ui-dashboard-grid] {
19
19
  --_gap: var(--slotted-dashboard-grid-gap, var(--slotted-space-6, 1rem));
20
20
  --_row: var(--slotted-dashboard-grid-row-size, 4.5rem);
21
21
  --_cols: var(--_dg-columns-expanded, 12);
@@ -29,7 +29,7 @@
29
29
  min-inline-size: 0;
30
30
  }
31
31
 
32
- [data-ui='dashboard-grid'] > [data-part='grid'] {
32
+ [data-ui-dashboard-grid] > [data-part-grid] {
33
33
  display: grid;
34
34
  gap: var(--_gap);
35
35
  grid-auto-rows: var(--_row);
@@ -43,8 +43,8 @@
43
43
  }
44
44
 
45
45
  /* `display: grid` above would otherwise override the attribute. */
46
- [data-ui='dashboard-grid'] [data-part='grid'][hidden],
47
- [data-ui='dashboard-grid'] [data-part='widget'][hidden] {
46
+ [data-ui-dashboard-grid] [data-part-grid][hidden],
47
+ [data-ui-dashboard-grid] [data-part-widget][hidden] {
48
48
  display: none;
49
49
  }
50
50
 
@@ -52,14 +52,14 @@
52
52
  * In the expanded class every widget stands at its own cell. The DOM holds
53
53
  * them by row, then column, so the order a reader walks is the picture's.
54
54
  */
55
- [data-ui='dashboard-grid'] :is([data-part='widget'], [data-part='placeholder']) {
55
+ [data-ui-dashboard-grid] :is([data-part-widget], [data-part-placeholder]) {
56
56
  grid-column: var(--_dg-x, auto) / span var(--_dg-w, 4);
57
57
  grid-row: var(--_dg-y, auto) / span var(--_dg-h, 2);
58
58
  min-block-size: 0;
59
59
  min-inline-size: 0;
60
60
  }
61
61
 
62
- [data-ui='dashboard-grid'] [data-part='widget'] {
62
+ [data-ui-dashboard-grid] [data-part-widget] {
63
63
  display: flex;
64
64
  position: relative;
65
65
  }
@@ -72,29 +72,29 @@
72
72
  * CSS refuses a custom property in a container condition.
73
73
  */
74
74
  @container dashboard-grid (width < 1024px) {
75
- [data-ui='dashboard-grid'] > [data-part='grid'] {
75
+ [data-ui-dashboard-grid] > [data-part-grid] {
76
76
  --_cols: var(--_dg-columns-medium, 6);
77
77
  }
78
78
 
79
- [data-ui='dashboard-grid'] :is([data-part='widget'], [data-part='placeholder']) {
79
+ [data-ui-dashboard-grid] :is([data-part-widget], [data-part-placeholder]) {
80
80
  grid-column: auto / span var(--_dg-span-medium, 3);
81
81
  grid-row: auto / span var(--_dg-h, 2);
82
82
  }
83
83
  }
84
84
 
85
85
  @container dashboard-grid (width < 600px) {
86
- [data-ui='dashboard-grid'] > [data-part='grid'] {
86
+ [data-ui-dashboard-grid] > [data-part-grid] {
87
87
  --_cols: var(--_dg-columns-compact, 1);
88
88
 
89
89
  grid-auto-rows: auto;
90
90
  }
91
91
 
92
- [data-ui='dashboard-grid'] :is([data-part='widget'], [data-part='placeholder']) {
92
+ [data-ui-dashboard-grid] :is([data-part-widget], [data-part-placeholder]) {
93
93
  grid-column: 1 / -1;
94
94
  grid-row: auto;
95
95
  }
96
96
 
97
- [data-ui='dashboard-grid'] [data-part='placeholder'] {
97
+ [data-ui-dashboard-grid] [data-part-placeholder] {
98
98
  min-block-size: calc(var(--_row) * 2);
99
99
  }
100
100
  }
@@ -107,14 +107,14 @@
107
107
  * than the cell grows into it, so a chart or a figure uses the height the
108
108
  * reader gave the widget rather than stopping at its own size step.
109
109
  */
110
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-ui='card'] {
110
+ [data-ui-dashboard-grid] [data-part-widget] > [data-ui-card] {
111
111
  flex: 1 1 auto;
112
112
  min-block-size: 0;
113
113
  min-inline-size: 0;
114
114
  transition: box-shadow var(--slotted-duration-medium) var(--slotted-easing-standard);
115
115
  }
116
116
 
117
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-ui='card'] > [data-part='body'] {
117
+ [data-ui-dashboard-grid] [data-part-widget] > [data-ui-card] > [data-part-body] {
118
118
  /* A chart's plot takes whatever height the widget leaves it, down to a
119
119
  floor of one and a half rows, instead of its own size step. */
120
120
  --slotted-chart-plot-block-size: calc(var(--_row) * 1.5);
@@ -128,11 +128,11 @@
128
128
  /* The content grows into a taller cell and never shrinks under its own
129
129
  height: shrunk, it overflowed its own box, and the body scrolled only that
130
130
  overflow, so its last rows and the end padding stayed out of reach. */
131
- [data-ui='dashboard-grid']
132
- [data-part='widget']
133
- > [data-ui='card']
134
- > [data-part='body']
135
- > :not([data-part='busy-indicator']) {
131
+ [data-ui-dashboard-grid]
132
+ [data-part-widget]
133
+ > [data-ui-card]
134
+ > [data-part-body]
135
+ > :not([data-part-busy-indicator]) {
136
136
  flex: 1 0 auto;
137
137
  }
138
138
 
@@ -141,7 +141,7 @@
141
141
  * medium step, semibold, two lines and then an ellipsis. The clamp never
142
142
  * removes a word from the DOM, and the article is named by the whole of it.
143
143
  */
144
- [data-ui='dashboard-grid'] [data-part='widget'] [data-part='title'] {
144
+ [data-ui-dashboard-grid] [data-part-widget] [data-part-title] {
145
145
  -webkit-box-orient: vertical;
146
146
  color: var(--slotted-dashboard-grid-title-color, var(--slotted-text, CanvasText));
147
147
  display: -webkit-box;
@@ -165,7 +165,7 @@
165
165
  overflow-wrap: anywhere;
166
166
  }
167
167
 
168
- [data-ui='dashboard-grid'] [data-part='widget'] [data-part='description'] {
168
+ [data-ui-dashboard-grid] [data-part-widget] [data-part-description] {
169
169
  color: var(--slotted-dashboard-grid-description-color, var(--slotted-text-muted, GrayText));
170
170
  font-size: var(--slotted-font-size-sm, 0.75rem);
171
171
  line-height: var(--slotted-line-height-sm, 1.5);
@@ -175,7 +175,7 @@
175
175
 
176
176
  /* The corner of the header: the consumer's actions, then the way to the
177
177
  widget's own page, on the title's row without adding to its height. */
178
- [data-ui='dashboard-grid'] [data-part='widget'] [data-part='actions'] {
178
+ [data-ui-dashboard-grid] [data-part-widget] [data-part-actions] {
179
179
  flex-wrap: nowrap;
180
180
  gap: var(--slotted-space-1, 0.125rem);
181
181
  margin-block: calc(
@@ -199,19 +199,19 @@
199
199
  * its own: the family does not know what the body holds, but does know its
200
200
  * box — the grid fixed it.
201
201
  */
202
- [data-ui='dashboard-grid'] [data-part='widget'] [data-part='skeleton'] {
202
+ [data-ui-dashboard-grid] [data-part-widget] [data-part-skeleton] {
203
203
  display: flex;
204
204
  flex-direction: column;
205
205
  min-block-size: var(--slotted-space-12, 4rem);
206
206
  }
207
207
 
208
- [data-ui='dashboard-grid'] [data-part='widget'] [data-part='skeleton'] > [data-ui='skeleton'] {
208
+ [data-ui-dashboard-grid] [data-part-widget] [data-part-skeleton] > [data-ui-skeleton] {
209
209
  block-size: auto;
210
210
  flex: 1 1 auto;
211
211
  inline-size: 100%;
212
212
  }
213
213
 
214
- [data-ui='dashboard-grid'] [data-part='widget'] [data-part='message'] {
214
+ [data-ui-dashboard-grid] [data-part-widget] [data-part-message] {
215
215
  align-content: center;
216
216
  display: grid;
217
217
  justify-items: center;
@@ -222,7 +222,7 @@
222
222
  * the body, where Grafana draws its panel's. It is aria-hidden: the article
223
223
  * carries `aria-busy`, which is the fact, and the line is only its picture.
224
224
  */
225
- [data-ui='dashboard-grid'] [data-part='widget'] [data-part='busy-indicator'] {
225
+ [data-ui-dashboard-grid] [data-part-widget] [data-part-busy-indicator] {
226
226
  background-color: var(--_accent);
227
227
  block-size: var(--slotted-border-width-medium, 2px);
228
228
  inset-block-start: 0;
@@ -233,7 +233,7 @@
233
233
  }
234
234
 
235
235
  @media (prefers-reduced-motion: no-preference) {
236
- [data-ui='dashboard-grid'] [data-part='widget'] [data-part='busy-indicator'] {
236
+ [data-ui-dashboard-grid] [data-part-widget] [data-part-busy-indicator] {
237
237
  animation: slotted-dashboard-grid-busy var(--slotted-duration-loop-slow) linear infinite;
238
238
  background-color: transparent;
239
239
  background-image: linear-gradient(to right, transparent, var(--_accent) 50%, transparent);
@@ -244,7 +244,7 @@
244
244
  }
245
245
 
246
246
  @media (prefers-reduced-motion: reduce) {
247
- [data-ui='dashboard-grid'] [data-part='widget'] [data-part='busy-indicator'] {
247
+ [data-ui-dashboard-grid] [data-part-widget] [data-part-busy-indicator] {
248
248
  animation: none;
249
249
  }
250
250
  }
@@ -266,7 +266,7 @@
266
266
  * the card's hairline and the smallest lift — so on the sunken page it reads
267
267
  * as a tool laid over the dashboard rather than a stripe cut into it.
268
268
  */
269
- [data-ui='dashboard-grid'] > [data-part='edit-bar'] {
269
+ [data-ui-dashboard-grid] > [data-part-edit-bar] {
270
270
  align-items: center;
271
271
  background-color: var(
272
272
  --slotted-dashboard-grid-edit-bar-background,
@@ -284,19 +284,19 @@
284
284
  }
285
285
 
286
286
  @starting-style {
287
- [data-ui='dashboard-grid'] > [data-part='edit-bar'] {
287
+ [data-ui-dashboard-grid] > [data-part-edit-bar] {
288
288
  opacity: 0;
289
289
  translate: 0 calc(var(--slotted-space-4, 0.5rem) * -1);
290
290
  }
291
291
  }
292
292
 
293
- [data-ui='dashboard-grid'] > [data-part='edit-bar'] {
293
+ [data-ui-dashboard-grid] > [data-part-edit-bar] {
294
294
  transition:
295
295
  opacity var(--slotted-duration-medium) var(--slotted-easing-enter),
296
296
  translate var(--slotted-duration-medium) var(--slotted-easing-enter);
297
297
  }
298
298
 
299
- [data-ui='dashboard-grid'] > [data-part='edit-bar'] > [data-part='edit-status'] {
299
+ [data-ui-dashboard-grid] > [data-part-edit-bar] > [data-part-edit-status] {
300
300
  color: var(--slotted-text-muted, GrayText);
301
301
  flex: 1 1 20rem;
302
302
  font-size: var(--slotted-font-size-sm, 0.75rem);
@@ -305,7 +305,7 @@
305
305
  min-inline-size: 0;
306
306
  }
307
307
 
308
- [data-ui='dashboard-grid'] > [data-part='edit-bar'] > [data-part='edit-actions'] {
308
+ [data-ui-dashboard-grid] > [data-part-edit-bar] > [data-part-edit-actions] {
309
309
  align-items: center;
310
310
  display: flex;
311
311
  flex-wrap: wrap;
@@ -325,7 +325,7 @@
325
325
  * dot that shows marks a free cell; a dot on the crossing of two gaps
326
326
  * showed between cards and under them, where no widget can land.
327
327
  */
328
- [data-ui='dashboard-grid'] > [data-part='grid']::before {
328
+ [data-ui-dashboard-grid] > [data-part-grid]::before {
329
329
  background-image: radial-gradient(
330
330
  circle at calc((100% - var(--_gap)) / 2) calc((100% - var(--_gap)) / 2),
331
331
  var(--slotted-dashboard-grid-lattice-color, var(--slotted-border-strong, currentColor))
@@ -341,24 +341,27 @@
341
341
  transition: opacity var(--slotted-duration-medium) var(--slotted-easing-standard);
342
342
  }
343
343
 
344
- [data-ui='dashboard-grid'][data-editing] > [data-part='grid'] {
344
+ [data-ui-dashboard-grid][data-editing] > [data-part-grid] {
345
345
  min-block-size: calc(var(--_row) * 2 + var(--_gap));
346
346
  }
347
347
 
348
- [data-ui='dashboard-grid'][data-editing] > [data-part='grid']::before {
348
+ [data-ui-dashboard-grid][data-editing] > [data-part-grid]::before {
349
349
  opacity: 0.7;
350
350
  }
351
351
 
352
352
  /* While a widget is carried or pulled the lattice is what it snaps to, so
353
- it comes forward. */
354
- [data-ui='dashboard-grid'][data-gesture] > [data-part='grid']::before {
353
+ it comes forward. The attribute is on the grid, in the compound it styles:
354
+ a browser invalidates by attribute name, and on the root ahead of
355
+ `> [data-part-grid]` it restyled every element with a `data-part`
356
+ under the root as a widget was picked up and as it was dropped. */
357
+ [data-ui-dashboard-grid] > [data-part-grid][data-gesture]::before {
355
358
  opacity: 1;
356
359
  }
357
360
 
358
361
  /* Below the expanded class the widgets flow, so no cell is a place to drop
359
362
  on and the lattice would be specks in the gaps. */
360
363
  @container dashboard-grid (width < 1024px) {
361
- [data-ui='dashboard-grid'] > [data-part='grid']::before {
364
+ [data-ui-dashboard-grid] > [data-part-grid]::before {
362
365
  display: none;
363
366
  }
364
367
  }
@@ -367,20 +370,20 @@
367
370
 
368
371
  /* The whole card is a place to pick the widget up from; its controls keep
369
372
  their own cursor because each is its own target. */
370
- [data-ui='dashboard-grid'][data-editing] [data-part='widget'][data-movable] > [data-ui='card'] {
373
+ [data-ui-dashboard-grid][data-editing] [data-part-widget][data-movable] > [data-ui-card] {
371
374
  cursor: grab;
372
375
  }
373
376
 
374
- [data-ui='dashboard-grid'][data-editing]
375
- [data-part='widget'][data-movable]
376
- > [data-ui='card']
377
+ [data-ui-dashboard-grid][data-editing]
378
+ [data-part-widget][data-movable]
379
+ > [data-ui-card]
377
380
  :is(a, button, input, select, textarea, [tabindex]) {
378
381
  cursor: auto;
379
382
  }
380
383
 
381
- [data-ui='dashboard-grid'][data-editing]
382
- [data-part='widget']:not([data-loading]):hover
383
- > [data-ui='card'] {
384
+ [data-ui-dashboard-grid][data-editing]
385
+ [data-part-widget]:not([data-loading]):hover
386
+ > [data-ui-card] {
384
387
  box-shadow: var(--slotted-shadow-sm);
385
388
  }
386
389
 
@@ -392,7 +395,7 @@
392
395
  * pill is drawn on the raised surface with the control's own edge, so it
393
396
  * reads as part of the card rather than as a button beside it.
394
397
  */
395
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle'] {
398
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-handle] {
396
399
  --_pill-inline: var(--slotted-dashboard-grid-handle-inline-size, 2.25rem);
397
400
  --_pill-block: var(--slotted-dashboard-grid-handle-block-size, 1rem);
398
401
 
@@ -427,7 +430,7 @@
427
430
  }
428
431
 
429
432
  @starting-style {
430
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle'] {
433
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-handle] {
431
434
  opacity: 0;
432
435
  translate: 0 var(--slotted-space-3, 0.375rem);
433
436
  }
@@ -435,7 +438,7 @@
435
438
 
436
439
  /* The pill is small to the eye and not to the hand: the hit area reaches
437
440
  the target floor on both axes. */
438
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle']::before {
441
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-handle]::before {
439
442
  content: '';
440
443
  inset: calc((var(--slotted-target-min, 24px) - var(--_pill-block)) / -2)
441
444
  calc(var(--slotted-space-4, 0.5rem) * -1);
@@ -443,28 +446,28 @@
443
446
  }
444
447
 
445
448
  /* The grip is an `icon` the binding draws; the pill gives it its size. */
446
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle'] > [data-ui='icon'] {
449
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-handle] > [data-ui-icon] {
447
450
  --slotted-icon-size: var(--slotted-dashboard-grid-handle-glyph-size, 0.875rem);
448
451
  }
449
452
 
450
- [data-ui='dashboard-grid'][data-editing]
451
- [data-part='widget']:not([data-loading]):hover
452
- > [data-part='handle'] {
453
+ [data-ui-dashboard-grid][data-editing]
454
+ [data-part-widget]:not([data-loading]):hover
455
+ > [data-part-handle] {
453
456
  border-color: var(--slotted-border-strong, ButtonBorder);
454
457
  color: var(--slotted-text, CanvasText);
455
458
  }
456
459
 
457
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle']:focus-visible {
460
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-handle]:focus-visible {
458
461
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
459
462
  outline-offset: var(--slotted-focus-ring-offset, 2px);
460
463
  }
461
464
 
462
465
  /* Carried, or its menu open: the pill takes the accent, the one mark on the
463
466
  page that says which widget the reader has in hand. */
464
- [data-ui='dashboard-grid']
465
- [data-part='widget']:is([data-dragging], [data-resizing])
466
- > [data-part='handle'],
467
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle'][aria-expanded='true'] {
467
+ [data-ui-dashboard-grid]
468
+ [data-part-widget]:is([data-dragging], [data-resizing])
469
+ > [data-part-handle],
470
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-handle][aria-expanded='true'] {
468
471
  background-color: var(--_accent);
469
472
  border-color: var(--_accent);
470
473
  color: var(--slotted-tone-accent-on-solid, HighlightText);
@@ -479,7 +482,7 @@
479
482
  * are quiet until the widget is under the pointer, and always shown to a
480
483
  * finger, which has no hover.
481
484
  */
482
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='resize-handle'] {
485
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-resize-handle] {
483
486
  --_hit: var(--slotted-dashboard-grid-resize-hit, 0.75rem);
484
487
  --_mark: var(--slotted-border-strong, currentColor);
485
488
 
@@ -490,30 +493,30 @@
490
493
  z-index: 2;
491
494
  }
492
495
 
493
- [data-ui='dashboard-grid'][data-editing]
494
- [data-part='widget']:not([data-loading]):hover
495
- > [data-part='resize-handle'],
496
- [data-ui='dashboard-grid'][data-editing]
497
- [data-part='widget']:focus-within
498
- > [data-part='resize-handle'],
499
- [data-ui='dashboard-grid'] [data-part='widget'][data-resizing] > [data-part='resize-handle'] {
496
+ [data-ui-dashboard-grid][data-editing]
497
+ [data-part-widget]:not([data-loading]):hover
498
+ > [data-part-resize-handle],
499
+ [data-ui-dashboard-grid][data-editing]
500
+ [data-part-widget]:focus-within
501
+ > [data-part-resize-handle],
502
+ [data-ui-dashboard-grid] [data-part-widget][data-resizing] > [data-part-resize-handle] {
500
503
  opacity: 1;
501
504
  }
502
505
 
503
506
  @media (pointer: coarse) {
504
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='resize-handle'] {
507
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-resize-handle] {
505
508
  --_hit: var(--slotted-target-comfortable, 44px);
506
509
 
507
510
  opacity: 1;
508
511
  }
509
512
 
510
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle'] {
513
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-handle] {
511
514
  --_pill-inline: var(--slotted-dashboard-grid-handle-inline-size-coarse, 2.75rem);
512
515
  --_pill-block: var(--slotted-dashboard-grid-handle-block-size-coarse, 1.25rem);
513
516
  }
514
517
  }
515
518
 
516
- [data-ui='dashboard-grid'] [data-part='resize-handle']::before {
519
+ [data-ui-dashboard-grid] [data-part-resize-handle]::before {
517
520
  background-color: var(--_mark);
518
521
  border-radius: var(--slotted-radius-full, 9999px);
519
522
  content: '';
@@ -526,68 +529,67 @@
526
529
  inline-size var(--slotted-duration-short) var(--slotted-easing-standard);
527
530
  }
528
531
 
529
- [data-ui='dashboard-grid']
530
- [data-part='resize-handle']:is([data-edge='start'], [data-edge='end']) {
532
+ [data-ui-dashboard-grid] [data-part-resize-handle]:is([data-edge='start'], [data-edge='end']) {
531
533
  cursor: ew-resize;
532
534
  inline-size: var(--_hit);
533
535
  inset-block: calc(var(--_radius) + var(--_hit) / 2);
534
536
  }
535
537
 
536
- [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='start'] {
538
+ [data-ui-dashboard-grid] [data-part-resize-handle][data-edge='start'] {
537
539
  inset-inline-start: calc(var(--_hit) / -2);
538
540
  }
539
541
 
540
- [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='end'] {
542
+ [data-ui-dashboard-grid] [data-part-resize-handle][data-edge='end'] {
541
543
  inset-inline-end: calc(var(--_hit) / -2);
542
544
  }
543
545
 
544
- [data-ui='dashboard-grid']
545
- [data-part='resize-handle']:is([data-edge='start'], [data-edge='end'])::before {
546
+ [data-ui-dashboard-grid]
547
+ [data-part-resize-handle]:is([data-edge='start'], [data-edge='end'])::before {
546
548
  block-size: var(--slotted-dashboard-grid-resize-pill, 1.75rem);
547
549
  inline-size: var(--slotted-border-width-thick, 3px);
548
550
  }
549
551
 
550
- [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom'] {
552
+ [data-ui-dashboard-grid] [data-part-resize-handle][data-edge='bottom'] {
551
553
  block-size: var(--_hit);
552
554
  cursor: ns-resize;
553
555
  inset-block-end: calc(var(--_hit) / -2);
554
556
  inset-inline: calc(var(--_radius) + var(--_hit) / 2);
555
557
  }
556
558
 
557
- [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom']::before {
559
+ [data-ui-dashboard-grid] [data-part-resize-handle][data-edge='bottom']::before {
558
560
  block-size: var(--slotted-border-width-thick, 3px);
559
561
  inline-size: var(--slotted-dashboard-grid-resize-pill, 1.75rem);
560
562
  }
561
563
 
562
- [data-ui='dashboard-grid']
563
- [data-part='resize-handle']:is([data-edge='bottom-start'], [data-edge='bottom-end']) {
564
+ [data-ui-dashboard-grid]
565
+ [data-part-resize-handle]:is([data-edge='bottom-start'], [data-edge='bottom-end']) {
564
566
  block-size: calc(var(--_hit) * 1.5);
565
567
  inline-size: calc(var(--_hit) * 1.5);
566
568
  inset-block-end: calc(var(--_hit) / -2);
567
569
  }
568
570
 
569
- [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-end'] {
571
+ [data-ui-dashboard-grid] [data-part-resize-handle][data-edge='bottom-end'] {
570
572
  cursor: nwse-resize;
571
573
  inset-inline-end: calc(var(--_hit) / -2);
572
574
  }
573
575
 
574
- [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-start'] {
576
+ [data-ui-dashboard-grid] [data-part-resize-handle][data-edge='bottom-start'] {
575
577
  cursor: nesw-resize;
576
578
  inset-inline-start: calc(var(--_hit) / -2);
577
579
  }
578
580
 
579
- [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-end']:dir(rtl) {
581
+ [data-ui-dashboard-grid] [data-part-resize-handle][data-edge='bottom-end']:dir(rtl) {
580
582
  cursor: nesw-resize;
581
583
  }
582
584
 
583
- [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-start']:dir(rtl) {
585
+ [data-ui-dashboard-grid] [data-part-resize-handle][data-edge='bottom-start']:dir(rtl) {
584
586
  cursor: nwse-resize;
585
587
  }
586
588
 
587
589
  /* The corner mark is an arc on the card's own corner: a quarter of a ring
588
590
  whose radius is the card's, drawn over the card's edge. */
589
- [data-ui='dashboard-grid']
590
- [data-part='resize-handle']:is([data-edge='bottom-start'], [data-edge='bottom-end'])::before {
591
+ [data-ui-dashboard-grid]
592
+ [data-part-resize-handle]:is([data-edge='bottom-start'], [data-edge='bottom-end'])::before {
591
593
  background-color: transparent;
592
594
  block-size: var(--_radius);
593
595
  border-block-end: var(--slotted-border-width-thick, 3px) solid var(--_mark);
@@ -598,13 +600,13 @@
598
600
  margin: 0;
599
601
  }
600
602
 
601
- [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-end']::before {
603
+ [data-ui-dashboard-grid] [data-part-resize-handle][data-edge='bottom-end']::before {
602
604
  border-end-end-radius: var(--_radius);
603
605
  border-inline-end: var(--slotted-border-width-thick, 3px) solid var(--_mark);
604
606
  inset-inline-end: calc(var(--_hit) / 2 - var(--slotted-border-width-thin, 1px));
605
607
  }
606
608
 
607
- [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-start']::before {
609
+ [data-ui-dashboard-grid] [data-part-resize-handle][data-edge='bottom-start']::before {
608
610
  border-end-start-radius: var(--_radius);
609
611
  border-inline-start: var(--slotted-border-width-thick, 3px) solid var(--_mark);
610
612
  inset-inline-start: calc(var(--_hit) / 2 - var(--slotted-border-width-thin, 1px));
@@ -612,21 +614,21 @@
612
614
 
613
615
  /* Under the pointer, and while it is pulled, the mark takes the accent and
614
616
  the edge pill grows, so the reader sees which side answers. */
615
- [data-ui='dashboard-grid'] [data-part='resize-handle']:not([data-disabled]):hover,
616
- [data-ui='dashboard-grid'] [data-part='resize-handle'][data-active] {
617
+ [data-ui-dashboard-grid] [data-part-resize-handle]:not([data-disabled]):hover,
618
+ [data-ui-dashboard-grid] [data-part-resize-handle][data-active] {
617
619
  --_mark: var(--_accent);
618
620
  }
619
621
 
620
- [data-ui='dashboard-grid']
621
- [data-part='resize-handle']:is([data-edge='start'], [data-edge='end']):is(
622
+ [data-ui-dashboard-grid]
623
+ [data-part-resize-handle]:is([data-edge='start'], [data-edge='end']):is(
622
624
  :not([data-disabled]):hover,
623
625
  [data-active]
624
626
  )::before {
625
627
  block-size: var(--slotted-dashboard-grid-resize-pill-active, 2.75rem);
626
628
  }
627
629
 
628
- [data-ui='dashboard-grid']
629
- [data-part='resize-handle'][data-edge='bottom']:is(
630
+ [data-ui-dashboard-grid]
631
+ [data-part-resize-handle][data-edge='bottom']:is(
630
632
  :not([data-disabled]):hover,
631
633
  [data-active]
632
634
  )::before {
@@ -636,9 +638,9 @@
636
638
  /* The medium class flows the widgets, so a widget's start is where the one
637
639
  before it ends: there is no start edge to pull. */
638
640
  @container dashboard-grid (width < 1024px) {
639
- [data-ui='dashboard-grid']
640
- [data-part='widget']
641
- > [data-part='resize-handle']:is([data-edge='start'], [data-edge='bottom-start']) {
641
+ [data-ui-dashboard-grid]
642
+ [data-part-widget]
643
+ > [data-part-resize-handle]:is([data-edge='start'], [data-edge='bottom-start']) {
642
644
  display: none;
643
645
  }
644
646
  }
@@ -646,7 +648,7 @@
646
648
  /* A phone reads a dashboard as one column as tall as its content: there is
647
649
  no size to pull, only an order to change. */
648
650
  @container dashboard-grid (width < 600px) {
649
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='resize-handle'] {
651
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-resize-handle] {
650
652
  display: none;
651
653
  }
652
654
  }
@@ -654,33 +656,31 @@
654
656
  /* ── Editing: a widget in hand ───────────────────────────────────────── */
655
657
 
656
658
  /**
657
- * A widget carried or pulled leaves its cell and floats over the grid: it
658
- * is placed where it was picked up, `--_dg-origin-*`, and follows the pointer
659
- * by `--_dg-lift-*`, all written by script. The cell it would land in is the
660
- * placeholder, and the widgets around it make room as the placeholder moves.
659
+ * A widget carried or pulled leaves its cell and floats over the grid. The
660
+ * script writes where it was picked up (`inset-inline-start`,
661
+ * `inset-block-start`, `inline-size`, `block-size`) and how far the pointer
662
+ * took it (`translate`) on the widget itself. A custom property in their
663
+ * place restyled everything under the widget on every frame. The cell it
664
+ * would land in is the placeholder, and the widgets around it make room as
665
+ * the placeholder moves.
661
666
  */
662
- [data-ui='dashboard-grid'] [data-part='widget']:is([data-dragging], [data-resizing]) {
663
- block-size: var(--_dg-origin-block-size);
667
+ [data-ui-dashboard-grid] [data-part-widget]:is([data-dragging], [data-resizing]) {
664
668
  grid-column: auto;
665
669
  grid-row: auto;
666
- inline-size: var(--_dg-origin-inline-size);
667
- inset-block-start: var(--_dg-origin-block-start);
668
- inset-inline-start: var(--_dg-origin-inline-start);
669
670
  position: absolute;
670
- translate: var(--_dg-lift-x, 0) var(--_dg-lift-y, 0);
671
671
  z-index: 3;
672
672
  }
673
673
 
674
674
  /* Picked up: lifted by the largest shadow on the scale. It is not scaled —
675
675
  a card of text grown by two per cent is two per cent blurred (R7). */
676
- [data-ui='dashboard-grid'] [data-part='widget'][data-dragging] {
676
+ [data-ui-dashboard-grid] [data-part-widget][data-dragging] {
677
677
  cursor: grabbing;
678
678
  }
679
679
 
680
680
  /* A shadow is dark on a dark page, so the widget in hand also takes a
681
681
  hairline of the accent: in the dark scheme it is what lifts the card, and
682
682
  in the light one it says which card is held. */
683
- [data-ui='dashboard-grid'] [data-part='widget'][data-dragging] > [data-ui='card'] {
683
+ [data-ui-dashboard-grid] [data-part-widget][data-dragging] > [data-ui-card] {
684
684
  box-shadow:
685
685
  var(--slotted-shadow-lg),
686
686
  0 0 0 var(--slotted-border-width-thin, 1px)
@@ -688,7 +688,7 @@
688
688
  }
689
689
 
690
690
  /* Pulled: the card follows the pointer at any size, lifted a step less. */
691
- [data-ui='dashboard-grid'] [data-part='widget'][data-resizing] > [data-ui='card'] {
691
+ [data-ui-dashboard-grid] [data-part-widget][data-resizing] > [data-ui-card] {
692
692
  box-shadow:
693
693
  var(--slotted-shadow-md),
694
694
  0 0 0 var(--slotted-border-width-thin, 1px)
@@ -701,7 +701,7 @@
701
701
  * No dashes and no fill that competes with the widget over it — it is a
702
702
  * shape the reader aims at, not a second object.
703
703
  */
704
- [data-ui='dashboard-grid'] > [data-part='grid'] > [data-part='placeholder'] {
704
+ [data-ui-dashboard-grid] > [data-part-grid] > [data-part-placeholder] {
705
705
  background-color: color-mix(in oklab, var(--_accent) 10%, transparent);
706
706
  border: var(--slotted-border-width-thin, 1px) solid
707
707
  color-mix(in oklab, var(--_accent) 55%, transparent);
@@ -715,7 +715,7 @@
715
715
  * corner the reader is pulling: the only text on screen during the gesture,
716
716
  * where the eye already is.
717
717
  */
718
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='size-readout'] {
718
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-size-readout] {
719
719
  background-color: var(--_accent);
720
720
  border-radius: var(--slotted-radius-full, 9999px);
721
721
  box-shadow: var(--slotted-shadow-sm);
@@ -734,15 +734,47 @@
734
734
  z-index: 4;
735
735
  }
736
736
 
737
- [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='size-readout'][data-edge='start'],
738
- [data-ui='dashboard-grid']
739
- [data-part='widget']
740
- > [data-part='size-readout'][data-edge='bottom-start'] {
737
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-size-readout][data-edge='start'],
738
+ [data-ui-dashboard-grid] [data-part-widget] > [data-part-size-readout][data-edge='bottom-start'] {
741
739
  inset-inline: var(--slotted-space-5, 0.75rem) auto;
742
740
  }
743
741
 
744
742
  /* A grid with nothing visible. */
745
- [data-ui='dashboard-grid'] > [data-part='empty'] {
743
+ [data-ui-dashboard-grid] > [data-part-empty] {
746
744
  min-block-size: calc(var(--_row) * 2 + var(--_gap));
747
745
  }
748
746
  }
747
+
748
+ /**
749
+ * A widget's cell, written on the widget by script and read only by the
750
+ * widget's own placement. Unregistered, each one inherited into the card and
751
+ * everything in it, and a preview that moved a widget restyled its whole
752
+ * content. Registered without inheritance and without a type, a widget no
753
+ * script placed still takes the fallback of `var()`. These sit outside
754
+ * `@layer slotted.components` because `@property` is a registration, not a
755
+ * rule a cascade layer holds.
756
+ */
757
+ @property --_dg-x {
758
+ syntax: '*';
759
+ inherits: false;
760
+ }
761
+
762
+ @property --_dg-y {
763
+ syntax: '*';
764
+ inherits: false;
765
+ }
766
+
767
+ @property --_dg-w {
768
+ syntax: '*';
769
+ inherits: false;
770
+ }
771
+
772
+ @property --_dg-h {
773
+ syntax: '*';
774
+ inherits: false;
775
+ }
776
+
777
+ @property --_dg-span-medium {
778
+ syntax: '*';
779
+ inherits: false;
780
+ }