@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 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