Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
b0df240
Refactor: Each-block per-key reactivity
jlukic May 5, 2026
aaeb304
Harness: FGR plan into active
jlukic May 5, 2026
9d8761e
Refactor: Subtemplate per-key reactivity
jlukic May 5, 2026
0bffc5e
Refactor: Snippet per-key reactivity
jlukic May 6, 2026
942f887
Test: Update closure-coarseness expectations for FGR
jlukic May 6, 2026
ddbc5d6
Perf: Reduce per-key allocation overhead at mount
jlukic May 6, 2026
a705db0
Perf: Lazy-getter snippet args and empty-subscribers fast path
jlukic May 6, 2026
f5f82a1
Build: Bump bench job timeout to 25 minutes
jlukic May 6, 2026
2ea9cd0
Perf: Stable Proxy handler shape across ReactiveDataContext instances
jlukic May 6, 2026
7766631
Perf: Inline per-key Dependency in ReactiveDataContext, drop Signal w…
jlukic May 6, 2026
086f602
Perf: Switch ReactiveDataContext values from Map to null-prototype ob…
jlukic May 6, 2026
f94ff7b
Bug: Rename subtemplates example tag to avoid ui-table primitive coll…
jlukic May 6, 2026
c52df91
Bug: Seed reactiveData into subtemplate data before createComponent runs
jlukic May 6, 2026
a112473
Test: Capture FGR per-key isolation contract across all adoption sites
jlukic May 6, 2026
1ead8b4
Harness: Bench comment truthfulness — icebox plan
jlukic May 6, 2026
d7add0e
Refactor: Unify subtemplate data propagation onto snippet lazy-getter…
jlukic May 6, 2026
97a1938
Test: Gate native-only FGR contracts to native engine; sync LSP examp…
jlukic May 6, 2026
41d5218
Merge branch 'main' into feat/fine-grained-reactivity
jlukic May 6, 2026
36cb6ed
Merge branch 'main' into feat/fine-grained-reactivity
jlukic May 6, 2026
bd35392
Merge branch 'main' into feat/fine-grained-reactivity
jlukic May 6, 2026
d39a49a
Bench: Fix bench-data-blob to measure the blob path it claims
jlukic May 6, 2026
091f84f
Perf: Stable handler shape for buildArgsProxy
jlukic May 6, 2026
0b98f74
Test: Mark as-mode per-FIELD contracts as `it.fails`
jlukic May 6, 2026
c6cee04
Perf: Switch ReactiveDataContext deps from Map to null-prototype object
jlukic May 6, 2026
ad89e44
Revert "Perf: Switch ReactiveDataContext deps from Map to null-protot…
jlukic May 7, 2026
c007ddb
Merge branch 'main' into feat/fine-grained-reactivity
jlukic May 7, 2026
382c19b
Merge branch 'main' into feat/fine-grained-reactivity
jlukic May 7, 2026
9586908
Merge branch 'main' into feat/fine-grained-reactivity
jlukic May 7, 2026
b485010
Refactor: Swap buildArgsProxy for native getter records (#189)
jlukic May 7, 2026
e1b9cac
Perf: Cut wasted work in ReactiveDataContext hot paths
jlukic May 7, 2026
19f39de
Perf: Seal keySetVersion in as-mode each-blocks
jlukic May 7, 2026
0161749
Perf: Skip renderer.data clone for stateless reactiveData subtemplates
jlukic May 8, 2026
d207860
Revert "Perf: Skip renderer.data clone for stateless reactiveData sub…
jlukic May 8, 2026
dffdd3b
Test: Drop PR-scoped narration from FGR contract describes
jlukic May 8, 2026
4ed6112
Bench: Trim explicit-form rationale comment
jlukic May 8, 2026
42b3302
Docs: Strip bench-name and change-history from in-source comments
jlukic May 8, 2026
5a45827
Docs: Correct cloneInstance comment to match buildArgsRecord shape
jlukic May 8, 2026
5625c5d
Docs: Rename lazy-getter proxy to record in subtemplate comments
jlukic May 8, 2026
a4f020b
Docs: Drop mechanism restatement from template-block header
jlukic May 8, 2026
998d21c
Docs: Drop duplicate Reaction-isolation comment at renderInstance call
jlukic May 8, 2026
cdbcea4
Docs: Drop reviewer-process imperative from RDC header
jlukic May 8, 2026
182639f
Refactor: Remove unused RDC API surface
jlukic May 8, 2026
dd2cf5d
Refactor: Drop redundant null-guard around createSnapshot
jlukic May 8, 2026
c468e85
Perf: Cache own-getter keys in assignInPlace preserveGetters path
jlukic May 8, 2026
3a2c2ed
Docs: Tighten getter-cache comment in objects util
jlukic May 8, 2026
53176b8
Perf: Lazy per-key Dependency allocation in RDC trapGet
jlukic May 8, 2026
ba8192c
Docs: Reframe FGR as-mode plan rationale as settings-proxy pattern
jlukic May 8, 2026
fa4c0b4
Revert "Perf: Lazy per-key Dependency allocation in RDC trapGet"
jlukic May 8, 2026
4b4cf72
Perf: Switch RDC deps from Map to null-prototype object
jlukic May 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ xx.xx.xxxx
### Utils
* **Feature** - Added [`deepFreeze`](https://next.semantic-ui.com/docs/api/utils/cloning#deepfreeze) — recursively freezes a value in place and returns the same reference. Walks arrays and plain objects only, leaving `Date`, `Map`, `Set`, `RegExp`, DOM nodes, and custom class instances untouched so their internal slots keep working. Cycle-safe via an internal `WeakSet`; already-frozen inputs take a fast-path no-op.
* **Feature** - Added [`createCache`](https://next.semantic-ui.com/docs/api/utils/cache) — a bounded, Map-like cache factory with pluggable eviction (`lru` default, `fifo`, `flush`) and an `onEvict` hook. Collapses ad-hoc `new Map()` + size-check patterns behind one named primitive.
* **Feature** - Added `assignInPlace()` for syncing an object's contents to match a source without replacing the reference — supports `preserveExistingKeys` to skip deletion and `returnChanged` to detect modifications
* **Feature** - Added `assignInPlace()` for syncing an object's contents to match a source without replacing the reference — supports `preserveExistingKeys` to skip deletion, `preserveGetters` to keep computed properties (own getter descriptors) intact across syncs, and `returnChanged` to detect modifications
* **Breaking** - `kebabToCamel` and `camelToKebab` now use lossless encoding — digit-leading segments are preserved with `_` (e.g. `grid-2x2` → `grid_2x2`), and every uppercase letter gets its own hyphen (e.g. `arrowDownAZ` → `arrow-down-a-z`). Both accept a `separator` option to customize the digit-boundary character. `camelToKebab` now normalizes leading uppercase by default for DOM-safe output (e.g. `FooBar` → `foo-bar`); pass `{ lossless: true }` to preserve it for exact round-trips.
* **Enhancement** - `hashCode` now defaults to zero-allocation FNV-1a for better performance. Use `{ fast: false }` for the previous UMASH algorithm with stronger collision resistance.
* **Feature** - Added `unescapeHTML()` for converting HTML entities back to characters — the inverse of `escapeHTML`
Expand Down
3 changes: 2 additions & 1 deletion ai/plans/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ Plans with an open PR or live pair work. Updated as ceremony when a PR opens; en

- [Release 0.18.0](active/release-0-18-0.md) — [PR #122](https://github.com/Semantic-Org/Semantic-Next/pull/122) `docs/shippable` (menu trimming + audit pass pending). Ships the next tagged release; last was 0.17.0 in November.
- [Signal Performance](active/signal-performance.md) — [PR #150](https://github.com/Semantic-Org/Semantic-Next/pull/150) freeze-by-default. Perf story unresolved (see plan's Bench Results); release inclusion is the open call.
- [Fine-Grained Reactivity](active/fine-grained-reactivity.md) — [PR #183](https://github.com/Semantic-Org/Semantic-Next/pull/183) `ReactiveDataContext` per-key Signal bag. Session 1 (each-block) landed; subtemplate, snippet, hydration sites still pending.
---

## Phase 0 — Renderer Architecture
Expand Down Expand Up @@ -110,7 +111,7 @@ Behavioral changes and API contracts that downstream agents and consumers will t
| # | Plan | Hours | Mode | Scope | Notes |
|---|------|-------|------|-------|-------|
| 2a | [Signal Performance](active/signal-performance.md) | 4-5h + audit | pair | scoped | `safety` preset system (`freeze` / `reference` / `none`) replacing `allowClone`. Audit of `.get()` call sites for get-mutate-set patterns gates the default flip. |
| 2a.1 | [Fine-Grained Reactivity](fine-grained-reactivity.md) | 6-8h | pair | initial | `ReactiveDataContext` — per-key Signal bag — at `{#each}` items, subtemplate `reactiveData`, snippet args. Eliminates the N×M coarse invalidation pattern. Lands after 2a. |
| 2a.1 | [Fine-Grained Reactivity](active/fine-grained-reactivity.md) | 6-8h | pair | initial | `ReactiveDataContext` — per-key Signal bag — at `{#each}` items, subtemplate `reactiveData`, snippet args. Eliminates the N×M coarse invalidation pattern. Lands after 2a. |
| 2b | [Value Schema](value-schema.md) | 16-24h (2-3d) | pair | initial | Contract for ~20-30 form components. `value` setting + schema + `change` event. Gates form/form-field and the wrapper architecture. |
| 2c | [State from Settings](state-from-settings.md) | 8h | pair | scoped | `{ default: 'all', from: 'setting' }` in `defaultState`. Eliminates manual shadowing for components that accept initial values from attributes but own them as state. |
| 2d | [Subtemplate Settings](subtemplate-settings.md) | 8-12h | pair | initial | Reactive `defaultSettings` on subtemplates with merged proxy over parent web component settings. Same upgrade path: add `tagName` and the subtemplate becomes a web component with no API change. |
Expand Down
Loading
Loading