@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.
- package/CHANGELOG.md +266 -1
- package/README.md +7 -3
- package/dist/types/components/activity-item/activity-item.d.ts +351 -0
- package/dist/types/components/activity-list/activity-list.d.ts +195 -0
- package/dist/types/components/app-sidebar/app-sidebar.d.ts +28 -0
- package/dist/types/components/button/button.d.ts +8 -0
- package/dist/types/components/calendar/calendar-model.d.ts +22 -0
- package/dist/types/components/calendar/calendar.d.ts +19 -0
- package/dist/types/components/card/card.d.ts +7 -0
- package/dist/types/components/card-view/card-view.d.ts +12 -4
- package/dist/types/components/card-view/record-card.d.ts +53 -5
- package/dist/types/components/code-editor/code-editor.d.ts +160 -0
- package/dist/types/components/code-editor/field-adapter.d.ts +5 -0
- package/dist/types/components/context-menu/context-menu.d.ts +18 -2
- package/dist/types/components/date-picker/date-picker.d.ts +8 -0
- package/dist/types/components/date-picker/time-picker.d.ts +7 -0
- package/dist/types/components/dialog/dialog.d.ts +29 -0
- package/dist/types/components/entity-ref/entity-ref.d.ts +331 -0
- package/dist/types/components/file-item/file-item.d.ts +234 -0
- package/dist/types/components/file-list/file-list.d.ts +171 -0
- package/dist/types/components/filter/filter.d.ts +91 -36
- package/dist/types/components/filter-panel/filter-panel.d.ts +449 -0
- package/dist/types/components/kanban-view/kanban-card.d.ts +138 -0
- package/dist/types/components/kanban-view/kanban-policy.d.ts +268 -0
- package/dist/types/components/kanban-view/kanban-view.d.ts +837 -26
- package/dist/types/components/launcher/launcher.d.ts +19 -12
- package/dist/types/components/list-toolbar/list-toolbar.d.ts +599 -0
- package/dist/types/components/menu-button/menu-button.d.ts +4 -37
- package/dist/types/components/message/message.d.ts +7 -0
- package/dist/types/components/modal/modal.d.ts +48 -0
- package/dist/types/components/navigation-bar/navigation-bar.d.ts +105 -21
- package/dist/types/components/panel/panel.d.ts +7 -0
- package/dist/types/components/search/search.d.ts +7 -0
- package/dist/types/components/select/select.d.ts +4 -0
- package/dist/types/components/sort-control/sort-control.d.ts +105 -0
- package/dist/types/components/stat-tile/stat-tile.d.ts +277 -0
- package/dist/types/components/tabbox/tabbox.d.ts +7 -0
- package/dist/types/components/table/table.d.ts +144 -0
- package/dist/types/components/table-view/table-view.d.ts +11 -5
- package/dist/types/components/timebox/timebox.d.ts +7 -0
- package/dist/types/components/value-list/value-list.d.ts +8 -0
- package/dist/types/components/view/record-view.d.ts +96 -5
- package/dist/types/core/component.d.ts +6 -1
- package/dist/types/core/icons.d.ts +17 -0
- package/dist/types/index.d.ts +13 -1
- package/dist/types/internal/app-rail.d.ts +10 -0
- package/dist/types/internal/menu-items.d.ts +134 -0
- package/dist/zx-zeyos.esm.js +651 -88
- package/dist/zx-zeyos.esm.min.js +8 -1
- package/dist/zx.css +6266 -3900
- package/dist/zx.esm.js +8487 -1805
- package/dist/zx.esm.min.js +10 -3
- package/dist/zx.global.js +8487 -1805
- package/dist/zx.global.min.js +10 -3
- package/dist/zx.min.css +1 -1
- package/docs/api.json +1811 -247
- package/docs/llms.md +345 -40
- package/docs/llms.txt +11 -7
- package/package.json +1 -2
- package/src/components/activity-item/activity-item.css +137 -0
- package/src/components/activity-item/activity-item.js +599 -0
- package/src/components/activity-list/activity-list.css +64 -0
- package/src/components/activity-list/activity-list.js +375 -0
- package/src/components/app-rail/app-rail.css +227 -19
- package/src/components/app-sidebar/app-sidebar.css +414 -24
- package/src/components/app-sidebar/app-sidebar.js +65 -5
- package/src/components/button/button.css +8 -0
- package/src/components/button/button.js +6 -1
- package/src/components/calendar/calendar-model.js +45 -0
- package/src/components/calendar/calendar.css +30 -10
- package/src/components/calendar/calendar.js +41 -13
- package/src/components/card/card.js +12 -1
- package/src/components/card-view/card-view.css +212 -9
- package/src/components/card-view/card-view.js +32 -16
- package/src/components/card-view/record-card.js +98 -21
- package/src/components/code-editor/code-editor.css +67 -0
- package/src/components/code-editor/code-editor.js +288 -0
- package/src/components/code-editor/field-adapter.js +34 -0
- package/src/components/context-menu/context-menu.css +80 -3
- package/src/components/context-menu/context-menu.js +22 -30
- package/src/components/date-picker/date-picker.js +22 -8
- package/src/components/date-picker/month-picker.js +3 -3
- package/src/components/date-picker/time-picker.js +20 -8
- package/src/components/dialog/dialog.js +88 -66
- package/src/components/dropdown/dropdown.js +2 -2
- package/src/components/entity-ref/entity-ref.css +182 -0
- package/src/components/entity-ref/entity-ref.js +496 -0
- package/src/components/file-item/file-item.css +88 -0
- package/src/components/file-item/file-item.js +371 -0
- package/src/components/file-list/file-list.css +51 -0
- package/src/components/file-list/file-list.js +320 -0
- package/src/components/filter/filter.css +27 -1
- package/src/components/filter/filter.js +199 -45
- package/src/components/filter-panel/filter-panel.css +104 -0
- package/src/components/filter-panel/filter-panel.js +964 -0
- package/src/components/kanban-view/kanban-card.js +239 -0
- package/src/components/kanban-view/kanban-policy.js +412 -0
- package/src/components/kanban-view/kanban-view.css +674 -36
- package/src/components/kanban-view/kanban-view.js +1762 -240
- package/src/components/launcher/launcher.js +59 -27
- package/src/components/list-toolbar/list-toolbar.css +189 -0
- package/src/components/list-toolbar/list-toolbar.js +851 -0
- package/src/components/menu-button/menu-button.css +80 -3
- package/src/components/menu-button/menu-button.js +21 -37
- package/src/components/message/message.css +14 -12
- package/src/components/message/message.js +13 -2
- package/src/components/modal/modal.css +15 -0
- package/src/components/modal/modal.js +141 -0
- package/src/components/navigation-bar/navigation-bar.css +77 -2
- package/src/components/navigation-bar/navigation-bar.js +171 -4
- package/src/components/panel/panel.js +13 -2
- package/src/components/search/search.js +17 -5
- package/src/components/select/field-adapter.js +4 -1
- package/src/components/select/select.js +3 -0
- package/src/components/sort-control/sort-control.css +17 -0
- package/src/components/sort-control/sort-control.js +140 -0
- package/src/components/stat-tile/stat-tile.css +213 -0
- package/src/components/stat-tile/stat-tile.js +590 -0
- package/src/components/tabbox/tabbox.js +12 -1
- package/src/components/table/table.css +51 -2
- package/src/components/table/table.js +298 -19
- package/src/components/table-view/table-view.css +8 -2
- package/src/components/table-view/table-view.js +21 -6
- package/src/components/tag-picker/tag-picker.css +3 -1
- package/src/components/timebox/timebox.js +18 -5
- package/src/components/value-list/value-list.js +22 -6
- package/src/components/view/record-view.css +5 -0
- package/src/components/view/record-view.js +100 -7
- package/src/core/component.js +8 -3
- package/src/core/icons.js +74 -5
- package/src/index.js +33 -3
- package/src/internal/app-rail.js +19 -1
- package/src/internal/menu-items.js +142 -0
- package/styles/print.css +192 -0
- package/styles/zx.css +11 -0
- 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
|
|
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. |
|