@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
package/CHANGELOG.md CHANGED
@@ -8,6 +8,271 @@ and friends remain the complete record.
8
8
 
9
9
  ## Unreleased
10
10
 
11
+ ## 4.4.0 — 2026-09-22
12
+
13
+ A large release in two halves. The first adds capability: a dependency-free code editor, the
14
+ record primitives (`EntityRef`, `FileItem`/`FileList`, `ActivityItem`/`ActivityList`), kanban
15
+ movement and workflow policy, and richer action menus. The second is what building a real
16
+ application on the library found missing — group rows, list controls, a filter panel driven by
17
+ server metadata, a metric tile, and the long tail of strings a translated product could not
18
+ reach.
19
+
20
+ Nothing here is a breaking change. Every new option defaults to the previous behaviour, and every
21
+ English string a translator can now reach keeps its exact previous wording when no translator is
22
+ installed.
23
+
24
+ ### Added
25
+
26
+ - **Structured text no longer requires an editor dependency.** `CodeEditor` keeps source in a
27
+ native textarea with browser undo and IME behavior, adds Tab/Shift+Tab indentation, language
28
+ metadata, line/column feedback, read-only and disabled states, and a `code` Form field adapter.
29
+ It never executes or injects the value; rich HTML authoring remains a separate policy surface.
30
+ - **Reusable record primitives cover dense identity, files, and activity.** `EntityRef` presents
31
+ linked or static identity with labelled metadata and injected actions; `FileItem`/`FileList`
32
+ cover durable, temporary, waiting, progress, MIME, size, download, loading, and empty states;
33
+ `ActivityItem`/`ActivityList` cover actor, time, content, attachments, actions, stable grouping,
34
+ and incremental feed updates. Zx owns safe presentation and cancelable interaction boundaries;
35
+ applications retain routing, authorization, transport, posting, reactions, and persistence.
36
+ - **Action menus now carry business metadata without becoming free-form popovers.** MenuButton and
37
+ ContextMenu share headings, object separators, safe native links, descriptions, badges,
38
+ shortcuts, text/Node adornments, and checked/radio menu-item roles. Existing flat items and
39
+ `'-'` separators are unchanged.
40
+ - **Kanban cards carry the anatomy an operational board needs.** New read-only projections put an
41
+ `entityIcon` and `identifier` on a card head beside `status` and `priority` indicators, and a
42
+ `progress` meter and `assignees` avatars on a card footer. `priorityTones` and `statusTones` map
43
+ a value to a semantic tone as data rather than through a renderer, `progressMax` sets the
44
+ completion scale explicitly, and `maxAvatars` bounds the avatar stack. A board that sets none of
45
+ them renders exactly the card it rendered in 4.3.4.
46
+
47
+ - **`FilterPanel` — typed filters from server metadata.** Takes the `{key: {type, label,
48
+ options, min, max}}` map a list endpoint already publishes and returns a query object. Ten
49
+ field types including both range forms, multi-valued selects on `Checklist`, draft-then-apply
50
+ by default, and `serialize` for the Unix-seconds / ISO / epoch-ms question. `DataFilter`
51
+ filters a client-side row set and `Filter` builds an AST; this is the third shape, and the one
52
+ a data-driven application needs.
53
+ - **`ListToolbar` — the bar above a record view.** Search, a live result count, a view switch and
54
+ badged tools. A tool's badge is part of its accessible name rather than a second thing beside
55
+ it, `setCount(null)` clears the live region during a load, and `bind()` feature-detects a
56
+ `TableView`/`CardView` instead of importing it.
57
+ - **`StatTile` / `statTile()` — the labelled metric.** Formats through the core formatters, never
58
+ encodes "up is good" (`deltaKind` decides the colour, not the sign), marks its sparkline
59
+ `aria-hidden`, and picks `<a>` / `<button>` / `<div role="group">` from the behaviour it was
60
+ given rather than wrapping a click handler round a div.
61
+ - **`Table` group and section rows.** `rowKind` and `rowKinds` render a `<th scope="colgroup">`
62
+ spanning every rendered cell, including the selection and reorder columns. `CardView` has had
63
+ `groupBy`; `Table` had nothing, while `Grid.BillingItems()` already modelled the row kind for
64
+ editability and simply never drew it. Sort controls are withheld while a spanning row is
65
+ present, because sorting a grouped table scatters its positions out of their sections.
66
+ - **`ActivityItem.state`** — `pending` and `failed`, for an entry rendered optimistically before
67
+ its request resolves and for one whose send failed. An entry that disappears on failure tells
68
+ the reader their message was sent when nobody was told.
69
+
70
+ ### Changed
71
+
72
+ - **The move handle is no longer pointer furniture.** Since 4.3.4 the card itself is the drag
73
+ source, so the knob is decoration that competes with the card's content. The new
74
+ `moveHandle: 'keyboard' | 'always'` defaults to `keyboard`: the button stays in the DOM, in tab
75
+ order, and fully announced, but is clipped out of sight and out of the layout until it takes
76
+ focus or holds a grabbed card. `always` restores the 4.3.4 presentation, and `dragFrom: 'handle'`
77
+ keeps the handle visible regardless, since it is then the only thing a pointer user can grab.
78
+ - **An empty column now reads as a drop target.** `labels.columnEmpty` defaults to
79
+ "Drop a card here" in a dashed zone instead of an empty gap; `labels.columnEmpty: ''` restores
80
+ the previous blank column, and `renderColumnEmpty` still replaces it.
81
+ - **A field the card head or footer projects no longer repeats itself as a metadata row.** Set
82
+ `duplicate: true` on the field descriptor to show it in both places.
83
+
84
+ - **`fieldControls` accepts `{label, target}`** on `TableView`, `CardView` and `KanbanView`.
85
+ `true`/`false` are unchanged. The chooser's trigger can now be named, and mounted into a host
86
+ toolbar instead of the view's own — which is what made it usable in a translated product at
87
+ all.
88
+ - **`DialogButton.disabled`**, honoured by the constructor, `setButtons()` and per-view buttons,
89
+ and skipped by `autofocus`. `Sheet` inherits it. A form a client cannot render completely must
90
+ not be submittable, and until now the only way to show that was to reach into the rendered
91
+ footer.
92
+ - **Roughly ninety-six user-visible strings across sixteen components now route through
93
+ `_message()`**, which falls back to `translate()` — so installing a host translator is enough.
94
+ Most are `aria-label` and `title`, which is the half that does not show up in a screenshot: a
95
+ German application previously announced "Clear search", "Close message" and "Previous month" in
96
+ the middle of its own chrome, with no option to prevent it. Every English fallback is
97
+ byte-identical to the previous literal.
98
+ - **`Launcher` and `Filter` label options default to `null`** and resolve through the translator,
99
+ so an application that installs one and passes no labels gets a translated component. The
100
+ rendered words are unchanged without a translator.
101
+ - **`AppSidebar` visual pass.** A filled active pill with an edge marker and a weight change, so
102
+ nothing rests on colour alone; one spacing scale; a fixed icon gutter that collapses when no
103
+ item has an icon; labels that wrap and hyphenate rather than truncate; badges that survive
104
+ minimization as a dot with the number still in the accessible name. Options, events, methods,
105
+ DOM and the keyboard map are unchanged.
106
+ - **`NavigationBar` overflow is configurable.** `overflow: false` keeps every item at every
107
+ width; `overflowBelow` moves the collapse threshold; `minVisible: n` pins the first `n` items.
108
+ Defaults are unchanged — every item still collapses below 44 rem through the same container
109
+ query, with no observer installed. Collapsing all of a navigation into one button is right for
110
+ a top app bar and wrong for a phone bottom bar, and there was no way to say so.
111
+ - **A print stylesheet ships.** `styles/print.css`, imported last, releases sticky headers and
112
+ scroll containers, drops fills, shadows, zebra striping and focus rings, hides overlays and
113
+ navigation chrome, repeats table headers across pages, keeps cards and rows from breaking, and
114
+ prints link URLs in prose but never inside a table cell or on a button. Status badges keep
115
+ their colour, because there it carries meaning beside the word. An application that sets
116
+ `data-zx-theme="dark"` explicitly still prints dark text tokens; `auto` is unaffected.
117
+
118
+ ### Fixed
119
+
120
+ - **Context-menu selection could not be cancelled.** Preventing its `select` event now suppresses
121
+ the item callback and native link navigation and leaves the menu open, matching MenuButton.
122
+ - **The keyboard move handle could take focus while staying invisible.** It revealed itself on
123
+ `:focus-visible`, which does not match after pointer input — so the focus a committed pointer
124
+ drop moves onto the handle landed on a one-pixel control. It now reveals on `:focus`, and
125
+ `dragFrom: 'handle'` keeps the handle visible regardless of `moveHandle`.
126
+ - **A literal indicator descriptor rendered nothing.** `priority: {label: 'Blocked'}` was read as
127
+ a record property name and resolved `undefined`.
128
+ - **A blank progress label produced an unnamed progressbar.** An empty or whitespace label now
129
+ falls back to the localized default instead of becoming `aria-label=""`.
130
+ - **A fractional `maxAvatars` hid every face** while the overflow chip still counted from the raw
131
+ option. The faces and the chip now come from one normalization.
132
+ - **The card identifier named itself with `aria-label` on a `<span>`**, which the generic role
133
+ prohibits. Identifier and indicator prefixes are visually hidden text instead.
134
+ - **An assignee with an image but no name rendered an unidentifiable face.** Entries without a
135
+ name are now dropped rather than announced as "Assigned to ".
136
+ - **Board rendering rebuilt the whole field-descriptor array for every axis read.** A string
137
+ column or lane accessor was resolved through `getFields()` — which clones every descriptor —
138
+ once per record per column per lane. Descriptors are now indexed once per refresh.
139
+
140
+ - **`Modal` and `Dialog` place and restore focus.** Both have always built a native `<dialog>`
141
+ and opened it with `showModal()`, so focus containment, page inertness, Escape and the top
142
+ layer were the platform's — a reading of the source that greps for a focus trap and finds
143
+ none draws the wrong conclusion, and one did. What was genuinely missing is now there:
144
+ initial focus lands on the first focusable control inside the panel rather than on the panel,
145
+ focus returns to the opener on every close path including the non-native presentation, and
146
+ `aria-modal` is set while modal. `Sheet` keeps its own trap for the non-modal case and is not
147
+ double-trapped. Candidates inside a `hidden`, `aria-hidden` or `inert` subtree are now skipped,
148
+ so a dialog whose close button is suppressed focuses its first real control instead of nothing.
149
+ - **`icon()` no longer throws on a name it cannot resolve.** Icon names routinely arrive from a
150
+ server, and one unconfigured name should not take down the screen it appears on. An
151
+ unresolvable inline glyph renders an empty `<svg>` of the requested size — so layout does not
152
+ shift — carrying `data-zx-icon-missing="<name>"`, and reports itself once per distinct name.
153
+ `icon(name, { strict: true })` keeps the old `RangeError` for callers that can afford to fail.
154
+ Font Awesome paths are unaffected: a kit resolves names in the browser, so nothing under one
155
+ is "unknown" here and nothing warns.
156
+ - **The minimized rail's flyout matches the expanded sidebar.** The visual pass in this release
157
+ could not reach it — the panel is portaled into a `Dropdown`, so the sidebar's descendant
158
+ selectors do not apply to it. It now carries the same spacing scale, icon gutter, wrapping
159
+ labels and active-item treatment, derived from the same tokens. Fixing it surfaced a cascade
160
+ bug: `app-rail.css` is imported before `dropdown.css`, so the popover's own padding had never
161
+ won and the panel had been rendering with the generic overlay's.
162
+ - **One physical-direction declaration** remained in the component tree (`table.css`), plus four
163
+ asymmetric box shorthands that pin an edge physically. All are logical now, and a test scans
164
+ for both so the state is enforced rather than accidental.
165
+
166
+ ## 4.3.4 — 2026-08-31
167
+
168
+ ### Added
169
+
170
+ - **Kanban boards became workflow boards.** `KanbanView` now moves cards by pointer, touch,
171
+ keyboard, context menu, and public API through one policy and one commit path.
172
+ - **Pointer and touch dragging.** Native HTML5 drag-and-drop is replaced by Pointer Events, so
173
+ the same code path serves mouse, pen, and touch. A drag from the card body needs a small
174
+ travel (or a long press on touch, so the board still scrolls); a drag from the move handle
175
+ starts immediately. A floating drag preview follows the pointer, the board and any scrollable
176
+ column auto-scroll near their edges, and Escape aborts without moving anything.
177
+ `dragFrom: 'card' | 'handle'` chooses the drag source.
178
+ - **Atomic multi-card moves.** Picking up a card that belongs to the current multi-selection
179
+ moves the whole selection as one step, preserving relative order — one `recordmove`, one
180
+ policy decision, one history entry. `moveRecords(ids, destination)` is the public form.
181
+ - **Enforceable workflow policy.** Columns gain `laneLimits`, `wipPolicy`, and a `from`
182
+ transition allow-list; lanes gain `limit` and `from`. The board-level `wipPolicy` still
183
+ defaults to `'warn'`, and `'block'` refuses a move before the cancelable event. Every refusal
184
+ announces its reason and emits the new cancel-free `movereject` event.
185
+ - **Ordered card rules.** `rules` marks cards with an inline tone marker, badges, and an
186
+ accessible description, so a rule is never communicated by colour alone.
187
+ - **Undo and redo** of committed local moves, with `undo()`, `redo()`, `canUndo()`, `canRedo()`,
188
+ `clearHistory()`, a bounded `historyLimit`, the `historychange` event, optional toolbar
189
+ controls, and Ctrl/Cmd+Z and Ctrl/Cmd+Shift+Z on the board.
190
+ - **Board search and filtering.** `search`, `searchFields`, `filter`, `setSearch`, `setFilter`,
191
+ an optional built-in search control, and the `searchchange` event. Hidden records keep their
192
+ position in the data, so a card dropped between two visible cards lands between them.
193
+ - **Replaceable presentation.** `renderCard`, `renderColumnHeader`, `renderSwimlaneHeader`,
194
+ `renderColumnEmpty`, and `renderDragPreview` replace content while the board keeps the managed
195
+ shell: list item, selection control, action group, move handle, drop targets, and collapse
196
+ control never change hands.
197
+ - **Card context menu, per-column scroll regions, and an add affordance.** `contextMenu` offers
198
+ move commands filtered by the same policy path, `columnHeight` turns each column into its own
199
+ scroll region, and `allowAdd` emits `recordadd` for the application to act on.
200
+ - **A complete `labels` map**, so every visible and announced string can be translated without
201
+ patching the component.
202
+
203
+ ## 4.3.3 — 2026-08-26
204
+
205
+ ### Changed
206
+
207
+ - **Kanban boards use a lighter rail hierarchy.** The board and columns no longer stack filled,
208
+ bordered panels around every lane. Compact headers, quiet semantic WIP counts, wider rail gaps,
209
+ and restrained card radii make record cards the primary surfaces while preserving horizontal
210
+ scrolling, empty drop targets, swim lanes, and every existing interaction.
211
+ - **Calendar grids use square structural edges.** The outer calendar, day headings, and time slots
212
+ align as one continuous grid, while the view picker becomes a compact segmented control with a
213
+ raised active view.
214
+ - **Floating messages keep severity visible on glass.** Toasts use a coloured leading inset over
215
+ the shared overlay material and retain deterministic severity backgrounds when transparency is
216
+ reduced or unsupported.
217
+ - The public landing page and Theme Studio no longer duplicate documentation search in their
218
+ headers. Dated 4.3 promotional sections were removed from the landing page and documentation
219
+ introduction, and the landing hero typography was rebalanced around the simplified header.
220
+
221
+ ## 4.3.2 — 2026-08-26
222
+
223
+ ### Added
224
+
225
+ - **Shared card field slots.** A visible field may opt into the shared record-card anatomy with
226
+ `view.card.slot: 'eyebrow-start' | 'eyebrow-end' | 'title-prefix'`, producing a semantic eyebrow
227
+ row or labelled content immediately before — but outside — the title heading and primary link.
228
+ Absent, malformed, and unknown slots fall back to ordinary labelled metadata, and field
229
+ visibility and order remain authoritative.
230
+
231
+ ### Changed
232
+
233
+ - **CardView and KanbanView read as collections, not documents.** CardView clamps titles to two
234
+ lines, keeps previews at thumbnail scale, and renders visible fields as compact metadata chips.
235
+ Kanban columns use a stable 20rem rail with native horizontal overflow, compact headings and
236
+ counts, tighter card padding, an optional square thumbnail, and move/action controls that reveal
237
+ on hover, focus, selection, or grab while staying visible on touch. Both views keep the same
238
+ markup, semantics, and delegated interaction hooks.
239
+ - The landing page hero is lit by the shipped `Aurora` component rather than a bespoke gradient,
240
+ and gains a "Latest release" band covering Calendar, the record views, Aurora, Sheet and Dock,
241
+ the glass materials, and application identity.
242
+ - The documentation Introduction gains a "New in 4.3" section linking the newest component pages.
243
+ Aurora stays documented through its supported component examples and API reference; the
244
+ standalone showcase route is no longer part of the public site.
245
+ - The landing page now carries documentation search, restores the ZeyOS copyright identity in the
246
+ shared footer, and transitions its initially transparent navigation to the established glass
247
+ material after scrolling, with reduced-motion and reduced-transparency fallbacks.
248
+ - Public site and package assembly now exclude non-product contributor material and design audits,
249
+ with release checks that reject private paths in deployable output.
250
+
251
+ ### Fixed
252
+
253
+ - **Calendar month and year paging no longer overflows a month-end anchor.** From 31 January,
254
+ `next()` reached 3 March and skipped February entirely; from 31 March, `prev()` landed back
255
+ inside March, so the button appeared dead. Both steps now clamp the day of month into the target
256
+ month via the new `calendarPageDate()` / `addCalendarMonths()` model helpers.
257
+ - `Calendar.updateEvent()` honours the configured `dateUnit` again. It normalized without it, so a
258
+ numeric `start`/`end` change was read as milliseconds on a calendar configured for Unix seconds.
259
+ - The Calendar toolbar no longer overlaps itself. The end-justified view/new controls kept their
260
+ min-content width inside a narrower `1fr` track and bled back over the centred heading, hiding
261
+ the first view button; the heading is now the only elastic track and ellipsizes instead.
262
+ - Kanban announces a reached or exceeded work-in-progress limit with the move it belongs to, and
263
+ keeps focus on a collapse control across a board refresh — including when a programmatic
264
+ collapse hides the card that had focus.
265
+ - Kanban preserves saved order and collapse preferences for data-derived columns and swim lanes
266
+ when state is restored before asynchronous records arrive. Canceling the bubbling
267
+ `zx-recordmove` event now vetoes the move, and a manual local move clears a conflicting local
268
+ sort so serialized state matches visible order.
269
+ - Selectable record cards retain valid list-item semantics with a global selection description,
270
+ and preview media no longer accepts local `file:` URLs.
271
+ - The four system-architecture cards on the landing page align their links again, and ~60 lines of
272
+ dead `.release-band`/`.release-notes` site CSS with no remaining markup were removed.
273
+ - Documentation search no longer collides with primary navigation: responsive headers move the
274
+ centered field to its own row before their chrome can overlap.
275
+
11
276
  ## 4.3.0 — 2026-08-26
12
277
 
13
278
  ### Added
@@ -67,7 +332,7 @@ and friends remain the complete record.
67
332
  - **Aurora surfaces.** `Aurora` adds a dependency-free, one- to four-colour ambient-light layer
68
333
  with six geometries, bounded palettes and intensity, CSS-only composition, and deterministic
69
334
  reduced-motion, reduced-transparency, and forced-colour fallbacks. The documentation includes a
70
- live application composition and an earlier-studies comparison page.
335
+ live application composition and examples for all six supported geometries.
71
336
 
72
337
  ### Changed
73
338
 
package/README.md CHANGED
@@ -6,9 +6,6 @@ and application layouts in plain ES2022 modules. Source modules run directly in
6
6
  distribution also provides ESM and classic-script bundles. Xenon originated at ZeyOS, while its
7
7
  components and contracts remain product- and framework-agnostic.
8
8
 
9
- The [design-system audit](./DESIGN-SYSTEM.md) records current ZeyOS coverage, missing shell
10
- patterns, the adoption boundary, transaction-grid follow-ups, and chart-engine candidates.
11
-
12
9
  ## Quick start
13
10
 
14
11
  Use the ESM bundle when the application already uses modules:
@@ -130,6 +127,9 @@ ZeyOS binding — see `src/zeyos/modules.js`.
130
127
 
131
128
  | API | Description |
132
129
  | --- | --- |
130
+ | `EntityRef` | Dense linked/static entity identity with labelled metadata and injected actions. |
131
+ | `FileItem`, `FileList` | Durable and transient file presentation with MIME/size metadata, status, progress, downloads, and collection states. |
132
+ | `ActivityItem`, `ActivityList` | Chronological activity entries and grouped collections with actor, time, attachment, action, loading, and empty slots. |
133
133
  | `Table` | Sortable/selectable table with typed transaction columns, flat-data hierarchy/treegrid projection, and opt-in cell/row editing. |
134
134
  | `TableView` | Record-oriented Table composition with shared fields, portable state, column visibility/order, sorting, and selection. |
135
135
  | `CardView` | Responsive record cards with configurable fields, safe preview media, grouping, actions, sorting, and selection. |
@@ -138,6 +138,8 @@ ZeyOS binding — see `src/zeyos/modules.js`.
138
138
  | `Chart`, `ChartJsAdapter` | Accessible engine-neutral chart host and explicitly injected Chart.js adapter. |
139
139
  | `Calendar` | Agenda/day/week/month/year scheduling with timed collisions, spanning events, range selection, and configurable optimistic drag/resize editing. |
140
140
  | `DataFilter` | Declarative select, text, and custom filters for client-side row sets. |
141
+ | `FilterPanel` | Typed filter form built from a server's own field metadata, drafted then applied. |
142
+ | `ListToolbar` | Search, result count, view switch, and badged tools above a record view. |
141
143
  | `TreeView` | APG tree with lazy children, filtering, and tri-state checkboxes. |
142
144
  | `Finder` | Miller-columns hierarchy browser with an optional preview pane. |
143
145
  | `Pagination` | Page, page-size, and load-more pager, with the pure `paginationRange()` helper. |
@@ -149,6 +151,7 @@ ZeyOS binding — see `src/zeyos/modules.js`.
149
151
  | `Field` | Label, description, validation state, and adapter-backed form control. |
150
152
  | `Fieldset` | Native fieldset that owns and coordinates fields. |
151
153
  | `Form` | Form composition, values, validation, highlighting, and actions. |
154
+ | `CodeEditor` | Text-safe structured-text/source editor with native undo, Tab indentation, and position feedback. |
152
155
  | `Questionnaire` | Guided one-question-at-a-time flow: branching, path-aware progress, review. |
153
156
  | `ValueList` | Validated, sortable tag/chip editor. |
154
157
  | `MultiValueEditor` | Ordered editable rows with add, remove, and move controls. |
@@ -163,6 +166,7 @@ ZeyOS binding — see `src/zeyos/modules.js`.
163
166
  | `Avatar` | Fixed-size user image with initials fallback and optional presence. |
164
167
  | `Groupbox` | Collapsible section backed by native `<details>`. |
165
168
  | `Card` | Semantic content/record surface with media, native title link, actions, and footer. |
169
+ | `StatTile`, `statTile()` | Labelled metric with optional delta, sparkline, and loading state. |
166
170
  | `Aurora` | One- to four-colour ambient canvas light; chrome, raised content, and overlays respond through shared material tokens. |
167
171
  | `Launcher` | Cmd/Ctrl+K application and record launcher with ranked local items and abortable grouped sources. |
168
172
  | `Panel` | Framed, optionally collapsible section with a footer. |