aeon-ui-engine 1.10.1 → 1.10.2

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
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.10.2] - 2026-10-22
4
+
5
+ ### Changed
6
+
7
+ - Describe this release.
8
+
3
9
  ## [Unreleased]
4
10
 
5
11
  ## [1.10.1] - 2026-10-22
@@ -12,7 +18,7 @@
12
18
 
13
19
  ### Added
14
20
 
15
- - **App store (`@aeon-ui/primitives`).** `createAeonStore({ id, slices, persist?, sync? })` keeps an app's data in one place: each entity once, by id, in its slice (`defineSlice({ idOf, load?, ttl?, tags? })`). Every change is an event: `ENTITY.UPSERT`, `ENTITY.PATCH` and `ENTITY.REMOVE`, plus optimistic `WRITE.BEGIN`, which marks entities pending until `WRITE.CONFIRM` or `WRITE.ROLLBACK` (restores the old value and marks it failed). Queries run on the chart cache (`QUERY.FETCH`, `QUERY.REFRESH`, `QUERY.INVALIDATE`, `STORE.INVALIDATE`). `select`, `query` and `entity` return the same object until their data changes. `queryAttrs` and `entityAttrs` project state onto `data-aeon-state`. Persistence saves only confirmed values through an adapter (`memoryAdapter`, `webStorageAdapter`), with `version` and `migrate`. `sync` feeds server pushes in as events, and `STORE.CLEAR` wipes memory, running loads and the saved copy. Charts read it by invoking `store.actor`. Store ids, slice names and entity fields that name secrets, keys or spend decisions are refused.
21
+ - **App store (`@aeon-ui/primitives`, optional).** `createAeonStore({ id, slices, persist?, sync? })` keeps an app's data in one place: each entity once, by id, in its slice (`defineSlice({ idOf, load?, ttl?, tags? })`). Every change is an event: `ENTITY.UPSERT`, `ENTITY.PATCH` and `ENTITY.REMOVE`, plus optimistic `WRITE.BEGIN`, which marks entities pending until `WRITE.CONFIRM` or `WRITE.ROLLBACK` (restores the old value and marks it failed). Queries run on the chart cache (`QUERY.FETCH`, `QUERY.REFRESH`, `QUERY.INVALIDATE`, `STORE.INVALIDATE`). `select`, `query` and `entity` return the same object until their data changes. `queryAttrs` and `entityAttrs` project state onto `data-aeon-state`. Persistence saves only confirmed values through an adapter (`memoryAdapter`, `webStorageAdapter`), with `version` and `migrate`. `sync` feeds server pushes in as events, and `STORE.CLEAR` wipes memory, running loads and the saved copy. Charts read it by invoking `store.actor`. Store ids, slice names and entity fields that name secrets, keys or spend decisions are refused.
16
22
  - **`useAeonSelector` and `useAeonQuery` (`@aeon-ui/react`).** Read the store; a component re-renders only when the value it selects changes.
17
23
 
18
24
  ## [1.9.0] - 2026-10-21
package/README.md CHANGED
@@ -176,9 +176,9 @@ function AsyncSurface() {
176
176
 
177
177
  See [docs/PRIMITIVE_COVERAGE.md](./docs/PRIMITIVE_COVERAGE.md).
178
178
 
179
- ## App data: one store
179
+ ## App data: optional store
180
180
 
181
- Each app keeps its data in one `createAeonStore`: every entity once, by id, in its slice. Components never copy it. They read through selectors and show state through `data-aeon-*` attributes. Every change is an event sent to the store.
181
+ Apps **can** keep shared entity data in one `createAeonStore` (optional). Charts, machines, and `data-aeon-state` work without it — HandCash and Alignity stay on their own machines and `createChartCache` until they choose the store. When you do use it: every entity once, by id, in its slice; components read through selectors; every change is an event.
182
182
 
183
183
  ```tsx
184
184
  import { createAeonStore, defineSlice, entityAttrs, queryAttrs, webStorageAdapter } from '@aeon-ui/primitives'
@@ -207,7 +207,7 @@ function PaymentRow({ id }: { id: string }) {
207
207
  - **Queries:** `QUERY.FETCH`, `QUERY.REFRESH` and `QUERY.INVALIDATE { query | tag }` run on the chart cache's states (`idle`, `loading`, `ready`, `stale`, `refreshing`, `failed`). `STORE.INVALIDATE` reloads every watched query (for reconnect or window focus). `STORE.CLEAR` drops all data, running loads and the saved copy (for lock or account switch).
208
208
  - **Persistence:** only confirmed values are saved, after a short quiet delay. A `version` bump runs `migrate`; without one, older saved data is dropped. Data written during start-up wins over the saved copy. Slices with `persist: false` stay in memory.
209
209
  - **Charts:** invoke `store.actor` with `input: { select }` to get `STORE.UPDATE` whenever the selection changes. Store events sent to it are forwarded to the store.
210
- - **Never stored:** store ids, slice names and entity fields at any depth that name secrets, keys, seeds, passwords or spend are refused.
210
+ - **When used — never stored:** if you adopt the store, ids, slice names and entity fields at any depth that name secrets, keys, seeds, passwords or spend are refused. Apps that skip the store are unaffected.
211
211
 
212
212
  ## Example
213
213
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aeon-ui-engine",
3
- "version": "1.10.1",
3
+ "version": "1.10.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,6 +17,9 @@ You are building UI with **Aeon UI**, a React component library powered by finit
17
17
  7. Prefer `@aeon-ui/react` (headless) or `@aeon-ui/ui` (styled). Relative TS imports use `.js` extensions inside the Aeon monorepo only.
18
18
  8. Primitives stay **universal** — never invent niche components (dating, colour-blind test, pong). Compose from generic parts.
19
19
 
20
+ ## App store (optional)
21
+ `createAeonStore` / `useAeonSelector` / `useAeonQuery` are optional caching for shared entity state. Do **not** migrate an app onto them unless the user asked. Existing XState machines, `createChartCache`, and `data-aeon-state` on charts stay valid on their own — never block HandCash or Alignity work on adopting the store.
22
+
20
23
  ## DOM contract
21
24
  Every interactive surface sets anatomy via `partAttrs` from `@aeon-ui/core`:
22
25
  - `data-aeon-scope` — family (`button`, `async`, `field`, …)
@@ -17,6 +17,9 @@ You are building UI with **Aeon UI**, a React component library powered by finit
17
17
  7. Prefer `@aeon-ui/react` (headless) or `@aeon-ui/ui` (styled). Relative TS imports use `.js` extensions inside the Aeon monorepo only.
18
18
  8. Primitives stay **universal** — never invent niche components (dating, colour-blind test, pong). Compose from generic parts.
19
19
 
20
+ ## App store (optional)
21
+ `createAeonStore` / `useAeonSelector` / `useAeonQuery` are optional caching for shared entity state. Do **not** migrate an app onto them unless the user asked. Existing XState machines, `createChartCache`, and `data-aeon-state` on charts stay valid on their own — never block HandCash or Alignity work on adopting the store.
22
+
20
23
  ## DOM contract
21
24
  Every interactive surface sets anatomy via `partAttrs` from `@aeon-ui/core`:
22
25
  - `data-aeon-scope` — family (`button`, `async`, `field`, …)
@@ -22,6 +22,9 @@ You are building UI with **Aeon UI**, a React component library powered by finit
22
22
  7. Prefer \`@aeon-ui/react\` (headless) or \`@aeon-ui/ui\` (styled). Relative TS imports use \`.js\` extensions inside the Aeon monorepo only.
23
23
  8. Primitives stay **universal** — never invent niche components (dating, colour-blind test, pong). Compose from generic parts.
24
24
 
25
+ ## App store (optional)
26
+ \`createAeonStore\` / \`useAeonSelector\` / \`useAeonQuery\` are optional caching for shared entity state. Do **not** migrate an app onto them unless the user asked. Existing XState machines, \`createChartCache\`, and \`data-aeon-state\` on charts stay valid on their own — never block HandCash or Alignity work on adopting the store.
27
+
25
28
  ## DOM contract
26
29
  Every interactive surface sets anatomy via \`partAttrs\` from \`@aeon-ui/core\`:
27
30
  - \`data-aeon-scope\` — family (\`button\`, \`async\`, \`field\`, …)