@kudzujs/core 0.16.3 → 0.16.4

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.
@@ -51,7 +51,7 @@ Syntax compatibility does not mean reproducing React wholesale. Kudzu accepts th
51
51
  - stronger JavaScript failure resilience;
52
52
  - no remaining material large-route build-scaling weakness.
53
53
 
54
- The completed 0.9 plan defines the cross-framework comparison and release gate. The active application packet is `0.16.4` in the capability release plan below. Benchmark-only feature omission, unmatched accessibility, weighted scores that hide losses, and unrecorded environment differences do not count as proof.
54
+ The completed 0.9 plan defines the cross-framework comparison and release gate. The active application packet is `0.17.0` in the capability release plan below. Benchmark-only feature omission, unmatched accessibility, weighted scores that hide losses, and unrecorded environment differences do not count as proof.
55
55
 
56
56
  ### 0.10.0 Through 0.21.x: Application Capability Release Train
57
57
 
package/PERFORMANCE.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  Reproducibility classes: `npm run benchmark`, `npm run benchmark:keyed`, `npm run benchmark:native`, `npm run benchmark:module-cache`, `npm run benchmark:project-navigation`, `npm run benchmark:project-state`, and `npm run benchmark:source-scale` are maintained in this repository; `npm run benchmark:commerce` is a maintained paired runner over the public external storefront; older excluded-workspace sections are historical provenance only and are not current framework rankings.
4
4
 
5
+ ## 0.16.4 Scoped GSAP Animation Lifecycle
6
+
7
+ Measured 2026-08-28 on Linux x64 with Node 24.14.0 and Chrome. The real GSAP
8
+ fixture emits 8 JavaScript files totaling 94,110 raw / 37,819 aggregate gzip
9
+ bytes, while its static sibling emits zero JavaScript. Required Chrome proves
10
+ scoped presentation, native reduced-motion fallback, dependency replacement,
11
+ conditional and enhanced-route disposal, retained structure, and fresh remount.
12
+
13
+ The maintained Worker benchmark remains byte-identical at 907 raw / 477 gzip B
14
+ for the Worker graph and 14,456 raw / 6,159 gzip B for the window graph. Seven
15
+ clean builds record a 625.9 ms median on this host. Timing is not compared with
16
+ the prior sweep. The change adds no runtime file or animation abstraction; one
17
+ existing package-reference ancestry helper shrinks by two lines.
18
+
5
19
  ## 0.16.3 State-Owned Drag And Drop
6
20
 
7
21
  Measured 2026-08-28 on Linux x64 with Node 24.14.0 and Chrome. The real
package/README.md CHANGED
@@ -14,7 +14,7 @@ Kudzu compiles ordinary React-shaped TypeScript and TSX into complete static HTM
14
14
 
15
15
  > Experimental `0.16.x`: the compiler API and supported TSX surface may change.
16
16
 
17
- **Latest release: 0.16.3 - State-owned drag and drop.** A real SortableJS effect may move DOM during a gesture while keyed Kudzu state remains the durable order and identity owner, with keyboard parity, exact disposal, and static exclusion. Read the [release notes](./RELEASES.md#0163---state-owned-drag-and-drop), open the [release page](https://github.com/kudzujs/kudzu/releases/tag/v0.16.3), or follow the [architecture packet](./docs/next-architecture/README.md).
17
+ **Latest release: 0.16.4 - Scoped GSAP animation lifecycle.** Inline GSAP callbacks stay inside one owned effect while Kudzu retains structural DOM, native reduced-motion fallback, dependency replacement, disposal, and static exclusion. Read the [release notes](./RELEASES.md#0164---scoped-gsap-animation-lifecycle), open the [release page](https://github.com/kudzujs/kudzu/releases/tag/v0.16.4), or follow the [architecture packet](./docs/next-architecture/README.md).
18
18
 
19
19
  - [Documentation](https://kudzujs.cloud/docs)
20
20
  - [Installation guide](https://kudzujs.cloud/docs#install)
package/RELEASES.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # Kudzu Releases
2
2
 
3
+ ## 0.16.4 - Scoped GSAP Animation Lifecycle
4
+
5
+ Kudzu 0.16.4 lets inline GSAP callbacks remain inside one owned effect while
6
+ Kudzu retains structural DOM and exact route, conditional, and dependency
7
+ lifetime ownership.
8
+
9
+ ### Changed in 0.16.4
10
+
11
+ - Accepts package references inside an unbroken chain of inline callbacks passed
12
+ directly within an owned effect setup or cleanup.
13
+ - Keeps named, local, imported, render-time, and mixed package indirection
14
+ unsupported.
15
+ - Preserves deterministic visible HTML before GSAP applies bounded opacity and
16
+ transform presentation.
17
+ - Uses native `prefers-reduced-motion` detection for a static presentation with
18
+ no residual inline opacity, transform, or visibility.
19
+ - Reverts the previous GSAP context before dependency replacement and on
20
+ conditional or enhanced-route disposal; remount creates a fresh owner.
21
+ - Adds no animation IR, scheduler, runtime concept, React, VDOM, hydration, or
22
+ retained component tree.
23
+ - Updates `create-kudzu@0.1.129` to generate projects on
24
+ `@kudzujs/core@^0.16.4`.
25
+
26
+ ### Output And Browser Evidence
27
+
28
+ - The GSAP fixture emits 8 JavaScript files totaling 94,110 raw / 37,819
29
+ aggregate gzip bytes; its static sibling emits zero JavaScript.
30
+ - Required Chrome proves scoped mount, dependency replacement, reduced-motion
31
+ fallback, conditional and route disposal, retained structure, and fresh
32
+ remount.
33
+ - The maintained Worker and window graphs remain 907 raw / 477 gzip bytes and
34
+ 14,456 raw / 6,159 gzip bytes respectively.
35
+
36
+ ### Upgrade
37
+
38
+ ```sh
39
+ npm install @kudzujs/core@^0.16.4
40
+ ```
41
+
3
42
  ## 0.16.3 - State-Owned Drag And Drop
4
43
 
5
44
  Kudzu 0.16.3 proves that a real SortableJS drag engine can remain a bounded
@@ -15,7 +15,7 @@ The completed `0.9.0` milestone is recorded in [`0.9-semantic-compression.md`](.
15
15
 
16
16
  [`1.0-large-application-compatibility-audit.md`](./1.0-large-application-compatibility-audit.md) records the first post-0.9 probes against Memos, Apache Answer, and Actual Budget. The audit finds that reduced slices build but whole-application source retention and behavior parity do not yet pass.
17
17
 
18
- [`application-capability-release-plan.md`](./application-capability-release-plan.md) is the authoritative post-0.9 execution queue, currently at `0.16.4`. It assigns one application-capability section to each minor release and one independently accepted evidence packet to each patch release from `0.10.0` through the `1.0.0` gate. It supersedes the provisional 0.10/0.11/0.12 tool-first ordering in the completed 0.9 handoff without rewriting that historical record.
18
+ [`application-capability-release-plan.md`](./application-capability-release-plan.md) is the authoritative post-0.9 execution queue, currently at `0.17.0`. It assigns one application-capability section to each minor release and one independently accepted evidence packet to each patch release from `0.10.0` through the `1.0.0` gate. It supersedes the provisional 0.10/0.11/0.12 tool-first ordering in the completed 0.9 handoff without rewriting that historical record.
19
19
 
20
20
  ## Required Invariants
21
21
 
@@ -1277,6 +1277,31 @@ differs from the published baseline.
1277
1277
  - **Done condition:** GSAP owns only bounded presentation changes and exact
1278
1278
  cleanup while Kudzu retains document structure and lifetime ownership.
1279
1279
 
1280
+ **Result:** complete. A reduction of the MIT-licensed
1281
+ Magic Modal landing page at revision
1282
+ `ab3df864de5b01d604d26345165ea5f7900eae14` reproduced one compiler failure:
1283
+ GSAP's root-scoped `context()` receives an inline callback whose direct package
1284
+ calls were rejected because package-reference validation stopped at the nearest
1285
+ function. The existing ancestry check now accepts only an unbroken chain of
1286
+ inline call arguments back to the owned effect; named, local, and imported helper
1287
+ indirection remains rejected. Required Chrome proves deterministic visible HTML,
1288
+ root-scoped presentation, native reduced-motion fallback without residual inline
1289
+ opacity/transform, dependency replacement with retained DOM identity,
1290
+ conditional and enhanced-route disposal, and fresh remount. GSAP owns only
1291
+ bounded opacity and transform changes; Kudzu retains structural DOM and lifetime
1292
+ ownership. The interactive graph is 94,110 raw / 37,819 aggregate gzip bytes
1293
+ across eight JavaScript files; the static sibling emits zero. Its normalized
1294
+ deploy archive SHA-256 is
1295
+ `2b6467f04452c51878ea81d5e80db21c60286e191e1e49ac482556dbf7c713c3`.
1296
+ Semantic primitives, IR kinds, compiler passes, normalization rules, runtime
1297
+ concepts, runtime files, animation abstractions, schedulers, and public APIs
1298
+ change by zero; one existing compiler ancestry helper shrinks by two LOC. One
1299
+ positive fixture and one two-scenario browser contract were added. The maintained
1300
+ Worker/effect benchmark remains 907 raw / 477 gzip bytes for the Worker graph and
1301
+ 14,456 raw / 6,159 gzip bytes for the window graph; its seven-run Linux median was
1302
+ 625.9 ms, recorded without a timing comparison because the host differs from the
1303
+ published baseline.
1304
+
1280
1305
  ## `0.17.x`: Long-Lived Applications
1281
1306
 
1282
1307
  ### `0.17.0`: Endurance Harness
@@ -1653,4 +1678,5 @@ release transaction where possible or document and publish a forward-fix patch.
1653
1678
  | `0.16.1` | Released | Preserve the retained CodeMirror instance boundary, bidirectional updates, error recovery, accessibility, and exact cleanup. | None |
1654
1679
  | `0.16.2` | Closed by existing effect ownership | Preserve retained Chart.js data/resize updates, listener and route cleanup, fresh remount, accessibility, and static exclusion. | No production change; no release consumed |
1655
1680
  | `0.16.3` | Released | Preserve state-owned order, keyed identity, keyboard parity, invalid-input recovery, package disposal, and static exclusion. | None |
1656
- | `0.16.4` | Active | Validate one real GSAP landing-page animation through bounded effect ownership. | None |
1681
+ | `0.16.4` | Released | Preserve scoped GSAP presentation, reduced-motion fallback, dependency/owner cleanup, fresh remount, and static exclusion. | None |
1682
+ | `0.17.0` | Active | Establish the long-session endurance harness and machine-readable ownership counters. | None |
@@ -1,6 +1,6 @@
1
1
  # Current Compiler Architecture
2
2
 
3
- This maps the current `0.16.3` architecture, built on the completed `0.9.0` semantic-compression release and `0.8.23` Goal A compiler foundation. The active application packet is `0.16.4`; file and function names are the stable references, while line numbers are intentionally omitted because later work may still move code.
3
+ This maps the current `0.16.4` architecture, built on the completed `0.9.0` semantic-compression release and `0.8.23` Goal A compiler foundation. The active application packet is `0.17.0`; file and function names are the stable references, while line numbers are intentionally omitted because later work may still move code.
4
4
 
5
5
  ## Responsibility Map
6
6
 
@@ -2,9 +2,9 @@
2
2
 
3
3
  ## Status
4
4
 
5
- Completed compiler-foundation record and longer-term plan after `0.8.35`. The [`0.9-semantic-compression.md`](./0.9-semantic-compression.md) execution queue is complete. The active queue for current work is [`application-capability-release-plan.md`](./application-capability-release-plan.md) at packet `0.16.4`. This document does not mark any remaining planned capability as supported and does not authorize a React runtime, VDOM, hydration, retained browser component tree, generic rerenderer, public store/query/resource API, SPA router, or islands.
5
+ Completed compiler-foundation record and longer-term plan after `0.8.35`. The [`0.9-semantic-compression.md`](./0.9-semantic-compression.md) execution queue is complete. The active queue for current work is [`application-capability-release-plan.md`](./application-capability-release-plan.md) at packet `0.17.0`. This document does not mark any remaining planned capability as supported and does not authorize a React runtime, VDOM, hydration, retained browser component tree, generic rerenderer, public store/query/resource API, SPA router, or islands.
6
6
 
7
- [`MIGRATION_ROADMAP.md`](../../MIGRATION_ROADMAP.md) remains the product authority for product invariants and fixture-driven feature selection. [`application-capability-release-plan.md`](./application-capability-release-plan.md) is authoritative for current work order and evidence at packet `0.16.4`; this plan retains the completed foundation, deferred program, and long-term production gates. If implementation evidence changes either boundary, update the relevant document before broadening a patch.
7
+ [`MIGRATION_ROADMAP.md`](../../MIGRATION_ROADMAP.md) remains the product authority for product invariants and fixture-driven feature selection. [`application-capability-release-plan.md`](./application-capability-release-plan.md) is authoritative for current work order and evidence at packet `0.17.0`; this plan retains the completed foundation, deferred program, and long-term production gates. If implementation evidence changes either boundary, update the relevant document before broadening a patch.
8
8
 
9
9
  ## Product Outcome
10
10
 
@@ -483,4 +483,4 @@ The first comparison is Kudzu versus React + Vite using the same agent, model, t
483
483
 
484
484
  ## Immediate Decision
485
485
 
486
- All listed foundation and `0.9` slices are complete. Current work continues at `0.16.4` GSAP Animation Lifecycle under the [`application-capability-release-plan.md`](./application-capability-release-plan.md); keep ResourceIR limited to qualifying independent fixtures, and do not add range ownership, virtualization, optimistic transactions, a public adapter/store API, or a router before evidence justifies them.
486
+ All listed foundation and `0.9` slices are complete. Current work continues at `0.17.0` Endurance Harness under the [`application-capability-release-plan.md`](./application-capability-release-plan.md); keep ResourceIR limited to qualifying independent fixtures, and do not add range ownership, virtualization, optimistic transactions, a public adapter/store API, or a router before evidence justifies them.
@@ -1,6 +1,6 @@
1
1
  # Planned Version Sequence
2
2
 
3
- This is an execution sequence, not release history. `0.8.16` through `0.8.62` are completed scopes represented by package/release records. The `0.10.0` through `1.0.0` minor/patch sequence is maintained in [`application-capability-release-plan.md`](./application-capability-release-plan.md), currently at `0.16.4`; that plan supersedes the provisional tool-first 0.10/0.11/0.12 ordering in the completed 0.9 handoff.
3
+ This is an execution sequence, not release history. `0.8.16` through `0.8.62` are completed scopes represented by package/release records. The `0.10.0` through `1.0.0` minor/patch sequence is maintained in [`application-capability-release-plan.md`](./application-capability-release-plan.md), currently at `0.17.0`; that plan supersedes the provisional tool-first 0.10/0.11/0.12 ordering in the completed 0.9 handoff.
4
4
 
5
5
  Keep each patch behavior-preserving and independently reviewable. If a boundary proves inseparable, revise this plan before combining releases; do not silently broaden a patch.
6
6
 
@@ -66,7 +66,7 @@ Keep each patch behavior-preserving and independently reviewable. If a boundary
66
66
 
67
67
  ## Generator Versions
68
68
 
69
- `create-kudzu@0.1.128` retains the explicit install instructions and generates projects with `@kudzujs/core@^0.16.3`.
69
+ `create-kudzu@0.1.129` retains the explicit install instructions and generates projects with `@kudzujs/core@^0.16.4`.
70
70
 
71
71
  ## Release Boundary
72
72
 
@@ -2630,19 +2630,17 @@ function insideJsxEventHandler(node, root) {
2630
2630
  }
2631
2631
 
2632
2632
  function insideOwnedEffectCallback(node, root) {
2633
- let callback
2634
2633
  for (let current = node.parent; current && current !== root.parent; current = current.parent) {
2635
2634
  if (!isFunctionLike(current)) continue
2636
- callback = current
2637
- break
2638
- }
2639
- if (!callback) return false
2640
- if (ts.isCallExpression(callback.parent) && callback.parent.arguments[0] === callback && ts.isIdentifier(callback.parent.expression) && callback.parent.expression.text === "useEffect") return true
2641
- const returned = callback.parent
2642
- if (!ts.isReturnStatement(returned)) return false
2643
- for (let current = returned.parent; current && current !== root.parent; current = current.parent) {
2644
- if (!isFunctionLike(current)) continue
2645
- return ts.isCallExpression(current.parent) && current.parent.arguments[0] === current && ts.isIdentifier(current.parent.expression) && current.parent.expression.text === "useEffect"
2635
+ if (ts.isCallExpression(current.parent) && current.parent.arguments[0] === current && ts.isIdentifier(current.parent.expression) && current.parent.expression.text === "useEffect") return true
2636
+ if (ts.isReturnStatement(current.parent)) {
2637
+ for (let owner = current.parent.parent; owner && owner !== root.parent; owner = owner.parent) {
2638
+ if (!isFunctionLike(owner)) continue
2639
+ return ts.isCallExpression(owner.parent) && owner.parent.arguments[0] === owner && ts.isIdentifier(owner.parent.expression) && owner.parent.expression.text === "useEffect"
2640
+ }
2641
+ return false
2642
+ }
2643
+ if (!ts.isCallExpression(current.parent) || !current.parent.arguments.includes(current)) return false
2646
2644
  }
2647
2645
  return false
2648
2646
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kudzujs/core",
3
- "version": "0.16.3",
3
+ "version": "0.16.4",
4
4
  "description": "HTML-first TSX framework with synchronous state semantics and no virtual DOM",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -76,6 +76,7 @@
76
76
  "@codemirror/view": "^6.43.9",
77
77
  "@types/sortablejs": "^1.15.9",
78
78
  "chart.js": "^3.8.2",
79
+ "gsap": "^3.15.0",
79
80
  "sortablejs": "^1.15.7",
80
81
  "typed.js": "^3.0.0",
81
82
  "wrangler": "^4.112.0"