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
|
|
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:
|
|
179
|
+
## App data: optional store
|
|
180
180
|
|
|
181
|
-
|
|
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
|
-
- **
|
|
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
|
@@ -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\`, …)
|