@xmachines/play-solid 1.0.0-beta.30 → 1.0.0-beta.31

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/README.md CHANGED
@@ -36,7 +36,7 @@ without muting console output.
36
36
  - `PlayRenderer` — main renderer component
37
37
  - `useActor` — hook for accessing the actor inside a `PlayRenderer` tree
38
38
  - `defineRegistry` — re-exported from `@json-render/solid`
39
- - `useStateBinding` — re-exported from `@json-render/solid`
39
+ - `useBoundProp` — re-exported from `@json-render/solid`
40
40
  - `ComponentFn` (type) — re-exported from `@json-render/solid`
41
41
  - `ComponentContext` (type) — re-exported from `@json-render/solid`
42
42
  - `PlayRendererProps` (type)
@@ -81,9 +81,17 @@ const Dashboard: ComponentFn<typeof catalog, "Dashboard"> = ({ props }) => (
81
81
  );
82
82
 
83
83
  // 3. Build registry
84
- const { registry } = defineRegistry(catalog, {
84
+ const registryResult = defineRegistry(catalog, {
85
85
  components: { Login, Dashboard },
86
- actions: { login: async () => {}, logout: async () => {} },
86
+ actions: {
87
+ login: async (params) => {
88
+ if (!params) return;
89
+ actor.send({ type: "auth.login", username: params.username });
90
+ },
91
+ logout: async (params) => {
92
+ actor.send({ type: "auth.logout" });
93
+ },
94
+ },
87
95
  });
88
96
 
89
97
  // 4. Define machine with view metadata
@@ -158,13 +166,7 @@ const actor = createPlayer();
158
166
  actor.start();
159
167
 
160
168
  function App() {
161
- return (
162
- <PlayRenderer
163
- actor={actor}
164
- registry={registry}
165
- actions={{ login: "auth.login", logout: "auth.logout" }}
166
- />
167
- );
169
+ return <PlayRenderer actor={actor} registryResult={registryResult} />;
168
170
  }
169
171
  ```
170
172
 
@@ -177,8 +179,7 @@ Main component. Subscribes to `actor.currentView` and renders the spec.
177
179
  ```tsx
178
180
  <PlayRenderer
179
181
  actor={actor}
180
- registry={registry}
181
- actions={{ login: "auth.login" }}
182
+ registryResult={registryResult}
182
183
  store={myStore}
183
184
  fallback={<p>Loading…</p>}
184
185
  />
@@ -186,21 +187,11 @@ Main component. Subscribes to `actor.currentView` and renders the spec.
186
187
 
187
188
  **`actor`** — A `PlayerActor` (or any `AbstractActor & Viewable`). Provides the `currentView` signal.
188
189
 
189
- **`registry`** — Built with `defineRegistry(catalog, { components, actions })` from `@xmachines/play-solid`.
190
+ **`registryResult`** — The full `DefineRegistryResult` returned by `defineRegistry(catalog, { components, actions })` from `@xmachines/play-solid`.
190
191
 
191
192
  `defineRegistry` also accepts `onRenderError(error, elementType)`, which receives errors
192
193
  caught by `@json-render/solid`'s inner element boundary before the default logger is used.
193
194
 
194
- **`actions`** — Maps json-render action names (from spec `on` bindings) to XState event type strings. Type-checked against `EventFromLogic<TLogic>["type"]` when `TLogic` is specified:
195
-
196
- ```tsx
197
- <PlayRenderer<typeof machine>
198
- actor={actor}
199
- registry={registry}
200
- actions={{ login: "auth.login", logout: "auth.logout" }}
201
- />
202
- ```
203
-
204
195
  **`store`** (optional) — Controls per-view UI state (`$state` bindings, form values):
205
196
 
206
197
  - **Omitted (uncontrolled, default):** A fresh `@xstate/store` atom is created per view transition, seeded from `view.spec.state`.
@@ -213,16 +204,24 @@ import type { StateStore } from "@json-render/core";
213
204
 
214
205
  const store: StateStore = xstateStoreStateStore({ atom: createAtom({ username: "" }) });
215
206
 
216
- <PlayRenderer actor={actor} registry={registry} store={store} actions={{ login: "auth.login" }} />;
207
+ <PlayRenderer actor={actor} registryResult={registryResult} store={store} />;
217
208
  ```
218
209
 
219
210
  **Inner render errors** — You can intercept catalog component render failures without
220
211
  overriding the outer Solid error boundary:
221
212
 
222
213
  ```tsx
223
- const { registry } = defineRegistry(catalog, {
214
+ const registryResult = defineRegistry(catalog, {
224
215
  components: { Login, Dashboard },
225
- actions: { login: async () => {}, logout: async () => {} },
216
+ actions: {
217
+ login: async (params) => {
218
+ if (!params) return;
219
+ actor.send({ type: "auth.login", username: params.username });
220
+ },
221
+ logout: async (params) => {
222
+ actor.send({ type: "auth.logout" });
223
+ },
224
+ },
226
225
  onRenderError(error, elementType) {
227
226
  reportExpectedRenderError(error, elementType);
228
227
  },
@@ -270,4 +269,4 @@ Priority: **route param fills `undefined` slots; explicit non-`undefined` spec p
270
269
  - SolidJS signals are only used to trigger re-renders — not for business logic
271
270
  - `actor.currentView` (TC39 Signal) is bridged into a SolidJS `createSignal` inside `PlayRenderer`
272
271
  - Per-view UI state lives in an `@xstate/store` atom, not in SolidJS reactive state
273
- - `@json-render/solid` drives rendering; `PlayRenderer` is the signal bridge — import `defineRegistry`, `ComponentFn`, `ComponentContext`, and `useStateBinding` from `@xmachines/play-solid`
272
+ - `@json-render/solid` drives rendering; `PlayRenderer` is the signal bridge — import `defineRegistry`, `ComponentFn`, `ComponentContext`, and `useBoundProp` from `@xmachines/play-solid`
@@ -1,50 +1,60 @@
1
- import { ActionProvider as e, Renderer as t, StateProvider as n, VisibilityProvider as r } from "./node_modules/@json-render/solid/dist/index.js";
2
- import { createAtom as i } from "./node_modules/@xstate/store/dist/store-69e7e2d5.esm.js";
3
- import { xstateStoreStateStore as a } from "./node_modules/@json-render/xstate/dist/index.js";
4
- import { ActorProvider as o } from "./useActor.js";
5
- import { createComponent as s } from "solid-js/web";
6
- import { ErrorBoundary as c, createSignal as l, onCleanup as u } from "solid-js";
7
- import { watchSignal as d } from "@xmachines/play-signals";
1
+ import { ActionProvider as e, Renderer as t, StateProvider as n, VisibilityProvider as r, useStateStore as i } from "./node_modules/@json-render/solid/dist/index.js";
2
+ import { createAtom as a } from "./node_modules/@xstate/store/dist/store-69e7e2d5.esm.js";
3
+ import { xstateStoreStateStore as o } from "./node_modules/@json-render/xstate/dist/index.js";
4
+ import { ActorProvider as s } from "./useActor.js";
5
+ import { createComponent as c } from "solid-js/web";
6
+ import { ErrorBoundary as l, createSignal as u, onCleanup as d } from "solid-js";
7
+ import { watchSignal as f } from "@xmachines/play-signals";
8
8
  //#region src/PlayRenderer.tsx
9
- var f = (f) => {
10
- let [p, m] = l(f.actor.currentView.get()), h = null, g = null, _ = d(f.actor.currentView, (e) => {
11
- m(e);
9
+ var p = (n) => {
10
+ let a = i(), o = (e) => {
11
+ let t = a.getSnapshot();
12
+ a.update(e(t));
13
+ }, s = () => n.registryResult.handlers(() => o, () => a.getSnapshot());
14
+ return c(e, {
15
+ get handlers() {
16
+ return s();
17
+ },
18
+ get children() {
19
+ return c(r, { get children() {
20
+ return c(t, {
21
+ get spec() {
22
+ return n.spec;
23
+ },
24
+ get registry() {
25
+ return n.registryResult.registry;
26
+ }
27
+ });
28
+ } });
29
+ }
30
+ });
31
+ }, m = (e) => {
32
+ let [t, r] = u(e.actor.currentView.get()), i = null, m = null, h = f(e.actor.currentView, (e) => {
33
+ r(e);
12
34
  });
13
- return u(() => {
14
- _();
15
- }), s(o, {
35
+ return d(() => {
36
+ h();
37
+ }), c(s, {
16
38
  get value() {
17
- return f.actor;
39
+ return e.actor;
18
40
  },
19
41
  get children() {
20
- return s(c, {
21
- fallback: (e) => (f.onError?.(e), f.fallback ?? null),
42
+ return c(l, {
43
+ fallback: (t) => (e.onError?.(t), e.fallback ?? null),
22
44
  get children() {
23
45
  return (() => {
24
- let o = p();
25
- if (!o) return f.fallback ?? null;
26
- let c;
27
- f.store ? c = f.store : ((h === null || g !== o) && (h = a({ atom: i(o.spec.state ?? {}) }), g = o), c = h);
28
- let l = Object.fromEntries(Object.entries(f.actions ?? {}).map(([e, t]) => [e, async (e = {}) => f.actor.send({
29
- type: t,
30
- ...e
31
- })]));
32
- return s(n, {
33
- store: c,
46
+ let r = t();
47
+ if (!r) return e.fallback ?? null;
48
+ let s;
49
+ return e.store ? s = e.store : ((i === null || m !== r) && (i = o({ atom: a(r.spec.state ?? {}) }), m = r), s = i), c(n, {
50
+ store: s,
34
51
  get children() {
35
- return s(e, {
36
- handlers: l,
37
- get children() {
38
- return s(r, { get children() {
39
- return s(t, {
40
- get spec() {
41
- return o.spec;
42
- },
43
- get registry() {
44
- return f.registry;
45
- }
46
- });
47
- } });
52
+ return c(p, {
53
+ get registryResult() {
54
+ return e.registryResult;
55
+ },
56
+ get spec() {
57
+ return r.spec;
48
58
  }
49
59
  });
50
60
  }
@@ -56,6 +66,6 @@ var f = (f) => {
56
66
  });
57
67
  };
58
68
  //#endregion
59
- export { f as PlayRenderer };
69
+ export { m as PlayRenderer };
60
70
 
61
71
  //# sourceMappingURL=PlayRenderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlayRenderer.js","names":["createSignal","onCleanup","ErrorBoundary","Component","Renderer","StateProvider","ActionProvider","VisibilityProvider","ActionHandler","StateStore","createAtom","xstateStoreStateStore","watchSignal","PlayRendererProps","ViewMetadata","ActorProvider","PlayActor","PlayRenderer","props","view","setView","actor","currentView","get","internalStore","lastView","unwatch","nextView","_$createComponent","value","children","fallback","err","onError","store","initialState","spec","state","Record","atom","handlers","Object","fromEntries","entries","actions","map","actionName","eventType","params","send","type","registry"],"sources":["../src/PlayRenderer.tsx"],"sourcesContent":["/**\n * PlayRenderer - Main SolidJS renderer component for XMachines Play architecture\n *\n * @packageDocumentation\n */\n\nimport { createSignal, onCleanup, ErrorBoundary, type Component } from \"solid-js\";\nimport { Renderer, StateProvider, ActionProvider, VisibilityProvider } from \"@json-render/solid\";\nimport type { ActionHandler, StateStore } from \"@json-render/core\";\nimport { createAtom } from \"@xstate/store\";\nimport { xstateStoreStateStore } from \"@json-render/xstate\";\nimport { watchSignal } from \"@xmachines/play-signals\";\nimport type { PlayRendererProps } from \"./types.js\";\nimport type { ViewMetadata } from \"@xmachines/play-actor\";\nimport { ActorProvider, type PlayActor } from \"./useActor.js\";\n\n/**\n * Main renderer component that subscribes to actor signals and renders UI\n *\n * Architecture (per XMachines Play patterns):\n * - Subscribes to actor.currentView signal via TC39 Signal.subtle.Watcher\n * - Renders view.spec via @json-render/solid Renderer backed by the registry\n * - Routes actions to actor.send() via ActionProvider handlers\n * - SolidJS signal only for triggering renders, NOT business logic\n * - State store: uses external `store` prop if provided (controlled mode); otherwise\n * creates a fresh @xstate/store atom per view transition seeded from spec.state.\n * - Wraps the render path in a SolidJS `ErrorBoundary` to contain catalog component\n * render failures. The `fallback` prop is shown on error; `onError` is called for\n * observability forwarding (Sentry, Datadog, etc.).\n *\n * Invariant: Actor Authority - Actor decides all state transitions via guards.\n * Invariant: Passive Infrastructure - Component observes signals and sends events.\n * Invariant: Signal-Only Reactivity - Business logic state lives in actor signals.\n *\n * @example\n * ```typescript\n * import { PlayRenderer } from \"@xmachines/play-solid\";\n * import { defineRegistry } from \"@json-render/solid\";\n *\n * const { registry } = defineRegistry(catalog, { components: { ... } });\n *\n * // Uncontrolled — fresh atom per view, seeded from spec.state:\n * <PlayRenderer actor={actor} registry={registry} actions={{ login: \"auth.login\" }} />\n *\n * // Controlled — caller provides and owns the store:\n * import { createAtom } from \"@xstate/store\";\n * import { xstateStoreStateStore } from \"@json-render/xstate\";\n * const store = xstateStoreStateStore({ atom: createAtom({ username: \"\" }) });\n * <PlayRenderer actor={actor} registry={registry} store={store} actions={{ login: \"auth.login\" }} />\n *\n * // With observability hook:\n * <PlayRenderer actor={actor} registry={registry} onError={(err) => Sentry.captureException(err)} />\n * ```\n */\nexport const PlayRenderer: Component<PlayRendererProps> = (props) => {\n\t// Create SolidJS signal for view\n\t// Signal is NOT business logic state - it's just SolidJS's render trigger\n\tconst [view, setView] = createSignal<ViewMetadata | null>(\n\t\tprops.actor.currentView.get() as ViewMetadata | null,\n\t);\n\n\t// Internal per-view store — recreated on each view transition when no external store.\n\tlet internalStore: StateStore | null = null;\n\tlet lastView: ViewMetadata | null = null;\n\n\t// Bridge TC39 Signal to SolidJS signal — subscribe synchronously during setup\n\t// (matching React/Vue behavior; onMount would defer until after DOM insertion,\n\t// silently dropping signal changes between createSignal and mount)\n\tconst unwatch = watchSignal(props.actor.currentView, (nextView: ViewMetadata | null) => {\n\t\tsetView(nextView);\n\t});\n\tonCleanup(() => {\n\t\tunwatch();\n\t});\n\n\treturn (\n\t\t<ActorProvider value={props.actor as PlayActor}>\n\t\t\t<ErrorBoundary\n\t\t\t\tfallback={(err: unknown) => {\n\t\t\t\t\tprops.onError?.(err);\n\t\t\t\t\treturn props.fallback ?? null;\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{(() => {\n\t\t\t\t\tconst currentView = view();\n\t\t\t\t\tif (!currentView) return props.fallback ?? null;\n\n\t\t\t\t\t// Resolve the store: external (controlled) or internal per-view atom\n\t\t\t\t\tlet store: StateStore;\n\t\t\t\t\tif (props.store) {\n\t\t\t\t\t\tstore = props.store;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (internalStore === null || lastView !== currentView) {\n\t\t\t\t\t\t\tconst initialState =\n\t\t\t\t\t\t\t\t(currentView.spec.state as Record<string, unknown>) ?? {};\n\t\t\t\t\t\t\tinternalStore = xstateStoreStateStore({\n\t\t\t\t\t\t\t\tatom: createAtom(initialState),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tlastView = currentView;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstore = internalStore;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst handlers: Record<string, ActionHandler> = Object.fromEntries(\n\t\t\t\t\t\tObject.entries(props.actions ?? {}).map(([actionName, eventType]) => [\n\t\t\t\t\t\t\tactionName,\n\t\t\t\t\t\t\tasync (params: Record<string, unknown> = {}) =>\n\t\t\t\t\t\t\t\tprops.actor.send({ type: eventType, ...params }),\n\t\t\t\t\t\t]),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<StateProvider store={store}>\n\t\t\t\t\t\t\t<ActionProvider handlers={handlers}>\n\t\t\t\t\t\t\t\t<VisibilityProvider>\n\t\t\t\t\t\t\t\t\t<Renderer spec={currentView.spec} registry={props.registry} />\n\t\t\t\t\t\t\t\t</VisibilityProvider>\n\t\t\t\t\t\t\t</ActionProvider>\n\t\t\t\t\t\t</StateProvider>\n\t\t\t\t\t);\n\t\t\t\t})()}\n\t\t\t</ErrorBoundary>\n\t\t</ActorProvider>\n\t);\n};\n"],"mappings":";;;;;;;;AAsDA,IAAaiB,KAA8CC,MAAU;CAGpE,IAAM,CAACC,GAAMC,KAAWpB,EACvBkB,EAAMG,MAAMC,YAAYC,KAAK,CAC7B,EAGGC,IAAmC,MACnCC,IAAgC,MAK9BC,IAAUd,EAAYM,EAAMG,MAAMC,cAAcK,MAAkC;AACvFP,IAAQO,EAAS;GAChB;AAKF,QAJA1B,QAAgB;AACfyB,KAAS;GACR,EAEFE,EACEb,GAAa;EAAA,IAACc,QAAK;AAAA,UAAEX,EAAMG;;EAAkB,IAAAS,WAAA;AAAA,UAAAF,EAC5C1B,GAAa;IACb6B,WAAWC,OACVd,EAAMe,UAAUD,EAAI,EACbd,EAAMa,YAAY;IACzB,IAAAD,WAAA;AAAA,mBAEO;MACP,IAAMR,IAAcH,GAAM;AAC1B,UAAI,CAACG,EAAa,QAAOJ,EAAMa,YAAY;MAG3C,IAAIG;AACJ,MAAIhB,EAAMgB,QACTA,IAAQhB,EAAMgB,UAEVV,MAAkB,QAAQC,MAAaH,OAG1CE,IAAgBb,EAAsB,EACrC4B,MAAM7B,EAFLY,EAAYc,KAAKC,SAAqC,EAAE,CAE5B,EAC7B,CAAC,EACFZ,IAAWH,IAEZY,IAAQV;MAGT,IAAMgB,IAA0CC,OAAOC,YACtDD,OAAOE,QAAQzB,EAAM0B,WAAW,EAAE,CAAC,CAACC,KAAK,CAACC,GAAYC,OAAe,CACpED,GACA,OAAOE,IAAkC,EAAE,KAC1C9B,EAAMG,MAAM4B,KAAK;OAAEC,MAAMH;OAAW,GAAGC;OAAQ,CAAC,CACjD,CACF,CAAC;AAED,aAAApB,EACEvB,GAAa;OAAQ6B;OAAK,IAAAJ,WAAA;AAAA,eAAAF,EACzBtB,GAAc;SAAWkC;SAAQ,IAAAV,WAAA;AAAA,iBAAAF,EAChCrB,GAAkB,EAAA,IAAAuB,WAAA;AAAA,kBAAAF,EACjBxB,GAAQ;YAAA,IAACgC,OAAI;AAAA,oBAAEd,EAAYc;;YAAI,IAAEe,WAAQ;AAAA,oBAAEjC,EAAMiC;;YAAQ,CAAA;aAAA,CAAA;;SAAA,CAAA;;OAAA,CAAA;SAK3D;;IAAA,CAAA;;EAAA,CAAA"}
1
+ {"version":3,"file":"PlayRenderer.js","names":["createSignal","onCleanup","ErrorBoundary","Component","Renderer","StateProvider","ActionProvider","VisibilityProvider","useStateStore","ActionHandler","StateStore","DefineRegistryResult","SetState","createAtom","xstateStoreStateStore","watchSignal","PlayRendererProps","ViewMetadata","ActorProvider","PlayActor","PlayRendererInner","registryResult","spec","Spec","innerProps","stateCtx","setStateAdapter","updater","prev","getSnapshot","update","handlers","Record","_$createComponent","children","registry","PlayRenderer","props","view","setView","actor","currentView","get","internalStore","lastView","unwatch","nextView","value","fallback","err","onError","store","initialState","state","atom"],"sources":["../src/PlayRenderer.tsx"],"sourcesContent":["/**\n * PlayRenderer - Main SolidJS renderer component for XMachines Play architecture\n *\n * @packageDocumentation\n */\n\nimport { createSignal, onCleanup, ErrorBoundary, type Component } from \"solid-js\";\nimport {\n\tRenderer,\n\tStateProvider,\n\tActionProvider,\n\tVisibilityProvider,\n\tuseStateStore,\n} from \"@json-render/solid\";\nimport type { ActionHandler, StateStore } from \"@json-render/core\";\nimport type { DefineRegistryResult, SetState } from \"@json-render/solid\";\nimport { createAtom } from \"@xstate/store\";\nimport { xstateStoreStateStore } from \"@json-render/xstate\";\nimport { watchSignal } from \"@xmachines/play-signals\";\nimport type { PlayRendererProps } from \"./types.js\";\nimport type { ViewMetadata } from \"@xmachines/play-actor\";\nimport { ActorProvider, type PlayActor } from \"./useActor.js\";\n\n/**\n * Inner component that renders inside StateProvider so it can call useStateStore()\n * to get the live set/getSnapshot functions needed by registryResult.handlers().\n */\nconst PlayRendererInner: Component<{\n\tregistryResult: DefineRegistryResult;\n\tspec: import(\"@json-render/core\").Spec | null;\n}> = (innerProps) => {\n\tconst stateCtx = useStateStore();\n\n\t// Build a SetState adapter: the handlers factory expects an updater-function pattern\n\t// ((prev) => next), while stateCtx provides path-based set/update. This adapter\n\t// bridges the two so action functions can use setState if needed.\n\tconst setStateAdapter: SetState = (updater) => {\n\t\tconst prev = stateCtx.getSnapshot();\n\t\tstateCtx.update(updater(prev));\n\t};\n\n\tconst handlers = (): Record<string, ActionHandler> =>\n\t\tinnerProps.registryResult.handlers(\n\t\t\t() => setStateAdapter,\n\t\t\t() => stateCtx.getSnapshot(),\n\t\t);\n\n\treturn (\n\t\t<ActionProvider handlers={handlers()}>\n\t\t\t<VisibilityProvider>\n\t\t\t\t<Renderer spec={innerProps.spec} registry={innerProps.registryResult.registry} />\n\t\t\t</VisibilityProvider>\n\t\t</ActionProvider>\n\t);\n};\n\n/**\n * Main renderer component that subscribes to actor signals and renders UI\n *\n * Architecture:\n * - Subscribes to actor.currentView signal via TC39 Signal.subtle.Watcher\n * - Renders view.spec via StateProvider PlayRendererInner (with ActionProvider + handlers)\n * - Routes actions to actor.send() via registryResult.handlers() — real async functions\n * - SolidJS signal only for triggering renders, NOT business logic\n * - State store: uses external `store` prop if provided (controlled mode); otherwise\n * creates a fresh @xstate/store atom per view transition seeded from spec.state.\n * - Wraps the render path in a SolidJS `ErrorBoundary` to contain catalog component\n * render failures. The `fallback` prop is shown on error; `onError` is called for\n * observability forwarding (Sentry, Datadog, etc.).\n *\n * Invariant: Actor Authority - Actor decides all state transitions via guards.\n * Invariant: Passive Infrastructure - Component observes signals and sends events.\n * Invariant: Signal-Only Reactivity - Business logic state lives in actor signals.\n */\nexport const PlayRenderer: Component<PlayRendererProps> = (props) => {\n\t// Create SolidJS signal for view\n\tconst [view, setView] = createSignal<ViewMetadata | null>(\n\t\tprops.actor.currentView.get() as ViewMetadata | null,\n\t);\n\n\t// Internal per-view store — recreated on each view transition when no external store.\n\tlet internalStore: StateStore | null = null;\n\tlet lastView: ViewMetadata | null = null;\n\n\t// Bridge TC39 Signal to SolidJS signal — subscribe synchronously during setup\n\tconst unwatch = watchSignal(props.actor.currentView, (nextView: ViewMetadata | null) => {\n\t\tsetView(nextView);\n\t});\n\tonCleanup(() => {\n\t\tunwatch();\n\t});\n\n\treturn (\n\t\t<ActorProvider value={props.actor as PlayActor}>\n\t\t\t<ErrorBoundary\n\t\t\t\tfallback={(err: unknown) => {\n\t\t\t\t\tprops.onError?.(err);\n\t\t\t\t\treturn props.fallback ?? null;\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{(() => {\n\t\t\t\t\tconst currentView = view();\n\t\t\t\t\tif (!currentView) return props.fallback ?? null;\n\n\t\t\t\t\t// Resolve the store: external (controlled) or internal per-view atom\n\t\t\t\t\tlet store: StateStore;\n\t\t\t\t\tif (props.store) {\n\t\t\t\t\t\tstore = props.store;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (internalStore === null || lastView !== currentView) {\n\t\t\t\t\t\t\tconst initialState =\n\t\t\t\t\t\t\t\t(currentView.spec.state as Record<string, unknown>) ?? {};\n\t\t\t\t\t\t\tinternalStore = xstateStoreStateStore({\n\t\t\t\t\t\t\t\tatom: createAtom(initialState),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tlastView = currentView;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstore = internalStore;\n\t\t\t\t\t}\n\n\t\t\t\t\t// PlayRendererInner renders inside StateProvider so useStateStore() works\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<StateProvider store={store}>\n\t\t\t\t\t\t\t<PlayRendererInner\n\t\t\t\t\t\t\t\tregistryResult={props.registryResult}\n\t\t\t\t\t\t\t\tspec={currentView.spec}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</StateProvider>\n\t\t\t\t\t);\n\t\t\t\t})()}\n\t\t\t</ErrorBoundary>\n\t\t</ActorProvider>\n\t);\n};\n"],"mappings":";;;;;;;;AA2BA,IAAMoB,KAGAI,MAAe;CACpB,IAAMC,IAAWjB,GAAe,EAK1BkB,KAA6BC,MAAY;EAC9C,IAAMC,IAAOH,EAASI,aAAa;AACnCJ,IAASK,OAAOH,EAAQC,EAAK,CAAC;IAGzBG,UACLP,EAAWH,eAAeU,eACnBL,SACAD,EAASI,aAChB,CAAC;AAEF,QAAAI,EACE3B,GAAc;EAAA,IAACyB,WAAQ;AAAA,UAAEA,GAAU;;EAAA,IAAAG,WAAA;AAAA,UAAAD,EAClC1B,GAAkB,EAAA,IAAA2B,WAAA;AAAA,WAAAD,EACjB7B,GAAQ;KAAA,IAACkB,OAAI;AAAA,aAAEE,EAAWF;;KAAI,IAAEa,WAAQ;AAAA,aAAEX,EAAWH,eAAec;;KAAQ,CAAA;MAAA,CAAA;;EAAA,CAAA;GAwBpEC,KAA8CC,MAAU;CAEpE,IAAM,CAACC,GAAMC,KAAWvC,EACvBqC,EAAMG,MAAMC,YAAYC,KAAK,CAC7B,EAGGC,IAAmC,MACnCC,IAAgC,MAG9BC,IAAU9B,EAAYsB,EAAMG,MAAMC,cAAcK,MAAkC;AACvFP,IAAQO,EAAS;GAChB;AAKF,QAJA7C,QAAgB;AACf4C,KAAS;GACR,EAEFZ,EACEf,GAAa;EAAA,IAAC6B,QAAK;AAAA,UAAEV,EAAMG;;EAAkB,IAAAN,WAAA;AAAA,UAAAD,EAC5C/B,GAAa;IACb8C,WAAWC,OACVZ,EAAMa,UAAUD,EAAI,EACbZ,EAAMW,YAAY;IACzB,IAAAd,WAAA;AAAA,mBAEO;MACP,IAAMO,IAAcH,GAAM;AAC1B,UAAI,CAACG,EAAa,QAAOJ,EAAMW,YAAY;MAG3C,IAAIG;AAgBJ,aAfId,EAAMc,QACTA,IAAQd,EAAMc,UAEVR,MAAkB,QAAQC,MAAaH,OAG1CE,IAAgB7B,EAAsB,EACrCwC,MAAMzC,EAFL4B,EAAYnB,KAAK+B,SAAqC,EAAE,CAE5B,EAC7B,CAAC,EACFT,IAAWH,IAEZU,IAAQR,IAITV,EACE5B,GAAa;OAAQ8C;OAAK,IAAAjB,WAAA;AAAA,eAAAD,EACzBb,GAAiB;SAAA,IACjBC,iBAAc;AAAA,iBAAEgB,EAAMhB;;SAAc,IACpCC,OAAI;AAAA,iBAAEmB,EAAYnB;;SAAI,CAAA;;OAAA,CAAA;SAItB;;IAAA,CAAA;;EAAA,CAAA"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { defineRegistry as e, useStateBinding as t } from "./node_modules/@json-render/solid/dist/index.js";
1
+ import { defineRegistry as e, useBoundProp as t } from "./node_modules/@json-render/solid/dist/index.js";
2
2
  import { useActor as n } from "./useActor.js";
3
3
  import { PlayRenderer as r } from "./PlayRenderer.js";
4
- export { r as PlayRenderer, e as defineRegistry, n as useActor, t as useStateBinding };
4
+ export { r as PlayRenderer, e as defineRegistry, n as useActor, t as useBoundProp };
@@ -78,57 +78,53 @@ function C() {
78
78
  if (!e) throw Error("useStateStore must be used within a StateProvider");
79
79
  return e;
80
80
  }
81
- function w(e) {
82
- let t = C();
83
- return [g(() => n(t.state, e)), (n) => t.set(e, n)];
84
- }
85
- var T = m(null);
86
- function E(e) {
81
+ var w = m(null);
82
+ function T(e) {
87
83
  let t = C(), n = { get stateModel() {
88
84
  return t.state;
89
85
  } }, i = {
90
86
  isVisible: (e) => r(e, n),
91
87
  ctx: n
92
88
  };
93
- return l(T.Provider, {
89
+ return l(w.Provider, {
94
90
  value: i,
95
91
  get children() {
96
92
  return e.children;
97
93
  }
98
94
  });
99
95
  }
100
- function D() {
101
- let e = y(T);
96
+ function E() {
97
+ let e = y(w);
102
98
  if (!e) throw Error("useVisibility must be used within a VisibilityProvider");
103
99
  return e;
104
100
  }
105
- var O = m(null);
106
- function k() {
107
- return y(O);
101
+ var D = m(null);
102
+ function O() {
103
+ return y(D);
108
104
  }
109
- var A = 0;
110
- function j() {
111
- return A += 1, `${Date.now()}-${A}`;
105
+ var k = 0;
106
+ function A() {
107
+ return k += 1, `${Date.now()}-${k}`;
112
108
  }
113
- function M(e, t) {
109
+ function j(e, t) {
114
110
  if (e == null) return e;
115
- if (e === "$id") return j();
111
+ if (e === "$id") return A();
116
112
  if (typeof e == "object" && !Array.isArray(e)) {
117
113
  let n = e, r = Object.keys(n);
118
114
  if (r.length === 1 && typeof n.$state == "string") return t(n.$state);
119
- if (r.length === 1 && "$id" in n) return j();
115
+ if (r.length === 1 && "$id" in n) return A();
120
116
  }
121
- if (Array.isArray(e)) return e.map((e) => M(e, t));
117
+ if (Array.isArray(e)) return e.map((e) => j(e, t));
122
118
  if (typeof e == "object") {
123
119
  let n = {};
124
- for (let [r, i] of Object.entries(e)) n[r] = M(i, t);
120
+ for (let [r, i] of Object.entries(e)) n[r] = j(i, t);
125
121
  return n;
126
122
  }
127
123
  return e;
128
124
  }
129
- var N = m(null);
130
- function P(e) {
131
- let { get: t, set: n, getSnapshot: r } = C(), o = k(), [s, c] = _(e.handlers ?? {}), [u, d] = _(/* @__PURE__ */ new Set()), [f, p] = _(null), m = (e, t) => {
125
+ var M = m(null);
126
+ function N(e) {
127
+ let { get: t, set: n, getSnapshot: r } = C(), o = O(), [s, c] = _(e.handlers ?? {}), [u, d] = _(/* @__PURE__ */ new Set()), [f, p] = _(null), m = (e, t) => {
132
128
  c((n) => ({
133
129
  ...n,
134
130
  [e]: t
@@ -143,7 +139,7 @@ function P(e) {
143
139
  if (l.action === "pushState" && l.params) {
144
140
  let e = l.params.statePath, r = l.params.value;
145
141
  if (e) {
146
- let i = M(r, t);
142
+ let i = j(r, t);
147
143
  n(e, [...t(e) ?? [], i]);
148
144
  let a = l.params.clearStatePath;
149
145
  a && n(a, "");
@@ -256,22 +252,22 @@ function P(e) {
256
252
  },
257
253
  registerHandler: m
258
254
  };
259
- return l(N.Provider, {
255
+ return l(M.Provider, {
260
256
  value: g,
261
257
  get children() {
262
258
  return e.children;
263
259
  }
264
260
  });
265
261
  }
266
- function F() {
267
- let e = y(N);
262
+ function P() {
263
+ let e = y(M);
268
264
  if (!e) throw Error("useActions must be used within an ActionProvider");
269
265
  return e;
270
266
  }
271
267
  u(["click"]);
272
- var I = m(null);
273
- function L(e) {
274
- return l(I.Provider, {
268
+ var F = m(null);
269
+ function I(e) {
270
+ return l(F.Provider, {
275
271
  get value() {
276
272
  return {
277
273
  item: e.item,
@@ -284,15 +280,15 @@ function L(e) {
284
280
  }
285
281
  });
286
282
  }
287
- function R() {
288
- return y(I);
283
+ function L() {
284
+ return y(F);
289
285
  }
290
- var z = {}, B = m(z);
291
- function V() {
292
- return y(B) ?? z;
286
+ var R = {}, z = m(R);
287
+ function B() {
288
+ return y(z) ?? R;
293
289
  }
294
- function H(e) {
295
- let t = R(), { ctx: n } = D(), { execute: i } = F(), a = C(), u = () => a.getSnapshot(), f = V(), m = g(() => {
290
+ function V(e) {
291
+ let t = L(), { ctx: n } = E(), { execute: i } = P(), a = C(), u = () => a.getSnapshot(), f = B(), m = g(() => {
296
292
  let e = t?.item, r = t?.index, i = t?.basePath;
297
293
  return {
298
294
  get stateModel() {
@@ -387,7 +383,7 @@ function H(e) {
387
383
  return l(d, {
388
384
  fallback: (t) => (console.error(`[json-render] Rendering error in <${e.element.type}>:`, t), null),
389
385
  get children() {
390
- return l(U, {
386
+ return l(H, {
391
387
  get resolvedElement() {
392
388
  return S();
393
389
  },
@@ -414,7 +410,7 @@ function H(e) {
414
410
  }
415
411
  });
416
412
  }
417
- function U(e) {
413
+ function H(e) {
418
414
  let t = () => e.registry[e.resolvedElement.type] ?? e.fallback;
419
415
  return l(p, {
420
416
  get when() {
@@ -424,7 +420,7 @@ function U(e) {
424
420
  return console.warn(`No renderer for component type: ${e.resolvedElement.type}`), null;
425
421
  },
426
422
  children: (t) => {
427
- let n = t(), r = () => e.resolvedElement.repeat ? l(W, {
423
+ let n = t(), r = () => e.resolvedElement.repeat ? l(U, {
428
424
  get element() {
429
425
  return e.resolvedElement;
430
426
  },
@@ -453,7 +449,7 @@ function U(e) {
453
449
  get fallback() {
454
450
  return e.loading || console.warn(`[json-render] Missing element "${t}" referenced as child of "${e.resolvedElement.type}". This element will not render.`), null;
455
451
  },
456
- children: (t) => l(H, {
452
+ children: (t) => l(V, {
457
453
  get element() {
458
454
  return t();
459
455
  },
@@ -496,13 +492,13 @@ function U(e) {
496
492
  }
497
493
  });
498
494
  }
499
- function W(e) {
495
+ function U(e) {
500
496
  let t = C(), r = () => e.element.repeat, i = () => r().statePath, a = () => n(t.state, i()) ?? [];
501
497
  return l(f, {
502
498
  get each() {
503
499
  return a();
504
500
  },
505
- children: (t, n) => l(L, {
501
+ children: (t, n) => l(I, {
506
502
  item: t,
507
503
  get index() {
508
504
  return n();
@@ -524,7 +520,7 @@ function W(e) {
524
520
  get fallback() {
525
521
  return e.loading || console.warn(`[json-render] Missing element "${t}" referenced as child of "${e.element.type}" (repeat). This element will not render.`), null;
526
522
  },
527
- children: (t) => l(H, {
523
+ children: (t) => l(V, {
528
524
  get element() {
529
525
  return t();
530
526
  },
@@ -548,7 +544,7 @@ function W(e) {
548
544
  })
549
545
  });
550
546
  }
551
- function G(e) {
547
+ function W(e) {
552
548
  let t = g(() => {
553
549
  let t = e.spec;
554
550
  if (!(!t || !t.root)) return t.elements[t.root];
@@ -557,7 +553,7 @@ function G(e) {
557
553
  get when() {
558
554
  return t();
559
555
  },
560
- children: (t) => l(H, {
556
+ children: (t) => l(V, {
561
557
  get element() {
562
558
  return t();
563
559
  },
@@ -576,7 +572,7 @@ function G(e) {
576
572
  })
577
573
  });
578
574
  }
579
- function K(e, t) {
575
+ function G(e, t) {
580
576
  let n = {};
581
577
  if (t.components) for (let [e, r] of Object.entries(t.components)) n[e] = (e) => r({
582
578
  get props() {
@@ -611,7 +607,13 @@ function K(e, t) {
611
607
  }
612
608
  };
613
609
  }
610
+ function K(e, t) {
611
+ let { set: n } = C();
612
+ return [e, (e) => {
613
+ t && n(t, e);
614
+ }];
615
+ }
614
616
  //#endregion
615
- export { P as ActionProvider, G as Renderer, S as StateProvider, E as VisibilityProvider, K as defineRegistry, w as useStateBinding };
617
+ export { N as ActionProvider, W as Renderer, S as StateProvider, T as VisibilityProvider, G as defineRegistry, K as useBoundProp, C as useStateStore };
616
618
 
617
619
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_$createComponent","createContext2","_$createComponent2","useContext2","createContext3","useContext3","createContext4","createSignal3","_$createComponent4","useContext4","_$delegateEvents","createContext5","_$createComponent5","useContext5","createContext6","useContext6","createMemo3","evaluateVisibility2","_$createComponent6","getByPath2"],"sources":["../../../../../../../node_modules/@json-render/solid/dist/index.mjs"],"sourcesContent":["import {\n elementTreeSchema,\n schema\n} from \"./chunk-XTSB6FIM.mjs\";\n\n// src/contexts/state.tsx\nimport { createComponent as _$createComponent } from \"solid-js/web\";\nimport { createContext, useContext, createSignal, createEffect, createMemo, onCleanup } from \"solid-js\";\nimport { getByPath, createStateStore } from \"@json-render/core\";\nimport { flattenToPointers } from \"@json-render/core/store-utils\";\nvar StateContext = createContext(null);\nfunction computeInitialFlat(isControlled, initialState) {\n if (isControlled) return null;\n if (Object.keys(initialState).length === 0) return {};\n return flattenToPointers(initialState);\n}\nfunction StateProvider(props) {\n let internalStore;\n if (!props.store) {\n internalStore = createStateStore(props.initialState ?? {});\n }\n const store = () => props.store ?? internalStore;\n const initialMode = props.store ? \"controlled\" : \"uncontrolled\";\n let modeWarned = false;\n if (typeof globalThis !== \"undefined\" && globalThis.process?.env?.NODE_ENV !== \"production\") {\n createEffect(() => {\n const currentMode = props.store ? \"controlled\" : \"uncontrolled\";\n if (currentMode !== initialMode && !modeWarned) {\n modeWarned = true;\n console.warn(`StateProvider: switching from ${initialMode} to ${currentMode} mode is not supported.`);\n }\n });\n }\n let prevInitialState = props.initialState;\n let prevFlat = computeInitialFlat(!!props.store, props.initialState ?? {});\n createEffect(() => {\n if (props.store) return;\n const initialState = props.initialState ?? {};\n if (initialState === prevInitialState) return;\n prevInitialState = initialState;\n const nextFlat = initialState && Object.keys(initialState).length > 0 ? flattenToPointers(initialState) : {};\n const prevFlatObj = prevFlat ?? {};\n const allKeys = /* @__PURE__ */ new Set([...Object.keys(prevFlatObj), ...Object.keys(nextFlat)]);\n const updates = {};\n for (const key of allKeys) {\n if (prevFlatObj[key] !== nextFlat[key]) {\n updates[key] = key in nextFlat ? nextFlat[key] : void 0;\n }\n }\n prevFlat = nextFlat;\n if (Object.keys(updates).length > 0) {\n store().update(updates);\n }\n });\n const [state, setState] = createSignal(store().getSnapshot(), {\n equals: false\n });\n const changeListeners = /* @__PURE__ */ new Set();\n const subscribeChanges = (listener) => {\n changeListeners.add(listener);\n return () => {\n changeListeners.delete(listener);\n };\n };\n const notifyChanges = (changes) => {\n for (const listener of changeListeners) {\n listener(changes);\n }\n };\n createEffect(() => {\n const s = store();\n setState(s.getSnapshot());\n const unsubscribe = s.subscribe(() => {\n setState(s.getSnapshot());\n });\n onCleanup(unsubscribe);\n });\n const set = (path, value) => {\n const s = store();\n const prev = s.getSnapshot();\n const prevValue = getByPath(prev, path);\n s.set(path, value);\n if (prevValue !== value) {\n const changes = [{\n path,\n value\n }];\n notifyChanges(changes);\n if (!props.store && s.getSnapshot() !== prev) {\n props.onStateChange?.(changes);\n }\n }\n };\n const update = (updates) => {\n const s = store();\n const prev = s.getSnapshot();\n s.update(updates);\n const changes = [];\n for (const [path, value] of Object.entries(updates)) {\n if (getByPath(prev, path) !== value) {\n changes.push({\n path,\n value\n });\n }\n }\n if (changes.length > 0) {\n notifyChanges(changes);\n if (!props.store && s.getSnapshot() !== prev) {\n props.onStateChange?.(changes);\n }\n }\n };\n const get = (path) => store().get(path);\n const getSnapshot = () => store().getSnapshot();\n const ctx = {\n get state() {\n return state();\n },\n get,\n set,\n update,\n getSnapshot,\n subscribeChanges\n };\n return _$createComponent(StateContext.Provider, {\n value: ctx,\n get children() {\n return props.children;\n }\n });\n}\nfunction useStateStore() {\n const ctx = useContext(StateContext);\n if (!ctx) {\n throw new Error(\"useStateStore must be used within a StateProvider\");\n }\n return ctx;\n}\nfunction useStateValue(path) {\n const store = useStateStore();\n return createMemo(() => getByPath(store.state, path));\n}\nfunction useStateBinding(path) {\n const store = useStateStore();\n const value = createMemo(() => getByPath(store.state, path));\n const setValue = (newValue) => store.set(path, newValue);\n return [value, setValue];\n}\n\n// src/contexts/visibility.tsx\nimport { createComponent as _$createComponent2 } from \"solid-js/web\";\nimport { createContext as createContext2, useContext as useContext2 } from \"solid-js\";\nimport { evaluateVisibility } from \"@json-render/core\";\nvar VisibilityContext = createContext2(null);\nfunction VisibilityProvider(props) {\n const stateStore = useStateStore();\n const visibilityCtx = {\n get stateModel() {\n return stateStore.state;\n }\n };\n const value = {\n isVisible: (condition) => evaluateVisibility(condition, visibilityCtx),\n ctx: visibilityCtx\n };\n return _$createComponent2(VisibilityContext.Provider, {\n value,\n get children() {\n return props.children;\n }\n });\n}\nfunction useVisibility() {\n const ctx = useContext2(VisibilityContext);\n if (!ctx) {\n throw new Error(\"useVisibility must be used within a VisibilityProvider\");\n }\n return ctx;\n}\nfunction useIsVisible(condition) {\n const {\n isVisible\n } = useVisibility();\n return isVisible(condition);\n}\n\n// src/contexts/actions.tsx\nimport { template as _$template } from \"solid-js/web\";\nimport { delegateEvents as _$delegateEvents } from \"solid-js/web\";\nimport { setStyleProperty as _$setStyleProperty } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nimport { memo as _$memo } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { addEventListener as _$addEventListener } from \"solid-js/web\";\nimport { createComponent as _$createComponent4 } from \"solid-js/web\";\nimport { createContext as createContext4, useContext as useContext4, createSignal as createSignal3 } from \"solid-js\";\nimport { resolveAction, executeAction } from \"@json-render/core\";\n\n// src/contexts/validation.tsx\nimport { createComponent as _$createComponent3 } from \"solid-js/web\";\nimport { createContext as createContext3, useContext as useContext3, createSignal as createSignal2, createEffect as createEffect2, createMemo as createMemo2 } from \"solid-js\";\nimport { runValidation } from \"@json-render/core\";\nvar ValidationContext = createContext3(null);\nfunction dynamicArgsEqual(a, b) {\n if (a === b) return true;\n if (!a || !b) return false;\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n const va = a[key];\n const vb = b[key];\n if (va === vb) continue;\n if (typeof va === \"object\" && va !== null && typeof vb === \"object\" && vb !== null) {\n const sa = va.$state;\n const sb = vb.$state;\n if (typeof sa === \"string\" && sa === sb) continue;\n }\n return false;\n }\n return true;\n}\nfunction validationConfigEqual(a, b) {\n if (a === b) return true;\n if (a.validateOn !== b.validateOn) return false;\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\n for (let i = 0; i < ac.length; i++) {\n const ca = ac[i];\n const cb = bc[i];\n if (ca.type !== cb.type) return false;\n if (ca.message !== cb.message) return false;\n if (!dynamicArgsEqual(ca.args, cb.args)) return false;\n }\n return true;\n}\nfunction ValidationProvider(props) {\n const {\n getSnapshot\n } = useStateStore();\n const customFunctions = () => props.customFunctions ?? {};\n const [fieldStates, setFieldStates] = createSignal2({});\n let fieldStatesRef = {};\n const [fieldConfigs, setFieldConfigs] = createSignal2({});\n const registerField = (path, config) => {\n setFieldConfigs((prev) => {\n const existing = prev[path];\n if (existing && validationConfigEqual(existing, config)) {\n return prev;\n }\n return {\n ...prev,\n [path]: config\n };\n });\n };\n const validate = (path, config) => {\n const currentState = getSnapshot();\n const segments = path.split(\"/\").filter(Boolean);\n let value2 = currentState;\n for (const seg of segments) {\n if (value2 != null && typeof value2 === \"object\") {\n value2 = value2[seg];\n } else {\n value2 = void 0;\n break;\n }\n }\n const result = runValidation(config, {\n value: value2,\n stateModel: currentState,\n customFunctions: customFunctions()\n });\n const newFieldState = {\n touched: fieldStatesRef[path]?.touched ?? true,\n validated: true,\n result\n };\n fieldStatesRef = {\n ...fieldStatesRef,\n [path]: newFieldState\n };\n setFieldStates(fieldStatesRef);\n return result;\n };\n const touch = (path) => {\n fieldStatesRef = {\n ...fieldStatesRef,\n [path]: {\n ...fieldStatesRef[path],\n touched: true,\n validated: fieldStatesRef[path]?.validated ?? false,\n result: fieldStatesRef[path]?.result ?? null\n }\n };\n setFieldStates(fieldStatesRef);\n };\n const clear = (path) => {\n const {\n [path]: _,\n ...rest\n } = fieldStatesRef;\n fieldStatesRef = rest;\n setFieldStates(rest);\n };\n const validateAll = () => {\n let allValid = true;\n for (const [path, config] of Object.entries(fieldConfigs())) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n return allValid;\n };\n const value = {\n get customFunctions() {\n return customFunctions();\n },\n get fieldStates() {\n fieldStates();\n return fieldStatesRef;\n },\n validate,\n touch,\n clear,\n validateAll,\n registerField\n };\n return _$createComponent3(ValidationContext.Provider, {\n value,\n get children() {\n return props.children;\n }\n });\n}\nfunction useValidation() {\n const ctx = useContext3(ValidationContext);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\nfunction useOptionalValidation() {\n return useContext3(ValidationContext);\n}\nfunction useFieldValidation(path, config) {\n const validation = useValidation();\n createEffect2(() => {\n if (path && config) {\n validation.registerField(path, config);\n }\n });\n const state = createMemo2(() => {\n const current = validation.fieldStates[path];\n return current ?? {\n touched: false,\n validated: false,\n result: null\n };\n });\n const validate = () => validation.validate(path, config ?? {\n checks: []\n });\n const touch = () => validation.touch(path);\n const clear = () => validation.clear(path);\n const errors = createMemo2(() => state().result?.errors ?? []);\n const isValid = createMemo2(() => state().result?.valid ?? true);\n return {\n state,\n validate,\n touch,\n clear,\n errors,\n isValid\n };\n}\n\n// src/contexts/actions.tsx\nvar _tmpl$ = /* @__PURE__ */ _$template(`<div style=\"position:fixed;inset:0;background-color:rgba(0, 0, 0, 0.5);display:flex;align-items:center;justify-content:center;z-index:50\"><div style=\"background-color:white;border-radius:8px;padding:24px;max-width:400px;width:100%;box-shadow:0 20px 25px -5px rgba(0, 0, 0, 0.1)\"><h3 style=\"margin:0 0 8px 0;font-size:18px;font-weight:600\"></h3><p style=\"margin:0 0 24px 0;color:#6b7280\"></p><div style=display:flex;gap:12px;justify-content:flex-end><button style=\"padding:8px 16px;border-radius:6px;border:1px solid #d1d5db;background-color:white;cursor:pointer\"></button><button style=\"padding:8px 16px;border-radius:6px;border:none;color:white;cursor:pointer\">`);\nvar idCounter = 0;\nfunction generateUniqueId() {\n idCounter += 1;\n return `${Date.now()}-${idCounter}`;\n}\nfunction deepResolveValue(value, get) {\n if (value === null || value === void 0) return value;\n if (value === \"$id\") {\n return generateUniqueId();\n }\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value;\n const keys = Object.keys(obj);\n if (keys.length === 1 && typeof obj.$state === \"string\") {\n return get(obj.$state);\n }\n if (keys.length === 1 && \"$id\" in obj) {\n return generateUniqueId();\n }\n }\n if (Array.isArray(value)) {\n return value.map((item) => deepResolveValue(item, get));\n }\n if (typeof value === \"object\") {\n const resolved = {};\n for (const [key, val] of Object.entries(value)) {\n resolved[key] = deepResolveValue(val, get);\n }\n return resolved;\n }\n return value;\n}\nvar ActionContext = createContext4(null);\nfunction ActionProvider(props) {\n const {\n get,\n set,\n getSnapshot\n } = useStateStore();\n const validation = useOptionalValidation();\n const [handlers, setHandlers] = createSignal3(props.handlers ?? {});\n const [loadingActions, setLoadingActions] = createSignal3(/* @__PURE__ */ new Set());\n const [pendingConfirmation, setPendingConfirmation] = createSignal3(null);\n const registerHandler = (name, handler) => {\n setHandlers((prev) => ({\n ...prev,\n [name]: handler\n }));\n };\n const execute = async (binding) => {\n const resolved = resolveAction(binding, getSnapshot());\n if (resolved.action === \"setState\" && resolved.params) {\n const statePath = resolved.params.statePath;\n const value = resolved.params.value;\n if (statePath) {\n set(statePath, value);\n }\n return;\n }\n if (resolved.action === \"pushState\" && resolved.params) {\n const statePath = resolved.params.statePath;\n const rawValue = resolved.params.value;\n if (statePath) {\n const resolvedValue = deepResolveValue(rawValue, get);\n const arr = get(statePath) ?? [];\n set(statePath, [...arr, resolvedValue]);\n const clearStatePath = resolved.params.clearStatePath;\n if (clearStatePath) {\n set(clearStatePath, \"\");\n }\n }\n return;\n }\n if (resolved.action === \"removeState\" && resolved.params) {\n const statePath = resolved.params.statePath;\n const index = resolved.params.index;\n if (statePath !== void 0 && index !== void 0) {\n const arr = get(statePath) ?? [];\n set(statePath, arr.filter((_, i) => i !== index));\n }\n return;\n }\n if (resolved.action === \"push\" && resolved.params) {\n const screen = resolved.params.screen;\n if (screen) {\n const currentScreen = get(\"/currentScreen\");\n const navStack = get(\"/navStack\") ?? [];\n if (currentScreen) {\n set(\"/navStack\", [...navStack, currentScreen]);\n } else {\n set(\"/navStack\", [...navStack, \"\"]);\n }\n set(\"/currentScreen\", screen);\n }\n return;\n }\n if (resolved.action === \"pop\") {\n const navStack = get(\"/navStack\") ?? [];\n if (navStack.length > 0) {\n const previousScreen = navStack[navStack.length - 1];\n set(\"/navStack\", navStack.slice(0, -1));\n if (previousScreen) {\n set(\"/currentScreen\", previousScreen);\n } else {\n set(\"/currentScreen\", void 0);\n }\n }\n return;\n }\n if (resolved.action === \"validateForm\") {\n const validateAll = validation?.validateAll;\n if (!validateAll) {\n console.warn(\"validateForm action was dispatched but no ValidationProvider is connected. Ensure ValidationProvider is rendered inside the provider tree.\");\n return;\n }\n const valid = validateAll();\n const errors = {};\n for (const [path, fs] of Object.entries(validation.fieldStates)) {\n if (fs.result && !fs.result.valid) {\n errors[path] = fs.result.errors;\n }\n }\n const statePath = resolved.params?.statePath || \"/formValidation\";\n set(statePath, {\n valid,\n errors\n });\n return;\n }\n const handler = handlers()[resolved.action];\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n if (resolved.confirm) {\n return new Promise((resolve, reject) => {\n setPendingConfirmation({\n action: resolved,\n handler,\n resolve: () => {\n setPendingConfirmation(null);\n resolve();\n },\n reject: () => {\n setPendingConfirmation(null);\n reject(new Error(\"Action cancelled\"));\n }\n });\n }).then(async () => {\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (name) => {\n const subBinding = {\n action: name\n };\n await execute(subBinding);\n }\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n });\n }\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (name) => {\n const subBinding = {\n action: name\n };\n await execute(subBinding);\n }\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n };\n const confirm = () => {\n pendingConfirmation()?.resolve();\n };\n const cancel = () => {\n pendingConfirmation()?.reject();\n };\n const ctx = {\n get handlers() {\n return handlers();\n },\n get loadingActions() {\n return loadingActions();\n },\n get pendingConfirmation() {\n return pendingConfirmation();\n },\n execute,\n confirm,\n cancel,\n registerHandler\n };\n return _$createComponent4(ActionContext.Provider, {\n value: ctx,\n get children() {\n return props.children;\n }\n });\n}\nfunction useActions() {\n const ctx = useContext4(ActionContext);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\nfunction useAction(binding) {\n const actions = useActions();\n return {\n execute: () => actions.execute(binding),\n get isLoading() {\n return actions.loadingActions.has(binding.action);\n }\n };\n}\nfunction ConfirmDialog(props) {\n const isDanger = () => props.confirm.variant === \"danger\";\n return (() => {\n var _el$ = _tmpl$(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling;\n _$addEventListener(_el$, \"click\", props.onCancel, true);\n _el$2.$$click = (e) => e.stopPropagation();\n _$insert(_el$3, () => props.confirm.title);\n _$insert(_el$4, () => props.confirm.message);\n _$addEventListener(_el$6, \"click\", props.onCancel, true);\n _$insert(_el$6, () => props.confirm.cancelLabel ?? \"Cancel\");\n _$addEventListener(_el$7, \"click\", props.onConfirm, true);\n _$insert(_el$7, () => props.confirm.confirmLabel ?? \"Confirm\");\n _$effect((_$p) => _$setStyleProperty(_el$7, \"background-color\", isDanger() ? \"#dc2626\" : \"#3b82f6\"));\n return _el$;\n })();\n}\n_$delegateEvents([\"click\"]);\n\n// src/contexts/repeat-scope.tsx\nimport { createComponent as _$createComponent5 } from \"solid-js/web\";\nimport { createContext as createContext5, useContext as useContext5 } from \"solid-js\";\nvar RepeatScopeContext = createContext5(null);\nfunction RepeatScopeProvider(props) {\n return _$createComponent5(RepeatScopeContext.Provider, {\n get value() {\n return {\n item: props.item,\n index: props.index,\n basePath: props.basePath\n };\n },\n get children() {\n return props.children;\n }\n });\n}\nfunction useRepeatScope() {\n return useContext5(RepeatScopeContext);\n}\n\n// src/index.ts\nimport { createStateStore as createStateStore2 } from \"@json-render/core\";\n\n// src/renderer.tsx\nimport { memo as _$memo2 } from \"solid-js/web\";\nimport { createComponent as _$createComponent6 } from \"solid-js/web\";\nimport { createContext as createContext6, useContext as useContext6, createMemo as createMemo3, createEffect as createEffect3, onCleanup as onCleanup2, ErrorBoundary, Show, For } from \"solid-js\";\nimport { resolveElementProps, resolveBindings, resolveActionParam, evaluateVisibility as evaluateVisibility2, getByPath as getByPath2 } from \"@json-render/core\";\nvar EMPTY_FUNCTIONS = {};\nvar FunctionsContext = createContext6(EMPTY_FUNCTIONS);\nfunction useFunctions() {\n return useContext6(FunctionsContext) ?? EMPTY_FUNCTIONS;\n}\nfunction ElementRenderer(props) {\n const repeatScope = useRepeatScope();\n const {\n ctx\n } = useVisibility();\n const {\n execute\n } = useActions();\n const stateStore = useStateStore();\n const getSnapshot = () => stateStore.getSnapshot();\n const functions = useFunctions();\n const fullCtx = createMemo3(() => {\n const repeatItem = repeatScope?.item;\n const repeatIndex = repeatScope?.index;\n const repeatBasePath = repeatScope?.basePath;\n return {\n get stateModel() {\n return ctx.stateModel;\n },\n ...repeatItem !== void 0 ? {\n repeatItem\n } : {},\n ...repeatIndex !== void 0 ? {\n repeatIndex\n } : {},\n ...repeatBasePath !== void 0 ? {\n repeatBasePath\n } : {},\n functions\n };\n });\n const isVisible = createMemo3(() => props.element.visible === void 0 ? true : evaluateVisibility2(props.element.visible, fullCtx()));\n const emit = async (eventName) => {\n const onBindings = props.element.on;\n const binding = onBindings?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n for (const b of actionBindings) {\n if (!b.params) {\n await execute(b);\n continue;\n }\n const liveCtx = {\n ...fullCtx(),\n stateModel: getSnapshot()\n };\n const resolved = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await execute({\n ...b,\n params: resolved\n });\n }\n };\n const on = (eventName) => {\n const onBindings = props.element.on;\n const binding = onBindings?.[eventName];\n if (!binding) {\n return {\n emit: () => {\n },\n shouldPreventDefault: false,\n bound: false\n };\n }\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n const shouldPreventDefault = actionBindings.some((b) => b.preventDefault);\n return {\n emit: () => emit(eventName),\n shouldPreventDefault,\n bound: true\n };\n };\n createEffect3(() => {\n const watchConfig = props.element.watch;\n if (!watchConfig) return;\n const paths = Object.keys(watchConfig);\n if (paths.length === 0) return;\n const unsubscribe = stateStore.subscribeChanges((changes) => {\n const changedPaths = new Set(changes.map((change) => change.path));\n void (async () => {\n for (const path of paths) {\n if (!changedPaths.has(path)) continue;\n const binding = watchConfig[path];\n if (!binding) continue;\n const bindings = Array.isArray(binding) ? binding : [binding];\n for (const b of bindings) {\n if (!b.params) {\n await execute(b);\n continue;\n }\n const liveCtx = {\n ...fullCtx(),\n stateModel: getSnapshot()\n };\n const resolved = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await execute({\n ...b,\n params: resolved\n });\n }\n }\n })().catch(console.error);\n });\n onCleanup2(() => {\n unsubscribe();\n });\n });\n const elementBindings = createMemo3(() => {\n const rawProps = props.element.props;\n return resolveBindings(rawProps, fullCtx());\n });\n const resolvedElement = createMemo3(() => {\n const rawProps = props.element.props;\n const resolvedProps = resolveElementProps(rawProps, fullCtx());\n return resolvedProps !== props.element.props ? {\n ...props.element,\n props: resolvedProps\n } : props.element;\n });\n return _$createComponent6(Show, {\n get when() {\n return isVisible();\n },\n get children() {\n return _$createComponent6(ErrorBoundary, {\n fallback: (err) => {\n console.error(`[json-render] Rendering error in <${props.element.type}>:`, err);\n return null;\n },\n get children() {\n return _$createComponent6(ElementRendererContent, {\n get resolvedElement() {\n return resolvedElement();\n },\n get spec() {\n return props.spec;\n },\n get registry() {\n return props.registry;\n },\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n },\n emit,\n on,\n get bindings() {\n return elementBindings();\n }\n });\n }\n });\n }\n });\n}\nfunction ElementRendererContent(props) {\n const Comp = () => props.registry[props.resolvedElement.type] ?? props.fallback;\n return _$createComponent6(Show, {\n get when() {\n return Comp();\n },\n get fallback() {\n console.warn(`No renderer for component type: ${props.resolvedElement.type}`);\n return null;\n },\n children: (ComponentFn) => {\n const Component = ComponentFn();\n const children = () => props.resolvedElement.repeat ? _$createComponent6(RepeatChildren, {\n get element() {\n return props.resolvedElement;\n },\n get spec() {\n return props.spec;\n },\n get registry() {\n return props.registry;\n },\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n }\n }) : _$createComponent6(For, {\n get each() {\n return props.resolvedElement.children ?? [];\n },\n children: (childKey) => {\n const childElement = () => props.spec.elements[childKey];\n return _$createComponent6(Show, {\n get when() {\n return childElement();\n },\n get fallback() {\n if (!props.loading) {\n console.warn(`[json-render] Missing element \"${childKey}\" referenced as child of \"${props.resolvedElement.type}\". This element will not render.`);\n }\n return null;\n },\n children: (el) => _$createComponent6(ElementRenderer, {\n get element() {\n return el();\n },\n get spec() {\n return props.spec;\n },\n get registry() {\n return props.registry;\n },\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n }\n })\n });\n }\n });\n return _$createComponent6(Component, {\n get element() {\n return props.resolvedElement;\n },\n get emit() {\n return props.emit;\n },\n get on() {\n return props.on;\n },\n get bindings() {\n return props.bindings;\n },\n get loading() {\n return props.loading;\n },\n get children() {\n return children();\n }\n });\n }\n });\n}\nfunction RepeatChildren(props) {\n const stateStore = useStateStore();\n const repeat = () => props.element.repeat;\n const statePath = () => repeat().statePath;\n const items = () => getByPath2(stateStore.state, statePath()) ?? [];\n return _$createComponent6(For, {\n get each() {\n return items();\n },\n children: (itemValue, index) => {\n const key = () => {\n const r = repeat();\n return r.key && typeof itemValue === \"object\" && itemValue !== null ? String(itemValue[r.key] ?? index()) : String(index());\n };\n return _$createComponent6(RepeatScopeProvider, {\n item: itemValue,\n get index() {\n return index();\n },\n get basePath() {\n return `${statePath()}/${index()}`;\n },\n get children() {\n return _$createComponent6(For, {\n get each() {\n return props.element.children ?? [];\n },\n children: (childKey) => {\n const childElement = () => props.spec.elements[childKey];\n return _$createComponent6(Show, {\n get when() {\n return childElement();\n },\n get fallback() {\n if (!props.loading) {\n console.warn(`[json-render] Missing element \"${childKey}\" referenced as child of \"${props.element.type}\" (repeat). This element will not render.`);\n }\n return null;\n },\n children: (el) => _$createComponent6(ElementRenderer, {\n get element() {\n return el();\n },\n get spec() {\n return props.spec;\n },\n get registry() {\n return props.registry;\n },\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n }\n })\n });\n }\n });\n }\n });\n }\n });\n}\nfunction Renderer(props) {\n const rootElement = createMemo3(() => {\n const spec = props.spec;\n if (!spec || !spec.root) return void 0;\n return spec.elements[spec.root];\n });\n return _$createComponent6(Show, {\n get when() {\n return rootElement();\n },\n children: (el) => _$createComponent6(ElementRenderer, {\n get element() {\n return el();\n },\n get spec() {\n return props.spec;\n },\n get registry() {\n return props.registry;\n },\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n }\n })\n });\n}\nfunction JSONUIProvider(props) {\n return _$createComponent6(StateProvider, {\n get store() {\n return props.store;\n },\n get initialState() {\n return props.initialState;\n },\n get onStateChange() {\n return props.onStateChange;\n },\n get children() {\n return _$createComponent6(VisibilityProvider, {\n get children() {\n return _$createComponent6(ValidationProvider, {\n get customFunctions() {\n return props.validationFunctions;\n },\n get children() {\n return _$createComponent6(ActionProvider, {\n get handlers() {\n return props.handlers;\n },\n get navigate() {\n return props.navigate;\n },\n get children() {\n return _$createComponent6(FunctionsContext.Provider, {\n get value() {\n return props.functions ?? EMPTY_FUNCTIONS;\n },\n get children() {\n return [_$memo2(() => props.children), _$createComponent6(ConfirmationDialogManager, {})];\n }\n });\n }\n });\n }\n });\n }\n });\n }\n });\n}\nfunction ConfirmationDialogManager() {\n const {\n pendingConfirmation,\n confirm,\n cancel\n } = useActions();\n return _$createComponent6(Show, {\n get when() {\n return pendingConfirmation?.action.confirm;\n },\n children: (confirmConfig) => _$createComponent6(ConfirmDialog, {\n get confirm() {\n return confirmConfig();\n },\n onConfirm: confirm,\n onCancel: cancel\n })\n });\n}\nfunction defineRegistry(_catalog, options) {\n const registry = {};\n if (options.components) {\n for (const [name, componentFn] of Object.entries(options.components)) {\n registry[name] = (renderProps) => {\n return componentFn({\n get props() {\n return renderProps.element.props;\n },\n get children() {\n return renderProps.children;\n },\n emit: renderProps.emit,\n on: renderProps.on,\n get bindings() {\n return renderProps.bindings;\n },\n get loading() {\n return renderProps.loading;\n }\n });\n };\n }\n }\n const actionMap = options.actions ? Object.entries(options.actions) : [];\n const handlers = (getSetState, getState) => {\n const result = {};\n for (const [name, actionFn] of actionMap) {\n result[name] = async (params) => {\n const setState = getSetState();\n const state = getState();\n if (setState) {\n await actionFn(params, setState, state);\n }\n };\n }\n return result;\n };\n const executeAction2 = async (actionName, params, setState, state = {}) => {\n const entry = actionMap.find(([name]) => name === actionName);\n if (entry) {\n await entry[1](params, setState, state);\n } else {\n console.warn(`Unknown action: ${actionName}`);\n }\n };\n return {\n registry,\n handlers,\n executeAction: executeAction2\n };\n}\nfunction createRenderer(catalog, components) {\n const registry = components;\n return function CatalogRenderer(props) {\n const actionHandlers = () => props.onAction ? new Proxy({}, {\n get: (_target, prop) => {\n return (params) => props.onAction(prop, params);\n },\n has: () => true\n }) : void 0;\n return _$createComponent6(StateProvider, {\n get store() {\n return props.store;\n },\n get initialState() {\n return props.state;\n },\n get onStateChange() {\n return props.onStateChange;\n },\n get children() {\n return _$createComponent6(VisibilityProvider, {\n get children() {\n return _$createComponent6(ValidationProvider, {\n get children() {\n return _$createComponent6(ActionProvider, {\n get handlers() {\n return actionHandlers();\n },\n get children() {\n return _$createComponent6(FunctionsContext.Provider, {\n get value() {\n return props.functions ?? EMPTY_FUNCTIONS;\n },\n get children() {\n return [_$createComponent6(Renderer, {\n get spec() {\n return props.spec;\n },\n registry,\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n }\n }), _$createComponent6(ConfirmationDialogManager, {})];\n }\n });\n }\n });\n }\n });\n }\n });\n }\n });\n };\n}\n\n// src/hooks.ts\nimport { createSignal as createSignal4, onCleanup as onCleanup3, createMemo as createMemo4 } from \"solid-js\";\nimport {\n setByPath,\n getByPath as getByPath3,\n removeByPath,\n createMixedStreamParser,\n applySpecPatch,\n nestedToFlat,\n SPEC_DATA_PART_TYPE\n} from \"@json-render/core\";\nfunction parseLine(line) {\n try {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"//\")) {\n return null;\n }\n const parsed = JSON.parse(trimmed);\n if (parsed.__meta === \"usage\") {\n return {\n type: \"usage\",\n usage: {\n promptTokens: parsed.promptTokens ?? 0,\n completionTokens: parsed.completionTokens ?? 0,\n totalTokens: parsed.totalTokens ?? 0\n }\n };\n }\n return { type: \"patch\", patch: parsed };\n } catch {\n return null;\n }\n}\nfunction setSpecValue(newSpec, path, value) {\n if (path === \"/root\") {\n newSpec.root = value;\n return;\n }\n if (path === \"/state\") {\n newSpec.state = value;\n return;\n }\n if (path.startsWith(\"/state/\")) {\n if (!newSpec.state) newSpec.state = {};\n const statePath = path.slice(\"/state\".length);\n setByPath(newSpec.state, statePath, value);\n return;\n }\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n if (pathParts.length === 1) {\n newSpec.elements[elementKey] = value;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n setByPath(\n newElement,\n propPath,\n value\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\nfunction removeSpecValue(newSpec, path) {\n if (path === \"/state\") {\n delete newSpec.state;\n return;\n }\n if (path.startsWith(\"/state/\") && newSpec.state) {\n const statePath = path.slice(\"/state\".length);\n removeByPath(newSpec.state, statePath);\n return;\n }\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n if (pathParts.length === 1) {\n const { [elementKey]: _, ...rest } = newSpec.elements;\n newSpec.elements = rest;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n removeByPath(\n newElement,\n propPath\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\nfunction getSpecValue(spec, path) {\n if (path === \"/root\") return spec.root;\n if (path === \"/state\") return spec.state;\n if (path.startsWith(\"/state/\") && spec.state) {\n const statePath = path.slice(\"/state\".length);\n return getByPath3(spec.state, statePath);\n }\n return getByPath3(spec, path);\n}\nfunction applyPatch(spec, patch) {\n const newSpec = {\n ...spec,\n elements: { ...spec.elements },\n ...spec.state ? { state: { ...spec.state } } : {}\n };\n switch (patch.op) {\n case \"add\":\n case \"replace\": {\n setSpecValue(newSpec, patch.path, patch.value);\n break;\n }\n case \"remove\": {\n removeSpecValue(newSpec, patch.path);\n break;\n }\n case \"move\": {\n if (!patch.from) break;\n const moveValue = getSpecValue(newSpec, patch.from);\n removeSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, moveValue);\n break;\n }\n case \"copy\": {\n if (!patch.from) break;\n const copyValue = getSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, copyValue);\n break;\n }\n case \"test\": {\n break;\n }\n }\n return newSpec;\n}\nfunction useUIStream(options) {\n const [spec, setSpec] = createSignal4(null);\n const [isStreaming, setIsStreaming] = createSignal4(false);\n const [error, setError] = createSignal4(null);\n const [usage, setUsage] = createSignal4(null);\n const [rawLines, setRawLines] = createSignal4([]);\n let abortController = null;\n const clear = () => {\n setSpec(null);\n setError(null);\n };\n const send = async (prompt, context) => {\n abortController?.abort();\n abortController = new AbortController();\n setIsStreaming(true);\n setError(null);\n setUsage(null);\n setRawLines([]);\n const previousSpec = context?.previousSpec;\n let currentSpec = previousSpec && previousSpec.root ? { ...previousSpec, elements: { ...previousSpec.elements } } : { root: \"\", elements: {} };\n setSpec(currentSpec);\n try {\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prompt,\n context,\n currentSpec\n }),\n signal: abortController.signal\n });\n if (!response.ok) {\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n }\n throw new Error(errorMessage);\n }\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const result = parseLine(trimmed);\n if (!result) continue;\n if (result.type === \"usage\") {\n setUsage(result.usage);\n } else {\n setRawLines((prev) => [...prev, trimmed]);\n currentSpec = applyPatch(currentSpec, result.patch);\n setSpec({ ...currentSpec });\n }\n }\n }\n if (buffer.trim()) {\n const trimmed = buffer.trim();\n const result = parseLine(trimmed);\n if (result) {\n if (result.type === \"usage\") {\n setUsage(result.usage);\n } else {\n setRawLines((prev) => [...prev, trimmed]);\n currentSpec = applyPatch(currentSpec, result.patch);\n setSpec({ ...currentSpec });\n }\n }\n }\n options.onComplete?.(currentSpec);\n } catch (err) {\n if (err.name === \"AbortError\") {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n setError(resolvedError);\n options.onError?.(resolvedError);\n } finally {\n setIsStreaming(false);\n }\n };\n onCleanup3(() => {\n abortController?.abort();\n });\n return {\n get spec() {\n return spec();\n },\n get isStreaming() {\n return isStreaming();\n },\n get error() {\n return error();\n },\n get usage() {\n return usage();\n },\n get rawLines() {\n return rawLines();\n },\n send,\n clear\n };\n}\nfunction flatToTree(elements) {\n const elementMap = {};\n let root = \"\";\n for (const element of elements) {\n elementMap[element.key] = {\n type: element.type,\n props: element.props,\n children: [],\n visible: element.visible\n };\n }\n for (const element of elements) {\n if (element.parentKey) {\n const parent = elementMap[element.parentKey];\n if (parent) {\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push(element.key);\n }\n } else {\n root = element.key;\n }\n }\n return { root, elements: elementMap };\n}\nfunction useBoundProp(propValue, bindingPath) {\n const { set } = useStateStore();\n const setValue = (value) => {\n if (bindingPath) set(bindingPath, value);\n };\n return [propValue, setValue];\n}\nfunction isSpecDataPart(data) {\n if (typeof data !== \"object\" || data === null) return false;\n const obj = data;\n switch (obj.type) {\n case \"patch\":\n return typeof obj.patch === \"object\" && obj.patch !== null;\n case \"flat\":\n case \"nested\":\n return typeof obj.spec === \"object\" && obj.spec !== null;\n default:\n return false;\n }\n}\nfunction buildSpecFromParts(parts) {\n const spec = { root: \"\", elements: {} };\n let hasSpec = false;\n for (const part of parts) {\n if (part.type === SPEC_DATA_PART_TYPE) {\n if (!isSpecDataPart(part.data)) continue;\n const payload = part.data;\n if (payload.type === \"patch\") {\n hasSpec = true;\n applySpecPatch(spec, payload.patch);\n } else if (payload.type === \"flat\") {\n hasSpec = true;\n Object.assign(spec, payload.spec);\n } else if (payload.type === \"nested\") {\n hasSpec = true;\n const flat = nestedToFlat(payload.spec);\n Object.assign(spec, flat);\n }\n }\n }\n return hasSpec ? spec : null;\n}\nfunction getTextFromParts(parts) {\n return parts.filter(\n (p) => p.type === \"text\" && typeof p.text === \"string\"\n ).map((p) => p.text.trim()).filter(Boolean).join(\"\\n\\n\");\n}\nfunction useJsonRenderMessage(getParts) {\n const result = createMemo4(() => {\n const parts = getParts();\n return {\n spec: buildSpecFromParts(parts),\n text: getTextFromParts(parts)\n };\n });\n return {\n get spec() {\n return result().spec;\n },\n get text() {\n return result().text;\n },\n get hasSpec() {\n const s = result().spec;\n return s !== null && Object.keys(s.elements || {}).length > 0;\n }\n };\n}\nvar chatMessageIdCounter = 0;\nfunction generateChatId() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n chatMessageIdCounter += 1;\n return `msg-${Date.now()}-${chatMessageIdCounter}`;\n}\nfunction useChatUI(options) {\n const [messages, setMessages] = createSignal4([]);\n const [isStreaming, setIsStreaming] = createSignal4(false);\n const [error, setError] = createSignal4(null);\n let abortController = null;\n const clear = () => {\n setMessages([]);\n setError(null);\n };\n const send = async (text) => {\n if (!text.trim()) return;\n abortController?.abort();\n abortController = new AbortController();\n const userMessage = {\n id: generateChatId(),\n role: \"user\",\n text: text.trim(),\n spec: null\n };\n const assistantId = generateChatId();\n const assistantMessage = {\n id: assistantId,\n role: \"assistant\",\n text: \"\",\n spec: null\n };\n setMessages((prev) => [...prev, userMessage, assistantMessage]);\n setIsStreaming(true);\n setError(null);\n const historyForApi = [\n ...messages().filter((m) => m.id !== userMessage.id && m.id !== assistantId).map((m) => ({\n role: m.role,\n content: m.text\n })),\n { role: \"user\", content: text.trim() }\n ];\n let accumulatedText = \"\";\n let currentSpec = { root: \"\", elements: {} };\n let hasSpec = false;\n try {\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ messages: historyForApi }),\n signal: abortController.signal\n });\n if (!response.ok) {\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n }\n throw new Error(errorMessage);\n }\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n const decoder = new TextDecoder();\n const parser = createMixedStreamParser({\n onPatch(patch) {\n hasSpec = true;\n applySpecPatch(currentSpec, patch);\n setMessages(\n (prev) => prev.map(\n (m) => m.id === assistantId ? {\n ...m,\n spec: {\n root: currentSpec.root,\n elements: { ...currentSpec.elements },\n ...currentSpec.state ? { state: { ...currentSpec.state } } : {}\n }\n } : m\n )\n );\n },\n onText(line) {\n accumulatedText += (accumulatedText ? \"\\n\" : \"\") + line;\n setMessages(\n (prev) => prev.map(\n (m) => m.id === assistantId ? { ...m, text: accumulatedText } : m\n )\n );\n }\n });\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.push(decoder.decode(value, { stream: true }));\n }\n parser.flush();\n const finalMessage = {\n id: assistantId,\n role: \"assistant\",\n text: accumulatedText,\n spec: hasSpec ? {\n root: currentSpec.root,\n elements: { ...currentSpec.elements },\n ...currentSpec.state ? { state: { ...currentSpec.state } } : {}\n } : null\n };\n options.onComplete?.(finalMessage);\n } catch (err) {\n if (err.name === \"AbortError\") {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n setError(resolvedError);\n setMessages(\n (prev) => prev.filter((m) => m.id !== assistantId || m.text.length > 0)\n );\n options.onError?.(resolvedError);\n } finally {\n setIsStreaming(false);\n }\n };\n onCleanup3(() => {\n abortController?.abort();\n });\n return {\n get messages() {\n return messages();\n },\n get isStreaming() {\n return isStreaming();\n },\n get error() {\n return error();\n },\n send,\n clear\n };\n}\nexport {\n ActionProvider,\n ConfirmDialog,\n JSONUIProvider,\n Renderer,\n RepeatScopeProvider,\n StateProvider,\n ValidationProvider,\n VisibilityProvider,\n buildSpecFromParts,\n createRenderer,\n createStateStore2 as createStateStore,\n defineRegistry,\n elementTreeSchema,\n flatToTree,\n getTextFromParts,\n schema,\n useAction,\n useActions,\n useBoundProp,\n useChatUI,\n useFieldValidation,\n useIsVisible,\n useJsonRenderMessage,\n useOptionalValidation,\n useRepeatScope,\n useStateBinding,\n useStateStore,\n useStateValue,\n useUIStream,\n useValidation,\n useVisibility\n};\n//# sourceMappingURL=index.mjs.map"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_$createComponent","createContext2","_$createComponent2","useContext2","createContext3","useContext3","createContext4","createSignal3","_$createComponent4","useContext4","_$delegateEvents","createContext5","_$createComponent5","useContext5","createContext6","useContext6","createMemo3","evaluateVisibility2","_$createComponent6","getByPath2"],"sources":["../../../../../../../node_modules/@json-render/solid/dist/index.mjs"],"sourcesContent":["import {\n elementTreeSchema,\n schema\n} from \"./chunk-XTSB6FIM.mjs\";\n\n// src/contexts/state.tsx\nimport { createComponent as _$createComponent } from \"solid-js/web\";\nimport { createContext, useContext, createSignal, createEffect, createMemo, onCleanup } from \"solid-js\";\nimport { getByPath, createStateStore } from \"@json-render/core\";\nimport { flattenToPointers } from \"@json-render/core/store-utils\";\nvar StateContext = createContext(null);\nfunction computeInitialFlat(isControlled, initialState) {\n if (isControlled) return null;\n if (Object.keys(initialState).length === 0) return {};\n return flattenToPointers(initialState);\n}\nfunction StateProvider(props) {\n let internalStore;\n if (!props.store) {\n internalStore = createStateStore(props.initialState ?? {});\n }\n const store = () => props.store ?? internalStore;\n const initialMode = props.store ? \"controlled\" : \"uncontrolled\";\n let modeWarned = false;\n if (typeof globalThis !== \"undefined\" && globalThis.process?.env?.NODE_ENV !== \"production\") {\n createEffect(() => {\n const currentMode = props.store ? \"controlled\" : \"uncontrolled\";\n if (currentMode !== initialMode && !modeWarned) {\n modeWarned = true;\n console.warn(`StateProvider: switching from ${initialMode} to ${currentMode} mode is not supported.`);\n }\n });\n }\n let prevInitialState = props.initialState;\n let prevFlat = computeInitialFlat(!!props.store, props.initialState ?? {});\n createEffect(() => {\n if (props.store) return;\n const initialState = props.initialState ?? {};\n if (initialState === prevInitialState) return;\n prevInitialState = initialState;\n const nextFlat = initialState && Object.keys(initialState).length > 0 ? flattenToPointers(initialState) : {};\n const prevFlatObj = prevFlat ?? {};\n const allKeys = /* @__PURE__ */ new Set([...Object.keys(prevFlatObj), ...Object.keys(nextFlat)]);\n const updates = {};\n for (const key of allKeys) {\n if (prevFlatObj[key] !== nextFlat[key]) {\n updates[key] = key in nextFlat ? nextFlat[key] : void 0;\n }\n }\n prevFlat = nextFlat;\n if (Object.keys(updates).length > 0) {\n store().update(updates);\n }\n });\n const [state, setState] = createSignal(store().getSnapshot(), {\n equals: false\n });\n const changeListeners = /* @__PURE__ */ new Set();\n const subscribeChanges = (listener) => {\n changeListeners.add(listener);\n return () => {\n changeListeners.delete(listener);\n };\n };\n const notifyChanges = (changes) => {\n for (const listener of changeListeners) {\n listener(changes);\n }\n };\n createEffect(() => {\n const s = store();\n setState(s.getSnapshot());\n const unsubscribe = s.subscribe(() => {\n setState(s.getSnapshot());\n });\n onCleanup(unsubscribe);\n });\n const set = (path, value) => {\n const s = store();\n const prev = s.getSnapshot();\n const prevValue = getByPath(prev, path);\n s.set(path, value);\n if (prevValue !== value) {\n const changes = [{\n path,\n value\n }];\n notifyChanges(changes);\n if (!props.store && s.getSnapshot() !== prev) {\n props.onStateChange?.(changes);\n }\n }\n };\n const update = (updates) => {\n const s = store();\n const prev = s.getSnapshot();\n s.update(updates);\n const changes = [];\n for (const [path, value] of Object.entries(updates)) {\n if (getByPath(prev, path) !== value) {\n changes.push({\n path,\n value\n });\n }\n }\n if (changes.length > 0) {\n notifyChanges(changes);\n if (!props.store && s.getSnapshot() !== prev) {\n props.onStateChange?.(changes);\n }\n }\n };\n const get = (path) => store().get(path);\n const getSnapshot = () => store().getSnapshot();\n const ctx = {\n get state() {\n return state();\n },\n get,\n set,\n update,\n getSnapshot,\n subscribeChanges\n };\n return _$createComponent(StateContext.Provider, {\n value: ctx,\n get children() {\n return props.children;\n }\n });\n}\nfunction useStateStore() {\n const ctx = useContext(StateContext);\n if (!ctx) {\n throw new Error(\"useStateStore must be used within a StateProvider\");\n }\n return ctx;\n}\nfunction useStateValue(path) {\n const store = useStateStore();\n return createMemo(() => getByPath(store.state, path));\n}\nfunction useStateBinding(path) {\n const store = useStateStore();\n const value = createMemo(() => getByPath(store.state, path));\n const setValue = (newValue) => store.set(path, newValue);\n return [value, setValue];\n}\n\n// src/contexts/visibility.tsx\nimport { createComponent as _$createComponent2 } from \"solid-js/web\";\nimport { createContext as createContext2, useContext as useContext2 } from \"solid-js\";\nimport { evaluateVisibility } from \"@json-render/core\";\nvar VisibilityContext = createContext2(null);\nfunction VisibilityProvider(props) {\n const stateStore = useStateStore();\n const visibilityCtx = {\n get stateModel() {\n return stateStore.state;\n }\n };\n const value = {\n isVisible: (condition) => evaluateVisibility(condition, visibilityCtx),\n ctx: visibilityCtx\n };\n return _$createComponent2(VisibilityContext.Provider, {\n value,\n get children() {\n return props.children;\n }\n });\n}\nfunction useVisibility() {\n const ctx = useContext2(VisibilityContext);\n if (!ctx) {\n throw new Error(\"useVisibility must be used within a VisibilityProvider\");\n }\n return ctx;\n}\nfunction useIsVisible(condition) {\n const {\n isVisible\n } = useVisibility();\n return isVisible(condition);\n}\n\n// src/contexts/actions.tsx\nimport { template as _$template } from \"solid-js/web\";\nimport { delegateEvents as _$delegateEvents } from \"solid-js/web\";\nimport { setStyleProperty as _$setStyleProperty } from \"solid-js/web\";\nimport { effect as _$effect } from \"solid-js/web\";\nimport { memo as _$memo } from \"solid-js/web\";\nimport { insert as _$insert } from \"solid-js/web\";\nimport { addEventListener as _$addEventListener } from \"solid-js/web\";\nimport { createComponent as _$createComponent4 } from \"solid-js/web\";\nimport { createContext as createContext4, useContext as useContext4, createSignal as createSignal3 } from \"solid-js\";\nimport { resolveAction, executeAction } from \"@json-render/core\";\n\n// src/contexts/validation.tsx\nimport { createComponent as _$createComponent3 } from \"solid-js/web\";\nimport { createContext as createContext3, useContext as useContext3, createSignal as createSignal2, createEffect as createEffect2, createMemo as createMemo2 } from \"solid-js\";\nimport { runValidation } from \"@json-render/core\";\nvar ValidationContext = createContext3(null);\nfunction dynamicArgsEqual(a, b) {\n if (a === b) return true;\n if (!a || !b) return false;\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n const va = a[key];\n const vb = b[key];\n if (va === vb) continue;\n if (typeof va === \"object\" && va !== null && typeof vb === \"object\" && vb !== null) {\n const sa = va.$state;\n const sb = vb.$state;\n if (typeof sa === \"string\" && sa === sb) continue;\n }\n return false;\n }\n return true;\n}\nfunction validationConfigEqual(a, b) {\n if (a === b) return true;\n if (a.validateOn !== b.validateOn) return false;\n const ac = a.checks ?? [];\n const bc = b.checks ?? [];\n if (ac.length !== bc.length) return false;\n for (let i = 0; i < ac.length; i++) {\n const ca = ac[i];\n const cb = bc[i];\n if (ca.type !== cb.type) return false;\n if (ca.message !== cb.message) return false;\n if (!dynamicArgsEqual(ca.args, cb.args)) return false;\n }\n return true;\n}\nfunction ValidationProvider(props) {\n const {\n getSnapshot\n } = useStateStore();\n const customFunctions = () => props.customFunctions ?? {};\n const [fieldStates, setFieldStates] = createSignal2({});\n let fieldStatesRef = {};\n const [fieldConfigs, setFieldConfigs] = createSignal2({});\n const registerField = (path, config) => {\n setFieldConfigs((prev) => {\n const existing = prev[path];\n if (existing && validationConfigEqual(existing, config)) {\n return prev;\n }\n return {\n ...prev,\n [path]: config\n };\n });\n };\n const validate = (path, config) => {\n const currentState = getSnapshot();\n const segments = path.split(\"/\").filter(Boolean);\n let value2 = currentState;\n for (const seg of segments) {\n if (value2 != null && typeof value2 === \"object\") {\n value2 = value2[seg];\n } else {\n value2 = void 0;\n break;\n }\n }\n const result = runValidation(config, {\n value: value2,\n stateModel: currentState,\n customFunctions: customFunctions()\n });\n const newFieldState = {\n touched: fieldStatesRef[path]?.touched ?? true,\n validated: true,\n result\n };\n fieldStatesRef = {\n ...fieldStatesRef,\n [path]: newFieldState\n };\n setFieldStates(fieldStatesRef);\n return result;\n };\n const touch = (path) => {\n fieldStatesRef = {\n ...fieldStatesRef,\n [path]: {\n ...fieldStatesRef[path],\n touched: true,\n validated: fieldStatesRef[path]?.validated ?? false,\n result: fieldStatesRef[path]?.result ?? null\n }\n };\n setFieldStates(fieldStatesRef);\n };\n const clear = (path) => {\n const {\n [path]: _,\n ...rest\n } = fieldStatesRef;\n fieldStatesRef = rest;\n setFieldStates(rest);\n };\n const validateAll = () => {\n let allValid = true;\n for (const [path, config] of Object.entries(fieldConfigs())) {\n const result = validate(path, config);\n if (!result.valid) {\n allValid = false;\n }\n }\n return allValid;\n };\n const value = {\n get customFunctions() {\n return customFunctions();\n },\n get fieldStates() {\n fieldStates();\n return fieldStatesRef;\n },\n validate,\n touch,\n clear,\n validateAll,\n registerField\n };\n return _$createComponent3(ValidationContext.Provider, {\n value,\n get children() {\n return props.children;\n }\n });\n}\nfunction useValidation() {\n const ctx = useContext3(ValidationContext);\n if (!ctx) {\n throw new Error(\"useValidation must be used within a ValidationProvider\");\n }\n return ctx;\n}\nfunction useOptionalValidation() {\n return useContext3(ValidationContext);\n}\nfunction useFieldValidation(path, config) {\n const validation = useValidation();\n createEffect2(() => {\n if (path && config) {\n validation.registerField(path, config);\n }\n });\n const state = createMemo2(() => {\n const current = validation.fieldStates[path];\n return current ?? {\n touched: false,\n validated: false,\n result: null\n };\n });\n const validate = () => validation.validate(path, config ?? {\n checks: []\n });\n const touch = () => validation.touch(path);\n const clear = () => validation.clear(path);\n const errors = createMemo2(() => state().result?.errors ?? []);\n const isValid = createMemo2(() => state().result?.valid ?? true);\n return {\n state,\n validate,\n touch,\n clear,\n errors,\n isValid\n };\n}\n\n// src/contexts/actions.tsx\nvar _tmpl$ = /* @__PURE__ */ _$template(`<div style=\"position:fixed;inset:0;background-color:rgba(0, 0, 0, 0.5);display:flex;align-items:center;justify-content:center;z-index:50\"><div style=\"background-color:white;border-radius:8px;padding:24px;max-width:400px;width:100%;box-shadow:0 20px 25px -5px rgba(0, 0, 0, 0.1)\"><h3 style=\"margin:0 0 8px 0;font-size:18px;font-weight:600\"></h3><p style=\"margin:0 0 24px 0;color:#6b7280\"></p><div style=display:flex;gap:12px;justify-content:flex-end><button style=\"padding:8px 16px;border-radius:6px;border:1px solid #d1d5db;background-color:white;cursor:pointer\"></button><button style=\"padding:8px 16px;border-radius:6px;border:none;color:white;cursor:pointer\">`);\nvar idCounter = 0;\nfunction generateUniqueId() {\n idCounter += 1;\n return `${Date.now()}-${idCounter}`;\n}\nfunction deepResolveValue(value, get) {\n if (value === null || value === void 0) return value;\n if (value === \"$id\") {\n return generateUniqueId();\n }\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value;\n const keys = Object.keys(obj);\n if (keys.length === 1 && typeof obj.$state === \"string\") {\n return get(obj.$state);\n }\n if (keys.length === 1 && \"$id\" in obj) {\n return generateUniqueId();\n }\n }\n if (Array.isArray(value)) {\n return value.map((item) => deepResolveValue(item, get));\n }\n if (typeof value === \"object\") {\n const resolved = {};\n for (const [key, val] of Object.entries(value)) {\n resolved[key] = deepResolveValue(val, get);\n }\n return resolved;\n }\n return value;\n}\nvar ActionContext = createContext4(null);\nfunction ActionProvider(props) {\n const {\n get,\n set,\n getSnapshot\n } = useStateStore();\n const validation = useOptionalValidation();\n const [handlers, setHandlers] = createSignal3(props.handlers ?? {});\n const [loadingActions, setLoadingActions] = createSignal3(/* @__PURE__ */ new Set());\n const [pendingConfirmation, setPendingConfirmation] = createSignal3(null);\n const registerHandler = (name, handler) => {\n setHandlers((prev) => ({\n ...prev,\n [name]: handler\n }));\n };\n const execute = async (binding) => {\n const resolved = resolveAction(binding, getSnapshot());\n if (resolved.action === \"setState\" && resolved.params) {\n const statePath = resolved.params.statePath;\n const value = resolved.params.value;\n if (statePath) {\n set(statePath, value);\n }\n return;\n }\n if (resolved.action === \"pushState\" && resolved.params) {\n const statePath = resolved.params.statePath;\n const rawValue = resolved.params.value;\n if (statePath) {\n const resolvedValue = deepResolveValue(rawValue, get);\n const arr = get(statePath) ?? [];\n set(statePath, [...arr, resolvedValue]);\n const clearStatePath = resolved.params.clearStatePath;\n if (clearStatePath) {\n set(clearStatePath, \"\");\n }\n }\n return;\n }\n if (resolved.action === \"removeState\" && resolved.params) {\n const statePath = resolved.params.statePath;\n const index = resolved.params.index;\n if (statePath !== void 0 && index !== void 0) {\n const arr = get(statePath) ?? [];\n set(statePath, arr.filter((_, i) => i !== index));\n }\n return;\n }\n if (resolved.action === \"push\" && resolved.params) {\n const screen = resolved.params.screen;\n if (screen) {\n const currentScreen = get(\"/currentScreen\");\n const navStack = get(\"/navStack\") ?? [];\n if (currentScreen) {\n set(\"/navStack\", [...navStack, currentScreen]);\n } else {\n set(\"/navStack\", [...navStack, \"\"]);\n }\n set(\"/currentScreen\", screen);\n }\n return;\n }\n if (resolved.action === \"pop\") {\n const navStack = get(\"/navStack\") ?? [];\n if (navStack.length > 0) {\n const previousScreen = navStack[navStack.length - 1];\n set(\"/navStack\", navStack.slice(0, -1));\n if (previousScreen) {\n set(\"/currentScreen\", previousScreen);\n } else {\n set(\"/currentScreen\", void 0);\n }\n }\n return;\n }\n if (resolved.action === \"validateForm\") {\n const validateAll = validation?.validateAll;\n if (!validateAll) {\n console.warn(\"validateForm action was dispatched but no ValidationProvider is connected. Ensure ValidationProvider is rendered inside the provider tree.\");\n return;\n }\n const valid = validateAll();\n const errors = {};\n for (const [path, fs] of Object.entries(validation.fieldStates)) {\n if (fs.result && !fs.result.valid) {\n errors[path] = fs.result.errors;\n }\n }\n const statePath = resolved.params?.statePath || \"/formValidation\";\n set(statePath, {\n valid,\n errors\n });\n return;\n }\n const handler = handlers()[resolved.action];\n if (!handler) {\n console.warn(`No handler registered for action: ${resolved.action}`);\n return;\n }\n if (resolved.confirm) {\n return new Promise((resolve, reject) => {\n setPendingConfirmation({\n action: resolved,\n handler,\n resolve: () => {\n setPendingConfirmation(null);\n resolve();\n },\n reject: () => {\n setPendingConfirmation(null);\n reject(new Error(\"Action cancelled\"));\n }\n });\n }).then(async () => {\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (name) => {\n const subBinding = {\n action: name\n };\n await execute(subBinding);\n }\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n });\n }\n setLoadingActions((prev) => new Set(prev).add(resolved.action));\n try {\n await executeAction({\n action: resolved,\n handler,\n setState: set,\n navigate: props.navigate,\n executeAction: async (name) => {\n const subBinding = {\n action: name\n };\n await execute(subBinding);\n }\n });\n } finally {\n setLoadingActions((prev) => {\n const next = new Set(prev);\n next.delete(resolved.action);\n return next;\n });\n }\n };\n const confirm = () => {\n pendingConfirmation()?.resolve();\n };\n const cancel = () => {\n pendingConfirmation()?.reject();\n };\n const ctx = {\n get handlers() {\n return handlers();\n },\n get loadingActions() {\n return loadingActions();\n },\n get pendingConfirmation() {\n return pendingConfirmation();\n },\n execute,\n confirm,\n cancel,\n registerHandler\n };\n return _$createComponent4(ActionContext.Provider, {\n value: ctx,\n get children() {\n return props.children;\n }\n });\n}\nfunction useActions() {\n const ctx = useContext4(ActionContext);\n if (!ctx) {\n throw new Error(\"useActions must be used within an ActionProvider\");\n }\n return ctx;\n}\nfunction useAction(binding) {\n const actions = useActions();\n return {\n execute: () => actions.execute(binding),\n get isLoading() {\n return actions.loadingActions.has(binding.action);\n }\n };\n}\nfunction ConfirmDialog(props) {\n const isDanger = () => props.confirm.variant === \"danger\";\n return (() => {\n var _el$ = _tmpl$(), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$4.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.nextSibling;\n _$addEventListener(_el$, \"click\", props.onCancel, true);\n _el$2.$$click = (e) => e.stopPropagation();\n _$insert(_el$3, () => props.confirm.title);\n _$insert(_el$4, () => props.confirm.message);\n _$addEventListener(_el$6, \"click\", props.onCancel, true);\n _$insert(_el$6, () => props.confirm.cancelLabel ?? \"Cancel\");\n _$addEventListener(_el$7, \"click\", props.onConfirm, true);\n _$insert(_el$7, () => props.confirm.confirmLabel ?? \"Confirm\");\n _$effect((_$p) => _$setStyleProperty(_el$7, \"background-color\", isDanger() ? \"#dc2626\" : \"#3b82f6\"));\n return _el$;\n })();\n}\n_$delegateEvents([\"click\"]);\n\n// src/contexts/repeat-scope.tsx\nimport { createComponent as _$createComponent5 } from \"solid-js/web\";\nimport { createContext as createContext5, useContext as useContext5 } from \"solid-js\";\nvar RepeatScopeContext = createContext5(null);\nfunction RepeatScopeProvider(props) {\n return _$createComponent5(RepeatScopeContext.Provider, {\n get value() {\n return {\n item: props.item,\n index: props.index,\n basePath: props.basePath\n };\n },\n get children() {\n return props.children;\n }\n });\n}\nfunction useRepeatScope() {\n return useContext5(RepeatScopeContext);\n}\n\n// src/index.ts\nimport { createStateStore as createStateStore2 } from \"@json-render/core\";\n\n// src/renderer.tsx\nimport { memo as _$memo2 } from \"solid-js/web\";\nimport { createComponent as _$createComponent6 } from \"solid-js/web\";\nimport { createContext as createContext6, useContext as useContext6, createMemo as createMemo3, createEffect as createEffect3, onCleanup as onCleanup2, ErrorBoundary, Show, For } from \"solid-js\";\nimport { resolveElementProps, resolveBindings, resolveActionParam, evaluateVisibility as evaluateVisibility2, getByPath as getByPath2 } from \"@json-render/core\";\nvar EMPTY_FUNCTIONS = {};\nvar FunctionsContext = createContext6(EMPTY_FUNCTIONS);\nfunction useFunctions() {\n return useContext6(FunctionsContext) ?? EMPTY_FUNCTIONS;\n}\nfunction ElementRenderer(props) {\n const repeatScope = useRepeatScope();\n const {\n ctx\n } = useVisibility();\n const {\n execute\n } = useActions();\n const stateStore = useStateStore();\n const getSnapshot = () => stateStore.getSnapshot();\n const functions = useFunctions();\n const fullCtx = createMemo3(() => {\n const repeatItem = repeatScope?.item;\n const repeatIndex = repeatScope?.index;\n const repeatBasePath = repeatScope?.basePath;\n return {\n get stateModel() {\n return ctx.stateModel;\n },\n ...repeatItem !== void 0 ? {\n repeatItem\n } : {},\n ...repeatIndex !== void 0 ? {\n repeatIndex\n } : {},\n ...repeatBasePath !== void 0 ? {\n repeatBasePath\n } : {},\n functions\n };\n });\n const isVisible = createMemo3(() => props.element.visible === void 0 ? true : evaluateVisibility2(props.element.visible, fullCtx()));\n const emit = async (eventName) => {\n const onBindings = props.element.on;\n const binding = onBindings?.[eventName];\n if (!binding) return;\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n for (const b of actionBindings) {\n if (!b.params) {\n await execute(b);\n continue;\n }\n const liveCtx = {\n ...fullCtx(),\n stateModel: getSnapshot()\n };\n const resolved = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await execute({\n ...b,\n params: resolved\n });\n }\n };\n const on = (eventName) => {\n const onBindings = props.element.on;\n const binding = onBindings?.[eventName];\n if (!binding) {\n return {\n emit: () => {\n },\n shouldPreventDefault: false,\n bound: false\n };\n }\n const actionBindings = Array.isArray(binding) ? binding : [binding];\n const shouldPreventDefault = actionBindings.some((b) => b.preventDefault);\n return {\n emit: () => emit(eventName),\n shouldPreventDefault,\n bound: true\n };\n };\n createEffect3(() => {\n const watchConfig = props.element.watch;\n if (!watchConfig) return;\n const paths = Object.keys(watchConfig);\n if (paths.length === 0) return;\n const unsubscribe = stateStore.subscribeChanges((changes) => {\n const changedPaths = new Set(changes.map((change) => change.path));\n void (async () => {\n for (const path of paths) {\n if (!changedPaths.has(path)) continue;\n const binding = watchConfig[path];\n if (!binding) continue;\n const bindings = Array.isArray(binding) ? binding : [binding];\n for (const b of bindings) {\n if (!b.params) {\n await execute(b);\n continue;\n }\n const liveCtx = {\n ...fullCtx(),\n stateModel: getSnapshot()\n };\n const resolved = {};\n for (const [key, val] of Object.entries(b.params)) {\n resolved[key] = resolveActionParam(val, liveCtx);\n }\n await execute({\n ...b,\n params: resolved\n });\n }\n }\n })().catch(console.error);\n });\n onCleanup2(() => {\n unsubscribe();\n });\n });\n const elementBindings = createMemo3(() => {\n const rawProps = props.element.props;\n return resolveBindings(rawProps, fullCtx());\n });\n const resolvedElement = createMemo3(() => {\n const rawProps = props.element.props;\n const resolvedProps = resolveElementProps(rawProps, fullCtx());\n return resolvedProps !== props.element.props ? {\n ...props.element,\n props: resolvedProps\n } : props.element;\n });\n return _$createComponent6(Show, {\n get when() {\n return isVisible();\n },\n get children() {\n return _$createComponent6(ErrorBoundary, {\n fallback: (err) => {\n console.error(`[json-render] Rendering error in <${props.element.type}>:`, err);\n return null;\n },\n get children() {\n return _$createComponent6(ElementRendererContent, {\n get resolvedElement() {\n return resolvedElement();\n },\n get spec() {\n return props.spec;\n },\n get registry() {\n return props.registry;\n },\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n },\n emit,\n on,\n get bindings() {\n return elementBindings();\n }\n });\n }\n });\n }\n });\n}\nfunction ElementRendererContent(props) {\n const Comp = () => props.registry[props.resolvedElement.type] ?? props.fallback;\n return _$createComponent6(Show, {\n get when() {\n return Comp();\n },\n get fallback() {\n console.warn(`No renderer for component type: ${props.resolvedElement.type}`);\n return null;\n },\n children: (ComponentFn) => {\n const Component = ComponentFn();\n const children = () => props.resolvedElement.repeat ? _$createComponent6(RepeatChildren, {\n get element() {\n return props.resolvedElement;\n },\n get spec() {\n return props.spec;\n },\n get registry() {\n return props.registry;\n },\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n }\n }) : _$createComponent6(For, {\n get each() {\n return props.resolvedElement.children ?? [];\n },\n children: (childKey) => {\n const childElement = () => props.spec.elements[childKey];\n return _$createComponent6(Show, {\n get when() {\n return childElement();\n },\n get fallback() {\n if (!props.loading) {\n console.warn(`[json-render] Missing element \"${childKey}\" referenced as child of \"${props.resolvedElement.type}\". This element will not render.`);\n }\n return null;\n },\n children: (el) => _$createComponent6(ElementRenderer, {\n get element() {\n return el();\n },\n get spec() {\n return props.spec;\n },\n get registry() {\n return props.registry;\n },\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n }\n })\n });\n }\n });\n return _$createComponent6(Component, {\n get element() {\n return props.resolvedElement;\n },\n get emit() {\n return props.emit;\n },\n get on() {\n return props.on;\n },\n get bindings() {\n return props.bindings;\n },\n get loading() {\n return props.loading;\n },\n get children() {\n return children();\n }\n });\n }\n });\n}\nfunction RepeatChildren(props) {\n const stateStore = useStateStore();\n const repeat = () => props.element.repeat;\n const statePath = () => repeat().statePath;\n const items = () => getByPath2(stateStore.state, statePath()) ?? [];\n return _$createComponent6(For, {\n get each() {\n return items();\n },\n children: (itemValue, index) => {\n const key = () => {\n const r = repeat();\n return r.key && typeof itemValue === \"object\" && itemValue !== null ? String(itemValue[r.key] ?? index()) : String(index());\n };\n return _$createComponent6(RepeatScopeProvider, {\n item: itemValue,\n get index() {\n return index();\n },\n get basePath() {\n return `${statePath()}/${index()}`;\n },\n get children() {\n return _$createComponent6(For, {\n get each() {\n return props.element.children ?? [];\n },\n children: (childKey) => {\n const childElement = () => props.spec.elements[childKey];\n return _$createComponent6(Show, {\n get when() {\n return childElement();\n },\n get fallback() {\n if (!props.loading) {\n console.warn(`[json-render] Missing element \"${childKey}\" referenced as child of \"${props.element.type}\" (repeat). This element will not render.`);\n }\n return null;\n },\n children: (el) => _$createComponent6(ElementRenderer, {\n get element() {\n return el();\n },\n get spec() {\n return props.spec;\n },\n get registry() {\n return props.registry;\n },\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n }\n })\n });\n }\n });\n }\n });\n }\n });\n}\nfunction Renderer(props) {\n const rootElement = createMemo3(() => {\n const spec = props.spec;\n if (!spec || !spec.root) return void 0;\n return spec.elements[spec.root];\n });\n return _$createComponent6(Show, {\n get when() {\n return rootElement();\n },\n children: (el) => _$createComponent6(ElementRenderer, {\n get element() {\n return el();\n },\n get spec() {\n return props.spec;\n },\n get registry() {\n return props.registry;\n },\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n }\n })\n });\n}\nfunction JSONUIProvider(props) {\n return _$createComponent6(StateProvider, {\n get store() {\n return props.store;\n },\n get initialState() {\n return props.initialState;\n },\n get onStateChange() {\n return props.onStateChange;\n },\n get children() {\n return _$createComponent6(VisibilityProvider, {\n get children() {\n return _$createComponent6(ValidationProvider, {\n get customFunctions() {\n return props.validationFunctions;\n },\n get children() {\n return _$createComponent6(ActionProvider, {\n get handlers() {\n return props.handlers;\n },\n get navigate() {\n return props.navigate;\n },\n get children() {\n return _$createComponent6(FunctionsContext.Provider, {\n get value() {\n return props.functions ?? EMPTY_FUNCTIONS;\n },\n get children() {\n return [_$memo2(() => props.children), _$createComponent6(ConfirmationDialogManager, {})];\n }\n });\n }\n });\n }\n });\n }\n });\n }\n });\n}\nfunction ConfirmationDialogManager() {\n const {\n pendingConfirmation,\n confirm,\n cancel\n } = useActions();\n return _$createComponent6(Show, {\n get when() {\n return pendingConfirmation?.action.confirm;\n },\n children: (confirmConfig) => _$createComponent6(ConfirmDialog, {\n get confirm() {\n return confirmConfig();\n },\n onConfirm: confirm,\n onCancel: cancel\n })\n });\n}\nfunction defineRegistry(_catalog, options) {\n const registry = {};\n if (options.components) {\n for (const [name, componentFn] of Object.entries(options.components)) {\n registry[name] = (renderProps) => {\n return componentFn({\n get props() {\n return renderProps.element.props;\n },\n get children() {\n return renderProps.children;\n },\n emit: renderProps.emit,\n on: renderProps.on,\n get bindings() {\n return renderProps.bindings;\n },\n get loading() {\n return renderProps.loading;\n }\n });\n };\n }\n }\n const actionMap = options.actions ? Object.entries(options.actions) : [];\n const handlers = (getSetState, getState) => {\n const result = {};\n for (const [name, actionFn] of actionMap) {\n result[name] = async (params) => {\n const setState = getSetState();\n const state = getState();\n if (setState) {\n await actionFn(params, setState, state);\n }\n };\n }\n return result;\n };\n const executeAction2 = async (actionName, params, setState, state = {}) => {\n const entry = actionMap.find(([name]) => name === actionName);\n if (entry) {\n await entry[1](params, setState, state);\n } else {\n console.warn(`Unknown action: ${actionName}`);\n }\n };\n return {\n registry,\n handlers,\n executeAction: executeAction2\n };\n}\nfunction createRenderer(catalog, components) {\n const registry = components;\n return function CatalogRenderer(props) {\n const actionHandlers = () => props.onAction ? new Proxy({}, {\n get: (_target, prop) => {\n return (params) => props.onAction(prop, params);\n },\n has: () => true\n }) : void 0;\n return _$createComponent6(StateProvider, {\n get store() {\n return props.store;\n },\n get initialState() {\n return props.state;\n },\n get onStateChange() {\n return props.onStateChange;\n },\n get children() {\n return _$createComponent6(VisibilityProvider, {\n get children() {\n return _$createComponent6(ValidationProvider, {\n get children() {\n return _$createComponent6(ActionProvider, {\n get handlers() {\n return actionHandlers();\n },\n get children() {\n return _$createComponent6(FunctionsContext.Provider, {\n get value() {\n return props.functions ?? EMPTY_FUNCTIONS;\n },\n get children() {\n return [_$createComponent6(Renderer, {\n get spec() {\n return props.spec;\n },\n registry,\n get loading() {\n return props.loading;\n },\n get fallback() {\n return props.fallback;\n }\n }), _$createComponent6(ConfirmationDialogManager, {})];\n }\n });\n }\n });\n }\n });\n }\n });\n }\n });\n };\n}\n\n// src/hooks.ts\nimport { createSignal as createSignal4, onCleanup as onCleanup3, createMemo as createMemo4 } from \"solid-js\";\nimport {\n setByPath,\n getByPath as getByPath3,\n removeByPath,\n createMixedStreamParser,\n applySpecPatch,\n nestedToFlat,\n SPEC_DATA_PART_TYPE\n} from \"@json-render/core\";\nfunction parseLine(line) {\n try {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"//\")) {\n return null;\n }\n const parsed = JSON.parse(trimmed);\n if (parsed.__meta === \"usage\") {\n return {\n type: \"usage\",\n usage: {\n promptTokens: parsed.promptTokens ?? 0,\n completionTokens: parsed.completionTokens ?? 0,\n totalTokens: parsed.totalTokens ?? 0\n }\n };\n }\n return { type: \"patch\", patch: parsed };\n } catch {\n return null;\n }\n}\nfunction setSpecValue(newSpec, path, value) {\n if (path === \"/root\") {\n newSpec.root = value;\n return;\n }\n if (path === \"/state\") {\n newSpec.state = value;\n return;\n }\n if (path.startsWith(\"/state/\")) {\n if (!newSpec.state) newSpec.state = {};\n const statePath = path.slice(\"/state\".length);\n setByPath(newSpec.state, statePath, value);\n return;\n }\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n if (pathParts.length === 1) {\n newSpec.elements[elementKey] = value;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n setByPath(\n newElement,\n propPath,\n value\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\nfunction removeSpecValue(newSpec, path) {\n if (path === \"/state\") {\n delete newSpec.state;\n return;\n }\n if (path.startsWith(\"/state/\") && newSpec.state) {\n const statePath = path.slice(\"/state\".length);\n removeByPath(newSpec.state, statePath);\n return;\n }\n if (path.startsWith(\"/elements/\")) {\n const pathParts = path.slice(\"/elements/\".length).split(\"/\");\n const elementKey = pathParts[0];\n if (!elementKey) return;\n if (pathParts.length === 1) {\n const { [elementKey]: _, ...rest } = newSpec.elements;\n newSpec.elements = rest;\n } else {\n const element = newSpec.elements[elementKey];\n if (element) {\n const propPath = \"/\" + pathParts.slice(1).join(\"/\");\n const newElement = { ...element };\n removeByPath(\n newElement,\n propPath\n );\n newSpec.elements[elementKey] = newElement;\n }\n }\n }\n}\nfunction getSpecValue(spec, path) {\n if (path === \"/root\") return spec.root;\n if (path === \"/state\") return spec.state;\n if (path.startsWith(\"/state/\") && spec.state) {\n const statePath = path.slice(\"/state\".length);\n return getByPath3(spec.state, statePath);\n }\n return getByPath3(spec, path);\n}\nfunction applyPatch(spec, patch) {\n const newSpec = {\n ...spec,\n elements: { ...spec.elements },\n ...spec.state ? { state: { ...spec.state } } : {}\n };\n switch (patch.op) {\n case \"add\":\n case \"replace\": {\n setSpecValue(newSpec, patch.path, patch.value);\n break;\n }\n case \"remove\": {\n removeSpecValue(newSpec, patch.path);\n break;\n }\n case \"move\": {\n if (!patch.from) break;\n const moveValue = getSpecValue(newSpec, patch.from);\n removeSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, moveValue);\n break;\n }\n case \"copy\": {\n if (!patch.from) break;\n const copyValue = getSpecValue(newSpec, patch.from);\n setSpecValue(newSpec, patch.path, copyValue);\n break;\n }\n case \"test\": {\n break;\n }\n }\n return newSpec;\n}\nfunction useUIStream(options) {\n const [spec, setSpec] = createSignal4(null);\n const [isStreaming, setIsStreaming] = createSignal4(false);\n const [error, setError] = createSignal4(null);\n const [usage, setUsage] = createSignal4(null);\n const [rawLines, setRawLines] = createSignal4([]);\n let abortController = null;\n const clear = () => {\n setSpec(null);\n setError(null);\n };\n const send = async (prompt, context) => {\n abortController?.abort();\n abortController = new AbortController();\n setIsStreaming(true);\n setError(null);\n setUsage(null);\n setRawLines([]);\n const previousSpec = context?.previousSpec;\n let currentSpec = previousSpec && previousSpec.root ? { ...previousSpec, elements: { ...previousSpec.elements } } : { root: \"\", elements: {} };\n setSpec(currentSpec);\n try {\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prompt,\n context,\n currentSpec\n }),\n signal: abortController.signal\n });\n if (!response.ok) {\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n }\n throw new Error(errorMessage);\n }\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n const result = parseLine(trimmed);\n if (!result) continue;\n if (result.type === \"usage\") {\n setUsage(result.usage);\n } else {\n setRawLines((prev) => [...prev, trimmed]);\n currentSpec = applyPatch(currentSpec, result.patch);\n setSpec({ ...currentSpec });\n }\n }\n }\n if (buffer.trim()) {\n const trimmed = buffer.trim();\n const result = parseLine(trimmed);\n if (result) {\n if (result.type === \"usage\") {\n setUsage(result.usage);\n } else {\n setRawLines((prev) => [...prev, trimmed]);\n currentSpec = applyPatch(currentSpec, result.patch);\n setSpec({ ...currentSpec });\n }\n }\n }\n options.onComplete?.(currentSpec);\n } catch (err) {\n if (err.name === \"AbortError\") {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n setError(resolvedError);\n options.onError?.(resolvedError);\n } finally {\n setIsStreaming(false);\n }\n };\n onCleanup3(() => {\n abortController?.abort();\n });\n return {\n get spec() {\n return spec();\n },\n get isStreaming() {\n return isStreaming();\n },\n get error() {\n return error();\n },\n get usage() {\n return usage();\n },\n get rawLines() {\n return rawLines();\n },\n send,\n clear\n };\n}\nfunction flatToTree(elements) {\n const elementMap = {};\n let root = \"\";\n for (const element of elements) {\n elementMap[element.key] = {\n type: element.type,\n props: element.props,\n children: [],\n visible: element.visible\n };\n }\n for (const element of elements) {\n if (element.parentKey) {\n const parent = elementMap[element.parentKey];\n if (parent) {\n if (!parent.children) {\n parent.children = [];\n }\n parent.children.push(element.key);\n }\n } else {\n root = element.key;\n }\n }\n return { root, elements: elementMap };\n}\nfunction useBoundProp(propValue, bindingPath) {\n const { set } = useStateStore();\n const setValue = (value) => {\n if (bindingPath) set(bindingPath, value);\n };\n return [propValue, setValue];\n}\nfunction isSpecDataPart(data) {\n if (typeof data !== \"object\" || data === null) return false;\n const obj = data;\n switch (obj.type) {\n case \"patch\":\n return typeof obj.patch === \"object\" && obj.patch !== null;\n case \"flat\":\n case \"nested\":\n return typeof obj.spec === \"object\" && obj.spec !== null;\n default:\n return false;\n }\n}\nfunction buildSpecFromParts(parts) {\n const spec = { root: \"\", elements: {} };\n let hasSpec = false;\n for (const part of parts) {\n if (part.type === SPEC_DATA_PART_TYPE) {\n if (!isSpecDataPart(part.data)) continue;\n const payload = part.data;\n if (payload.type === \"patch\") {\n hasSpec = true;\n applySpecPatch(spec, payload.patch);\n } else if (payload.type === \"flat\") {\n hasSpec = true;\n Object.assign(spec, payload.spec);\n } else if (payload.type === \"nested\") {\n hasSpec = true;\n const flat = nestedToFlat(payload.spec);\n Object.assign(spec, flat);\n }\n }\n }\n return hasSpec ? spec : null;\n}\nfunction getTextFromParts(parts) {\n return parts.filter(\n (p) => p.type === \"text\" && typeof p.text === \"string\"\n ).map((p) => p.text.trim()).filter(Boolean).join(\"\\n\\n\");\n}\nfunction useJsonRenderMessage(getParts) {\n const result = createMemo4(() => {\n const parts = getParts();\n return {\n spec: buildSpecFromParts(parts),\n text: getTextFromParts(parts)\n };\n });\n return {\n get spec() {\n return result().spec;\n },\n get text() {\n return result().text;\n },\n get hasSpec() {\n const s = result().spec;\n return s !== null && Object.keys(s.elements || {}).length > 0;\n }\n };\n}\nvar chatMessageIdCounter = 0;\nfunction generateChatId() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n chatMessageIdCounter += 1;\n return `msg-${Date.now()}-${chatMessageIdCounter}`;\n}\nfunction useChatUI(options) {\n const [messages, setMessages] = createSignal4([]);\n const [isStreaming, setIsStreaming] = createSignal4(false);\n const [error, setError] = createSignal4(null);\n let abortController = null;\n const clear = () => {\n setMessages([]);\n setError(null);\n };\n const send = async (text) => {\n if (!text.trim()) return;\n abortController?.abort();\n abortController = new AbortController();\n const userMessage = {\n id: generateChatId(),\n role: \"user\",\n text: text.trim(),\n spec: null\n };\n const assistantId = generateChatId();\n const assistantMessage = {\n id: assistantId,\n role: \"assistant\",\n text: \"\",\n spec: null\n };\n setMessages((prev) => [...prev, userMessage, assistantMessage]);\n setIsStreaming(true);\n setError(null);\n const historyForApi = [\n ...messages().filter((m) => m.id !== userMessage.id && m.id !== assistantId).map((m) => ({\n role: m.role,\n content: m.text\n })),\n { role: \"user\", content: text.trim() }\n ];\n let accumulatedText = \"\";\n let currentSpec = { root: \"\", elements: {} };\n let hasSpec = false;\n try {\n const response = await fetch(options.api, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ messages: historyForApi }),\n signal: abortController.signal\n });\n if (!response.ok) {\n let errorMessage = `HTTP error: ${response.status}`;\n try {\n const errorData = await response.json();\n if (errorData.message) {\n errorMessage = errorData.message;\n } else if (errorData.error) {\n errorMessage = errorData.error;\n }\n } catch {\n }\n throw new Error(errorMessage);\n }\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n const decoder = new TextDecoder();\n const parser = createMixedStreamParser({\n onPatch(patch) {\n hasSpec = true;\n applySpecPatch(currentSpec, patch);\n setMessages(\n (prev) => prev.map(\n (m) => m.id === assistantId ? {\n ...m,\n spec: {\n root: currentSpec.root,\n elements: { ...currentSpec.elements },\n ...currentSpec.state ? { state: { ...currentSpec.state } } : {}\n }\n } : m\n )\n );\n },\n onText(line) {\n accumulatedText += (accumulatedText ? \"\\n\" : \"\") + line;\n setMessages(\n (prev) => prev.map(\n (m) => m.id === assistantId ? { ...m, text: accumulatedText } : m\n )\n );\n }\n });\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.push(decoder.decode(value, { stream: true }));\n }\n parser.flush();\n const finalMessage = {\n id: assistantId,\n role: \"assistant\",\n text: accumulatedText,\n spec: hasSpec ? {\n root: currentSpec.root,\n elements: { ...currentSpec.elements },\n ...currentSpec.state ? { state: { ...currentSpec.state } } : {}\n } : null\n };\n options.onComplete?.(finalMessage);\n } catch (err) {\n if (err.name === \"AbortError\") {\n return;\n }\n const resolvedError = err instanceof Error ? err : new Error(String(err));\n setError(resolvedError);\n setMessages(\n (prev) => prev.filter((m) => m.id !== assistantId || m.text.length > 0)\n );\n options.onError?.(resolvedError);\n } finally {\n setIsStreaming(false);\n }\n };\n onCleanup3(() => {\n abortController?.abort();\n });\n return {\n get messages() {\n return messages();\n },\n get isStreaming() {\n return isStreaming();\n },\n get error() {\n return error();\n },\n send,\n clear\n };\n}\nexport {\n ActionProvider,\n ConfirmDialog,\n JSONUIProvider,\n Renderer,\n RepeatScopeProvider,\n StateProvider,\n ValidationProvider,\n VisibilityProvider,\n buildSpecFromParts,\n createRenderer,\n createStateStore2 as createStateStore,\n defineRegistry,\n elementTreeSchema,\n flatToTree,\n getTextFromParts,\n schema,\n useAction,\n useActions,\n useBoundProp,\n useChatUI,\n useFieldValidation,\n useIsVisible,\n useJsonRenderMessage,\n useOptionalValidation,\n useRepeatScope,\n useStateBinding,\n useStateStore,\n useStateValue,\n useUIStream,\n useValidation,\n useVisibility\n};\n//# sourceMappingURL=index.mjs.map"],"x_google_ignoreList":[0],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xmachines/play-solid",
3
- "version": "1.0.0-beta.30",
3
+ "version": "1.0.0-beta.31",
4
4
  "description": "Solid renderer for XMachines Play architecture",
5
5
  "keywords": [
6
6
  "catalog",
@@ -39,8 +39,8 @@
39
39
  "prepublishOnly": "npm run build"
40
40
  },
41
41
  "dependencies": {
42
- "@xmachines/play-actor": "1.0.0-beta.30",
43
- "@xmachines/play-signals": "1.0.0-beta.30"
42
+ "@xmachines/play-actor": "1.0.0-beta.31",
43
+ "@xmachines/play-signals": "1.0.0-beta.31"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@json-render/core": "^0.16.0",
@@ -49,7 +49,7 @@
49
49
  "@solidjs/testing-library": "^0.8.10",
50
50
  "@testing-library/jest-dom": "^6.9.1",
51
51
  "@types/node": "^25.5.0",
52
- "@xmachines/shared": "1.0.0-beta.30",
52
+ "@xmachines/shared": "1.0.0-beta.31",
53
53
  "@xstate/store": ">=3.17.0",
54
54
  "jsdom": "^29.0.1",
55
55
  "oxfmt": "^0.43.0",