@zeyos/zx 4.4.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 (252) hide show
  1. package/CHANGELOG.md +447 -0
  2. package/README.md +44 -11
  3. package/dist/types/components/account-menu/account-menu.d.ts +8 -0
  4. package/dist/types/components/activity-list/activity-list.d.ts +31 -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 +293 -17
  7. package/dist/types/components/avatar/avatar.d.ts +46 -7
  8. package/dist/types/components/badge/badge.d.ts +21 -1
  9. package/dist/types/components/button/button.d.ts +15 -0
  10. package/dist/types/components/calendar/calendar.d.ts +67 -5
  11. package/dist/types/components/card-view/card-view.d.ts +7 -4
  12. package/dist/types/components/card-view/record-card.d.ts +11 -0
  13. package/dist/types/components/chart/chart.d.ts +10 -0
  14. package/dist/types/components/checklist/checklist.d.ts +9 -0
  15. package/dist/types/components/code-editor/code-editor.d.ts +6 -17
  16. package/dist/types/components/context-menu/context-menu.d.ts +6 -2
  17. package/dist/types/components/data-filter/data-filter.d.ts +4 -4
  18. package/dist/types/components/datebox/date-range-box.d.ts +5 -1
  19. package/dist/types/components/datebox/datebox.d.ts +7 -2
  20. package/dist/types/components/dialog/dialog.d.ts +46 -6
  21. package/dist/types/components/dropdown/dropdown.d.ts +24 -9
  22. package/dist/types/components/entity-ref/entity-ref.d.ts +2 -2
  23. package/dist/types/components/field/field.d.ts +54 -2
  24. package/dist/types/components/fieldset/external-adapter.d.ts +83 -0
  25. package/dist/types/components/fieldset/fieldset.d.ts +26 -1
  26. package/dist/types/components/file-item/file-item.d.ts +34 -6
  27. package/dist/types/components/file-list/file-list.d.ts +35 -3
  28. package/dist/types/components/filter/filter.d.ts +127 -3
  29. package/dist/types/components/filter-panel/filter-panel.d.ts +36 -7
  30. package/dist/types/components/form/form.d.ts +12 -1
  31. package/dist/types/components/kanban-view/kanban-card.d.ts +8 -0
  32. package/dist/types/components/launcher/launcher.d.ts +268 -15
  33. package/dist/types/components/list-toolbar/list-toolbar.d.ts +16 -7
  34. package/dist/types/components/menu-button/menu-button.d.ts +39 -5
  35. package/dist/types/components/message/message.d.ts +132 -17
  36. package/dist/types/components/modal/modal.d.ts +43 -2
  37. package/dist/types/components/module-bar/module-bar.d.ts +395 -0
  38. package/dist/types/components/pagination/pagination.d.ts +17 -3
  39. package/dist/types/components/select/color.d.ts +12 -0
  40. package/dist/types/components/select/glyphs.d.ts +124 -0
  41. package/dist/types/components/select/select.d.ts +17 -3
  42. package/dist/types/components/sheet/sheet.d.ts +15 -0
  43. package/dist/types/components/stat-tile/stat-tile.d.ts +16 -5
  44. package/dist/types/components/tabbox/tabbox.d.ts +9 -0
  45. package/dist/types/components/table/table.d.ts +311 -18
  46. package/dist/types/components/tag-picker/tag-picker.d.ts +21 -4
  47. package/dist/types/components/tree/tree.d.ts +13 -0
  48. package/dist/types/components/view/record-view.d.ts +59 -2
  49. package/dist/types/components/view-settings/view-settings.d.ts +879 -0
  50. package/dist/types/components/workspace-switcher/workspace-switcher.d.ts +327 -0
  51. package/dist/types/core/breakpoint.d.ts +1 -1
  52. package/dist/types/core/component.d.ts +12 -2
  53. package/dist/types/core/i18n.d.ts +27 -3
  54. package/dist/types/core/icons.d.ts +23 -25
  55. package/dist/types/core/keyboard.d.ts +98 -1
  56. package/dist/types/core/messages.d.ts +382 -0
  57. package/dist/types/core/motion.d.ts +59 -0
  58. package/dist/types/core/overlay-host.d.ts +42 -1
  59. package/dist/types/core/overlay-stack.d.ts +260 -0
  60. package/dist/types/index.d.ts +10 -5
  61. package/dist/types/internal/app-rail.d.ts +38 -0
  62. package/dist/types/internal/menu-items.d.ts +71 -3
  63. package/dist/types/zeyos/connect.d.ts +6 -0
  64. package/dist/types/zeyos/form.d.ts +50 -9
  65. package/dist/types/zeyos/index.d.ts +2 -1
  66. package/dist/types/zeyos/launcher.d.ts +9 -0
  67. package/dist/types/zeyos/module-bar.d.ts +176 -0
  68. package/dist/types/zeyos/query.d.ts +110 -5
  69. package/dist/types/zeyos/schema.d.ts +24 -1
  70. package/dist/types/zeyos/table.d.ts +345 -22
  71. package/dist/types/zeyos/view.d.ts +26 -2
  72. package/dist/zx-zeyos.esm.js +6178 -1008
  73. package/dist/zx-zeyos.esm.min.js +53 -5
  74. package/dist/zx.css +2861 -827
  75. package/dist/zx.esm.js +8909 -1480
  76. package/dist/zx.esm.min.js +55 -7
  77. package/dist/zx.global.js +8911 -1482
  78. package/dist/zx.global.min.js +55 -7
  79. package/dist/zx.min.css +1 -1
  80. package/docs/api.json +1079 -117
  81. package/docs/llms.md +956 -154
  82. package/docs/llms.txt +9 -5
  83. package/package.json +1 -1
  84. package/src/components/account-menu/account-menu.css +35 -10
  85. package/src/components/account-menu/account-menu.js +12 -0
  86. package/src/components/activity-item/activity-item.css +1 -1
  87. package/src/components/activity-item/activity-item.js +3 -0
  88. package/src/components/activity-list/activity-list.css +38 -3
  89. package/src/components/activity-list/activity-list.js +61 -1
  90. package/src/components/app-icon/app-icon.css +14 -3
  91. package/src/components/app-icon/app-icon.js +11 -1
  92. package/src/components/app-rail/app-rail.css +59 -79
  93. package/src/components/app-sidebar/app-sidebar.css +304 -168
  94. package/src/components/app-sidebar/app-sidebar.js +667 -46
  95. package/src/components/aurora/aurora.css +5 -3
  96. package/src/components/avatar/avatar.css +32 -7
  97. package/src/components/avatar/avatar.js +72 -8
  98. package/src/components/badge/badge.css +54 -2
  99. package/src/components/badge/badge.js +29 -2
  100. package/src/components/breadcrumb/breadcrumb.css +1 -1
  101. package/src/components/button/button.css +67 -9
  102. package/src/components/button/button.js +38 -0
  103. package/src/components/calendar/calendar.css +47 -47
  104. package/src/components/calendar/calendar.js +26 -52
  105. package/src/components/card/card.css +4 -4
  106. package/src/components/card-view/card-view.css +14 -12
  107. package/src/components/card-view/card-view.js +13 -9
  108. package/src/components/card-view/record-card.js +14 -3
  109. package/src/components/chart/chart.css +4 -1
  110. package/src/components/chart/chart.js +12 -0
  111. package/src/components/check-button/check-button.css +10 -2
  112. package/src/components/checklist/checklist.css +9 -2
  113. package/src/components/checklist/checklist.js +11 -5
  114. package/src/components/checklist/field-adapter.js +3 -1
  115. package/src/components/code-editor/code-editor.css +7 -6
  116. package/src/components/code-editor/code-editor.js +19 -1
  117. package/src/components/code-editor/field-adapter.js +9 -2
  118. package/src/components/context-menu/context-menu.css +9 -4
  119. package/src/components/context-menu/context-menu.js +8 -2
  120. package/src/components/copy/copy-button.css +6 -0
  121. package/src/components/copy/copy-input.css +9 -4
  122. package/src/components/data-filter/data-filter.css +5 -4
  123. package/src/components/data-filter/data-filter.js +2 -2
  124. package/src/components/date-picker/date-picker.css +6 -6
  125. package/src/components/date-picker/date-range-picker.css +3 -3
  126. package/src/components/date-picker/time-picker.css +3 -3
  127. package/src/components/datebox/date-range-box.css +79 -2
  128. package/src/components/datebox/date-range-box.js +13 -2
  129. package/src/components/datebox/datebox.css +79 -2
  130. package/src/components/datebox/datebox.js +13 -2
  131. package/src/components/dialog/dialog.css +26 -0
  132. package/src/components/dialog/dialog.js +99 -17
  133. package/src/components/dock/dock.css +5 -4
  134. package/src/components/dropdown/dropdown.css +1 -1
  135. package/src/components/dropdown/dropdown.js +159 -72
  136. package/src/components/empty-state/empty-state.css +2 -2
  137. package/src/components/entity-ref/entity-ref.css +1 -1
  138. package/src/components/entity-ref/entity-ref.js +1 -1
  139. package/src/components/field/field.css +28 -9
  140. package/src/components/field/field.js +101 -29
  141. package/src/components/field-upload/field-upload.css +1 -1
  142. package/src/components/fieldset/external-adapter.js +363 -0
  143. package/src/components/fieldset/fieldset.css +5 -3
  144. package/src/components/fieldset/fieldset.js +38 -64
  145. package/src/components/file-item/file-item.js +144 -10
  146. package/src/components/file-list/file-list.js +144 -21
  147. package/src/components/filter/filter.css +86 -2
  148. package/src/components/filter/filter.js +307 -11
  149. package/src/components/filter-panel/filter-panel.css +1 -1
  150. package/src/components/filter-panel/filter-panel.js +149 -32
  151. package/src/components/finder/finder.css +16 -14
  152. package/src/components/form/form.css +5 -4
  153. package/src/components/form/form.js +11 -2
  154. package/src/components/grid/grid.css +1 -1
  155. package/src/components/groupbox/groupbox.css +1 -1
  156. package/src/components/kanban-view/kanban-card.js +11 -3
  157. package/src/components/kanban-view/kanban-view.css +42 -18
  158. package/src/components/kanban-view/kanban-view.js +9 -6
  159. package/src/components/launcher/launcher.css +108 -26
  160. package/src/components/launcher/launcher.js +530 -42
  161. package/src/components/list-toolbar/list-toolbar.css +13 -8
  162. package/src/components/list-toolbar/list-toolbar.js +40 -14
  163. package/src/components/master-panel/master-panel.css +2 -0
  164. package/src/components/master-panel/master-panel.js +0 -1
  165. package/src/components/menu-button/menu-button.css +72 -4
  166. package/src/components/menu-button/menu-button.js +160 -18
  167. package/src/components/message/message.css +33 -3
  168. package/src/components/message/message.js +264 -22
  169. package/src/components/modal/modal.css +1 -1
  170. package/src/components/modal/modal.js +83 -15
  171. package/src/components/module-bar/module-bar.css +486 -0
  172. package/src/components/module-bar/module-bar.js +1074 -0
  173. package/src/components/multi-value-editor/multi-value-editor.css +1 -1
  174. package/src/components/navigation-bar/navigation-bar.css +18 -9
  175. package/src/components/number-field/field-adapter.js +3 -1
  176. package/src/components/number-field/number-field.css +70 -0
  177. package/src/components/number-field/number-field.js +2 -0
  178. package/src/components/pagination/pagination.css +13 -11
  179. package/src/components/pagination/pagination.js +20 -4
  180. package/src/components/panel/panel.css +4 -3
  181. package/src/components/questionnaire/questionnaire.css +4 -4
  182. package/src/components/rating/field-adapter.js +2 -1
  183. package/src/components/rating/rating.css +8 -1
  184. package/src/components/search/search.css +4 -1
  185. package/src/components/select/color.js +22 -0
  186. package/src/components/select/field-adapter.js +2 -0
  187. package/src/components/select/glyphs.js +165 -0
  188. package/src/components/select/select.css +138 -45
  189. package/src/components/select/select.js +92 -47
  190. package/src/components/sheet/sheet.css +12 -9
  191. package/src/components/sheet/sheet.js +74 -32
  192. package/src/components/slider/field-adapter.js +6 -1
  193. package/src/components/slider/slider.css +18 -4
  194. package/src/components/slider/slider.js +1 -1
  195. package/src/components/sort-control/sort-control.css +4 -1
  196. package/src/components/split-view/split-view.css +1 -1
  197. package/src/components/stat-tile/stat-tile.css +42 -47
  198. package/src/components/stat-tile/stat-tile.js +17 -6
  199. package/src/components/stepper/stepper.css +1 -1
  200. package/src/components/tabbox/tabbox.css +41 -32
  201. package/src/components/tabbox/tabbox.js +5 -1
  202. package/src/components/table/table.css +187 -37
  203. package/src/components/table/table.js +718 -73
  204. package/src/components/tag-picker/field-adapter.js +2 -1
  205. package/src/components/tag-picker/tag-picker.css +83 -5
  206. package/src/components/tag-picker/tag-picker.js +25 -8
  207. package/src/components/timebox/timebox.css +22 -2
  208. package/src/components/toggle/toggle.css +12 -1
  209. package/src/components/toolbar/toolbar.js +2 -2
  210. package/src/components/tooltip/tooltip.css +4 -0
  211. package/src/components/tooltip/tooltip.js +44 -19
  212. package/src/components/tree/tree.css +26 -17
  213. package/src/components/tree/tree.js +31 -0
  214. package/src/components/value-list/value-list.css +3 -3
  215. package/src/components/view/record-view.css +1 -1
  216. package/src/components/view/record-view.js +178 -18
  217. package/src/components/view-settings/view-settings.css +285 -0
  218. package/src/components/view-settings/view-settings.js +1830 -0
  219. package/src/components/workspace-switcher/workspace-switcher.css +188 -0
  220. package/src/components/workspace-switcher/workspace-switcher.js +463 -0
  221. package/src/core/breakpoint.js +1 -1
  222. package/src/core/component.js +88 -17
  223. package/src/core/fontawesome.js +5 -1
  224. package/src/core/i18n.js +47 -4
  225. package/src/core/icons.js +204 -61
  226. package/src/core/keyboard.js +206 -11
  227. package/src/core/messages.js +427 -0
  228. package/src/core/motion.js +147 -0
  229. package/src/core/overlay-host.js +77 -3
  230. package/src/core/overlay-stack.js +487 -0
  231. package/src/core/position.js +22 -3
  232. package/src/index.js +10 -5
  233. package/src/internal/app-rail.js +135 -55
  234. package/src/internal/menu-items.js +61 -3
  235. package/src/zeyos/connect.js +6 -2
  236. package/src/zeyos/form.js +69 -27
  237. package/src/zeyos/index.js +4 -1
  238. package/src/zeyos/launcher.js +8 -3
  239. package/src/zeyos/module-bar.js +181 -0
  240. package/src/zeyos/query.js +197 -13
  241. package/src/zeyos/schema.js +144 -27
  242. package/src/zeyos/table.js +287 -84
  243. package/src/zeyos/view.js +49 -93
  244. package/styles/base.css +72 -1
  245. package/styles/icons.css +11 -1
  246. package/styles/print.css +1 -1
  247. package/styles/tokens/dark.css +117 -37
  248. package/styles/tokens/global.css +121 -27
  249. package/styles/tokens/semantic.css +140 -43
  250. package/styles/tokens/themes.css +7 -6
  251. package/styles/zx.css +3 -1
  252. package/styles/tokens/density.css +0 -9
@@ -0,0 +1,395 @@
1
+ import { AppRailPresenter } from '../../internal/app-rail.js';
2
+ import { Dropdown } from '../dropdown/dropdown.js';
3
+ import { Tooltip } from '../tooltip/tooltip.js';
4
+ export type AppNavItem = import('../../internal/app-rail.js').AppNavItem;
5
+ export type AppNavSelectDetail = import('../../internal/app-rail.js').AppNavSelectDetail;
6
+ export type ModuleTone = import('../app-icon/app-icon.js').AppIconTone;
7
+ export type ModuleItem = {
8
+ /**
9
+ * Stable module identifier.
10
+ */
11
+ id: string | number;
12
+ /**
13
+ * Module name: the tile's accessible name, tooltip, and catalogue label.
14
+ */
15
+ label: string;
16
+ /**
17
+ * Icon name, node, component, or factory.
18
+ */
19
+ icon?: string | Node | {
20
+ toElement: () => Node | null;
21
+ } | ((context: Record<string, any>, item: AppNavItem) => Node | null);
22
+ /**
23
+ * Identity colour from the theme's categorical tones.
24
+ */
25
+ tone?: ModuleTone;
26
+ /**
27
+ * Identity colour as any CSS colour; takes precedence over `tone`.
28
+ */
29
+ color?: string;
30
+ /**
31
+ * Count or status badge.
32
+ */
33
+ badge?: string | number;
34
+ /**
35
+ * Shown on the bar, in this order when a number. When no
36
+ * module sets it, every module is on the bar; otherwise unpinned modules are in "All modules" only.
37
+ */
38
+ pinned?: boolean | number;
39
+ /**
40
+ * Group heading in the "All modules" catalogue.
41
+ */
42
+ group?: string;
43
+ /**
44
+ * Secondary text, shown as the catalogue entry's title.
45
+ */
46
+ description?: string;
47
+ /**
48
+ * Emitted value; defaults to `id`.
49
+ */
50
+ value?: unknown;
51
+ /**
52
+ * Native navigation target for a module without a menu.
53
+ */
54
+ href?: string;
55
+ /**
56
+ * Native link browsing context.
57
+ */
58
+ target?: string;
59
+ /**
60
+ * Application-owned non-link action.
61
+ */
62
+ invoke?: () => void;
63
+ /**
64
+ * Whether activation is unavailable.
65
+ */
66
+ disabled?: boolean;
67
+ /**
68
+ * The module's menu. With `menus: 'flyout'` it opens beside
69
+ * the tile; it never renders inline.
70
+ */
71
+ children?: AppNavItem[];
72
+ };
73
+ export type ModuleBarOptions = {
74
+ /**
75
+ * Modules, in bar order.
76
+ */
77
+ items?: ModuleItem[];
78
+ /**
79
+ * Active destination id: a module, or any item in a module's menu.
80
+ */
81
+ active?: string | number | null;
82
+ /**
83
+ * Bar flow.
84
+ */
85
+ orientation?: 'vertical' | 'horizontal';
86
+ /**
87
+ * Workspace edge the bar occupies.
88
+ */
89
+ side?: 'left' | 'right' | 'top' | 'bottom';
90
+ /**
91
+ * Tile treatment: the glyph in the module
92
+ * colour on a tint of it, the solid identity tile, or monochrome glyphs.
93
+ */
94
+ appearance?: 'tint' | 'solid' | 'plain';
95
+ /**
96
+ * Whether a vertical bar prints each
97
+ * module's name: under its tile (a narrow strip), beside it (a full navigation column, with the
98
+ * count at the end of the row), or not at all — the name then stays the accessible name and the
99
+ * tooltip. Horizontal bars never print names.
100
+ */
101
+ labels?: 'hidden' | 'below' | 'beside';
102
+ /**
103
+ * How a module's children are presented: in a flyout,
104
+ * or by an adjacent panel the application owns, in which case activating the module emits `select`.
105
+ */
106
+ menus?: 'flyout' | 'none';
107
+ /**
108
+ * With `menus: 'none'`, the module whose menu the
109
+ * adjacent panel shows.
110
+ */
111
+ expanded?: string | number | null;
112
+ /**
113
+ * With `menus: 'none'`, the id of that panel.
114
+ */
115
+ controls?: string | null;
116
+ /**
117
+ * The "All modules" button: shown when a
118
+ * module does not fit or is unpinned, always, or never (the bar then scrolls).
119
+ */
120
+ allModules?: 'auto' | 'always' | 'never';
121
+ /**
122
+ * Leading content, such as a product mark.
123
+ */
124
+ header?: Node | string | number | {
125
+ toElement: () => Node | null;
126
+ } | null;
127
+ /**
128
+ * Trailing content, such as an account menu.
129
+ */
130
+ footer?: Node | string | number | {
131
+ toElement: () => Node | null;
132
+ } | null;
133
+ /**
134
+ * Navigation accessible label. Omitted resolves `moduleBar.label`, English `Modules`.
135
+ */
136
+ label?: string | null;
137
+ /**
138
+ * Flyout hover-open delay in milliseconds.
139
+ */
140
+ openDelay?: number;
141
+ /**
142
+ * Flyout pointer and focus crossing grace in milliseconds.
143
+ */
144
+ closeDelay?: number;
145
+ /**
146
+ * Optional host icon renderer.
147
+ */
148
+ renderIcon?: (item: AppNavItem, context: Record<string, any>) => Node | null;
149
+ /**
150
+ * Preventable activation listener.
151
+ */
152
+ onselect?: (event: CustomEvent<AppNavSelectDetail>) => void;
153
+ /**
154
+ * Flyout-state listener.
155
+ */
156
+ onflyoutchange?: (event: CustomEvent<{
157
+ item: AppNavItem;
158
+ id: string | number;
159
+ open: boolean;
160
+ }>) => void;
161
+ /**
162
+ * Overflow listener.
163
+ */
164
+ onoverflowchange?: (event: CustomEvent<{
165
+ visible: Array<string | number>;
166
+ overflow: Array<string | number>;
167
+ }>) => void;
168
+ /**
169
+ * "All modules" catalogue open-state listener.
170
+ */
171
+ onallmodules?: (event: CustomEvent<{
172
+ open: boolean;
173
+ }>) => void;
174
+ };
175
+ /**
176
+ * The module level of an application: one colour-coded tile per module in a vertical strip or a
177
+ * horizontal bar. A module with a menu opens it in a flyout, or leaves it to an adjacent panel
178
+ * (`menus: 'none'`, which is how `AppSidebar` composes the bar). Modules that do not fit, or are
179
+ * not pinned, are one step away in the "All modules" catalogue. The bar is one Tab stop: arrow
180
+ * keys, Home, End, and type-ahead move between tiles.
181
+ * @fires ModuleBar#select
182
+ * @fires ModuleBar#flyoutchange
183
+ * @fires ModuleBar#overflowchange
184
+ * @fires ModuleBar#allmodules
185
+ * @extends {AppRailPresenter}
186
+ */
187
+ export declare class ModuleBar extends AppRailPresenter {
188
+ _sections: Map<any, any>;
189
+ _appearance: any;
190
+ _menus: string;
191
+ _expandedId: any;
192
+ _labels: any;
193
+ _promoted: string | number;
194
+ _catalogue: Dropdown;
195
+ _silenceCatalogue: boolean;
196
+ _catalogueTooltip: Tooltip;
197
+ _observer: ResizeObserver;
198
+ _partition: {
199
+ visible: any[];
200
+ overflow: any[];
201
+ } | {
202
+ visible: (string | number)[];
203
+ overflow: (string | number)[];
204
+ };
205
+ _rovingId: string;
206
+ _typeahead: any;
207
+ static cssName: string;
208
+ static partBlock: string;
209
+ /** @type {Readonly<ModuleBarOptions>} */
210
+ static defaults: Readonly<ModuleBarOptions>;
211
+ /**
212
+ * Creates or enhances a module bar.
213
+ * @param {Element|string|null} [target=null] Bar target; a `<nav>` is created when null.
214
+ * @param {ModuleBarOptions} [options={}] Bar options.
215
+ */
216
+ constructor(target?: Element | string | null, options?: ModuleBarOptions);
217
+ /** @returns {HTMLElement} */
218
+ render(): HTMLElement;
219
+ /** Replaces the modules and rebuilds the bar. @param {ModuleItem[]} items @returns {this} */
220
+ setItems(items: ModuleItem[]): this;
221
+ /** Returns a copy of the normalized modules. @returns {ModuleItem[]} */
222
+ getItems(): ModuleItem[];
223
+ /**
224
+ * Marks the active destination — a module, or anything in a module's menu — without routing.
225
+ * The module holding it becomes current and stays on the bar.
226
+ * @param {string|number|null} id Destination id.
227
+ * @returns {this}
228
+ */
229
+ setActive(id: string | number | null): this;
230
+ /** Opens a module's menu flyout. @param {string|number} id Module id. @param {{focus?: boolean}} [options={}] Focus its first item. @returns {this} */
231
+ openFlyout(id: string | number, options?: {
232
+ focus?: boolean;
233
+ }): this;
234
+ /** Closes a module's menu flyout. @param {string|number} id Module id. @returns {this} */
235
+ closeFlyout(id: string | number): this;
236
+ /** Closes every menu flyout. @returns {this} */
237
+ closeAllFlyouts(): this;
238
+ /** Reports whether a module's menu flyout is open. @param {string|number} id Module id. @returns {boolean} */
239
+ isFlyoutOpen(id: string | number): boolean;
240
+ /**
241
+ * With `menus: 'none'`, names the module whose menu the adjacent panel now shows.
242
+ * @param {string|number|null} id Module id, or null when the panel shows none.
243
+ * @returns {this}
244
+ */
245
+ setExpanded(id: string | number | null): this;
246
+ /**
247
+ * Updates one badge in place — on the tile, in a flyout, and in the catalogue — without
248
+ * rebuilding the bar. `null` removes it.
249
+ * @param {string|number} id Module or menu item id.
250
+ * @param {string|number|null} badge New badge.
251
+ * @returns {this}
252
+ */
253
+ setBadge(id: string | number, badge: string | number | null): this;
254
+ /**
255
+ * Changes flow or edge, keeping items, the active destination, and the expanded module.
256
+ * @param {{orientation?: 'vertical'|'horizontal', side?: 'left'|'right'|'top'|'bottom'}} layout
257
+ * @returns {this}
258
+ */
259
+ setLayout(layout?: {
260
+ orientation?: 'vertical' | 'horizontal';
261
+ side?: 'left' | 'right' | 'top' | 'bottom';
262
+ }): this;
263
+ /**
264
+ * Changes whether module names are printed — the expanded and collapsed states of a vertical
265
+ * navigation column — keeping items, the active destination, and the expanded module.
266
+ * @param {'hidden'|'below'|'beside'} labels
267
+ * @returns {this}
268
+ */
269
+ setLabels(labels: 'hidden' | 'below' | 'beside'): this;
270
+ /** Opens the "All modules" catalogue and focuses its filter or first entry. @returns {this} */
271
+ openAllModules(): this;
272
+ /** Closes the "All modules" catalogue. @returns {this} */
273
+ closeAllModules(): this;
274
+ /** Reports whether the "All modules" catalogue is open. @returns {boolean} */
275
+ isAllModulesOpen(): boolean;
276
+ /** Focuses the bar's Tab stop: the current module, else the first tile. @returns {this} */
277
+ focus(): this;
278
+ /** Destroys flyouts, tooltips, and the catalogue, and restores or removes the root. @returns {void} */
279
+ destroy(): void;
280
+ /** @param {Node|null} node @returns {boolean} @private */
281
+ private _containsNode;
282
+ /** @returns {void} */
283
+ _clearArtifacts(): void;
284
+ /** @param {AppNavItem} item @returns {boolean} */
285
+ _flyoutsFor(item: AppNavItem): boolean;
286
+ /** @returns {boolean} */
287
+ _tooltipFor(): boolean;
288
+ /** @param {AppNavItem} item @returns {HTMLElement} */
289
+ _renderControl(item: AppNavItem): HTMLElement;
290
+ /** @returns {void} */
291
+ _afterRebuild(): void;
292
+ /** @returns {void} */
293
+ _syncActive(): void;
294
+ /**
295
+ * Shows the tiles that fit, in bar order, and moves the rest behind "All modules". Everything is
296
+ * shown first so a bar sized by its content measures as not overflowing and never shrinks itself.
297
+ * @returns {void}
298
+ */
299
+ _layout(): void;
300
+ /** @param {AppNavItem} item @param {'bar'|'catalogue'} location @returns {HTMLElement} */
301
+ _renderTile(item: AppNavItem, location: 'bar' | 'catalogue'): HTMLElement;
302
+ /** @param {HTMLElement} control @param {AppNavItem} item @returns {void} */
303
+ _applyTileBadge(control: HTMLElement, item: AppNavItem): void;
304
+ /** Builds the "All modules" button and its catalogue for this render. @returns {void} */
305
+ _buildCatalogue(): void;
306
+ /**
307
+ * Leave exactly one visible catalogue entry in the Tab order: `preferred`, else the current stop,
308
+ * else the current module, else the first entry the filter shows.
309
+ * @param {HTMLElement} [preferred]
310
+ * @returns {void}
311
+ */
312
+ _syncCatalogueStop(preferred?: HTMLElement): void;
313
+ /** @param {AppNavItem} item @returns {HTMLElement} */
314
+ _catalogueControl(item: AppNavItem): HTMLElement;
315
+ /** @param {MouseEvent|Event} event @returns {void} */
316
+ _onCatalogueClick(event: MouseEvent | Event): void;
317
+ /** @param {KeyboardEvent} event @returns {void} */
318
+ _onCatalogueKeydown(event: KeyboardEvent): void;
319
+ /** @param {string} query @returns {void} */
320
+ _filterCatalogue(query: string): void;
321
+ /** @returns {void} */
322
+ _focusCatalogue(): void;
323
+ /** @param {KeyboardEvent} event @returns {void} */
324
+ _onRailKeydown(event: KeyboardEvent): void;
325
+ /** @param {string} key @param {HTMLElement[]} controls @param {number} index @returns {HTMLElement|null} */
326
+ _typeaheadTarget(key: string, controls: HTMLElement[], index: number): HTMLElement | null;
327
+ /** @returns {HTMLElement[]} Every module tile, shown or not. */
328
+ _tiles(): HTMLElement[];
329
+ /** @returns {HTMLElement[]} The tiles and button the arrow keys move between, in bar order. */
330
+ _rovingControls(): HTMLElement[];
331
+ /** @returns {HTMLElement|null} */
332
+ _rovingStop(): HTMLElement | null;
333
+ /** @param {HTMLElement} control @returns {void} */
334
+ _setRovingStop(control: HTMLElement): void;
335
+ /** @returns {void} */
336
+ _syncRoving(): void;
337
+ /** @returns {void} */
338
+ _syncExpanded(): void;
339
+ /** @returns {HTMLElement[]} */
340
+ _catalogueEntries(): HTMLElement[];
341
+ /** @param {string} id @returns {HTMLElement|null} */
342
+ _catalogueEntry(id: string): HTMLElement | null;
343
+ /** @returns {string} */
344
+ _labelText(): string;
345
+ }
346
+ /**
347
+ * Splits modules into those the bar shows and those only "All modules" offers.
348
+ *
349
+ * Bar order is pinned modules first — by their pinned number, then as listed — and the rest as
350
+ * listed. When any module is pinned, unpinned modules go to the catalogue. When the bar cannot
351
+ * hold every candidate, one slot goes to the "All modules" button. Modules named in `keep` (the
352
+ * current module, the module an adjacent panel shows) stay on the bar whatever their pin or
353
+ * position, displacing the last module that is not kept.
354
+ * @param {ModuleItem[]} items Modules.
355
+ * @param {number} [capacity=Infinity] Slots the bar has room for, the button included.
356
+ * @param {Array<string|number|null|undefined>|string|number|null} [keep=[]] Module ids that must stay visible.
357
+ * @param {boolean} [reserve=false] Keep a slot for the button even when every module fits.
358
+ * @returns {{visible: ModuleItem[], overflow: ModuleItem[], more: boolean}}
359
+ */
360
+ export declare function partitionModules(items: ModuleItem[], capacity?: number, keep?: Array<string | number | null | undefined> | string | number | null, reserve?: boolean): {
361
+ visible: ModuleItem[];
362
+ overflow: ModuleItem[];
363
+ more: boolean;
364
+ };
365
+ /**
366
+ * Resolves a module's identity colour: a valid CSS `color` wins, then a known `tone`.
367
+ * @param {{tone?: unknown, color?: unknown}} item Module.
368
+ * @returns {{tone: ModuleTone|null, color: string|null}}
369
+ */
370
+ export declare function resolveModuleColor(item: {
371
+ tone?: unknown;
372
+ color?: unknown;
373
+ }): {
374
+ tone: ModuleTone | null;
375
+ color: string | null;
376
+ };
377
+ /**
378
+ * Modules are one level: a section contributes its modules, and remembers itself as their heading.
379
+ * @param {AppNavItem[]} items Normalized items.
380
+ * @param {Map<string, string>} [sections] Filled with each sectioned module's heading.
381
+ * @param {string|null} [heading=null] The section being lifted.
382
+ * @returns {AppNavItem[]}
383
+ */
384
+ export declare function liftSections(items: AppNavItem[], sections?: Map<string, string>, heading?: string | null): AppNavItem[];
385
+ /**
386
+ * The top-level module that is, or contains, an id.
387
+ * @param {AppNavItem[]} items Modules.
388
+ * @param {string|number|null|undefined} id Destination id.
389
+ * @returns {AppNavItem|null}
390
+ */
391
+ export declare function moduleOf(items: AppNavItem[], id: string | number | null | undefined): AppNavItem | null;
392
+ /** Fired when a module without a menu, a menu item, or (with `menus: 'none'`) any module is activated. @event ModuleBar#select @type {CustomEvent<AppNavSelectDetail>} */
393
+ /** Fired when a module's flyout opens or closes. @event ModuleBar#flyoutchange @type {CustomEvent<{item: AppNavItem, id: string|number, open: boolean}>} */
394
+ /** Fired when the modules on the bar change because of space, pins, or the current module. @event ModuleBar#overflowchange @type {CustomEvent<{visible: Array<string|number>, overflow: Array<string|number>}>} */
395
+ /** Fired when the "All modules" catalogue opens or closes. @event ModuleBar#allmodules @type {CustomEvent<{open: boolean}>} */
@@ -138,9 +138,23 @@ export type PaginationChangeDetail = PaginationState;
138
138
  /** @typedef {PaginationState} PaginationChangeDetail */
139
139
  /**
140
140
  * The pager for a server-backed list. It owns no data: it reports which slice the user asked for
141
- * and lets the application fetch it, which is exactly the shape `zeyosTable()` expects —
142
- * `offset`/`pageSize` for `load()` in `pages` mode, or one `change` per `loadMore()` in
143
- * `loadmore` mode.
141
+ * — `page`, `pageSize`, and the zero-based row `offset = (page - 1) * pageSize` — and lets the
142
+ * application fetch it.
143
+ *
144
+ * The pager is one-based and defaults to 25 rows per page. The ZeyOS bindings are zero-based,
145
+ * default to 50 rows, and append pages above zero unless told to replace, so connecting the two
146
+ * takes a small mapping rather than a direct hand-off:
147
+ *
148
+ * ```js
149
+ * const binding = zeyosTable(client, 'contacts', { pageSize: 25 });
150
+ * const pager = new Pagination(host, { pageSize: binding.pageSize });
151
+ * pager.on('change', async ({ detail }) => {
152
+ * const result = await binding.load({ page: detail.page - 1, pageSize: detail.pageSize, replace: true });
153
+ * pager.setTotal(result.count ?? 0);
154
+ * });
155
+ * ```
156
+ *
157
+ * In `loadmore` mode each `change` stands for one `binding.loadMore()`, which appends.
144
158
  *
145
159
  * `page` is clamped into `[1, pages]` after every state change, so shrinking `total` under the
146
160
  * user's feet can never leave the pager pointing past the end of the data.
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Accepts an item colour for an inline custom property: a CSS colour literal (`#0b7285`, `rgb(…)`,
3
+ * `oklch(…)`, a named colour) or a reference to a design token (`var(--zx-color-tone-blue-fg)`),
4
+ * so an item can follow the theme rather than fix one colour for light and dark alike. Anything
5
+ * else — other functions, declarations, a `var()` with a fallback — is refused.
6
+ *
7
+ * Shared by `Select.entity()` and `TagPicker`, the two components that take a colour per item.
8
+ *
9
+ * @param {unknown} value Candidate colour.
10
+ * @returns {string|null} The trimmed colour, or null when the value is not one.
11
+ */
12
+ export declare function itemColor(value: unknown): string | null;
@@ -0,0 +1,124 @@
1
+ export type StatusIndicator = 'dotted' | 'ring' | 'progress' | 'review' | 'ready' | 'waiting' | 'done' | 'canceled' | 'duplicate';
2
+ export type StatusTone = 'muted' | 'neutral' | 'warning' | 'info' | 'accent' | 'success' | 'danger';
3
+ export type StatusId = 'backlog' | 'todo' | 'in-progress' | 'in-review' | 'review' | 'ready' | 'waiting' | 'done' | 'canceled' | 'cancelled' | 'duplicate';
4
+ export type StatusIconOptions = {
5
+ /**
6
+ * Shape, overriding the status's own.
7
+ */
8
+ indicator?: StatusIndicator;
9
+ /**
10
+ * Colour, overriding the status's own.
11
+ */
12
+ tone?: StatusTone;
13
+ /**
14
+ * Accessible name. Without one the glyph is decorative
15
+ * (`aria-hidden`) and must sit beside text, or inside a control with a tooltip, that says the
16
+ * status.
17
+ */
18
+ label?: string | null;
19
+ };
20
+ export type PriorityIconOptions = {
21
+ /**
22
+ * Accessible name. Without one the glyph is decorative
23
+ * (`aria-hidden`) and must sit beside text, or inside a control with a tooltip, that says the
24
+ * priority.
25
+ */
26
+ label?: string | null;
27
+ };
28
+ /**
29
+ * The shapes a workflow-status glyph can take. Each status reads by shape first and colour
30
+ * second, so the set stays legible to readers who do not see the colour.
31
+ * @typedef {'dotted'|'ring'|'progress'|'review'|'ready'|'waiting'|'done'|'canceled'|'duplicate'} StatusIndicator
32
+ */
33
+ /** @typedef {'muted'|'neutral'|'warning'|'info'|'accent'|'success'|'danger'} StatusTone */
34
+ /**
35
+ * The built-in workflow statuses. `review` and `cancelled` are accepted as spellings of
36
+ * `in-review` and `canceled`.
37
+ * @typedef {'backlog'|'todo'|'in-progress'|'in-review'|'review'|'ready'|'waiting'|'done'|'canceled'|'cancelled'|'duplicate'} StatusId
38
+ */
39
+ /**
40
+ * @typedef {Object} StatusIconOptions
41
+ * @property {StatusIndicator} [indicator] Shape, overriding the status's own.
42
+ * @property {StatusTone} [tone] Colour, overriding the status's own.
43
+ * @property {string|null} [label=null] Accessible name. Without one the glyph is decorative
44
+ * (`aria-hidden`) and must sit beside text, or inside a control with a tooltip, that says the
45
+ * status.
46
+ */
47
+ /**
48
+ * @typedef {Object} PriorityIconOptions
49
+ * @property {string|null} [label=null] Accessible name. Without one the glyph is decorative
50
+ * (`aria-hidden`) and must sit beside text, or inside a control with a tooltip, that says the
51
+ * priority.
52
+ */
53
+ /** Every shape `statusIcon()` draws. */
54
+ export declare const STATUS_INDICATORS: readonly string[];
55
+ /** Every colour a status glyph takes, from the semantic set. */
56
+ export declare const STATUS_TONES: readonly string[];
57
+ /**
58
+ * The built-in statuses in workflow order, as `[id, message key, English name, indicator, tone]`.
59
+ * `Select.status()` lists them; `statusIcon()` draws them.
60
+ */
61
+ export declare const DEFAULT_STATUSES: readonly string[][];
62
+ /** The top priority level, the one coloured level: a danger square with an exclamation mark. */
63
+ export declare const PRIORITY_URGENT = 4;
64
+ /**
65
+ * Resolves the shape and colour of a status glyph.
66
+ *
67
+ * A status is a built-in id (or one of its other spellings), or a status item of the kind
68
+ * `Select.status({items})` takes, whose own `indicator` and `tone` win over the built-in status
69
+ * its `ID` names. Options win over both. An unknown shape falls back to the empty ring and an
70
+ * unknown colour to muted, as `Select.status()` does with a custom item.
71
+ * @param {StatusId|string|{ID?: unknown, id?: unknown, indicator?: unknown, tone?: unknown}|null|undefined} status
72
+ * @param {StatusIconOptions} [options={}] Overrides.
73
+ * @returns {{indicator: StatusIndicator, tone: StatusTone}}
74
+ */
75
+ export declare function resolveStatusGlyph(status: StatusId | string | {
76
+ ID?: unknown;
77
+ id?: unknown;
78
+ indicator?: unknown;
79
+ tone?: unknown;
80
+ } | null | undefined, options?: StatusIconOptions): {
81
+ indicator: StatusIndicator;
82
+ tone: StatusTone;
83
+ };
84
+ /**
85
+ * Maps a status id to its built-in spelling: trimmed, lower-cased, and `review` / `cancelled`
86
+ * read as `in-review` / `canceled`.
87
+ * @param {unknown} id Status id.
88
+ * @returns {string}
89
+ */
90
+ export declare function normalizeStatusId(id: unknown): string;
91
+ /**
92
+ * Settles a priority level: an integer from 0 (lowest) to 4 (highest), or `null` for no priority.
93
+ * Out-of-range numbers clamp; anything that is not a number reads as 0.
94
+ * @param {unknown} level Priority level.
95
+ * @returns {number|null}
96
+ */
97
+ export declare function normalizePriorityLevel(level: unknown): number | null;
98
+ /**
99
+ * Draws the workflow-status glyph `Select.status()` shows, for a list row, a board column, a
100
+ * filter chip, or a heading — so every place a status appears reads as the picker that changes it.
101
+ *
102
+ * Built-in statuses: `backlog` (dotted ring), `todo` (empty ring), `in-progress` (ring with a
103
+ * centre dot), `in-review` (half filled; also `review`), `ready` (a third filled), `waiting` (two
104
+ * thirds filled), `done` (filled, with a check), `canceled` (filled, with a cross; also
105
+ * `cancelled`), and `duplicate` (ring with a slash). Colour only repeats what the shape says.
106
+ * @param {StatusId|string|{ID?: unknown, indicator?: unknown, tone?: unknown}} status Built-in id,
107
+ * or a status item with its own `indicator` and `tone`.
108
+ * @param {StatusIconOptions} [options={}] Shape, colour, and accessible-name overrides.
109
+ * @returns {HTMLSpanElement} A `.zx-status-icon` element, decorative unless `label` is given.
110
+ */
111
+ export declare function statusIcon(status: StatusId | string | {
112
+ ID?: unknown;
113
+ indicator?: unknown;
114
+ tone?: unknown;
115
+ }, options?: StatusIconOptions): HTMLSpanElement;
116
+ /**
117
+ * Draws the priority glyph `Select.priority()` shows. Levels 0–3 are four signal bars in muted
118
+ * ink, filled up to the level; level 4, the highest, is a filled danger square whose "!" the
119
+ * stylesheet draws, so it never joins the text beside it; no priority (`null`) is a row of dashes.
120
+ * @param {number|null} level Priority level, 0 (lowest) to 4 (highest), or `null` for none.
121
+ * @param {PriorityIconOptions} [options={}] Accessible-name option.
122
+ * @returns {HTMLSpanElement} A `.zx-priority-icon` element, decorative unless `label` is given.
123
+ */
124
+ export declare function priorityIcon(level: number | null, options?: PriorityIconOptions): HTMLSpanElement;
@@ -147,7 +147,9 @@ export type EntitySelectOptions = {
147
147
  */
148
148
  iconKey?: string | ((item: SelectItem) => unknown);
149
149
  /**
150
- * Optional icon colour reader.
150
+ * Optional icon colour reader: a CSS
151
+ * colour or a token reference such as `var(--zx-color-tone-blue-fg)`. Without one the glyph is a
152
+ * neutral tile in muted ink.
151
153
  */
152
154
  colorKey?: string | ((item: SelectItem) => unknown);
153
155
  /**
@@ -214,6 +216,7 @@ export declare class Select extends Component<SelectOptions> {
214
216
  _createdRoot: boolean;
215
217
  _root: HTMLElement;
216
218
  _snapshot: import("../../core/dom.js").TargetSnapshot;
219
+ _pointerModality: boolean;
217
220
  _handleTypeahead: (event: KeyboardEvent | string) => void;
218
221
  static cssName: string;
219
222
  /** @type {SelectOptions} */
@@ -224,6 +227,12 @@ export declare class Select extends Component<SelectOptions> {
224
227
  get value(): unknown;
225
228
  /** @param {unknown} id Selected item ID. */
226
229
  set value(id: unknown);
230
+ /**
231
+ * Returns the selected item ID, or null: the same as reading `value`, under the `get()`/`set()`
232
+ * pair the other value components share.
233
+ * @returns {unknown}
234
+ */
235
+ get(): unknown;
227
236
  /** Selected item, or null. @returns {SelectItem|null} */
228
237
  get selected(): SelectItem | null;
229
238
  /**
@@ -267,9 +276,14 @@ export declare class Select extends Component<SelectOptions> {
267
276
  /** Moves focus to the combobox input. @returns {this} */
268
277
  focus(): this;
269
278
  /**
270
- * Creates the five-level priority preset.
279
+ * Creates the five-level priority preset: values 0 (lowest) to 4 (highest), each drawn as grey
280
+ * signal bars filled to its level, except the highest, which is the one coloured level — a
281
+ * danger square with an exclamation mark. A "No priority" row (value null, a row of dashes)
282
+ * heads the list and labels the empty control; `clearable: false` removes it.
271
283
  * @param {Element|string|null} target Component target.
272
- * @param {SelectOptions} [options={}] Select overrides other than fixed items and renderer.
284
+ * @param {SelectOptions} [options={}] Select overrides other than items and renderers.
285
+ * `clearable` defaults to true here; `noneLabel` and `placeholder` default to the
286
+ * `priority.none` message ("No priority").
273
287
  * @returns {Select}
274
288
  */
275
289
  static priority(target: Element | string | null, options?: SelectOptions): Select;
@@ -172,6 +172,8 @@ export type SheetOptions = {
172
172
  export declare class Sheet extends Dialog {
173
173
  #private;
174
174
  _dock: any;
175
+ /** @type {Element|null} The element focus was on when the current `open()` began. */
176
+ _openedFrom: Element | null;
175
177
  static cssName: string;
176
178
  /** @type {Readonly<SheetOptions>} */
177
179
  static defaults: Readonly<SheetOptions>;
@@ -229,6 +231,19 @@ export declare class Sheet extends Dialog {
229
231
  * @returns {void}
230
232
  */
231
233
  _rehost(): void;
234
+ /**
235
+ * Describes the presentation for the overlay stack. A docked sheet is part of the layout and
236
+ * stays off it.
237
+ *
238
+ * Escape and outside-click are free for a modal dialog and absent for a non-modal one — the
239
+ * browser only wires `cancel` for `showModal()`, and there is no `::backdrop` to click — so a
240
+ * floating non-modal sheet takes both from the stack. That is what makes it aware of what it
241
+ * opened: Escape reaches it only once no popup above it takes the key, and a press inside a menu
242
+ * anchored in the sheet counts as inside the sheet, wherever the menu's panel lives.
243
+ * @returns {import('../../core/overlay-stack.js').OverlayEntryOptions|null}
244
+ * @protected
245
+ */
246
+ protected _overlayEntry(): import('../../core/overlay-stack.js').OverlayEntryOptions | null;
232
247
  /**
233
248
  * Opens the sheet, trapping focus first where the modality asks for it.
234
249
  * @returns {this}