@slotted/styles 0.0.0-stage → 0.1.0-beta.1

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 (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -2
  3. package/package.json +276 -3
  4. package/src/accordion/accordion.css +96 -0
  5. package/src/accordion/accordion.tokens.json +14 -0
  6. package/src/action-bar/action-bar.css +455 -0
  7. package/src/action-bar/action-bar.tokens.json +50 -0
  8. package/src/action-sheet/action-sheet.css +462 -0
  9. package/src/action-sheet/action-sheet.tokens.json +59 -0
  10. package/src/alert/alert.css +764 -0
  11. package/src/alert/alert.tokens.json +77 -0
  12. package/src/app-shell/app-shell.css +1899 -0
  13. package/src/app-shell/app-shell.tokens.json +88 -0
  14. package/src/aspect-ratio/aspect-ratio.css +131 -0
  15. package/src/aspect-ratio/aspect-ratio.tokens.json +1 -0
  16. package/src/attachment/attachment.css +906 -0
  17. package/src/attachment/attachment.tokens.json +85 -0
  18. package/src/avatar/avatar.css +598 -0
  19. package/src/avatar/avatar.tokens.json +64 -0
  20. package/src/avatar-group/avatar-group.css +268 -0
  21. package/src/avatar-group/avatar-group.tokens.json +16 -0
  22. package/src/badge/badge.css +462 -0
  23. package/src/badge/badge.tokens.json +58 -0
  24. package/src/breadcrumb/breadcrumb.css +441 -0
  25. package/src/breadcrumb/breadcrumb.tokens.json +50 -0
  26. package/src/button/button.css +754 -0
  27. package/src/button/button.tokens.json +72 -0
  28. package/src/button-group/button-group.css +455 -0
  29. package/src/button-group/button-group.tokens.json +11 -0
  30. package/src/calendar/calendar.css +846 -0
  31. package/src/calendar/calendar.tokens.json +67 -0
  32. package/src/card/card.css +602 -0
  33. package/src/card/card.tokens.json +68 -0
  34. package/src/carousel/carousel.css +860 -0
  35. package/src/carousel/carousel.tokens.json +62 -0
  36. package/src/cascader/cascader.css +1320 -0
  37. package/src/cascader/cascader.tokens.json +103 -0
  38. package/src/chart/chart.css +1473 -0
  39. package/src/chart/chart.tokens.json +107 -0
  40. package/src/checkbox/checkbox.css +1011 -0
  41. package/src/checkbox/checkbox.tokens.json +102 -0
  42. package/src/checkbox-group/checkbox-group.css +70 -0
  43. package/src/checkbox-group/checkbox-group.tokens.json +6 -0
  44. package/src/code-block/code-block.css +555 -0
  45. package/src/code-block/code-block.tokens.json +69 -0
  46. package/src/collapsible/collapsible.css +546 -0
  47. package/src/collapsible/collapsible.tokens.json +55 -0
  48. package/src/color-picker/color-picker.css +607 -0
  49. package/src/color-picker/color-picker.tokens.json +58 -0
  50. package/src/column-manager/column-manager.css +452 -0
  51. package/src/column-manager/column-manager.tokens.json +43 -0
  52. package/src/combobox/combobox.css +1048 -0
  53. package/src/combobox/combobox.tokens.json +112 -0
  54. package/src/command-palette/command-palette.css +1000 -0
  55. package/src/command-palette/command-palette.tokens.json +75 -0
  56. package/src/container/container.css +198 -0
  57. package/src/container/container.tokens.json +18 -0
  58. package/src/context-menu/context-menu.css +104 -0
  59. package/src/context-menu/context-menu.tokens.json +11 -0
  60. package/src/currency-field/currency-field.css +787 -0
  61. package/src/currency-field/currency-field.tokens.json +80 -0
  62. package/src/dashboard-grid/dashboard-grid.css +748 -0
  63. package/src/dashboard-grid/dashboard-grid.tokens.json +67 -0
  64. package/src/data-grid/data-grid.css +2484 -0
  65. package/src/data-grid/data-grid.tokens.json +100 -0
  66. package/src/data-list/data-list.css +455 -0
  67. package/src/data-list/data-list.tokens.json +35 -0
  68. package/src/date-field/date-field.css +560 -0
  69. package/src/date-field/date-field.tokens.json +80 -0
  70. package/src/date-picker/date-picker.css +420 -0
  71. package/src/date-picker/date-picker.tokens.json +49 -0
  72. package/src/date-range-picker/date-range-picker.css +983 -0
  73. package/src/date-range-picker/date-range-picker.tokens.json +109 -0
  74. package/src/datetime-field/datetime-field.css +850 -0
  75. package/src/datetime-field/datetime-field.tokens.json +91 -0
  76. package/src/datetime-picker/datetime-picker.css +843 -0
  77. package/src/datetime-picker/datetime-picker.tokens.json +78 -0
  78. package/src/datetime-range-picker/datetime-range-picker.css +1375 -0
  79. package/src/datetime-range-picker/datetime-range-picker.tokens.json +135 -0
  80. package/src/description-list/description-list.css +675 -0
  81. package/src/description-list/description-list.tokens.json +66 -0
  82. package/src/detail-panel/detail-panel.css +329 -0
  83. package/src/detail-panel/detail-panel.tokens.json +33 -0
  84. package/src/dialog/dialog.css +968 -0
  85. package/src/dialog/dialog.tokens.json +66 -0
  86. package/src/divider/divider.css +131 -0
  87. package/src/divider/divider.tokens.json +18 -0
  88. package/src/drawer/drawer.css +1303 -0
  89. package/src/drawer/drawer.tokens.json +75 -0
  90. package/src/entity-picker/entity-picker.css +1367 -0
  91. package/src/entity-picker/entity-picker.tokens.json +118 -0
  92. package/src/event-calendar/event-calendar.css +2148 -0
  93. package/src/event-calendar/event-calendar.tokens.json +87 -0
  94. package/src/field/field.css +707 -0
  95. package/src/field/field.tokens.json +58 -0
  96. package/src/field-group/field-group.css +226 -0
  97. package/src/field-group/field-group.tokens.json +33 -0
  98. package/src/filter-bar/filter-bar.css +1306 -0
  99. package/src/filter-bar/filter-bar.tokens.json +78 -0
  100. package/src/form/form.css +218 -0
  101. package/src/form/form.tokens.json +32 -0
  102. package/src/fullscreen/fullscreen.css +376 -0
  103. package/src/fullscreen/fullscreen.tokens.json +50 -0
  104. package/src/grid/grid.css +173 -0
  105. package/src/grid/grid.tokens.json +20 -0
  106. package/src/highlight/highlight.css +135 -0
  107. package/src/highlight/highlight.tokens.json +16 -0
  108. package/src/hover-card/hover-card.css +93 -0
  109. package/src/hover-card/hover-card.tokens.json +17 -0
  110. package/src/icon/icon.css +136 -0
  111. package/src/icon/icon.tokens.json +14 -0
  112. package/src/image/image.css +449 -0
  113. package/src/image/image.tokens.json +27 -0
  114. package/src/import-export-center/import-export-center.css +1175 -0
  115. package/src/import-export-center/import-export-center.tokens.json +84 -0
  116. package/src/inline/inline.css +149 -0
  117. package/src/inline/inline.tokens.json +14 -0
  118. package/src/inline-message/inline-message.css +396 -0
  119. package/src/inline-message/inline-message.tokens.json +19 -0
  120. package/src/kbd/kbd.css +490 -0
  121. package/src/kbd/kbd.tokens.json +40 -0
  122. package/src/link/link.css +237 -0
  123. package/src/link/link.tokens.json +25 -0
  124. package/src/list/list.css +240 -0
  125. package/src/list/list.tokens.json +42 -0
  126. package/src/list-item/list-item.css +937 -0
  127. package/src/list-item/list-item.tokens.json +114 -0
  128. package/src/listbox/listbox.css +674 -0
  129. package/src/listbox/listbox.tokens.json +72 -0
  130. package/src/loading-overlay/loading-overlay.css +730 -0
  131. package/src/loading-overlay/loading-overlay.tokens.json +48 -0
  132. package/src/markdown/markdown.css +168 -0
  133. package/src/markdown/markdown.tokens.json +18 -0
  134. package/src/menu/menu.css +817 -0
  135. package/src/menu/menu.tokens.json +78 -0
  136. package/src/menubar/menubar.css +170 -0
  137. package/src/menubar/menubar.tokens.json +32 -0
  138. package/src/message/message.css +1453 -0
  139. package/src/message/message.tokens.json +85 -0
  140. package/src/message-scroller/message-scroller.css +371 -0
  141. package/src/message-scroller/message-scroller.tokens.json +47 -0
  142. package/src/multi-select/multi-select.css +1427 -0
  143. package/src/multi-select/multi-select.tokens.json +114 -0
  144. package/src/navigation-menu/navigation-menu.css +1029 -0
  145. package/src/navigation-menu/navigation-menu.tokens.json +70 -0
  146. package/src/notification-center/notification-center.css +856 -0
  147. package/src/notification-center/notification-center.tokens.json +84 -0
  148. package/src/number-field/number-field.css +794 -0
  149. package/src/number-field/number-field.tokens.json +80 -0
  150. package/src/otp-input/otp-input.css +525 -0
  151. package/src/otp-input/otp-input.tokens.json +69 -0
  152. package/src/page/page.css +179 -0
  153. package/src/page/page.tokens.json +20 -0
  154. package/src/page-header/page-header.css +1181 -0
  155. package/src/page-header/page-header.tokens.json +71 -0
  156. package/src/pagination/pagination.css +500 -0
  157. package/src/pagination/pagination.tokens.json +56 -0
  158. package/src/popover/popover.css +526 -0
  159. package/src/popover/popover.tokens.json +60 -0
  160. package/src/progress-indicator/progress-indicator.css +1584 -0
  161. package/src/progress-indicator/progress-indicator.tokens.json +50 -0
  162. package/src/prompt-composer/prompt-composer.css +680 -0
  163. package/src/prompt-composer/prompt-composer.tokens.json +99 -0
  164. package/src/prose/prose.css +733 -0
  165. package/src/prose/prose.tokens.json +79 -0
  166. package/src/radio-group/radio-group.css +778 -0
  167. package/src/radio-group/radio-group.tokens.json +103 -0
  168. package/src/rating/rating.css +1071 -0
  169. package/src/rating/rating.tokens.json +88 -0
  170. package/src/result-state/result-state.css +980 -0
  171. package/src/result-state/result-state.tokens.json +63 -0
  172. package/src/runtime-properties.mjs +321 -0
  173. package/src/saved-views/saved-views.css +394 -0
  174. package/src/saved-views/saved-views.tokens.json +41 -0
  175. package/src/scroll-area/scroll-area.css +481 -0
  176. package/src/scroll-area/scroll-area.tokens.json +15 -0
  177. package/src/section/section.css +177 -0
  178. package/src/section/section.tokens.json +39 -0
  179. package/src/segmented-control/segmented-control.css +564 -0
  180. package/src/segmented-control/segmented-control.tokens.json +67 -0
  181. package/src/select/select.css +1593 -0
  182. package/src/select/select.tokens.json +110 -0
  183. package/src/side-navigation/side-navigation.css +1096 -0
  184. package/src/side-navigation/side-navigation.tokens.json +87 -0
  185. package/src/skeleton/skeleton.css +431 -0
  186. package/src/skeleton/skeleton.tokens.json +29 -0
  187. package/src/slider/slider.css +792 -0
  188. package/src/slider/slider.tokens.json +75 -0
  189. package/src/sparkline/sparkline.css +282 -0
  190. package/src/sparkline/sparkline.tokens.json +45 -0
  191. package/src/spinner/spinner.css +224 -0
  192. package/src/spinner/spinner.tokens.json +8 -0
  193. package/src/split-button/split-button.css +253 -0
  194. package/src/split-button/split-button.tokens.json +12 -0
  195. package/src/splitter/splitter.css +336 -0
  196. package/src/splitter/splitter.tokens.json +24 -0
  197. package/src/stack/stack.css +128 -0
  198. package/src/stack/stack.tokens.json +14 -0
  199. package/src/stat-card/stat-card.css +641 -0
  200. package/src/stat-card/stat-card.tokens.json +95 -0
  201. package/src/status-indicator/status-indicator.css +481 -0
  202. package/src/status-indicator/status-indicator.tokens.json +38 -0
  203. package/src/stepper/stepper.css +629 -0
  204. package/src/stepper/stepper.tokens.json +72 -0
  205. package/src/switch/switch.css +703 -0
  206. package/src/switch/switch.tokens.json +75 -0
  207. package/src/table/table.css +1482 -0
  208. package/src/table/table.tokens.json +69 -0
  209. package/src/table-of-contents/table-of-contents.css +533 -0
  210. package/src/table-of-contents/table-of-contents.tokens.json +53 -0
  211. package/src/tabs/tabs.css +998 -0
  212. package/src/tabs/tabs.tokens.json +82 -0
  213. package/src/tag/tag.css +768 -0
  214. package/src/tag/tag.tokens.json +85 -0
  215. package/src/tags-input/tags-input.css +757 -0
  216. package/src/tags-input/tags-input.tokens.json +84 -0
  217. package/src/text-field/text-field.css +900 -0
  218. package/src/text-field/text-field.tokens.json +87 -0
  219. package/src/textarea/textarea.css +365 -0
  220. package/src/textarea/textarea.tokens.json +59 -0
  221. package/src/time-field/time-field.css +719 -0
  222. package/src/time-field/time-field.tokens.json +86 -0
  223. package/src/time-picker/time-picker.css +665 -0
  224. package/src/time-picker/time-picker.tokens.json +66 -0
  225. package/src/time-range-picker/time-range-picker.css +1287 -0
  226. package/src/time-range-picker/time-range-picker.tokens.json +134 -0
  227. package/src/timeline/timeline.css +1596 -0
  228. package/src/timeline/timeline.tokens.json +96 -0
  229. package/src/toast/toast.css +943 -0
  230. package/src/toast/toast.tokens.json +90 -0
  231. package/src/toggle/toggle.css +290 -0
  232. package/src/toggle/toggle.tokens.json +54 -0
  233. package/src/toggle-group/toggle-group.css +463 -0
  234. package/src/toggle-group/toggle-group.tokens.json +54 -0
  235. package/src/toolbar/toolbar.css +434 -0
  236. package/src/toolbar/toolbar.tokens.json +49 -0
  237. package/src/tooltip/tooltip.css +368 -0
  238. package/src/tooltip/tooltip.tokens.json +39 -0
  239. package/src/top-navigation/top-navigation.css +1287 -0
  240. package/src/top-navigation/top-navigation.tokens.json +91 -0
  241. package/src/tour/tour.css +680 -0
  242. package/src/tour/tour.tokens.json +67 -0
  243. package/src/transfer/transfer.css +571 -0
  244. package/src/transfer/transfer.tokens.json +49 -0
  245. package/src/tree/tree.css +1000 -0
  246. package/src/tree/tree.tokens.json +80 -0
  247. package/src/typography/typography.css +211 -0
  248. package/src/typography/typography.tokens.json +31 -0
  249. package/src/upload/upload.css +1706 -0
  250. package/src/upload/upload.tokens.json +123 -0
  251. package/src/visually-hidden/visually-hidden.css +52 -0
  252. package/src/visually-hidden/visually-hidden.tokens.json +1 -0
  253. package/src/wizard/wizard.css +740 -0
  254. package/src/wizard/wizard.tokens.json +63 -0
@@ -0,0 +1,748 @@
1
+ @layer slotted.components {
2
+ /**
3
+ * A surface of widgets the reader places and sizes. The root is the
4
+ * container the size class is read from and the grid is the `ul` one element
5
+ * in, because a container query changes the tracks of the grid and an
6
+ * element is never its own query container (the briefing's rule, after
7
+ * `stepper` and `description-list`).
8
+ *
9
+ * Script writes each widget's cell and size as whole numbers it computed from
10
+ * the layout; the stylesheet places them and picks the class. Nothing is
11
+ * measured for placement, so a server render and the first client render are
12
+ * the same picture.
13
+ *
14
+ * The family paints no ground of its own. A dashboard stands on the page's
15
+ * sunken surface, with each widget a raised card on it; the page decides
16
+ * that ground, and every mark below is drawn to read on it.
17
+ */
18
+ [data-ui='dashboard-grid'] {
19
+ --_gap: var(--slotted-dashboard-grid-gap, var(--slotted-space-6, 1rem));
20
+ --_row: var(--slotted-dashboard-grid-row-size, 4.5rem);
21
+ --_cols: var(--_dg-columns-expanded, 12);
22
+ --_radius: var(--slotted-card-radius, var(--slotted-radius-lg, 8px));
23
+ --_accent: var(--slotted-dashboard-grid-accent, var(--slotted-tone-accent-solid, Highlight));
24
+
25
+ container: dashboard-grid / inline-size;
26
+ display: flex;
27
+ flex-direction: column;
28
+ gap: var(--_gap);
29
+ min-inline-size: 0;
30
+ }
31
+
32
+ [data-ui='dashboard-grid'] > [data-part='grid'] {
33
+ display: grid;
34
+ gap: var(--_gap);
35
+ grid-auto-rows: var(--_row);
36
+ grid-template-columns: repeat(var(--_cols), minmax(0, 1fr));
37
+ list-style: none;
38
+ margin: 0;
39
+ min-inline-size: 0;
40
+ padding: 0;
41
+ /* The containing block of a widget lifted out of its cell. */
42
+ position: relative;
43
+ }
44
+
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] {
48
+ display: none;
49
+ }
50
+
51
+ /**
52
+ * In the expanded class every widget stands at its own cell. The DOM holds
53
+ * them by row, then column, so the order a reader walks is the picture's.
54
+ */
55
+ [data-ui='dashboard-grid'] :is([data-part='widget'], [data-part='placeholder']) {
56
+ grid-column: var(--_dg-x, auto) / span var(--_dg-w, 4);
57
+ grid-row: var(--_dg-y, auto) / span var(--_dg-h, 2);
58
+ min-block-size: 0;
59
+ min-inline-size: 0;
60
+ }
61
+
62
+ [data-ui='dashboard-grid'] [data-part='widget'] {
63
+ display: flex;
64
+ position: relative;
65
+ }
66
+
67
+ /**
68
+ * The medium class flows the same order, each widget a half or the whole
69
+ * of the row; its height stays in rows. The compact class is one
70
+ * column whose widgets are as tall as their content, the way a phone reads a
71
+ * dashboard. The thresholds are the size classes of §2.7, literal because
72
+ * CSS refuses a custom property in a container condition.
73
+ */
74
+ @container dashboard-grid (width < 1024px) {
75
+ [data-ui='dashboard-grid'] > [data-part='grid'] {
76
+ --_cols: var(--_dg-columns-medium, 6);
77
+ }
78
+
79
+ [data-ui='dashboard-grid'] :is([data-part='widget'], [data-part='placeholder']) {
80
+ grid-column: auto / span var(--_dg-span-medium, 3);
81
+ grid-row: auto / span var(--_dg-h, 2);
82
+ }
83
+ }
84
+
85
+ @container dashboard-grid (width < 600px) {
86
+ [data-ui='dashboard-grid'] > [data-part='grid'] {
87
+ --_cols: var(--_dg-columns-compact, 1);
88
+
89
+ grid-auto-rows: auto;
90
+ }
91
+
92
+ [data-ui='dashboard-grid'] :is([data-part='widget'], [data-part='placeholder']) {
93
+ grid-column: 1 / -1;
94
+ grid-row: auto;
95
+ }
96
+
97
+ [data-ui='dashboard-grid'] [data-part='placeholder'] {
98
+ min-block-size: calc(var(--_row) * 2);
99
+ }
100
+ }
101
+
102
+ /* ── The widget ──────────────────────────────────────────────────────── */
103
+
104
+ /**
105
+ * The widget is a card that fills its cell, and its content fills the
106
+ * card: a body taller than the cell scrolls inside it, and a body shorter
107
+ * than the cell grows into it, so a chart or a figure uses the height the
108
+ * reader gave the widget rather than stopping at its own size step.
109
+ */
110
+ [data-ui='dashboard-grid'] [data-part='widget'] > [data-ui='card'] {
111
+ flex: 1 1 auto;
112
+ min-block-size: 0;
113
+ min-inline-size: 0;
114
+ transition: box-shadow var(--slotted-duration-medium) var(--slotted-easing-standard);
115
+ }
116
+
117
+ [data-ui='dashboard-grid'] [data-part='widget'] > [data-ui='card'] > [data-part='body'] {
118
+ /* A chart's plot takes whatever height the widget leaves it, down to a
119
+ floor of one and a half rows, instead of its own size step. */
120
+ --slotted-chart-plot-block-size: calc(var(--_row) * 1.5);
121
+
122
+ display: flex;
123
+ flex-direction: column;
124
+ overflow: auto;
125
+ position: relative;
126
+ }
127
+
128
+ /* The content grows into a taller cell and never shrinks under its own
129
+ height: shrunk, it overflowed its own box, and the body scrolled only that
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']) {
136
+ flex: 1 0 auto;
137
+ }
138
+
139
+ /**
140
+ * The title is the widget's name and a card header's first line: the
141
+ * medium step, semibold, two lines and then an ellipsis. The clamp never
142
+ * removes a word from the DOM, and the article is named by the whole of it.
143
+ */
144
+ [data-ui='dashboard-grid'] [data-part='widget'] [data-part='title'] {
145
+ -webkit-box-orient: vertical;
146
+ color: var(--slotted-dashboard-grid-title-color, var(--slotted-text, CanvasText));
147
+ display: -webkit-box;
148
+ font-family: var(
149
+ --slotted-dashboard-grid-title-font-family,
150
+ var(
151
+ --slotted-font-family-heading,
152
+ var(--slotted-font-family-sans, ui-sans-serif, system-ui, sans-serif)
153
+ )
154
+ );
155
+ font-size: var(
156
+ --slotted-dashboard-grid-title-font-size,
157
+ var(--slotted-font-size-md, 0.8125rem)
158
+ );
159
+ font-weight: var(--slotted-font-weight-semibold, 600);
160
+ -webkit-line-clamp: 2;
161
+ line-clamp: 2;
162
+ line-height: var(--slotted-line-height-md, 1.5);
163
+ margin: 0;
164
+ overflow: hidden;
165
+ overflow-wrap: anywhere;
166
+ }
167
+
168
+ [data-ui='dashboard-grid'] [data-part='widget'] [data-part='description'] {
169
+ color: var(--slotted-dashboard-grid-description-color, var(--slotted-text-muted, GrayText));
170
+ font-size: var(--slotted-font-size-sm, 0.75rem);
171
+ line-height: var(--slotted-line-height-sm, 1.5);
172
+ margin: 0;
173
+ overflow-wrap: anywhere;
174
+ }
175
+
176
+ /* The corner of the header: the consumer's actions, then the way to the
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'] {
179
+ flex-wrap: nowrap;
180
+ gap: var(--slotted-space-1, 0.125rem);
181
+ margin-block: calc(
182
+ (
183
+ var(--slotted-control-height-sm, 1.75rem) - var(--slotted-font-size-md, 0.8125rem) *
184
+ var(--slotted-line-height-md, 1.5)
185
+ ) /
186
+ -2
187
+ );
188
+ }
189
+
190
+ /* The glyphs of the add, detail and retry controls are `icon` elements in
191
+ the button family's own icon and start boxes, sized by the button; the
192
+ detail arrow points out of the widget and is marked directional, so it
193
+ turns with the writing direction. */
194
+
195
+ /* ── The states of the body ──────────────────────────────────────────── */
196
+
197
+ /**
198
+ * A skeleton stands in for the whole body when the consumer gives none of
199
+ * its own: the family does not know what the body holds, but does know its
200
+ * box — the grid fixed it.
201
+ */
202
+ [data-ui='dashboard-grid'] [data-part='widget'] [data-part='skeleton'] {
203
+ display: flex;
204
+ flex-direction: column;
205
+ min-block-size: var(--slotted-space-12, 4rem);
206
+ }
207
+
208
+ [data-ui='dashboard-grid'] [data-part='widget'] [data-part='skeleton'] > [data-ui='skeleton'] {
209
+ block-size: auto;
210
+ flex: 1 1 auto;
211
+ inline-size: 100%;
212
+ }
213
+
214
+ [data-ui='dashboard-grid'] [data-part='widget'] [data-part='message'] {
215
+ align-content: center;
216
+ display: grid;
217
+ justify-items: center;
218
+ }
219
+
220
+ /**
221
+ * A refresh keeps what is on screen and says so with one line at the top of
222
+ * the body, where Grafana draws its panel's. It is aria-hidden: the article
223
+ * carries `aria-busy`, which is the fact, and the line is only its picture.
224
+ */
225
+ [data-ui='dashboard-grid'] [data-part='widget'] [data-part='busy-indicator'] {
226
+ background-color: var(--_accent);
227
+ block-size: var(--slotted-border-width-medium, 2px);
228
+ inset-block-start: 0;
229
+ inset-inline: 0;
230
+ opacity: 0.35;
231
+ pointer-events: none;
232
+ position: absolute;
233
+ }
234
+
235
+ @media (prefers-reduced-motion: no-preference) {
236
+ [data-ui='dashboard-grid'] [data-part='widget'] [data-part='busy-indicator'] {
237
+ animation: slotted-dashboard-grid-busy var(--slotted-duration-loop-slow) linear infinite;
238
+ background-color: transparent;
239
+ background-image: linear-gradient(to right, transparent, var(--_accent) 50%, transparent);
240
+ background-repeat: no-repeat;
241
+ background-size: 40% 100%;
242
+ opacity: 1;
243
+ }
244
+ }
245
+
246
+ @media (prefers-reduced-motion: reduce) {
247
+ [data-ui='dashboard-grid'] [data-part='widget'] [data-part='busy-indicator'] {
248
+ animation: none;
249
+ }
250
+ }
251
+
252
+ @keyframes slotted-dashboard-grid-busy {
253
+ from {
254
+ background-position: -40% 0;
255
+ }
256
+
257
+ to {
258
+ background-position: 140% 0;
259
+ }
260
+ }
261
+
262
+ /* ── Editing: the bar ────────────────────────────────────────────────── */
263
+
264
+ /**
265
+ * The bar stands on the same ground as the widgets — a raised surface with
266
+ * the card's hairline and the smallest lift — so on the sunken page it reads
267
+ * as a tool laid over the dashboard rather than a stripe cut into it.
268
+ */
269
+ [data-ui='dashboard-grid'] > [data-part='edit-bar'] {
270
+ align-items: center;
271
+ background-color: var(
272
+ --slotted-dashboard-grid-edit-bar-background,
273
+ var(--slotted-surface-raised, Canvas)
274
+ );
275
+ border: var(--slotted-border-width-thin, 1px) solid
276
+ var(--slotted-dashboard-grid-edit-bar-border, var(--slotted-border-subtle, CanvasText));
277
+ border-radius: var(--_radius);
278
+ box-shadow: var(--slotted-shadow-xs);
279
+ display: flex;
280
+ flex-wrap: wrap;
281
+ gap: var(--slotted-space-4, 0.5rem) var(--slotted-space-6, 1rem);
282
+ padding-block: var(--slotted-space-4, 0.5rem);
283
+ padding-inline: var(--slotted-space-6, 1rem) var(--slotted-space-4, 0.5rem);
284
+ }
285
+
286
+ @starting-style {
287
+ [data-ui='dashboard-grid'] > [data-part='edit-bar'] {
288
+ opacity: 0;
289
+ translate: 0 calc(var(--slotted-space-4, 0.5rem) * -1);
290
+ }
291
+ }
292
+
293
+ [data-ui='dashboard-grid'] > [data-part='edit-bar'] {
294
+ transition:
295
+ opacity var(--slotted-duration-medium) var(--slotted-easing-enter),
296
+ translate var(--slotted-duration-medium) var(--slotted-easing-enter);
297
+ }
298
+
299
+ [data-ui='dashboard-grid'] > [data-part='edit-bar'] > [data-part='edit-status'] {
300
+ color: var(--slotted-text-muted, GrayText);
301
+ flex: 1 1 20rem;
302
+ font-size: var(--slotted-font-size-sm, 0.75rem);
303
+ line-height: var(--slotted-line-height-sm, 1.5);
304
+ margin: 0;
305
+ min-inline-size: 0;
306
+ }
307
+
308
+ [data-ui='dashboard-grid'] > [data-part='edit-bar'] > [data-part='edit-actions'] {
309
+ align-items: center;
310
+ display: flex;
311
+ flex-wrap: wrap;
312
+ gap: var(--slotted-space-3, 0.375rem);
313
+ justify-content: flex-end;
314
+ margin-inline-start: auto;
315
+ }
316
+
317
+ /* ── Editing: the lattice ────────────────────────────────────────────── */
318
+
319
+ /**
320
+ * The cells a widget snaps to are shown by their centres: one dot in the
321
+ * middle of each cell. One period is a track and a gap on each axis and
322
+ * the dot sits at the middle of the track, so the lattice lands on the
323
+ * cells from either edge and holds in a right-to-left document without a
324
+ * rule of its own. A widget covers the dots of the cells it holds, so every
325
+ * dot that shows marks a free cell; a dot on the crossing of two gaps
326
+ * showed between cards and under them, where no widget can land.
327
+ */
328
+ [data-ui='dashboard-grid'] > [data-part='grid']::before {
329
+ background-image: radial-gradient(
330
+ circle at calc((100% - var(--_gap)) / 2) calc((100% - var(--_gap)) / 2),
331
+ var(--slotted-dashboard-grid-lattice-color, var(--slotted-border-strong, currentColor))
332
+ var(--slotted-dashboard-grid-lattice-dot, 1.5px),
333
+ transparent calc(var(--slotted-dashboard-grid-lattice-dot, 1.5px) + 0.75px)
334
+ );
335
+ background-size: calc((100% + var(--_gap)) / var(--_cols)) calc(var(--_row) + var(--_gap));
336
+ content: '';
337
+ inset: 0;
338
+ opacity: 0;
339
+ pointer-events: none;
340
+ position: absolute;
341
+ transition: opacity var(--slotted-duration-medium) var(--slotted-easing-standard);
342
+ }
343
+
344
+ [data-ui='dashboard-grid'][data-editing] > [data-part='grid'] {
345
+ min-block-size: calc(var(--_row) * 2 + var(--_gap));
346
+ }
347
+
348
+ [data-ui='dashboard-grid'][data-editing] > [data-part='grid']::before {
349
+ opacity: 0.7;
350
+ }
351
+
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 {
355
+ opacity: 1;
356
+ }
357
+
358
+ /* Below the expanded class the widgets flow, so no cell is a place to drop
359
+ on and the lattice would be specks in the gaps. */
360
+ @container dashboard-grid (width < 1024px) {
361
+ [data-ui='dashboard-grid'] > [data-part='grid']::before {
362
+ display: none;
363
+ }
364
+ }
365
+
366
+ /* ── Editing: the widget ─────────────────────────────────────────────── */
367
+
368
+ /* The whole card is a place to pick the widget up from; its controls keep
369
+ their own cursor because each is its own target. */
370
+ [data-ui='dashboard-grid'][data-editing] [data-part='widget'][data-movable] > [data-ui='card'] {
371
+ cursor: grab;
372
+ }
373
+
374
+ [data-ui='dashboard-grid'][data-editing]
375
+ [data-part='widget'][data-movable]
376
+ > [data-ui='card']
377
+ :is(a, button, input, select, textarea, [tabindex]) {
378
+ cursor: auto;
379
+ }
380
+
381
+ [data-ui='dashboard-grid'][data-editing]
382
+ [data-part='widget']:not([data-loading]):hover
383
+ > [data-ui='card'] {
384
+ box-shadow: var(--slotted-shadow-sm);
385
+ }
386
+
387
+ /**
388
+ * The handle: a small pill of six dots standing on the card's top edge, the
389
+ * way a block handle sits in a writing tool. It is the widget's keyboard
390
+ * stop and the button that opens its menu, and it is where a finger picks
391
+ * the widget up, since a finger on the card has to scroll the page. The
392
+ * pill is drawn on the raised surface with the control's own edge, so it
393
+ * reads as part of the card rather than as a button beside it.
394
+ */
395
+ [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle'] {
396
+ --_pill-inline: var(--slotted-dashboard-grid-handle-inline-size, 2.25rem);
397
+ --_pill-block: var(--slotted-dashboard-grid-handle-block-size, 1rem);
398
+
399
+ align-items: center;
400
+ appearance: none;
401
+ background-color: var(--slotted-control-surface, Canvas);
402
+ block-size: var(--_pill-block);
403
+ border: var(--slotted-border-width-thin, 1px) solid
404
+ var(--slotted-control-border-color, ButtonBorder);
405
+ border-radius: var(--slotted-radius-full, 9999px);
406
+ box-shadow: var(--slotted-control-shadow);
407
+ box-sizing: border-box;
408
+ color: var(--slotted-text-muted, GrayText);
409
+ cursor: grab;
410
+ display: flex;
411
+ font: inherit;
412
+ inline-size: var(--_pill-inline);
413
+ inset-block-start: calc(var(--_pill-block) / -2);
414
+ inset-inline: 0;
415
+ justify-content: center;
416
+ margin: 0 auto;
417
+ padding: 0;
418
+ position: absolute;
419
+ touch-action: none;
420
+ transition:
421
+ background-color var(--slotted-duration-short) var(--slotted-easing-standard),
422
+ border-color var(--slotted-duration-short) var(--slotted-easing-standard),
423
+ color var(--slotted-duration-short) var(--slotted-easing-standard),
424
+ opacity var(--slotted-duration-medium) var(--slotted-easing-enter),
425
+ translate var(--slotted-duration-medium) var(--slotted-easing-enter);
426
+ z-index: 2;
427
+ }
428
+
429
+ @starting-style {
430
+ [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle'] {
431
+ opacity: 0;
432
+ translate: 0 var(--slotted-space-3, 0.375rem);
433
+ }
434
+ }
435
+
436
+ /* The pill is small to the eye and not to the hand: the hit area reaches
437
+ the target floor on both axes. */
438
+ [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle']::before {
439
+ content: '';
440
+ inset: calc((var(--slotted-target-min, 24px) - var(--_pill-block)) / -2)
441
+ calc(var(--slotted-space-4, 0.5rem) * -1);
442
+ position: absolute;
443
+ }
444
+
445
+ /* 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'] {
447
+ --slotted-icon-size: var(--slotted-dashboard-grid-handle-glyph-size, 0.875rem);
448
+ }
449
+
450
+ [data-ui='dashboard-grid'][data-editing]
451
+ [data-part='widget']:not([data-loading]):hover
452
+ > [data-part='handle'] {
453
+ border-color: var(--slotted-border-strong, ButtonBorder);
454
+ color: var(--slotted-text, CanvasText);
455
+ }
456
+
457
+ [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle']:focus-visible {
458
+ outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
459
+ outline-offset: var(--slotted-focus-ring-offset, 2px);
460
+ }
461
+
462
+ /* Carried, or its menu open: the pill takes the accent, the one mark on the
463
+ 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'] {
468
+ background-color: var(--_accent);
469
+ border-color: var(--_accent);
470
+ color: var(--slotted-tone-accent-on-solid, HighlightText);
471
+ }
472
+
473
+ /**
474
+ * The edges a widget is pulled by: the inline start, the inline end and
475
+ * the bottom, and the two bottom corners. The top is not one of them —
476
+ * gravity decides a widget's top from what stands above it. Each is a strip
477
+ * of hit area straddling the card's edge, with a short pill drawn at its
478
+ * middle, or at a corner an arc that follows the card's own radius. They
479
+ * are quiet until the widget is under the pointer, and always shown to a
480
+ * finger, which has no hover.
481
+ */
482
+ [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='resize-handle'] {
483
+ --_hit: var(--slotted-dashboard-grid-resize-hit, 0.75rem);
484
+ --_mark: var(--slotted-border-strong, currentColor);
485
+
486
+ opacity: 0;
487
+ position: absolute;
488
+ touch-action: none;
489
+ transition: opacity var(--slotted-duration-short) var(--slotted-easing-standard);
490
+ z-index: 2;
491
+ }
492
+
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'] {
500
+ opacity: 1;
501
+ }
502
+
503
+ @media (pointer: coarse) {
504
+ [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='resize-handle'] {
505
+ --_hit: var(--slotted-target-comfortable, 44px);
506
+
507
+ opacity: 1;
508
+ }
509
+
510
+ [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='handle'] {
511
+ --_pill-inline: var(--slotted-dashboard-grid-handle-inline-size-coarse, 2.75rem);
512
+ --_pill-block: var(--slotted-dashboard-grid-handle-block-size-coarse, 1.25rem);
513
+ }
514
+ }
515
+
516
+ [data-ui='dashboard-grid'] [data-part='resize-handle']::before {
517
+ background-color: var(--_mark);
518
+ border-radius: var(--slotted-radius-full, 9999px);
519
+ content: '';
520
+ inset: 0;
521
+ margin: auto;
522
+ position: absolute;
523
+ transition:
524
+ background-color var(--slotted-duration-short) var(--slotted-easing-standard),
525
+ block-size var(--slotted-duration-short) var(--slotted-easing-standard),
526
+ inline-size var(--slotted-duration-short) var(--slotted-easing-standard);
527
+ }
528
+
529
+ [data-ui='dashboard-grid']
530
+ [data-part='resize-handle']:is([data-edge='start'], [data-edge='end']) {
531
+ cursor: ew-resize;
532
+ inline-size: var(--_hit);
533
+ inset-block: calc(var(--_radius) + var(--_hit) / 2);
534
+ }
535
+
536
+ [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='start'] {
537
+ inset-inline-start: calc(var(--_hit) / -2);
538
+ }
539
+
540
+ [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='end'] {
541
+ inset-inline-end: calc(var(--_hit) / -2);
542
+ }
543
+
544
+ [data-ui='dashboard-grid']
545
+ [data-part='resize-handle']:is([data-edge='start'], [data-edge='end'])::before {
546
+ block-size: var(--slotted-dashboard-grid-resize-pill, 1.75rem);
547
+ inline-size: var(--slotted-border-width-thick, 3px);
548
+ }
549
+
550
+ [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom'] {
551
+ block-size: var(--_hit);
552
+ cursor: ns-resize;
553
+ inset-block-end: calc(var(--_hit) / -2);
554
+ inset-inline: calc(var(--_radius) + var(--_hit) / 2);
555
+ }
556
+
557
+ [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom']::before {
558
+ block-size: var(--slotted-border-width-thick, 3px);
559
+ inline-size: var(--slotted-dashboard-grid-resize-pill, 1.75rem);
560
+ }
561
+
562
+ [data-ui='dashboard-grid']
563
+ [data-part='resize-handle']:is([data-edge='bottom-start'], [data-edge='bottom-end']) {
564
+ block-size: calc(var(--_hit) * 1.5);
565
+ inline-size: calc(var(--_hit) * 1.5);
566
+ inset-block-end: calc(var(--_hit) / -2);
567
+ }
568
+
569
+ [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-end'] {
570
+ cursor: nwse-resize;
571
+ inset-inline-end: calc(var(--_hit) / -2);
572
+ }
573
+
574
+ [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-start'] {
575
+ cursor: nesw-resize;
576
+ inset-inline-start: calc(var(--_hit) / -2);
577
+ }
578
+
579
+ [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-end']:dir(rtl) {
580
+ cursor: nesw-resize;
581
+ }
582
+
583
+ [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-start']:dir(rtl) {
584
+ cursor: nwse-resize;
585
+ }
586
+
587
+ /* The corner mark is an arc on the card's own corner: a quarter of a ring
588
+ 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
+ background-color: transparent;
592
+ block-size: var(--_radius);
593
+ border-block-end: var(--slotted-border-width-thick, 3px) solid var(--_mark);
594
+ border-radius: 0;
595
+ inline-size: var(--_radius);
596
+ inset: auto;
597
+ inset-block-end: calc(var(--_hit) / 2 - var(--slotted-border-width-thin, 1px));
598
+ margin: 0;
599
+ }
600
+
601
+ [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-end']::before {
602
+ border-end-end-radius: var(--_radius);
603
+ border-inline-end: var(--slotted-border-width-thick, 3px) solid var(--_mark);
604
+ inset-inline-end: calc(var(--_hit) / 2 - var(--slotted-border-width-thin, 1px));
605
+ }
606
+
607
+ [data-ui='dashboard-grid'] [data-part='resize-handle'][data-edge='bottom-start']::before {
608
+ border-end-start-radius: var(--_radius);
609
+ border-inline-start: var(--slotted-border-width-thick, 3px) solid var(--_mark);
610
+ inset-inline-start: calc(var(--_hit) / 2 - var(--slotted-border-width-thin, 1px));
611
+ }
612
+
613
+ /* Under the pointer, and while it is pulled, the mark takes the accent and
614
+ 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
+ --_mark: var(--_accent);
618
+ }
619
+
620
+ [data-ui='dashboard-grid']
621
+ [data-part='resize-handle']:is([data-edge='start'], [data-edge='end']):is(
622
+ :not([data-disabled]):hover,
623
+ [data-active]
624
+ )::before {
625
+ block-size: var(--slotted-dashboard-grid-resize-pill-active, 2.75rem);
626
+ }
627
+
628
+ [data-ui='dashboard-grid']
629
+ [data-part='resize-handle'][data-edge='bottom']:is(
630
+ :not([data-disabled]):hover,
631
+ [data-active]
632
+ )::before {
633
+ inline-size: var(--slotted-dashboard-grid-resize-pill-active, 2.75rem);
634
+ }
635
+
636
+ /* The medium class flows the widgets, so a widget's start is where the one
637
+ before it ends: there is no start edge to pull. */
638
+ @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']) {
642
+ display: none;
643
+ }
644
+ }
645
+
646
+ /* A phone reads a dashboard as one column as tall as its content: there is
647
+ no size to pull, only an order to change. */
648
+ @container dashboard-grid (width < 600px) {
649
+ [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='resize-handle'] {
650
+ display: none;
651
+ }
652
+ }
653
+
654
+ /* ── Editing: a widget in hand ───────────────────────────────────────── */
655
+
656
+ /**
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.
661
+ */
662
+ [data-ui='dashboard-grid'] [data-part='widget']:is([data-dragging], [data-resizing]) {
663
+ block-size: var(--_dg-origin-block-size);
664
+ grid-column: auto;
665
+ 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
+ position: absolute;
670
+ translate: var(--_dg-lift-x, 0) var(--_dg-lift-y, 0);
671
+ z-index: 3;
672
+ }
673
+
674
+ /* Picked up: lifted by the largest shadow on the scale. It is not scaled —
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] {
677
+ cursor: grabbing;
678
+ }
679
+
680
+ /* A shadow is dark on a dark page, so the widget in hand also takes a
681
+ hairline of the accent: in the dark scheme it is what lifts the card, and
682
+ in the light one it says which card is held. */
683
+ [data-ui='dashboard-grid'] [data-part='widget'][data-dragging] > [data-ui='card'] {
684
+ box-shadow:
685
+ var(--slotted-shadow-lg),
686
+ 0 0 0 var(--slotted-border-width-thin, 1px)
687
+ color-mix(in oklab, var(--_accent) 60%, transparent);
688
+ }
689
+
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'] {
692
+ box-shadow:
693
+ var(--slotted-shadow-md),
694
+ 0 0 0 var(--slotted-border-width-thin, 1px)
695
+ color-mix(in oklab, var(--_accent) 60%, transparent);
696
+ }
697
+
698
+ /**
699
+ * Where the widget in hand will land: its cells in the accent's lightest
700
+ * wash with a hairline of the accent, rounded like the card it stands for.
701
+ * No dashes and no fill that competes with the widget over it — it is a
702
+ * shape the reader aims at, not a second object.
703
+ */
704
+ [data-ui='dashboard-grid'] > [data-part='grid'] > [data-part='placeholder'] {
705
+ background-color: color-mix(in oklab, var(--_accent) 10%, transparent);
706
+ border: var(--slotted-border-width-thin, 1px) solid
707
+ color-mix(in oklab, var(--_accent) 55%, transparent);
708
+ border-radius: var(--_radius);
709
+ box-sizing: border-box;
710
+ pointer-events: none;
711
+ }
712
+
713
+ /**
714
+ * The size the pull has reached, in cells, on a chip of the accent at the
715
+ * corner the reader is pulling: the only text on screen during the gesture,
716
+ * where the eye already is.
717
+ */
718
+ [data-ui='dashboard-grid'] [data-part='widget'] > [data-part='size-readout'] {
719
+ background-color: var(--_accent);
720
+ border-radius: var(--slotted-radius-full, 9999px);
721
+ box-shadow: var(--slotted-shadow-sm);
722
+ color: var(--slotted-tone-accent-on-solid, HighlightText);
723
+ font-size: var(--slotted-font-size-xs, 0.6875rem);
724
+ font-variant-numeric: tabular-nums;
725
+ font-weight: var(--slotted-font-weight-semibold, 600);
726
+ inset-block-end: var(--slotted-space-5, 0.75rem);
727
+ inset-inline-end: var(--slotted-space-5, 0.75rem);
728
+ line-height: var(--slotted-line-height-xs, 1.4);
729
+ padding-block: var(--slotted-space-1, 0.125rem);
730
+ padding-inline: var(--slotted-space-4, 0.5rem);
731
+ pointer-events: none;
732
+ position: absolute;
733
+ white-space: nowrap;
734
+ z-index: 4;
735
+ }
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'] {
741
+ inset-inline: var(--slotted-space-5, 0.75rem) auto;
742
+ }
743
+
744
+ /* A grid with nothing visible. */
745
+ [data-ui='dashboard-grid'] > [data-part='empty'] {
746
+ min-block-size: calc(var(--_row) * 2 + var(--_gap));
747
+ }
748
+ }