@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.
- package/LICENSE +21 -0
- package/README.md +10 -2
- package/package.json +276 -3
- package/src/accordion/accordion.css +96 -0
- package/src/accordion/accordion.tokens.json +14 -0
- package/src/action-bar/action-bar.css +455 -0
- package/src/action-bar/action-bar.tokens.json +50 -0
- package/src/action-sheet/action-sheet.css +462 -0
- package/src/action-sheet/action-sheet.tokens.json +59 -0
- package/src/alert/alert.css +764 -0
- package/src/alert/alert.tokens.json +77 -0
- package/src/app-shell/app-shell.css +1899 -0
- package/src/app-shell/app-shell.tokens.json +88 -0
- package/src/aspect-ratio/aspect-ratio.css +131 -0
- package/src/aspect-ratio/aspect-ratio.tokens.json +1 -0
- package/src/attachment/attachment.css +906 -0
- package/src/attachment/attachment.tokens.json +85 -0
- package/src/avatar/avatar.css +598 -0
- package/src/avatar/avatar.tokens.json +64 -0
- package/src/avatar-group/avatar-group.css +268 -0
- package/src/avatar-group/avatar-group.tokens.json +16 -0
- package/src/badge/badge.css +462 -0
- package/src/badge/badge.tokens.json +58 -0
- package/src/breadcrumb/breadcrumb.css +441 -0
- package/src/breadcrumb/breadcrumb.tokens.json +50 -0
- package/src/button/button.css +754 -0
- package/src/button/button.tokens.json +72 -0
- package/src/button-group/button-group.css +455 -0
- package/src/button-group/button-group.tokens.json +11 -0
- package/src/calendar/calendar.css +846 -0
- package/src/calendar/calendar.tokens.json +67 -0
- package/src/card/card.css +602 -0
- package/src/card/card.tokens.json +68 -0
- package/src/carousel/carousel.css +860 -0
- package/src/carousel/carousel.tokens.json +62 -0
- package/src/cascader/cascader.css +1320 -0
- package/src/cascader/cascader.tokens.json +103 -0
- package/src/chart/chart.css +1473 -0
- package/src/chart/chart.tokens.json +107 -0
- package/src/checkbox/checkbox.css +1011 -0
- package/src/checkbox/checkbox.tokens.json +102 -0
- package/src/checkbox-group/checkbox-group.css +70 -0
- package/src/checkbox-group/checkbox-group.tokens.json +6 -0
- package/src/code-block/code-block.css +555 -0
- package/src/code-block/code-block.tokens.json +69 -0
- package/src/collapsible/collapsible.css +546 -0
- package/src/collapsible/collapsible.tokens.json +55 -0
- package/src/color-picker/color-picker.css +607 -0
- package/src/color-picker/color-picker.tokens.json +58 -0
- package/src/column-manager/column-manager.css +452 -0
- package/src/column-manager/column-manager.tokens.json +43 -0
- package/src/combobox/combobox.css +1048 -0
- package/src/combobox/combobox.tokens.json +112 -0
- package/src/command-palette/command-palette.css +1000 -0
- package/src/command-palette/command-palette.tokens.json +75 -0
- package/src/container/container.css +198 -0
- package/src/container/container.tokens.json +18 -0
- package/src/context-menu/context-menu.css +104 -0
- package/src/context-menu/context-menu.tokens.json +11 -0
- package/src/currency-field/currency-field.css +787 -0
- package/src/currency-field/currency-field.tokens.json +80 -0
- package/src/dashboard-grid/dashboard-grid.css +748 -0
- package/src/dashboard-grid/dashboard-grid.tokens.json +67 -0
- package/src/data-grid/data-grid.css +2484 -0
- package/src/data-grid/data-grid.tokens.json +100 -0
- package/src/data-list/data-list.css +455 -0
- package/src/data-list/data-list.tokens.json +35 -0
- package/src/date-field/date-field.css +560 -0
- package/src/date-field/date-field.tokens.json +80 -0
- package/src/date-picker/date-picker.css +420 -0
- package/src/date-picker/date-picker.tokens.json +49 -0
- package/src/date-range-picker/date-range-picker.css +983 -0
- package/src/date-range-picker/date-range-picker.tokens.json +109 -0
- package/src/datetime-field/datetime-field.css +850 -0
- package/src/datetime-field/datetime-field.tokens.json +91 -0
- package/src/datetime-picker/datetime-picker.css +843 -0
- package/src/datetime-picker/datetime-picker.tokens.json +78 -0
- package/src/datetime-range-picker/datetime-range-picker.css +1375 -0
- package/src/datetime-range-picker/datetime-range-picker.tokens.json +135 -0
- package/src/description-list/description-list.css +675 -0
- package/src/description-list/description-list.tokens.json +66 -0
- package/src/detail-panel/detail-panel.css +329 -0
- package/src/detail-panel/detail-panel.tokens.json +33 -0
- package/src/dialog/dialog.css +968 -0
- package/src/dialog/dialog.tokens.json +66 -0
- package/src/divider/divider.css +131 -0
- package/src/divider/divider.tokens.json +18 -0
- package/src/drawer/drawer.css +1303 -0
- package/src/drawer/drawer.tokens.json +75 -0
- package/src/entity-picker/entity-picker.css +1367 -0
- package/src/entity-picker/entity-picker.tokens.json +118 -0
- package/src/event-calendar/event-calendar.css +2148 -0
- package/src/event-calendar/event-calendar.tokens.json +87 -0
- package/src/field/field.css +707 -0
- package/src/field/field.tokens.json +58 -0
- package/src/field-group/field-group.css +226 -0
- package/src/field-group/field-group.tokens.json +33 -0
- package/src/filter-bar/filter-bar.css +1306 -0
- package/src/filter-bar/filter-bar.tokens.json +78 -0
- package/src/form/form.css +218 -0
- package/src/form/form.tokens.json +32 -0
- package/src/fullscreen/fullscreen.css +376 -0
- package/src/fullscreen/fullscreen.tokens.json +50 -0
- package/src/grid/grid.css +173 -0
- package/src/grid/grid.tokens.json +20 -0
- package/src/highlight/highlight.css +135 -0
- package/src/highlight/highlight.tokens.json +16 -0
- package/src/hover-card/hover-card.css +93 -0
- package/src/hover-card/hover-card.tokens.json +17 -0
- package/src/icon/icon.css +136 -0
- package/src/icon/icon.tokens.json +14 -0
- package/src/image/image.css +449 -0
- package/src/image/image.tokens.json +27 -0
- package/src/import-export-center/import-export-center.css +1175 -0
- package/src/import-export-center/import-export-center.tokens.json +84 -0
- package/src/inline/inline.css +149 -0
- package/src/inline/inline.tokens.json +14 -0
- package/src/inline-message/inline-message.css +396 -0
- package/src/inline-message/inline-message.tokens.json +19 -0
- package/src/kbd/kbd.css +490 -0
- package/src/kbd/kbd.tokens.json +40 -0
- package/src/link/link.css +237 -0
- package/src/link/link.tokens.json +25 -0
- package/src/list/list.css +240 -0
- package/src/list/list.tokens.json +42 -0
- package/src/list-item/list-item.css +937 -0
- package/src/list-item/list-item.tokens.json +114 -0
- package/src/listbox/listbox.css +674 -0
- package/src/listbox/listbox.tokens.json +72 -0
- package/src/loading-overlay/loading-overlay.css +730 -0
- package/src/loading-overlay/loading-overlay.tokens.json +48 -0
- package/src/markdown/markdown.css +168 -0
- package/src/markdown/markdown.tokens.json +18 -0
- package/src/menu/menu.css +817 -0
- package/src/menu/menu.tokens.json +78 -0
- package/src/menubar/menubar.css +170 -0
- package/src/menubar/menubar.tokens.json +32 -0
- package/src/message/message.css +1453 -0
- package/src/message/message.tokens.json +85 -0
- package/src/message-scroller/message-scroller.css +371 -0
- package/src/message-scroller/message-scroller.tokens.json +47 -0
- package/src/multi-select/multi-select.css +1427 -0
- package/src/multi-select/multi-select.tokens.json +114 -0
- package/src/navigation-menu/navigation-menu.css +1029 -0
- package/src/navigation-menu/navigation-menu.tokens.json +70 -0
- package/src/notification-center/notification-center.css +856 -0
- package/src/notification-center/notification-center.tokens.json +84 -0
- package/src/number-field/number-field.css +794 -0
- package/src/number-field/number-field.tokens.json +80 -0
- package/src/otp-input/otp-input.css +525 -0
- package/src/otp-input/otp-input.tokens.json +69 -0
- package/src/page/page.css +179 -0
- package/src/page/page.tokens.json +20 -0
- package/src/page-header/page-header.css +1181 -0
- package/src/page-header/page-header.tokens.json +71 -0
- package/src/pagination/pagination.css +500 -0
- package/src/pagination/pagination.tokens.json +56 -0
- package/src/popover/popover.css +526 -0
- package/src/popover/popover.tokens.json +60 -0
- package/src/progress-indicator/progress-indicator.css +1584 -0
- package/src/progress-indicator/progress-indicator.tokens.json +50 -0
- package/src/prompt-composer/prompt-composer.css +680 -0
- package/src/prompt-composer/prompt-composer.tokens.json +99 -0
- package/src/prose/prose.css +733 -0
- package/src/prose/prose.tokens.json +79 -0
- package/src/radio-group/radio-group.css +778 -0
- package/src/radio-group/radio-group.tokens.json +103 -0
- package/src/rating/rating.css +1071 -0
- package/src/rating/rating.tokens.json +88 -0
- package/src/result-state/result-state.css +980 -0
- package/src/result-state/result-state.tokens.json +63 -0
- package/src/runtime-properties.mjs +321 -0
- package/src/saved-views/saved-views.css +394 -0
- package/src/saved-views/saved-views.tokens.json +41 -0
- package/src/scroll-area/scroll-area.css +481 -0
- package/src/scroll-area/scroll-area.tokens.json +15 -0
- package/src/section/section.css +177 -0
- package/src/section/section.tokens.json +39 -0
- package/src/segmented-control/segmented-control.css +564 -0
- package/src/segmented-control/segmented-control.tokens.json +67 -0
- package/src/select/select.css +1593 -0
- package/src/select/select.tokens.json +110 -0
- package/src/side-navigation/side-navigation.css +1096 -0
- package/src/side-navigation/side-navigation.tokens.json +87 -0
- package/src/skeleton/skeleton.css +431 -0
- package/src/skeleton/skeleton.tokens.json +29 -0
- package/src/slider/slider.css +792 -0
- package/src/slider/slider.tokens.json +75 -0
- package/src/sparkline/sparkline.css +282 -0
- package/src/sparkline/sparkline.tokens.json +45 -0
- package/src/spinner/spinner.css +224 -0
- package/src/spinner/spinner.tokens.json +8 -0
- package/src/split-button/split-button.css +253 -0
- package/src/split-button/split-button.tokens.json +12 -0
- package/src/splitter/splitter.css +336 -0
- package/src/splitter/splitter.tokens.json +24 -0
- package/src/stack/stack.css +128 -0
- package/src/stack/stack.tokens.json +14 -0
- package/src/stat-card/stat-card.css +641 -0
- package/src/stat-card/stat-card.tokens.json +95 -0
- package/src/status-indicator/status-indicator.css +481 -0
- package/src/status-indicator/status-indicator.tokens.json +38 -0
- package/src/stepper/stepper.css +629 -0
- package/src/stepper/stepper.tokens.json +72 -0
- package/src/switch/switch.css +703 -0
- package/src/switch/switch.tokens.json +75 -0
- package/src/table/table.css +1482 -0
- package/src/table/table.tokens.json +69 -0
- package/src/table-of-contents/table-of-contents.css +533 -0
- package/src/table-of-contents/table-of-contents.tokens.json +53 -0
- package/src/tabs/tabs.css +998 -0
- package/src/tabs/tabs.tokens.json +82 -0
- package/src/tag/tag.css +768 -0
- package/src/tag/tag.tokens.json +85 -0
- package/src/tags-input/tags-input.css +757 -0
- package/src/tags-input/tags-input.tokens.json +84 -0
- package/src/text-field/text-field.css +900 -0
- package/src/text-field/text-field.tokens.json +87 -0
- package/src/textarea/textarea.css +365 -0
- package/src/textarea/textarea.tokens.json +59 -0
- package/src/time-field/time-field.css +719 -0
- package/src/time-field/time-field.tokens.json +86 -0
- package/src/time-picker/time-picker.css +665 -0
- package/src/time-picker/time-picker.tokens.json +66 -0
- package/src/time-range-picker/time-range-picker.css +1287 -0
- package/src/time-range-picker/time-range-picker.tokens.json +134 -0
- package/src/timeline/timeline.css +1596 -0
- package/src/timeline/timeline.tokens.json +96 -0
- package/src/toast/toast.css +943 -0
- package/src/toast/toast.tokens.json +90 -0
- package/src/toggle/toggle.css +290 -0
- package/src/toggle/toggle.tokens.json +54 -0
- package/src/toggle-group/toggle-group.css +463 -0
- package/src/toggle-group/toggle-group.tokens.json +54 -0
- package/src/toolbar/toolbar.css +434 -0
- package/src/toolbar/toolbar.tokens.json +49 -0
- package/src/tooltip/tooltip.css +368 -0
- package/src/tooltip/tooltip.tokens.json +39 -0
- package/src/top-navigation/top-navigation.css +1287 -0
- package/src/top-navigation/top-navigation.tokens.json +91 -0
- package/src/tour/tour.css +680 -0
- package/src/tour/tour.tokens.json +67 -0
- package/src/transfer/transfer.css +571 -0
- package/src/transfer/transfer.tokens.json +49 -0
- package/src/tree/tree.css +1000 -0
- package/src/tree/tree.tokens.json +80 -0
- package/src/typography/typography.css +211 -0
- package/src/typography/typography.tokens.json +31 -0
- package/src/upload/upload.css +1706 -0
- package/src/upload/upload.tokens.json +123 -0
- package/src/visually-hidden/visually-hidden.css +52 -0
- package/src/visually-hidden/visually-hidden.tokens.json +1 -0
- package/src/wizard/wizard.css +740 -0
- 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
|
+
}
|