@live-react-islands/core 0.1.0 → 0.1.1

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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 David Czaplinski
3
+ Copyright (c) 2026 David Czaplinski
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md ADDED
@@ -0,0 +1,455 @@
1
+ # Live React Islands
2
+
3
+ **React-powered interactive islands** inside Phoenix LiveView. Harness the NPM ecosystem with server-driven state, real-time streams and zero-lag forms + SSR.
4
+
5
+ ![Banner](https://raw.githubusercontent.com/dcza/live-react-islands/main/docs/repository-open-graph.png)
6
+
7
+ ## Why Live React Islands?
8
+
9
+ **The best of both worlds!** ✨
10
+
11
+ Phoenix LiveView is excellent for server-driven UIs, but sometimes you need the rich interactivity of React for specific components. Live React Islands lets you:
12
+
13
+ - Use React components as "islands" within your LiveView templates
14
+ - Maintain server-side state in Elixir while rendering in React
15
+ - Send events from React to Elixir and push props back
16
+ - Use forms and streams in React with dedicated hooks
17
+ - Share global state across multiple islands
18
+ - Optionally server-side render for faster loads, SEO and no flicker
19
+
20
+ ## Comparison
21
+
22
+ Choose Live React Islands when you need rich, interactive React components without giving up LiveView’s server-driven simplicity.
23
+
24
+ | Feature | LiveView Only | LiveView + Alpine | Live React Islands (this) | Pure SPA (Next.js/Vite) |
25
+ | :--------------------- | :----------------------------------------- | :------------------- | :------------------------------------- | :---------------------- |
26
+ | **UI Ecosystem** | Limited (HEEX/Custom) | Small (Alpine kits) | **Infinite (NPM/React)** | **Infinite (NPM)** |
27
+ | **Interactivity** | Server-Roundtrip (JS hooks for edge cases) | Simple Client-side | **High-Fidelity / Fluid** | High-Fidelity / Fluid |
28
+ | **State Management** | Single (Server) | Fragmented | **Single (Server-Led)** | Dual (API + Client) |
29
+ | **Initial Load / SEO** | Instant | Instant | **Instant (SSR-enabled)** | Slow / Complex SSR |
30
+ | **JS Bundle Size** | ~0kb (Core only) | Small (+15kb) | **Large (React: ~100–150 kB gzipped)** | Large |
31
+ | **Developer Speed** | Very High | High (until complex) | **High (Asset Reuse)** | Low (API Plumbing) |
32
+ | **Component Logic** | Elixir Only | Mixed (Strings) | **JSX (Encapsulated)** | JSX |
33
+ | **Complexity Ceiling** | Struggles with app-like complexity | Hits wall on "State" | **High** | Very High |
34
+
35
+ ## When NOT to Use Live React Islands
36
+
37
+ - If your UI is mostly static or CRUD-heavy, plain LiveView is simpler and faster.
38
+ - If you only need light client-side behavior (toggles, dropdowns), LiveView + Alpine may be sufficient.
39
+ - If your application requires full offline support or heavy client-side state, a traditional SPA may be a better fit.
40
+
41
+ ## Installation
42
+
43
+ ### Elixir
44
+
45
+ Add to your `mix.exs`:
46
+
47
+ ```elixir
48
+ def deps do
49
+ [
50
+ {:live_react_islands, "~> 0.1.0"},
51
+ # For development SSR (optional):
52
+ {:live_react_islands_ssr_vite, "~> 0.1.0", only: :dev},
53
+ # For production SSR (optional):
54
+ {:live_react_islands_ssr_deno, "~> 0.1.0", only: :prod}
55
+ ]
56
+ end
57
+ ```
58
+
59
+ ### JavaScript
60
+
61
+ ```bash
62
+ npm install @live-react-islands/core
63
+ # For development SSR (optional):
64
+ npm install --save-dev @live-react-islands/vite-plugin-ssr
65
+ ```
66
+
67
+ ## Quick Start
68
+
69
+ ### 1. Create a React Component
70
+
71
+ ```jsx
72
+ // src/islands/Counter.jsx
73
+ const Counter = ({ count, title, pushEvent }) => {
74
+ return (
75
+ <div>
76
+ <h2>{title}</h2>
77
+ <p>Count: {count}</p>
78
+ <button onClick={() => pushEvent("increment", {})}>+1</button>
79
+ </div>
80
+ );
81
+ };
82
+
83
+ export default Counter;
84
+ ```
85
+
86
+ ### 2. Set Up the LiveView Hooks
87
+
88
+ ```jsx
89
+ // src/islands/index.js
90
+ export default { Counter: () => import("./Counter") };
91
+ ```
92
+
93
+ Islands can be lazy loaded to only load the JS used on the page.
94
+
95
+ ```jsx
96
+ // src/main.jsx
97
+ import { createHooks } from "@live-react-islands/core";
98
+ import islands from "./islands";
99
+
100
+ const islandHooks = createHooks({ islands });
101
+
102
+ // Add to your LiveSocket
103
+ let liveSocket = new LiveSocket("/live", Socket, {
104
+ hooks: { ...islandHooks },
105
+ });
106
+ ```
107
+
108
+ ### 3. Create an Elixir Component
109
+
110
+ ```elixir
111
+ defmodule MyAppWeb.Components.CounterIsland do
112
+ use LiveReactIslands.Component,
113
+ component: "Counter",
114
+ props: %{count: 0, title: "My Counter"}
115
+
116
+ def handle_event("increment", _params, socket) do
117
+ new_count = socket.assigns.count + 1
118
+ {:noreply, update_prop(socket, :count, new_count)}
119
+ end
120
+ end
121
+ ```
122
+
123
+ ### 4. Use in Your LiveView
124
+
125
+ ```elixir
126
+ defmodule MyAppWeb.CounterLive do
127
+ use MyAppWeb, :live_view
128
+ use LiveReactIslands.LiveView
129
+
130
+ def render(assigns) do
131
+ ~H"""
132
+ <.live_component module={MyAppWeb.Components.CounterIsland} id="counter-1" />
133
+ """
134
+ end
135
+ end
136
+ ```
137
+
138
+ ## How It Works
139
+
140
+ **React components receive these props automatically:**
141
+
142
+ | Prop | Description |
143
+ | -------------------- | --------------------------------- |
144
+ | `id` | The island's unique identifier |
145
+ | `pushEvent` | Function to send events to Elixir |
146
+ | All defined props | Current values from Elixir |
147
+ | All consumed globals | Current global state values |
148
+
149
+ ## Features
150
+
151
+ ### Props
152
+
153
+ Define props with default values. Props can be set from the template or updated from event handlers:
154
+
155
+ ```elixir
156
+ use LiveReactIslands.Component,
157
+ component: "Counter",
158
+ props: %{count: 0, title: "Default Title"}
159
+ ```
160
+
161
+ **Elixir components can override `init/2` for dynamic initialization:**
162
+
163
+ ```elixir
164
+ def init(assigns, socket) do
165
+ # Called once on mount, before SSR and first render
166
+ socket
167
+ |> update_prop(:computed, compute_value(assigns))
168
+ end
169
+ ```
170
+
171
+ **Updating props from Elixir:**
172
+
173
+ ```elixir
174
+ def handle_event("increment", _, socket) do
175
+ {:noreply, update_prop(socket, :count, socket.assigns.count + 1)}
176
+ end
177
+ ```
178
+
179
+ **Passing props from templates:**
180
+
181
+ ```heex
182
+ <.live_component module={CounterIsland} id="counter-1" title="Custom Title" />
183
+ ```
184
+
185
+ Once a prop is set from outside the component any `update_prop` call on it will raise an error to prevent a nasty set of bugs. To just initialize the component use `init_[prop]` to set the value once and then the component takes over.
186
+
187
+ ```heex
188
+ <.live_component module={CounterIsland} id="counter-1" init_count={5} />
189
+ ```
190
+
191
+ ### Events
192
+
193
+ Send events from React to Elixir using `pushEvent`:
194
+
195
+ ```jsx
196
+ // React
197
+ <button onClick={() => pushEvent("save", { data: formData })}>Save</button>
198
+ ```
199
+
200
+ ```elixir
201
+ # Elixir
202
+ def handle_event("save", %{"data" => data}, socket) do
203
+ # Handle the event
204
+ {:noreply, socket}
205
+ end
206
+ ```
207
+
208
+ ### Global State
209
+
210
+ Share state across multiple islands. When a global changes, all islands that use it automatically rerender.
211
+
212
+ **Set up in your LiveView:**
213
+
214
+ ```elixir
215
+ defmodule MyAppWeb.DashboardLive do
216
+ use MyAppWeb, :live_view
217
+ use LiveReactIslands.LiveView, expose_globals: [:user, :theme]
218
+
219
+ def mount(_params, session, socket) do
220
+ {:ok, assign(socket, user: get_user(session), theme: "light")}
221
+ end
222
+ end
223
+ ```
224
+
225
+ **Consume in your island:**
226
+
227
+ ```elixir
228
+ use LiveReactIslands.Component,
229
+ component: "Header",
230
+ props: %{},
231
+ globals: [:user, :theme]
232
+ ```
233
+
234
+ **Optional globals** (won't error if not set):
235
+
236
+ ```elixir
237
+ globals: [:user?] # The ? suffix makes it optional
238
+ ```
239
+
240
+ The globals are passed as props to your React component:
241
+
242
+ ```jsx
243
+ const Header = ({ user, theme }) => (
244
+ <header className={theme}>Welcome, {user.name}</header>
245
+ );
246
+ ```
247
+
248
+ ### Forms with Server Validation
249
+
250
+ Build forms with React UI and Elixir/Ecto validation. Input is collected client side with zero typing latency and send to Elixir for validation. Errors from the changeset get pushed back to React.
251
+
252
+ The `useForm` hook implements a "Validation Lock" pattern: Updates are versioned and `isValid` will only be true until the server confirms the current form state is valid.
253
+
254
+ **Elixir component:**
255
+
256
+ ```elixir
257
+ defmodule MyAppWeb.Components.ContactFormIsland do
258
+ use LiveReactIslands.Component,
259
+ component: "ContactForm",
260
+ props: %{form: %{}}
261
+
262
+ alias MyApp.Contact
263
+
264
+ def init(_assigns, socket) do
265
+ changeset = Contact.changeset(%Contact{}, %{})
266
+ socket |> init_form(:form, changeset)
267
+ end
268
+
269
+ def handle_form(:validate, :form, attrs, socket) do
270
+ changeset = Contact.changeset(%Contact{}, attrs)
271
+ {:noreply, update_form(socket, :form, changeset)}
272
+ end
273
+
274
+ def handle_form(:submit, :form, attrs, socket) do
275
+ case Contact.create(attrs) do
276
+ {:ok, _contact} ->
277
+ {:noreply, init_form(socket, :form, Contact.changeset(%Contact{}, %{}))}
278
+ {:error, changeset} ->
279
+ {:noreply, update_form(socket, :form, changeset)}
280
+ end
281
+ end
282
+ end
283
+ ```
284
+
285
+ **React component:**
286
+
287
+ ```jsx
288
+ import { useForm } from "@live-react-islands/core";
289
+
290
+ const ContactForm = ({ form, pushEvent }) => {
291
+ const {
292
+ getFieldProps,
293
+ getError,
294
+ isRequired,
295
+ isTouched,
296
+ handleSubmit,
297
+ isValid,
298
+ } = useForm(form, pushEvent);
299
+
300
+ return (
301
+ <form onSubmit={handleSubmit}>
302
+ <input {...getFieldProps("name")} />
303
+ {isTouched("name") && getError("name") && (
304
+ <span className="error">{getError("name")}</span>
305
+ )}
306
+
307
+ <input {...getFieldProps("email")} type="email" />
308
+ {isTouched("email") && getError("email") && (
309
+ <span className="error">{getError("email")}</span>
310
+ )}
311
+
312
+ <button type="submit" disabled={!isValid}>
313
+ Submit
314
+ </button>
315
+ </form>
316
+ );
317
+ };
318
+ ```
319
+
320
+ **`useForm` returns:**
321
+
322
+ | Property | Description |
323
+ | ----------------------- | ----------------------------------------------------- |
324
+ | `values` | Current form values |
325
+ | `errors` | Validation errors by field |
326
+ | `touched` | Fields the user has interacted with |
327
+ | `getFieldProps(name)` | Props to spread on inputs (`value`, `onChange`, etc.) |
328
+ | `getError(name)` | First error message for a field |
329
+ | `isRequired(name)` | Whether a field is required |
330
+ | `isTouched(name)` | Whether user has modified this field |
331
+ | `setField(name, value)` | Programmatically set a field value |
332
+ | `handleSubmit` | Form submit handler |
333
+ | `reset()` | Reset form to server values |
334
+ | `isSyncing` | True while waiting for server validation |
335
+ | `isValid` | True only when synced AND server says valid |
336
+
337
+ ### Streams
338
+
339
+ Stream data to React components for real-time updates like feeds, chat, or infinite scrolling:
340
+
341
+ **Define a stream prop:**
342
+
343
+ ```elixir
344
+ use LiveReactIslands.Component,
345
+ component: "MessageList",
346
+ props: %{
347
+ messages: {:stream, default: []}
348
+ }
349
+ ```
350
+
351
+ **Push stream events from Elixir:**
352
+
353
+ ```elixir
354
+ # Insert new item (prepends by default)
355
+ socket |> stream_insert(:messages, %{id: 1, text: "Hello"})
356
+
357
+ # Update existing item
358
+ socket |> stream_update(:messages, %{id: 1, text: "Hello, edited"})
359
+
360
+ # Delete an item
361
+ socket |> stream_delete(:messages, 1)
362
+
363
+ # Reset the entire stream
364
+ socket |> stream_reset(:messages)
365
+ ```
366
+
367
+ **Consume in React:**
368
+
369
+ ```jsx
370
+ import { useStream } from "@live-react-islands/core";
371
+
372
+ const MessageList = ({ messages: messagesHandle }) => {
373
+ const messages = useStream(messagesHandle, { limit: 100 });
374
+
375
+ return (
376
+ <ul>
377
+ {messages.map((msg) => (
378
+ <li key={msg.id}>{msg.text}</li>
379
+ ))}
380
+ </ul>
381
+ );
382
+ };
383
+ ```
384
+
385
+ ### Shared Context
386
+
387
+ Islands using `:none` (default) or `:overwrite` SSR strategies render into a shared React root via portals. This enables powerful patterns like drag-and-drop between islands, shared state managers, or animation libraries that need to coordinate across components.
388
+
389
+ **Wrap all islands in a shared context:**
390
+
391
+ ```jsx
392
+ // src/main.jsx
393
+ import { createHooks } from "@live-react-islands/core";
394
+ import { DndProvider } from "react-beautiful-dnd";
395
+ import islands from "./islands";
396
+
397
+ const SharedContextProvider = ({ children }) => (
398
+ <DndProvider backend={HTML5Backend}>{children}</DndProvider>
399
+ );
400
+
401
+ const islandHooks = createHooks({
402
+ islands,
403
+ SharedContextProvider,
404
+ });
405
+ ```
406
+
407
+ Now all your islands can participate in drag-and-drop with each other, even though they're scattered across your LiveView template.
408
+
409
+ > **Note:** Islands using `:hydrate_root` SSR strategy have their own isolated React root and do not participate in the shared context. Use `:overwrite` or `:none` if you need context sharing between islands.
410
+
411
+ ### Server-Side Rendering (SSR)
412
+
413
+ SSR improves initial page load performance by rendering React components on the server.
414
+
415
+ ```elixir
416
+ use LiveReactIslands.Component,
417
+ component: "Counter",
418
+ props: %{count: 0},
419
+ ssr_strategy: :overwrite # or :hydrate_root or :none (default)
420
+ ```
421
+
422
+ | Strategy | Shared Root | Best For |
423
+ | --------------- | ----------- | ----------------------------------------------------------------------- |
424
+ | `:none` | Yes | Interactive components where initial render doesn't matter |
425
+ | `:overwrite` | Yes | Most islands, especially when you need cross-island context (e.g., DnD) |
426
+ | `:hydrate_root` | No | Large islands where you want to avoid the overwrite flash |
427
+
428
+ > ⚠️ SSR is optional. Many islands work perfectly without it. Enable SSR when initial paint, SEO, or perceived performance matter.
429
+
430
+ See the **[SSR Guide](https://github.com/dcza/live-react-islands/blob/main/docs/SSR.md)** for complete setup instructions, caching strategies, and custom renderer implementation.
431
+
432
+ ## Requirements
433
+
434
+ - Elixir >= 1.14
435
+ - Phoenix LiveView >= 1.0
436
+ - React 18 or 19
437
+ - Any JavaScript bundler (built-in SSR plugin for Vite)
438
+
439
+ ### Running Examples
440
+
441
+ ```bash
442
+ cd examples/vite-example
443
+ mix deps.get
444
+ yarn install
445
+ yarn dev
446
+ mix phx.server # in another terminal
447
+ ```
448
+
449
+ ## Contributing
450
+
451
+ See [CONTRIBUTING.md](https://github.com/dcza/live-react-islands/blob/main/CONTRIBUTING.md) for development setup and guidelines.
452
+
453
+ ## License
454
+
455
+ MIT License - see [LICENSE](https://github.com/dcza/live-react-islands/blob/main/LICENSE) for details.
package/dist/index.esm.js CHANGED
@@ -469,7 +469,7 @@ function createHooks({ islands: islandsMap = {}, SharedContextProvider = NullCon
469
469
  const el = this.el;
470
470
  pendingMounts.add(elId);
471
471
  (async () => {
472
- const islandConfig = await resolveIslandConfig(islandsMap, componentName, SharedContextProvider);
472
+ const islandConfig = await resolveIslandConfig(islandsMap, componentName, NullContextProvider$1);
473
473
  if (!pendingMounts.has(elId))
474
474
  return;
475
475
  pendingMounts.delete(elId);
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/types.ts","../src/context.ts","../src/PortalIslandsRenderer.tsx","../src/IndividualIslandRenderer.tsx","../src/islandsManager.ts","../src/createHooks.ts","../src/useStream.ts","../src/useForm.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import { createContext } from \"react\";\nimport type { IslandStoreAccess } from \"./types\";\n\nexport interface IslandContext {\n id: string;\n storeAccess: IslandStoreAccess;\n}\n\nexport const IslandContextProvider = createContext<IslandContext | null>(null);\n","import React, { useRef, memo, useSyncExternalStore, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type {\n IslandData,\n SharedIslandsRendererProps,\n IslandStoreAccess,\n} from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nconst PortalIsland = memo(\n ({\n data,\n storeAccess,\n }: {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n }) => {\n const {\n Component,\n ContextProvider,\n id,\n pushEvent,\n ssrStrategy,\n el,\n globalKeys,\n } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n const contextValue = useMemo(\n () => ({ id, storeAccess }),\n [id, storeAccess]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => null\n );\n\n const allGlobals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n () => null\n );\n\n const didClearRef = useRef(false);\n if (ssrStrategy === \"overwrite\" && !didClearRef.current) {\n el.innerHTML = \"\";\n didClearRef.current = true;\n }\n\n if (!allGlobals) {\n console.log(\"[PortalIsland] Waiting for globals\", id);\n return null;\n }\n\n console.log(\"[PortalIsland] Rendering\", { id, allGlobals });\n\n const relevantGlobals: Record<string, any> = {};\n if (allGlobals) {\n globalKeys.forEach((key) => {\n if (key in allGlobals) {\n relevantGlobals[key] = allGlobals[key];\n }\n });\n }\n\n const mergedProps = { ...relevantGlobals, ...currentProps };\n\n const islandNode = (\n <MemoizedComponent {...mergedProps} id={id} pushEvent={pushEvent} />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n const content = MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n\n return createPortal(content, el);\n }\n);\nPortalIsland.displayName = \"[ReactLiveIslands]PortalIsland\";\n\nexport const PortalIslandsRenderer: React.FC<SharedIslandsRendererProps> = ({\n storeAccess,\n}) => {\n const sharedIslandsObj = useSyncExternalStore(\n storeAccess.subscribeToSharedIslands,\n storeAccess.getSharedIslands\n );\n\n const islands = Object.values(sharedIslandsObj);\n\n console.log(\n \"[PortalIslandsRenderer] Rendering islands:\",\n islands.map((d) => d.id)\n );\n\n return (\n <>\n {islands.map((data) => (\n <PortalIsland key={data.id} data={data} storeAccess={storeAccess} />\n ))}\n </>\n );\n};\nPortalIslandsRenderer.displayName = \"[ReactLiveIslands]PortalIslandsRenderer\";\n","import React, { useSyncExternalStore, memo, useMemo } from \"react\";\nimport type { IndividualIslandsRendererProps } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport const IndividualIslandRenderer: React.FC<\n IndividualIslandsRendererProps\n> = ({ data, storeAccess }) => {\n const { Component, ContextProvider, id, pushEvent, globalKeys } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => data.hydrationData?.props\n );\n\n // Check once if hydration globals version matches store version\n const serverGlobalsSnapshot = useMemo(() => {\n const hydrationGlobals = data.hydrationData?.globals;\n if (!hydrationGlobals) return () => hydrationGlobals;\n let comparedVersions = false;\n let useStoreReference = false;\n return () => {\n if (!comparedVersions) {\n comparedVersions = true;\n const storeGlobals = storeAccess.getGlobals();\n const hydrationVersion = hydrationGlobals.__version ?? -1;\n const storeVersion = storeGlobals?.__version ?? -1;\n useStoreReference = storeVersion === hydrationVersion;\n }\n return useStoreReference ? storeAccess.getGlobals() : hydrationGlobals;\n };\n }, [data.hydrationData?.globals, storeAccess]);\n\n const globals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n serverGlobalsSnapshot\n );\n\n const filteredGlobals: Record<string, any> = {};\n if (globals) {\n globalKeys.forEach((key) => {\n if (key in globals) {\n filteredGlobals[key] = globals[key];\n }\n });\n }\n\n const contextValue = useMemo(() => ({ id, storeAccess }), [id, storeAccess]);\n\n const islandNode = (\n <MemoizedComponent\n {...filteredGlobals}\n {...currentProps}\n id={id}\n pushEvent={pushEvent}\n />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n return MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n};\n\nIndividualIslandRenderer.displayName =\n \"[ReactLiveIslands] IndividualIslandRenderer\";\n","import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\n\nimport {\n ContextProviderComponent,\n IslandData,\n SharedIslandsRendererComponent,\n IndividualIslandsRendererComponent,\n IslandStoreAccess,\n IndividualIslandsRendererProps,\n StreamAction,\n StreamConfig,\n} from \"./types\";\nimport { PortalIslandsRenderer } from \"./PortalIslandsRenderer\";\nimport { IndividualIslandRenderer } from \"./IndividualIslandRenderer\";\n\n// Constant root ID - one shared root per application\nexport const SHARED_ROOT_ID = \"__live_react_islands_shared_root__\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ManagerState {\n propsStore: Map<string, Record<string, any>>;\n propsListeners: Set<() => void>;\n globalsRef: React.MutableRefObject<Record<string, any> | null>;\n globalsListeners: Set<() => void>;\n sharedIslandsRef: React.MutableRefObject<Record<string, IslandData>>;\n sharedIslandsListeners: Set<() => void>;\n streamsStore: Map<string, any[]>;\n streamsListeners: Map<string, Set<() => void>>;\n streamConfigs: Map<string, StreamConfig>;\n roots: Record<string, any>;\n storeAccess: IslandStoreAccess;\n}\n\nexport interface Manager {\n initialize: (params: {\n SharedContextProvider?: ContextProviderComponent;\n SharedIslandsRenderer?: SharedIslandsRendererComponent;\n }) => ManagerState;\n mountIsland: (\n state: ManagerState,\n data: IslandData,\n IslandRenderer?: IndividualIslandsRendererComponent\n ) => ManagerState;\n unmountIsland: (state: ManagerState, id: string) => ManagerState;\n updateIslandProps: (\n state: ManagerState,\n islandId: string,\n props: Record<string, any>\n ) => ManagerState;\n updateGlobals: (\n state: ManagerState,\n globals: Record<string, any>\n ) => ManagerState;\n resetGlobals: (state: ManagerState) => ManagerState;\n initializeStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n initialItems: any[]\n ) => ManagerState;\n updateStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n action: StreamAction,\n data: any\n ) => ManagerState;\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n\nconst withSharedRootName = (\n ContextProvider: ContextProviderComponent\n): ContextProviderComponent => {\n const originalName =\n ContextProvider.displayName || ContextProvider.name || \"ContextProvider\";\n\n function NamedWrapper({ children }: { children: React.ReactNode }) {\n return React.createElement(ContextProvider, null, children);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] SharedRoot(${originalName})`;\n return NamedWrapper;\n};\n\nconst withIndividualRootName = (\n islandId: string,\n IslandRenderer: IndividualIslandsRendererComponent\n): IndividualIslandsRendererComponent => {\n const originalName = IslandRenderer.displayName;\n\n function NamedWrapper(props: IndividualIslandsRendererProps) {\n return React.createElement(IslandRenderer, props);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] HydratedRoot#${islandId}`;\n return NamedWrapper;\n};\n\nconst getOrCreateSharedRootElement = (): HTMLElement => {\n let rootElement = document.getElementById(SHARED_ROOT_ID);\n if (!rootElement) {\n rootElement = document.createElement(\"div\");\n rootElement.id = SHARED_ROOT_ID;\n rootElement.style.display = \"none\";\n document.body.appendChild(rootElement);\n }\n return rootElement;\n};\n\nconst mountSharedIsland = (\n state: ManagerState,\n data: IslandData\n): ManagerState => {\n state.sharedIslandsRef.current = {\n ...state.sharedIslandsRef.current,\n [data.id]: data,\n };\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n};\n\nconst mountIndividualIsland = (\n state: ManagerState,\n data: IslandData,\n IslandRenderer: IndividualIslandsRendererComponent\n): ManagerState => {\n const NamedIslandRenderer = withIndividualRootName(data.id, IslandRenderer);\n const root = ReactDOM.hydrateRoot(\n data.el,\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(NamedIslandRenderer, {\n data,\n storeAccess: state.storeAccess,\n })\n )\n );\n\n return {\n ...state,\n roots: { ...state.roots, [data.id]: root },\n };\n};\n\n// ============================================================================\n// Island Manager (Bridge between LiveView hook lifecycles and React rendering)\n// ============================================================================\n\nconst ManagerObj: Manager = {\n initialize: ({\n SharedContextProvider = NullContextProvider,\n SharedIslandsRenderer = PortalIslandsRenderer,\n }) => {\n const rootElement = getOrCreateSharedRootElement();\n const root = ReactDOM.createRoot(rootElement);\n\n const propsStore = new Map<string, Record<string, any>>();\n const propsListeners = new Set<() => void>();\n const globalsRef = { current: null as Record<string, any> | null };\n const globalsListeners = new Set<() => void>();\n const sharedIslandsRef = { current: {} as Record<string, IslandData> };\n const sharedIslandsListeners = new Set<() => void>();\n const streamsStore = new Map<string, any[]>();\n const streamsListeners = new Map<string, Set<() => void>>();\n const streamConfigs = new Map<string, StreamConfig>();\n\n const getStreamKey = (islandId: string, streamName: string) =>\n `${islandId}:${streamName}`;\n\n const storeAccess: IslandStoreAccess = {\n getProps: (islandId: string) => propsStore.get(islandId) || null,\n subscribeToProps: (cb: () => void) => {\n propsListeners.add(cb);\n return () => propsListeners.delete(cb);\n },\n getGlobals: () => globalsRef.current,\n subscribeToGlobals: (cb: () => void) => {\n globalsListeners.add(cb);\n return () => globalsListeners.delete(cb);\n },\n getSharedIslands: () => sharedIslandsRef.current,\n subscribeToSharedIslands: (cb: () => void) => {\n sharedIslandsListeners.add(cb);\n return () => sharedIslandsListeners.delete(cb);\n },\n getStreamItems: (islandId: string, streamName: string) => {\n const key = getStreamKey(islandId, streamName);\n return streamsStore.get(key) || [];\n },\n subscribeToStream: (\n islandId: string,\n streamName: string,\n cb: () => void,\n config?: StreamConfig\n ) => {\n const key = getStreamKey(islandId, streamName);\n if (config) {\n streamConfigs.set(key, config);\n }\n if (!streamsListeners.has(key)) {\n streamsListeners.set(key, new Set());\n }\n streamsListeners.get(key)!.add(cb);\n return () => {\n streamsListeners.get(key)?.delete(cb);\n if (streamsListeners.get(key)?.size === 0) {\n streamConfigs.delete(key);\n }\n };\n },\n };\n\n const state: ManagerState = {\n propsStore,\n globalsRef,\n propsListeners,\n globalsListeners,\n sharedIslandsRef,\n sharedIslandsListeners,\n streamsStore,\n streamsListeners,\n streamConfigs,\n roots: { [SHARED_ROOT_ID]: root },\n storeAccess,\n };\n\n const NamedSharedContextProvider = withSharedRootName(\n SharedContextProvider\n );\n\n root.render(\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(\n NamedSharedContextProvider,\n null,\n React.createElement(SharedIslandsRenderer, {\n storeAccess: state.storeAccess,\n })\n )\n )\n );\n\n return state;\n },\n mountIsland: (state, data, IslandRenderer = IndividualIslandRenderer) => {\n switch (data.ssrStrategy) {\n case \"hydrate_root\":\n return mountIndividualIsland(state, data, IslandRenderer);\n default:\n return mountSharedIsland(state, data);\n }\n },\n unmountIsland: (state, id) => {\n state.propsStore.delete(id);\n\n const streamPrefix = `${id}:`;\n for (const key of state.streamsStore.keys()) {\n if (key.startsWith(streamPrefix)) {\n state.streamsStore.delete(key);\n state.streamsListeners.delete(key);\n state.streamConfigs.delete(key);\n }\n }\n\n if (state.roots[id]) {\n state.roots[id].unmount();\n const { [id]: removedRoot, ...remainingRoots } = state.roots;\n return {\n ...state,\n roots: remainingRoots,\n };\n } else {\n const { [id]: removed, ...remaining } = state.sharedIslandsRef.current;\n state.sharedIslandsRef.current = remaining;\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n }\n },\n updateIslandProps: (state, islandId, props) => {\n const existing = state.propsStore.get(islandId) || {};\n state.propsStore.set(islandId, { ...existing, ...props });\n state.propsListeners.forEach((cb) => cb());\n return state;\n },\n updateGlobals: (state, globals) => {\n const incomingVersion = globals.__version ?? -1;\n const storeVersion = state.globalsRef.current?.__version ?? -1;\n if (incomingVersion > storeVersion) {\n state.globalsRef.current = {\n ...(state.globalsRef.current || {}),\n ...globals,\n };\n state.globalsListeners.forEach((cb) => cb());\n }\n\n return state;\n },\n resetGlobals: (state) => {\n state.globalsRef.current = null;\n return state;\n },\n initializeStream: (state, islandId, streamName, initialItems) => {\n const key = `${islandId}:${streamName}`;\n state.streamsStore.set(key, [...initialItems]);\n return state;\n },\n updateStream: (state, islandId, streamName, action, data) => {\n const key = `${islandId}:${streamName}`;\n let items = state.streamsStore.get(key) || [];\n const config = state.streamConfigs.get(key);\n\n switch (action) {\n case StreamAction.Insert:\n items = [data, ...items];\n break;\n case StreamAction.Update:\n const idx = items.findIndex((item) => item.id === data.id);\n if (idx !== -1) {\n items = [...items];\n items[idx] = { ...items[idx], ...data };\n }\n break;\n case StreamAction.Delete:\n items = items.filter((item) => item.id !== data);\n break;\n case StreamAction.Reset:\n items = [];\n break;\n }\n\n if (config?.capper) {\n items = config.capper(items);\n } else if (config?.limit !== undefined && items.length > config.limit) {\n items = items.slice(0, config.limit);\n }\n\n state.streamsStore.set(key, items);\n state.streamsListeners.get(key)?.forEach((cb) => cb());\n return state;\n },\n};\nexport default ManagerObj;\n","import IslandsManager, { Manager } from \"./islandsManager\";\nimport {\n type IslandsMap,\n type SSRStrategy,\n type PushEventFn,\n type ContextProviderComponent,\n type IslandComponent,\n type LazyIslandFactory,\n type StreamHandle,\n NullContextProvider,\n StreamAction,\n} from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface LiveViewHook {\n el: HTMLElement;\n liveSocket: {\n on: (event: string, callback: (e: Event) => void) => void;\n };\n pushEvent: (\n event: string,\n payload: any,\n callback?: (reply: any, ref: any) => void\n ) => void;\n pushEventTo: (target: string, event: string, payload: any) => void;\n handleEvent: (event: string, callback: (data: any) => void) => void;\n}\n\nexport interface CreateHooksOptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n manager?: Manager;\n}\n\n// ============================================================================\n// Event Handler Adapter\n// ============================================================================\n\nfunction createPushEventFn(hook: LiveViewHook): PushEventFn {\n return (eventName: string, payload: any) => {\n hook.pushEventTo(`#${hook.el.id}`, eventName, payload);\n };\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst resolvedComponentsCache = new Map<string, IslandComponent>();\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n // Check if it's a React component (has prototype.isReactComponent for class components)\n if ((value as any).prototype?.isReactComponent) return false;\n // Check if it's a config object getter (would have Component property)\n if ((value as any).Component) return false;\n // Assume zero-arg functions that aren't class components are lazy factories\n return value.length === 0;\n};\n\nconst resolveIslandConfig = async (\n islandsMap: IslandsMap,\n componentName: string,\n defaultContextProvider: ContextProviderComponent\n): Promise<{\n Component: IslandComponent;\n ContextProvider: ContextProviderComponent;\n} | null> => {\n const config = islandsMap[componentName];\n\n if (!config) {\n return null;\n }\n\n // Check cache first for lazy-loaded components\n const cached = resolvedComponentsCache.get(componentName);\n if (cached) {\n return { Component: cached, ContextProvider: defaultContextProvider };\n }\n\n // Handle lazy factory: () => import(\"./Component\")\n if (isLazyFactory(config)) {\n const mod = await config();\n const Component = mod.default;\n resolvedComponentsCache.set(componentName, Component);\n return { Component, ContextProvider: defaultContextProvider };\n }\n\n // Handle direct component\n if (typeof config === \"function\") {\n return { Component: config, ContextProvider: defaultContextProvider };\n }\n\n // Handle config object\n return {\n Component: config.Component,\n ContextProvider: config.ContextProvider || defaultContextProvider,\n };\n};\n\n// ============================================================================\n// Main Hook Factory (LiveView Adapter Layer)\n// ============================================================================\n\nexport function createHooks({\n islands: islandsMap = {},\n SharedContextProvider = NullContextProvider,\n manager = IslandsManager,\n}: CreateHooksOptions) {\n console.log(`[LiveReactIslands] Creating hooks`);\n let managerState = manager.initialize({ SharedContextProvider });\n\n let globalsRequested = false;\n const pendingMounts = new Set<string>();\n let navigationListenerAttached = false;\n\n const Hook: Partial<LiveViewHook> & {\n mounted: (this: LiveViewHook) => void;\n updated?: (this: LiveViewHook) => void;\n destroyed: (this: LiveViewHook) => void;\n } = {\n mounted(this: LiveViewHook) {\n console.log(\"[Hook] Mount:\", this.el.id);\n if (!this.el.id) {\n console.error(`[LiveReactIslands] Island element missing unique id`);\n return;\n }\n\n if (!navigationListenerAttached) {\n navigationListenerAttached = true;\n this.liveSocket.on(\"phx:page-loading-start\", () => {\n globalsRequested = false;\n managerState = manager.resetGlobals(managerState);\n });\n }\n\n // Pull globals once on first island mount\n if (!globalsRequested) {\n globalsRequested = true;\n this.handleEvent(\"lri-g\", (data) => {\n managerState = manager.updateGlobals(managerState, data);\n });\n this.pushEvent(\"lri-g\", {}, (reply) => {\n managerState = manager.updateGlobals(managerState, reply);\n });\n }\n\n const {\n comp: componentName,\n ssr: ssrData,\n props: propsData,\n schema: schemaData,\n globals: globalsData,\n globalsVersion: globalsVersionData,\n } = this.el.dataset;\n if (!componentName) {\n console.error(\n `[LiveReactIslands] Element '${this.el.id}' missing data-comp attribute`\n );\n return;\n }\n\n let schema: { p: string[]; g: string[]; i: number } = {\n p: [],\n g: [],\n i: 0,\n };\n if (schemaData) {\n try {\n schema = JSON.parse(schemaData);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-schema:`,\n e\n );\n }\n }\n\n let initialProps: Record<string, any> = {};\n if (propsData) {\n try {\n const propsArray = JSON.parse(propsData);\n schema.p.forEach((propName, idx) => {\n const value = propsArray[idx];\n if (value?.__s !== undefined) {\n const streamName = schema.p[value.__s];\n managerState = manager.initializeStream(\n managerState,\n this.el.id,\n streamName,\n value.i\n );\n const handle: StreamHandle = {\n name: streamName,\n initial: value.i,\n };\n initialProps[propName] = handle;\n } else {\n initialProps[propName] = value;\n }\n });\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-props:`,\n e\n );\n }\n }\n\n // Only for hydrate_root strategy\n let initialGlobals: Record<string, any> = {};\n if (globalsData) {\n try {\n const globalsArray = JSON.parse(globalsData);\n schema.g.forEach((globalName, idx) => {\n initialGlobals[globalName] = globalsArray[idx];\n });\n if (!globalsVersionData)\n throw \"Missing data-globals-version attribute\";\n initialGlobals.__version = parseInt(globalsVersionData, 10);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-globals:`,\n e\n );\n }\n }\n\n let ssrStrategy: SSRStrategy;\n switch (ssrData) {\n case \"overwrite\":\n ssrStrategy = \"overwrite\";\n break;\n case \"hydrate_root\":\n ssrStrategy = \"hydrate_root\";\n break;\n default:\n ssrStrategy = \"none\";\n }\n\n const pushEvent = createPushEventFn(this);\n const elId = this.el.id;\n const el = this.el;\n\n pendingMounts.add(elId);\n\n (async () => {\n const islandConfig = await resolveIslandConfig(\n islandsMap,\n componentName,\n SharedContextProvider\n );\n\n if (!pendingMounts.has(elId)) return;\n pendingMounts.delete(elId);\n\n if (!islandConfig) {\n console.error(\n `[LiveReactIslands] React island '${componentName}' not found`\n );\n return;\n }\n\n managerState = manager.updateIslandProps(\n managerState,\n elId,\n initialProps\n );\n\n managerState = manager.mountIsland(managerState, {\n id: elId,\n el,\n Component: islandConfig.Component,\n ContextProvider: islandConfig.ContextProvider,\n ssrStrategy,\n pushEvent,\n hydrationData:\n ssrStrategy === \"hydrate_root\"\n ? { props: initialProps, globals: initialGlobals }\n : null,\n globalKeys: schema.g,\n });\n })();\n\n this.handleEvent(\n \"lri-p\",\n (payload: { i: number; [key: number]: any }) => {\n if (payload.i !== schema.i) return;\n\n const props: Record<string, any> = {};\n Object.entries(payload).forEach(([key, value]) => {\n if (key === \"i\") return;\n const idx = parseInt(key, 10);\n if (!isNaN(idx) && schema.p[idx]) {\n props[schema.p[idx]] = value;\n }\n });\n\n managerState = manager.updateIslandProps(\n managerState,\n this.el.id,\n props\n );\n }\n );\n\n this.handleEvent(\n \"lri-s\",\n (payload: { s: number; a: StreamAction; d: any; i: number }) => {\n if (payload.i !== schema.i) return;\n\n const streamName = schema.p[payload.s];\n if (!streamName) return;\n\n managerState = manager.updateStream(\n managerState,\n this.el.id,\n streamName,\n payload.a,\n payload.d\n );\n }\n );\n },\n\n updated(this: LiveViewHook) {\n console.log(\"[Hook] Updated:\", this.el.id);\n },\n\n destroyed(this: LiveViewHook) {\n console.log(\"[Hook] Destroyed:\", this.el.id);\n pendingMounts.delete(this.el.id);\n managerState = manager.unmountIsland(managerState, this.el.id);\n },\n };\n\n return { LiveReactIslands: Hook };\n}\n","import { useContext, useSyncExternalStore, useMemo } from \"react\";\nimport type { StreamHandle } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport interface UseStreamOptions<T> {\n limit?: number;\n capper?: (items: T[]) => T[];\n}\n\nexport function useStream<T extends { id: string | number }>(\n handle: StreamHandle,\n options?: UseStreamOptions<T>\n): T[] {\n const context = useContext(IslandContextProvider);\n if (!context) {\n throw new Error(\"useStream must be used within an Island component\");\n }\n\n const { id: islandId, storeAccess } = context;\n\n const subscribe = useMemo(\n () => (cb: () => void) =>\n storeAccess.subscribeToStream(islandId, handle.name, cb, {\n limit: options?.limit,\n capper: options?.capper as ((items: any[]) => any[]) | undefined,\n }),\n [storeAccess, islandId, handle.name, options?.limit, options?.capper]\n );\n\n const getSnapshot = useMemo(\n () => () => storeAccess.getStreamItems(islandId, handle.name) as T[],\n [storeAccess, islandId, handle.name]\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, () => handle.initial as T[]);\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\n\nexport interface FormProps {\n /** Internal: prop name for event routing (set by server) */\n __prop?: string;\n types?: Record<string, string>;\n required?: string[];\n values: Record<string, any>;\n errors: Record<string, string[]>;\n isValid?: boolean;\n version?: number;\n}\n\nexport type PushEventFn = (event: string, payload: Record<string, any>) => void;\n\nexport interface FieldProps {\n name: string;\n value: any;\n checked?: boolean;\n onChange: (\n e: React.ChangeEvent<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >\n ) => void;\n}\n\nexport interface UseFormReturn {\n /** Current form field values */\n values: Record<string, any>;\n /** Current form errors by field name */\n errors: Record<string, string[]>;\n /** Field types from schema */\n types: Record<string, string>;\n /** Required field names */\n required: string[];\n /** Field names that have been modified by the user */\n touched: string[];\n /** Get props to spread on an input element */\n getFieldProps: (name: string) => FieldProps;\n /** Get the first error message for a field */\n getError: (name: string) => string | undefined;\n /** Check if a field is required */\n isRequired: (name: string) => boolean;\n /** Check if a field has been modified by the user */\n isTouched: (name: string) => boolean;\n /** Set a field value programmatically */\n setField: (name: string, value: any) => void;\n /** Handle form submission */\n handleSubmit: (e?: React.FormEvent) => void;\n /** Reset form to server values */\n reset: () => void;\n /**\n * True when the server hasn't acknowledged the latest client changes.\n * Use this to show a syncing indicator (e.g., spinner, \"Validating...\").\n */\n isSyncing: boolean;\n /**\n * True only when form is valid AND fully synced with server.\n * Use this to enable/disable the submit button.\n * This is the \"Validation Lock\" - users cannot submit until server confirms validity.\n */\n isValid: boolean;\n /** Current local version counter */\n localVersion: number;\n /** Last acknowledged server version */\n serverVersion: number;\n}\n\nexport function useForm(\n form: FormProps,\n pushEvent?: PushEventFn\n): UseFormReturn {\n // 1. Version Tracking\n // Local version increments on each field change\n // Server version comes from form.version prop\n const localVersionRef = useRef(form.version ?? 0);\n const lastSentVersionRef = useRef(0); // Prevents duplicate sends in StrictMode\n const [localVersion, setLocalVersion] = useState(form.version ?? 0);\n const serverVersion = form.version ?? 0;\n\n // Prop name comes from server (embedded in form data)\n const propName = form.__prop;\n\n // Reset local version when server sends a reset (version 0 with new schema)\n useEffect(() => {\n if (form.version === 0 && form.types) {\n localVersionRef.current = 0;\n setLocalVersion(0);\n }\n }, [form.version, form.types]);\n\n // 3. Persistent Schema\n // We only update these when the server explicitly sends them (usually on init)\n const [schema, setSchema] = useState({\n types: form.types ?? {},\n required: form.required ?? [],\n });\n\n if (form.types && form.types !== schema.types) {\n setSchema((prev) => ({ ...prev, types: form.types! }));\n }\n if (form.required && form.required !== schema.required) {\n setSchema((prev) => ({ ...prev, required: form.required! }));\n }\n\n // 4. Values Management\n const [localValues, setLocalValues] = useState<Record<string, any>>(\n form.values ?? {}\n );\n\n // 5. Touched Tracking (client-side only)\n const [touched, setTouched] = useState<string[]>([]);\n\n // Sync from server: Update local values when server sends updates\n useEffect(() => {\n setLocalValues((prev) => ({ ...prev, ...form.values }));\n }, [form.values]);\n\n // 6. Versioned Change Handler\n const setField = useCallback((name: string, value: any) => {\n // Mark field as touched\n setTouched((prev) => (prev.includes(name) ? prev : [...prev, name]));\n\n // Increment version BEFORE state update to avoid StrictMode double-increment\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n\n setLocalValues((prev) => {\n const next = { ...prev, [name]: value };\n\n // Update version state (will be batched with values update)\n setLocalVersion(newVersion);\n\n // Only send event once per version (prevents duplicate sends in StrictMode)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"validate\",\n prop: propName,\n attrs: next,\n _v: newVersion,\n });\n }\n\n return next;\n });\n }, [propName]);\n\n // 6. Identity-Stable Field Props\n const getFieldProps = useCallback(\n (name: string): FieldProps => {\n const type = schema.types[name];\n const value = localValues[name];\n\n const base = { name };\n\n if (type === \"boolean\" || type === \"bool\") {\n return {\n ...base,\n checked: !!value,\n value: undefined as any,\n onChange: (e) =>\n setField(name, (e.target as HTMLInputElement).checked),\n };\n }\n\n return {\n ...base,\n value: value ?? \"\",\n onChange: (e) => setField(name, e.target.value),\n };\n },\n [localValues, schema.types, setField]\n );\n\n const getError = useCallback(\n (name: string) => form.errors?.[name]?.[0],\n [form.errors]\n );\n\n const isRequired = useCallback(\n (name: string) => schema.required.includes(name),\n [schema.required]\n );\n\n const isTouched = useCallback(\n (name: string) => touched.includes(name),\n [touched]\n );\n\n // 7. Versioned Submit Handler\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n\n // Increment version for submit as well\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n setLocalVersion(newVersion);\n\n // Only send once (prevents duplicate sends if called twice)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"submit\",\n prop: propName,\n attrs: localValues,\n _v: newVersion,\n });\n }\n },\n [localValues, propName]\n );\n\n const reset = useCallback(() => {\n setLocalValues(form.values ?? {});\n setTouched([]);\n // Reset local version to match server\n localVersionRef.current = form.version ?? 0;\n setLocalVersion(form.version ?? 0);\n }, [form.values, form.version]);\n\n // 8. Derived States - The \"Validation Lock\"\n // isSyncing: True when client has sent changes that server hasn't acknowledged\n const isSyncing = localVersion > serverVersion;\n\n // isValid: True only when:\n // 1. Form is in sync (server has seen all changes)\n // 2. Server says the form is valid\n // This ensures users cannot submit until server validates the latest data\n const isValid = !isSyncing && (form.isValid ?? false);\n\n return {\n values: localValues,\n errors: form.errors ?? {},\n types: schema.types,\n required: schema.required,\n touched,\n getFieldProps,\n getError,\n isRequired,\n isTouched,\n setField,\n handleSubmit,\n reset,\n isSyncing,\n isValid,\n localVersion,\n serverVersion,\n };\n}\n"],"names":["NullContextProvider","IslandsManager"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/types.ts","../src/context.ts","../src/PortalIslandsRenderer.tsx","../src/IndividualIslandRenderer.tsx","../src/islandsManager.ts","../src/createHooks.ts","../src/useStream.ts","../src/useForm.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import { createContext } from \"react\";\nimport type { IslandStoreAccess } from \"./types\";\n\nexport interface IslandContext {\n id: string;\n storeAccess: IslandStoreAccess;\n}\n\nexport const IslandContextProvider = createContext<IslandContext | null>(null);\n","import React, { useRef, memo, useSyncExternalStore, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type {\n IslandData,\n SharedIslandsRendererProps,\n IslandStoreAccess,\n} from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nconst PortalIsland = memo(\n ({\n data,\n storeAccess,\n }: {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n }) => {\n const {\n Component,\n ContextProvider,\n id,\n pushEvent,\n ssrStrategy,\n el,\n globalKeys,\n } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n const contextValue = useMemo(\n () => ({ id, storeAccess }),\n [id, storeAccess]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => null\n );\n\n const allGlobals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n () => null\n );\n\n const didClearRef = useRef(false);\n if (ssrStrategy === \"overwrite\" && !didClearRef.current) {\n el.innerHTML = \"\";\n didClearRef.current = true;\n }\n\n if (!allGlobals) {\n console.log(\"[PortalIsland] Waiting for globals\", id);\n return null;\n }\n\n console.log(\"[PortalIsland] Rendering\", { id, allGlobals });\n\n const relevantGlobals: Record<string, any> = {};\n if (allGlobals) {\n globalKeys.forEach((key) => {\n if (key in allGlobals) {\n relevantGlobals[key] = allGlobals[key];\n }\n });\n }\n\n const mergedProps = { ...relevantGlobals, ...currentProps };\n\n const islandNode = (\n <MemoizedComponent {...mergedProps} id={id} pushEvent={pushEvent} />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n const content = MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n\n return createPortal(content, el);\n }\n);\nPortalIsland.displayName = \"[ReactLiveIslands]PortalIsland\";\n\nexport const PortalIslandsRenderer: React.FC<SharedIslandsRendererProps> = ({\n storeAccess,\n}) => {\n const sharedIslandsObj = useSyncExternalStore(\n storeAccess.subscribeToSharedIslands,\n storeAccess.getSharedIslands\n );\n\n const islands = Object.values(sharedIslandsObj);\n\n console.log(\n \"[PortalIslandsRenderer] Rendering islands:\",\n islands.map((d) => d.id)\n );\n\n return (\n <>\n {islands.map((data) => (\n <PortalIsland key={data.id} data={data} storeAccess={storeAccess} />\n ))}\n </>\n );\n};\nPortalIslandsRenderer.displayName = \"[ReactLiveIslands]PortalIslandsRenderer\";\n","import React, { useSyncExternalStore, memo, useMemo } from \"react\";\nimport type { IndividualIslandsRendererProps } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport const IndividualIslandRenderer: React.FC<\n IndividualIslandsRendererProps\n> = ({ data, storeAccess }) => {\n const { Component, ContextProvider, id, pushEvent, globalKeys } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => data.hydrationData?.props\n );\n\n // Check once if hydration globals version matches store version\n const serverGlobalsSnapshot = useMemo(() => {\n const hydrationGlobals = data.hydrationData?.globals;\n if (!hydrationGlobals) return () => hydrationGlobals;\n let comparedVersions = false;\n let useStoreReference = false;\n return () => {\n if (!comparedVersions) {\n comparedVersions = true;\n const storeGlobals = storeAccess.getGlobals();\n const hydrationVersion = hydrationGlobals.__version ?? -1;\n const storeVersion = storeGlobals?.__version ?? -1;\n useStoreReference = storeVersion === hydrationVersion;\n }\n return useStoreReference ? storeAccess.getGlobals() : hydrationGlobals;\n };\n }, [data.hydrationData?.globals, storeAccess]);\n\n const globals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n serverGlobalsSnapshot\n );\n\n const filteredGlobals: Record<string, any> = {};\n if (globals) {\n globalKeys.forEach((key) => {\n if (key in globals) {\n filteredGlobals[key] = globals[key];\n }\n });\n }\n\n const contextValue = useMemo(() => ({ id, storeAccess }), [id, storeAccess]);\n\n const islandNode = (\n <MemoizedComponent\n {...filteredGlobals}\n {...currentProps}\n id={id}\n pushEvent={pushEvent}\n />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n return MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n};\n\nIndividualIslandRenderer.displayName =\n \"[ReactLiveIslands] IndividualIslandRenderer\";\n","import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\n\nimport {\n ContextProviderComponent,\n IslandData,\n SharedIslandsRendererComponent,\n IndividualIslandsRendererComponent,\n IslandStoreAccess,\n IndividualIslandsRendererProps,\n StreamAction,\n StreamConfig,\n} from \"./types\";\nimport { PortalIslandsRenderer } from \"./PortalIslandsRenderer\";\nimport { IndividualIslandRenderer } from \"./IndividualIslandRenderer\";\n\n// Constant root ID - one shared root per application\nexport const SHARED_ROOT_ID = \"__live_react_islands_shared_root__\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ManagerState {\n propsStore: Map<string, Record<string, any>>;\n propsListeners: Set<() => void>;\n globalsRef: React.MutableRefObject<Record<string, any> | null>;\n globalsListeners: Set<() => void>;\n sharedIslandsRef: React.MutableRefObject<Record<string, IslandData>>;\n sharedIslandsListeners: Set<() => void>;\n streamsStore: Map<string, any[]>;\n streamsListeners: Map<string, Set<() => void>>;\n streamConfigs: Map<string, StreamConfig>;\n roots: Record<string, any>;\n storeAccess: IslandStoreAccess;\n}\n\nexport interface Manager {\n initialize: (params: {\n SharedContextProvider?: ContextProviderComponent;\n SharedIslandsRenderer?: SharedIslandsRendererComponent;\n }) => ManagerState;\n mountIsland: (\n state: ManagerState,\n data: IslandData,\n IslandRenderer?: IndividualIslandsRendererComponent\n ) => ManagerState;\n unmountIsland: (state: ManagerState, id: string) => ManagerState;\n updateIslandProps: (\n state: ManagerState,\n islandId: string,\n props: Record<string, any>\n ) => ManagerState;\n updateGlobals: (\n state: ManagerState,\n globals: Record<string, any>\n ) => ManagerState;\n resetGlobals: (state: ManagerState) => ManagerState;\n initializeStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n initialItems: any[]\n ) => ManagerState;\n updateStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n action: StreamAction,\n data: any\n ) => ManagerState;\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n\nconst withSharedRootName = (\n ContextProvider: ContextProviderComponent\n): ContextProviderComponent => {\n const originalName =\n ContextProvider.displayName || ContextProvider.name || \"ContextProvider\";\n\n function NamedWrapper({ children }: { children: React.ReactNode }) {\n return React.createElement(ContextProvider, null, children);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] SharedRoot(${originalName})`;\n return NamedWrapper;\n};\n\nconst withIndividualRootName = (\n islandId: string,\n IslandRenderer: IndividualIslandsRendererComponent\n): IndividualIslandsRendererComponent => {\n const originalName = IslandRenderer.displayName;\n\n function NamedWrapper(props: IndividualIslandsRendererProps) {\n return React.createElement(IslandRenderer, props);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] HydratedRoot#${islandId}`;\n return NamedWrapper;\n};\n\nconst getOrCreateSharedRootElement = (): HTMLElement => {\n let rootElement = document.getElementById(SHARED_ROOT_ID);\n if (!rootElement) {\n rootElement = document.createElement(\"div\");\n rootElement.id = SHARED_ROOT_ID;\n rootElement.style.display = \"none\";\n document.body.appendChild(rootElement);\n }\n return rootElement;\n};\n\nconst mountSharedIsland = (\n state: ManagerState,\n data: IslandData\n): ManagerState => {\n state.sharedIslandsRef.current = {\n ...state.sharedIslandsRef.current,\n [data.id]: data,\n };\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n};\n\nconst mountIndividualIsland = (\n state: ManagerState,\n data: IslandData,\n IslandRenderer: IndividualIslandsRendererComponent\n): ManagerState => {\n const NamedIslandRenderer = withIndividualRootName(data.id, IslandRenderer);\n const root = ReactDOM.hydrateRoot(\n data.el,\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(NamedIslandRenderer, {\n data,\n storeAccess: state.storeAccess,\n })\n )\n );\n\n return {\n ...state,\n roots: { ...state.roots, [data.id]: root },\n };\n};\n\n// ============================================================================\n// Island Manager (Bridge between LiveView hook lifecycles and React rendering)\n// ============================================================================\n\nconst ManagerObj: Manager = {\n initialize: ({\n SharedContextProvider = NullContextProvider,\n SharedIslandsRenderer = PortalIslandsRenderer,\n }) => {\n const rootElement = getOrCreateSharedRootElement();\n const root = ReactDOM.createRoot(rootElement);\n\n const propsStore = new Map<string, Record<string, any>>();\n const propsListeners = new Set<() => void>();\n const globalsRef = { current: null as Record<string, any> | null };\n const globalsListeners = new Set<() => void>();\n const sharedIslandsRef = { current: {} as Record<string, IslandData> };\n const sharedIslandsListeners = new Set<() => void>();\n const streamsStore = new Map<string, any[]>();\n const streamsListeners = new Map<string, Set<() => void>>();\n const streamConfigs = new Map<string, StreamConfig>();\n\n const getStreamKey = (islandId: string, streamName: string) =>\n `${islandId}:${streamName}`;\n\n const storeAccess: IslandStoreAccess = {\n getProps: (islandId: string) => propsStore.get(islandId) || null,\n subscribeToProps: (cb: () => void) => {\n propsListeners.add(cb);\n return () => propsListeners.delete(cb);\n },\n getGlobals: () => globalsRef.current,\n subscribeToGlobals: (cb: () => void) => {\n globalsListeners.add(cb);\n return () => globalsListeners.delete(cb);\n },\n getSharedIslands: () => sharedIslandsRef.current,\n subscribeToSharedIslands: (cb: () => void) => {\n sharedIslandsListeners.add(cb);\n return () => sharedIslandsListeners.delete(cb);\n },\n getStreamItems: (islandId: string, streamName: string) => {\n const key = getStreamKey(islandId, streamName);\n return streamsStore.get(key) || [];\n },\n subscribeToStream: (\n islandId: string,\n streamName: string,\n cb: () => void,\n config?: StreamConfig\n ) => {\n const key = getStreamKey(islandId, streamName);\n if (config) {\n streamConfigs.set(key, config);\n }\n if (!streamsListeners.has(key)) {\n streamsListeners.set(key, new Set());\n }\n streamsListeners.get(key)!.add(cb);\n return () => {\n streamsListeners.get(key)?.delete(cb);\n if (streamsListeners.get(key)?.size === 0) {\n streamConfigs.delete(key);\n }\n };\n },\n };\n\n const state: ManagerState = {\n propsStore,\n globalsRef,\n propsListeners,\n globalsListeners,\n sharedIslandsRef,\n sharedIslandsListeners,\n streamsStore,\n streamsListeners,\n streamConfigs,\n roots: { [SHARED_ROOT_ID]: root },\n storeAccess,\n };\n\n const NamedSharedContextProvider = withSharedRootName(\n SharedContextProvider\n );\n\n root.render(\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(\n NamedSharedContextProvider,\n null,\n React.createElement(SharedIslandsRenderer, {\n storeAccess: state.storeAccess,\n })\n )\n )\n );\n\n return state;\n },\n mountIsland: (state, data, IslandRenderer = IndividualIslandRenderer) => {\n switch (data.ssrStrategy) {\n case \"hydrate_root\":\n return mountIndividualIsland(state, data, IslandRenderer);\n default:\n return mountSharedIsland(state, data);\n }\n },\n unmountIsland: (state, id) => {\n state.propsStore.delete(id);\n\n const streamPrefix = `${id}:`;\n for (const key of state.streamsStore.keys()) {\n if (key.startsWith(streamPrefix)) {\n state.streamsStore.delete(key);\n state.streamsListeners.delete(key);\n state.streamConfigs.delete(key);\n }\n }\n\n if (state.roots[id]) {\n state.roots[id].unmount();\n const { [id]: removedRoot, ...remainingRoots } = state.roots;\n return {\n ...state,\n roots: remainingRoots,\n };\n } else {\n const { [id]: removed, ...remaining } = state.sharedIslandsRef.current;\n state.sharedIslandsRef.current = remaining;\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n }\n },\n updateIslandProps: (state, islandId, props) => {\n const existing = state.propsStore.get(islandId) || {};\n state.propsStore.set(islandId, { ...existing, ...props });\n state.propsListeners.forEach((cb) => cb());\n return state;\n },\n updateGlobals: (state, globals) => {\n const incomingVersion = globals.__version ?? -1;\n const storeVersion = state.globalsRef.current?.__version ?? -1;\n if (incomingVersion > storeVersion) {\n state.globalsRef.current = {\n ...(state.globalsRef.current || {}),\n ...globals,\n };\n state.globalsListeners.forEach((cb) => cb());\n }\n\n return state;\n },\n resetGlobals: (state) => {\n state.globalsRef.current = null;\n return state;\n },\n initializeStream: (state, islandId, streamName, initialItems) => {\n const key = `${islandId}:${streamName}`;\n state.streamsStore.set(key, [...initialItems]);\n return state;\n },\n updateStream: (state, islandId, streamName, action, data) => {\n const key = `${islandId}:${streamName}`;\n let items = state.streamsStore.get(key) || [];\n const config = state.streamConfigs.get(key);\n\n switch (action) {\n case StreamAction.Insert:\n items = [data, ...items];\n break;\n case StreamAction.Update:\n const idx = items.findIndex((item) => item.id === data.id);\n if (idx !== -1) {\n items = [...items];\n items[idx] = { ...items[idx], ...data };\n }\n break;\n case StreamAction.Delete:\n items = items.filter((item) => item.id !== data);\n break;\n case StreamAction.Reset:\n items = [];\n break;\n }\n\n if (config?.capper) {\n items = config.capper(items);\n } else if (config?.limit !== undefined && items.length > config.limit) {\n items = items.slice(0, config.limit);\n }\n\n state.streamsStore.set(key, items);\n state.streamsListeners.get(key)?.forEach((cb) => cb());\n return state;\n },\n};\nexport default ManagerObj;\n","import IslandsManager, { Manager } from \"./islandsManager\";\nimport {\n type IslandsMap,\n type SSRStrategy,\n type PushEventFn,\n type ContextProviderComponent,\n type IslandComponent,\n type LazyIslandFactory,\n type StreamHandle,\n NullContextProvider,\n StreamAction,\n} from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface LiveViewHook {\n el: HTMLElement;\n liveSocket: {\n on: (event: string, callback: (e: Event) => void) => void;\n };\n pushEvent: (\n event: string,\n payload: any,\n callback?: (reply: any, ref: any) => void\n ) => void;\n pushEventTo: (target: string, event: string, payload: any) => void;\n handleEvent: (event: string, callback: (data: any) => void) => void;\n}\n\nexport interface CreateHooksOptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n manager?: Manager;\n}\n\n// ============================================================================\n// Event Handler Adapter\n// ============================================================================\n\nfunction createPushEventFn(hook: LiveViewHook): PushEventFn {\n return (eventName: string, payload: any) => {\n hook.pushEventTo(`#${hook.el.id}`, eventName, payload);\n };\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst resolvedComponentsCache = new Map<string, IslandComponent>();\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n // Check if it's a React component (has prototype.isReactComponent for class components)\n if ((value as any).prototype?.isReactComponent) return false;\n // Check if it's a config object getter (would have Component property)\n if ((value as any).Component) return false;\n // Assume zero-arg functions that aren't class components are lazy factories\n return value.length === 0;\n};\n\nconst resolveIslandConfig = async (\n islandsMap: IslandsMap,\n componentName: string,\n defaultContextProvider: ContextProviderComponent\n): Promise<{\n Component: IslandComponent;\n ContextProvider: ContextProviderComponent;\n} | null> => {\n const config = islandsMap[componentName];\n\n if (!config) {\n return null;\n }\n\n // Check cache first for lazy-loaded components\n const cached = resolvedComponentsCache.get(componentName);\n if (cached) {\n return { Component: cached, ContextProvider: defaultContextProvider };\n }\n\n // Handle lazy factory: () => import(\"./Component\")\n if (isLazyFactory(config)) {\n const mod = await config();\n const Component = mod.default;\n resolvedComponentsCache.set(componentName, Component);\n return { Component, ContextProvider: defaultContextProvider };\n }\n\n // Handle direct component\n if (typeof config === \"function\") {\n return { Component: config, ContextProvider: defaultContextProvider };\n }\n\n // Handle config object\n return {\n Component: config.Component,\n ContextProvider: config.ContextProvider || defaultContextProvider,\n };\n};\n\n// ============================================================================\n// Main Hook Factory (LiveView Adapter Layer)\n// ============================================================================\n\nexport function createHooks({\n islands: islandsMap = {},\n SharedContextProvider = NullContextProvider,\n manager = IslandsManager,\n}: CreateHooksOptions) {\n console.log(`[LiveReactIslands] Creating hooks`);\n let managerState = manager.initialize({ SharedContextProvider });\n\n let globalsRequested = false;\n const pendingMounts = new Set<string>();\n let navigationListenerAttached = false;\n\n const Hook: Partial<LiveViewHook> & {\n mounted: (this: LiveViewHook) => void;\n updated?: (this: LiveViewHook) => void;\n destroyed: (this: LiveViewHook) => void;\n } = {\n mounted(this: LiveViewHook) {\n console.log(\"[Hook] Mount:\", this.el.id);\n if (!this.el.id) {\n console.error(`[LiveReactIslands] Island element missing unique id`);\n return;\n }\n\n if (!navigationListenerAttached) {\n navigationListenerAttached = true;\n this.liveSocket.on(\"phx:page-loading-start\", () => {\n globalsRequested = false;\n managerState = manager.resetGlobals(managerState);\n });\n }\n\n // Pull globals once on first island mount\n if (!globalsRequested) {\n globalsRequested = true;\n this.handleEvent(\"lri-g\", (data) => {\n managerState = manager.updateGlobals(managerState, data);\n });\n this.pushEvent(\"lri-g\", {}, (reply) => {\n managerState = manager.updateGlobals(managerState, reply);\n });\n }\n\n const {\n comp: componentName,\n ssr: ssrData,\n props: propsData,\n schema: schemaData,\n globals: globalsData,\n globalsVersion: globalsVersionData,\n } = this.el.dataset;\n if (!componentName) {\n console.error(\n `[LiveReactIslands] Element '${this.el.id}' missing data-comp attribute`\n );\n return;\n }\n\n let schema: { p: string[]; g: string[]; i: number } = {\n p: [],\n g: [],\n i: 0,\n };\n if (schemaData) {\n try {\n schema = JSON.parse(schemaData);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-schema:`,\n e\n );\n }\n }\n\n let initialProps: Record<string, any> = {};\n if (propsData) {\n try {\n const propsArray = JSON.parse(propsData);\n schema.p.forEach((propName, idx) => {\n const value = propsArray[idx];\n if (value?.__s !== undefined) {\n const streamName = schema.p[value.__s];\n managerState = manager.initializeStream(\n managerState,\n this.el.id,\n streamName,\n value.i\n );\n const handle: StreamHandle = {\n name: streamName,\n initial: value.i,\n };\n initialProps[propName] = handle;\n } else {\n initialProps[propName] = value;\n }\n });\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-props:`,\n e\n );\n }\n }\n\n // Only for hydrate_root strategy\n let initialGlobals: Record<string, any> = {};\n if (globalsData) {\n try {\n const globalsArray = JSON.parse(globalsData);\n schema.g.forEach((globalName, idx) => {\n initialGlobals[globalName] = globalsArray[idx];\n });\n if (!globalsVersionData)\n throw \"Missing data-globals-version attribute\";\n initialGlobals.__version = parseInt(globalsVersionData, 10);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-globals:`,\n e\n );\n }\n }\n\n let ssrStrategy: SSRStrategy;\n switch (ssrData) {\n case \"overwrite\":\n ssrStrategy = \"overwrite\";\n break;\n case \"hydrate_root\":\n ssrStrategy = \"hydrate_root\";\n break;\n default:\n ssrStrategy = \"none\";\n }\n\n const pushEvent = createPushEventFn(this);\n const elId = this.el.id;\n const el = this.el;\n\n pendingMounts.add(elId);\n\n (async () => {\n const islandConfig = await resolveIslandConfig(\n islandsMap,\n componentName,\n NullContextProvider\n );\n\n if (!pendingMounts.has(elId)) return;\n pendingMounts.delete(elId);\n\n if (!islandConfig) {\n console.error(\n `[LiveReactIslands] React island '${componentName}' not found`\n );\n return;\n }\n\n managerState = manager.updateIslandProps(\n managerState,\n elId,\n initialProps\n );\n\n managerState = manager.mountIsland(managerState, {\n id: elId,\n el,\n Component: islandConfig.Component,\n ContextProvider: islandConfig.ContextProvider,\n ssrStrategy,\n pushEvent,\n hydrationData:\n ssrStrategy === \"hydrate_root\"\n ? { props: initialProps, globals: initialGlobals }\n : null,\n globalKeys: schema.g,\n });\n })();\n\n this.handleEvent(\n \"lri-p\",\n (payload: { i: number; [key: number]: any }) => {\n if (payload.i !== schema.i) return;\n\n const props: Record<string, any> = {};\n Object.entries(payload).forEach(([key, value]) => {\n if (key === \"i\") return;\n const idx = parseInt(key, 10);\n if (!isNaN(idx) && schema.p[idx]) {\n props[schema.p[idx]] = value;\n }\n });\n\n managerState = manager.updateIslandProps(\n managerState,\n this.el.id,\n props\n );\n }\n );\n\n this.handleEvent(\n \"lri-s\",\n (payload: { s: number; a: StreamAction; d: any; i: number }) => {\n if (payload.i !== schema.i) return;\n\n const streamName = schema.p[payload.s];\n if (!streamName) return;\n\n managerState = manager.updateStream(\n managerState,\n this.el.id,\n streamName,\n payload.a,\n payload.d\n );\n }\n );\n },\n\n updated(this: LiveViewHook) {\n console.log(\"[Hook] Updated:\", this.el.id);\n },\n\n destroyed(this: LiveViewHook) {\n console.log(\"[Hook] Destroyed:\", this.el.id);\n pendingMounts.delete(this.el.id);\n managerState = manager.unmountIsland(managerState, this.el.id);\n },\n };\n\n return { LiveReactIslands: Hook };\n}\n","import { useContext, useSyncExternalStore, useMemo } from \"react\";\nimport type { StreamHandle } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport interface UseStreamOptions<T> {\n limit?: number;\n capper?: (items: T[]) => T[];\n}\n\nexport function useStream<T extends { id: string | number }>(\n handle: StreamHandle,\n options?: UseStreamOptions<T>\n): T[] {\n const context = useContext(IslandContextProvider);\n if (!context) {\n throw new Error(\"useStream must be used within an Island component\");\n }\n\n const { id: islandId, storeAccess } = context;\n\n const subscribe = useMemo(\n () => (cb: () => void) =>\n storeAccess.subscribeToStream(islandId, handle.name, cb, {\n limit: options?.limit,\n capper: options?.capper as ((items: any[]) => any[]) | undefined,\n }),\n [storeAccess, islandId, handle.name, options?.limit, options?.capper]\n );\n\n const getSnapshot = useMemo(\n () => () => storeAccess.getStreamItems(islandId, handle.name) as T[],\n [storeAccess, islandId, handle.name]\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, () => handle.initial as T[]);\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\n\nexport interface FormProps {\n /** Internal: prop name for event routing (set by server) */\n __prop?: string;\n types?: Record<string, string>;\n required?: string[];\n values: Record<string, any>;\n errors: Record<string, string[]>;\n isValid?: boolean;\n version?: number;\n}\n\nexport type PushEventFn = (event: string, payload: Record<string, any>) => void;\n\nexport interface FieldProps {\n name: string;\n value: any;\n checked?: boolean;\n onChange: (\n e: React.ChangeEvent<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >\n ) => void;\n}\n\nexport interface UseFormReturn {\n /** Current form field values */\n values: Record<string, any>;\n /** Current form errors by field name */\n errors: Record<string, string[]>;\n /** Field types from schema */\n types: Record<string, string>;\n /** Required field names */\n required: string[];\n /** Field names that have been modified by the user */\n touched: string[];\n /** Get props to spread on an input element */\n getFieldProps: (name: string) => FieldProps;\n /** Get the first error message for a field */\n getError: (name: string) => string | undefined;\n /** Check if a field is required */\n isRequired: (name: string) => boolean;\n /** Check if a field has been modified by the user */\n isTouched: (name: string) => boolean;\n /** Set a field value programmatically */\n setField: (name: string, value: any) => void;\n /** Handle form submission */\n handleSubmit: (e?: React.FormEvent) => void;\n /** Reset form to server values */\n reset: () => void;\n /**\n * True when the server hasn't acknowledged the latest client changes.\n * Use this to show a syncing indicator (e.g., spinner, \"Validating...\").\n */\n isSyncing: boolean;\n /**\n * True only when form is valid AND fully synced with server.\n * Use this to enable/disable the submit button.\n * This is the \"Validation Lock\" - users cannot submit until server confirms validity.\n */\n isValid: boolean;\n /** Current local version counter */\n localVersion: number;\n /** Last acknowledged server version */\n serverVersion: number;\n}\n\nexport function useForm(\n form: FormProps,\n pushEvent?: PushEventFn\n): UseFormReturn {\n // 1. Version Tracking\n // Local version increments on each field change\n // Server version comes from form.version prop\n const localVersionRef = useRef(form.version ?? 0);\n const lastSentVersionRef = useRef(0); // Prevents duplicate sends in StrictMode\n const [localVersion, setLocalVersion] = useState(form.version ?? 0);\n const serverVersion = form.version ?? 0;\n\n // Prop name comes from server (embedded in form data)\n const propName = form.__prop;\n\n // Reset local version when server sends a reset (version 0 with new schema)\n useEffect(() => {\n if (form.version === 0 && form.types) {\n localVersionRef.current = 0;\n setLocalVersion(0);\n }\n }, [form.version, form.types]);\n\n // 3. Persistent Schema\n // We only update these when the server explicitly sends them (usually on init)\n const [schema, setSchema] = useState({\n types: form.types ?? {},\n required: form.required ?? [],\n });\n\n if (form.types && form.types !== schema.types) {\n setSchema((prev) => ({ ...prev, types: form.types! }));\n }\n if (form.required && form.required !== schema.required) {\n setSchema((prev) => ({ ...prev, required: form.required! }));\n }\n\n // 4. Values Management\n const [localValues, setLocalValues] = useState<Record<string, any>>(\n form.values ?? {}\n );\n\n // 5. Touched Tracking (client-side only)\n const [touched, setTouched] = useState<string[]>([]);\n\n // Sync from server: Update local values when server sends updates\n useEffect(() => {\n setLocalValues((prev) => ({ ...prev, ...form.values }));\n }, [form.values]);\n\n // 6. Versioned Change Handler\n const setField = useCallback((name: string, value: any) => {\n // Mark field as touched\n setTouched((prev) => (prev.includes(name) ? prev : [...prev, name]));\n\n // Increment version BEFORE state update to avoid StrictMode double-increment\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n\n setLocalValues((prev) => {\n const next = { ...prev, [name]: value };\n\n // Update version state (will be batched with values update)\n setLocalVersion(newVersion);\n\n // Only send event once per version (prevents duplicate sends in StrictMode)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"validate\",\n prop: propName,\n attrs: next,\n _v: newVersion,\n });\n }\n\n return next;\n });\n }, [propName]);\n\n // 6. Identity-Stable Field Props\n const getFieldProps = useCallback(\n (name: string): FieldProps => {\n const type = schema.types[name];\n const value = localValues[name];\n\n const base = { name };\n\n if (type === \"boolean\" || type === \"bool\") {\n return {\n ...base,\n checked: !!value,\n value: undefined as any,\n onChange: (e) =>\n setField(name, (e.target as HTMLInputElement).checked),\n };\n }\n\n return {\n ...base,\n value: value ?? \"\",\n onChange: (e) => setField(name, e.target.value),\n };\n },\n [localValues, schema.types, setField]\n );\n\n const getError = useCallback(\n (name: string) => form.errors?.[name]?.[0],\n [form.errors]\n );\n\n const isRequired = useCallback(\n (name: string) => schema.required.includes(name),\n [schema.required]\n );\n\n const isTouched = useCallback(\n (name: string) => touched.includes(name),\n [touched]\n );\n\n // 7. Versioned Submit Handler\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n\n // Increment version for submit as well\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n setLocalVersion(newVersion);\n\n // Only send once (prevents duplicate sends if called twice)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"submit\",\n prop: propName,\n attrs: localValues,\n _v: newVersion,\n });\n }\n },\n [localValues, propName]\n );\n\n const reset = useCallback(() => {\n setLocalValues(form.values ?? {});\n setTouched([]);\n // Reset local version to match server\n localVersionRef.current = form.version ?? 0;\n setLocalVersion(form.version ?? 0);\n }, [form.values, form.version]);\n\n // 8. Derived States - The \"Validation Lock\"\n // isSyncing: True when client has sent changes that server hasn't acknowledged\n const isSyncing = localVersion > serverVersion;\n\n // isValid: True only when:\n // 1. Form is in sync (server has seen all changes)\n // 2. Server says the form is valid\n // This ensures users cannot submit until server validates the latest data\n const isValid = !isSyncing && (form.isValid ?? false);\n\n return {\n values: localValues,\n errors: form.errors ?? {},\n types: schema.types,\n required: schema.required,\n touched,\n getFieldProps,\n getError,\n isRequired,\n isTouched,\n setField,\n handleSubmit,\n reset,\n isSyncing,\n isValid,\n localVersion,\n serverVersion,\n };\n}\n"],"names":["NullContextProvider","IslandsManager"],"mappings":";;;;AAiDA,IAAY,YAKX;AALD,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,GAAW;AACb,CAAC,EALW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;AAuCjB,MAAMA,qBAAmB,GAA4C,CAAC,EAC3E,QAAQ,GACT,KAAK,QAAQ;;AClFP,MAAM,qBAAqB,GAAG,aAAa,CAAuB,IAAI,CAAC;;ACC9E,MAAM,YAAY,GAAG,IAAI,CACvB,CAAC,EACC,IAAI,EACJ,WAAW,GAIZ,KAAI;AACH,IAAA,MAAM,EACJ,SAAS,EACT,eAAe,EACf,EAAE,EACF,SAAS,EACT,WAAW,EACX,EAAE,EACF,UAAU,GACX,GAAG,IAAI;AAER,IAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,uBAAuB,GAAG,OAAO,CACrC,OAAO,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,EACtD,CAAC,eAAe,CAAC,CAClB;IACD,MAAM,YAAY,GAAG,OAAO,CAC1B,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAC3B,CAAC,EAAE,EAAE,WAAW,CAAC,CAClB;IAED,MAAM,YAAY,GAAG,oBAAoB,CACvC,WAAW,CAAC,gBAAgB,EAC5B,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAC9B,MAAM,IAAI,CACX;AAED,IAAA,MAAM,UAAU,GAAG,oBAAoB,CACrC,WAAW,CAAC,kBAAkB,EAC9B,WAAW,CAAC,UAAU,EACtB,MAAM,IAAI,CACX;AAED,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IACjC,IAAI,WAAW,KAAK,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AACvD,QAAA,EAAE,CAAC,SAAS,GAAG,EAAE;AACjB,QAAA,WAAW,CAAC,OAAO,GAAG,IAAI;IAC5B;IAEA,IAAI,CAAC,UAAU,EAAE;AACf,QAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,EAAE,CAAC;AACrD,QAAA,OAAO,IAAI;IACb;IAEA,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;IAE3D,MAAM,eAAe,GAAwB,EAAE;IAC/C,IAAI,UAAU,EAAE;AACd,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACzB,YAAA,IAAI,GAAG,IAAI,UAAU,EAAE;gBACrB,eAAe,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC;YACxC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,WAAW,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,YAAY,EAAE;AAE3D,IAAA,MAAM,UAAU,IACd,KAAA,CAAA,aAAA,CAAC,iBAAiB,OAAK,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAA,CAAI,CACrE;AAED,IAAA,MAAM,WAAW,IACf,KAAA,CAAA,aAAA,CAAC,qBAAqB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,EAChD,UAAU,CACoB,CAClC;AAED,IAAA,MAAM,OAAO,GAAG,uBAAuB,IACrC,KAAA,CAAA,aAAA,CAAC,uBAAuB,QAAE,WAAW,CAA2B,KAEhE,WAAW,CACZ;AAED,IAAA,OAAO,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;AAClC,CAAC,CACF;AACD,YAAY,CAAC,WAAW,GAAG,gCAAgC;AAEpD,MAAM,qBAAqB,GAAyC,CAAC,EAC1E,WAAW,GACZ,KAAI;AACH,IAAA,MAAM,gBAAgB,GAAG,oBAAoB,CAC3C,WAAW,CAAC,wBAAwB,EACpC,WAAW,CAAC,gBAAgB,CAC7B;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;AAE/C,IAAA,OAAO,CAAC,GAAG,CACT,4CAA4C,EAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CACzB;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,MAChB,KAAA,CAAA,aAAA,CAAC,YAAY,EAAA,EAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAA,CAAI,CACrE,CAAC,CACD;AAEP,CAAC;AACD,qBAAqB,CAAC,WAAW,GAAG,yCAAyC;;ACjHtE,MAAM,wBAAwB,GAEjC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAI;AAC5B,IAAA,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI;AAEtE,IAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,uBAAuB,GAAG,OAAO,CACrC,OAAO,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,EACtD,CAAC,eAAe,CAAC,CAClB;IAED,MAAM,YAAY,GAAG,oBAAoB,CACvC,WAAW,CAAC,gBAAgB,EAC5B,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAC9B,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,CAChC;;AAGD,IAAA,MAAM,qBAAqB,GAAG,OAAO,CAAC,MAAK;AACzC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO;AACpD,QAAA,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,MAAM,gBAAgB;QACpD,IAAI,gBAAgB,GAAG,KAAK;QAC5B,IAAI,iBAAiB,GAAG,KAAK;AAC7B,QAAA,OAAO,MAAK;YACV,IAAI,CAAC,gBAAgB,EAAE;gBACrB,gBAAgB,GAAG,IAAI;AACvB,gBAAA,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,EAAE;gBAC7C,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,SAAS,IAAI,EAAE;gBACzD,MAAM,YAAY,GAAG,YAAY,EAAE,SAAS,IAAI,EAAE;AAClD,gBAAA,iBAAiB,GAAG,YAAY,KAAK,gBAAgB;YACvD;AACA,YAAA,OAAO,iBAAiB,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,gBAAgB;AACxE,QAAA,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAE9C,IAAA,MAAM,OAAO,GAAG,oBAAoB,CAClC,WAAW,CAAC,kBAAkB,EAC9B,WAAW,CAAC,UAAU,EACtB,qBAAqB,CACtB;IAED,MAAM,eAAe,GAAwB,EAAE;IAC/C,IAAI,OAAO,EAAE;AACX,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACzB,YAAA,IAAI,GAAG,IAAI,OAAO,EAAE;gBAClB,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;YACrC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;AAE5E,IAAA,MAAM,UAAU,IACd,oBAAC,iBAAiB,EAAA,EAAA,GACZ,eAAe,EAAA,GACf,YAAY,EAChB,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,SAAS,EAAA,CACpB,CACH;AAED,IAAA,MAAM,WAAW,IACf,KAAA,CAAA,aAAA,CAAC,qBAAqB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,EAChD,UAAU,CACoB,CAClC;AAED,IAAA,OAAO,uBAAuB,IAC5B,oBAAC,uBAAuB,EAAA,IAAA,EAAE,WAAW,CAA2B,KAEhE,WAAW,CACZ;AACH,CAAC;AAED,wBAAwB,CAAC,WAAW;AAClC,IAAA,6CAA6C;;AC/D/C;AACO,MAAM,cAAc,GAAG,oCAAoC;AAwDlE;AACA;AACA;AAEA,MAAM,mBAAmB,GAA4C,CAAC,EACpE,QAAQ,GACT,KAAK,QAAQ;AAEd,MAAM,kBAAkB,GAAG,CACzB,eAAyC,KACb;IAC5B,MAAM,YAAY,GAChB,eAAe,CAAC,WAAW,IAAI,eAAe,CAAC,IAAI,IAAI,iBAAiB;AAE1E,IAAA,SAAS,YAAY,CAAC,EAAE,QAAQ,EAAiC,EAAA;QAC/D,OAAO,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,CAAC;IAC7D;AAEA,IAAA,YAAY,CAAC,WAAW,GAAG,CAAA,8BAAA,EAAiC,YAAY,GAAG;AAC3E,IAAA,OAAO,YAAY;AACrB,CAAC;AAED,MAAM,sBAAsB,GAAG,CAC7B,QAAgB,EAChB,cAAkD,KACZ;AACtC,IAAqB,cAAc,CAAC;IAEpC,SAAS,YAAY,CAAC,KAAqC,EAAA;QACzD,OAAO,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,KAAK,CAAC;IACnD;AAEA,IAAA,YAAY,CAAC,WAAW,GAAG,CAAA,gCAAA,EAAmC,QAAQ,EAAE;AACxE,IAAA,OAAO,YAAY;AACrB,CAAC;AAED,MAAM,4BAA4B,GAAG,MAAkB;IACrD,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;IACzD,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,QAAA,WAAW,CAAC,EAAE,GAAG,cAAc;AAC/B,QAAA,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAClC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;IACxC;AACA,IAAA,OAAO,WAAW;AACpB,CAAC;AAED,MAAM,iBAAiB,GAAG,CACxB,KAAmB,EACnB,IAAgB,KACA;AAChB,IAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG;AAC/B,QAAA,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO;AACjC,QAAA,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI;KAChB;AACD,IAAA,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAClD,IAAA,OAAO,KAAK;AACd,CAAC;AAED,MAAM,qBAAqB,GAAG,CAC5B,KAAmB,EACnB,IAAgB,EAChB,cAAkD,KAClC;IAChB,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC;IAC3E,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAC/B,IAAI,CAAC,EAAE,EACP,KAAK,CAAC,aAAa,CACjB,KAAK,CAAC,UAAU,EAChB,IAAI,EACJ,KAAK,CAAC,aAAa,CAAC,mBAAmB,EAAE;QACvC,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC,CACH,CACF;IAED,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE;KAC3C;AACH,CAAC;AAED;AACA;AACA;AAEA,MAAM,UAAU,GAAY;AAC1B,IAAA,UAAU,EAAE,CAAC,EACX,qBAAqB,GAAG,mBAAmB,EAC3C,qBAAqB,GAAG,qBAAqB,GAC9C,KAAI;AACH,QAAA,MAAM,WAAW,GAAG,4BAA4B,EAAE;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;AAE7C,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B;AACzD,QAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAc;AAC5C,QAAA,MAAM,UAAU,GAAG,EAAE,OAAO,EAAE,IAAkC,EAAE;AAClE,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAc;AAC9C,QAAA,MAAM,gBAAgB,GAAG,EAAE,OAAO,EAAE,EAAgC,EAAE;AACtE,QAAA,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAc;AACpD,QAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiB;AAC7C,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA2B;AAC3D,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB;AAErD,QAAA,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,UAAkB,KACxD,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AAE7B,QAAA,MAAM,WAAW,GAAsB;AACrC,YAAA,QAAQ,EAAE,CAAC,QAAgB,KAAK,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI;AAChE,YAAA,gBAAgB,EAAE,CAAC,EAAc,KAAI;AACnC,gBAAA,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,MAAM,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,CAAC;AACD,YAAA,UAAU,EAAE,MAAM,UAAU,CAAC,OAAO;AACpC,YAAA,kBAAkB,EAAE,CAAC,EAAc,KAAI;AACrC,gBAAA,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,MAAM,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,CAAC;AACD,YAAA,gBAAgB,EAAE,MAAM,gBAAgB,CAAC,OAAO;AAChD,YAAA,wBAAwB,EAAE,CAAC,EAAc,KAAI;AAC3C,gBAAA,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,MAAM,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,CAAC;AACD,YAAA,cAAc,EAAE,CAAC,QAAgB,EAAE,UAAkB,KAAI;gBACvD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAC9C,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;YACpC,CAAC;YACD,iBAAiB,EAAE,CACjB,QAAgB,EAChB,UAAkB,EAClB,EAAc,EACd,MAAqB,KACnB;gBACF,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAC9C,IAAI,MAAM,EAAE;AACV,oBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;gBAChC;gBACA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBAC9B,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC;gBACtC;gBACA,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,gBAAA,OAAO,MAAK;oBACV,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;oBACrC,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE;AACzC,wBAAA,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;oBAC3B;AACF,gBAAA,CAAC;YACH,CAAC;SACF;AAED,QAAA,MAAM,KAAK,GAAiB;YAC1B,UAAU;YACV,UAAU;YACV,cAAc;YACd,gBAAgB;YAChB,gBAAgB;YAChB,sBAAsB;YACtB,YAAY;YACZ,gBAAgB;YAChB,aAAa;AACb,YAAA,KAAK,EAAE,EAAE,CAAC,cAAc,GAAG,IAAI,EAAE;YACjC,WAAW;SACZ;AAED,QAAA,MAAM,0BAA0B,GAAG,kBAAkB,CACnD,qBAAqB,CACtB;QAED,IAAI,CAAC,MAAM,CACT,KAAK,CAAC,aAAa,CACjB,KAAK,CAAC,UAAU,EAChB,IAAI,EACJ,KAAK,CAAC,aAAa,CACjB,0BAA0B,EAC1B,IAAI,EACJ,KAAK,CAAC,aAAa,CAAC,qBAAqB,EAAE;YACzC,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CACH,CACF,CACF;AAED,QAAA,OAAO,KAAK;IACd,CAAC;IACD,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,wBAAwB,KAAI;AACtE,QAAA,QAAQ,IAAI,CAAC,WAAW;AACtB,YAAA,KAAK,cAAc;gBACjB,OAAO,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC;AAC3D,YAAA;AACE,gBAAA,OAAO,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC;;IAE3C,CAAC;AACD,IAAA,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,KAAI;AAC3B,QAAA,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;AAE3B,QAAA,MAAM,YAAY,GAAG,CAAA,EAAG,EAAE,GAAG;QAC7B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE;AAC3C,YAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;AAChC,gBAAA,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC;AAC9B,gBAAA,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC;AAClC,gBAAA,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;YACjC;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YACnB,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;AACzB,YAAA,MAAM,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,cAAc,EAAE,GAAG,KAAK,CAAC,KAAK;YAC5D,OAAO;AACL,gBAAA,GAAG,KAAK;AACR,gBAAA,KAAK,EAAE,cAAc;aACtB;QACH;aAAO;AACL,YAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO;AACtE,YAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG,SAAS;AAC1C,YAAA,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAClD,YAAA,OAAO,KAAK;QACd;IACF,CAAC;IACD,iBAAiB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAI;AAC5C,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;AACrD,QAAA,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;AACzD,QAAA,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAC1C,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAI;QAChC,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE;AAC/C,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE;AAC9D,QAAA,IAAI,eAAe,GAAG,YAAY,EAAE;AAClC,YAAA,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG;gBACzB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;AACnC,gBAAA,GAAG,OAAO;aACX;AACD,YAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C;AAEA,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,YAAY,EAAE,CAAC,KAAK,KAAI;AACtB,QAAA,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI;AAC/B,QAAA,OAAO,KAAK;IACd,CAAC;IACD,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,KAAI;AAC9D,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AACvC,QAAA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC;AAC9C,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,YAAY,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,KAAI;AAC1D,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AACvC,QAAA,IAAI,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;QAE3C,QAAQ,MAAM;YACZ,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;gBACxB;YACF,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAC1D,gBAAA,IAAI,GAAG,KAAK,EAAE,EAAE;AACd,oBAAA,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;AAClB,oBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE;gBACzC;gBACA;YACF,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;gBAChD;YACF,KAAK,YAAY,CAAC,KAAK;gBACrB,KAAK,GAAG,EAAE;gBACV;;AAGJ,QAAA,IAAI,MAAM,EAAE,MAAM,EAAE;AAClB,YAAA,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9B;AAAO,aAAA,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE;YACrE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;QACtC;QAEA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AAClC,QAAA,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AACtD,QAAA,OAAO,KAAK;IACd,CAAC;CACF;;AC7TD;AACA;AACA;AAEA,SAAS,iBAAiB,CAAC,IAAkB,EAAA;AAC3C,IAAA,OAAO,CAAC,SAAiB,EAAE,OAAY,KAAI;AACzC,QAAA,IAAI,CAAC,WAAW,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC;AACxD,IAAA,CAAC;AACH;AAEA;AACA;AACA;AAEA,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAA2B;AAElE,MAAM,aAAa,GAAG,CAAC,KAAc,KAAgC;IACnE,IAAI,OAAO,KAAK,KAAK,UAAU;AAAE,QAAA,OAAO,KAAK;;AAE7C,IAAA,IAAK,KAAa,CAAC,SAAS,EAAE,gBAAgB;AAAE,QAAA,OAAO,KAAK;;IAE5D,IAAK,KAAa,CAAC,SAAS;AAAE,QAAA,OAAO,KAAK;;AAE1C,IAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,mBAAmB,GAAG,OAC1B,UAAsB,EACtB,aAAqB,EACrB,sBAAgD,KAItC;AACV,IAAA,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC;IAExC,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,IAAI;IACb;;IAGA,MAAM,MAAM,GAAG,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAAC;IACzD,IAAI,MAAM,EAAE;QACV,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,sBAAsB,EAAE;IACvE;;AAGA,IAAA,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE;AACzB,QAAA,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE;AAC1B,QAAA,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO;AAC7B,QAAA,uBAAuB,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC;AACrD,QAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,sBAAsB,EAAE;IAC/D;;AAGA,IAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;QAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,sBAAsB,EAAE;IACvE;;IAGA,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,SAAS;AAC3B,QAAA,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,sBAAsB;KAClE;AACH,CAAC;AAED;AACA;AACA;SAEgB,WAAW,CAAC,EAC1B,OAAO,EAAE,UAAU,GAAG,EAAE,EACxB,qBAAqB,GAAGA,qBAAmB,EAC3C,OAAO,GAAGC,UAAc,GACL,EAAA;AACnB,IAAA,OAAO,CAAC,GAAG,CAAC,CAAA,iCAAA,CAAmC,CAAC;IAChD,IAAI,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAEhE,IAAI,gBAAgB,GAAG,KAAK;AAC5B,IAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU;IACvC,IAAI,0BAA0B,GAAG,KAAK;AAEtC,IAAA,MAAM,IAAI,GAIN;QACF,OAAO,GAAA;YACL,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACxC,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,mDAAA,CAAqD,CAAC;gBACpE;YACF;YAEA,IAAI,CAAC,0BAA0B,EAAE;gBAC/B,0BAA0B,GAAG,IAAI;gBACjC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,wBAAwB,EAAE,MAAK;oBAChD,gBAAgB,GAAG,KAAK;AACxB,oBAAA,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC;AACnD,gBAAA,CAAC,CAAC;YACJ;;YAGA,IAAI,CAAC,gBAAgB,EAAE;gBACrB,gBAAgB,GAAG,IAAI;gBACvB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,IAAI,KAAI;oBACjC,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC;AAC1D,gBAAA,CAAC,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,KAAK,KAAI;oBACpC,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC;AAC3D,gBAAA,CAAC,CAAC;YACJ;AAEA,YAAA,MAAM,EACJ,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,WAAW,EACpB,cAAc,EAAE,kBAAkB,GACnC,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO;YACnB,IAAI,CAAC,aAAa,EAAE;gBAClB,OAAO,CAAC,KAAK,CACX,CAAA,4BAAA,EAA+B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,6BAAA,CAA+B,CACzE;gBACD;YACF;AAEA,YAAA,IAAI,MAAM,GAA4C;AACpD,gBAAA,CAAC,EAAE,EAAE;AACL,gBAAA,CAAC,EAAE,EAAE;AACL,gBAAA,CAAC,EAAE,CAAC;aACL;YACD,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI;AACF,oBAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBACjC;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,+BAAA,CAAiC,EACtD,CAAC,CACF;gBACH;YACF;YAEA,IAAI,YAAY,GAAwB,EAAE;YAC1C,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI;oBACF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;oBACxC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAI;AACjC,wBAAA,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC;AAC7B,wBAAA,IAAI,KAAK,EAAE,GAAG,KAAK,SAAS,EAAE;4BAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACtC,4BAAA,YAAY,GAAG,OAAO,CAAC,gBAAgB,CACrC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,UAAU,EACV,KAAK,CAAC,CAAC,CACR;AACD,4BAAA,MAAM,MAAM,GAAiB;AAC3B,gCAAA,IAAI,EAAE,UAAU;gCAChB,OAAO,EAAE,KAAK,CAAC,CAAC;6BACjB;AACD,4BAAA,YAAY,CAAC,QAAQ,CAAC,GAAG,MAAM;wBACjC;6BAAO;AACL,4BAAA,YAAY,CAAC,QAAQ,CAAC,GAAG,KAAK;wBAChC;AACF,oBAAA,CAAC,CAAC;gBACJ;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,8BAAA,CAAgC,EACrD,CAAC,CACF;gBACH;YACF;;YAGA,IAAI,cAAc,GAAwB,EAAE;YAC5C,IAAI,WAAW,EAAE;AACf,gBAAA,IAAI;oBACF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;oBAC5C,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,GAAG,KAAI;wBACnC,cAAc,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC;AAChD,oBAAA,CAAC,CAAC;AACF,oBAAA,IAAI,CAAC,kBAAkB;AACrB,wBAAA,MAAM,wCAAwC;oBAChD,cAAc,CAAC,SAAS,GAAG,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC;gBAC7D;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,gCAAA,CAAkC,EACvD,CAAC,CACF;gBACH;YACF;AAEA,YAAA,IAAI,WAAwB;YAC5B,QAAQ,OAAO;AACb,gBAAA,KAAK,WAAW;oBACd,WAAW,GAAG,WAAW;oBACzB;AACF,gBAAA,KAAK,cAAc;oBACjB,WAAW,GAAG,cAAc;oBAC5B;AACF,gBAAA;oBACE,WAAW,GAAG,MAAM;;AAGxB,YAAA,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC;AACzC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;AACvB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE;AAElB,YAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAEvB,CAAC,YAAW;gBACV,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC5C,UAAU,EACV,aAAa,EACbD,qBAAmB,CACpB;AAED,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE;AAC9B,gBAAA,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;gBAE1B,IAAI,CAAC,YAAY,EAAE;AACjB,oBAAA,OAAO,CAAC,KAAK,CACX,oCAAoC,aAAa,CAAA,WAAA,CAAa,CAC/D;oBACD;gBACF;gBAEA,YAAY,GAAG,OAAO,CAAC,iBAAiB,CACtC,YAAY,EACZ,IAAI,EACJ,YAAY,CACb;AAED,gBAAA,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE;AAC/C,oBAAA,EAAE,EAAE,IAAI;oBACR,EAAE;oBACF,SAAS,EAAE,YAAY,CAAC,SAAS;oBACjC,eAAe,EAAE,YAAY,CAAC,eAAe;oBAC7C,WAAW;oBACX,SAAS;oBACT,aAAa,EACX,WAAW,KAAK;0BACZ,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc;AAChD,0BAAE,IAAI;oBACV,UAAU,EAAE,MAAM,CAAC,CAAC;AACrB,iBAAA,CAAC;YACJ,CAAC,GAAG;YAEJ,IAAI,CAAC,WAAW,CACd,OAAO,EACP,CAAC,OAA0C,KAAI;AAC7C,gBAAA,IAAI,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;oBAAE;gBAE5B,MAAM,KAAK,GAAwB,EAAE;AACrC,gBAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;oBAC/C,IAAI,GAAG,KAAK,GAAG;wBAAE;oBACjB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC;AAC7B,oBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;wBAChC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;oBAC9B;AACF,gBAAA,CAAC,CAAC;AAEF,gBAAA,YAAY,GAAG,OAAO,CAAC,iBAAiB,CACtC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,KAAK,CACN;AACH,YAAA,CAAC,CACF;YAED,IAAI,CAAC,WAAW,CACd,OAAO,EACP,CAAC,OAA0D,KAAI;AAC7D,gBAAA,IAAI,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;oBAAE;gBAE5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,gBAAA,IAAI,CAAC,UAAU;oBAAE;gBAEjB,YAAY,GAAG,OAAO,CAAC,YAAY,CACjC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,UAAU,EACV,OAAO,CAAC,CAAC,EACT,OAAO,CAAC,CAAC,CACV;AACH,YAAA,CAAC,CACF;QACH,CAAC;QAED,OAAO,GAAA;YACL,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5C,CAAC;QAED,SAAS,GAAA;YACP,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5C,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAChC,YAAA,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;KACF;AAED,IAAA,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE;AACnC;;AC3UM,SAAU,SAAS,CACvB,MAAoB,EACpB,OAA6B,EAAA;AAE7B,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,qBAAqB,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;IACtE;IAEA,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO;IAE7C,MAAM,SAAS,GAAG,OAAO,CACvB,MAAM,CAAC,EAAc,KACnB,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE;QACvD,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,MAAM,EAAE,OAAO,EAAE,MAA+C;AACjE,KAAA,CAAC,EACJ,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CACtE;AAED,IAAA,MAAM,WAAW,GAAG,OAAO,CACzB,MAAM,MAAM,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAQ,EACpE,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CACrC;AAED,IAAA,OAAO,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC,OAAc,CAAC;AAClF;;ACiCM,SAAU,OAAO,CACrB,IAAe,EACf,SAAuB,EAAA;;;;IAKvB,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACjD,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACrC,IAAA,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;AACnE,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC;;AAGvC,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM;;IAG5B,SAAS,CAAC,MAAK;QACb,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;AACpC,YAAA,eAAe,CAAC,OAAO,GAAG,CAAC;YAC3B,eAAe,CAAC,CAAC,CAAC;QACpB;IACF,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;;;AAI9B,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC;AACnC,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;AACvB,QAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;AAC9B,KAAA,CAAC;AAEF,IAAA,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE;AAC7C,QAAA,SAAS,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,EAAE,CAAC,CAAC;IACxD;AACA,IAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE;AACtD,QAAA,SAAS,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAS,EAAE,CAAC,CAAC;IAC9D;;AAGA,IAAA,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAC5C,IAAI,CAAC,MAAM,IAAI,EAAE,CAClB;;IAGD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC;;IAGpD,SAAS,CAAC,MAAK;AACb,QAAA,cAAc,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACzD,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;IAGjB,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,IAAY,EAAE,KAAU,KAAI;;AAExD,QAAA,UAAU,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;;AAGpE,QAAA,eAAe,CAAC,OAAO,IAAI,CAAC;AAC5B,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO;AAE1C,QAAA,cAAc,CAAC,CAAC,IAAI,KAAI;AACtB,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,GAAG,KAAK,EAAE;;YAGvC,eAAe,CAAC,UAAU,CAAC;;AAG3B,YAAA,IAAI,kBAAkB,CAAC,OAAO,GAAG,UAAU,EAAE;AAC3C,gBAAA,kBAAkB,CAAC,OAAO,GAAG,UAAU;gBAEvC,SAAS,GAAG,UAAU,EAAE;AACtB,oBAAA,KAAK,EAAE,UAAU;AACjB,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,EAAE,EAAE,UAAU;AACf,iBAAA,CAAC;YACJ;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;;AAGd,IAAA,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,IAAY,KAAgB;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAC/B,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC;AAE/B,QAAA,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE;QAErB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,EAAE;YACzC,OAAO;AACL,gBAAA,GAAG,IAAI;gBACP,OAAO,EAAE,CAAC,CAAC,KAAK;AAChB,gBAAA,KAAK,EAAE,SAAgB;AACvB,gBAAA,QAAQ,EAAE,CAAC,CAAC,KACV,QAAQ,CAAC,IAAI,EAAG,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC;aACzD;QACH;QAEA,OAAO;AACL,YAAA,GAAG,IAAI;YACP,KAAK,EAAE,KAAK,IAAI,EAAE;AAClB,YAAA,QAAQ,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChD;IACH,CAAC,EACD,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CACtC;IAED,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,IAAY,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAC1C,CAAC,IAAI,CAAC,MAAM,CAAC,CACd;IAED,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,IAAY,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAChD,CAAC,MAAM,CAAC,QAAQ,CAAC,CAClB;IAED,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,IAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EACxC,CAAC,OAAO,CAAC,CACV;;AAGD,IAAA,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,CAAmB,KAAI;QACtB,CAAC,EAAE,cAAc,EAAE;;AAGnB,QAAA,eAAe,CAAC,OAAO,IAAI,CAAC;AAC5B,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO;QAC1C,eAAe,CAAC,UAAU,CAAC;;AAG3B,QAAA,IAAI,kBAAkB,CAAC,OAAO,GAAG,UAAU,EAAE;AAC3C,YAAA,kBAAkB,CAAC,OAAO,GAAG,UAAU;YAEvC,SAAS,GAAG,UAAU,EAAE;AACtB,gBAAA,KAAK,EAAE,QAAQ;AACf,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,EAAE,EAAE,UAAU;AACf,aAAA,CAAC;QACJ;AACF,IAAA,CAAC,EACD,CAAC,WAAW,EAAE,QAAQ,CAAC,CACxB;AAED,IAAA,MAAM,KAAK,GAAG,WAAW,CAAC,MAAK;AAC7B,QAAA,cAAc,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACjC,UAAU,CAAC,EAAE,CAAC;;QAEd,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC;AAC3C,QAAA,eAAe,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;;;AAI/B,IAAA,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa;;;;;AAM9C,IAAA,MAAM,OAAO,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IAErD,OAAO;AACL,QAAA,MAAM,EAAE,WAAW;AACnB,QAAA,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO;QACP,aAAa;QACb,QAAQ;QACR,UAAU;QACV,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,KAAK;QACL,SAAS;QACT,OAAO;QACP,YAAY;QACZ,aAAa;KACd;AACH;;;;"}
package/dist/index.js CHANGED
@@ -471,7 +471,7 @@ function createHooks({ islands: islandsMap = {}, SharedContextProvider = NullCon
471
471
  const el = this.el;
472
472
  pendingMounts.add(elId);
473
473
  (async () => {
474
- const islandConfig = await resolveIslandConfig(islandsMap, componentName, SharedContextProvider);
474
+ const islandConfig = await resolveIslandConfig(islandsMap, componentName, NullContextProvider$1);
475
475
  if (!pendingMounts.has(elId))
476
476
  return;
477
477
  pendingMounts.delete(elId);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/types.ts","../src/context.ts","../src/PortalIslandsRenderer.tsx","../src/IndividualIslandRenderer.tsx","../src/islandsManager.ts","../src/createHooks.ts","../src/useStream.ts","../src/useForm.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import { createContext } from \"react\";\nimport type { IslandStoreAccess } from \"./types\";\n\nexport interface IslandContext {\n id: string;\n storeAccess: IslandStoreAccess;\n}\n\nexport const IslandContextProvider = createContext<IslandContext | null>(null);\n","import React, { useRef, memo, useSyncExternalStore, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type {\n IslandData,\n SharedIslandsRendererProps,\n IslandStoreAccess,\n} from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nconst PortalIsland = memo(\n ({\n data,\n storeAccess,\n }: {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n }) => {\n const {\n Component,\n ContextProvider,\n id,\n pushEvent,\n ssrStrategy,\n el,\n globalKeys,\n } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n const contextValue = useMemo(\n () => ({ id, storeAccess }),\n [id, storeAccess]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => null\n );\n\n const allGlobals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n () => null\n );\n\n const didClearRef = useRef(false);\n if (ssrStrategy === \"overwrite\" && !didClearRef.current) {\n el.innerHTML = \"\";\n didClearRef.current = true;\n }\n\n if (!allGlobals) {\n console.log(\"[PortalIsland] Waiting for globals\", id);\n return null;\n }\n\n console.log(\"[PortalIsland] Rendering\", { id, allGlobals });\n\n const relevantGlobals: Record<string, any> = {};\n if (allGlobals) {\n globalKeys.forEach((key) => {\n if (key in allGlobals) {\n relevantGlobals[key] = allGlobals[key];\n }\n });\n }\n\n const mergedProps = { ...relevantGlobals, ...currentProps };\n\n const islandNode = (\n <MemoizedComponent {...mergedProps} id={id} pushEvent={pushEvent} />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n const content = MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n\n return createPortal(content, el);\n }\n);\nPortalIsland.displayName = \"[ReactLiveIslands]PortalIsland\";\n\nexport const PortalIslandsRenderer: React.FC<SharedIslandsRendererProps> = ({\n storeAccess,\n}) => {\n const sharedIslandsObj = useSyncExternalStore(\n storeAccess.subscribeToSharedIslands,\n storeAccess.getSharedIslands\n );\n\n const islands = Object.values(sharedIslandsObj);\n\n console.log(\n \"[PortalIslandsRenderer] Rendering islands:\",\n islands.map((d) => d.id)\n );\n\n return (\n <>\n {islands.map((data) => (\n <PortalIsland key={data.id} data={data} storeAccess={storeAccess} />\n ))}\n </>\n );\n};\nPortalIslandsRenderer.displayName = \"[ReactLiveIslands]PortalIslandsRenderer\";\n","import React, { useSyncExternalStore, memo, useMemo } from \"react\";\nimport type { IndividualIslandsRendererProps } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport const IndividualIslandRenderer: React.FC<\n IndividualIslandsRendererProps\n> = ({ data, storeAccess }) => {\n const { Component, ContextProvider, id, pushEvent, globalKeys } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => data.hydrationData?.props\n );\n\n // Check once if hydration globals version matches store version\n const serverGlobalsSnapshot = useMemo(() => {\n const hydrationGlobals = data.hydrationData?.globals;\n if (!hydrationGlobals) return () => hydrationGlobals;\n let comparedVersions = false;\n let useStoreReference = false;\n return () => {\n if (!comparedVersions) {\n comparedVersions = true;\n const storeGlobals = storeAccess.getGlobals();\n const hydrationVersion = hydrationGlobals.__version ?? -1;\n const storeVersion = storeGlobals?.__version ?? -1;\n useStoreReference = storeVersion === hydrationVersion;\n }\n return useStoreReference ? storeAccess.getGlobals() : hydrationGlobals;\n };\n }, [data.hydrationData?.globals, storeAccess]);\n\n const globals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n serverGlobalsSnapshot\n );\n\n const filteredGlobals: Record<string, any> = {};\n if (globals) {\n globalKeys.forEach((key) => {\n if (key in globals) {\n filteredGlobals[key] = globals[key];\n }\n });\n }\n\n const contextValue = useMemo(() => ({ id, storeAccess }), [id, storeAccess]);\n\n const islandNode = (\n <MemoizedComponent\n {...filteredGlobals}\n {...currentProps}\n id={id}\n pushEvent={pushEvent}\n />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n return MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n};\n\nIndividualIslandRenderer.displayName =\n \"[ReactLiveIslands] IndividualIslandRenderer\";\n","import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\n\nimport {\n ContextProviderComponent,\n IslandData,\n SharedIslandsRendererComponent,\n IndividualIslandsRendererComponent,\n IslandStoreAccess,\n IndividualIslandsRendererProps,\n StreamAction,\n StreamConfig,\n} from \"./types\";\nimport { PortalIslandsRenderer } from \"./PortalIslandsRenderer\";\nimport { IndividualIslandRenderer } from \"./IndividualIslandRenderer\";\n\n// Constant root ID - one shared root per application\nexport const SHARED_ROOT_ID = \"__live_react_islands_shared_root__\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ManagerState {\n propsStore: Map<string, Record<string, any>>;\n propsListeners: Set<() => void>;\n globalsRef: React.MutableRefObject<Record<string, any> | null>;\n globalsListeners: Set<() => void>;\n sharedIslandsRef: React.MutableRefObject<Record<string, IslandData>>;\n sharedIslandsListeners: Set<() => void>;\n streamsStore: Map<string, any[]>;\n streamsListeners: Map<string, Set<() => void>>;\n streamConfigs: Map<string, StreamConfig>;\n roots: Record<string, any>;\n storeAccess: IslandStoreAccess;\n}\n\nexport interface Manager {\n initialize: (params: {\n SharedContextProvider?: ContextProviderComponent;\n SharedIslandsRenderer?: SharedIslandsRendererComponent;\n }) => ManagerState;\n mountIsland: (\n state: ManagerState,\n data: IslandData,\n IslandRenderer?: IndividualIslandsRendererComponent\n ) => ManagerState;\n unmountIsland: (state: ManagerState, id: string) => ManagerState;\n updateIslandProps: (\n state: ManagerState,\n islandId: string,\n props: Record<string, any>\n ) => ManagerState;\n updateGlobals: (\n state: ManagerState,\n globals: Record<string, any>\n ) => ManagerState;\n resetGlobals: (state: ManagerState) => ManagerState;\n initializeStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n initialItems: any[]\n ) => ManagerState;\n updateStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n action: StreamAction,\n data: any\n ) => ManagerState;\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n\nconst withSharedRootName = (\n ContextProvider: ContextProviderComponent\n): ContextProviderComponent => {\n const originalName =\n ContextProvider.displayName || ContextProvider.name || \"ContextProvider\";\n\n function NamedWrapper({ children }: { children: React.ReactNode }) {\n return React.createElement(ContextProvider, null, children);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] SharedRoot(${originalName})`;\n return NamedWrapper;\n};\n\nconst withIndividualRootName = (\n islandId: string,\n IslandRenderer: IndividualIslandsRendererComponent\n): IndividualIslandsRendererComponent => {\n const originalName = IslandRenderer.displayName;\n\n function NamedWrapper(props: IndividualIslandsRendererProps) {\n return React.createElement(IslandRenderer, props);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] HydratedRoot#${islandId}`;\n return NamedWrapper;\n};\n\nconst getOrCreateSharedRootElement = (): HTMLElement => {\n let rootElement = document.getElementById(SHARED_ROOT_ID);\n if (!rootElement) {\n rootElement = document.createElement(\"div\");\n rootElement.id = SHARED_ROOT_ID;\n rootElement.style.display = \"none\";\n document.body.appendChild(rootElement);\n }\n return rootElement;\n};\n\nconst mountSharedIsland = (\n state: ManagerState,\n data: IslandData\n): ManagerState => {\n state.sharedIslandsRef.current = {\n ...state.sharedIslandsRef.current,\n [data.id]: data,\n };\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n};\n\nconst mountIndividualIsland = (\n state: ManagerState,\n data: IslandData,\n IslandRenderer: IndividualIslandsRendererComponent\n): ManagerState => {\n const NamedIslandRenderer = withIndividualRootName(data.id, IslandRenderer);\n const root = ReactDOM.hydrateRoot(\n data.el,\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(NamedIslandRenderer, {\n data,\n storeAccess: state.storeAccess,\n })\n )\n );\n\n return {\n ...state,\n roots: { ...state.roots, [data.id]: root },\n };\n};\n\n// ============================================================================\n// Island Manager (Bridge between LiveView hook lifecycles and React rendering)\n// ============================================================================\n\nconst ManagerObj: Manager = {\n initialize: ({\n SharedContextProvider = NullContextProvider,\n SharedIslandsRenderer = PortalIslandsRenderer,\n }) => {\n const rootElement = getOrCreateSharedRootElement();\n const root = ReactDOM.createRoot(rootElement);\n\n const propsStore = new Map<string, Record<string, any>>();\n const propsListeners = new Set<() => void>();\n const globalsRef = { current: null as Record<string, any> | null };\n const globalsListeners = new Set<() => void>();\n const sharedIslandsRef = { current: {} as Record<string, IslandData> };\n const sharedIslandsListeners = new Set<() => void>();\n const streamsStore = new Map<string, any[]>();\n const streamsListeners = new Map<string, Set<() => void>>();\n const streamConfigs = new Map<string, StreamConfig>();\n\n const getStreamKey = (islandId: string, streamName: string) =>\n `${islandId}:${streamName}`;\n\n const storeAccess: IslandStoreAccess = {\n getProps: (islandId: string) => propsStore.get(islandId) || null,\n subscribeToProps: (cb: () => void) => {\n propsListeners.add(cb);\n return () => propsListeners.delete(cb);\n },\n getGlobals: () => globalsRef.current,\n subscribeToGlobals: (cb: () => void) => {\n globalsListeners.add(cb);\n return () => globalsListeners.delete(cb);\n },\n getSharedIslands: () => sharedIslandsRef.current,\n subscribeToSharedIslands: (cb: () => void) => {\n sharedIslandsListeners.add(cb);\n return () => sharedIslandsListeners.delete(cb);\n },\n getStreamItems: (islandId: string, streamName: string) => {\n const key = getStreamKey(islandId, streamName);\n return streamsStore.get(key) || [];\n },\n subscribeToStream: (\n islandId: string,\n streamName: string,\n cb: () => void,\n config?: StreamConfig\n ) => {\n const key = getStreamKey(islandId, streamName);\n if (config) {\n streamConfigs.set(key, config);\n }\n if (!streamsListeners.has(key)) {\n streamsListeners.set(key, new Set());\n }\n streamsListeners.get(key)!.add(cb);\n return () => {\n streamsListeners.get(key)?.delete(cb);\n if (streamsListeners.get(key)?.size === 0) {\n streamConfigs.delete(key);\n }\n };\n },\n };\n\n const state: ManagerState = {\n propsStore,\n globalsRef,\n propsListeners,\n globalsListeners,\n sharedIslandsRef,\n sharedIslandsListeners,\n streamsStore,\n streamsListeners,\n streamConfigs,\n roots: { [SHARED_ROOT_ID]: root },\n storeAccess,\n };\n\n const NamedSharedContextProvider = withSharedRootName(\n SharedContextProvider\n );\n\n root.render(\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(\n NamedSharedContextProvider,\n null,\n React.createElement(SharedIslandsRenderer, {\n storeAccess: state.storeAccess,\n })\n )\n )\n );\n\n return state;\n },\n mountIsland: (state, data, IslandRenderer = IndividualIslandRenderer) => {\n switch (data.ssrStrategy) {\n case \"hydrate_root\":\n return mountIndividualIsland(state, data, IslandRenderer);\n default:\n return mountSharedIsland(state, data);\n }\n },\n unmountIsland: (state, id) => {\n state.propsStore.delete(id);\n\n const streamPrefix = `${id}:`;\n for (const key of state.streamsStore.keys()) {\n if (key.startsWith(streamPrefix)) {\n state.streamsStore.delete(key);\n state.streamsListeners.delete(key);\n state.streamConfigs.delete(key);\n }\n }\n\n if (state.roots[id]) {\n state.roots[id].unmount();\n const { [id]: removedRoot, ...remainingRoots } = state.roots;\n return {\n ...state,\n roots: remainingRoots,\n };\n } else {\n const { [id]: removed, ...remaining } = state.sharedIslandsRef.current;\n state.sharedIslandsRef.current = remaining;\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n }\n },\n updateIslandProps: (state, islandId, props) => {\n const existing = state.propsStore.get(islandId) || {};\n state.propsStore.set(islandId, { ...existing, ...props });\n state.propsListeners.forEach((cb) => cb());\n return state;\n },\n updateGlobals: (state, globals) => {\n const incomingVersion = globals.__version ?? -1;\n const storeVersion = state.globalsRef.current?.__version ?? -1;\n if (incomingVersion > storeVersion) {\n state.globalsRef.current = {\n ...(state.globalsRef.current || {}),\n ...globals,\n };\n state.globalsListeners.forEach((cb) => cb());\n }\n\n return state;\n },\n resetGlobals: (state) => {\n state.globalsRef.current = null;\n return state;\n },\n initializeStream: (state, islandId, streamName, initialItems) => {\n const key = `${islandId}:${streamName}`;\n state.streamsStore.set(key, [...initialItems]);\n return state;\n },\n updateStream: (state, islandId, streamName, action, data) => {\n const key = `${islandId}:${streamName}`;\n let items = state.streamsStore.get(key) || [];\n const config = state.streamConfigs.get(key);\n\n switch (action) {\n case StreamAction.Insert:\n items = [data, ...items];\n break;\n case StreamAction.Update:\n const idx = items.findIndex((item) => item.id === data.id);\n if (idx !== -1) {\n items = [...items];\n items[idx] = { ...items[idx], ...data };\n }\n break;\n case StreamAction.Delete:\n items = items.filter((item) => item.id !== data);\n break;\n case StreamAction.Reset:\n items = [];\n break;\n }\n\n if (config?.capper) {\n items = config.capper(items);\n } else if (config?.limit !== undefined && items.length > config.limit) {\n items = items.slice(0, config.limit);\n }\n\n state.streamsStore.set(key, items);\n state.streamsListeners.get(key)?.forEach((cb) => cb());\n return state;\n },\n};\nexport default ManagerObj;\n","import IslandsManager, { Manager } from \"./islandsManager\";\nimport {\n type IslandsMap,\n type SSRStrategy,\n type PushEventFn,\n type ContextProviderComponent,\n type IslandComponent,\n type LazyIslandFactory,\n type StreamHandle,\n NullContextProvider,\n StreamAction,\n} from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface LiveViewHook {\n el: HTMLElement;\n liveSocket: {\n on: (event: string, callback: (e: Event) => void) => void;\n };\n pushEvent: (\n event: string,\n payload: any,\n callback?: (reply: any, ref: any) => void\n ) => void;\n pushEventTo: (target: string, event: string, payload: any) => void;\n handleEvent: (event: string, callback: (data: any) => void) => void;\n}\n\nexport interface CreateHooksOptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n manager?: Manager;\n}\n\n// ============================================================================\n// Event Handler Adapter\n// ============================================================================\n\nfunction createPushEventFn(hook: LiveViewHook): PushEventFn {\n return (eventName: string, payload: any) => {\n hook.pushEventTo(`#${hook.el.id}`, eventName, payload);\n };\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst resolvedComponentsCache = new Map<string, IslandComponent>();\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n // Check if it's a React component (has prototype.isReactComponent for class components)\n if ((value as any).prototype?.isReactComponent) return false;\n // Check if it's a config object getter (would have Component property)\n if ((value as any).Component) return false;\n // Assume zero-arg functions that aren't class components are lazy factories\n return value.length === 0;\n};\n\nconst resolveIslandConfig = async (\n islandsMap: IslandsMap,\n componentName: string,\n defaultContextProvider: ContextProviderComponent\n): Promise<{\n Component: IslandComponent;\n ContextProvider: ContextProviderComponent;\n} | null> => {\n const config = islandsMap[componentName];\n\n if (!config) {\n return null;\n }\n\n // Check cache first for lazy-loaded components\n const cached = resolvedComponentsCache.get(componentName);\n if (cached) {\n return { Component: cached, ContextProvider: defaultContextProvider };\n }\n\n // Handle lazy factory: () => import(\"./Component\")\n if (isLazyFactory(config)) {\n const mod = await config();\n const Component = mod.default;\n resolvedComponentsCache.set(componentName, Component);\n return { Component, ContextProvider: defaultContextProvider };\n }\n\n // Handle direct component\n if (typeof config === \"function\") {\n return { Component: config, ContextProvider: defaultContextProvider };\n }\n\n // Handle config object\n return {\n Component: config.Component,\n ContextProvider: config.ContextProvider || defaultContextProvider,\n };\n};\n\n// ============================================================================\n// Main Hook Factory (LiveView Adapter Layer)\n// ============================================================================\n\nexport function createHooks({\n islands: islandsMap = {},\n SharedContextProvider = NullContextProvider,\n manager = IslandsManager,\n}: CreateHooksOptions) {\n console.log(`[LiveReactIslands] Creating hooks`);\n let managerState = manager.initialize({ SharedContextProvider });\n\n let globalsRequested = false;\n const pendingMounts = new Set<string>();\n let navigationListenerAttached = false;\n\n const Hook: Partial<LiveViewHook> & {\n mounted: (this: LiveViewHook) => void;\n updated?: (this: LiveViewHook) => void;\n destroyed: (this: LiveViewHook) => void;\n } = {\n mounted(this: LiveViewHook) {\n console.log(\"[Hook] Mount:\", this.el.id);\n if (!this.el.id) {\n console.error(`[LiveReactIslands] Island element missing unique id`);\n return;\n }\n\n if (!navigationListenerAttached) {\n navigationListenerAttached = true;\n this.liveSocket.on(\"phx:page-loading-start\", () => {\n globalsRequested = false;\n managerState = manager.resetGlobals(managerState);\n });\n }\n\n // Pull globals once on first island mount\n if (!globalsRequested) {\n globalsRequested = true;\n this.handleEvent(\"lri-g\", (data) => {\n managerState = manager.updateGlobals(managerState, data);\n });\n this.pushEvent(\"lri-g\", {}, (reply) => {\n managerState = manager.updateGlobals(managerState, reply);\n });\n }\n\n const {\n comp: componentName,\n ssr: ssrData,\n props: propsData,\n schema: schemaData,\n globals: globalsData,\n globalsVersion: globalsVersionData,\n } = this.el.dataset;\n if (!componentName) {\n console.error(\n `[LiveReactIslands] Element '${this.el.id}' missing data-comp attribute`\n );\n return;\n }\n\n let schema: { p: string[]; g: string[]; i: number } = {\n p: [],\n g: [],\n i: 0,\n };\n if (schemaData) {\n try {\n schema = JSON.parse(schemaData);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-schema:`,\n e\n );\n }\n }\n\n let initialProps: Record<string, any> = {};\n if (propsData) {\n try {\n const propsArray = JSON.parse(propsData);\n schema.p.forEach((propName, idx) => {\n const value = propsArray[idx];\n if (value?.__s !== undefined) {\n const streamName = schema.p[value.__s];\n managerState = manager.initializeStream(\n managerState,\n this.el.id,\n streamName,\n value.i\n );\n const handle: StreamHandle = {\n name: streamName,\n initial: value.i,\n };\n initialProps[propName] = handle;\n } else {\n initialProps[propName] = value;\n }\n });\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-props:`,\n e\n );\n }\n }\n\n // Only for hydrate_root strategy\n let initialGlobals: Record<string, any> = {};\n if (globalsData) {\n try {\n const globalsArray = JSON.parse(globalsData);\n schema.g.forEach((globalName, idx) => {\n initialGlobals[globalName] = globalsArray[idx];\n });\n if (!globalsVersionData)\n throw \"Missing data-globals-version attribute\";\n initialGlobals.__version = parseInt(globalsVersionData, 10);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-globals:`,\n e\n );\n }\n }\n\n let ssrStrategy: SSRStrategy;\n switch (ssrData) {\n case \"overwrite\":\n ssrStrategy = \"overwrite\";\n break;\n case \"hydrate_root\":\n ssrStrategy = \"hydrate_root\";\n break;\n default:\n ssrStrategy = \"none\";\n }\n\n const pushEvent = createPushEventFn(this);\n const elId = this.el.id;\n const el = this.el;\n\n pendingMounts.add(elId);\n\n (async () => {\n const islandConfig = await resolveIslandConfig(\n islandsMap,\n componentName,\n SharedContextProvider\n );\n\n if (!pendingMounts.has(elId)) return;\n pendingMounts.delete(elId);\n\n if (!islandConfig) {\n console.error(\n `[LiveReactIslands] React island '${componentName}' not found`\n );\n return;\n }\n\n managerState = manager.updateIslandProps(\n managerState,\n elId,\n initialProps\n );\n\n managerState = manager.mountIsland(managerState, {\n id: elId,\n el,\n Component: islandConfig.Component,\n ContextProvider: islandConfig.ContextProvider,\n ssrStrategy,\n pushEvent,\n hydrationData:\n ssrStrategy === \"hydrate_root\"\n ? { props: initialProps, globals: initialGlobals }\n : null,\n globalKeys: schema.g,\n });\n })();\n\n this.handleEvent(\n \"lri-p\",\n (payload: { i: number; [key: number]: any }) => {\n if (payload.i !== schema.i) return;\n\n const props: Record<string, any> = {};\n Object.entries(payload).forEach(([key, value]) => {\n if (key === \"i\") return;\n const idx = parseInt(key, 10);\n if (!isNaN(idx) && schema.p[idx]) {\n props[schema.p[idx]] = value;\n }\n });\n\n managerState = manager.updateIslandProps(\n managerState,\n this.el.id,\n props\n );\n }\n );\n\n this.handleEvent(\n \"lri-s\",\n (payload: { s: number; a: StreamAction; d: any; i: number }) => {\n if (payload.i !== schema.i) return;\n\n const streamName = schema.p[payload.s];\n if (!streamName) return;\n\n managerState = manager.updateStream(\n managerState,\n this.el.id,\n streamName,\n payload.a,\n payload.d\n );\n }\n );\n },\n\n updated(this: LiveViewHook) {\n console.log(\"[Hook] Updated:\", this.el.id);\n },\n\n destroyed(this: LiveViewHook) {\n console.log(\"[Hook] Destroyed:\", this.el.id);\n pendingMounts.delete(this.el.id);\n managerState = manager.unmountIsland(managerState, this.el.id);\n },\n };\n\n return { LiveReactIslands: Hook };\n}\n","import { useContext, useSyncExternalStore, useMemo } from \"react\";\nimport type { StreamHandle } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport interface UseStreamOptions<T> {\n limit?: number;\n capper?: (items: T[]) => T[];\n}\n\nexport function useStream<T extends { id: string | number }>(\n handle: StreamHandle,\n options?: UseStreamOptions<T>\n): T[] {\n const context = useContext(IslandContextProvider);\n if (!context) {\n throw new Error(\"useStream must be used within an Island component\");\n }\n\n const { id: islandId, storeAccess } = context;\n\n const subscribe = useMemo(\n () => (cb: () => void) =>\n storeAccess.subscribeToStream(islandId, handle.name, cb, {\n limit: options?.limit,\n capper: options?.capper as ((items: any[]) => any[]) | undefined,\n }),\n [storeAccess, islandId, handle.name, options?.limit, options?.capper]\n );\n\n const getSnapshot = useMemo(\n () => () => storeAccess.getStreamItems(islandId, handle.name) as T[],\n [storeAccess, islandId, handle.name]\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, () => handle.initial as T[]);\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\n\nexport interface FormProps {\n /** Internal: prop name for event routing (set by server) */\n __prop?: string;\n types?: Record<string, string>;\n required?: string[];\n values: Record<string, any>;\n errors: Record<string, string[]>;\n isValid?: boolean;\n version?: number;\n}\n\nexport type PushEventFn = (event: string, payload: Record<string, any>) => void;\n\nexport interface FieldProps {\n name: string;\n value: any;\n checked?: boolean;\n onChange: (\n e: React.ChangeEvent<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >\n ) => void;\n}\n\nexport interface UseFormReturn {\n /** Current form field values */\n values: Record<string, any>;\n /** Current form errors by field name */\n errors: Record<string, string[]>;\n /** Field types from schema */\n types: Record<string, string>;\n /** Required field names */\n required: string[];\n /** Field names that have been modified by the user */\n touched: string[];\n /** Get props to spread on an input element */\n getFieldProps: (name: string) => FieldProps;\n /** Get the first error message for a field */\n getError: (name: string) => string | undefined;\n /** Check if a field is required */\n isRequired: (name: string) => boolean;\n /** Check if a field has been modified by the user */\n isTouched: (name: string) => boolean;\n /** Set a field value programmatically */\n setField: (name: string, value: any) => void;\n /** Handle form submission */\n handleSubmit: (e?: React.FormEvent) => void;\n /** Reset form to server values */\n reset: () => void;\n /**\n * True when the server hasn't acknowledged the latest client changes.\n * Use this to show a syncing indicator (e.g., spinner, \"Validating...\").\n */\n isSyncing: boolean;\n /**\n * True only when form is valid AND fully synced with server.\n * Use this to enable/disable the submit button.\n * This is the \"Validation Lock\" - users cannot submit until server confirms validity.\n */\n isValid: boolean;\n /** Current local version counter */\n localVersion: number;\n /** Last acknowledged server version */\n serverVersion: number;\n}\n\nexport function useForm(\n form: FormProps,\n pushEvent?: PushEventFn\n): UseFormReturn {\n // 1. Version Tracking\n // Local version increments on each field change\n // Server version comes from form.version prop\n const localVersionRef = useRef(form.version ?? 0);\n const lastSentVersionRef = useRef(0); // Prevents duplicate sends in StrictMode\n const [localVersion, setLocalVersion] = useState(form.version ?? 0);\n const serverVersion = form.version ?? 0;\n\n // Prop name comes from server (embedded in form data)\n const propName = form.__prop;\n\n // Reset local version when server sends a reset (version 0 with new schema)\n useEffect(() => {\n if (form.version === 0 && form.types) {\n localVersionRef.current = 0;\n setLocalVersion(0);\n }\n }, [form.version, form.types]);\n\n // 3. Persistent Schema\n // We only update these when the server explicitly sends them (usually on init)\n const [schema, setSchema] = useState({\n types: form.types ?? {},\n required: form.required ?? [],\n });\n\n if (form.types && form.types !== schema.types) {\n setSchema((prev) => ({ ...prev, types: form.types! }));\n }\n if (form.required && form.required !== schema.required) {\n setSchema((prev) => ({ ...prev, required: form.required! }));\n }\n\n // 4. Values Management\n const [localValues, setLocalValues] = useState<Record<string, any>>(\n form.values ?? {}\n );\n\n // 5. Touched Tracking (client-side only)\n const [touched, setTouched] = useState<string[]>([]);\n\n // Sync from server: Update local values when server sends updates\n useEffect(() => {\n setLocalValues((prev) => ({ ...prev, ...form.values }));\n }, [form.values]);\n\n // 6. Versioned Change Handler\n const setField = useCallback((name: string, value: any) => {\n // Mark field as touched\n setTouched((prev) => (prev.includes(name) ? prev : [...prev, name]));\n\n // Increment version BEFORE state update to avoid StrictMode double-increment\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n\n setLocalValues((prev) => {\n const next = { ...prev, [name]: value };\n\n // Update version state (will be batched with values update)\n setLocalVersion(newVersion);\n\n // Only send event once per version (prevents duplicate sends in StrictMode)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"validate\",\n prop: propName,\n attrs: next,\n _v: newVersion,\n });\n }\n\n return next;\n });\n }, [propName]);\n\n // 6. Identity-Stable Field Props\n const getFieldProps = useCallback(\n (name: string): FieldProps => {\n const type = schema.types[name];\n const value = localValues[name];\n\n const base = { name };\n\n if (type === \"boolean\" || type === \"bool\") {\n return {\n ...base,\n checked: !!value,\n value: undefined as any,\n onChange: (e) =>\n setField(name, (e.target as HTMLInputElement).checked),\n };\n }\n\n return {\n ...base,\n value: value ?? \"\",\n onChange: (e) => setField(name, e.target.value),\n };\n },\n [localValues, schema.types, setField]\n );\n\n const getError = useCallback(\n (name: string) => form.errors?.[name]?.[0],\n [form.errors]\n );\n\n const isRequired = useCallback(\n (name: string) => schema.required.includes(name),\n [schema.required]\n );\n\n const isTouched = useCallback(\n (name: string) => touched.includes(name),\n [touched]\n );\n\n // 7. Versioned Submit Handler\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n\n // Increment version for submit as well\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n setLocalVersion(newVersion);\n\n // Only send once (prevents duplicate sends if called twice)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"submit\",\n prop: propName,\n attrs: localValues,\n _v: newVersion,\n });\n }\n },\n [localValues, propName]\n );\n\n const reset = useCallback(() => {\n setLocalValues(form.values ?? {});\n setTouched([]);\n // Reset local version to match server\n localVersionRef.current = form.version ?? 0;\n setLocalVersion(form.version ?? 0);\n }, [form.values, form.version]);\n\n // 8. Derived States - The \"Validation Lock\"\n // isSyncing: True when client has sent changes that server hasn't acknowledged\n const isSyncing = localVersion > serverVersion;\n\n // isValid: True only when:\n // 1. Form is in sync (server has seen all changes)\n // 2. Server says the form is valid\n // This ensures users cannot submit until server validates the latest data\n const isValid = !isSyncing && (form.isValid ?? false);\n\n return {\n values: localValues,\n errors: form.errors ?? {},\n types: schema.types,\n required: schema.required,\n touched,\n getFieldProps,\n getError,\n isRequired,\n isTouched,\n setField,\n handleSubmit,\n reset,\n isSyncing,\n isValid,\n localVersion,\n serverVersion,\n };\n}\n"],"names":["NullContextProvider","createContext","memo","useMemo","useSyncExternalStore","useRef","createPortal","IslandsManager","useContext","useState","useEffect","useCallback"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/types.ts","../src/context.ts","../src/PortalIslandsRenderer.tsx","../src/IndividualIslandRenderer.tsx","../src/islandsManager.ts","../src/createHooks.ts","../src/useStream.ts","../src/useForm.ts"],"sourcesContent":["import { ComponentType } from \"react\";\n\n// ============================================================================\n// Core Types\n// ============================================================================\n\nexport type IslandComponent = ComponentType<any>;\n\nexport type LazyIslandFactory = () => Promise<{ default: IslandComponent }>;\n\nexport type IslandsMap = Record<\n string,\n IslandComponent | IslandConfig | LazyIslandFactory\n>;\n\nexport type ContextProviderComponent = ComponentType<{\n children: React.ReactNode;\n}>;\n\nexport interface IslandConfig {\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n}\n\nexport type SSRStrategy = \"none\" | \"overwrite\" | \"hydrate_root\";\n\nexport type PushEventFn = (eventName: string, payload: any) => void;\n\nexport interface StreamConfig {\n limit?: number;\n capper?: (items: any[]) => any[];\n}\n\nexport interface IslandStoreAccess {\n getProps: (islandId: string) => Record<string, any> | null;\n subscribeToProps: (callback: () => void) => () => void;\n getGlobals: () => Record<string, any> | null;\n subscribeToGlobals: (callback: () => void) => () => void;\n getSharedIslands: () => Record<string, IslandData>;\n subscribeToSharedIslands: (callback: () => void) => () => void;\n getStreamItems: (islandId: string, streamName: string) => any[];\n subscribeToStream: (\n islandId: string,\n streamName: string,\n callback: () => void,\n config?: StreamConfig\n ) => () => void;\n}\n\nexport enum StreamAction {\n Insert = \"i\",\n Update = \"u\",\n Delete = \"d\",\n Reset = \"r\",\n}\n\nexport interface StreamHandle {\n name: string;\n initial: any[];\n}\n\nexport interface IslandData {\n id: string;\n el: HTMLElement;\n ssrStrategy: SSRStrategy;\n Component: IslandComponent;\n ContextProvider?: ContextProviderComponent;\n hydrationData: {\n props: Record<string, any>;\n globals: Record<string, any>;\n } | null;\n pushEvent: PushEventFn;\n globalKeys: string[];\n}\n\nexport interface SharedIslandsRendererProps {\n storeAccess: IslandStoreAccess;\n}\nexport type SharedIslandsRendererComponent =\n React.FC<SharedIslandsRendererProps>;\n\nexport interface IndividualIslandsRendererProps {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n}\nexport type IndividualIslandsRendererComponent =\n React.FC<IndividualIslandsRendererProps>;\n\nexport const NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n","import { createContext } from \"react\";\nimport type { IslandStoreAccess } from \"./types\";\n\nexport interface IslandContext {\n id: string;\n storeAccess: IslandStoreAccess;\n}\n\nexport const IslandContextProvider = createContext<IslandContext | null>(null);\n","import React, { useRef, memo, useSyncExternalStore, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type {\n IslandData,\n SharedIslandsRendererProps,\n IslandStoreAccess,\n} from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nconst PortalIsland = memo(\n ({\n data,\n storeAccess,\n }: {\n data: IslandData;\n storeAccess: IslandStoreAccess;\n }) => {\n const {\n Component,\n ContextProvider,\n id,\n pushEvent,\n ssrStrategy,\n el,\n globalKeys,\n } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n const contextValue = useMemo(\n () => ({ id, storeAccess }),\n [id, storeAccess]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => null\n );\n\n const allGlobals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n () => null\n );\n\n const didClearRef = useRef(false);\n if (ssrStrategy === \"overwrite\" && !didClearRef.current) {\n el.innerHTML = \"\";\n didClearRef.current = true;\n }\n\n if (!allGlobals) {\n console.log(\"[PortalIsland] Waiting for globals\", id);\n return null;\n }\n\n console.log(\"[PortalIsland] Rendering\", { id, allGlobals });\n\n const relevantGlobals: Record<string, any> = {};\n if (allGlobals) {\n globalKeys.forEach((key) => {\n if (key in allGlobals) {\n relevantGlobals[key] = allGlobals[key];\n }\n });\n }\n\n const mergedProps = { ...relevantGlobals, ...currentProps };\n\n const islandNode = (\n <MemoizedComponent {...mergedProps} id={id} pushEvent={pushEvent} />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n const content = MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n\n return createPortal(content, el);\n }\n);\nPortalIsland.displayName = \"[ReactLiveIslands]PortalIsland\";\n\nexport const PortalIslandsRenderer: React.FC<SharedIslandsRendererProps> = ({\n storeAccess,\n}) => {\n const sharedIslandsObj = useSyncExternalStore(\n storeAccess.subscribeToSharedIslands,\n storeAccess.getSharedIslands\n );\n\n const islands = Object.values(sharedIslandsObj);\n\n console.log(\n \"[PortalIslandsRenderer] Rendering islands:\",\n islands.map((d) => d.id)\n );\n\n return (\n <>\n {islands.map((data) => (\n <PortalIsland key={data.id} data={data} storeAccess={storeAccess} />\n ))}\n </>\n );\n};\nPortalIslandsRenderer.displayName = \"[ReactLiveIslands]PortalIslandsRenderer\";\n","import React, { useSyncExternalStore, memo, useMemo } from \"react\";\nimport type { IndividualIslandsRendererProps } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport const IndividualIslandRenderer: React.FC<\n IndividualIslandsRendererProps\n> = ({ data, storeAccess }) => {\n const { Component, ContextProvider, id, pushEvent, globalKeys } = data;\n\n const MemoizedComponent = useMemo(() => memo(Component), [Component]);\n const MemoizedContextProvider = useMemo(\n () => (ContextProvider ? memo(ContextProvider) : null),\n [ContextProvider]\n );\n\n const currentProps = useSyncExternalStore(\n storeAccess.subscribeToProps,\n () => storeAccess.getProps(id),\n () => data.hydrationData?.props\n );\n\n // Check once if hydration globals version matches store version\n const serverGlobalsSnapshot = useMemo(() => {\n const hydrationGlobals = data.hydrationData?.globals;\n if (!hydrationGlobals) return () => hydrationGlobals;\n let comparedVersions = false;\n let useStoreReference = false;\n return () => {\n if (!comparedVersions) {\n comparedVersions = true;\n const storeGlobals = storeAccess.getGlobals();\n const hydrationVersion = hydrationGlobals.__version ?? -1;\n const storeVersion = storeGlobals?.__version ?? -1;\n useStoreReference = storeVersion === hydrationVersion;\n }\n return useStoreReference ? storeAccess.getGlobals() : hydrationGlobals;\n };\n }, [data.hydrationData?.globals, storeAccess]);\n\n const globals = useSyncExternalStore(\n storeAccess.subscribeToGlobals,\n storeAccess.getGlobals,\n serverGlobalsSnapshot\n );\n\n const filteredGlobals: Record<string, any> = {};\n if (globals) {\n globalKeys.forEach((key) => {\n if (key in globals) {\n filteredGlobals[key] = globals[key];\n }\n });\n }\n\n const contextValue = useMemo(() => ({ id, storeAccess }), [id, storeAccess]);\n\n const islandNode = (\n <MemoizedComponent\n {...filteredGlobals}\n {...currentProps}\n id={id}\n pushEvent={pushEvent}\n />\n );\n\n const withContext = (\n <IslandContextProvider.Provider value={contextValue}>\n {islandNode}\n </IslandContextProvider.Provider>\n );\n\n return MemoizedContextProvider ? (\n <MemoizedContextProvider>{withContext}</MemoizedContextProvider>\n ) : (\n withContext\n );\n};\n\nIndividualIslandRenderer.displayName =\n \"[ReactLiveIslands] IndividualIslandRenderer\";\n","import React from \"react\";\nimport ReactDOM from \"react-dom/client\";\n\nimport {\n ContextProviderComponent,\n IslandData,\n SharedIslandsRendererComponent,\n IndividualIslandsRendererComponent,\n IslandStoreAccess,\n IndividualIslandsRendererProps,\n StreamAction,\n StreamConfig,\n} from \"./types\";\nimport { PortalIslandsRenderer } from \"./PortalIslandsRenderer\";\nimport { IndividualIslandRenderer } from \"./IndividualIslandRenderer\";\n\n// Constant root ID - one shared root per application\nexport const SHARED_ROOT_ID = \"__live_react_islands_shared_root__\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface ManagerState {\n propsStore: Map<string, Record<string, any>>;\n propsListeners: Set<() => void>;\n globalsRef: React.MutableRefObject<Record<string, any> | null>;\n globalsListeners: Set<() => void>;\n sharedIslandsRef: React.MutableRefObject<Record<string, IslandData>>;\n sharedIslandsListeners: Set<() => void>;\n streamsStore: Map<string, any[]>;\n streamsListeners: Map<string, Set<() => void>>;\n streamConfigs: Map<string, StreamConfig>;\n roots: Record<string, any>;\n storeAccess: IslandStoreAccess;\n}\n\nexport interface Manager {\n initialize: (params: {\n SharedContextProvider?: ContextProviderComponent;\n SharedIslandsRenderer?: SharedIslandsRendererComponent;\n }) => ManagerState;\n mountIsland: (\n state: ManagerState,\n data: IslandData,\n IslandRenderer?: IndividualIslandsRendererComponent\n ) => ManagerState;\n unmountIsland: (state: ManagerState, id: string) => ManagerState;\n updateIslandProps: (\n state: ManagerState,\n islandId: string,\n props: Record<string, any>\n ) => ManagerState;\n updateGlobals: (\n state: ManagerState,\n globals: Record<string, any>\n ) => ManagerState;\n resetGlobals: (state: ManagerState) => ManagerState;\n initializeStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n initialItems: any[]\n ) => ManagerState;\n updateStream: (\n state: ManagerState,\n islandId: string,\n streamName: string,\n action: StreamAction,\n data: any\n ) => ManagerState;\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst NullContextProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => children;\n\nconst withSharedRootName = (\n ContextProvider: ContextProviderComponent\n): ContextProviderComponent => {\n const originalName =\n ContextProvider.displayName || ContextProvider.name || \"ContextProvider\";\n\n function NamedWrapper({ children }: { children: React.ReactNode }) {\n return React.createElement(ContextProvider, null, children);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] SharedRoot(${originalName})`;\n return NamedWrapper;\n};\n\nconst withIndividualRootName = (\n islandId: string,\n IslandRenderer: IndividualIslandsRendererComponent\n): IndividualIslandsRendererComponent => {\n const originalName = IslandRenderer.displayName;\n\n function NamedWrapper(props: IndividualIslandsRendererProps) {\n return React.createElement(IslandRenderer, props);\n }\n\n NamedWrapper.displayName = `[LiveReactIslands] HydratedRoot#${islandId}`;\n return NamedWrapper;\n};\n\nconst getOrCreateSharedRootElement = (): HTMLElement => {\n let rootElement = document.getElementById(SHARED_ROOT_ID);\n if (!rootElement) {\n rootElement = document.createElement(\"div\");\n rootElement.id = SHARED_ROOT_ID;\n rootElement.style.display = \"none\";\n document.body.appendChild(rootElement);\n }\n return rootElement;\n};\n\nconst mountSharedIsland = (\n state: ManagerState,\n data: IslandData\n): ManagerState => {\n state.sharedIslandsRef.current = {\n ...state.sharedIslandsRef.current,\n [data.id]: data,\n };\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n};\n\nconst mountIndividualIsland = (\n state: ManagerState,\n data: IslandData,\n IslandRenderer: IndividualIslandsRendererComponent\n): ManagerState => {\n const NamedIslandRenderer = withIndividualRootName(data.id, IslandRenderer);\n const root = ReactDOM.hydrateRoot(\n data.el,\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(NamedIslandRenderer, {\n data,\n storeAccess: state.storeAccess,\n })\n )\n );\n\n return {\n ...state,\n roots: { ...state.roots, [data.id]: root },\n };\n};\n\n// ============================================================================\n// Island Manager (Bridge between LiveView hook lifecycles and React rendering)\n// ============================================================================\n\nconst ManagerObj: Manager = {\n initialize: ({\n SharedContextProvider = NullContextProvider,\n SharedIslandsRenderer = PortalIslandsRenderer,\n }) => {\n const rootElement = getOrCreateSharedRootElement();\n const root = ReactDOM.createRoot(rootElement);\n\n const propsStore = new Map<string, Record<string, any>>();\n const propsListeners = new Set<() => void>();\n const globalsRef = { current: null as Record<string, any> | null };\n const globalsListeners = new Set<() => void>();\n const sharedIslandsRef = { current: {} as Record<string, IslandData> };\n const sharedIslandsListeners = new Set<() => void>();\n const streamsStore = new Map<string, any[]>();\n const streamsListeners = new Map<string, Set<() => void>>();\n const streamConfigs = new Map<string, StreamConfig>();\n\n const getStreamKey = (islandId: string, streamName: string) =>\n `${islandId}:${streamName}`;\n\n const storeAccess: IslandStoreAccess = {\n getProps: (islandId: string) => propsStore.get(islandId) || null,\n subscribeToProps: (cb: () => void) => {\n propsListeners.add(cb);\n return () => propsListeners.delete(cb);\n },\n getGlobals: () => globalsRef.current,\n subscribeToGlobals: (cb: () => void) => {\n globalsListeners.add(cb);\n return () => globalsListeners.delete(cb);\n },\n getSharedIslands: () => sharedIslandsRef.current,\n subscribeToSharedIslands: (cb: () => void) => {\n sharedIslandsListeners.add(cb);\n return () => sharedIslandsListeners.delete(cb);\n },\n getStreamItems: (islandId: string, streamName: string) => {\n const key = getStreamKey(islandId, streamName);\n return streamsStore.get(key) || [];\n },\n subscribeToStream: (\n islandId: string,\n streamName: string,\n cb: () => void,\n config?: StreamConfig\n ) => {\n const key = getStreamKey(islandId, streamName);\n if (config) {\n streamConfigs.set(key, config);\n }\n if (!streamsListeners.has(key)) {\n streamsListeners.set(key, new Set());\n }\n streamsListeners.get(key)!.add(cb);\n return () => {\n streamsListeners.get(key)?.delete(cb);\n if (streamsListeners.get(key)?.size === 0) {\n streamConfigs.delete(key);\n }\n };\n },\n };\n\n const state: ManagerState = {\n propsStore,\n globalsRef,\n propsListeners,\n globalsListeners,\n sharedIslandsRef,\n sharedIslandsListeners,\n streamsStore,\n streamsListeners,\n streamConfigs,\n roots: { [SHARED_ROOT_ID]: root },\n storeAccess,\n };\n\n const NamedSharedContextProvider = withSharedRootName(\n SharedContextProvider\n );\n\n root.render(\n React.createElement(\n React.StrictMode,\n null,\n React.createElement(\n NamedSharedContextProvider,\n null,\n React.createElement(SharedIslandsRenderer, {\n storeAccess: state.storeAccess,\n })\n )\n )\n );\n\n return state;\n },\n mountIsland: (state, data, IslandRenderer = IndividualIslandRenderer) => {\n switch (data.ssrStrategy) {\n case \"hydrate_root\":\n return mountIndividualIsland(state, data, IslandRenderer);\n default:\n return mountSharedIsland(state, data);\n }\n },\n unmountIsland: (state, id) => {\n state.propsStore.delete(id);\n\n const streamPrefix = `${id}:`;\n for (const key of state.streamsStore.keys()) {\n if (key.startsWith(streamPrefix)) {\n state.streamsStore.delete(key);\n state.streamsListeners.delete(key);\n state.streamConfigs.delete(key);\n }\n }\n\n if (state.roots[id]) {\n state.roots[id].unmount();\n const { [id]: removedRoot, ...remainingRoots } = state.roots;\n return {\n ...state,\n roots: remainingRoots,\n };\n } else {\n const { [id]: removed, ...remaining } = state.sharedIslandsRef.current;\n state.sharedIslandsRef.current = remaining;\n state.sharedIslandsListeners.forEach((cb) => cb());\n return state;\n }\n },\n updateIslandProps: (state, islandId, props) => {\n const existing = state.propsStore.get(islandId) || {};\n state.propsStore.set(islandId, { ...existing, ...props });\n state.propsListeners.forEach((cb) => cb());\n return state;\n },\n updateGlobals: (state, globals) => {\n const incomingVersion = globals.__version ?? -1;\n const storeVersion = state.globalsRef.current?.__version ?? -1;\n if (incomingVersion > storeVersion) {\n state.globalsRef.current = {\n ...(state.globalsRef.current || {}),\n ...globals,\n };\n state.globalsListeners.forEach((cb) => cb());\n }\n\n return state;\n },\n resetGlobals: (state) => {\n state.globalsRef.current = null;\n return state;\n },\n initializeStream: (state, islandId, streamName, initialItems) => {\n const key = `${islandId}:${streamName}`;\n state.streamsStore.set(key, [...initialItems]);\n return state;\n },\n updateStream: (state, islandId, streamName, action, data) => {\n const key = `${islandId}:${streamName}`;\n let items = state.streamsStore.get(key) || [];\n const config = state.streamConfigs.get(key);\n\n switch (action) {\n case StreamAction.Insert:\n items = [data, ...items];\n break;\n case StreamAction.Update:\n const idx = items.findIndex((item) => item.id === data.id);\n if (idx !== -1) {\n items = [...items];\n items[idx] = { ...items[idx], ...data };\n }\n break;\n case StreamAction.Delete:\n items = items.filter((item) => item.id !== data);\n break;\n case StreamAction.Reset:\n items = [];\n break;\n }\n\n if (config?.capper) {\n items = config.capper(items);\n } else if (config?.limit !== undefined && items.length > config.limit) {\n items = items.slice(0, config.limit);\n }\n\n state.streamsStore.set(key, items);\n state.streamsListeners.get(key)?.forEach((cb) => cb());\n return state;\n },\n};\nexport default ManagerObj;\n","import IslandsManager, { Manager } from \"./islandsManager\";\nimport {\n type IslandsMap,\n type SSRStrategy,\n type PushEventFn,\n type ContextProviderComponent,\n type IslandComponent,\n type LazyIslandFactory,\n type StreamHandle,\n NullContextProvider,\n StreamAction,\n} from \"./types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface LiveViewHook {\n el: HTMLElement;\n liveSocket: {\n on: (event: string, callback: (e: Event) => void) => void;\n };\n pushEvent: (\n event: string,\n payload: any,\n callback?: (reply: any, ref: any) => void\n ) => void;\n pushEventTo: (target: string, event: string, payload: any) => void;\n handleEvent: (event: string, callback: (data: any) => void) => void;\n}\n\nexport interface CreateHooksOptions {\n islands: IslandsMap;\n SharedContextProvider?: ContextProviderComponent;\n manager?: Manager;\n}\n\n// ============================================================================\n// Event Handler Adapter\n// ============================================================================\n\nfunction createPushEventFn(hook: LiveViewHook): PushEventFn {\n return (eventName: string, payload: any) => {\n hook.pushEventTo(`#${hook.el.id}`, eventName, payload);\n };\n}\n\n// ============================================================================\n// Helper\n// ============================================================================\n\nconst resolvedComponentsCache = new Map<string, IslandComponent>();\n\nconst isLazyFactory = (value: unknown): value is LazyIslandFactory => {\n if (typeof value !== \"function\") return false;\n // Check if it's a React component (has prototype.isReactComponent for class components)\n if ((value as any).prototype?.isReactComponent) return false;\n // Check if it's a config object getter (would have Component property)\n if ((value as any).Component) return false;\n // Assume zero-arg functions that aren't class components are lazy factories\n return value.length === 0;\n};\n\nconst resolveIslandConfig = async (\n islandsMap: IslandsMap,\n componentName: string,\n defaultContextProvider: ContextProviderComponent\n): Promise<{\n Component: IslandComponent;\n ContextProvider: ContextProviderComponent;\n} | null> => {\n const config = islandsMap[componentName];\n\n if (!config) {\n return null;\n }\n\n // Check cache first for lazy-loaded components\n const cached = resolvedComponentsCache.get(componentName);\n if (cached) {\n return { Component: cached, ContextProvider: defaultContextProvider };\n }\n\n // Handle lazy factory: () => import(\"./Component\")\n if (isLazyFactory(config)) {\n const mod = await config();\n const Component = mod.default;\n resolvedComponentsCache.set(componentName, Component);\n return { Component, ContextProvider: defaultContextProvider };\n }\n\n // Handle direct component\n if (typeof config === \"function\") {\n return { Component: config, ContextProvider: defaultContextProvider };\n }\n\n // Handle config object\n return {\n Component: config.Component,\n ContextProvider: config.ContextProvider || defaultContextProvider,\n };\n};\n\n// ============================================================================\n// Main Hook Factory (LiveView Adapter Layer)\n// ============================================================================\n\nexport function createHooks({\n islands: islandsMap = {},\n SharedContextProvider = NullContextProvider,\n manager = IslandsManager,\n}: CreateHooksOptions) {\n console.log(`[LiveReactIslands] Creating hooks`);\n let managerState = manager.initialize({ SharedContextProvider });\n\n let globalsRequested = false;\n const pendingMounts = new Set<string>();\n let navigationListenerAttached = false;\n\n const Hook: Partial<LiveViewHook> & {\n mounted: (this: LiveViewHook) => void;\n updated?: (this: LiveViewHook) => void;\n destroyed: (this: LiveViewHook) => void;\n } = {\n mounted(this: LiveViewHook) {\n console.log(\"[Hook] Mount:\", this.el.id);\n if (!this.el.id) {\n console.error(`[LiveReactIslands] Island element missing unique id`);\n return;\n }\n\n if (!navigationListenerAttached) {\n navigationListenerAttached = true;\n this.liveSocket.on(\"phx:page-loading-start\", () => {\n globalsRequested = false;\n managerState = manager.resetGlobals(managerState);\n });\n }\n\n // Pull globals once on first island mount\n if (!globalsRequested) {\n globalsRequested = true;\n this.handleEvent(\"lri-g\", (data) => {\n managerState = manager.updateGlobals(managerState, data);\n });\n this.pushEvent(\"lri-g\", {}, (reply) => {\n managerState = manager.updateGlobals(managerState, reply);\n });\n }\n\n const {\n comp: componentName,\n ssr: ssrData,\n props: propsData,\n schema: schemaData,\n globals: globalsData,\n globalsVersion: globalsVersionData,\n } = this.el.dataset;\n if (!componentName) {\n console.error(\n `[LiveReactIslands] Element '${this.el.id}' missing data-comp attribute`\n );\n return;\n }\n\n let schema: { p: string[]; g: string[]; i: number } = {\n p: [],\n g: [],\n i: 0,\n };\n if (schemaData) {\n try {\n schema = JSON.parse(schemaData);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-schema:`,\n e\n );\n }\n }\n\n let initialProps: Record<string, any> = {};\n if (propsData) {\n try {\n const propsArray = JSON.parse(propsData);\n schema.p.forEach((propName, idx) => {\n const value = propsArray[idx];\n if (value?.__s !== undefined) {\n const streamName = schema.p[value.__s];\n managerState = manager.initializeStream(\n managerState,\n this.el.id,\n streamName,\n value.i\n );\n const handle: StreamHandle = {\n name: streamName,\n initial: value.i,\n };\n initialProps[propName] = handle;\n } else {\n initialProps[propName] = value;\n }\n });\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-props:`,\n e\n );\n }\n }\n\n // Only for hydrate_root strategy\n let initialGlobals: Record<string, any> = {};\n if (globalsData) {\n try {\n const globalsArray = JSON.parse(globalsData);\n schema.g.forEach((globalName, idx) => {\n initialGlobals[globalName] = globalsArray[idx];\n });\n if (!globalsVersionData)\n throw \"Missing data-globals-version attribute\";\n initialGlobals.__version = parseInt(globalsVersionData, 10);\n } catch (e) {\n console.error(\n `[Island(${this.el.id})] Failed to parse data-globals:`,\n e\n );\n }\n }\n\n let ssrStrategy: SSRStrategy;\n switch (ssrData) {\n case \"overwrite\":\n ssrStrategy = \"overwrite\";\n break;\n case \"hydrate_root\":\n ssrStrategy = \"hydrate_root\";\n break;\n default:\n ssrStrategy = \"none\";\n }\n\n const pushEvent = createPushEventFn(this);\n const elId = this.el.id;\n const el = this.el;\n\n pendingMounts.add(elId);\n\n (async () => {\n const islandConfig = await resolveIslandConfig(\n islandsMap,\n componentName,\n NullContextProvider\n );\n\n if (!pendingMounts.has(elId)) return;\n pendingMounts.delete(elId);\n\n if (!islandConfig) {\n console.error(\n `[LiveReactIslands] React island '${componentName}' not found`\n );\n return;\n }\n\n managerState = manager.updateIslandProps(\n managerState,\n elId,\n initialProps\n );\n\n managerState = manager.mountIsland(managerState, {\n id: elId,\n el,\n Component: islandConfig.Component,\n ContextProvider: islandConfig.ContextProvider,\n ssrStrategy,\n pushEvent,\n hydrationData:\n ssrStrategy === \"hydrate_root\"\n ? { props: initialProps, globals: initialGlobals }\n : null,\n globalKeys: schema.g,\n });\n })();\n\n this.handleEvent(\n \"lri-p\",\n (payload: { i: number; [key: number]: any }) => {\n if (payload.i !== schema.i) return;\n\n const props: Record<string, any> = {};\n Object.entries(payload).forEach(([key, value]) => {\n if (key === \"i\") return;\n const idx = parseInt(key, 10);\n if (!isNaN(idx) && schema.p[idx]) {\n props[schema.p[idx]] = value;\n }\n });\n\n managerState = manager.updateIslandProps(\n managerState,\n this.el.id,\n props\n );\n }\n );\n\n this.handleEvent(\n \"lri-s\",\n (payload: { s: number; a: StreamAction; d: any; i: number }) => {\n if (payload.i !== schema.i) return;\n\n const streamName = schema.p[payload.s];\n if (!streamName) return;\n\n managerState = manager.updateStream(\n managerState,\n this.el.id,\n streamName,\n payload.a,\n payload.d\n );\n }\n );\n },\n\n updated(this: LiveViewHook) {\n console.log(\"[Hook] Updated:\", this.el.id);\n },\n\n destroyed(this: LiveViewHook) {\n console.log(\"[Hook] Destroyed:\", this.el.id);\n pendingMounts.delete(this.el.id);\n managerState = manager.unmountIsland(managerState, this.el.id);\n },\n };\n\n return { LiveReactIslands: Hook };\n}\n","import { useContext, useSyncExternalStore, useMemo } from \"react\";\nimport type { StreamHandle } from \"./types\";\nimport { IslandContextProvider } from \"./context\";\n\nexport interface UseStreamOptions<T> {\n limit?: number;\n capper?: (items: T[]) => T[];\n}\n\nexport function useStream<T extends { id: string | number }>(\n handle: StreamHandle,\n options?: UseStreamOptions<T>\n): T[] {\n const context = useContext(IslandContextProvider);\n if (!context) {\n throw new Error(\"useStream must be used within an Island component\");\n }\n\n const { id: islandId, storeAccess } = context;\n\n const subscribe = useMemo(\n () => (cb: () => void) =>\n storeAccess.subscribeToStream(islandId, handle.name, cb, {\n limit: options?.limit,\n capper: options?.capper as ((items: any[]) => any[]) | undefined,\n }),\n [storeAccess, islandId, handle.name, options?.limit, options?.capper]\n );\n\n const getSnapshot = useMemo(\n () => () => storeAccess.getStreamItems(islandId, handle.name) as T[],\n [storeAccess, islandId, handle.name]\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, () => handle.initial as T[]);\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\";\n\nexport interface FormProps {\n /** Internal: prop name for event routing (set by server) */\n __prop?: string;\n types?: Record<string, string>;\n required?: string[];\n values: Record<string, any>;\n errors: Record<string, string[]>;\n isValid?: boolean;\n version?: number;\n}\n\nexport type PushEventFn = (event: string, payload: Record<string, any>) => void;\n\nexport interface FieldProps {\n name: string;\n value: any;\n checked?: boolean;\n onChange: (\n e: React.ChangeEvent<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >\n ) => void;\n}\n\nexport interface UseFormReturn {\n /** Current form field values */\n values: Record<string, any>;\n /** Current form errors by field name */\n errors: Record<string, string[]>;\n /** Field types from schema */\n types: Record<string, string>;\n /** Required field names */\n required: string[];\n /** Field names that have been modified by the user */\n touched: string[];\n /** Get props to spread on an input element */\n getFieldProps: (name: string) => FieldProps;\n /** Get the first error message for a field */\n getError: (name: string) => string | undefined;\n /** Check if a field is required */\n isRequired: (name: string) => boolean;\n /** Check if a field has been modified by the user */\n isTouched: (name: string) => boolean;\n /** Set a field value programmatically */\n setField: (name: string, value: any) => void;\n /** Handle form submission */\n handleSubmit: (e?: React.FormEvent) => void;\n /** Reset form to server values */\n reset: () => void;\n /**\n * True when the server hasn't acknowledged the latest client changes.\n * Use this to show a syncing indicator (e.g., spinner, \"Validating...\").\n */\n isSyncing: boolean;\n /**\n * True only when form is valid AND fully synced with server.\n * Use this to enable/disable the submit button.\n * This is the \"Validation Lock\" - users cannot submit until server confirms validity.\n */\n isValid: boolean;\n /** Current local version counter */\n localVersion: number;\n /** Last acknowledged server version */\n serverVersion: number;\n}\n\nexport function useForm(\n form: FormProps,\n pushEvent?: PushEventFn\n): UseFormReturn {\n // 1. Version Tracking\n // Local version increments on each field change\n // Server version comes from form.version prop\n const localVersionRef = useRef(form.version ?? 0);\n const lastSentVersionRef = useRef(0); // Prevents duplicate sends in StrictMode\n const [localVersion, setLocalVersion] = useState(form.version ?? 0);\n const serverVersion = form.version ?? 0;\n\n // Prop name comes from server (embedded in form data)\n const propName = form.__prop;\n\n // Reset local version when server sends a reset (version 0 with new schema)\n useEffect(() => {\n if (form.version === 0 && form.types) {\n localVersionRef.current = 0;\n setLocalVersion(0);\n }\n }, [form.version, form.types]);\n\n // 3. Persistent Schema\n // We only update these when the server explicitly sends them (usually on init)\n const [schema, setSchema] = useState({\n types: form.types ?? {},\n required: form.required ?? [],\n });\n\n if (form.types && form.types !== schema.types) {\n setSchema((prev) => ({ ...prev, types: form.types! }));\n }\n if (form.required && form.required !== schema.required) {\n setSchema((prev) => ({ ...prev, required: form.required! }));\n }\n\n // 4. Values Management\n const [localValues, setLocalValues] = useState<Record<string, any>>(\n form.values ?? {}\n );\n\n // 5. Touched Tracking (client-side only)\n const [touched, setTouched] = useState<string[]>([]);\n\n // Sync from server: Update local values when server sends updates\n useEffect(() => {\n setLocalValues((prev) => ({ ...prev, ...form.values }));\n }, [form.values]);\n\n // 6. Versioned Change Handler\n const setField = useCallback((name: string, value: any) => {\n // Mark field as touched\n setTouched((prev) => (prev.includes(name) ? prev : [...prev, name]));\n\n // Increment version BEFORE state update to avoid StrictMode double-increment\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n\n setLocalValues((prev) => {\n const next = { ...prev, [name]: value };\n\n // Update version state (will be batched with values update)\n setLocalVersion(newVersion);\n\n // Only send event once per version (prevents duplicate sends in StrictMode)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"validate\",\n prop: propName,\n attrs: next,\n _v: newVersion,\n });\n }\n\n return next;\n });\n }, [propName]);\n\n // 6. Identity-Stable Field Props\n const getFieldProps = useCallback(\n (name: string): FieldProps => {\n const type = schema.types[name];\n const value = localValues[name];\n\n const base = { name };\n\n if (type === \"boolean\" || type === \"bool\") {\n return {\n ...base,\n checked: !!value,\n value: undefined as any,\n onChange: (e) =>\n setField(name, (e.target as HTMLInputElement).checked),\n };\n }\n\n return {\n ...base,\n value: value ?? \"\",\n onChange: (e) => setField(name, e.target.value),\n };\n },\n [localValues, schema.types, setField]\n );\n\n const getError = useCallback(\n (name: string) => form.errors?.[name]?.[0],\n [form.errors]\n );\n\n const isRequired = useCallback(\n (name: string) => schema.required.includes(name),\n [schema.required]\n );\n\n const isTouched = useCallback(\n (name: string) => touched.includes(name),\n [touched]\n );\n\n // 7. Versioned Submit Handler\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n\n // Increment version for submit as well\n localVersionRef.current += 1;\n const newVersion = localVersionRef.current;\n setLocalVersion(newVersion);\n\n // Only send once (prevents duplicate sends if called twice)\n if (lastSentVersionRef.current < newVersion) {\n lastSentVersionRef.current = newVersion;\n\n pushEvent?.(\"lri_form\", {\n event: \"submit\",\n prop: propName,\n attrs: localValues,\n _v: newVersion,\n });\n }\n },\n [localValues, propName]\n );\n\n const reset = useCallback(() => {\n setLocalValues(form.values ?? {});\n setTouched([]);\n // Reset local version to match server\n localVersionRef.current = form.version ?? 0;\n setLocalVersion(form.version ?? 0);\n }, [form.values, form.version]);\n\n // 8. Derived States - The \"Validation Lock\"\n // isSyncing: True when client has sent changes that server hasn't acknowledged\n const isSyncing = localVersion > serverVersion;\n\n // isValid: True only when:\n // 1. Form is in sync (server has seen all changes)\n // 2. Server says the form is valid\n // This ensures users cannot submit until server validates the latest data\n const isValid = !isSyncing && (form.isValid ?? false);\n\n return {\n values: localValues,\n errors: form.errors ?? {},\n types: schema.types,\n required: schema.required,\n touched,\n getFieldProps,\n getError,\n isRequired,\n isTouched,\n setField,\n handleSubmit,\n reset,\n isSyncing,\n isValid,\n localVersion,\n serverVersion,\n };\n}\n"],"names":["NullContextProvider","createContext","memo","useMemo","useSyncExternalStore","useRef","createPortal","IslandsManager","useContext","useState","useEffect","useCallback"],"mappings":";;;;;;AAiDA,IAAY,YAKX;AALD,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,GAAY;AACZ,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,GAAW;AACb,CAAC,EALW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;AAuCjB,MAAMA,qBAAmB,GAA4C,CAAC,EAC3E,QAAQ,GACT,KAAK,QAAQ;;AClFP,MAAM,qBAAqB,GAAGC,mBAAa,CAAuB,IAAI,CAAC;;ACC9E,MAAM,YAAY,GAAGC,UAAI,CACvB,CAAC,EACC,IAAI,EACJ,WAAW,GAIZ,KAAI;AACH,IAAA,MAAM,EACJ,SAAS,EACT,eAAe,EACf,EAAE,EACF,SAAS,EACT,WAAW,EACX,EAAE,EACF,UAAU,GACX,GAAG,IAAI;AAER,IAAA,MAAM,iBAAiB,GAAGC,aAAO,CAAC,MAAMD,UAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,uBAAuB,GAAGC,aAAO,CACrC,OAAO,eAAe,GAAGD,UAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,EACtD,CAAC,eAAe,CAAC,CAClB;IACD,MAAM,YAAY,GAAGC,aAAO,CAC1B,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAC3B,CAAC,EAAE,EAAE,WAAW,CAAC,CAClB;IAED,MAAM,YAAY,GAAGC,0BAAoB,CACvC,WAAW,CAAC,gBAAgB,EAC5B,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAC9B,MAAM,IAAI,CACX;AAED,IAAA,MAAM,UAAU,GAAGA,0BAAoB,CACrC,WAAW,CAAC,kBAAkB,EAC9B,WAAW,CAAC,UAAU,EACtB,MAAM,IAAI,CACX;AAED,IAAA,MAAM,WAAW,GAAGC,YAAM,CAAC,KAAK,CAAC;IACjC,IAAI,WAAW,KAAK,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AACvD,QAAA,EAAE,CAAC,SAAS,GAAG,EAAE;AACjB,QAAA,WAAW,CAAC,OAAO,GAAG,IAAI;IAC5B;IAEA,IAAI,CAAC,UAAU,EAAE;AACf,QAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,EAAE,EAAE,CAAC;AACrD,QAAA,OAAO,IAAI;IACb;IAEA,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;IAE3D,MAAM,eAAe,GAAwB,EAAE;IAC/C,IAAI,UAAU,EAAE;AACd,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACzB,YAAA,IAAI,GAAG,IAAI,UAAU,EAAE;gBACrB,eAAe,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC;YACxC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,WAAW,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,YAAY,EAAE;AAE3D,IAAA,MAAM,UAAU,IACd,KAAA,CAAA,aAAA,CAAC,iBAAiB,OAAK,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAA,CAAI,CACrE;AAED,IAAA,MAAM,WAAW,IACf,KAAA,CAAA,aAAA,CAAC,qBAAqB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,EAChD,UAAU,CACoB,CAClC;AAED,IAAA,MAAM,OAAO,GAAG,uBAAuB,IACrC,KAAA,CAAA,aAAA,CAAC,uBAAuB,QAAE,WAAW,CAA2B,KAEhE,WAAW,CACZ;AAED,IAAA,OAAOC,qBAAY,CAAC,OAAO,EAAE,EAAE,CAAC;AAClC,CAAC,CACF;AACD,YAAY,CAAC,WAAW,GAAG,gCAAgC;AAEpD,MAAM,qBAAqB,GAAyC,CAAC,EAC1E,WAAW,GACZ,KAAI;AACH,IAAA,MAAM,gBAAgB,GAAGF,0BAAoB,CAC3C,WAAW,CAAC,wBAAwB,EACpC,WAAW,CAAC,gBAAgB,CAC7B;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;AAE/C,IAAA,OAAO,CAAC,GAAG,CACT,4CAA4C,EAC5C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CACzB;AAED,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,MAChB,KAAA,CAAA,aAAA,CAAC,YAAY,EAAA,EAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAA,CAAI,CACrE,CAAC,CACD;AAEP,CAAC;AACD,qBAAqB,CAAC,WAAW,GAAG,yCAAyC;;ACjHtE,MAAM,wBAAwB,GAEjC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAI;AAC5B,IAAA,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI;AAEtE,IAAA,MAAM,iBAAiB,GAAGD,aAAO,CAAC,MAAMD,UAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,uBAAuB,GAAGC,aAAO,CACrC,OAAO,eAAe,GAAGD,UAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,EACtD,CAAC,eAAe,CAAC,CAClB;IAED,MAAM,YAAY,GAAGE,0BAAoB,CACvC,WAAW,CAAC,gBAAgB,EAC5B,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAC9B,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,CAChC;;AAGD,IAAA,MAAM,qBAAqB,GAAGD,aAAO,CAAC,MAAK;AACzC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO;AACpD,QAAA,IAAI,CAAC,gBAAgB;AAAE,YAAA,OAAO,MAAM,gBAAgB;QACpD,IAAI,gBAAgB,GAAG,KAAK;QAC5B,IAAI,iBAAiB,GAAG,KAAK;AAC7B,QAAA,OAAO,MAAK;YACV,IAAI,CAAC,gBAAgB,EAAE;gBACrB,gBAAgB,GAAG,IAAI;AACvB,gBAAA,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,EAAE;gBAC7C,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,SAAS,IAAI,EAAE;gBACzD,MAAM,YAAY,GAAG,YAAY,EAAE,SAAS,IAAI,EAAE;AAClD,gBAAA,iBAAiB,GAAG,YAAY,KAAK,gBAAgB;YACvD;AACA,YAAA,OAAO,iBAAiB,GAAG,WAAW,CAAC,UAAU,EAAE,GAAG,gBAAgB;AACxE,QAAA,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAE9C,IAAA,MAAM,OAAO,GAAGC,0BAAoB,CAClC,WAAW,CAAC,kBAAkB,EAC9B,WAAW,CAAC,UAAU,EACtB,qBAAqB,CACtB;IAED,MAAM,eAAe,GAAwB,EAAE;IAC/C,IAAI,OAAO,EAAE;AACX,QAAA,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACzB,YAAA,IAAI,GAAG,IAAI,OAAO,EAAE;gBAClB,eAAe,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;YACrC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,YAAY,GAAGD,aAAO,CAAC,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;AAE5E,IAAA,MAAM,UAAU,IACd,oBAAC,iBAAiB,EAAA,EAAA,GACZ,eAAe,EAAA,GACf,YAAY,EAChB,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,SAAS,EAAA,CACpB,CACH;AAED,IAAA,MAAM,WAAW,IACf,KAAA,CAAA,aAAA,CAAC,qBAAqB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,YAAY,EAAA,EAChD,UAAU,CACoB,CAClC;AAED,IAAA,OAAO,uBAAuB,IAC5B,oBAAC,uBAAuB,EAAA,IAAA,EAAE,WAAW,CAA2B,KAEhE,WAAW,CACZ;AACH,CAAC;AAED,wBAAwB,CAAC,WAAW;AAClC,IAAA,6CAA6C;;AC/D/C;AACO,MAAM,cAAc,GAAG,oCAAoC;AAwDlE;AACA;AACA;AAEA,MAAM,mBAAmB,GAA4C,CAAC,EACpE,QAAQ,GACT,KAAK,QAAQ;AAEd,MAAM,kBAAkB,GAAG,CACzB,eAAyC,KACb;IAC5B,MAAM,YAAY,GAChB,eAAe,CAAC,WAAW,IAAI,eAAe,CAAC,IAAI,IAAI,iBAAiB;AAE1E,IAAA,SAAS,YAAY,CAAC,EAAE,QAAQ,EAAiC,EAAA;QAC/D,OAAO,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,EAAE,QAAQ,CAAC;IAC7D;AAEA,IAAA,YAAY,CAAC,WAAW,GAAG,CAAA,8BAAA,EAAiC,YAAY,GAAG;AAC3E,IAAA,OAAO,YAAY;AACrB,CAAC;AAED,MAAM,sBAAsB,GAAG,CAC7B,QAAgB,EAChB,cAAkD,KACZ;AACtC,IAAqB,cAAc,CAAC;IAEpC,SAAS,YAAY,CAAC,KAAqC,EAAA;QACzD,OAAO,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,KAAK,CAAC;IACnD;AAEA,IAAA,YAAY,CAAC,WAAW,GAAG,CAAA,gCAAA,EAAmC,QAAQ,EAAE;AACxE,IAAA,OAAO,YAAY;AACrB,CAAC;AAED,MAAM,4BAA4B,GAAG,MAAkB;IACrD,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC;IACzD,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAC3C,QAAA,WAAW,CAAC,EAAE,GAAG,cAAc;AAC/B,QAAA,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAClC,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;IACxC;AACA,IAAA,OAAO,WAAW;AACpB,CAAC;AAED,MAAM,iBAAiB,GAAG,CACxB,KAAmB,EACnB,IAAgB,KACA;AAChB,IAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG;AAC/B,QAAA,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO;AACjC,QAAA,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI;KAChB;AACD,IAAA,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAClD,IAAA,OAAO,KAAK;AACd,CAAC;AAED,MAAM,qBAAqB,GAAG,CAC5B,KAAmB,EACnB,IAAgB,EAChB,cAAkD,KAClC;IAChB,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC;IAC3E,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAC/B,IAAI,CAAC,EAAE,EACP,KAAK,CAAC,aAAa,CACjB,KAAK,CAAC,UAAU,EAChB,IAAI,EACJ,KAAK,CAAC,aAAa,CAAC,mBAAmB,EAAE;QACvC,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC,CACH,CACF;IAED,OAAO;AACL,QAAA,GAAG,KAAK;AACR,QAAA,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE;KAC3C;AACH,CAAC;AAED;AACA;AACA;AAEA,MAAM,UAAU,GAAY;AAC1B,IAAA,UAAU,EAAE,CAAC,EACX,qBAAqB,GAAG,mBAAmB,EAC3C,qBAAqB,GAAG,qBAAqB,GAC9C,KAAI;AACH,QAAA,MAAM,WAAW,GAAG,4BAA4B,EAAE;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;AAE7C,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B;AACzD,QAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAc;AAC5C,QAAA,MAAM,UAAU,GAAG,EAAE,OAAO,EAAE,IAAkC,EAAE;AAClE,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAc;AAC9C,QAAA,MAAM,gBAAgB,GAAG,EAAE,OAAO,EAAE,EAAgC,EAAE;AACtE,QAAA,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAc;AACpD,QAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAiB;AAC7C,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA2B;AAC3D,QAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB;AAErD,QAAA,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,UAAkB,KACxD,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AAE7B,QAAA,MAAM,WAAW,GAAsB;AACrC,YAAA,QAAQ,EAAE,CAAC,QAAgB,KAAK,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI;AAChE,YAAA,gBAAgB,EAAE,CAAC,EAAc,KAAI;AACnC,gBAAA,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,MAAM,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,CAAC;AACD,YAAA,UAAU,EAAE,MAAM,UAAU,CAAC,OAAO;AACpC,YAAA,kBAAkB,EAAE,CAAC,EAAc,KAAI;AACrC,gBAAA,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,MAAM,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1C,CAAC;AACD,YAAA,gBAAgB,EAAE,MAAM,gBAAgB,CAAC,OAAO;AAChD,YAAA,wBAAwB,EAAE,CAAC,EAAc,KAAI;AAC3C,gBAAA,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,MAAM,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,CAAC;AACD,YAAA,cAAc,EAAE,CAAC,QAAgB,EAAE,UAAkB,KAAI;gBACvD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAC9C,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;YACpC,CAAC;YACD,iBAAiB,EAAE,CACjB,QAAgB,EAChB,UAAkB,EAClB,EAAc,EACd,MAAqB,KACnB;gBACF,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC;gBAC9C,IAAI,MAAM,EAAE;AACV,oBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;gBAChC;gBACA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBAC9B,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC;gBACtC;gBACA,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,gBAAA,OAAO,MAAK;oBACV,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;oBACrC,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE;AACzC,wBAAA,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;oBAC3B;AACF,gBAAA,CAAC;YACH,CAAC;SACF;AAED,QAAA,MAAM,KAAK,GAAiB;YAC1B,UAAU;YACV,UAAU;YACV,cAAc;YACd,gBAAgB;YAChB,gBAAgB;YAChB,sBAAsB;YACtB,YAAY;YACZ,gBAAgB;YAChB,aAAa;AACb,YAAA,KAAK,EAAE,EAAE,CAAC,cAAc,GAAG,IAAI,EAAE;YACjC,WAAW;SACZ;AAED,QAAA,MAAM,0BAA0B,GAAG,kBAAkB,CACnD,qBAAqB,CACtB;QAED,IAAI,CAAC,MAAM,CACT,KAAK,CAAC,aAAa,CACjB,KAAK,CAAC,UAAU,EAChB,IAAI,EACJ,KAAK,CAAC,aAAa,CACjB,0BAA0B,EAC1B,IAAI,EACJ,KAAK,CAAC,aAAa,CAAC,qBAAqB,EAAE;YACzC,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC,CACH,CACF,CACF;AAED,QAAA,OAAO,KAAK;IACd,CAAC;IACD,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,GAAG,wBAAwB,KAAI;AACtE,QAAA,QAAQ,IAAI,CAAC,WAAW;AACtB,YAAA,KAAK,cAAc;gBACjB,OAAO,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC;AAC3D,YAAA;AACE,gBAAA,OAAO,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC;;IAE3C,CAAC;AACD,IAAA,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,KAAI;AAC3B,QAAA,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;AAE3B,QAAA,MAAM,YAAY,GAAG,CAAA,EAAG,EAAE,GAAG;QAC7B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE;AAC3C,YAAA,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;AAChC,gBAAA,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC;AAC9B,gBAAA,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC;AAClC,gBAAA,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;YACjC;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;YACnB,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;AACzB,YAAA,MAAM,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,cAAc,EAAE,GAAG,KAAK,CAAC,KAAK;YAC5D,OAAO;AACL,gBAAA,GAAG,KAAK;AACR,gBAAA,KAAK,EAAE,cAAc;aACtB;QACH;aAAO;AACL,YAAA,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO;AACtE,YAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,GAAG,SAAS;AAC1C,YAAA,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAClD,YAAA,OAAO,KAAK;QACd;IACF,CAAC;IACD,iBAAiB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAI;AAC5C,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;AACrD,QAAA,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;AACzD,QAAA,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAC1C,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAI;QAChC,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE;AAC/C,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE;AAC9D,QAAA,IAAI,eAAe,GAAG,YAAY,EAAE;AAClC,YAAA,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG;gBACzB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;AACnC,gBAAA,GAAG,OAAO;aACX;AACD,YAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C;AAEA,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,YAAY,EAAE,CAAC,KAAK,KAAI;AACtB,QAAA,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI;AAC/B,QAAA,OAAO,KAAK;IACd,CAAC;IACD,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,KAAI;AAC9D,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AACvC,QAAA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC;AAC9C,QAAA,OAAO,KAAK;IACd,CAAC;AACD,IAAA,YAAY,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,KAAI;AAC1D,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE;AACvC,QAAA,IAAI,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;QAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;QAE3C,QAAQ,MAAM;YACZ,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;gBACxB;YACF,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;AAC1D,gBAAA,IAAI,GAAG,KAAK,EAAE,EAAE;AACd,oBAAA,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;AAClB,oBAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE;gBACzC;gBACA;YACF,KAAK,YAAY,CAAC,MAAM;AACtB,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;gBAChD;YACF,KAAK,YAAY,CAAC,KAAK;gBACrB,KAAK,GAAG,EAAE;gBACV;;AAGJ,QAAA,IAAI,MAAM,EAAE,MAAM,EAAE;AAClB,YAAA,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9B;AAAO,aAAA,IAAI,MAAM,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE;YACrE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;QACtC;QAEA,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;AAClC,QAAA,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AACtD,QAAA,OAAO,KAAK;IACd,CAAC;CACF;;AC7TD;AACA;AACA;AAEA,SAAS,iBAAiB,CAAC,IAAkB,EAAA;AAC3C,IAAA,OAAO,CAAC,SAAiB,EAAE,OAAY,KAAI;AACzC,QAAA,IAAI,CAAC,WAAW,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC;AACxD,IAAA,CAAC;AACH;AAEA;AACA;AACA;AAEA,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAA2B;AAElE,MAAM,aAAa,GAAG,CAAC,KAAc,KAAgC;IACnE,IAAI,OAAO,KAAK,KAAK,UAAU;AAAE,QAAA,OAAO,KAAK;;AAE7C,IAAA,IAAK,KAAa,CAAC,SAAS,EAAE,gBAAgB;AAAE,QAAA,OAAO,KAAK;;IAE5D,IAAK,KAAa,CAAC,SAAS;AAAE,QAAA,OAAO,KAAK;;AAE1C,IAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,mBAAmB,GAAG,OAC1B,UAAsB,EACtB,aAAqB,EACrB,sBAAgD,KAItC;AACV,IAAA,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC;IAExC,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,IAAI;IACb;;IAGA,MAAM,MAAM,GAAG,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAAC;IACzD,IAAI,MAAM,EAAE;QACV,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,sBAAsB,EAAE;IACvE;;AAGA,IAAA,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE;AACzB,QAAA,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE;AAC1B,QAAA,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO;AAC7B,QAAA,uBAAuB,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC;AACrD,QAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,sBAAsB,EAAE;IAC/D;;AAGA,IAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;QAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,sBAAsB,EAAE;IACvE;;IAGA,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,SAAS;AAC3B,QAAA,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,sBAAsB;KAClE;AACH,CAAC;AAED;AACA;AACA;SAEgB,WAAW,CAAC,EAC1B,OAAO,EAAE,UAAU,GAAG,EAAE,EACxB,qBAAqB,GAAGH,qBAAmB,EAC3C,OAAO,GAAGO,UAAc,GACL,EAAA;AACnB,IAAA,OAAO,CAAC,GAAG,CAAC,CAAA,iCAAA,CAAmC,CAAC;IAChD,IAAI,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAEhE,IAAI,gBAAgB,GAAG,KAAK;AAC5B,IAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU;IACvC,IAAI,0BAA0B,GAAG,KAAK;AAEtC,IAAA,MAAM,IAAI,GAIN;QACF,OAAO,GAAA;YACL,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AACxC,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,mDAAA,CAAqD,CAAC;gBACpE;YACF;YAEA,IAAI,CAAC,0BAA0B,EAAE;gBAC/B,0BAA0B,GAAG,IAAI;gBACjC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,wBAAwB,EAAE,MAAK;oBAChD,gBAAgB,GAAG,KAAK;AACxB,oBAAA,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC;AACnD,gBAAA,CAAC,CAAC;YACJ;;YAGA,IAAI,CAAC,gBAAgB,EAAE;gBACrB,gBAAgB,GAAG,IAAI;gBACvB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,IAAI,KAAI;oBACjC,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC;AAC1D,gBAAA,CAAC,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,KAAK,KAAI;oBACpC,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC;AAC3D,gBAAA,CAAC,CAAC;YACJ;AAEA,YAAA,MAAM,EACJ,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,WAAW,EACpB,cAAc,EAAE,kBAAkB,GACnC,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO;YACnB,IAAI,CAAC,aAAa,EAAE;gBAClB,OAAO,CAAC,KAAK,CACX,CAAA,4BAAA,EAA+B,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,6BAAA,CAA+B,CACzE;gBACD;YACF;AAEA,YAAA,IAAI,MAAM,GAA4C;AACpD,gBAAA,CAAC,EAAE,EAAE;AACL,gBAAA,CAAC,EAAE,EAAE;AACL,gBAAA,CAAC,EAAE,CAAC;aACL;YACD,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI;AACF,oBAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBACjC;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,+BAAA,CAAiC,EACtD,CAAC,CACF;gBACH;YACF;YAEA,IAAI,YAAY,GAAwB,EAAE;YAC1C,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI;oBACF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;oBACxC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAI;AACjC,wBAAA,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC;AAC7B,wBAAA,IAAI,KAAK,EAAE,GAAG,KAAK,SAAS,EAAE;4BAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACtC,4BAAA,YAAY,GAAG,OAAO,CAAC,gBAAgB,CACrC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,UAAU,EACV,KAAK,CAAC,CAAC,CACR;AACD,4BAAA,MAAM,MAAM,GAAiB;AAC3B,gCAAA,IAAI,EAAE,UAAU;gCAChB,OAAO,EAAE,KAAK,CAAC,CAAC;6BACjB;AACD,4BAAA,YAAY,CAAC,QAAQ,CAAC,GAAG,MAAM;wBACjC;6BAAO;AACL,4BAAA,YAAY,CAAC,QAAQ,CAAC,GAAG,KAAK;wBAChC;AACF,oBAAA,CAAC,CAAC;gBACJ;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,8BAAA,CAAgC,EACrD,CAAC,CACF;gBACH;YACF;;YAGA,IAAI,cAAc,GAAwB,EAAE;YAC5C,IAAI,WAAW,EAAE;AACf,gBAAA,IAAI;oBACF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;oBAC5C,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,GAAG,KAAI;wBACnC,cAAc,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC;AAChD,oBAAA,CAAC,CAAC;AACF,oBAAA,IAAI,CAAC,kBAAkB;AACrB,wBAAA,MAAM,wCAAwC;oBAChD,cAAc,CAAC,SAAS,GAAG,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC;gBAC7D;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,CAAA,QAAA,EAAW,IAAI,CAAC,EAAE,CAAC,EAAE,CAAA,gCAAA,CAAkC,EACvD,CAAC,CACF;gBACH;YACF;AAEA,YAAA,IAAI,WAAwB;YAC5B,QAAQ,OAAO;AACb,gBAAA,KAAK,WAAW;oBACd,WAAW,GAAG,WAAW;oBACzB;AACF,gBAAA,KAAK,cAAc;oBACjB,WAAW,GAAG,cAAc;oBAC5B;AACF,gBAAA;oBACE,WAAW,GAAG,MAAM;;AAGxB,YAAA,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC;AACzC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;AACvB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE;AAElB,YAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAEvB,CAAC,YAAW;gBACV,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC5C,UAAU,EACV,aAAa,EACbP,qBAAmB,CACpB;AAED,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE;AAC9B,gBAAA,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;gBAE1B,IAAI,CAAC,YAAY,EAAE;AACjB,oBAAA,OAAO,CAAC,KAAK,CACX,oCAAoC,aAAa,CAAA,WAAA,CAAa,CAC/D;oBACD;gBACF;gBAEA,YAAY,GAAG,OAAO,CAAC,iBAAiB,CACtC,YAAY,EACZ,IAAI,EACJ,YAAY,CACb;AAED,gBAAA,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE;AAC/C,oBAAA,EAAE,EAAE,IAAI;oBACR,EAAE;oBACF,SAAS,EAAE,YAAY,CAAC,SAAS;oBACjC,eAAe,EAAE,YAAY,CAAC,eAAe;oBAC7C,WAAW;oBACX,SAAS;oBACT,aAAa,EACX,WAAW,KAAK;0BACZ,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc;AAChD,0BAAE,IAAI;oBACV,UAAU,EAAE,MAAM,CAAC,CAAC;AACrB,iBAAA,CAAC;YACJ,CAAC,GAAG;YAEJ,IAAI,CAAC,WAAW,CACd,OAAO,EACP,CAAC,OAA0C,KAAI;AAC7C,gBAAA,IAAI,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;oBAAE;gBAE5B,MAAM,KAAK,GAAwB,EAAE;AACrC,gBAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;oBAC/C,IAAI,GAAG,KAAK,GAAG;wBAAE;oBACjB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC;AAC7B,oBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;wBAChC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK;oBAC9B;AACF,gBAAA,CAAC,CAAC;AAEF,gBAAA,YAAY,GAAG,OAAO,CAAC,iBAAiB,CACtC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,KAAK,CACN;AACH,YAAA,CAAC,CACF;YAED,IAAI,CAAC,WAAW,CACd,OAAO,EACP,CAAC,OAA0D,KAAI;AAC7D,gBAAA,IAAI,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;oBAAE;gBAE5B,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,gBAAA,IAAI,CAAC,UAAU;oBAAE;gBAEjB,YAAY,GAAG,OAAO,CAAC,YAAY,CACjC,YAAY,EACZ,IAAI,CAAC,EAAE,CAAC,EAAE,EACV,UAAU,EACV,OAAO,CAAC,CAAC,EACT,OAAO,CAAC,CAAC,CACV;AACH,YAAA,CAAC,CACF;QACH,CAAC;QAED,OAAO,GAAA;YACL,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5C,CAAC;QAED,SAAS,GAAA;YACP,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5C,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAChC,YAAA,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAChE,CAAC;KACF;AAED,IAAA,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE;AACnC;;AC3UM,SAAU,SAAS,CACvB,MAAoB,EACpB,OAA6B,EAAA;AAE7B,IAAA,MAAM,OAAO,GAAGQ,gBAAU,CAAC,qBAAqB,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;IACtE;IAEA,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO;IAE7C,MAAM,SAAS,GAAGL,aAAO,CACvB,MAAM,CAAC,EAAc,KACnB,WAAW,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE;QACvD,KAAK,EAAE,OAAO,EAAE,KAAK;QACrB,MAAM,EAAE,OAAO,EAAE,MAA+C;AACjE,KAAA,CAAC,EACJ,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CACtE;AAED,IAAA,MAAM,WAAW,GAAGA,aAAO,CACzB,MAAM,MAAM,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAQ,EACpE,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CACrC;AAED,IAAA,OAAOC,0BAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC,OAAc,CAAC;AAClF;;ACiCM,SAAU,OAAO,CACrB,IAAe,EACf,SAAuB,EAAA;;;;IAKvB,MAAM,eAAe,GAAGC,YAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACjD,MAAM,kBAAkB,GAAGA,YAAM,CAAC,CAAC,CAAC,CAAC;AACrC,IAAA,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGI,cAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;AACnE,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC;;AAGvC,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM;;IAG5BC,eAAS,CAAC,MAAK;QACb,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE;AACpC,YAAA,eAAe,CAAC,OAAO,GAAG,CAAC;YAC3B,eAAe,CAAC,CAAC,CAAC;QACpB;IACF,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;;;AAI9B,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGD,cAAQ,CAAC;AACnC,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;AACvB,QAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;AAC9B,KAAA,CAAC;AAEF,IAAA,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE;AAC7C,QAAA,SAAS,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,EAAE,CAAC,CAAC;IACxD;AACA,IAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE;AACtD,QAAA,SAAS,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAS,EAAE,CAAC,CAAC;IAC9D;;AAGA,IAAA,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAGA,cAAQ,CAC5C,IAAI,CAAC,MAAM,IAAI,EAAE,CAClB;;IAGD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGA,cAAQ,CAAW,EAAE,CAAC;;IAGpDC,eAAS,CAAC,MAAK;AACb,QAAA,cAAc,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACzD,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;IAGjB,MAAM,QAAQ,GAAGC,iBAAW,CAAC,CAAC,IAAY,EAAE,KAAU,KAAI;;AAExD,QAAA,UAAU,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;;AAGpE,QAAA,eAAe,CAAC,OAAO,IAAI,CAAC;AAC5B,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO;AAE1C,QAAA,cAAc,CAAC,CAAC,IAAI,KAAI;AACtB,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,GAAG,KAAK,EAAE;;YAGvC,eAAe,CAAC,UAAU,CAAC;;AAG3B,YAAA,IAAI,kBAAkB,CAAC,OAAO,GAAG,UAAU,EAAE;AAC3C,gBAAA,kBAAkB,CAAC,OAAO,GAAG,UAAU;gBAEvC,SAAS,GAAG,UAAU,EAAE;AACtB,oBAAA,KAAK,EAAE,UAAU;AACjB,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,KAAK,EAAE,IAAI;AACX,oBAAA,EAAE,EAAE,UAAU;AACf,iBAAA,CAAC;YACJ;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;;AAGd,IAAA,MAAM,aAAa,GAAGA,iBAAW,CAC/B,CAAC,IAAY,KAAgB;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAC/B,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC;AAE/B,QAAA,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE;QAErB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,EAAE;YACzC,OAAO;AACL,gBAAA,GAAG,IAAI;gBACP,OAAO,EAAE,CAAC,CAAC,KAAK;AAChB,gBAAA,KAAK,EAAE,SAAgB;AACvB,gBAAA,QAAQ,EAAE,CAAC,CAAC,KACV,QAAQ,CAAC,IAAI,EAAG,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAC;aACzD;QACH;QAEA,OAAO;AACL,YAAA,GAAG,IAAI;YACP,KAAK,EAAE,KAAK,IAAI,EAAE;AAClB,YAAA,QAAQ,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAChD;IACH,CAAC,EACD,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CACtC;IAED,MAAM,QAAQ,GAAGA,iBAAW,CAC1B,CAAC,IAAY,KAAK,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAC1C,CAAC,IAAI,CAAC,MAAM,CAAC,CACd;IAED,MAAM,UAAU,GAAGA,iBAAW,CAC5B,CAAC,IAAY,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAChD,CAAC,MAAM,CAAC,QAAQ,CAAC,CAClB;IAED,MAAM,SAAS,GAAGA,iBAAW,CAC3B,CAAC,IAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EACxC,CAAC,OAAO,CAAC,CACV;;AAGD,IAAA,MAAM,YAAY,GAAGA,iBAAW,CAC9B,CAAC,CAAmB,KAAI;QACtB,CAAC,EAAE,cAAc,EAAE;;AAGnB,QAAA,eAAe,CAAC,OAAO,IAAI,CAAC;AAC5B,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO;QAC1C,eAAe,CAAC,UAAU,CAAC;;AAG3B,QAAA,IAAI,kBAAkB,CAAC,OAAO,GAAG,UAAU,EAAE;AAC3C,YAAA,kBAAkB,CAAC,OAAO,GAAG,UAAU;YAEvC,SAAS,GAAG,UAAU,EAAE;AACtB,gBAAA,KAAK,EAAE,QAAQ;AACf,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,WAAW;AAClB,gBAAA,EAAE,EAAE,UAAU;AACf,aAAA,CAAC;QACJ;AACF,IAAA,CAAC,EACD,CAAC,WAAW,EAAE,QAAQ,CAAC,CACxB;AAED,IAAA,MAAM,KAAK,GAAGA,iBAAW,CAAC,MAAK;AAC7B,QAAA,cAAc,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACjC,UAAU,CAAC,EAAE,CAAC;;QAEd,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC;AAC3C,QAAA,eAAe,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;;;AAI/B,IAAA,MAAM,SAAS,GAAG,YAAY,GAAG,aAAa;;;;;AAM9C,IAAA,MAAM,OAAO,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IAErD,OAAO;AACL,QAAA,MAAM,EAAE,WAAW;AACnB,QAAA,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO;QACP,aAAa;QACb,QAAQ;QACR,UAAU;QACV,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,KAAK;QACL,SAAS;QACT,OAAO;QACP,YAAY;QACZ,aAAa;KACd;AACH;;;;;;"}
package/package.json CHANGED
@@ -1,16 +1,18 @@
1
1
  {
2
2
  "name": "@live-react-islands/core",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Core React integration for LiveReactIslands - Phoenix LiveView hook and utilities",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.esm.js",
8
8
  "exports": {
9
9
  ".": {
10
+ "types": "./dist/index.d.ts",
10
11
  "import": "./dist/index.esm.js",
11
12
  "require": "./dist/index.js"
12
13
  },
13
14
  "./ssr": {
15
+ "types": "./dist/ssr.d.ts",
14
16
  "import": "./dist/ssr.esm.js",
15
17
  "require": "./dist/ssr.js"
16
18
  }
@@ -24,7 +26,8 @@
24
26
  "build": "rollup -c",
25
27
  "dev": "rollup -c -w",
26
28
  "test": "jest",
27
- "clean": "rm -rf dist"
29
+ "clean": "rm -rf dist",
30
+ "prepublishOnly": "cp ../../../README.md ./"
28
31
  },
29
32
  "keywords": [
30
33
  "phoenix",
@@ -51,13 +54,16 @@
51
54
  "@rollup/plugin-commonjs": "^25.0.7",
52
55
  "@rollup/plugin-node-resolve": "^15.2.3",
53
56
  "@rollup/plugin-typescript": "^11.1.6",
57
+ "@testing-library/dom": "^10.4.1",
54
58
  "@testing-library/jest-dom": "^6.1.5",
55
- "@testing-library/react": "^14.1.2",
59
+ "@testing-library/react": "^16.3.2",
56
60
  "@types/jest": "^29.5.12",
57
61
  "@types/react": "^18.3.12",
58
62
  "@types/react-dom": "^18.3.1",
59
63
  "jest": "^29.7.0",
60
64
  "jest-environment-jsdom": "^29.7.0",
65
+ "react": "19.2.1",
66
+ "react-dom": "19.2.1",
61
67
  "rollup": "^4.24.0",
62
68
  "ts-jest": "^29.1.2",
63
69
  "tslib": "^2.8.1",
@@ -251,7 +251,7 @@ export function createHooks({
251
251
  const islandConfig = await resolveIslandConfig(
252
252
  islandsMap,
253
253
  componentName,
254
- SharedContextProvider
254
+ NullContextProvider
255
255
  );
256
256
 
257
257
  if (!pendingMounts.has(elId)) return;