@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,1367 @@
|
|
|
1
|
+
@layer slotted.components {
|
|
2
|
+
/**
|
|
3
|
+
* ── A field that chooses records from a remote collection ───────────────
|
|
4
|
+
*
|
|
5
|
+
* Two subtrees, as `combobox`'s are: the control, where the consumer wrote
|
|
6
|
+
* it, and the popup, portalled to the end of the document. `data-ui` is on
|
|
7
|
+
* both roots (`portalledIdentity`).
|
|
8
|
+
*
|
|
9
|
+
* root ▸ scope ▸ select control ─ the frame ───────────────┐
|
|
10
|
+
* │ selection │ input clear trigger │
|
|
11
|
+
* │ values ▸ chips ▸ chip… field │
|
|
12
|
+
* └───────────────────────────────────┘
|
|
13
|
+
*
|
|
14
|
+
* positioner ▸ content ─ role="listbox" ──────────────────────────────┐
|
|
15
|
+
* │ group-label │
|
|
16
|
+
* │ item ▸ media │ label ▸ match │ meta │ indicator │
|
|
17
|
+
* │ media │ description │ │ │
|
|
18
|
+
* │ error · empty · placeholder · more · status │
|
|
19
|
+
* └───────────────────────────────────────────────────────────────────┘
|
|
20
|
+
*
|
|
21
|
+
* The frame, its two buttons, the chevron, the ring on `busy`, the layer's
|
|
22
|
+
* entrance, the highlight on `data-current`, the check and the joined
|
|
23
|
+
* ground of two chosen rows are `combobox`'s decisions, and the chips row is
|
|
24
|
+
* `multi-select`'s. They are repeated rather than shared for the reason
|
|
25
|
+
* `combobox.css` gives about `select`: a stylesheet that painted
|
|
26
|
+
* `[data-ui='combobox']` from here would make one family's selector match
|
|
27
|
+
* the other's DOM.
|
|
28
|
+
*
|
|
29
|
+
* What is this family's own is the record: a row two lines tall with the
|
|
30
|
+
* avatar spanning both, the identifier under the name, a short fact at the
|
|
31
|
+
* end, the chip that carries the avatar, the chip that is still resolving
|
|
32
|
+
* and the one that never will, the offer to search again, and the scope
|
|
33
|
+
* joined to the front of the frame.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
/* ── The root ─────────────────────────────────────────────────────────── */
|
|
37
|
+
|
|
38
|
+
[data-ui='entity-picker'][data-part='root'] {
|
|
39
|
+
--_font-size: var(--slotted-control-font-size-md, 13px);
|
|
40
|
+
--_height: var(--slotted-control-height-md, 34px);
|
|
41
|
+
--_padding-inline: var(--slotted-control-padding-inline-md, 13px);
|
|
42
|
+
/** The floor under the glyph scale at the dense step; `combobox`'s SL3. */
|
|
43
|
+
--_icon-floor: var(--slotted-entity-picker-icon-size-min, 14px);
|
|
44
|
+
--_icon-size: max(var(--_icon-floor), var(--slotted-control-icon-size-md, 16px));
|
|
45
|
+
--_inner-size: var(--slotted-control-inner-size-md, 24px);
|
|
46
|
+
--_action-size: var(
|
|
47
|
+
--slotted-entity-picker-action-size,
|
|
48
|
+
min(calc(var(--_icon-size) + 2 * var(--slotted-space-2, 0.25rem)), var(--_inner-size))
|
|
49
|
+
);
|
|
50
|
+
/* `multi-select`'s row: one step of air above and below, chips at the
|
|
51
|
+
inside height of the control, three rows before it scrolls. */
|
|
52
|
+
--_row-air: var(--slotted-space-1, 0.125rem);
|
|
53
|
+
--_row-size: var(--_inner-size);
|
|
54
|
+
--_row-gap: var(--slotted-space-2, 0.25rem);
|
|
55
|
+
/**
|
|
56
|
+
* The avatar inside a chip and before the input: the chip's height less a
|
|
57
|
+
* step of air a side, so the circle is concentric with the pill's end.
|
|
58
|
+
*/
|
|
59
|
+
--_chip-media: calc(var(--_inner-size) - 2 * var(--slotted-space-1, 0.125rem));
|
|
60
|
+
--_radius: var(--slotted-entity-picker-radius, var(--slotted-control-radius, 4px));
|
|
61
|
+
|
|
62
|
+
display: flex;
|
|
63
|
+
font-family: var(--slotted-control-font-family, system-ui, sans-serif);
|
|
64
|
+
inline-size: 100%;
|
|
65
|
+
min-inline-size: 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
[data-ui='entity-picker'][data-part='root']:not([data-full-width]) {
|
|
69
|
+
display: inline-flex;
|
|
70
|
+
inline-size: auto;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
[data-ui='entity-picker'][data-part='root'][data-size='sm'] {
|
|
74
|
+
--_font-size: var(--slotted-control-font-size-sm, 12px);
|
|
75
|
+
--_height: var(--slotted-control-height-sm, 30px);
|
|
76
|
+
--_padding-inline: var(--slotted-control-padding-inline-sm, 10px);
|
|
77
|
+
--_icon-size: max(var(--_icon-floor), var(--slotted-control-icon-size-sm, 14px));
|
|
78
|
+
--_inner-size: var(--slotted-control-inner-size-sm, 22px);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
[data-ui='entity-picker'][data-part='root'][data-size='lg'] {
|
|
82
|
+
--_font-size: var(--slotted-control-font-size-lg, 14px);
|
|
83
|
+
--_height: var(--slotted-control-height-lg, 38px);
|
|
84
|
+
--_padding-inline: var(--slotted-control-padding-inline-lg, 16px);
|
|
85
|
+
--_icon-size: max(var(--_icon-floor), var(--slotted-control-icon-size-lg, 18px));
|
|
86
|
+
--_inner-size: var(--slotted-control-inner-size-lg, 28px);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* ── The scope ────────────────────────────────────────────────────────── */
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* The select is its own family and keeps its own frame; this sheet only
|
|
93
|
+
* joins it to the front of the control, the way `button-group` joins two
|
|
94
|
+
* buttons: the seam loses its corners and the two edges overlap by one
|
|
95
|
+
* border width, so the seam is one line and not two.
|
|
96
|
+
*
|
|
97
|
+
* The pair is one line at every width. A field that stacks its scope above
|
|
98
|
+
* itself in a narrow column is two rows tall beside one-row fields, and the
|
|
99
|
+
* form's rhythm breaks where it stands (reviewer, visual gate). So the
|
|
100
|
+
* scope yields width instead: `select` cuts its value with an ellipsis and
|
|
101
|
+
* keeps its chevron.
|
|
102
|
+
*
|
|
103
|
+
* It has a stated measure, because `select` has no width of its own: its
|
|
104
|
+
* frame is a grid whose first track is `minmax(0, 1fr)`, so its intrinsic
|
|
105
|
+
* width is its chevron. 11rem holds "Opportunities" at `lg`; 45% leaves the
|
|
106
|
+
* field the larger share at 240 pixels.
|
|
107
|
+
*/
|
|
108
|
+
[data-ui='entity-picker'] > [data-part='scope'] {
|
|
109
|
+
display: flex;
|
|
110
|
+
flex: 0 0 var(--slotted-entity-picker-scope-inline-size, min(11rem, 45%));
|
|
111
|
+
min-inline-size: 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
[data-ui='entity-picker'] > [data-part='scope'] > [data-ui='select'][data-part='root'] {
|
|
115
|
+
inline-size: 100%;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
[data-ui='entity-picker'] > [data-part='scope'] > [data-ui='select'][data-part='root'] {
|
|
119
|
+
border-end-end-radius: 0;
|
|
120
|
+
border-start-end-radius: 0;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
[data-ui='entity-picker'] > [data-part='scope'] + [data-part='control'] {
|
|
124
|
+
border-end-start-radius: 0;
|
|
125
|
+
border-start-start-radius: 0;
|
|
126
|
+
margin-inline-start: calc(-1 * var(--slotted-control-border-width, 1px));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The seam is one border drawn twice, and whichever box paints last owns
|
|
131
|
+
* it. `select` is positioned and the frame is not, so the select's resting
|
|
132
|
+
* edge covered the frame's hover edge and the frame lit on three sides
|
|
133
|
+
* only. The box being pointed at, focused, open or invalid stands over the
|
|
134
|
+
* seam, so its edge is whole on all four sides.
|
|
135
|
+
*/
|
|
136
|
+
[data-ui='entity-picker']:not([data-disabled]) > [data-part='scope']:is(:hover, :focus-within),
|
|
137
|
+
[data-ui='entity-picker']:not([data-disabled]) > [data-part='control']:is(:hover, :focus-within),
|
|
138
|
+
[data-ui='entity-picker']:is([data-open], [data-invalid]) > [data-part='control'] {
|
|
139
|
+
position: relative;
|
|
140
|
+
z-index: 1;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* ── The frame ────────────────────────────────────────────────────────── */
|
|
144
|
+
|
|
145
|
+
[data-ui='entity-picker'] > [data-part='control'] {
|
|
146
|
+
align-items: center;
|
|
147
|
+
background-color: var(
|
|
148
|
+
--slotted-entity-picker-background,
|
|
149
|
+
var(--slotted-control-surface, Field)
|
|
150
|
+
);
|
|
151
|
+
border: var(--slotted-control-border-width, 1px) solid
|
|
152
|
+
var(--slotted-entity-picker-border-color, var(--slotted-control-border-color, ButtonBorder));
|
|
153
|
+
border-radius: var(--_radius);
|
|
154
|
+
box-shadow: var(--slotted-entity-picker-shadow, var(--slotted-control-shadow, none));
|
|
155
|
+
box-sizing: border-box;
|
|
156
|
+
color: var(--slotted-entity-picker-color, var(--slotted-text, CanvasText));
|
|
157
|
+
display: flex;
|
|
158
|
+
flex: 1 1 12rem;
|
|
159
|
+
font-size: var(--_font-size);
|
|
160
|
+
gap: var(--slotted-space-1, 0.125rem);
|
|
161
|
+
min-block-size: var(--_height);
|
|
162
|
+
min-inline-size: 0;
|
|
163
|
+
padding-inline-start: var(--_padding-inline);
|
|
164
|
+
/* `text-field`'s arithmetic: the glyph, not the button's box, ends where
|
|
165
|
+
the text begins on the other side. */
|
|
166
|
+
padding-inline-end: max(
|
|
167
|
+
0px,
|
|
168
|
+
calc(var(--_padding-inline) - (var(--_action-size) - var(--_icon-size)) / 2)
|
|
169
|
+
);
|
|
170
|
+
transition:
|
|
171
|
+
background-color var(--slotted-control-transition-duration)
|
|
172
|
+
var(--slotted-control-transition-easing),
|
|
173
|
+
border-color var(--slotted-control-transition-duration)
|
|
174
|
+
var(--slotted-control-transition-easing),
|
|
175
|
+
box-shadow var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* The chosen record's face, before its name. It says who before the reader
|
|
180
|
+
* reads the name, which is the one thing a single choice of a person shows
|
|
181
|
+
* that a text field cannot. Hidden from assistive technology: the input
|
|
182
|
+
* already carries the name.
|
|
183
|
+
*/
|
|
184
|
+
[data-ui='entity-picker'] > [data-part='control'] > [data-part='selection'] {
|
|
185
|
+
--slotted-avatar-size-xs: var(--_chip-media);
|
|
186
|
+
|
|
187
|
+
display: inline-flex;
|
|
188
|
+
flex: none;
|
|
189
|
+
margin-inline-end: var(--slotted-space-3, 0.375rem);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* ── The input ────────────────────────────────────────────────────────── */
|
|
193
|
+
|
|
194
|
+
[data-ui='entity-picker'] > [data-part='control'] [data-part='input'] {
|
|
195
|
+
background-color: transparent;
|
|
196
|
+
border: 0;
|
|
197
|
+
color: inherit;
|
|
198
|
+
flex: 1 1 auto;
|
|
199
|
+
font: inherit;
|
|
200
|
+
/* The frame draws the ring for it, so two rings never nest. */
|
|
201
|
+
outline: none;
|
|
202
|
+
padding: 0;
|
|
203
|
+
min-inline-size: 0;
|
|
204
|
+
text-overflow: ellipsis;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* In single the input is the frame's own row, stretched to its border box
|
|
208
|
+
as `combobox`'s is, so on a coarse pointer the control is the target. */
|
|
209
|
+
[data-ui='entity-picker'] > [data-part='control'] > [data-part='input'] {
|
|
210
|
+
align-self: stretch;
|
|
211
|
+
margin-block: calc(var(--slotted-control-border-width, 1px) * -1);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
[data-ui='entity-picker'] > [data-part='control'] [data-part='input']::placeholder {
|
|
215
|
+
color: var(--slotted-entity-picker-placeholder-color, var(--slotted-text-muted, GrayText));
|
|
216
|
+
text-overflow: ellipsis;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
[data-ui='entity-picker'] > [data-part='control'] [data-part='input']:autofill {
|
|
220
|
+
box-shadow: inset 0 0 0 100px
|
|
221
|
+
var(--slotted-entity-picker-autofill-background, var(--slotted-tone-accent-surface));
|
|
222
|
+
-webkit-text-fill-color: var(--slotted-entity-picker-color, var(--slotted-text, CanvasText));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/* ── The chips (multiple) ─────────────────────────────────────────────── */
|
|
226
|
+
|
|
227
|
+
[data-ui='entity-picker'] > [data-part='control'] > [data-part='values'] {
|
|
228
|
+
align-self: stretch;
|
|
229
|
+
display: flex;
|
|
230
|
+
flex: 1 1 auto;
|
|
231
|
+
min-inline-size: 0;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/* The boundary between what is chosen and what acts on it is the row's own
|
|
235
|
+
gap, not the frame's tight one (`multi-select`). */
|
|
236
|
+
[data-ui='entity-picker'] > [data-part='control'] > [data-part='values'] + * {
|
|
237
|
+
margin-inline-start: var(--_row-gap);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
[data-ui='entity-picker'] > [data-part='control'] [data-part='chips'] {
|
|
241
|
+
--slotted-control-inner-size: var(--_inner-size);
|
|
242
|
+
|
|
243
|
+
align-content: safe center;
|
|
244
|
+
align-items: center;
|
|
245
|
+
box-sizing: border-box;
|
|
246
|
+
column-gap: var(--_row-gap);
|
|
247
|
+
display: flex;
|
|
248
|
+
flex: 1 1 auto;
|
|
249
|
+
flex-wrap: wrap;
|
|
250
|
+
margin-inline: calc(-1 * var(--_row-air));
|
|
251
|
+
max-block-size: calc(3 * var(--_row-size) + 2 * var(--_row-gap) + 2 * var(--_row-air));
|
|
252
|
+
min-inline-size: 0;
|
|
253
|
+
overflow-y: auto;
|
|
254
|
+
overscroll-behavior: contain;
|
|
255
|
+
padding-block: var(--_row-air);
|
|
256
|
+
padding-inline: var(--_row-air);
|
|
257
|
+
row-gap: var(--_row-gap);
|
|
258
|
+
scrollbar-width: none;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
[data-ui='entity-picker'] > [data-part='control'] [data-part='chips']::-webkit-scrollbar {
|
|
262
|
+
display: none;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* One line, by default. A field in a form is one row tall beside the fields
|
|
267
|
+
* next to it, and a chosen set that wrapped made this one two or three rows
|
|
268
|
+
* tall the moment a third person was added (reviewer, visual gate). What
|
|
269
|
+
* does not fit is hidden by `createCollapse` and counted by the chip that
|
|
270
|
+
* says "+N", and the popup's `chosen` section holds every value it stands
|
|
271
|
+
* for. `overflow="wrap"` keeps `multi-select`'s three rows for a panel
|
|
272
|
+
* where height is free.
|
|
273
|
+
*
|
|
274
|
+
* `hidden` is what the collapse writes on a chip, so the rule that shows a
|
|
275
|
+
* chip only has to not fight it; the row clips rather than scrolls, and the
|
|
276
|
+
* chips' own focus ring is drawn inside them for that reason.
|
|
277
|
+
*/
|
|
278
|
+
[data-ui='entity-picker'][data-part='root']:not([data-overflow='wrap'])
|
|
279
|
+
> [data-part='control']
|
|
280
|
+
[data-part='chips'] {
|
|
281
|
+
flex-wrap: nowrap;
|
|
282
|
+
max-block-size: none;
|
|
283
|
+
overflow: hidden;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* The field and the count never give way, so the caret always has room and
|
|
288
|
+
* "+N" is always read. A chip shrinks only when it is the one chip left in
|
|
289
|
+
* view: a single name longer than the line is cut by `tag`'s own ellipsis
|
|
290
|
+
* rather than covering the count. With two or more in view none shrinks,
|
|
291
|
+
* because `createCollapse` measures them to decide which to hide, and a
|
|
292
|
+
* chip that had already shrunk measured as fitting (the reference page
|
|
293
|
+
* showed "Ana S…" beside room to spare).
|
|
294
|
+
*/
|
|
295
|
+
[data-ui='entity-picker'][data-part='root']:not([data-overflow='wrap'])
|
|
296
|
+
> [data-part='control']
|
|
297
|
+
[data-part='chips']
|
|
298
|
+
> [data-part='field'] {
|
|
299
|
+
flex: 1 0 var(--slotted-entity-picker-field-min, 2.5rem);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
[data-ui='entity-picker'][data-part='root']:not([data-overflow='wrap'])
|
|
303
|
+
> [data-part='control']
|
|
304
|
+
[data-part='chips']
|
|
305
|
+
> :not([data-part='field'], [hidden]):first-child:not(
|
|
306
|
+
:has(~ [data-ui='tag']:not([hidden], [data-count]))
|
|
307
|
+
) {
|
|
308
|
+
flex-shrink: 1;
|
|
309
|
+
/* Never a sliver: its face, three letters and its remove button. Below
|
|
310
|
+
that the collapse takes it into the count. */
|
|
311
|
+
min-inline-size: calc(var(--_chip-media) + 3ch + var(--_inner-size));
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/* The count is a chip that never gives way and never shrinks. */
|
|
315
|
+
[data-ui='entity-picker'] > [data-part='control'] [data-part='chips'] > [data-count] {
|
|
316
|
+
cursor: pointer;
|
|
317
|
+
flex: none;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* The cell that holds the caret asks for a word's worth of room and
|
|
322
|
+
* settles for a couple of characters, as in `multi-select`; in one line it
|
|
323
|
+
* is what the collapse leaves room for.
|
|
324
|
+
*/
|
|
325
|
+
[data-ui='entity-picker'] > [data-part='control'] [data-part='field'] {
|
|
326
|
+
align-items: center;
|
|
327
|
+
display: flex;
|
|
328
|
+
flex: 1 1 var(--slotted-entity-picker-field-basis, 4rem);
|
|
329
|
+
min-block-size: var(--_row-size);
|
|
330
|
+
min-inline-size: var(--slotted-entity-picker-field-min, 2.5rem);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
[data-ui='entity-picker']
|
|
334
|
+
> [data-part='control']
|
|
335
|
+
[data-part='chips']
|
|
336
|
+
> :not([data-part='field']) {
|
|
337
|
+
flex: 0 0 auto;
|
|
338
|
+
max-inline-size: 100%;
|
|
339
|
+
min-block-size: var(--_row-size);
|
|
340
|
+
min-inline-size: 0;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* The avatar in the chip. `tag` sizes its `start` slot at its glyph size,
|
|
345
|
+
* which is fourteen pixels — a face too small to read initials in — so
|
|
346
|
+
* this family places the slot at the chip's height less its air, and gives
|
|
347
|
+
* the body the same air at its start, so the circle sits in the pill's end
|
|
348
|
+
* the way the pill's end is round. The rest of the chip is `tag`'s.
|
|
349
|
+
*/
|
|
350
|
+
[data-ui='entity-picker']
|
|
351
|
+
> [data-part='control']
|
|
352
|
+
[data-part='chips']
|
|
353
|
+
> [data-ui]
|
|
354
|
+
> [data-part='body']
|
|
355
|
+
> [data-part='start'] {
|
|
356
|
+
--slotted-avatar-size-xs: var(--_chip-media);
|
|
357
|
+
|
|
358
|
+
block-size: var(--_chip-media);
|
|
359
|
+
inline-size: var(--_chip-media);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
[data-ui='entity-picker']
|
|
363
|
+
> [data-part='control']
|
|
364
|
+
[data-part='chips']
|
|
365
|
+
> [data-ui]
|
|
366
|
+
> [data-part='body']:has(> [data-part='start']) {
|
|
367
|
+
padding-inline-start: var(--slotted-space-1, 0.125rem);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
[data-ui='entity-picker']
|
|
371
|
+
> [data-part='control']
|
|
372
|
+
[data-part='chips']
|
|
373
|
+
> :not([data-part='field']):focus-visible {
|
|
374
|
+
outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
|
|
375
|
+
outline-offset: calc(-1 * var(--slotted-focus-ring-width, 2px));
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* A chip whose id has not come back yet. Its name is a skeleton the width of
|
|
380
|
+
* a short name, in the chip's own line, so the chip that arrives occupies
|
|
381
|
+
* the box that waited for it. It wears `tag`'s outline variant: on the soft
|
|
382
|
+
* ground the skeleton is the ground's own colour and read as an empty pill,
|
|
383
|
+
* and a chip that is not yet a value is drawn as an outline, like the one
|
|
384
|
+
* that never will be.
|
|
385
|
+
*/
|
|
386
|
+
[data-ui='entity-picker']
|
|
387
|
+
> [data-part='control']
|
|
388
|
+
[data-part='chips']
|
|
389
|
+
> [data-ui][data-loading]
|
|
390
|
+
> [data-part='body']
|
|
391
|
+
[data-ui='skeleton'] {
|
|
392
|
+
--slotted-skeleton-inline-size: 5em;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* A chip whose id the source did not return. It keeps its place and its
|
|
397
|
+
* remove button, and says so twice: an outline where a value has a ground,
|
|
398
|
+
* and the alert mark where a value has a face. The word is muted, never
|
|
399
|
+
* struck through — the record may exist and be out of this reader's reach.
|
|
400
|
+
*/
|
|
401
|
+
[data-ui='entity-picker']
|
|
402
|
+
> [data-part='control']
|
|
403
|
+
[data-part='chips']
|
|
404
|
+
> [data-ui][data-unresolved] {
|
|
405
|
+
color: var(--slotted-text-muted, GrayText);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
[data-ui='entity-picker']
|
|
409
|
+
> [data-part='control']
|
|
410
|
+
[data-part='chips']
|
|
411
|
+
> [data-ui][data-unresolved]
|
|
412
|
+
> [data-part='body']
|
|
413
|
+
> [data-part='start']
|
|
414
|
+
> [data-ui='icon'] {
|
|
415
|
+
/* The alert mark is a `Glyph` the binding draws in the face's place, at the
|
|
416
|
+
chip's icon step rather than stretched to the face's box. */
|
|
417
|
+
block-size: var(--_icon-size);
|
|
418
|
+
inline-size: var(--_icon-size);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/* ── The two buttons inside the frame ─────────────────────────────────── */
|
|
422
|
+
|
|
423
|
+
[data-ui='entity-picker']
|
|
424
|
+
> [data-part='control']
|
|
425
|
+
> :is([data-part='clear'], [data-part='trigger']) {
|
|
426
|
+
align-items: center;
|
|
427
|
+
appearance: none;
|
|
428
|
+
background-color: transparent;
|
|
429
|
+
block-size: var(--_action-size);
|
|
430
|
+
border: 0;
|
|
431
|
+
border-radius: var(--_radius);
|
|
432
|
+
color: var(--slotted-entity-picker-action-color, var(--slotted-text-muted, GrayText));
|
|
433
|
+
cursor: pointer;
|
|
434
|
+
display: inline-flex;
|
|
435
|
+
flex: 0 0 auto;
|
|
436
|
+
inline-size: var(--_action-size);
|
|
437
|
+
justify-content: center;
|
|
438
|
+
padding: 0;
|
|
439
|
+
position: relative;
|
|
440
|
+
touch-action: manipulation;
|
|
441
|
+
transition:
|
|
442
|
+
background-color var(--slotted-control-transition-duration)
|
|
443
|
+
var(--slotted-control-transition-easing),
|
|
444
|
+
color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);
|
|
445
|
+
-webkit-tap-highlight-color: transparent;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/* The hit area, recovered outside the paint (R2). */
|
|
449
|
+
[data-ui='entity-picker']
|
|
450
|
+
> [data-part='control']
|
|
451
|
+
> :is([data-part='clear'], [data-part='trigger'])::after {
|
|
452
|
+
content: '';
|
|
453
|
+
inset: min(0px, calc((100% - var(--slotted-target-min, 24px)) / 2));
|
|
454
|
+
position: absolute;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/* On a finger the target is the comfortable size in both axes and the box
|
|
458
|
+
is the one a mouse sees: the ground and the focus ring stay square, and
|
|
459
|
+
the hit area above grows to 44 pixels around them. Side by side, neither
|
|
460
|
+
button reaches across the edge the two share. */
|
|
461
|
+
@media (pointer: coarse) {
|
|
462
|
+
[data-ui='entity-picker']
|
|
463
|
+
> [data-part='control']
|
|
464
|
+
> :is([data-part='clear'], [data-part='trigger'])::after {
|
|
465
|
+
inset: min(0px, calc((100% - var(--slotted-target-comfortable, 44px)) / 2));
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
[data-ui='entity-picker']
|
|
469
|
+
> [data-part='control']
|
|
470
|
+
> [data-part='clear']:has(+ [data-part='trigger']:not([hidden]))::after {
|
|
471
|
+
inset-inline-end: 0;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
[data-ui='entity-picker']
|
|
475
|
+
> [data-part='control']
|
|
476
|
+
> [data-part='clear']:not([hidden])
|
|
477
|
+
+ [data-part='trigger']::after {
|
|
478
|
+
inset-inline-start: 0;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/* The cross and the chevron are `Glyph` elements the binding draws, sized
|
|
483
|
+
here to the control's icon step. */
|
|
484
|
+
[data-ui='entity-picker']
|
|
485
|
+
> [data-part='control']
|
|
486
|
+
> :is([data-part='clear'], [data-part='trigger']) {
|
|
487
|
+
--slotted-icon-size: var(--_icon-size);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
[data-ui='entity-picker'] > [data-part='control'] > [data-part='trigger'] > [data-part='arrow'] {
|
|
491
|
+
align-items: center;
|
|
492
|
+
block-size: var(--_icon-size);
|
|
493
|
+
display: flex;
|
|
494
|
+
inline-size: var(--_icon-size);
|
|
495
|
+
justify-content: center;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
[data-ui='entity-picker']
|
|
499
|
+
> [data-part='control']
|
|
500
|
+
> [data-part='trigger']
|
|
501
|
+
> [data-part='arrow']
|
|
502
|
+
> [data-ui='icon'] {
|
|
503
|
+
transition: rotate var(--slotted-control-transition-duration)
|
|
504
|
+
var(--slotted-control-transition-easing);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
[data-ui='entity-picker'][data-open]
|
|
508
|
+
> [data-part='control']
|
|
509
|
+
> [data-part='trigger']
|
|
510
|
+
> [data-part='arrow']
|
|
511
|
+
> [data-ui='icon'] {
|
|
512
|
+
rotate: 180deg;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
/* The ring where the chevron stands, drawn by `spinner/spinner.css`. */
|
|
516
|
+
[data-ui='entity-picker'] > [data-part='control'] > [data-part='trigger'] > [data-part='busy'] {
|
|
517
|
+
--slotted-spinner-size: var(--_icon-size);
|
|
518
|
+
|
|
519
|
+
color: var(--slotted-entity-picker-action-color, var(--slotted-text-muted, GrayText));
|
|
520
|
+
flex: none;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
[data-ui='entity-picker']
|
|
524
|
+
> [data-part='control']
|
|
525
|
+
> :is([data-part='clear'], [data-part='trigger']):hover:not(:disabled):not([data-disabled]) {
|
|
526
|
+
background-color: var(
|
|
527
|
+
--slotted-entity-picker-action-hover-background,
|
|
528
|
+
var(--slotted-tone-secondary-subtle-hover)
|
|
529
|
+
);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
[data-ui='entity-picker']
|
|
533
|
+
> [data-part='control']
|
|
534
|
+
> :is([data-part='clear'], [data-part='trigger']):active:not(:disabled):not([data-disabled]) {
|
|
535
|
+
background-color: var(
|
|
536
|
+
--slotted-entity-picker-action-active-background,
|
|
537
|
+
var(--slotted-tone-secondary-subtle-active)
|
|
538
|
+
);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
[data-ui='entity-picker']
|
|
542
|
+
> [data-part='control']
|
|
543
|
+
> :is([data-part='clear'], [data-part='trigger']):focus-visible {
|
|
544
|
+
outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
|
|
545
|
+
outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
/* ── Variant ──────────────────────────────────────────────────────────── */
|
|
549
|
+
|
|
550
|
+
[data-ui='entity-picker'][data-part='root'][data-variant='subtle'] > [data-part='control'] {
|
|
551
|
+
background-color: var(
|
|
552
|
+
--slotted-entity-picker-subtle-background,
|
|
553
|
+
var(--slotted-surface-sunken, Canvas)
|
|
554
|
+
);
|
|
555
|
+
border-color: var(
|
|
556
|
+
--slotted-entity-picker-subtle-border-color,
|
|
557
|
+
var(--slotted-border-subtle, ButtonBorder)
|
|
558
|
+
);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/* The cell it sits in is the box (the plain-variant rule). */
|
|
562
|
+
[data-ui='entity-picker'][data-part='root'][data-variant='plain'] > [data-part='control'] {
|
|
563
|
+
background-color: transparent;
|
|
564
|
+
border-color: transparent;
|
|
565
|
+
border-radius: var(--slotted-radius-none, 0px);
|
|
566
|
+
box-shadow: none;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
@media (forced-colors: active) {
|
|
570
|
+
[data-ui='entity-picker'][data-part='root'][data-variant='plain'] > [data-part='control'] {
|
|
571
|
+
border-color: ButtonBorder;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/* ── States on the frame ──────────────────────────────────────────────── */
|
|
576
|
+
|
|
577
|
+
[data-ui='entity-picker'][data-part='root']:not([data-disabled]):not([data-readonly]):not(
|
|
578
|
+
[data-invalid]
|
|
579
|
+
)
|
|
580
|
+
> [data-part='control']:hover {
|
|
581
|
+
border-color: var(
|
|
582
|
+
--slotted-entity-picker-hover-border-color,
|
|
583
|
+
var(--slotted-tone-accent-border)
|
|
584
|
+
);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
[data-ui='entity-picker'][data-part='root'][data-variant='subtle']:not([data-disabled]):not(
|
|
588
|
+
[data-readonly]
|
|
589
|
+
):not([data-invalid])
|
|
590
|
+
> [data-part='control']:hover {
|
|
591
|
+
background-color: var(
|
|
592
|
+
--slotted-entity-picker-subtle-hover-background,
|
|
593
|
+
var(--slotted-tone-secondary-subtle-hover)
|
|
594
|
+
);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
[data-ui='entity-picker'][data-part='root'][data-variant='plain']:not([data-disabled]):not(
|
|
598
|
+
[data-readonly]
|
|
599
|
+
):not([data-invalid])
|
|
600
|
+
> [data-part='control']:hover {
|
|
601
|
+
background-color: var(
|
|
602
|
+
--slotted-entity-picker-plain-hover-background,
|
|
603
|
+
var(--slotted-tone-secondary-subtle-hover)
|
|
604
|
+
);
|
|
605
|
+
border-color: transparent;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
[data-ui='entity-picker'] > [data-part='control']:has([data-part='input']:focus-visible) {
|
|
609
|
+
box-shadow: var(--slotted-control-shadow-focus-geometry, 0 1px 4px -1px)
|
|
610
|
+
var(--slotted-focus-ring-color, Highlight);
|
|
611
|
+
outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
|
|
612
|
+
outline-offset: var(--slotted-focus-ring-offset, 2px);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
[data-ui='entity-picker'][data-part='root'][data-variant='plain']
|
|
616
|
+
> [data-part='control']:has([data-part='input']:focus-visible) {
|
|
617
|
+
box-shadow: none;
|
|
618
|
+
outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
[data-ui='entity-picker'][data-part='root'][data-open]:not([data-disabled])
|
|
622
|
+
> [data-part='control'] {
|
|
623
|
+
border-color: var(--slotted-entity-picker-open-border-color, var(--slotted-tone-accent-border));
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
[data-ui='entity-picker'][data-part='root'][data-invalid] {
|
|
627
|
+
--slotted-focus-ring-color: var(
|
|
628
|
+
--slotted-entity-picker-invalid-focus-ring-color,
|
|
629
|
+
var(--slotted-focus-ring-color-invalid, Highlight)
|
|
630
|
+
);
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
[data-ui='entity-picker'][data-part='root'][data-invalid] > [data-part='control'] {
|
|
634
|
+
--_invalid-edge-width: var(
|
|
635
|
+
--slotted-entity-picker-invalid-edge-width,
|
|
636
|
+
var(--slotted-control-invalid-edge-width, 1px)
|
|
637
|
+
);
|
|
638
|
+
--_invalid-edge-color: var(
|
|
639
|
+
--slotted-entity-picker-invalid-border-color,
|
|
640
|
+
var(--slotted-tone-danger-border)
|
|
641
|
+
);
|
|
642
|
+
--_invalid-edge: inset 0 0 0 var(--_invalid-edge-width) var(--_invalid-edge-color);
|
|
643
|
+
|
|
644
|
+
border-color: var(
|
|
645
|
+
--slotted-entity-picker-invalid-border-color,
|
|
646
|
+
var(--slotted-tone-danger-border)
|
|
647
|
+
);
|
|
648
|
+
/*
|
|
649
|
+
* Width as well as colour (WCAG 1.4.1), the edge `text-field` draws: in
|
|
650
|
+
* `high-contrast` the danger border is the resting edge's black. The line
|
|
651
|
+
* is a shadow inside the border, so neither box nor text moves, and it
|
|
652
|
+
* takes the resting lift's place.
|
|
653
|
+
*/
|
|
654
|
+
box-shadow: var(--_invalid-edge);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
[data-ui='entity-picker'][data-invalid]
|
|
658
|
+
> [data-part='control']:has([data-part='input']:focus-visible) {
|
|
659
|
+
box-shadow:
|
|
660
|
+
var(--_invalid-edge),
|
|
661
|
+
var(--slotted-control-shadow-focus-geometry, 0 1px 4px -1px)
|
|
662
|
+
var(--slotted-focus-ring-color, Highlight);
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
[data-ui='entity-picker'][data-part='root'][data-variant='plain'][data-invalid]
|
|
666
|
+
> [data-part='control']:has([data-part='input']:focus-visible) {
|
|
667
|
+
/* The ring lies inside the box here, over the border and an edge as wide as
|
|
668
|
+
it; the edge reaches past the ring. */
|
|
669
|
+
box-shadow: inset 0 0 0
|
|
670
|
+
calc(
|
|
671
|
+
var(--slotted-focus-ring-offset, 2px) - var(--slotted-control-border-width, 1px) +
|
|
672
|
+
var(--_invalid-edge-width)
|
|
673
|
+
)
|
|
674
|
+
var(--_invalid-edge-color);
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
/*
|
|
678
|
+
* Forced colours remove every box shadow, and the edge with them. The
|
|
679
|
+
* width comes back as an outline inside the border, and a focused invalid
|
|
680
|
+
* control draws its ring double, which a valid ring is not.
|
|
681
|
+
*/
|
|
682
|
+
@media (forced-colors: active) {
|
|
683
|
+
[data-ui='entity-picker'][data-part='root'][data-invalid] > [data-part='control'] {
|
|
684
|
+
outline: var(--_invalid-edge-width) solid CanvasText;
|
|
685
|
+
outline-offset: calc(
|
|
686
|
+
-1 * (var(--slotted-control-border-width, 1px) + var(--_invalid-edge-width))
|
|
687
|
+
);
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
[data-ui='entity-picker'][data-invalid]
|
|
691
|
+
> [data-part='control']:has([data-part='input']:focus-visible) {
|
|
692
|
+
outline: calc(var(--slotted-focus-ring-width, 2px) + var(--_invalid-edge-width)) double
|
|
693
|
+
var(--slotted-focus-ring-color, Highlight);
|
|
694
|
+
outline-offset: var(--slotted-focus-ring-offset, 2px);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
[data-ui='entity-picker'][data-part='root'][data-variant='plain'][data-invalid]
|
|
698
|
+
> [data-part='control']:has([data-part='input']:focus-visible) {
|
|
699
|
+
outline: calc(var(--slotted-focus-ring-width, 2px) + var(--_invalid-edge-width)) double
|
|
700
|
+
var(--slotted-focus-ring-color, Highlight);
|
|
701
|
+
outline-offset: calc(
|
|
702
|
+
-1 * (var(--slotted-focus-ring-width, 2px) + var(--_invalid-edge-width))
|
|
703
|
+
);
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
[data-ui='entity-picker'][data-part='root'][data-readonly] > [data-part='control'] {
|
|
708
|
+
background-color: var(
|
|
709
|
+
--slotted-entity-picker-readonly-background,
|
|
710
|
+
var(--slotted-tone-secondary-subtle-hover)
|
|
711
|
+
);
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
[data-ui='entity-picker'][data-part='root'][data-readonly]
|
|
715
|
+
> [data-part='control']
|
|
716
|
+
> [data-part='trigger']
|
|
717
|
+
> [data-part='arrow'] {
|
|
718
|
+
opacity: 0.5;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
[data-ui='entity-picker'][data-part='root'][data-disabled] > [data-part='control'],
|
|
722
|
+
[data-ui='entity-picker'] > [data-part='control']:has([data-part='input']:disabled) {
|
|
723
|
+
background-color: var(
|
|
724
|
+
--slotted-entity-picker-disabled-background,
|
|
725
|
+
var(--slotted-disabled-background)
|
|
726
|
+
);
|
|
727
|
+
border-color: var(
|
|
728
|
+
--slotted-entity-picker-disabled-border-color,
|
|
729
|
+
var(--slotted-disabled-border)
|
|
730
|
+
);
|
|
731
|
+
box-shadow: none;
|
|
732
|
+
color: var(--slotted-entity-picker-disabled-color, var(--slotted-disabled-foreground));
|
|
733
|
+
cursor: not-allowed;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
/* A disabled face is a quieter face: the ink recedes, the photograph with it. */
|
|
737
|
+
[data-ui='entity-picker'][data-part='root'][data-disabled]
|
|
738
|
+
> [data-part='control']
|
|
739
|
+
:is(
|
|
740
|
+
[data-part='selection'],
|
|
741
|
+
[data-part='chips'] > [data-ui] > [data-part='body'] > [data-part='start']
|
|
742
|
+
) {
|
|
743
|
+
opacity: 0.6;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
/* ── The layer ────────────────────────────────────────────────────────── */
|
|
747
|
+
|
|
748
|
+
[data-ui='entity-picker'][data-part='positioner'] {
|
|
749
|
+
--_surface: var(--slotted-entity-picker-surface, var(--slotted-surface-raised, #ffffff));
|
|
750
|
+
--_text: var(--slotted-entity-picker-content-text, var(--slotted-text, #0f172a));
|
|
751
|
+
--_muted: var(--slotted-entity-picker-content-text-muted, var(--slotted-text-muted, #5b6b7f));
|
|
752
|
+
--_border-color: var(
|
|
753
|
+
--slotted-entity-picker-content-border-color,
|
|
754
|
+
var(--slotted-border-subtle, #e2e8f0)
|
|
755
|
+
);
|
|
756
|
+
--_border-width: var(--slotted-border-width-thin, 1px);
|
|
757
|
+
--_content-radius: var(--slotted-entity-picker-content-radius, var(--slotted-radius-lg, 8px));
|
|
758
|
+
--_shadow: var(--slotted-entity-picker-content-shadow, var(--slotted-shadow-md));
|
|
759
|
+
/* The stronger neutral step, for `select.css`'s dark-scheme reason. */
|
|
760
|
+
--_highlight: var(
|
|
761
|
+
--slotted-entity-picker-highlight,
|
|
762
|
+
var(--slotted-tone-secondary-subtle-active)
|
|
763
|
+
);
|
|
764
|
+
--_highlight-active: var(
|
|
765
|
+
--slotted-entity-picker-highlight-active,
|
|
766
|
+
var(--slotted-tone-accent-surface)
|
|
767
|
+
);
|
|
768
|
+
--_selected-color: var(--slotted-entity-picker-selected-color, var(--slotted-tone-accent-text));
|
|
769
|
+
--_inset-block: var(--slotted-space-2, 0.25rem);
|
|
770
|
+
--_inset-inline: var(--slotted-space-2, 0.25rem);
|
|
771
|
+
--_item-inset: var(--slotted-control-padding-inline-md, 0.8125rem);
|
|
772
|
+
--_item-height: var(--slotted-control-height-md, 34px);
|
|
773
|
+
--_item-radius: var(--slotted-entity-picker-item-radius, var(--slotted-control-radius));
|
|
774
|
+
--_content-font-size: var(--slotted-control-font-size-md, 13px);
|
|
775
|
+
--_secondary-font-size: var(--slotted-control-font-size-sm, 12px);
|
|
776
|
+
--_content-icon-size: var(--slotted-control-icon-size-md, 16px);
|
|
777
|
+
--_column-gap: var(--slotted-control-gap-md, 0.5rem);
|
|
778
|
+
/**
|
|
779
|
+
* The face in a row. Two lines of text beside it at `md` stand 38 pixels
|
|
780
|
+
* tall at comfortable, and the step of the avatar scale under that is
|
|
781
|
+
* `sm`, 28 pixels; each size step of the family takes the avatar step
|
|
782
|
+
* beside it, and density moves all three through the avatar scale.
|
|
783
|
+
*/
|
|
784
|
+
--_media-size: var(--slotted-avatar-size-sm, 28px);
|
|
785
|
+
--_measure: var(--slotted-entity-picker-measure, 28rem);
|
|
786
|
+
--_enter-distance: var(--slotted-space-2, 0.25rem);
|
|
787
|
+
|
|
788
|
+
box-sizing: border-box;
|
|
789
|
+
inset-block-start: 0;
|
|
790
|
+
isolation: isolate;
|
|
791
|
+
opacity: 0;
|
|
792
|
+
pointer-events: none;
|
|
793
|
+
position: absolute;
|
|
794
|
+
transition:
|
|
795
|
+
opacity var(--slotted-duration-short) var(--slotted-easing-exit),
|
|
796
|
+
translate var(--slotted-duration-short) var(--slotted-easing-exit);
|
|
797
|
+
translate: 0 calc(-1 * var(--_enter-distance));
|
|
798
|
+
z-index: calc(var(--slotted-z-index-popover, 1100) + var(--slotted-layer-depth, 0));
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
[data-ui='entity-picker'][data-part='positioner'][data-side='top'] {
|
|
802
|
+
translate: 0 var(--_enter-distance);
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
[data-ui='entity-picker'][data-part='positioner']:is([data-side='left'], [data-side='right']) {
|
|
806
|
+
translate: 0 0;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
[data-ui='entity-picker'][data-part='positioner'][data-open] {
|
|
810
|
+
opacity: 1;
|
|
811
|
+
transition: none;
|
|
812
|
+
translate: 0 0;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
[data-ui='entity-picker'][data-part='positioner'][data-open][data-positioned] {
|
|
816
|
+
animation: slotted-entity-picker-enter-down var(--slotted-duration-medium)
|
|
817
|
+
var(--slotted-easing-enter);
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
[data-ui='entity-picker'][data-part='positioner'][data-open][data-positioned][data-side='top'] {
|
|
821
|
+
animation-name: slotted-entity-picker-enter-up;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
[data-ui='entity-picker'][data-part='positioner'][data-open][data-positioned]:is(
|
|
825
|
+
[data-side='left'],
|
|
826
|
+
[data-side='right']
|
|
827
|
+
) {
|
|
828
|
+
animation-name: slotted-entity-picker-fade;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
@keyframes slotted-entity-picker-enter-down {
|
|
832
|
+
from {
|
|
833
|
+
opacity: 0;
|
|
834
|
+
translate: 0 calc(-1 * var(--_enter-distance));
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
@keyframes slotted-entity-picker-enter-up {
|
|
839
|
+
from {
|
|
840
|
+
opacity: 0;
|
|
841
|
+
translate: 0 var(--_enter-distance);
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
@keyframes slotted-entity-picker-fade {
|
|
846
|
+
from {
|
|
847
|
+
opacity: 0;
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
@media (prefers-reduced-motion: reduce) {
|
|
852
|
+
[data-ui='entity-picker'][data-part='positioner'],
|
|
853
|
+
[data-ui='entity-picker'][data-part='positioner'][data-side='top'],
|
|
854
|
+
[data-ui='entity-picker'][data-part='positioner'][data-side='left'],
|
|
855
|
+
[data-ui='entity-picker'][data-part='positioner'][data-side='right'] {
|
|
856
|
+
transition: opacity var(--slotted-duration-short) var(--slotted-easing-exit);
|
|
857
|
+
translate: 0 0;
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
[data-ui='entity-picker'][data-part='positioner'][data-open][data-positioned],
|
|
861
|
+
[data-ui='entity-picker'][data-part='positioner'][data-open][data-positioned][data-side='top'],
|
|
862
|
+
[data-ui='entity-picker'][data-part='positioner'][data-open][data-positioned][data-side='left'],
|
|
863
|
+
[data-ui='entity-picker'][data-part='positioner'][data-open][data-positioned][data-side='right'] {
|
|
864
|
+
animation-name: slotted-entity-picker-fade;
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
[data-ui='entity-picker'][data-part='positioner'][data-detached] {
|
|
869
|
+
visibility: hidden;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
[data-ui='entity-picker'][data-part='positioner'][data-width='anchor'] {
|
|
873
|
+
inline-size: var(--slotted-positioner-anchor-width, auto);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
[data-ui='entity-picker'][data-part='positioner'][data-width='content'] {
|
|
877
|
+
inline-size: max-content;
|
|
878
|
+
max-inline-size: min(var(--_measure), var(--slotted-positioner-available-width, 100vw));
|
|
879
|
+
min-inline-size: var(--slotted-positioner-anchor-width, auto);
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
[data-ui='entity-picker'][data-part='positioner'][data-size='sm'] {
|
|
883
|
+
--_item-inset: var(--slotted-control-padding-inline-sm, 0.625rem);
|
|
884
|
+
--_item-height: var(--slotted-control-height-sm, 30px);
|
|
885
|
+
--_content-font-size: var(--slotted-control-font-size-sm, 12px);
|
|
886
|
+
--_secondary-font-size: var(--slotted-font-size-xs, 0.75rem);
|
|
887
|
+
--_content-icon-size: var(--slotted-control-icon-size-sm, 14px);
|
|
888
|
+
--_column-gap: var(--slotted-control-gap-sm, 0.375rem);
|
|
889
|
+
--_media-size: var(--slotted-avatar-size-xs, 24px);
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
[data-ui='entity-picker'][data-part='positioner'][data-size='lg'] {
|
|
893
|
+
--_item-inset: var(--slotted-control-padding-inline-lg, 1rem);
|
|
894
|
+
--_item-height: var(--slotted-control-height-lg, 38px);
|
|
895
|
+
--_content-font-size: var(--slotted-control-font-size-lg, 14px);
|
|
896
|
+
--_secondary-font-size: var(--slotted-control-font-size-sm, 12px);
|
|
897
|
+
--_content-icon-size: var(--slotted-control-icon-size-lg, 18px);
|
|
898
|
+
--_column-gap: var(--slotted-control-gap-lg, 0.5rem);
|
|
899
|
+
--_media-size: var(--slotted-avatar-size-md, 36px);
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
/* ── The surface ──────────────────────────────────────────────────────── */
|
|
903
|
+
|
|
904
|
+
/**
|
|
905
|
+
* Four columns every row shares through a subgrid: the face, the words, the
|
|
906
|
+
* short fact, the check. A column no row fills is `auto` and takes nothing,
|
|
907
|
+
* so a list with `media="none"` starts its words at the row's inset.
|
|
908
|
+
*/
|
|
909
|
+
[data-ui='entity-picker'] > [data-part='content'] {
|
|
910
|
+
background: var(--_surface);
|
|
911
|
+
border: var(--_border-width) solid var(--_border-color);
|
|
912
|
+
border-radius: var(--_content-radius);
|
|
913
|
+
box-shadow: var(--_shadow);
|
|
914
|
+
box-sizing: border-box;
|
|
915
|
+
color: var(--_text);
|
|
916
|
+
display: grid;
|
|
917
|
+
font-family: var(--slotted-font-family-sans);
|
|
918
|
+
font-size: var(--_content-font-size);
|
|
919
|
+
grid-auto-rows: max-content;
|
|
920
|
+
/* The short fact takes at most a quarter of the row: in a narrow list it
|
|
921
|
+
is cut before the name is, where an `auto` track kept "Finance" whole
|
|
922
|
+
and wrapped "Carla Mendes" onto two lines at 240 pixels. */
|
|
923
|
+
grid-template-columns: auto minmax(0, 1fr) fit-content(25%) auto;
|
|
924
|
+
max-block-size: calc(
|
|
925
|
+
var(--slotted-positioner-available-height, 100vh) - var(--slotted-space-5, 0.75rem)
|
|
926
|
+
);
|
|
927
|
+
outline: none;
|
|
928
|
+
overflow-y: auto;
|
|
929
|
+
overscroll-behavior: contain;
|
|
930
|
+
padding-block: var(--_inset-block);
|
|
931
|
+
padding-inline: var(--_inset-inline);
|
|
932
|
+
pointer-events: auto;
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
/**
|
|
936
|
+
* A new query over rows already shown. The rows stay, recede and swap when
|
|
937
|
+
* the answer lands (`loading-states` §1): `data-list`'s strength for the
|
|
938
|
+
* same wait. They stay pressable — each is still a record the reader can
|
|
939
|
+
* choose.
|
|
940
|
+
*/
|
|
941
|
+
[data-ui='entity-picker']
|
|
942
|
+
> [data-part='content'][data-loading]
|
|
943
|
+
> :is([data-part='group'], [data-part='item']) {
|
|
944
|
+
opacity: 0.55;
|
|
945
|
+
transition: opacity var(--slotted-control-transition-duration)
|
|
946
|
+
var(--slotted-control-transition-easing);
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
[data-ui='entity-picker'] > [data-part='content'][data-loading] {
|
|
950
|
+
cursor: progress;
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='group'] {
|
|
954
|
+
display: grid;
|
|
955
|
+
grid-column: 1 / -1;
|
|
956
|
+
grid-template-columns: subgrid;
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
/* Two sections are separated by a step of air, not by a rule: the heading
|
|
960
|
+
already says where one ends. */
|
|
961
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='group'] + [data-part='group'] {
|
|
962
|
+
margin-block-start: var(--slotted-space-2, 0.25rem);
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='group-label'] {
|
|
966
|
+
color: var(--_muted);
|
|
967
|
+
font-size: var(--_secondary-font-size);
|
|
968
|
+
font-weight: var(--slotted-font-weight-semibold, 600);
|
|
969
|
+
grid-column: 1 / -1;
|
|
970
|
+
line-height: var(--slotted-line-height-sm, 1.45);
|
|
971
|
+
padding-block: var(--slotted-space-3, 0.375rem) var(--slotted-space-2, 0.25rem);
|
|
972
|
+
padding-inline: var(--_item-inset);
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
/* ── The record ───────────────────────────────────────────────────────── */
|
|
976
|
+
|
|
977
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='item'] {
|
|
978
|
+
/* The tracks keep their content's height and the pair is centred in the
|
|
979
|
+
row's minimum, so a mark placed at the start of a track is on the
|
|
980
|
+
words' line: stretched tracks put the words 3px under their glyph. */
|
|
981
|
+
align-content: center;
|
|
982
|
+
align-items: center;
|
|
983
|
+
border-radius: var(--_item-radius);
|
|
984
|
+
box-sizing: border-box;
|
|
985
|
+
column-gap: 0;
|
|
986
|
+
cursor: pointer;
|
|
987
|
+
display: grid;
|
|
988
|
+
grid-column: 1 / -1;
|
|
989
|
+
grid-template-columns: subgrid;
|
|
990
|
+
grid-template-rows: auto;
|
|
991
|
+
line-height: var(--slotted-line-height-md, 1.5);
|
|
992
|
+
min-block-size: var(--_item-height);
|
|
993
|
+
padding-block: var(--slotted-space-2, 0.25rem);
|
|
994
|
+
padding-inline: var(--_item-inset);
|
|
995
|
+
row-gap: 0;
|
|
996
|
+
transition:
|
|
997
|
+
background-color var(--slotted-control-transition-duration)
|
|
998
|
+
var(--slotted-control-transition-easing),
|
|
999
|
+
color var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);
|
|
1000
|
+
user-select: none;
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1004
|
+
[data-part='item']:has(> [data-part='description']) {
|
|
1005
|
+
grid-template-rows: auto auto;
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='item'][data-current] {
|
|
1009
|
+
background-color: var(--_highlight);
|
|
1010
|
+
/* A ring as well as a ground: nothing on this surface holds focus. */
|
|
1011
|
+
box-shadow: inset 0 0 0 var(--slotted-border-width-thin, 1px)
|
|
1012
|
+
var(--slotted-entity-picker-highlight-ring, var(--slotted-tone-accent-border));
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='item']:not([data-disabled]):active {
|
|
1016
|
+
background-color: var(--_highlight-active);
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='item'][data-selected] {
|
|
1020
|
+
color: var(--_selected-color);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
/* Two chosen neighbours are one block (LB2, `selection-block.test.mjs`). */
|
|
1024
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1025
|
+
[data-part='item'][data-selected]
|
|
1026
|
+
+ [data-part='item'][data-selected] {
|
|
1027
|
+
border-start-end-radius: 0;
|
|
1028
|
+
border-start-start-radius: 0;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1032
|
+
[data-part='item'][data-selected]:has(+ [data-part='item'][data-selected]) {
|
|
1033
|
+
border-end-end-radius: 0;
|
|
1034
|
+
border-end-start-radius: 0;
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1038
|
+
[data-part='item'][data-selected]
|
|
1039
|
+
> [data-part='label'] {
|
|
1040
|
+
font-weight: var(--slotted-font-weight-medium, 500);
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='item'][data-disabled] {
|
|
1044
|
+
color: var(--slotted-disabled-foreground, #64748b);
|
|
1045
|
+
cursor: not-allowed;
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1049
|
+
[data-part='item'][data-disabled][data-current] {
|
|
1050
|
+
box-shadow: inset 0 0 0 var(--slotted-border-width-thin, 1px)
|
|
1051
|
+
var(--slotted-disabled-border, #cbd5e1);
|
|
1052
|
+
color: var(--slotted-disabled-foreground, #64748b);
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
/**
|
|
1056
|
+
* The face spans both lines and is centred on them, so a record reads as
|
|
1057
|
+
* one block — who, then which one — and a one-line record's face is centred
|
|
1058
|
+
* on its one line. The column's width is the face's, plus the gap.
|
|
1059
|
+
*/
|
|
1060
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='media'] {
|
|
1061
|
+
--slotted-avatar-size-xs: var(--_media-size);
|
|
1062
|
+
|
|
1063
|
+
align-self: center;
|
|
1064
|
+
display: flex;
|
|
1065
|
+
grid-column: 1;
|
|
1066
|
+
grid-row: 1 / -1;
|
|
1067
|
+
justify-content: center;
|
|
1068
|
+
margin-inline-end: var(--_column-gap);
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='media']:empty {
|
|
1072
|
+
block-size: var(--_content-icon-size);
|
|
1073
|
+
inline-size: var(--_media-size);
|
|
1074
|
+
}
|
|
1075
|
+
|
|
1076
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='label'] {
|
|
1077
|
+
-webkit-box-orient: vertical;
|
|
1078
|
+
display: -webkit-box;
|
|
1079
|
+
grid-column: 2;
|
|
1080
|
+
grid-row: 1;
|
|
1081
|
+
-webkit-line-clamp: 2;
|
|
1082
|
+
min-inline-size: 0;
|
|
1083
|
+
overflow: hidden;
|
|
1084
|
+
overflow-wrap: anywhere;
|
|
1085
|
+
justify-self: start;
|
|
1086
|
+
max-inline-size: 100%;
|
|
1087
|
+
unicode-bidi: plaintext;
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
/**
|
|
1091
|
+
* The identifier. One line: it is what tells two people of one name apart,
|
|
1092
|
+
* so its start is what is kept, and the whole string is in the option's
|
|
1093
|
+
* name for a reader who does not see the cut.
|
|
1094
|
+
*
|
|
1095
|
+
* The name and the identifier are ordered by their own first strong
|
|
1096
|
+
* character (`plaintext`), so "12 members" and an address keep their order
|
|
1097
|
+
* in a right-to-left page — `isolate` printed "members 12". The box is then
|
|
1098
|
+
* placed at the grid's start, which follows the page: with `plaintext` the
|
|
1099
|
+
* text aligns to its own direction, and a Latin name stood at the left of
|
|
1100
|
+
* a right-to-left row, a column away from its face.
|
|
1101
|
+
*/
|
|
1102
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='description'] {
|
|
1103
|
+
color: var(--_muted);
|
|
1104
|
+
font-size: var(--_secondary-font-size);
|
|
1105
|
+
/* Under the short fact too: that column holds nothing on this line. */
|
|
1106
|
+
grid-column: 2 / 4;
|
|
1107
|
+
grid-row: 2;
|
|
1108
|
+
line-height: var(--slotted-line-height-sm, 1.45);
|
|
1109
|
+
min-inline-size: 0;
|
|
1110
|
+
overflow: hidden;
|
|
1111
|
+
text-overflow: ellipsis;
|
|
1112
|
+
justify-self: start;
|
|
1113
|
+
max-inline-size: 100%;
|
|
1114
|
+
unicode-bidi: plaintext;
|
|
1115
|
+
white-space: nowrap;
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1119
|
+
[data-part='item'][data-disabled]
|
|
1120
|
+
> [data-part='description'] {
|
|
1121
|
+
color: inherit;
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
/**
|
|
1125
|
+
* A short fact at the end of the name's line: a type, a status. It is on
|
|
1126
|
+
* the name's line and not centred on the record, because it is read with
|
|
1127
|
+
* the name ("Ana Silva · Admin"), and it never wraps.
|
|
1128
|
+
*/
|
|
1129
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='meta'] {
|
|
1130
|
+
align-self: start;
|
|
1131
|
+
color: var(--_muted);
|
|
1132
|
+
font-size: var(--_secondary-font-size);
|
|
1133
|
+
grid-column: 3;
|
|
1134
|
+
grid-row: 1;
|
|
1135
|
+
/* The name's line box, so the smaller type sits on the name's line. */
|
|
1136
|
+
line-height: calc(var(--_content-font-size) * var(--slotted-line-height-md, 1.5));
|
|
1137
|
+
margin-inline-start: var(--_column-gap);
|
|
1138
|
+
/* A fact, not a name: it gives way before the name does. */
|
|
1139
|
+
max-inline-size: var(--slotted-entity-picker-meta-measure, 8em);
|
|
1140
|
+
overflow: hidden;
|
|
1141
|
+
text-overflow: ellipsis;
|
|
1142
|
+
white-space: nowrap;
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
/**
|
|
1146
|
+
* The check marks the name, so it stands on the name's first line — the
|
|
1147
|
+
* briefing's rule for a mark beside a line of text — in a box one line
|
|
1148
|
+
* tall with the glyph centred in it, as `combobox` draws it. Centred on a
|
|
1149
|
+
* two-line record it stood nine pixels above the name (`audit.mjs`).
|
|
1150
|
+
*/
|
|
1151
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='indicator'] {
|
|
1152
|
+
--slotted-icon-size: var(--_content-icon-size);
|
|
1153
|
+
|
|
1154
|
+
align-items: center;
|
|
1155
|
+
align-self: start;
|
|
1156
|
+
block-size: calc(var(--_content-font-size) * var(--slotted-line-height-md, 1.5));
|
|
1157
|
+
display: flex;
|
|
1158
|
+
grid-column: 4;
|
|
1159
|
+
grid-row: 1;
|
|
1160
|
+
inline-size: var(--_content-icon-size);
|
|
1161
|
+
justify-content: center;
|
|
1162
|
+
margin-inline-start: var(--_column-gap);
|
|
1163
|
+
opacity: 0;
|
|
1164
|
+
transition: opacity var(--slotted-duration-short) var(--slotted-easing-standard);
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1168
|
+
[data-part='item'][data-selected]
|
|
1169
|
+
> [data-part='indicator'] {
|
|
1170
|
+
opacity: 1;
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
/* A record with no short fact gives its column to the name. */
|
|
1174
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1175
|
+
[data-part='item']:not(:has(> [data-part='meta']))
|
|
1176
|
+
> [data-part='label'] {
|
|
1177
|
+
grid-column: 2 / 4;
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
/**
|
|
1181
|
+
* A record of one line is the face's height, and its name is centred in
|
|
1182
|
+
* it; the check and the short fact are centred with the name there, where
|
|
1183
|
+
* on a two-line record they stand on the name's line.
|
|
1184
|
+
*/
|
|
1185
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1186
|
+
[data-part='item']:not(:has(> [data-part='description']))
|
|
1187
|
+
> :is([data-part='indicator'], [data-part='meta']) {
|
|
1188
|
+
align-self: center;
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
/* ── The two offers: create, and search again ─────────────────────────── */
|
|
1192
|
+
|
|
1193
|
+
/**
|
|
1194
|
+
* An offer is an option (design §1.3), and it wears a glyph in the face's
|
|
1195
|
+
* column so its words start where every name starts: the plus to create,
|
|
1196
|
+
* the turning arrow to search again, each a `Glyph` the binding draws.
|
|
1197
|
+
*/
|
|
1198
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1199
|
+
[data-part='item']:is([data-create], [data-retry]) {
|
|
1200
|
+
color: var(--slotted-entity-picker-offer-color, var(--slotted-tone-accent-text));
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1204
|
+
[data-part='item']:is([data-create], [data-retry])
|
|
1205
|
+
> [data-part='media'] {
|
|
1206
|
+
--slotted-icon-size: var(--_content-icon-size);
|
|
1207
|
+
|
|
1208
|
+
align-items: center;
|
|
1209
|
+
/* A glyph beside words, so it stands on their first line (`indicator`). */
|
|
1210
|
+
align-self: start;
|
|
1211
|
+
block-size: calc(var(--_content-font-size) * var(--slotted-line-height-md, 1.5));
|
|
1212
|
+
grid-row: 1;
|
|
1213
|
+
/* The face's width, which an empty media box takes by itself. */
|
|
1214
|
+
inline-size: var(--_media-size);
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
/* ── Error, empty, status ─────────────────────────────────────────────── */
|
|
1218
|
+
|
|
1219
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1220
|
+
:is([data-part='empty'], [data-part='status'], [data-part='error']) {
|
|
1221
|
+
color: var(--_muted);
|
|
1222
|
+
grid-column: 1 / -1;
|
|
1223
|
+
min-inline-size: min(12rem, 100%);
|
|
1224
|
+
padding-block: var(--slotted-space-5, 0.75rem);
|
|
1225
|
+
padding-inline: var(--_item-inset);
|
|
1226
|
+
text-align: center;
|
|
1227
|
+
/* Its own bidi run (`combobox`'s "3 results" repair). */
|
|
1228
|
+
unicode-bidi: plaintext;
|
|
1229
|
+
}
|
|
1230
|
+
|
|
1231
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='status']:empty {
|
|
1232
|
+
display: none;
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
/**
|
|
1236
|
+
* The error names what failed in the text colour, with the alert mark — a
|
|
1237
|
+
* `Glyph` the binding draws before the words — beside it in the danger
|
|
1238
|
+
* tone, centred in the face's column; the offer to search again follows as an
|
|
1239
|
+
* option. It stands on the row's inset like every row, not centred like
|
|
1240
|
+
* the empty sentence: it is the first of two rows that belong together.
|
|
1241
|
+
*/
|
|
1242
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='error'] {
|
|
1243
|
+
align-items: center;
|
|
1244
|
+
color: var(--_text);
|
|
1245
|
+
display: flex;
|
|
1246
|
+
gap: var(--_column-gap);
|
|
1247
|
+
padding-block: var(--slotted-space-4, 0.5rem) var(--slotted-space-2, 0.25rem);
|
|
1248
|
+
text-align: start;
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='error'] > [data-ui='icon'] {
|
|
1252
|
+
--slotted-icon-size: var(--_content-icon-size);
|
|
1253
|
+
|
|
1254
|
+
color: var(--slotted-entity-picker-error-color, var(--slotted-tone-danger-text));
|
|
1255
|
+
margin-inline: calc((var(--_media-size) - var(--_content-icon-size)) / 2);
|
|
1256
|
+
}
|
|
1257
|
+
|
|
1258
|
+
/* ── The wait ─────────────────────────────────────────────────────────── */
|
|
1259
|
+
|
|
1260
|
+
/**
|
|
1261
|
+
* Three records in the anatomy of a record: a circle where the face goes,
|
|
1262
|
+
* a line where the name goes, a shorter one where the identifier goes
|
|
1263
|
+
* (`loading-states` §2). The rows are the rows the list will draw, at the
|
|
1264
|
+
* same inset, column gap and height, so the answer lands in the boxes that
|
|
1265
|
+
* waited for it. The lengths differ the way names do.
|
|
1266
|
+
*/
|
|
1267
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1268
|
+
:is([data-part='placeholder'], [data-part='more']) {
|
|
1269
|
+
display: grid;
|
|
1270
|
+
grid-column: 1 / -1;
|
|
1271
|
+
grid-template-columns: subgrid;
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1275
|
+
:is([data-part='placeholder'], [data-part='more'])
|
|
1276
|
+
> * {
|
|
1277
|
+
align-items: center;
|
|
1278
|
+
display: grid;
|
|
1279
|
+
grid-column: 1 / -1;
|
|
1280
|
+
grid-template-columns: subgrid;
|
|
1281
|
+
grid-template-rows: auto auto;
|
|
1282
|
+
line-height: var(--slotted-line-height-md, 1.5);
|
|
1283
|
+
min-block-size: var(--_item-height);
|
|
1284
|
+
padding-block: var(--slotted-space-2, 0.25rem);
|
|
1285
|
+
padding-inline: var(--_item-inset);
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1288
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1289
|
+
:is([data-part='placeholder'], [data-part='more'])
|
|
1290
|
+
> *
|
|
1291
|
+
> :first-child {
|
|
1292
|
+
--slotted-skeleton-size: var(--_media-size);
|
|
1293
|
+
|
|
1294
|
+
grid-column: 1;
|
|
1295
|
+
grid-row: 1 / -1;
|
|
1296
|
+
margin-inline-end: var(--_column-gap);
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
/* Each line stands in the line box of the text it holds the place of. */
|
|
1300
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1301
|
+
:is([data-part='placeholder'], [data-part='more'])
|
|
1302
|
+
> *
|
|
1303
|
+
> :nth-child(2) {
|
|
1304
|
+
--slotted-skeleton-inline-size: 62%;
|
|
1305
|
+
|
|
1306
|
+
grid-column: 2;
|
|
1307
|
+
grid-row: 1;
|
|
1308
|
+
margin-block: calc((1lh - 1cap) / 2);
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1312
|
+
:is([data-part='placeholder'], [data-part='more'])
|
|
1313
|
+
> *
|
|
1314
|
+
> :nth-child(3) {
|
|
1315
|
+
--slotted-skeleton-inline-size: 44%;
|
|
1316
|
+
|
|
1317
|
+
font-size: var(--_secondary-font-size);
|
|
1318
|
+
grid-column: 2;
|
|
1319
|
+
grid-row: 2;
|
|
1320
|
+
line-height: var(--slotted-line-height-sm, 1.45);
|
|
1321
|
+
margin-block: calc((1lh - 1cap) / 2);
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1325
|
+
[data-part='placeholder']
|
|
1326
|
+
> :nth-child(2)
|
|
1327
|
+
> :nth-child(2) {
|
|
1328
|
+
--slotted-skeleton-inline-size: 48%;
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1332
|
+
[data-part='placeholder']
|
|
1333
|
+
> :nth-child(2)
|
|
1334
|
+
> :nth-child(3) {
|
|
1335
|
+
--slotted-skeleton-inline-size: 58%;
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1339
|
+
[data-part='placeholder']
|
|
1340
|
+
> :nth-child(3)
|
|
1341
|
+
> :nth-child(2) {
|
|
1342
|
+
--slotted-skeleton-inline-size: 70%;
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1346
|
+
[data-part='placeholder']
|
|
1347
|
+
> :nth-child(3)
|
|
1348
|
+
> :nth-child(3) {
|
|
1349
|
+
--slotted-skeleton-inline-size: 36%;
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
/* ── Forced colours ───────────────────────────────────────────────────── */
|
|
1353
|
+
|
|
1354
|
+
@media (forced-colors: active) {
|
|
1355
|
+
[data-ui='entity-picker'][data-part='positioner'] [data-part='item'][data-current] {
|
|
1356
|
+
background-color: Highlight;
|
|
1357
|
+
color: HighlightText;
|
|
1358
|
+
forced-color-adjust: none;
|
|
1359
|
+
}
|
|
1360
|
+
|
|
1361
|
+
[data-ui='entity-picker'][data-part='positioner']
|
|
1362
|
+
[data-part='item'][data-disabled][data-current] {
|
|
1363
|
+
background-color: Highlight;
|
|
1364
|
+
color: GrayText;
|
|
1365
|
+
}
|
|
1366
|
+
}
|
|
1367
|
+
}
|