@zeyos/zx 4.3.0 → 4.4.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 (136) hide show
  1. package/CHANGELOG.md +266 -1
  2. package/README.md +7 -3
  3. package/dist/types/components/activity-item/activity-item.d.ts +351 -0
  4. package/dist/types/components/activity-list/activity-list.d.ts +195 -0
  5. package/dist/types/components/app-sidebar/app-sidebar.d.ts +28 -0
  6. package/dist/types/components/button/button.d.ts +8 -0
  7. package/dist/types/components/calendar/calendar-model.d.ts +22 -0
  8. package/dist/types/components/calendar/calendar.d.ts +19 -0
  9. package/dist/types/components/card/card.d.ts +7 -0
  10. package/dist/types/components/card-view/card-view.d.ts +12 -4
  11. package/dist/types/components/card-view/record-card.d.ts +53 -5
  12. package/dist/types/components/code-editor/code-editor.d.ts +160 -0
  13. package/dist/types/components/code-editor/field-adapter.d.ts +5 -0
  14. package/dist/types/components/context-menu/context-menu.d.ts +18 -2
  15. package/dist/types/components/date-picker/date-picker.d.ts +8 -0
  16. package/dist/types/components/date-picker/time-picker.d.ts +7 -0
  17. package/dist/types/components/dialog/dialog.d.ts +29 -0
  18. package/dist/types/components/entity-ref/entity-ref.d.ts +331 -0
  19. package/dist/types/components/file-item/file-item.d.ts +234 -0
  20. package/dist/types/components/file-list/file-list.d.ts +171 -0
  21. package/dist/types/components/filter/filter.d.ts +91 -36
  22. package/dist/types/components/filter-panel/filter-panel.d.ts +449 -0
  23. package/dist/types/components/kanban-view/kanban-card.d.ts +138 -0
  24. package/dist/types/components/kanban-view/kanban-policy.d.ts +268 -0
  25. package/dist/types/components/kanban-view/kanban-view.d.ts +837 -26
  26. package/dist/types/components/launcher/launcher.d.ts +19 -12
  27. package/dist/types/components/list-toolbar/list-toolbar.d.ts +599 -0
  28. package/dist/types/components/menu-button/menu-button.d.ts +4 -37
  29. package/dist/types/components/message/message.d.ts +7 -0
  30. package/dist/types/components/modal/modal.d.ts +48 -0
  31. package/dist/types/components/navigation-bar/navigation-bar.d.ts +105 -21
  32. package/dist/types/components/panel/panel.d.ts +7 -0
  33. package/dist/types/components/search/search.d.ts +7 -0
  34. package/dist/types/components/select/select.d.ts +4 -0
  35. package/dist/types/components/sort-control/sort-control.d.ts +105 -0
  36. package/dist/types/components/stat-tile/stat-tile.d.ts +277 -0
  37. package/dist/types/components/tabbox/tabbox.d.ts +7 -0
  38. package/dist/types/components/table/table.d.ts +144 -0
  39. package/dist/types/components/table-view/table-view.d.ts +11 -5
  40. package/dist/types/components/timebox/timebox.d.ts +7 -0
  41. package/dist/types/components/value-list/value-list.d.ts +8 -0
  42. package/dist/types/components/view/record-view.d.ts +96 -5
  43. package/dist/types/core/component.d.ts +6 -1
  44. package/dist/types/core/icons.d.ts +17 -0
  45. package/dist/types/index.d.ts +13 -1
  46. package/dist/types/internal/app-rail.d.ts +10 -0
  47. package/dist/types/internal/menu-items.d.ts +134 -0
  48. package/dist/zx-zeyos.esm.js +651 -88
  49. package/dist/zx-zeyos.esm.min.js +8 -1
  50. package/dist/zx.css +6266 -3900
  51. package/dist/zx.esm.js +8487 -1805
  52. package/dist/zx.esm.min.js +10 -3
  53. package/dist/zx.global.js +8487 -1805
  54. package/dist/zx.global.min.js +10 -3
  55. package/dist/zx.min.css +1 -1
  56. package/docs/api.json +1811 -247
  57. package/docs/llms.md +345 -40
  58. package/docs/llms.txt +11 -7
  59. package/package.json +1 -2
  60. package/src/components/activity-item/activity-item.css +137 -0
  61. package/src/components/activity-item/activity-item.js +599 -0
  62. package/src/components/activity-list/activity-list.css +64 -0
  63. package/src/components/activity-list/activity-list.js +375 -0
  64. package/src/components/app-rail/app-rail.css +227 -19
  65. package/src/components/app-sidebar/app-sidebar.css +414 -24
  66. package/src/components/app-sidebar/app-sidebar.js +65 -5
  67. package/src/components/button/button.css +8 -0
  68. package/src/components/button/button.js +6 -1
  69. package/src/components/calendar/calendar-model.js +45 -0
  70. package/src/components/calendar/calendar.css +30 -10
  71. package/src/components/calendar/calendar.js +41 -13
  72. package/src/components/card/card.js +12 -1
  73. package/src/components/card-view/card-view.css +212 -9
  74. package/src/components/card-view/card-view.js +32 -16
  75. package/src/components/card-view/record-card.js +98 -21
  76. package/src/components/code-editor/code-editor.css +67 -0
  77. package/src/components/code-editor/code-editor.js +288 -0
  78. package/src/components/code-editor/field-adapter.js +34 -0
  79. package/src/components/context-menu/context-menu.css +80 -3
  80. package/src/components/context-menu/context-menu.js +22 -30
  81. package/src/components/date-picker/date-picker.js +22 -8
  82. package/src/components/date-picker/month-picker.js +3 -3
  83. package/src/components/date-picker/time-picker.js +20 -8
  84. package/src/components/dialog/dialog.js +88 -66
  85. package/src/components/dropdown/dropdown.js +2 -2
  86. package/src/components/entity-ref/entity-ref.css +182 -0
  87. package/src/components/entity-ref/entity-ref.js +496 -0
  88. package/src/components/file-item/file-item.css +88 -0
  89. package/src/components/file-item/file-item.js +371 -0
  90. package/src/components/file-list/file-list.css +51 -0
  91. package/src/components/file-list/file-list.js +320 -0
  92. package/src/components/filter/filter.css +27 -1
  93. package/src/components/filter/filter.js +199 -45
  94. package/src/components/filter-panel/filter-panel.css +104 -0
  95. package/src/components/filter-panel/filter-panel.js +964 -0
  96. package/src/components/kanban-view/kanban-card.js +239 -0
  97. package/src/components/kanban-view/kanban-policy.js +412 -0
  98. package/src/components/kanban-view/kanban-view.css +674 -36
  99. package/src/components/kanban-view/kanban-view.js +1762 -240
  100. package/src/components/launcher/launcher.js +59 -27
  101. package/src/components/list-toolbar/list-toolbar.css +189 -0
  102. package/src/components/list-toolbar/list-toolbar.js +851 -0
  103. package/src/components/menu-button/menu-button.css +80 -3
  104. package/src/components/menu-button/menu-button.js +21 -37
  105. package/src/components/message/message.css +14 -12
  106. package/src/components/message/message.js +13 -2
  107. package/src/components/modal/modal.css +15 -0
  108. package/src/components/modal/modal.js +141 -0
  109. package/src/components/navigation-bar/navigation-bar.css +77 -2
  110. package/src/components/navigation-bar/navigation-bar.js +171 -4
  111. package/src/components/panel/panel.js +13 -2
  112. package/src/components/search/search.js +17 -5
  113. package/src/components/select/field-adapter.js +4 -1
  114. package/src/components/select/select.js +3 -0
  115. package/src/components/sort-control/sort-control.css +17 -0
  116. package/src/components/sort-control/sort-control.js +140 -0
  117. package/src/components/stat-tile/stat-tile.css +213 -0
  118. package/src/components/stat-tile/stat-tile.js +590 -0
  119. package/src/components/tabbox/tabbox.js +12 -1
  120. package/src/components/table/table.css +51 -2
  121. package/src/components/table/table.js +298 -19
  122. package/src/components/table-view/table-view.css +8 -2
  123. package/src/components/table-view/table-view.js +21 -6
  124. package/src/components/tag-picker/tag-picker.css +3 -1
  125. package/src/components/timebox/timebox.js +18 -5
  126. package/src/components/value-list/value-list.js +22 -6
  127. package/src/components/view/record-view.css +5 -0
  128. package/src/components/view/record-view.js +100 -7
  129. package/src/core/component.js +8 -3
  130. package/src/core/icons.js +74 -5
  131. package/src/index.js +33 -3
  132. package/src/internal/app-rail.js +19 -1
  133. package/src/internal/menu-items.js +142 -0
  134. package/styles/print.css +192 -0
  135. package/styles/zx.css +11 -0
  136. package/DESIGN-SYSTEM.md +0 -182
@@ -62,6 +62,35 @@ export type ViewSort = {
62
62
  */
63
63
  dir: ViewSortDirection;
64
64
  };
65
+ export type ViewFieldControlsConfig = {
66
+ /**
67
+ * Trigger label. Omitted resolves `recordView.fields`, English `Fields`.
68
+ */
69
+ label?: string;
70
+ /**
71
+ * Element or selector the disclosure is mounted into
72
+ * instead of the view's own toolbar. An unresolvable target falls back to the view.
73
+ */
74
+ target?: Element | string | null;
75
+ };
76
+ export type ViewFieldControlsSettings = {
77
+ /**
78
+ * Whether a concrete view renders the chooser at all.
79
+ */
80
+ enabled: boolean;
81
+ /**
82
+ * Whether the option was given as a `ViewFieldControlsConfig` object.
83
+ */
84
+ custom: boolean;
85
+ /**
86
+ * Configured trigger label, or null to resolve the message.
87
+ */
88
+ label: string | null;
89
+ /**
90
+ * Configured mount point, before resolution.
91
+ */
92
+ target: Element | string | null;
93
+ };
65
94
  export type RecordViewState = {
66
95
  /**
67
96
  * State schema version.
@@ -118,9 +147,12 @@ export type RecordViewOptions = {
118
147
  */
119
148
  hiddenFields?: string[];
120
149
  /**
121
- * Whether concrete views show the shared field chooser.
150
+ * Whether concrete views show the
151
+ * shared field chooser. `true` renders it in the view's own toolbar and `false` omits it; a
152
+ * `ViewFieldControlsConfig` object renders the same control with a translated `label` and, with
153
+ * `target`, mounts it into a host element such as a list toolbar.
122
154
  */
123
- fieldControls?: boolean;
155
+ fieldControls?: boolean | ViewFieldControlsConfig;
124
156
  /**
125
157
  * Empty-result content.
126
158
  */
@@ -174,6 +206,21 @@ export type RecordViewOptions = {
174
206
  * @property {string} id Field id.
175
207
  * @property {ViewSortDirection} dir Sort direction.
176
208
  */
209
+ /**
210
+ * Trigger customisation for the shared field chooser. Passing this object in place of `true` keeps
211
+ * the control and its state model exactly as they are; only its wording and mount point change.
212
+ * @typedef {Object} ViewFieldControlsConfig
213
+ * @property {string} [label] Trigger label. Omitted resolves `recordView.fields`, English `Fields`.
214
+ * @property {Element|string|null} [target=null] Element or selector the disclosure is mounted into
215
+ * instead of the view's own toolbar. An unresolvable target falls back to the view.
216
+ */
217
+ /**
218
+ * @typedef {Object} ViewFieldControlsSettings
219
+ * @property {boolean} enabled Whether a concrete view renders the chooser at all.
220
+ * @property {boolean} custom Whether the option was given as a `ViewFieldControlsConfig` object.
221
+ * @property {string|null} label Configured trigger label, or null to resolve the message.
222
+ * @property {Element|string|null} target Configured mount point, before resolution.
223
+ */
177
224
  /**
178
225
  * @typedef {Object} RecordViewState
179
226
  * @property {1} version State schema version.
@@ -192,7 +239,10 @@ export type RecordViewOptions = {
192
239
  * @property {unknown[]} [selection=[]] Initially selected record ids.
193
240
  * @property {string[]} [fieldOrder=[]] Field ids in preferred order.
194
241
  * @property {string[]} [hiddenFields=[]] Initially hidden field ids.
195
- * @property {boolean} [fieldControls=true] Whether concrete views show the shared field chooser.
242
+ * @property {boolean|ViewFieldControlsConfig} [fieldControls=true] Whether concrete views show the
243
+ * shared field chooser. `true` renders it in the view's own toolbar and `false` omits it; a
244
+ * `ViewFieldControlsConfig` object renders the same control with a translated `label` and, with
245
+ * `target`, mounts it into a host element such as a list toolbar.
196
246
  * @property {string|Node|(() => string|Node)|null} [emptyText=null] Empty-result content.
197
247
  * @property {(event: CustomEvent<Record<string, unknown>>) => void} [onrecordclick]
198
248
  * @property {(event: CustomEvent<Record<string, unknown>>) => void} [onrecorddblclick]
@@ -226,6 +276,8 @@ export declare class RecordView extends Component<RecordViewOptions> {
226
276
  _viewSelectionAnchor: unknown;
227
277
  _viewFieldControls: HTMLElement;
228
278
  _viewFieldList: HTMLElement;
279
+ _viewFieldSettings: ViewFieldControlsSettings;
280
+ _viewFieldControlsTarget: Element;
229
281
  _viewInitialized: boolean;
230
282
  static cssName: string;
231
283
  /** @type {Readonly<RecordViewOptions>} */
@@ -384,10 +436,42 @@ export declare class RecordView extends Component<RecordViewOptions> {
384
436
  /**
385
437
  * Builds the shared show/hide and ordering disclosure for a concrete view toolbar.
386
438
  * @protected
387
- * @param {string} [label='Fields'] Trigger label.
439
+ * @param {string|null} [label=null] Explicit trigger label. Omitted resolves the configured
440
+ * `fieldControls.label` and then the `recordView.fields` message.
388
441
  * @returns {HTMLElement} Disclosure element.
389
442
  */
390
- protected _createViewFieldControls(label?: string): HTMLElement;
443
+ protected _createViewFieldControls(label?: string | null): HTMLElement;
444
+ /**
445
+ * Builds the shared field disclosure and mounts it where `fieldControls` asks for it: the host
446
+ * element named by `target`, or the view's own toolbar when no target resolves.
447
+ * @protected
448
+ * @param {Element} toolbar The view's own toolbar.
449
+ * @param {string|null} [label=null] Explicit trigger label, for views that own their wording.
450
+ * @returns {HTMLElement} The mounted disclosure.
451
+ */
452
+ protected _mountViewFieldControls(toolbar: Element, label?: string | null): HTMLElement;
453
+ /**
454
+ * Removes the shared field disclosure from wherever it was mounted. An external `target` keeps
455
+ * every node it had before the view was created.
456
+ * @protected
457
+ * @returns {void}
458
+ */
459
+ protected _removeViewFieldControls(): void;
460
+ /**
461
+ * Resolves the field-chooser trigger label: the configured one, else the translated message.
462
+ * @protected
463
+ * @returns {string} Trigger label.
464
+ */
465
+ protected _viewFieldControlsLabel(): string;
466
+ /**
467
+ * Resolves a message through the host translator, falling back to the built-in English text.
468
+ * @protected
469
+ * @param {string} key Message key.
470
+ * @param {string} fallback Built-in text, with `%1`-style placeholders.
471
+ * @param {...unknown} args Interpolation values.
472
+ * @returns {string} Translated or built-in text.
473
+ */
474
+ protected _message(key: string, fallback: string, ...args: unknown[]): string;
391
475
  /** Concrete renderers override this hook. @protected @param {string} _reason Refresh reason. @returns {void} */
392
476
  protected _refreshView(_reason: string): void;
393
477
  /** Reads one record's stable id. @protected @param {ViewRecord} record Record. @returns {unknown} */
@@ -407,6 +491,13 @@ export declare class RecordView extends Component<RecordViewOptions> {
407
491
  /** @private @param {string|null} [focusId=null] @returns {void} */
408
492
  private _renderViewFieldControls;
409
493
  }
494
+ /**
495
+ * Reads the `fieldControls` option in its three shapes. `true` and `false` keep their exact
496
+ * meaning; an object additionally carries the trigger label and the host element to mount into.
497
+ * @param {boolean|ViewFieldControlsConfig|null|undefined} value Raw option value.
498
+ * @returns {ViewFieldControlsSettings} Normalized settings.
499
+ */
500
+ export declare function normalizeViewFieldControls(value: boolean | ViewFieldControlsConfig | null | undefined): ViewFieldControlsSettings;
410
501
  /**
411
502
  * Validates and clones field descriptors.
412
503
  * @param {ViewField[]} fields Fields.
@@ -73,10 +73,15 @@ export declare class Component<TOptions extends ComponentOptions = ComponentOpti
73
73
  * Dispatches a component event and a bubbling, composed `zx-*` DOM event.
74
74
  * @param {string} type Lowercase event name.
75
75
  * @param {Record<string, unknown>} [detail={}] Single event detail object.
76
+ * @param {{honorDomCancellation?:boolean}} [options={}] Mirrored DOM-event behavior. Components
77
+ * with a cancelable mutation boundary may opt into treating `preventDefault()` on the bubbling
78
+ * `zx-*` event exactly like cancellation of the component event.
76
79
  * @returns {Event & {detail: Record<string, unknown>}}
77
80
  * @fires Component#event
78
81
  */
79
- emit(type: string, detail?: Record<string, unknown>): Event & {
82
+ emit(type: string, detail?: Record<string, unknown>, options?: {
83
+ honorDomCancellation?: boolean;
84
+ }): Event & {
80
85
  detail: Record<string, unknown>;
81
86
  };
82
87
  /**
@@ -33,6 +33,12 @@ export type IconOptions = {
33
33
  * Adds Font Awesome's `fa-fw` for column-aligned glyphs.
34
34
  */
35
35
  fixedWidth?: boolean;
36
+ /**
37
+ * Throws `RangeError` on a name the bundled glyph set does not
38
+ * carry, instead of returning the placeholder. For call sites that can afford to fail — a test,
39
+ * a build-time check — rather than a screen rendering server data.
40
+ */
41
+ strict?: boolean;
36
42
  };
37
43
  /**
38
44
  * @typedef {Object} IconOptions
@@ -42,6 +48,9 @@ export type IconOptions = {
42
48
  * @property {string} [style] Font Awesome style for this icon only (`'solid'`, `'duotone'`, …).
43
49
  * @property {string} [family] Font Awesome family for this icon only (`'classic'`, `'sharp'`, …).
44
50
  * @property {boolean} [fixedWidth] Adds Font Awesome's `fa-fw` for column-aligned glyphs.
51
+ * @property {boolean} [strict=false] Throws `RangeError` on a name the bundled glyph set does not
52
+ * carry, instead of returning the placeholder. For call sites that can afford to fail — a test,
53
+ * a build-time check — rather than a screen rendering server data.
45
54
  */
46
55
  /**
47
56
  * Icon glyphs from Font Awesome Free 6 (solid, plus `square` from regular), fontawesome.com,
@@ -130,8 +139,16 @@ export declare function iconNames(): string[];
130
139
  * its renderer itself — `'fa:user'`, `'duotone:user'`, `'kit:zeyos-notes'`, `'builtin:check'`, or
131
140
  * a literal Font Awesome class list such as `'fa-solid fa-user'`.
132
141
  *
142
+ * **A name this cannot resolve never throws.** Icon names routinely arrive from a server, and one
143
+ * unconfigured name must not take down the screen it appears on. An inline glyph the bundled set
144
+ * does not carry renders as the placeholder described in `missingIcon()` and is reported once per
145
+ * distinct name through `console.warn`; pass `{ strict: true }` to get a `RangeError` instead.
146
+ * Only the inline-SVG path can fail this way: Font Awesome resolves names in the browser at render
147
+ * time, so a name under a loaded kit or stylesheet is never "unknown" here and never warns.
148
+ *
133
149
  * @param {string} name Icon name or spec.
134
150
  * @param {IconOptions} [options={}] Display and accessibility options.
135
151
  * @returns {SVGSVGElement|HTMLElement} An `<svg>` for inline glyphs, an `<i>` for Font Awesome.
152
+ * @throws {RangeError} With `{ strict: true }` only, when the bundled set has no such glyph.
136
153
  */
137
154
  export declare function icon(name: string, options?: IconOptions): SVGSVGElement | HTMLElement;
@@ -34,10 +34,12 @@ export { stack, grid, aspect } from './components/layout/layout.js';
34
34
  export { truncate, isTruncated } from './components/truncate/truncate.js';
35
35
  export { copyButton } from './components/copy/copy-button.js';
36
36
  export { CopyInput } from './components/copy/copy-input.js';
37
+ export { CodeEditor, indentSelection, editorPosition } from './components/code-editor/code-editor.js';
37
38
  export { Toolbar } from './components/toolbar/toolbar.js';
38
39
  export { Toggle } from './components/toggle/toggle.js';
39
40
  export { Groupbox } from './components/groupbox/groupbox.js';
40
41
  export { Card } from './components/card/card.js';
42
+ export { StatTile, statTile } from './components/stat-tile/stat-tile.js';
41
43
  export { Aurora } from './components/aurora/aurora.js';
42
44
  export { Panel } from './components/panel/panel.js';
43
45
  export { MasterPanel } from './components/master-panel/master-panel.js';
@@ -52,6 +54,11 @@ export { Search } from './components/search/search.js';
52
54
  export { AppIcon, appIcon } from './components/app-icon/app-icon.js';
53
55
  export { Launcher, rankLauncherItems } from './components/launcher/launcher.js';
54
56
  export { Avatar, avatarInitials } from './components/avatar/avatar.js';
57
+ export { EntityRef, normalizeEntityRef, normalizeEntityRefLink, normalizeEntityRefMetadata, normalizeEntityRefActions } from './components/entity-ref/entity-ref.js';
58
+ export { FileItem, normalizeFileItem } from './components/file-item/file-item.js';
59
+ export { FileList, normalizeFileListItems } from './components/file-list/file-list.js';
60
+ export { ActivityItem, resolveActivityActions, normalizeActivityAction, normalizeActivityTimestamp } from './components/activity-item/activity-item.js';
61
+ export { ActivityList, groupActivityItems, normalizeActivityItems } from './components/activity-list/activity-list.js';
55
62
  export { AccountMenu } from './components/account-menu/account-menu.js';
56
63
  export { normalizeAppItems } from './internal/app-rail.js';
57
64
  export { AppSidebar } from './components/app-sidebar/app-sidebar.js';
@@ -78,17 +85,22 @@ export { DateRangePicker, clampRange, defaultDateRangePresets, normalizeRange, r
78
85
  export { DateRangeBox, formatRangeText, parseRangeText } from './components/datebox/date-range-box.js';
79
86
  export { Timebox, splitTime, joinTime } from './components/timebox/timebox.js';
80
87
  export { Calendar } from './components/calendar/calendar.js';
81
- export { CALENDAR_VIEWS, addCalendarDays, calendarDayDifference, calendarDayKey, calendarEventIntersects, calendarEventSpansDays, calendarRange, cloneCalendarEvent, layoutCalendarSpans, layoutTimedCalendarEvents, normalizeCalendarEvents, shiftCalendarEvent, startOfCalendarDay, startOfCalendarWeek } from './components/calendar/calendar-model.js';
88
+ export { CALENDAR_VIEWS, addCalendarDays, addCalendarMonths, calendarDayDifference, calendarDayKey, calendarEventIntersects, calendarEventSpansDays, calendarPageDate, calendarRange, cloneCalendarEvent, layoutCalendarSpans, layoutTimedCalendarEvents, normalizeCalendarEvents, shiftCalendarEvent, startOfCalendarDay, startOfCalendarWeek } from './components/calendar/calendar-model.js';
82
89
  export { RecordView, normalizeViewFields, reconcileFieldOrder, moveViewField, readViewField, renderViewField, sortViewRecords, normalizeViewState, viewRecordId } from './components/view/record-view.js';
83
90
  export { Table, reorderTableRows } from './components/table/table.js';
84
91
  export { TableView } from './components/table-view/table-view.js';
85
92
  export { CardView } from './components/card-view/card-view.js';
86
93
  export { KanbanView } from './components/kanban-view/kanban-view.js';
94
+ export { absoluteKanbanIndex, allowsKanbanTransition, createKanbanHistory, evaluateKanbanMove, kanbanSearchTerms, locateKanbanRecord, matchesKanbanSearch, normalizeKanbanRules, reorderKanbanRecords, resolveKanbanRules } from './components/kanban-view/kanban-policy.js';
95
+ export { createKanbanAvatars, createKanbanCardHead, createKanbanIndicator, createKanbanProgress, kanbanAvatarLimit, resolveKanbanAssignees, resolveKanbanIndicator, resolveKanbanProgress } from './components/kanban-view/kanban-card.js';
87
96
  export { Grid, billingColumns, isBillingLine } from './components/grid/grid.js';
88
97
  export { Chart, ChartJsAdapter, chartSummaryTable, cloneChartValue, isEmptyChartData } from './components/chart/chart.js';
89
98
  export { TreeView } from './components/tree/tree.js';
90
99
  export { Finder } from './components/finder/finder.js';
91
100
  export { DataFilter } from './components/data-filter/data-filter.js';
101
+ export { FilterPanel, isActiveValue, pruneValue, serializeFilterValue } from './components/filter-panel/filter-panel.js';
102
+ export { SortControl } from './components/sort-control/sort-control.js';
103
+ export { ListToolbar } from './components/list-toolbar/list-toolbar.js';
92
104
  export { Filter } from './components/filter/filter.js';
93
105
  export { filterOperators, emptyFilterAst, filterCondition, filterGroup, parseFilterAst, cloneFilterAst, stringifyFilterAst, validateFilterAst } from './components/filter/filter-model.js';
94
106
  export { Field } from './components/field/field.js';
@@ -238,6 +238,16 @@ export declare class AppRailPresenter extends Component<AppRailPresenterOptions>
238
238
  _syncActive(): void;
239
239
  /** @returns {void} */
240
240
  _clearArtifacts(): void;
241
+ /**
242
+ * Resolves one message through `msg()`, which falls back to the host translator. Copied from
243
+ * `Pagination` rather than invented: the rail's flyout label was the last user-visible string
244
+ * in the navigation stack with no way to change it.
245
+ * @param {string} key Message key.
246
+ * @param {string} fallback English default.
247
+ * @param {...unknown} args Interpolation arguments.
248
+ * @returns {string}
249
+ */
250
+ _message(key: string, fallback: string, ...args: unknown[]): string;
241
251
  }
242
252
  /** Owns listeners attached to one dynamic rail render so `setItems()` can release them immediately. */
243
253
  declare class RailListenerScope extends Component {
@@ -0,0 +1,134 @@
1
+ export type MenuItemRole = 'menuitem' | 'menuitemcheckbox' | 'menuitemradio';
2
+ export type MenuController = {
3
+ /**
4
+ * Close the owning menu.
5
+ */
6
+ close: () => unknown;
7
+ };
8
+ export type MenuItem = {
9
+ /**
10
+ * Item label.
11
+ */
12
+ label: string;
13
+ /**
14
+ * Kernel icon name.
15
+ */
16
+ icon?: string;
17
+ /**
18
+ * Value emitted on selection.
19
+ */
20
+ value?: unknown;
21
+ /**
22
+ * Whether selection is disabled.
23
+ */
24
+ disabled?: boolean;
25
+ /**
26
+ * Whether the action is dangerous.
27
+ */
28
+ danger?: boolean;
29
+ /**
30
+ * Native-link destination.
31
+ */
32
+ href?: string;
33
+ /**
34
+ * Native-link target.
35
+ */
36
+ target?: string;
37
+ /**
38
+ * Native-link relationship.
39
+ */
40
+ rel?: string;
41
+ /**
42
+ * Supporting text under the label.
43
+ */
44
+ description?: string;
45
+ /**
46
+ * Compact trailing metadata.
47
+ */
48
+ badge?: string | number;
49
+ /**
50
+ * Keyboard shortcut label.
51
+ */
52
+ shortcut?: string;
53
+ /**
54
+ * Additional trailing content.
55
+ */
56
+ adornment?: string | number | Node;
57
+ /**
58
+ * APG role.
59
+ */
60
+ role?: MenuItemRole;
61
+ /**
62
+ * Checked state for checkbox/radio roles.
63
+ */
64
+ checked?: boolean;
65
+ /**
66
+ * Selection callback.
67
+ */
68
+ onselect?: (value: unknown, item: MenuItem, controller: MenuController) => void;
69
+ };
70
+ export type MenuHeading = {
71
+ /**
72
+ * Entry kind.
73
+ */
74
+ type: 'heading';
75
+ /**
76
+ * Visible heading.
77
+ */
78
+ label: string;
79
+ };
80
+ export type MenuSeparator = {
81
+ type: 'separator';
82
+ };
83
+ export type MenuEntry = MenuItem | MenuHeading | MenuSeparator | '-';
84
+ /** @typedef {'menuitem'|'menuitemcheckbox'|'menuitemradio'} MenuItemRole */
85
+ /**
86
+ * @typedef {Object} MenuController
87
+ * @property {() => unknown} close Close the owning menu.
88
+ */
89
+ /**
90
+ * @typedef {Object} MenuItem
91
+ * @property {string} label Item label.
92
+ * @property {string} [icon] Kernel icon name.
93
+ * @property {unknown} [value] Value emitted on selection.
94
+ * @property {boolean} [disabled=false] Whether selection is disabled.
95
+ * @property {boolean} [danger=false] Whether the action is dangerous.
96
+ * @property {string} [href] Native-link destination.
97
+ * @property {string} [target] Native-link target.
98
+ * @property {string} [rel] Native-link relationship.
99
+ * @property {string} [description] Supporting text under the label.
100
+ * @property {string|number} [badge] Compact trailing metadata.
101
+ * @property {string} [shortcut] Keyboard shortcut label.
102
+ * @property {string|number|Node} [adornment] Additional trailing content.
103
+ * @property {MenuItemRole} [role='menuitem'] APG role.
104
+ * @property {boolean} [checked=false] Checked state for checkbox/radio roles.
105
+ * @property {(value: unknown, item: MenuItem, controller: MenuController) => void} [onselect]
106
+ * Selection callback.
107
+ */
108
+ /**
109
+ * @typedef {Object} MenuHeading
110
+ * @property {'heading'} type Entry kind.
111
+ * @property {string} label Visible heading.
112
+ */
113
+ /** @typedef {{type: 'separator'}} MenuSeparator */
114
+ /** @typedef {MenuItem|MenuHeading|MenuSeparator|'-'} MenuEntry */
115
+ export declare const MENU_ITEM_SELECTOR: string;
116
+ /**
117
+ * Reports whether an entry is an interactive menu action.
118
+ * @param {MenuEntry|unknown} entry Candidate entry.
119
+ * @returns {entry is MenuItem}
120
+ */
121
+ export declare function isMenuItem(entry: MenuEntry | unknown): entry is MenuItem;
122
+ /**
123
+ * Resolves the only APG roles accepted by the shared action model.
124
+ * @param {MenuItem} item Item definition.
125
+ * @returns {MenuItemRole}
126
+ */
127
+ export declare function menuItemRole(item: MenuItem): MenuItemRole;
128
+ /**
129
+ * Builds one menu's entries with shared structure and link safety.
130
+ * @param {MenuEntry[]} entries Entry definitions.
131
+ * @param {string} block CSS block name, without the `zx-` prefix.
132
+ * @returns {HTMLElement[]}
133
+ */
134
+ export declare function renderMenuEntries(entries: MenuEntry[], block: string): HTMLElement[];