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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -2
  3. package/package.json +276 -3
  4. package/src/accordion/accordion.css +96 -0
  5. package/src/accordion/accordion.tokens.json +14 -0
  6. package/src/action-bar/action-bar.css +455 -0
  7. package/src/action-bar/action-bar.tokens.json +50 -0
  8. package/src/action-sheet/action-sheet.css +462 -0
  9. package/src/action-sheet/action-sheet.tokens.json +59 -0
  10. package/src/alert/alert.css +764 -0
  11. package/src/alert/alert.tokens.json +77 -0
  12. package/src/app-shell/app-shell.css +1899 -0
  13. package/src/app-shell/app-shell.tokens.json +88 -0
  14. package/src/aspect-ratio/aspect-ratio.css +131 -0
  15. package/src/aspect-ratio/aspect-ratio.tokens.json +1 -0
  16. package/src/attachment/attachment.css +906 -0
  17. package/src/attachment/attachment.tokens.json +85 -0
  18. package/src/avatar/avatar.css +598 -0
  19. package/src/avatar/avatar.tokens.json +64 -0
  20. package/src/avatar-group/avatar-group.css +268 -0
  21. package/src/avatar-group/avatar-group.tokens.json +16 -0
  22. package/src/badge/badge.css +462 -0
  23. package/src/badge/badge.tokens.json +58 -0
  24. package/src/breadcrumb/breadcrumb.css +441 -0
  25. package/src/breadcrumb/breadcrumb.tokens.json +50 -0
  26. package/src/button/button.css +754 -0
  27. package/src/button/button.tokens.json +72 -0
  28. package/src/button-group/button-group.css +455 -0
  29. package/src/button-group/button-group.tokens.json +11 -0
  30. package/src/calendar/calendar.css +846 -0
  31. package/src/calendar/calendar.tokens.json +67 -0
  32. package/src/card/card.css +602 -0
  33. package/src/card/card.tokens.json +68 -0
  34. package/src/carousel/carousel.css +860 -0
  35. package/src/carousel/carousel.tokens.json +62 -0
  36. package/src/cascader/cascader.css +1320 -0
  37. package/src/cascader/cascader.tokens.json +103 -0
  38. package/src/chart/chart.css +1473 -0
  39. package/src/chart/chart.tokens.json +107 -0
  40. package/src/checkbox/checkbox.css +1011 -0
  41. package/src/checkbox/checkbox.tokens.json +102 -0
  42. package/src/checkbox-group/checkbox-group.css +70 -0
  43. package/src/checkbox-group/checkbox-group.tokens.json +6 -0
  44. package/src/code-block/code-block.css +555 -0
  45. package/src/code-block/code-block.tokens.json +69 -0
  46. package/src/collapsible/collapsible.css +546 -0
  47. package/src/collapsible/collapsible.tokens.json +55 -0
  48. package/src/color-picker/color-picker.css +607 -0
  49. package/src/color-picker/color-picker.tokens.json +58 -0
  50. package/src/column-manager/column-manager.css +452 -0
  51. package/src/column-manager/column-manager.tokens.json +43 -0
  52. package/src/combobox/combobox.css +1048 -0
  53. package/src/combobox/combobox.tokens.json +112 -0
  54. package/src/command-palette/command-palette.css +1000 -0
  55. package/src/command-palette/command-palette.tokens.json +75 -0
  56. package/src/container/container.css +198 -0
  57. package/src/container/container.tokens.json +18 -0
  58. package/src/context-menu/context-menu.css +104 -0
  59. package/src/context-menu/context-menu.tokens.json +11 -0
  60. package/src/currency-field/currency-field.css +787 -0
  61. package/src/currency-field/currency-field.tokens.json +80 -0
  62. package/src/dashboard-grid/dashboard-grid.css +748 -0
  63. package/src/dashboard-grid/dashboard-grid.tokens.json +67 -0
  64. package/src/data-grid/data-grid.css +2484 -0
  65. package/src/data-grid/data-grid.tokens.json +100 -0
  66. package/src/data-list/data-list.css +455 -0
  67. package/src/data-list/data-list.tokens.json +35 -0
  68. package/src/date-field/date-field.css +560 -0
  69. package/src/date-field/date-field.tokens.json +80 -0
  70. package/src/date-picker/date-picker.css +420 -0
  71. package/src/date-picker/date-picker.tokens.json +49 -0
  72. package/src/date-range-picker/date-range-picker.css +983 -0
  73. package/src/date-range-picker/date-range-picker.tokens.json +109 -0
  74. package/src/datetime-field/datetime-field.css +850 -0
  75. package/src/datetime-field/datetime-field.tokens.json +91 -0
  76. package/src/datetime-picker/datetime-picker.css +843 -0
  77. package/src/datetime-picker/datetime-picker.tokens.json +78 -0
  78. package/src/datetime-range-picker/datetime-range-picker.css +1375 -0
  79. package/src/datetime-range-picker/datetime-range-picker.tokens.json +135 -0
  80. package/src/description-list/description-list.css +675 -0
  81. package/src/description-list/description-list.tokens.json +66 -0
  82. package/src/detail-panel/detail-panel.css +329 -0
  83. package/src/detail-panel/detail-panel.tokens.json +33 -0
  84. package/src/dialog/dialog.css +968 -0
  85. package/src/dialog/dialog.tokens.json +66 -0
  86. package/src/divider/divider.css +131 -0
  87. package/src/divider/divider.tokens.json +18 -0
  88. package/src/drawer/drawer.css +1303 -0
  89. package/src/drawer/drawer.tokens.json +75 -0
  90. package/src/entity-picker/entity-picker.css +1367 -0
  91. package/src/entity-picker/entity-picker.tokens.json +118 -0
  92. package/src/event-calendar/event-calendar.css +2148 -0
  93. package/src/event-calendar/event-calendar.tokens.json +87 -0
  94. package/src/field/field.css +707 -0
  95. package/src/field/field.tokens.json +58 -0
  96. package/src/field-group/field-group.css +226 -0
  97. package/src/field-group/field-group.tokens.json +33 -0
  98. package/src/filter-bar/filter-bar.css +1306 -0
  99. package/src/filter-bar/filter-bar.tokens.json +78 -0
  100. package/src/form/form.css +218 -0
  101. package/src/form/form.tokens.json +32 -0
  102. package/src/fullscreen/fullscreen.css +376 -0
  103. package/src/fullscreen/fullscreen.tokens.json +50 -0
  104. package/src/grid/grid.css +173 -0
  105. package/src/grid/grid.tokens.json +20 -0
  106. package/src/highlight/highlight.css +135 -0
  107. package/src/highlight/highlight.tokens.json +16 -0
  108. package/src/hover-card/hover-card.css +93 -0
  109. package/src/hover-card/hover-card.tokens.json +17 -0
  110. package/src/icon/icon.css +136 -0
  111. package/src/icon/icon.tokens.json +14 -0
  112. package/src/image/image.css +449 -0
  113. package/src/image/image.tokens.json +27 -0
  114. package/src/import-export-center/import-export-center.css +1175 -0
  115. package/src/import-export-center/import-export-center.tokens.json +84 -0
  116. package/src/inline/inline.css +149 -0
  117. package/src/inline/inline.tokens.json +14 -0
  118. package/src/inline-message/inline-message.css +396 -0
  119. package/src/inline-message/inline-message.tokens.json +19 -0
  120. package/src/kbd/kbd.css +490 -0
  121. package/src/kbd/kbd.tokens.json +40 -0
  122. package/src/link/link.css +237 -0
  123. package/src/link/link.tokens.json +25 -0
  124. package/src/list/list.css +240 -0
  125. package/src/list/list.tokens.json +42 -0
  126. package/src/list-item/list-item.css +937 -0
  127. package/src/list-item/list-item.tokens.json +114 -0
  128. package/src/listbox/listbox.css +674 -0
  129. package/src/listbox/listbox.tokens.json +72 -0
  130. package/src/loading-overlay/loading-overlay.css +730 -0
  131. package/src/loading-overlay/loading-overlay.tokens.json +48 -0
  132. package/src/markdown/markdown.css +168 -0
  133. package/src/markdown/markdown.tokens.json +18 -0
  134. package/src/menu/menu.css +817 -0
  135. package/src/menu/menu.tokens.json +78 -0
  136. package/src/menubar/menubar.css +170 -0
  137. package/src/menubar/menubar.tokens.json +32 -0
  138. package/src/message/message.css +1453 -0
  139. package/src/message/message.tokens.json +85 -0
  140. package/src/message-scroller/message-scroller.css +371 -0
  141. package/src/message-scroller/message-scroller.tokens.json +47 -0
  142. package/src/multi-select/multi-select.css +1427 -0
  143. package/src/multi-select/multi-select.tokens.json +114 -0
  144. package/src/navigation-menu/navigation-menu.css +1029 -0
  145. package/src/navigation-menu/navigation-menu.tokens.json +70 -0
  146. package/src/notification-center/notification-center.css +856 -0
  147. package/src/notification-center/notification-center.tokens.json +84 -0
  148. package/src/number-field/number-field.css +794 -0
  149. package/src/number-field/number-field.tokens.json +80 -0
  150. package/src/otp-input/otp-input.css +525 -0
  151. package/src/otp-input/otp-input.tokens.json +69 -0
  152. package/src/page/page.css +179 -0
  153. package/src/page/page.tokens.json +20 -0
  154. package/src/page-header/page-header.css +1181 -0
  155. package/src/page-header/page-header.tokens.json +71 -0
  156. package/src/pagination/pagination.css +500 -0
  157. package/src/pagination/pagination.tokens.json +56 -0
  158. package/src/popover/popover.css +526 -0
  159. package/src/popover/popover.tokens.json +60 -0
  160. package/src/progress-indicator/progress-indicator.css +1584 -0
  161. package/src/progress-indicator/progress-indicator.tokens.json +50 -0
  162. package/src/prompt-composer/prompt-composer.css +680 -0
  163. package/src/prompt-composer/prompt-composer.tokens.json +99 -0
  164. package/src/prose/prose.css +733 -0
  165. package/src/prose/prose.tokens.json +79 -0
  166. package/src/radio-group/radio-group.css +778 -0
  167. package/src/radio-group/radio-group.tokens.json +103 -0
  168. package/src/rating/rating.css +1071 -0
  169. package/src/rating/rating.tokens.json +88 -0
  170. package/src/result-state/result-state.css +980 -0
  171. package/src/result-state/result-state.tokens.json +63 -0
  172. package/src/runtime-properties.mjs +321 -0
  173. package/src/saved-views/saved-views.css +394 -0
  174. package/src/saved-views/saved-views.tokens.json +41 -0
  175. package/src/scroll-area/scroll-area.css +481 -0
  176. package/src/scroll-area/scroll-area.tokens.json +15 -0
  177. package/src/section/section.css +177 -0
  178. package/src/section/section.tokens.json +39 -0
  179. package/src/segmented-control/segmented-control.css +564 -0
  180. package/src/segmented-control/segmented-control.tokens.json +67 -0
  181. package/src/select/select.css +1593 -0
  182. package/src/select/select.tokens.json +110 -0
  183. package/src/side-navigation/side-navigation.css +1096 -0
  184. package/src/side-navigation/side-navigation.tokens.json +87 -0
  185. package/src/skeleton/skeleton.css +431 -0
  186. package/src/skeleton/skeleton.tokens.json +29 -0
  187. package/src/slider/slider.css +792 -0
  188. package/src/slider/slider.tokens.json +75 -0
  189. package/src/sparkline/sparkline.css +282 -0
  190. package/src/sparkline/sparkline.tokens.json +45 -0
  191. package/src/spinner/spinner.css +224 -0
  192. package/src/spinner/spinner.tokens.json +8 -0
  193. package/src/split-button/split-button.css +253 -0
  194. package/src/split-button/split-button.tokens.json +12 -0
  195. package/src/splitter/splitter.css +336 -0
  196. package/src/splitter/splitter.tokens.json +24 -0
  197. package/src/stack/stack.css +128 -0
  198. package/src/stack/stack.tokens.json +14 -0
  199. package/src/stat-card/stat-card.css +641 -0
  200. package/src/stat-card/stat-card.tokens.json +95 -0
  201. package/src/status-indicator/status-indicator.css +481 -0
  202. package/src/status-indicator/status-indicator.tokens.json +38 -0
  203. package/src/stepper/stepper.css +629 -0
  204. package/src/stepper/stepper.tokens.json +72 -0
  205. package/src/switch/switch.css +703 -0
  206. package/src/switch/switch.tokens.json +75 -0
  207. package/src/table/table.css +1482 -0
  208. package/src/table/table.tokens.json +69 -0
  209. package/src/table-of-contents/table-of-contents.css +533 -0
  210. package/src/table-of-contents/table-of-contents.tokens.json +53 -0
  211. package/src/tabs/tabs.css +998 -0
  212. package/src/tabs/tabs.tokens.json +82 -0
  213. package/src/tag/tag.css +768 -0
  214. package/src/tag/tag.tokens.json +85 -0
  215. package/src/tags-input/tags-input.css +757 -0
  216. package/src/tags-input/tags-input.tokens.json +84 -0
  217. package/src/text-field/text-field.css +900 -0
  218. package/src/text-field/text-field.tokens.json +87 -0
  219. package/src/textarea/textarea.css +365 -0
  220. package/src/textarea/textarea.tokens.json +59 -0
  221. package/src/time-field/time-field.css +719 -0
  222. package/src/time-field/time-field.tokens.json +86 -0
  223. package/src/time-picker/time-picker.css +665 -0
  224. package/src/time-picker/time-picker.tokens.json +66 -0
  225. package/src/time-range-picker/time-range-picker.css +1287 -0
  226. package/src/time-range-picker/time-range-picker.tokens.json +134 -0
  227. package/src/timeline/timeline.css +1596 -0
  228. package/src/timeline/timeline.tokens.json +96 -0
  229. package/src/toast/toast.css +943 -0
  230. package/src/toast/toast.tokens.json +90 -0
  231. package/src/toggle/toggle.css +290 -0
  232. package/src/toggle/toggle.tokens.json +54 -0
  233. package/src/toggle-group/toggle-group.css +463 -0
  234. package/src/toggle-group/toggle-group.tokens.json +54 -0
  235. package/src/toolbar/toolbar.css +434 -0
  236. package/src/toolbar/toolbar.tokens.json +49 -0
  237. package/src/tooltip/tooltip.css +368 -0
  238. package/src/tooltip/tooltip.tokens.json +39 -0
  239. package/src/top-navigation/top-navigation.css +1287 -0
  240. package/src/top-navigation/top-navigation.tokens.json +91 -0
  241. package/src/tour/tour.css +680 -0
  242. package/src/tour/tour.tokens.json +67 -0
  243. package/src/transfer/transfer.css +571 -0
  244. package/src/transfer/transfer.tokens.json +49 -0
  245. package/src/tree/tree.css +1000 -0
  246. package/src/tree/tree.tokens.json +80 -0
  247. package/src/typography/typography.css +211 -0
  248. package/src/typography/typography.tokens.json +31 -0
  249. package/src/upload/upload.css +1706 -0
  250. package/src/upload/upload.tokens.json +123 -0
  251. package/src/visually-hidden/visually-hidden.css +52 -0
  252. package/src/visually-hidden/visually-hidden.tokens.json +1 -0
  253. package/src/wizard/wizard.css +740 -0
  254. package/src/wizard/wizard.tokens.json +63 -0
@@ -0,0 +1,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
+ }