@zeyos/zx 5.0.0 → 5.2.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 (154) hide show
  1. package/CHANGELOG.md +164 -0
  2. package/README.md +2 -1
  3. package/dist/types/components/account-menu/account-menu.d.ts +8 -0
  4. package/dist/types/components/activity-list/activity-list.d.ts +9 -1
  5. package/dist/types/components/app-icon/app-icon.d.ts +14 -2
  6. package/dist/types/components/app-sidebar/app-sidebar.d.ts +288 -14
  7. package/dist/types/components/calendar/calendar.d.ts +67 -5
  8. package/dist/types/components/card-view/card-view.d.ts +7 -4
  9. package/dist/types/components/card-view/record-card.d.ts +11 -0
  10. package/dist/types/components/context-menu/context-menu.d.ts +6 -2
  11. package/dist/types/components/data-filter/data-filter.d.ts +4 -4
  12. package/dist/types/components/dropdown/dropdown.d.ts +22 -7
  13. package/dist/types/components/field/field.d.ts +30 -0
  14. package/dist/types/components/fieldset/external-adapter.d.ts +83 -0
  15. package/dist/types/components/fieldset/fieldset.d.ts +7 -0
  16. package/dist/types/components/file-list/file-list.d.ts +35 -3
  17. package/dist/types/components/filter/filter.d.ts +127 -3
  18. package/dist/types/components/filter-panel/filter-panel.d.ts +36 -7
  19. package/dist/types/components/launcher/launcher.d.ts +8 -0
  20. package/dist/types/components/list-toolbar/list-toolbar.d.ts +15 -6
  21. package/dist/types/components/menu-button/menu-button.d.ts +6 -0
  22. package/dist/types/components/message/message.d.ts +14 -1
  23. package/dist/types/components/modal/modal.d.ts +30 -0
  24. package/dist/types/components/module-bar/module-bar.d.ts +395 -0
  25. package/dist/types/components/pagination/pagination.d.ts +17 -3
  26. package/dist/types/components/select/select.d.ts +6 -0
  27. package/dist/types/components/sheet/sheet.d.ts +15 -0
  28. package/dist/types/components/table/table.d.ts +265 -17
  29. package/dist/types/components/view/record-view.d.ts +59 -2
  30. package/dist/types/components/view-settings/view-settings.d.ts +879 -0
  31. package/dist/types/components/workspace-switcher/workspace-switcher.d.ts +327 -0
  32. package/dist/types/core/component.d.ts +12 -2
  33. package/dist/types/core/i18n.d.ts +27 -3
  34. package/dist/types/core/keyboard.d.ts +98 -1
  35. package/dist/types/core/messages.d.ts +382 -0
  36. package/dist/types/core/overlay-host.d.ts +28 -1
  37. package/dist/types/core/overlay-stack.d.ts +260 -0
  38. package/dist/types/index.d.ts +5 -2
  39. package/dist/types/internal/app-rail.d.ts +38 -0
  40. package/dist/types/internal/menu-items.d.ts +71 -3
  41. package/dist/types/zeyos/index.d.ts +1 -0
  42. package/dist/types/zeyos/launcher.d.ts +9 -0
  43. package/dist/types/zeyos/module-bar.d.ts +176 -0
  44. package/dist/types/zeyos/query.d.ts +31 -5
  45. package/dist/types/zeyos/table.d.ts +245 -8
  46. package/dist/types/zeyos/view.d.ts +16 -2
  47. package/dist/zx-zeyos.esm.js +4422 -430
  48. package/dist/zx-zeyos.esm.min.js +5 -5
  49. package/dist/zx.css +1417 -134
  50. package/dist/zx.esm.js +6986 -830
  51. package/dist/zx.esm.min.js +8 -8
  52. package/dist/zx.global.js +6986 -830
  53. package/dist/zx.global.min.js +8 -8
  54. package/dist/zx.min.css +1 -1
  55. package/docs/api.json +794 -17
  56. package/docs/llms.md +503 -63
  57. package/docs/llms.txt +6 -2
  58. package/package.json +1 -1
  59. package/src/components/account-menu/account-menu.js +12 -0
  60. package/src/components/activity-list/activity-list.js +27 -1
  61. package/src/components/app-icon/app-icon.css +13 -2
  62. package/src/components/app-icon/app-icon.js +11 -1
  63. package/src/components/app-rail/app-rail.css +19 -0
  64. package/src/components/app-sidebar/app-sidebar.css +204 -3
  65. package/src/components/app-sidebar/app-sidebar.js +646 -40
  66. package/src/components/breadcrumb/breadcrumb.css +1 -1
  67. package/src/components/calendar/calendar.css +1 -1
  68. package/src/components/calendar/calendar.js +26 -52
  69. package/src/components/card/card.css +2 -2
  70. package/src/components/card-view/card-view.css +5 -5
  71. package/src/components/card-view/card-view.js +13 -9
  72. package/src/components/card-view/record-card.js +14 -3
  73. package/src/components/code-editor/code-editor.css +1 -1
  74. package/src/components/code-editor/field-adapter.js +9 -2
  75. package/src/components/context-menu/context-menu.js +8 -2
  76. package/src/components/copy/copy-input.css +1 -1
  77. package/src/components/data-filter/data-filter.js +2 -2
  78. package/src/components/date-picker/time-picker.css +2 -2
  79. package/src/components/dock/dock.css +5 -4
  80. package/src/components/dropdown/dropdown.js +157 -72
  81. package/src/components/field/field.js +33 -3
  82. package/src/components/fieldset/external-adapter.js +363 -0
  83. package/src/components/fieldset/fieldset.js +10 -59
  84. package/src/components/file-list/file-list.js +144 -21
  85. package/src/components/filter/filter.css +86 -2
  86. package/src/components/filter/filter.js +300 -8
  87. package/src/components/filter-panel/filter-panel.js +149 -32
  88. package/src/components/finder/finder.css +1 -1
  89. package/src/components/kanban-view/kanban-view.css +3 -3
  90. package/src/components/kanban-view/kanban-view.js +5 -2
  91. package/src/components/launcher/launcher.css +1 -1
  92. package/src/components/launcher/launcher.js +29 -3
  93. package/src/components/list-toolbar/list-toolbar.js +39 -13
  94. package/src/components/master-panel/master-panel.js +0 -1
  95. package/src/components/menu-button/menu-button.css +63 -0
  96. package/src/components/menu-button/menu-button.js +97 -11
  97. package/src/components/message/message.js +60 -20
  98. package/src/components/modal/modal.css +1 -1
  99. package/src/components/modal/modal.js +66 -13
  100. package/src/components/module-bar/module-bar.css +486 -0
  101. package/src/components/module-bar/module-bar.js +1074 -0
  102. package/src/components/multi-value-editor/multi-value-editor.css +1 -1
  103. package/src/components/number-field/field-adapter.js +2 -1
  104. package/src/components/pagination/pagination.css +5 -5
  105. package/src/components/pagination/pagination.js +20 -4
  106. package/src/components/panel/panel.css +3 -2
  107. package/src/components/questionnaire/questionnaire.css +4 -4
  108. package/src/components/rating/field-adapter.js +2 -1
  109. package/src/components/rating/rating.css +1 -1
  110. package/src/components/search/search.css +4 -1
  111. package/src/components/select/select.js +9 -0
  112. package/src/components/sheet/sheet.css +1 -1
  113. package/src/components/sheet/sheet.js +74 -32
  114. package/src/components/slider/field-adapter.js +6 -1
  115. package/src/components/slider/slider.css +2 -2
  116. package/src/components/split-view/split-view.css +1 -1
  117. package/src/components/stat-tile/stat-tile.css +1 -1
  118. package/src/components/stepper/stepper.css +1 -1
  119. package/src/components/tabbox/tabbox.css +9 -5
  120. package/src/components/table/table.css +86 -11
  121. package/src/components/table/table.js +628 -57
  122. package/src/components/tag-picker/field-adapter.js +2 -1
  123. package/src/components/tooltip/tooltip.js +35 -17
  124. package/src/components/tree/tree.css +1 -1
  125. package/src/components/view/record-view.css +1 -1
  126. package/src/components/view/record-view.js +178 -18
  127. package/src/components/view-settings/view-settings.css +285 -0
  128. package/src/components/view-settings/view-settings.js +1830 -0
  129. package/src/components/workspace-switcher/workspace-switcher.css +188 -0
  130. package/src/components/workspace-switcher/workspace-switcher.js +463 -0
  131. package/src/core/component.js +88 -17
  132. package/src/core/fontawesome.js +5 -1
  133. package/src/core/i18n.js +47 -4
  134. package/src/core/icons.js +12 -2
  135. package/src/core/keyboard.js +206 -11
  136. package/src/core/messages.js +427 -0
  137. package/src/core/overlay-host.js +64 -9
  138. package/src/core/overlay-stack.js +487 -0
  139. package/src/core/position.js +22 -3
  140. package/src/index.js +5 -2
  141. package/src/internal/app-rail.js +134 -53
  142. package/src/internal/menu-items.js +61 -3
  143. package/src/zeyos/form.js +5 -3
  144. package/src/zeyos/index.js +3 -0
  145. package/src/zeyos/launcher.js +8 -3
  146. package/src/zeyos/module-bar.js +181 -0
  147. package/src/zeyos/query.js +44 -13
  148. package/src/zeyos/table.js +220 -80
  149. package/src/zeyos/view.js +43 -93
  150. package/styles/base.css +16 -1
  151. package/styles/print.css +1 -1
  152. package/styles/tokens/dark.css +4 -0
  153. package/styles/tokens/semantic.css +56 -28
  154. package/styles/zx.css +3 -0
@@ -0,0 +1,486 @@
1
+ /*
2
+ * ModuleBar — the module level of an application, one tile per module.
3
+ *
4
+ * The bar is a target per module, and inside each target a tile carrying the module's identity:
5
+ *
6
+ * - **The size follows the control height.** A target is one control plus a space-2 margin, and a
7
+ * tile one control less a space-1 inset, so a theme that changes `--zx-control-height` resizes
8
+ * the bar with every other control instead of leaving a fixed strip beside it.
9
+ * - **Identity is the tile; where you are is the target.** The tile keeps its colour in every
10
+ * state. The current module puts the neutral current fill behind it, the same fill a current row
11
+ * takes in the navigation, never a coloured ring or an edge bar.
12
+ * - **Colour arrives as data.** A tone resolves through the theme's categorical palette; a host
13
+ * colour arrives as `--zx-module-bar-color` on the tile, and the stylesheet only mixes it. The
14
+ * appearance is an attribute of the tile, not of the bar, because the "All modules" catalogue
15
+ * is portaled out of the bar and draws the same tiles.
16
+ */
17
+
18
+ .zx-module-bar {
19
+ --zx-module-bar-target: calc(var(--zx-control-height) + var(--zx-space-2));
20
+ --zx-module-bar-tile: calc(var(--zx-control-height) - var(--zx-space-1));
21
+ --zx-module-bar-gap: var(--zx-space-1);
22
+ --zx-module-bar-pad: var(--zx-space-2);
23
+ --zx-module-bar-radius: var(--zx-radius-lg);
24
+ /* The bar with names beside its tiles: wide enough for "Knowledge base" and a count. */
25
+ --zx-module-bar-column: 12rem;
26
+ display: flex;
27
+ box-sizing: border-box;
28
+ min-inline-size: 0;
29
+ min-block-size: 0;
30
+ background: var(--zx-color-bg-chrome);
31
+ color: var(--zx-color-text);
32
+ }
33
+
34
+ .zx-module-bar[data-orientation="vertical"] {
35
+ flex-direction: column;
36
+ inline-size: calc(var(--zx-module-bar-target) + 2 * var(--zx-module-bar-pad));
37
+ block-size: 100%;
38
+ }
39
+
40
+ /* Names beside the tiles make the bar a navigation column of its own: a row per module, the count
41
+ at the end of the row, as wide as a sidebar needs for a two-word module name. */
42
+ .zx-module-bar[data-orientation="vertical"][data-labels="beside"] {
43
+ inline-size: var(--zx-module-bar-column);
44
+ }
45
+
46
+ .zx-module-bar[data-orientation="vertical"][data-labels="beside"] > .zx-module-bar__list { align-items: stretch; }
47
+ .zx-module-bar[data-orientation="vertical"][data-labels="beside"] > .zx-module-bar__header { align-items: stretch; }
48
+ .zx-module-bar[data-orientation="vertical"][data-labels="beside"] > .zx-module-bar__footer { align-items: stretch; }
49
+
50
+ .zx-module-bar[data-labels="beside"] .zx-module-bar__item {
51
+ grid-template-columns: var(--zx-module-bar-tile) minmax(0, 1fr) auto;
52
+ place-content: normal;
53
+ align-items: center;
54
+ justify-items: start;
55
+ column-gap: var(--zx-space-2);
56
+ inline-size: 100%;
57
+ block-size: auto;
58
+ min-block-size: var(--zx-module-bar-target);
59
+ padding: var(--zx-space-1) var(--zx-space-2);
60
+ color: var(--zx-color-text);
61
+ font-size: var(--zx-text-md);
62
+ font-weight: 500;
63
+ line-height: 1.3;
64
+ text-align: start;
65
+ }
66
+
67
+ .zx-module-bar[data-labels="beside"] .zx-module-bar__label { text-align: start; }
68
+
69
+ .zx-module-bar[data-labels="beside"] .zx-module-bar__badge {
70
+ position: static;
71
+ justify-self: end;
72
+ box-shadow: none;
73
+ }
74
+
75
+ /* Printed names need a wider target: two short lines of extra-small text under the tile. */
76
+ .zx-module-bar[data-orientation="vertical"][data-labels="below"] {
77
+ --zx-module-bar-target: calc(var(--zx-control-height) + var(--zx-space-8));
78
+ }
79
+
80
+ .zx-module-bar[data-orientation="horizontal"] {
81
+ flex-direction: row;
82
+ align-items: center;
83
+ inline-size: 100%;
84
+ block-size: calc(var(--zx-module-bar-target) + 2 * var(--zx-space-1));
85
+ }
86
+
87
+ /* A coarse pointer keeps a 40px target whatever the theme's control height says. */
88
+ @media (pointer: coarse) {
89
+ .zx-module-bar { --zx-module-bar-target: max(40px, calc(var(--zx-control-height) + var(--zx-space-2))); }
90
+ }
91
+
92
+ .zx-module-bar__header,
93
+ .zx-module-bar__footer {
94
+ display: flex;
95
+ flex: none;
96
+ align-items: center;
97
+ justify-content: center;
98
+ gap: var(--zx-module-bar-gap);
99
+ padding: var(--zx-module-bar-pad);
100
+ }
101
+
102
+ .zx-module-bar[data-orientation="vertical"] > .zx-module-bar__header,
103
+ .zx-module-bar[data-orientation="vertical"] > .zx-module-bar__footer { flex-direction: column; }
104
+ .zx-module-bar[data-orientation="horizontal"] > .zx-module-bar__header,
105
+ .zx-module-bar[data-orientation="horizontal"] > .zx-module-bar__footer { padding-block: 0; }
106
+ .zx-module-bar__header[hidden],
107
+ .zx-module-bar__footer[hidden] { display: none; }
108
+
109
+ /* The list takes the space between header and footer and never asks for more: what does not fit
110
+ moves behind "All modules". Its padding is not decoration — the focus ring is a 3px glow and a
111
+ tighter box would clip it off the first and last tile. */
112
+ .zx-module-bar__list {
113
+ display: flex;
114
+ flex: 1;
115
+ gap: var(--zx-module-bar-gap);
116
+ min-inline-size: 0;
117
+ min-block-size: 0;
118
+ margin: 0;
119
+ padding: var(--zx-space-1);
120
+ overflow: hidden;
121
+ list-style: none;
122
+ }
123
+
124
+ .zx-module-bar[data-orientation="vertical"] > .zx-module-bar__list { flex-direction: column; align-items: center; }
125
+ .zx-module-bar[data-orientation="horizontal"] > .zx-module-bar__list { flex-direction: row; align-items: center; }
126
+ .zx-module-bar[data-all-modules="never"] > .zx-module-bar__list { overflow: auto; scrollbar-width: none; }
127
+
128
+ .zx-module-bar__row { display: flex; flex: none; }
129
+ .zx-module-bar__row[hidden],
130
+ .zx-module-bar__heading[hidden] { display: none; }
131
+
132
+ /*
133
+ * A section of modules. With names printed it is a quiet caption over its modules, like the
134
+ * section headings of a menu; on an icon strip or bar it is a short rule between the groups, its
135
+ * caption kept for screen readers, and left out above the very first module.
136
+ */
137
+ .zx-module-bar__heading {
138
+ position: relative;
139
+ flex: none;
140
+ align-self: center;
141
+ background: var(--zx-color-border-subtle);
142
+ }
143
+
144
+ .zx-module-bar[data-orientation="vertical"] .zx-module-bar__heading { inline-size: var(--zx-space-4); block-size: 1px; margin-block: var(--zx-space-1); }
145
+ .zx-module-bar[data-orientation="horizontal"] .zx-module-bar__heading { inline-size: 1px; block-size: var(--zx-space-4); margin-inline: var(--zx-space-1); }
146
+ .zx-module-bar:not([data-labels="beside"]) .zx-module-bar__heading[data-leading] { display: none; }
147
+
148
+ .zx-module-bar__heading-label {
149
+ position: absolute;
150
+ inline-size: 1px;
151
+ block-size: 1px;
152
+ overflow: hidden;
153
+ clip-path: inset(50%);
154
+ white-space: nowrap;
155
+ }
156
+
157
+ .zx-module-bar[data-orientation="vertical"][data-labels="beside"] .zx-module-bar__heading {
158
+ align-self: stretch;
159
+ inline-size: auto;
160
+ block-size: auto;
161
+ margin-block: var(--zx-space-2) 0;
162
+ padding: var(--zx-space-1) var(--zx-space-2);
163
+ background: none;
164
+ }
165
+
166
+ .zx-module-bar[data-orientation="vertical"][data-labels="beside"] .zx-module-bar__heading[data-leading] { margin-block-start: 0; }
167
+
168
+ .zx-module-bar[data-labels="beside"] .zx-module-bar__heading-label {
169
+ position: static;
170
+ inline-size: auto;
171
+ block-size: auto;
172
+ overflow: visible;
173
+ clip-path: none;
174
+ color: var(--zx-color-text-muted);
175
+ font-size: var(--zx-text-xs);
176
+ font-weight: var(--zx-weight-semibold);
177
+ line-height: 1.3;
178
+ white-space: normal;
179
+ }
180
+
181
+ .zx-module-bar__item {
182
+ position: relative;
183
+ display: grid;
184
+ place-content: center;
185
+ justify-items: center;
186
+ box-sizing: border-box;
187
+ inline-size: var(--zx-module-bar-target);
188
+ block-size: var(--zx-module-bar-target);
189
+ border: 0;
190
+ border-radius: var(--zx-module-bar-radius);
191
+ background: transparent;
192
+ padding: 0;
193
+ color: var(--zx-color-text-muted);
194
+ font: inherit;
195
+ text-decoration: none;
196
+ cursor: pointer;
197
+ }
198
+
199
+ .zx-module-bar[data-labels="below"] .zx-module-bar__item {
200
+ align-content: start;
201
+ gap: var(--zx-space-1);
202
+ block-size: auto;
203
+ min-block-size: calc(var(--zx-module-bar-tile) + 2lh + var(--zx-space-3));
204
+ padding: var(--zx-space-1) 2px;
205
+ font-size: var(--zx-text-xs);
206
+ line-height: 1.2;
207
+ }
208
+
209
+ .zx-module-bar__item:hover {
210
+ background: var(--zx-color-bg-hover);
211
+ color: var(--zx-color-text);
212
+ }
213
+
214
+ .zx-module-bar__item:focus-visible {
215
+ outline-color: transparent;
216
+ box-shadow: var(--zx-focus-ring);
217
+ }
218
+
219
+ /*
220
+ * Where you are. With flyouts the current module takes the fill and an open flyout the hover
221
+ * step, as on a rail. With an adjacent panel the fill marks the module whose menu the panel
222
+ * shows; when that is not the current one, the current module keeps the full text colour and a
223
+ * heavier name, the way a closed branch over the active route does in the tree.
224
+ */
225
+ .zx-module-bar[data-menus="flyout"] .zx-module-bar__item[aria-current],
226
+ .zx-module-bar[data-menus="none"] .zx-module-bar__item[aria-expanded="true"],
227
+ .zx-module-bar[data-menus="none"]:not(:has(.zx-module-bar__item[aria-expanded="true"])) .zx-module-bar__item[aria-current] {
228
+ background: var(--zx-color-bg-current);
229
+ color: var(--zx-color-text);
230
+ }
231
+
232
+ .zx-module-bar__item[aria-current],
233
+ .zx-module-bar__item[data-module-bar-more][aria-expanded="true"],
234
+ .zx-module-bar[data-menus="flyout"] .zx-module-bar__item[aria-expanded="true"] {
235
+ color: var(--zx-color-text);
236
+ }
237
+
238
+ .zx-module-bar[data-menus="flyout"] .zx-module-bar__item[aria-expanded="true"]:not([aria-current]),
239
+ .zx-module-bar__item[data-module-bar-more][aria-expanded="true"] {
240
+ background: var(--zx-color-bg-hover);
241
+ }
242
+
243
+ .zx-module-bar__item[aria-current] .zx-module-bar__label,
244
+ .zx-module-bar[data-menus="none"] .zx-module-bar__item[aria-expanded="true"] .zx-module-bar__label {
245
+ font-weight: var(--zx-weight-semibold);
246
+ }
247
+
248
+ /* Unavailable, and still readable: the tile carries the dimming, the name keeps the muted role. */
249
+ .zx-module-bar__item[aria-disabled="true"],
250
+ .zx-module-bar__entry[aria-disabled="true"] {
251
+ color: var(--zx-color-text-muted);
252
+ cursor: not-allowed;
253
+ }
254
+
255
+ .zx-module-bar__item[aria-disabled="true"] .zx-module-bar__tile,
256
+ .zx-module-bar__entry[aria-disabled="true"] .zx-module-bar__tile { opacity: .55; }
257
+ .zx-module-bar__item[aria-disabled="true"]:hover,
258
+ .zx-module-bar__entry[aria-disabled="true"]:hover { background: transparent; }
259
+
260
+ .zx-module-bar__label {
261
+ max-inline-size: 100%;
262
+ hyphens: auto;
263
+ overflow-wrap: break-word;
264
+ text-align: center;
265
+ }
266
+
267
+ /* ---------------------------------------------------------------- the tile and its appearances */
268
+
269
+ .zx-module-bar__tile {
270
+ --zx-module-bar-fill: transparent;
271
+ --zx-module-bar-ink: currentColor;
272
+ display: grid;
273
+ flex: none;
274
+ place-items: center;
275
+ inline-size: var(--zx-module-bar-tile);
276
+ block-size: var(--zx-module-bar-tile);
277
+ border-radius: var(--zx-radius-lg);
278
+ background: var(--zx-module-bar-fill);
279
+ color: var(--zx-module-bar-ink);
280
+ font-size: calc(var(--zx-module-bar-tile) * .58);
281
+ line-height: 1;
282
+ }
283
+
284
+ .zx-module-bar__initial {
285
+ font-size: .9em;
286
+ font-weight: var(--zx-weight-semibold);
287
+ }
288
+
289
+ /* Tint: the glyph in the module's colour on a soft fill of it. A tone takes the palette's own
290
+ pair, which holds 4.5:1; a host colour is mixed toward the text colour for its ink, so it reads
291
+ in whichever direction the theme runs. */
292
+ .zx-module-bar__tile[data-appearance="tint"][data-color] {
293
+ --zx-module-bar-fill: color-mix(in srgb, var(--zx-module-bar-color) 16%, var(--zx-color-bg-surface));
294
+ --zx-module-bar-ink: color-mix(in srgb, var(--zx-module-bar-color) 70%, var(--zx-color-text));
295
+ }
296
+
297
+ .zx-module-bar__tile[data-appearance="tint"][data-tone="blue"] { --zx-module-bar-fill: var(--zx-color-tone-blue-bg); --zx-module-bar-ink: var(--zx-color-tone-blue-fg); }
298
+ .zx-module-bar__tile[data-appearance="tint"][data-tone="teal"] { --zx-module-bar-fill: var(--zx-color-tone-teal-bg); --zx-module-bar-ink: var(--zx-color-tone-teal-fg); }
299
+ .zx-module-bar__tile[data-appearance="tint"][data-tone="green"] { --zx-module-bar-fill: var(--zx-color-tone-green-bg); --zx-module-bar-ink: var(--zx-color-tone-green-fg); }
300
+ .zx-module-bar__tile[data-appearance="tint"][data-tone="amber"] { --zx-module-bar-fill: var(--zx-color-tone-amber-bg); --zx-module-bar-ink: var(--zx-color-tone-amber-fg); }
301
+ .zx-module-bar__tile[data-appearance="tint"][data-tone="orange"] { --zx-module-bar-fill: var(--zx-color-tone-orange-bg); --zx-module-bar-ink: var(--zx-color-tone-orange-fg); }
302
+ .zx-module-bar__tile[data-appearance="tint"][data-tone="red"] { --zx-module-bar-fill: var(--zx-color-tone-red-bg); --zx-module-bar-ink: var(--zx-color-tone-red-fg); }
303
+ .zx-module-bar__tile[data-appearance="tint"][data-tone="pink"] { --zx-module-bar-fill: var(--zx-color-tone-pink-bg); --zx-module-bar-ink: var(--zx-color-tone-pink-fg); }
304
+ .zx-module-bar__tile[data-appearance="tint"][data-tone="violet"] { --zx-module-bar-fill: var(--zx-color-tone-violet-bg); --zx-module-bar-ink: var(--zx-color-tone-violet-fg); }
305
+ .zx-module-bar__tile[data-appearance="tint"][data-tone="slate"] { --zx-module-bar-fill: var(--zx-color-tone-slate-bg); --zx-module-bar-ink: var(--zx-color-tone-slate-fg); }
306
+
307
+ /* Solid: the identity tile itself, an AppIcon sized by the bar. Its material is AppIcon's. */
308
+ .zx-module-bar__tile[data-appearance="solid"] { font-size: inherit; }
309
+
310
+ /* Plain: monochrome glyphs in the item's own colour; identity colour is not drawn. */
311
+ .zx-module-bar__tile[data-appearance="plain"] { --zx-module-bar-ink: currentColor; }
312
+
313
+ /* The count a tile carries. A number that fits stays a number; past two characters it is a dot,
314
+ and the figure is in the control's accessible name either way. */
315
+ .zx-module-bar__badge {
316
+ position: absolute;
317
+ inset-block-start: 0;
318
+ inset-inline-end: 0;
319
+ min-inline-size: var(--zx-space-4);
320
+ block-size: var(--zx-space-4);
321
+ border-radius: var(--zx-radius-full);
322
+ background: var(--zx-color-accent);
323
+ box-shadow: 0 0 0 2px var(--zx-color-bg-chrome);
324
+ box-sizing: border-box;
325
+ padding-inline: var(--zx-space-1);
326
+ color: var(--zx-color-on-accent);
327
+ font-size: var(--zx-text-xs);
328
+ font-variant-numeric: tabular-nums;
329
+ font-weight: var(--zx-weight-semibold);
330
+ line-height: var(--zx-space-4);
331
+ text-align: center;
332
+ }
333
+
334
+ .zx-module-bar__badge[data-zx-badge="dot"] {
335
+ min-inline-size: 0;
336
+ inline-size: var(--zx-space-2);
337
+ block-size: var(--zx-space-2);
338
+ padding: 0;
339
+ font-size: 0;
340
+ line-height: 0;
341
+ }
342
+
343
+ /* -------------------------------------------------------------------- the "All modules" catalogue */
344
+
345
+ /* The panel is portaled to the overlay host, so the bar's scale is restated here against the same
346
+ tokens; the catalogue's tiles are a step larger than the bar's, because each sits over a name. */
347
+ .zx-module-bar__popover {
348
+ --zx-module-bar-tile: calc(var(--zx-control-height) + var(--zx-space-1));
349
+ }
350
+
351
+ /* `styles/zx.css` imports this file before `dropdown.css`, so the size the panel takes back from
352
+ the generic overlay surface has to out-specify it. */
353
+ .zx-dropdown.zx-module-bar__popover {
354
+ inline-size: min(26rem, calc(100vw - 2 * var(--zx-space-3)));
355
+ max-block-size: min(34rem, calc(100vh - 2 * var(--zx-space-6)));
356
+ overflow: auto;
357
+ padding: var(--zx-space-2);
358
+ }
359
+
360
+ .zx-module-bar__catalogue { display: grid; gap: var(--zx-space-1); }
361
+
362
+ .zx-module-bar__filter {
363
+ box-sizing: border-box;
364
+ inline-size: 100%;
365
+ block-size: var(--zx-control-height);
366
+ margin-block-end: var(--zx-space-1);
367
+ border: 1px solid var(--zx-color-border-control);
368
+ border-radius: var(--zx-control-radius);
369
+ background: var(--zx-color-bg-control);
370
+ padding-inline: var(--zx-control-pad-x);
371
+ color: var(--zx-color-text);
372
+ font: inherit;
373
+ font-size: var(--zx-control-font-size);
374
+ }
375
+
376
+ .zx-module-bar__filter::placeholder { color: var(--zx-color-text-placeholder); }
377
+
378
+ .zx-module-bar__filter:focus-visible {
379
+ outline-color: transparent;
380
+ border-color: var(--zx-color-accent);
381
+ box-shadow: var(--zx-focus-ring);
382
+ }
383
+
384
+ .zx-module-bar__group[hidden] { display: none; }
385
+
386
+ .zx-module-bar__group-label {
387
+ padding: var(--zx-space-2) var(--zx-space-2) var(--zx-space-1);
388
+ color: var(--zx-color-text-muted);
389
+ font-size: var(--zx-text-xs);
390
+ font-weight: var(--zx-weight-semibold);
391
+ }
392
+
393
+ .zx-module-bar__grid {
394
+ display: grid;
395
+ grid-template-columns: repeat(auto-fill, minmax(5.5rem, 1fr));
396
+ gap: var(--zx-space-1);
397
+ margin: 0;
398
+ padding: 0;
399
+ list-style: none;
400
+ }
401
+
402
+ .zx-module-bar__grid > li { display: flex; }
403
+ .zx-module-bar__grid > li[hidden] { display: none; }
404
+
405
+ .zx-module-bar__entry {
406
+ position: relative;
407
+ display: grid;
408
+ align-content: start;
409
+ justify-items: center;
410
+ gap: var(--zx-space-1);
411
+ box-sizing: border-box;
412
+ inline-size: 100%;
413
+ border: 0;
414
+ border-radius: var(--zx-radius-md);
415
+ background: transparent;
416
+ padding: var(--zx-space-2) var(--zx-space-1);
417
+ color: var(--zx-color-text);
418
+ font: inherit;
419
+ font-size: var(--zx-text-sm);
420
+ line-height: 1.25;
421
+ text-align: center;
422
+ text-decoration: none;
423
+ cursor: pointer;
424
+ }
425
+
426
+ .zx-module-bar__entry:hover { background: var(--zx-color-bg-hover); }
427
+
428
+ .zx-module-bar__entry:focus-visible {
429
+ outline-color: transparent;
430
+ box-shadow: var(--zx-focus-ring);
431
+ }
432
+
433
+ .zx-module-bar__entry[aria-current] {
434
+ background: var(--zx-color-bg-current);
435
+ font-weight: var(--zx-weight-semibold);
436
+ }
437
+
438
+ .zx-module-bar__entry-label {
439
+ max-inline-size: 100%;
440
+ hyphens: auto;
441
+ overflow-wrap: break-word;
442
+ }
443
+
444
+ .zx-module-bar__entry-badge {
445
+ color: var(--zx-color-text-muted);
446
+ font-size: var(--zx-text-xs);
447
+ font-variant-numeric: tabular-nums;
448
+ font-weight: 500;
449
+ }
450
+
451
+ .zx-module-bar__empty {
452
+ margin: 0;
453
+ padding: var(--zx-space-4) var(--zx-space-2);
454
+ color: var(--zx-color-text-muted);
455
+ font-size: var(--zx-text-sm);
456
+ text-align: center;
457
+ }
458
+
459
+ .zx-module-bar__empty[hidden] { display: none; }
460
+
461
+ @media (prefers-reduced-motion: no-preference) {
462
+ .zx-module-bar__item,
463
+ .zx-module-bar__entry {
464
+ transition: background-color var(--zx-dur-fast) var(--zx-ease),
465
+ color var(--zx-dur-fast) var(--zx-ease),
466
+ box-shadow var(--zx-dur-fast) var(--zx-ease);
467
+ }
468
+
469
+ .zx-module-bar__item:active,
470
+ .zx-module-bar__entry:active { transform: scale(.96); }
471
+ }
472
+
473
+ /* Forced colours drop author backgrounds: the system's selected pair marks where you are, and
474
+ every tile keeps an outline so its shape survives the loss of its fill. */
475
+ @media (forced-colors: active) {
476
+ .zx-module-bar__item[aria-current],
477
+ .zx-module-bar[data-menus="none"] .zx-module-bar__item[aria-expanded="true"],
478
+ .zx-module-bar__entry[aria-current] {
479
+ background: Highlight;
480
+ color: HighlightText;
481
+ forced-color-adjust: none;
482
+ }
483
+
484
+ .zx-module-bar__tile { outline: 1px solid CanvasText; }
485
+ .zx-module-bar__badge { border: 1px solid CanvasText; }
486
+ }