@zakkster/lite-ui-fx 1.7.0 → 1.9.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 +99 -0
- package/README.md +323 -212
- package/UIFXController.d.ts +127 -0
- package/UIFXController.js +525 -1
- package/UIFXRecipes.d.ts +33 -13
- package/UIFXRecipes.js +149 -98
- package/llms.txt +61 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,105 @@ All notable changes to `@zakkster/lite-ui-fx` are documented here.
|
|
|
5
5
|
The format follows Keep a Changelog; this project adheres to Semantic
|
|
6
6
|
Versioning.
|
|
7
7
|
|
|
8
|
+
## [1.9.0] -- 2026-09-07
|
|
9
|
+
|
|
10
|
+
Grouped controls (roadmap U7): a third mount mode for a control that is N native
|
|
11
|
+
elements sharing one canvas and one recipe. Additive -- `mountUIFX` and
|
|
12
|
+
`decorateUIFX` are byte-identical (the `UIFXController.js` diff is 524 insertions,
|
|
13
|
+
0 deletions), the single-element API and the eight-hook recipe contract are
|
|
14
|
+
unchanged, so this is a minor. See decisions/0007.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- `mountUIFXGroup(container, groupType, recipeFactory, options)` -- the group
|
|
19
|
+
mount, returning `{ els, canvas, wrapper, state, index, setIndex(i), tick, destroy }`.
|
|
20
|
+
`setIndex(i)` selects programmatically, updating the native element(s) and
|
|
21
|
+
`state.index` and firing `onSelect` once, without stealing focus.
|
|
22
|
+
- `GroupType` { RADIO, TABS, STEPPER, RATING }. RADIO/RATING build a
|
|
23
|
+
`<fieldset role=radiogroup>` of native radios (native roving selection); TABS a
|
|
24
|
+
`<div role=tablist>` of `<button role=tab>` with a hand-written APG roving
|
|
25
|
+
tabindex (Left/Right/Up/Down + Home/End); STEPPER one `<input type=number>`
|
|
26
|
+
spinbutton.
|
|
27
|
+
- `onSelect(index, state)` -- the ninth, group-only recipe hook, fired exactly
|
|
28
|
+
once per selection change (rejected by `mountUIFX`/`decorateUIFX`). Group state
|
|
29
|
+
is a superset of the scalar state plus `index`, `count`, `hoverIndex`, `labels`,
|
|
30
|
+
and the `itemX`/`itemY`/`itemW`/`itemH` Float32Array geometry lanes (read by
|
|
31
|
+
index, zero per-frame allocation).
|
|
32
|
+
- `SegmentedSlide` (a TABS recipe) -- 57 built-in recipes total. New `UIFXRecipes6`
|
|
33
|
+
barrel; the four group types added to `RECIPE_META`, `VALID_META_TYPES`, and
|
|
34
|
+
`mountRecipe` routing (a group `META.type` routes to `mountUIFXGroup`, and needs
|
|
35
|
+
`items`).
|
|
36
|
+
- `test/group.test.mjs` (31 cases): native structure + ARIA per pattern, the APG
|
|
37
|
+
keyboard walk, onSelect-exactly-once, `setIndex`, the scalar-state superset,
|
|
38
|
+
the three clock modes, and fail-closed validation. Torture gains group coverage
|
|
39
|
+
in t0/t1/t2/t3 (with a per-item allocation control that must fail the gate) and
|
|
40
|
+
t5 (20 groups of 5 on one shared ticker). `npm test` is 238 cases across 27
|
|
41
|
+
suites; the torture gate holds at `alloc=0.8759765625 B/op`, 0 major GCs.
|
|
42
|
+
- TypeScript declarations for the group surface (`GroupType`, `mountUIFXGroup`,
|
|
43
|
+
`UIFXGroupState`, `UIFXGroupRecipe`, `GroupOptions`, `UIFXGroupInstance`).
|
|
44
|
+
|
|
45
|
+
### Changed
|
|
46
|
+
|
|
47
|
+
- `PillTabs`, `Stepper`, `RadioOrbit`, and `BubbleRating` re-home from their vol.3
|
|
48
|
+
single-element fakes to real group types (`RECIPE_META.type` slider/button ->
|
|
49
|
+
radio/tabs/stepper/rating); their bodies read group state (`state.index`/`count`
|
|
50
|
+
and the geometry lanes) instead of a faked `state.val`. `mountRecipe(container,
|
|
51
|
+
id, { items })` routes them by `META.type`. RadioOrbit and BubbleRating size
|
|
52
|
+
their per-item lane from `state.count` -- a one-time grow, warm-up-absorbed.
|
|
53
|
+
- `README.md` and `llms.txt` document three mount modes, 57 recipes, and the group
|
|
54
|
+
API + state fields. Measured sizes updated: controller ~7.1 KB min+gzip (its
|
|
55
|
+
three deps external), full catalog ~25 KB. `demo/index.html` renders the group
|
|
56
|
+
recipes and cycles their selection (`#profile` reports `violationCount 0`).
|
|
57
|
+
|
|
58
|
+
### Fixed
|
|
59
|
+
|
|
60
|
+
- The four re-homed controls now carry correct native selection and keyboard: a
|
|
61
|
+
radio group and a tablist are N elements, so arrow-key roving is the browser's
|
|
62
|
+
own (radio/rating/stepper) or an APG-correct hand-written roving (tabs). The
|
|
63
|
+
single-element fakes had the wrong arrow-key behaviour.
|
|
64
|
+
|
|
65
|
+
### Removed
|
|
66
|
+
|
|
67
|
+
- none. The single-element fake mount of the four re-homed recipes is superseded
|
|
68
|
+
by their group mount via `mountRecipe`/`mountUIFXGroup`; no public export or
|
|
69
|
+
option was removed.
|
|
70
|
+
|
|
71
|
+
## [1.8.0] -- 2026-09-07
|
|
72
|
+
|
|
73
|
+
Documentation and demo (roadmap U6). No API, recipe, or behaviour change: the
|
|
74
|
+
module code (`UIFXController.js`, `UIFXRecipes.js`) is byte-identical to 1.7.0.
|
|
75
|
+
Closes finding U-12 (demos that reimplemented the library inline).
|
|
76
|
+
|
|
77
|
+
### Added
|
|
78
|
+
|
|
79
|
+
- `README.md` rewritten on the LiteSepforge blueprint spine: positioning H2 with
|
|
80
|
+
a runnable quick-start, table of contents, why/what-you-get, a mount-modes
|
|
81
|
+
deep-dive, an API reference with UIType/state/`RECIPE_META` constant tables, a
|
|
82
|
+
composability example, a zero-GC allocation table carrying the gated torture
|
|
83
|
+
GATE line, design-decision links, testing, what-this-is-not, ecosystem. Size
|
|
84
|
+
claims are measured (controller ~5.2 KB min+gzip, catalog of 56 recipes ~24 KB).
|
|
85
|
+
- `demo/index.html`: one demo that consumes the package. It imports only the
|
|
86
|
+
public `.` and `./recipes` entry points and generates the gallery from
|
|
87
|
+
`RECIPE_META`, mounting each recipe by its declared type. Includes a theme
|
|
88
|
+
switcher, a reduced-motion toggle, and a `#profile` forced-reflow hook
|
|
89
|
+
(dev-only, dormant unless the URL carries `#profile`; a full drive of the hot
|
|
90
|
+
paths reports `violationCount 0`).
|
|
91
|
+
- `test/docs.test.mjs`: an executable doc gate. It extracts every fenced js block
|
|
92
|
+
in `README.md`, rewrites the package specifiers to the local files, and imports
|
|
93
|
+
each under the DOM stub, so a drifted example fails CI; a control block with a
|
|
94
|
+
bad import name proves the gate can fail. The suite is now 205 node:test cases
|
|
95
|
+
across 18 suites.
|
|
96
|
+
- `decisions/0006-docs-and-demo.md`.
|
|
97
|
+
|
|
98
|
+
### Removed
|
|
99
|
+
|
|
100
|
+
- The three inline demo pages (`demo/demo-lite-ui-fx.html`,
|
|
101
|
+
`demo/demo-lite-uifx-vol2.html`, `demo/demo-lite-uifx-vol3.html`) that
|
|
102
|
+
reimplemented the controller and recipes inline (U-12), replaced by the single
|
|
103
|
+
consuming `demo/index.html`.
|
|
104
|
+
- The README's three CodePen "Live Demo" links and the competitor-size comparison
|
|
105
|
+
table (unmeasured claims; the shipped demo is the showcase).
|
|
106
|
+
|
|
8
107
|
## [1.7.0] -- 2026-09-07
|
|
9
108
|
|
|
10
109
|
Host integration (roadmap U5). Two host-clock modes plus reduced-motion and a
|