@ai-matrx/summon 0.1.18 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -1
- package/dist/index.cjs +11 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/persistence.cjs +1 -1
- package/dist/persistence.cjs.map +1 -1
- package/dist/persistence.js +2 -2
- package/dist/persistence.js.map +1 -1
- package/dist/react.cjs +2 -2
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +2 -2
- package/dist/react.js.map +1 -1
- package/dist/window.cjs +25 -49
- package/dist/window.cjs.map +1 -1
- package/dist/window.js +15 -39
- package/dist/window.js.map +1 -1
- package/package.json +4 -4
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/SummonProvider.tsx","../src/react/context.ts","../src/react/fallbacks.tsx","../src/react/storeHooks.ts","../src/react/keepAlive.ts","../src/react/loaderCache.ts","../src/react.ts","../src/react/events.ts","../src/react/SummonHost.tsx","../src/react/hostRenders.ts","../src/react/instanceBody.tsx","../src/react/OverlayErrorBoundary.tsx","../src/react/instance.tsx","../src/react/hooks.ts"],"sourcesContent":["// `<SummonProvider>` — mounts the overlays store on the package's own context (the host's store\n// when passed — AI Matrx mounts `summonReducers` into its one store — else a private store made\n// once), the resolved ports, and the render-layer knobs (fallbacks, error extras, wrapper,\n// keep-alive cap, import timeout).\n\nimport { useEffect, useMemo, useRef, useState, type ComponentType, type ReactNode } from \"react\";\nimport { Provider } from \"react-redux\";\nimport type { Store } from \"@reduxjs/toolkit\";\nimport { resolvePorts, type SummonPorts } from \"@ai-matrx/summon\";\nimport { createSummonStore } from \"@ai-matrx/summon\";\nimport {\n SummonConfigContext,\n SummonPortsContext,\n SummonStoreContext,\n type OverlayErrorExtrasContext,\n type OverlayErrorFallbackProps,\n type OverlayLoadingFallbackProps,\n type OverlayRenderContext,\n type SummonReactConfig,\n} from \"./context\";\nimport { OverlayErrorFallback, OverlayLoadingFallback } from \"./fallbacks\";\nimport { KeepAliveRegistry } from \"./keepAlive\";\nimport { LoaderCache } from \"./loaderCache\";\n\nimport { DEFAULT_IMPORT_TIMEOUT_MS, DEFAULT_KEEP_ALIVE_LIMIT, DEFAULT_STALL_WARN_MS } from \"./storeHooks\";\nexport { DEFAULT_IMPORT_TIMEOUT_MS, DEFAULT_KEEP_ALIVE_LIMIT, DEFAULT_STALL_WARN_MS };\n\nexport interface SummonProviderProps {\n /** The host's Redux store with `summonReducers` mounted at their root keys. Omit for a private store. */\n readonly store?: Store<unknown>;\n /** Host ports; anything omitted uses the working default. */\n readonly ports?: Partial<SummonPorts>;\n readonly fallbacks?: {\n readonly loading?: ComponentType<OverlayLoadingFallbackProps>;\n readonly error?: ComponentType<OverlayErrorFallbackProps>;\n };\n /** Extra controls in the default error card's footer (AI Matrx: \"Copy for AI\"). */\n readonly errorReportExtras?: (context: OverlayErrorExtrasContext) => ReactNode;\n /** Wrap every rendered overlay (AI Matrx: its surface layer boundary). */\n readonly renderWrapper?: (node: ReactNode, context: OverlayRenderContext) => ReactNode;\n /** Most closed-but-alive (`keepAlive: \"hidden\"`) instances kept mounted. Default 8. */\n readonly keepAliveLimit?: number;\n /** A render-module import that has not settled by then becomes a ChunkLoadError. Default 12 s. */\n readonly importTimeoutMs?: number;\n /** When the loading fallback reports a stall to the error port. Default 10 s. */\n readonly stallWarnMs?: number;\n readonly children?: ReactNode;\n}\n\nexport function SummonProvider({\n store,\n ports,\n fallbacks,\n errorReportExtras,\n renderWrapper,\n keepAliveLimit = DEFAULT_KEEP_ALIVE_LIMIT,\n importTimeoutMs = DEFAULT_IMPORT_TIMEOUT_MS,\n stallWarnMs = DEFAULT_STALL_WARN_MS,\n children,\n}: SummonProviderProps) {\n const resolvedPorts = useMemo(() => resolvePorts(ports), [ports]);\n const [privateStore] = useState(() => (store ? null : createSummonStore({ ports: resolvedPorts })));\n const activeStore: Store<unknown> = store ?? (privateStore as Store<unknown>);\n\n const timeoutRef = useRef(importTimeoutMs);\n timeoutRef.current = importTimeoutMs;\n const [keepAlive] = useState(() => new KeepAliveRegistry(keepAliveLimit));\n const [loaders] = useState(() => new LoaderCache({ timeoutMs: () => timeoutRef.current }));\n useEffect(() => keepAlive.setLimit(keepAliveLimit), [keepAlive, keepAliveLimit]);\n\n const loading = fallbacks?.loading ?? OverlayLoadingFallback;\n const error = fallbacks?.error ?? OverlayErrorFallback;\n const config = useMemo<SummonReactConfig>(\n () => ({\n loadingFallback: loading,\n errorFallback: error,\n errorReportExtras: errorReportExtras ?? null,\n renderWrapper: renderWrapper ?? null,\n importTimeoutMs,\n stallWarnMs,\n keepAlive,\n loaders,\n }),\n [loading, error, errorReportExtras, renderWrapper, importTimeoutMs, stallWarnMs, keepAlive, loaders],\n );\n\n return (\n <Provider store={activeStore} context={SummonStoreContext}>\n <SummonPortsContext.Provider value={resolvedPorts}>\n <SummonConfigContext.Provider value={config}>{children}</SummonConfigContext.Provider>\n </SummonPortsContext.Provider>\n </Provider>\n );\n}\n","// The React section's own contexts. The overlays store rides its OWN react-redux context\n// (chat-package pattern), so a private overlays store never collides with a host's store and a\n// host that mounts `summonReducers` into its one store simply passes it in.\n\nimport { createContext, type ComponentType, type ReactNode } from \"react\";\nimport type { KeepAliveRegistry } from \"./keepAlive\";\nimport type { LoaderCache } from \"./loaderCache\";\nimport type { OverlayRenderContext, OverlayErrorExtrasContext } from \"@ai-matrx/summon/root\";\n\n// One identity: the store and ports contexts live in the light root section.\nexport { SummonStoreContext, SummonPortsContext } from \"@ai-matrx/summon/root\";\nexport type { OverlayRenderContext, OverlayErrorExtrasContext };\n\nexport interface OverlayLoadingFallbackProps {\n readonly overlayId: string;\n readonly label: string;\n}\n\nexport interface OverlayErrorFallbackProps {\n readonly overlayId: string;\n readonly instanceId: string;\n readonly label: string;\n readonly error: unknown;\n readonly componentStack: string | null;\n /** Re-import the render module and mount again. */\n readonly retry: () => void;\n /** Close this instance (no reload). */\n readonly close: () => void;\n /** Host-provided extras (AI Matrx: \"Copy for AI\"), already rendered for this error. */\n readonly extras: ReactNode;\n}\n\nexport interface SummonReactConfig {\n readonly loadingFallback: ComponentType<OverlayLoadingFallbackProps>;\n readonly errorFallback: ComponentType<OverlayErrorFallbackProps>;\n readonly errorReportExtras: ((context: OverlayErrorExtrasContext) => ReactNode) | null;\n readonly renderWrapper: ((node: ReactNode, context: OverlayRenderContext) => ReactNode) | null;\n readonly importTimeoutMs: number;\n readonly stallWarnMs: number;\n readonly keepAlive: KeepAliveRegistry;\n readonly loaders: LoaderCache;\n}\n\nexport const SummonConfigContext = createContext<SummonReactConfig | null>(null);\nSummonConfigContext.displayName = \"SummonConfigContext\";\n","// The default loading and error fallbacks every overlay renders through. A host replaces either\n// with `<SummonProvider fallbacks>`; AI Matrx adds its \"Copy for AI\" through `errorReportExtras`.\n// Design-system components and tokens only — no app imports.\n\nimport { useEffect } from \"react\";\nimport { Button } from \"@ai-matrx/design-system\";\nimport type { OverlayErrorFallbackProps, OverlayLoadingFallbackProps } from \"./context\";\nimport { useSummonConfig, useSummonPorts } from \"./storeHooks\";\n\nexport interface NormalizedOverlayError {\n readonly name: string;\n readonly message: string;\n readonly stack: string | null;\n readonly isChunkLoadError: boolean;\n}\n\nexport function normalizeOverlayError(error: unknown): NormalizedOverlayError {\n if (error instanceof Error) {\n const isChunkLoadError =\n error.name === \"ChunkLoadError\" ||\n /Loading chunk [\\w-]+ failed|Failed to fetch dynamically imported module|Importing a module script failed/i.test(\n error.message,\n );\n return { name: error.name, message: error.message, stack: error.stack ?? null, isChunkLoadError };\n }\n return { name: \"Error\", message: typeof error === \"string\" ? error : String(error), stack: null, isChunkLoadError: false };\n}\n\n/**\n * Spinner while the render module is in flight. Never blank. At the stall threshold it reports\n * once through the error port; the loader's import timeout (later) turns a hung import into a\n * real error so the error fallback takes over.\n */\nexport function OverlayLoadingFallback({ overlayId, label }: OverlayLoadingFallbackProps) {\n const ports = useSummonPorts();\n const { stallWarnMs } = useSummonConfig();\n useEffect(() => {\n const timer = setTimeout(() => {\n ports.errors.capture(new Error(`Overlay \"${overlayId}\" still loading after ${stallWarnMs}ms`), {\n stage: \"overlay-load-stall\",\n overlayId,\n level: \"warning\",\n });\n }, stallWarnMs);\n return () => clearTimeout(timer);\n }, [ports, overlayId, stallWarnMs]);\n\n return (\n <div className=\"pointer-events-none fixed inset-0 z-[2147483000] flex items-center justify-center p-4\">\n <div\n role=\"status\"\n aria-label={`Loading ${label}`}\n className=\"pointer-events-auto flex items-center gap-3 rounded-xl border border-border bg-card px-5 py-4 text-sm text-muted-foreground shadow-[var(--elevation-2)]\"\n >\n <span aria-hidden className=\"size-4 animate-spin rounded-full border-2 border-border border-t-primary\" />\n <span>Loading…</span>\n </div>\n </div>\n );\n}\n\n/** The error card: what failed, and a way out that never needs a page reload. */\nexport function OverlayErrorFallback({ label, error, retry, close, extras }: OverlayErrorFallbackProps) {\n const e = normalizeOverlayError(error);\n return (\n <div className=\"pointer-events-none fixed inset-0 z-[2147483001] flex items-center justify-center p-4\">\n <div\n role=\"alertdialog\"\n aria-label={`${label} failed to load`}\n className=\"pointer-events-auto flex max-h-[85dvh] w-full max-w-lg flex-col overflow-hidden rounded-xl border border-destructive bg-card shadow-[var(--elevation-3)]\"\n >\n <div className=\"border-b border-border px-5 py-4\">\n <h2 className=\"text-sm font-semibold text-foreground\">{label} failed to load</h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {e.isChunkLoadError ? \"Part of it did not finish loading.\" : \"It hit an error while rendering.\"}\n </p>\n </div>\n <div className=\"min-h-0 flex-1 overflow-auto px-5 py-4\">\n <div className=\"rounded-lg bg-muted px-3 py-2 font-mono text-xs text-foreground\">\n <span className=\"text-destructive\">{e.name}</span>: {e.message}\n </div>\n </div>\n <div className=\"flex items-center justify-between gap-2 border-t border-border px-5 py-3\">\n <div>{extras}</div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={close}>\n Close\n </Button>\n <Button variant=\"primary\" size=\"sm\" onClick={retry}>\n Try again\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n if (typeof window !== \"undefined\") window.location.reload();\n }}\n >\n Reload page\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","// The store hooks live in the light root section (one context identity); the render-layer config\n// hook stays here: the nearest SummonProvider's config, else one built from the root's settings.\nimport { useContext } from \"react\";\nimport { getSummonHostConfig, getSummonHostVersion } from \"@ai-matrx/summon/root\";\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\nimport { SummonConfigContext, type SummonReactConfig } from \"./context\";\nimport { OverlayErrorFallback, OverlayLoadingFallback } from \"./fallbacks\";\nimport { KeepAliveRegistry } from \"./keepAlive\";\nimport { LoaderCache } from \"./loaderCache\";\n\nexport {\n useSummonSelector,\n useSummonDispatch,\n useSummonStore,\n useSummonPorts,\n useOptionalSummonPorts,\n useOptionalSummonStore,\n type SummonReactDispatch,\n type SummonReactStore,\n} from \"@ai-matrx/summon/root\";\n\nexport const DEFAULT_KEEP_ALIVE_LIMIT = 8;\nexport const DEFAULT_IMPORT_TIMEOUT_MS = 12_000;\nexport const DEFAULT_STALL_WARN_MS = 10_000;\n\ninterface HostConfigSlot {\n version: number;\n config: SummonReactConfig | null;\n keepAlive: KeepAliveRegistry | null;\n loaders: LoaderCache | null;\n}\n\nconst hostConfigSlot = (): HostConfigSlot =>\n globalSlot<HostConfigSlot>(\"ai-matrx.summon.hostReactConfig\", () => ({ version: -1, config: null, keepAlive: null, loaders: null }));\n\n/** The render config when no SummonProvider is above: the root's settings, one keep-alive and loader cache per page. */\nexport function hostReactConfig(): SummonReactConfig {\n const s = hostConfigSlot();\n const version = getSummonHostVersion();\n if (s.config && s.version === version) return s.config;\n const host = getSummonHostConfig();\n s.keepAlive ??= new KeepAliveRegistry(DEFAULT_KEEP_ALIVE_LIMIT);\n s.loaders ??= new LoaderCache({ timeoutMs: () => DEFAULT_IMPORT_TIMEOUT_MS });\n s.config = {\n loadingFallback: OverlayLoadingFallback,\n errorFallback: OverlayErrorFallback,\n errorReportExtras: host.errorReportExtras ?? null,\n renderWrapper: host.renderWrapper ?? null,\n importTimeoutMs: DEFAULT_IMPORT_TIMEOUT_MS,\n stallWarnMs: DEFAULT_STALL_WARN_MS,\n keepAlive: s.keepAlive,\n loaders: s.loaders,\n };\n s.version = version;\n return s.config;\n}\n\nexport function useSummonConfig(): SummonReactConfig {\n return useContext(SummonConfigContext) ?? hostReactConfig();\n}\n","// The provider's LRU of closed-but-alive instances (`keepAlive: \"hidden\"`, C38 R3). Each slot\n// retains its own hidden instances; this registry only keeps the global order and tells the\n// owning slot when one falls off the end, so at most `limit` hidden components stay mounted.\n\nexport class KeepAliveRegistry {\n private readonly order: string[] = [];\n private readonly evictors = new Map<string, () => void>();\n\n private limit: number;\n\n constructor(limit: number) {\n this.limit = limit;\n }\n\n setLimit(limit: number): void {\n this.limit = Math.max(0, Math.floor(limit));\n this.trim();\n }\n\n /** Mark `key` as hidden-alive (most recent). `evict` unmounts it when the cap is exceeded. */\n retain(key: string, evict: () => void): void {\n this.drop(key);\n this.order.push(key);\n this.evictors.set(key, evict);\n this.trim();\n }\n\n /** `key` reopened or its slot went away: no longer counted. */\n release(key: string): void {\n this.drop(key);\n }\n\n size(): number {\n return this.order.length;\n }\n\n private drop(key: string): void {\n const at = this.order.indexOf(key);\n if (at >= 0) this.order.splice(at, 1);\n this.evictors.delete(key);\n }\n\n private trim(): void {\n while (this.order.length > this.limit) {\n const oldest = this.order.shift();\n if (oldest === undefined) return;\n const evict = this.evictors.get(oldest);\n this.evictors.delete(oldest);\n evict?.();\n }\n }\n}\n","// Per-provider cache of each definition's lazily loaded render component. Lives in the provider\n// (React state), never at module level. A definition's render module is fetched the first time\n// one of its instances mounts — never before — and a retry swaps in a FRESH lazy so the import is\n// genuinely attempted again (a React.lazy caches its first rejection forever).\n\nimport { lazy, type ComponentType, type LazyExoticComponent } from \"react\";\n\nexport interface RenderModule<P> {\n readonly default: ComponentType<P>;\n}\n\nexport type RenderLoader<P> = () => Promise<RenderModule<P>>;\n\nexport interface LoaderEntry<P> {\n readonly attempt: number;\n readonly Component: LazyExoticComponent<ComponentType<P>>;\n}\n\nexport interface LoaderCacheOptions {\n readonly timeoutMs: () => number;\n readonly onImportStart?: (key: string, attempt: number) => void;\n}\n\n/** The error a stalled import becomes, so the error boundary always fires. */\nexport function chunkTimeoutError(key: string, timeoutMs: number): Error {\n const error = new Error(\n `Overlay \"${key}\" render module did not load within ${timeoutMs}ms. The import() did not resolve before the recovery timeout.`,\n );\n error.name = \"ChunkLoadError\";\n return error;\n}\n\nfunction raceTimeout<T>(key: string, real: Promise<T>, timeoutMs: number): Promise<T> {\n // A late rejection after the timeout won must not surface as unhandled.\n real.catch(() => undefined);\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(chunkTimeoutError(key, timeoutMs)), timeoutMs);\n });\n return Promise.race([real, timeout]).finally(() => {\n if (timer !== undefined) clearTimeout(timer);\n });\n}\n\nexport class LoaderCache {\n private readonly entries = new Map<string, LoaderEntry<unknown>>();\n\n private readonly options: LoaderCacheOptions;\n\n constructor(options: LoaderCacheOptions) {\n this.options = options;\n }\n\n private create<P>(key: string, loader: RenderLoader<P>, attempt: number): LoaderEntry<P> {\n const Component = lazy(() => {\n this.options.onImportStart?.(key, attempt);\n return raceTimeout(key, loader(), this.options.timeoutMs());\n });\n return { attempt, Component };\n }\n\n /** The current lazy component for `key`, created on first request. */\n get<P>(key: string, loader: RenderLoader<P>): LoaderEntry<P> {\n const existing = this.entries.get(key);\n // Sound by construction: an entry under `key` is only ever created from that key's loader.\n if (existing) return existing as LoaderEntry<P>;\n const created = this.create(key, loader, 0);\n this.entries.set(key, created as LoaderEntry<unknown>);\n return created;\n }\n\n /** Replace `key`'s lazy with a fresh one so the next render re-imports. */\n retry<P>(key: string, loader: RenderLoader<P>, failedAttempt: number): void {\n const existing = this.entries.get(key);\n // Another instance already retried past the failed attempt: share its fresh lazy.\n if (existing && existing.attempt > failedAttempt) return;\n const next = this.create(key, loader, failedAttempt + 1);\n this.entries.set(key, next as LoaderEntry<unknown>);\n }\n}\n","// @ai-matrx/summon/react — the render layer: provider (own store context), declare-once\n// definitions, the host, the lazy loader with its boundary and fallbacks, and the hooks.\nexport { SummonProvider, DEFAULT_IMPORT_TIMEOUT_MS, DEFAULT_KEEP_ALIVE_LIMIT, DEFAULT_STALL_WARN_MS, type SummonProviderProps } from \"./react/SummonProvider\";\nexport {\n SummonStoreContext,\n type OverlayRenderContext,\n type OverlayLoadingFallbackProps,\n type OverlayErrorFallbackProps,\n type OverlayErrorExtrasContext,\n} from \"./react/context\";\nexport {\n useSummonSelector,\n useSummonDispatch,\n useSummonStore,\n useSummonPorts,\n useOptionalSummonPorts,\n useOptionalSummonStore,\n type SummonReactDispatch,\n type SummonReactStore,\n} from \"./react/storeHooks\";\nexport {\n defineOverlay,\n CALLBACK_GROUP_KEY,\n type OverlayDefinition,\n type OverlaySpec,\n type HostableOverlay,\n type OverlayHandle,\n type OverlayOpener,\n type OverlayOpenOptions,\n type OverlayControllerProps,\n type OverlayEmitter,\n} from \"@ai-matrx/summon/define\";\nexport type { OverlayRenderProps } from \"./react/instanceBody\";\nexport { emitOverlayEvent, type OverlayEventMap, type OverlayHandlers } from \"./react/events\";\nexport type { RenderModule, RenderLoader } from \"./react/loaderCache\";\nexport { SummonHost, useCloseOnNavigation, type SummonHostProps } from \"./react/SummonHost\";\nexport { MISSING_RENDER_ERROR, type ErasedRenderLoader, type OverlayRenderMap } from \"./react/hostRenders\";\nexport { SummonRoot, type SummonRootProps, configureSummonHost, type SummonHostConfig } from \"@ai-matrx/summon/root\";\nexport {\n useOverlayInstance,\n useOptionalOverlayInstance,\n useOverlayState,\n type OverlayInstanceContextValue,\n type OverlayStateSetter,\n} from \"./react/instance\";\nexport { useIsOverlayOpen, useOpenOverlay, useCloseOverlay, type OpenOverlayOptions } from \"./react/hooks\";\n// Also on `./url`; lives here so a render module can publish its link without loading the link section.\nexport { useOverlayLink } from \"@ai-matrx/summon/root\";\nexport { OverlayErrorBoundary, type OverlayErrorBoundaryProps } from \"./react/OverlayErrorBoundary\";\nexport { OverlayErrorFallback, OverlayLoadingFallback, normalizeOverlayError, type NormalizedOverlayError } from \"./react/fallbacks\";\nexport { chunkTimeoutError } from \"./react/loaderCache\";\n","// Overlay events on the render side. Opening (the channel id that rides open data) is light and\n// lives in the root section; here, with the handles registry loaded, an emit first creates any\n// channel still pending and then delivers synchronously. Registered on evaluation so a\n// definition's `useEmit` (light) emits synchronously inside the render tree.\n\nimport { createEventChannel, getEventChannel } from \"@ai-matrx/summon/handles\";\nimport { materializePendingChannels, type OverlayEventMessage } from \"@ai-matrx/summon/open\";\nimport { registerOverlayEmitter } from \"@ai-matrx/summon/root\";\n\nexport type { OverlayEventMap, OverlayHandlers } from \"@ai-matrx/summon/root\";\nexport type { OverlayEventMessage };\n\n/** Deliver one event on a channel; a disposed or unknown channel is a silent no-op by contract. */\nexport function emitOverlayEvent(channelId: string, type: string, payload: unknown): void {\n materializePendingChannels(createEventChannel);\n getEventChannel<OverlayEventMessage>(channelId)?.emit({ type, payload });\n}\n\nregisterOverlayEmitter(emitOverlayEvent);\n","// `<SummonHost definitions>` — registers each definition's metadata and renders every definition\n// through its OWN subscriber (`DefinitionSlot`), so opening overlay A never re-renders B (the old\n// controller held ~440 subscriptions in one component). A closed overlay puts nothing in the tree\n// and fetches no chunk. `keepAlive: \"hidden\"` keeps closed instances mounted inside\n// `<Activity mode=\"hidden\">`, LRU-capped per provider.\n\nimport { Activity, memo, useCallback, useEffect, useRef, useState, type ComponentType, type ReactNode } from \"react\";\nimport { releaseOverlayInstance } from \"@ai-matrx/summon\";\nimport { registerOverlayMeta } from \"@ai-matrx/summon\";\nimport { closeOverlaysBoundToPage, overlayIdsBoundToPage, selectOpenInstances, type OpenInstanceView } from \"@ai-matrx/summon\";\nimport { instanceKey as toInstanceKey, type OverlayRawData } from \"@ai-matrx/summon\";\nimport { dispatchClose, type HostableOverlay } from \"@ai-matrx/summon/root\";\nimport { HostRendersContext, type OverlayRenderMap } from \"./hostRenders\";\nimport { createInstanceBody, type InstanceBodyProps, type OverlayRenderProps } from \"./instanceBody\";\nimport type { RenderLoader } from \"./loaderCache\";\nimport { useSummonConfig, useSummonDispatch, useSummonPorts, useSummonSelector } from \"./storeHooks\";\n\nexport interface SummonHostProps {\n /** Every overlay this host can render — the app's definition list, passed once. */\n readonly definitions: readonly HostableOverlay[];\n /**\n * id → `() => import(\"./<id>.render\")` for definitions declared without `render`. Large apps\n * use it so opener importers never reach a window subtree; a definition's own `render` wins.\n */\n readonly renders?: OverlayRenderMap;\n}\n\nfunction asRawData(data: unknown): OverlayRawData {\n return typeof data === \"object\" && data !== null && !Array.isArray(data) ? (data as OverlayRawData) : null;\n}\n\n/** Equal when the same instances are open with the same data references. */\nfunction sameInstances(a: readonly OpenInstanceView[], b: readonly OpenInstanceView[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) {\n const x = a[i];\n const y = b[i];\n if (!x || !y || x.instanceId !== y.instanceId || x.data !== y.data) return false;\n }\n return true;\n}\n\n// A definition is light (it carries no render code); the host builds each one's instance body on\n// first render and keeps it for the definition's lifetime.\nconst bodies = new WeakMap<HostableOverlay, ComponentType<InstanceBodyProps>>();\nfunction bodyOf(definition: HostableOverlay): ComponentType<InstanceBodyProps> {\n let body = bodies.get(definition);\n if (!body) {\n const parse = definition.parse ?? ((raw: OverlayRawData) => raw);\n // The definition's loader returns its own render module; erased here like the host map's entries.\n const render = definition.render as RenderLoader<OverlayRenderProps<unknown>> | undefined;\n body = createInstanceBody<unknown>(definition.id, definition.label, render, parse, definition.parse !== undefined);\n bodies.set(definition, body);\n }\n return body;\n}\n\nconst NO_RETAINED: ReadonlyMap<string, OverlayRawData> = new Map();\n\n/** Close-on-navigation: on a pathname change, close every overlay bound to the page. */\nexport function useCloseOnNavigation(): void {\n const ports = useSummonPorts();\n const dispatch = useSummonDispatch();\n useEffect(() => {\n const router = ports.router;\n let previous = router.pathname();\n return router.subscribe(() => {\n const next = router.pathname();\n if (next === previous) return;\n previous = next;\n const overlayIds = overlayIdsBoundToPage();\n if (overlayIds.length > 0) dispatch(closeOverlaysBoundToPage({ overlayIds }));\n });\n }, [ports, dispatch]);\n}\n\ninterface InstanceSlotProps {\n readonly definition: HostableOverlay;\n readonly instanceId: string;\n readonly data: OverlayRawData;\n readonly hidden: boolean;\n}\n\n// Memoized: a slot re-renders only when its own instance changes, never because the host did.\nconst InstanceSlot = memo(function InstanceSlot({ definition, instanceId, data, hidden }: InstanceSlotProps) {\n const dispatch = useSummonDispatch();\n const close = useCallback(() => dispatchClose(dispatch, definition.id, instanceId), [dispatch, definition.id, instanceId]);\n const Body = bodyOf(definition);\n return <Body instanceId={instanceId} instanceKey={toInstanceKey(definition.id, instanceId)} data={data} hidden={hidden} close={close} />;\n});\n\n// Memoized on the definition: the slot re-renders from its own store subscription (one overlay's\n// open instances) and nothing else. Unmemoized, every re-render of the host's parent re-rendered\n// every open overlay's render module (the ~425-renders-in-2-s storm the runtime sweep measured).\nconst DefinitionSlot = memo(function DefinitionSlot({ definition }: { readonly definition: HostableOverlay }) {\n const { keepAlive } = useSummonConfig();\n const dispatch = useSummonDispatch();\n const open = useSummonSelector((state) => selectOpenInstances(state, definition.id), sameInstances);\n const keepHidden = definition.keepAlive === \"hidden\";\n\n // Closed-but-alive instances, derived during render (no unmount/remount flash on close).\n const [retained, setRetained] = useState(NO_RETAINED);\n const [previousOpen, setPreviousOpen] = useState(open);\n if (previousOpen !== open) {\n setPreviousOpen(open);\n if (keepHidden) {\n const openIds = new Set(open.map((instance) => instance.instanceId));\n const next = new Map(retained);\n for (const instance of previousOpen) {\n if (!openIds.has(instance.instanceId)) next.set(instance.instanceId, asRawData(instance.data));\n }\n for (const id of openIds) next.delete(id);\n setRetained(next);\n }\n }\n\n // Mirror the retained set into the provider LRU; eviction unmounts here.\n const registered = useRef(new Set<string>());\n useEffect(() => {\n const seen = registered.current;\n for (const instanceId of retained.keys()) {\n if (seen.has(instanceId)) continue;\n seen.add(instanceId);\n const key = toInstanceKey(definition.id, instanceId);\n keepAlive.retain(key, () => {\n seen.delete(instanceId);\n // Evicted: its handles and saved state go now, as a plain close would have done.\n releaseOverlayInstance(dispatch, key);\n setRetained((current) => {\n if (!current.has(instanceId)) return current;\n const next = new Map(current);\n next.delete(instanceId);\n return next;\n });\n });\n }\n for (const instanceId of [...seen]) {\n if (retained.has(instanceId)) continue;\n seen.delete(instanceId);\n keepAlive.release(toInstanceKey(definition.id, instanceId));\n }\n }, [retained, keepAlive, definition.id, dispatch]);\n useEffect(() => {\n const seen = registered.current;\n return () => {\n for (const instanceId of seen) {\n const key = toInstanceKey(definition.id, instanceId);\n keepAlive.release(key);\n releaseOverlayInstance(dispatch, key);\n }\n seen.clear();\n };\n }, [keepAlive, definition.id, dispatch]);\n\n if (open.length === 0 && retained.size === 0) return null;\n\n const nodes: ReactNode[] = [];\n for (const instance of open) {\n const node = (\n <InstanceSlot key={instance.instanceId} definition={definition} instanceId={instance.instanceId} data={asRawData(instance.data)} hidden={false} />\n );\n nodes.push(\n keepHidden ? (\n <Activity key={instance.instanceId} mode=\"visible\">\n {node}\n </Activity>\n ) : (\n node\n ),\n );\n }\n if (keepHidden) {\n for (const [instanceId, data] of retained) {\n nodes.push(\n <Activity key={instanceId} mode=\"hidden\">\n <InstanceSlot key={instanceId} definition={definition} instanceId={instanceId} data={data} hidden />\n </Activity>,\n );\n }\n }\n return <>{nodes}</>;\n});\n\nexport function SummonHost({ definitions, renders }: SummonHostProps) {\n // Register before any slot renders: links, the close middleware and defaults read the registry.\n const registeredFor = useRef<readonly HostableOverlay[] | null>(null);\n if (registeredFor.current !== definitions) {\n registerOverlayMeta(definitions.map((definition) => definition.meta));\n registeredFor.current = definitions;\n }\n useCloseOnNavigation();\n return (\n <HostRendersContext.Provider value={renders ?? null}>\n {definitions.map((definition) => (\n <DefinitionSlot key={definition.id} definition={definition} />\n ))}\n </HostRendersContext.Provider>\n );\n}\n","// The host-side render map. A definition may omit `render`; the host then resolves the overlay's\n// render module from `<SummonHost renders={…}>`. This keeps import() edges out of every file\n// that imports a definition only to open it: in a large app, ~450 opener importers each gaining\n// an edge to a window subtree multiplied the build graph (the host-build law). One generated map\n// imported by the host alone keeps every import() behind the host's own lazy boundary.\n\nimport { createContext, type JSXElementConstructor } from \"react\";\nimport type { OverlayRenderProps } from \"./instanceBody\";\nimport type { RenderLoader } from \"./loaderCache\";\n\n/**\n * One overlay's loader with its data type erased. `never` data accepts every render component\n * typed `OverlayRenderProps<Data>`, so a map of differently typed render modules type-checks\n * without `any` (JSXElementConstructor, not ComponentType: `defaultProps` would make a class\n * component's props covariant and refuse the erasure).\n */\nexport type ErasedRenderLoader = () => Promise<{ readonly default: JSXElementConstructor<OverlayRenderProps<never>> }>;\n\n/** id → lazy render module, for definitions declared without `render`. */\nexport type OverlayRenderMap = Readonly<Record<string, ErasedRenderLoader>>;\n\nexport const HostRendersContext = createContext<OverlayRenderMap | null>(null);\n\n/** The name of the error an overlay with no render source raises into its error card. */\nexport const MISSING_RENDER_ERROR = \"OverlayRenderMissingError\";\n\nconst missing = new Map<string, () => Promise<never>>();\n\n/**\n * A loader for an overlay that is open but has no render module anywhere (no `render` on the\n * definition and no entry in the host's `renders`). It rejects, so the instance shows the error\n * card; in development it also logs once. Never a silent blank.\n */\nexport function missingRenderLoader<P>(overlayId: string): RenderLoader<P> {\n let loader = missing.get(overlayId);\n if (!loader) {\n const message = `Overlay \"${overlayId}\" is open but has no render module: its definition has no \\`render\\` and <SummonHost renders> has no \"${overlayId}\" entry.`;\n loader = () => {\n if (process.env.NODE_ENV !== \"production\") console.error(`[summon] ${message}`);\n const error = new Error(message);\n error.name = MISSING_RENDER_ERROR;\n return Promise.reject(error);\n };\n missing.set(overlayId, loader);\n }\n return loader;\n}\n","// One open instance, rendered: instance context → host wrapper → error boundary → Suspense →\n// the lazily loaded render module with its typed props. Created per definition (inside\n// `defineOverlay`) so the parsed-data type stays inside the closure and the host deals only in\n// untyped instances — no casts at the host.\n\nimport { Suspense, memo, useContext, useEffect, useMemo, useRef, type ComponentType, type ReactNode } from \"react\";\nimport type { InstanceKey, OverlayRawData } from \"@ai-matrx/summon\";\nimport type { OverlayRenderContext } from \"./context\";\nimport { OverlayErrorBoundary } from \"./OverlayErrorBoundary\";\nimport { OverlayInstanceContext, type OverlayInstanceContextValue } from \"./instance\";\nimport { HostRendersContext, missingRenderLoader } from \"./hostRenders\";\nimport type { RenderLoader } from \"./loaderCache\";\nimport { useSummonConfig, useSummonPorts } from \"./storeHooks\";\n\n/** The props every overlay's render module receives. */\nexport interface OverlayRenderProps<Data = OverlayRawData> {\n readonly overlayId: string;\n readonly instanceId: string;\n /** The open data: raw (narrow it yourself) unless the definition declares `parse`. */\n readonly data: Data;\n readonly isOpen: true;\n readonly close: () => void;\n /** True while kept alive behind a close (`keepAlive: \"hidden\"`). */\n readonly hidden: boolean;\n}\n\n/** What the host hands each instance — no data type, by design. */\nexport interface InstanceBodyProps {\n readonly instanceId: string;\n readonly instanceKey: InstanceKey;\n readonly data: OverlayRawData;\n readonly hidden: boolean;\n readonly close: () => void;\n}\n\ninterface LazyRenderProps<Parsed> {\n readonly overlayId: string;\n readonly instanceId: string;\n readonly data: Parsed;\n readonly hidden: boolean;\n readonly close: () => void;\n readonly render: RenderLoader<OverlayRenderProps<Parsed>>;\n readonly attemptRef: { current: number };\n}\n\nfunction LazyRender<Parsed>({ overlayId, instanceId, data, hidden, close, render, attemptRef }: LazyRenderProps<Parsed>) {\n const { loaders } = useSummonConfig();\n const entry = loaders.get(overlayId, render);\n attemptRef.current = entry.attempt;\n const Render = entry.Component;\n return <Render overlayId={overlayId} instanceId={instanceId} data={data} isOpen close={close} hidden={hidden} />;\n}\n\nexport function createInstanceBody<Parsed>(\n overlayId: string,\n label: string,\n /** The definition's own loader; when absent the host's `renders` map supplies it. */\n ownRender: RenderLoader<OverlayRenderProps<Parsed>> | undefined,\n parse: (raw: OverlayRawData) => Parsed | null,\n /** False when the definition has no `parse`: a null result is then just empty data. */\n refusable: boolean,\n): ComponentType<InstanceBodyProps> {\n function OverlayInstanceBody({ instanceId, instanceKey, data, hidden, close }: InstanceBodyProps) {\n const config = useSummonConfig();\n const ports = useSummonPorts();\n const hostRenders = useContext(HostRendersContext);\n const hostRender = ownRender ? undefined : hostRenders?.[overlayId];\n // The host map is erased (it holds every overlay's loader); the entry under this id was\n // generated from this definition's own render file, so narrowing it to Parsed is sound.\n const render: RenderLoader<OverlayRenderProps<Parsed>> =\n ownRender ?? (hostRender as RenderLoader<OverlayRenderProps<Parsed>> | undefined) ?? missingRenderLoader(overlayId);\n const attemptRef = useRef(0);\n const parsed = useMemo(() => parse(data), [data]);\n const refused = refusable && parsed === null;\n\n useEffect(() => {\n if (!refused) return;\n if (process.env.NODE_ENV !== \"production\") {\n ports.notify.warn(`Overlay \"${overlayId}\" was opened with data its parse() refused; closing it.`, {\n id: `overlays-parse-${instanceKey}`,\n });\n }\n close();\n }, [refused, ports, instanceKey, close]);\n\n const instance = useMemo<OverlayInstanceContextValue>(\n () => ({ overlayId, instanceId, instanceKey, close, hidden, rawData: data }),\n [instanceId, instanceKey, close, hidden, data],\n );\n\n if (refused) return null;\n\n const context: OverlayRenderContext = { overlayId, instanceId, instanceKey, label };\n const body: ReactNode = (\n <OverlayErrorBoundary\n overlayId={overlayId}\n instanceId={instanceId}\n instanceKey={instanceKey}\n label={label}\n errors={ports.errors}\n fallback={config.errorFallback}\n extras={config.errorReportExtras}\n onRetry={() => config.loaders.retry(overlayId, render, attemptRef.current)}\n onClose={close}\n >\n <Suspense fallback={<config.loadingFallback overlayId={overlayId} label={label} />}>\n <LazyRender\n overlayId={overlayId}\n instanceId={instanceId}\n data={parsed as Parsed}\n hidden={hidden}\n close={close}\n render={render}\n attemptRef={attemptRef}\n />\n </Suspense>\n </OverlayErrorBoundary>\n );\n\n return (\n <OverlayInstanceContext.Provider value={instance}>\n {config.renderWrapper ? config.renderWrapper(body, context) : body}\n </OverlayInstanceContext.Provider>\n );\n }\n OverlayInstanceBody.displayName = `Overlay(${overlayId})`;\n // Memoized: props are the instance's own (ids, data reference, hidden, a stable close).\n return memo(OverlayInstanceBody);\n}\n","// A per-instance error boundary. React.lazy + Suspense give a loading state but no error state,\n// so a rejected import (or a render throw) would otherwise unmount the whole host. Outcomes are\n// exactly: the overlay, its loading fallback, or a meaningful error with Close and Try again.\n\nimport { Component, type ComponentType, type ErrorInfo, type ReactNode } from \"react\";\nimport type { ErrorSinkPort } from \"@ai-matrx/summon\";\nimport type { OverlayErrorExtrasContext, OverlayErrorFallbackProps } from \"./context\";\nimport { normalizeOverlayError } from \"./fallbacks\";\n\nexport interface OverlayErrorBoundaryProps {\n readonly overlayId: string;\n readonly instanceId: string;\n readonly instanceKey: string;\n readonly label: string;\n readonly errors: ErrorSinkPort;\n readonly fallback: ComponentType<OverlayErrorFallbackProps>;\n readonly extras: ((context: OverlayErrorExtrasContext) => ReactNode) | null;\n /** Swap in a fresh loader BEFORE the boundary clears, so the remount re-imports. */\n readonly onRetry: () => void;\n readonly onClose: () => void;\n readonly children: ReactNode;\n}\n\ninterface OverlayErrorBoundaryState {\n readonly error: unknown;\n readonly hasError: boolean;\n readonly componentStack: string | null;\n}\n\nconst CLEAR: OverlayErrorBoundaryState = { error: null, hasError: false, componentStack: null };\n\nexport class OverlayErrorBoundary extends Component<OverlayErrorBoundaryProps, OverlayErrorBoundaryState> {\n override state: OverlayErrorBoundaryState = CLEAR;\n\n static getDerivedStateFromError(error: unknown): Partial<OverlayErrorBoundaryState> {\n return { error, hasError: true };\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n const componentStack = info.componentStack ?? null;\n this.setState({ componentStack });\n const e = normalizeOverlayError(error);\n // Loud recovery: a caught overlay error is a real bug or a broken chunk graph.\n this.props.errors.capture(error, {\n boundary: \"OverlayErrorBoundary\",\n overlayId: this.props.overlayId,\n instanceId: this.props.instanceId,\n errorName: e.name,\n isChunkLoadError: e.isChunkLoadError,\n componentStack,\n });\n }\n\n private readonly retry = (): void => {\n this.props.onRetry();\n this.setState(CLEAR);\n };\n\n override render(): ReactNode {\n const { hasError, error, componentStack } = this.state;\n if (!hasError) return this.props.children;\n const { overlayId, instanceId, instanceKey, label, extras, onClose } = this.props;\n const Fallback = this.props.fallback;\n const renderedExtras = extras ? extras({ overlayId, instanceId, instanceKey, label, error, componentStack }) : null;\n return (\n <Fallback\n overlayId={overlayId}\n instanceId={instanceId}\n label={label}\n error={error}\n componentStack={componentStack}\n retry={this.retry}\n close={onClose}\n extras={renderedExtras}\n />\n );\n }\n}\n","// The context every rendered overlay instance provides to its subtree, and the hooks that read\n// it: who am I, close me, am I hidden, and `useOverlayState` — saved component state scoped to\n// the open instance that survives `keepAlive: \"restore\"` (and persistence, when on).\n\nimport { useCallback } from \"react\";\nimport { selectOverlayStateValue, setOverlayStateValue } from \"@ai-matrx/summon\";\nimport { useOverlayInstance } from \"@ai-matrx/summon/root\";\nimport { useSummonDispatch, useSummonSelector, useSummonStore } from \"./storeHooks\";\n\nexport {\n OverlayInstanceContext,\n useOverlayInstance,\n useOptionalOverlayInstance,\n type OverlayInstanceContextValue,\n} from \"@ai-matrx/summon/root\";\n\nexport type OverlayStateSetter<T> = (next: T | ((previous: T) => T)) => void;\n\n/**\n * Saved state for the current overlay instance — `useState`, but kept in the overlays store under\n * `overlayId:instanceId` so it survives `keepAlive: \"restore\"` close/reopen and is persisted when\n * persistence is on. Any descendant of the overlay may call it; the same `name` reads the same\n * value. Values must be serialisable.\n */\nexport function useOverlayState<T>(name: string, initial: T): [T, OverlayStateSetter<T>] {\n const { instanceKey } = useOverlayInstance();\n const dispatch = useSummonDispatch();\n const store = useSummonStore();\n const stored = useSummonSelector((state) => selectOverlayStateValue(state, instanceKey, name));\n const value = stored === undefined ? initial : (stored as T);\n const setValue = useCallback<OverlayStateSetter<T>>(\n (next) => {\n const current = selectOverlayStateValue(store.getState(), instanceKey, name);\n const previous = current === undefined ? initial : (current as T);\n const resolved = typeof next === \"function\" ? (next as (previous: T) => T)(previous) : next;\n dispatch(setOverlayStateValue({ key: instanceKey, name, value: resolved }));\n },\n // `initial` is the first-render default, like useState's; its identity never re-binds.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dispatch, store, instanceKey, name],\n );\n return [value, setValue];\n}\n","// Id-addressed hooks — the escape hatch when a caller has an overlay id rather than its\n// definition. Typed through the host's `OverlayRegistry` augmentation.\n\nimport { useCallback } from \"react\";\nimport { getOverlayMeta } from \"@ai-matrx/summon\";\nimport { selectIsOverlayOpen } from \"@ai-matrx/summon\";\nimport { DEFAULT_INSTANCE_ID, type OverlayDataOf, type OverlayId } from \"@ai-matrx/summon\";\nimport { dispatchClose, dispatchOpen, newInstanceId, type OverlayHandle } from \"@ai-matrx/summon/root\";\nimport { useSummonDispatch, useSummonSelector } from \"./storeHooks\";\n\n/** True while the instance is open. */\nexport function useIsOverlayOpen(overlayId: OverlayId, instanceId: string = DEFAULT_INSTANCE_ID): boolean {\n return useSummonSelector((state) => selectIsOverlayOpen(state, overlayId, instanceId));\n}\n\nexport interface OpenOverlayOptions<Id extends OverlayId> {\n readonly data?: OverlayDataOf<Id>;\n readonly instanceId?: string;\n}\n\n/**\n * Open an overlay by id. A multi-instance overlay (per its registered definition) gets a fresh\n * instance id when none is given; a single-instance one opens \"default\".\n */\nexport function useOpenOverlay<Id extends OverlayId>(overlayId: Id): (options?: OpenOverlayOptions<Id>) => OverlayHandle {\n const dispatch = useSummonDispatch();\n return useCallback(\n (options?: OpenOverlayOptions<Id>) => {\n const multi = getOverlayMeta(overlayId)?.instance === \"multi\";\n const instanceId = options?.instanceId ?? (multi ? newInstanceId(overlayId) : DEFAULT_INSTANCE_ID);\n dispatchOpen(dispatch, overlayId, instanceId, options?.data ?? null);\n return { overlayId, instanceId, close: () => dispatchClose(dispatch, overlayId, instanceId) };\n },\n [dispatch, overlayId],\n );\n}\n\n/** A stable close function for one instance (pass straight to an `onClose` prop). */\nexport function useCloseOverlay(overlayId: OverlayId, instanceId: string = DEFAULT_INSTANCE_ID): () => void {\n const dispatch = useSummonDispatch();\n return useCallback(() => dispatchClose(dispatch, overlayId, instanceId), [dispatch, overlayId, instanceId]);\n}\n"],"mappings":"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","names":["useEffect","Component","jsx","useEffect","jsx","memo","useCallback","useEffect","useRef","useState","createContext","useContext","useEffect","useMemo","useRef","jsx","useOverlayInstance","jsx","useContext","useRef","useMemo","useEffect","jsx","useEffect","memo","InstanceSlot","useCallback","DefinitionSlot","useState","useRef","useCallback","dispatchClose","useCallback","dispatchClose"]}
|
|
1
|
+
{"version":3,"sources":["../src/react/SummonProvider.tsx","../src/react/context.ts","../src/react/fallbacks.tsx","../src/react/storeHooks.ts","../src/react/keepAlive.ts","../src/react/loaderCache.ts","../src/react.ts","../src/react/events.ts","../src/react/SummonHost.tsx","../src/react/hostRenders.ts","../src/react/instanceBody.tsx","../src/react/OverlayErrorBoundary.tsx","../src/react/instance.tsx","../src/react/hooks.ts"],"sourcesContent":["// `<SummonProvider>` — mounts the overlays store on the package's own context (the host's store\n// when passed — AI Matrx mounts `summonReducers` into its one store — else a private store made\n// once), the resolved ports, and the render-layer knobs (fallbacks, error extras, wrapper,\n// keep-alive cap, import timeout).\n\nimport { useEffect, useMemo, useRef, useState, type ComponentType, type ReactNode } from \"react\";\nimport { Provider } from \"react-redux\";\nimport type { Store } from \"@reduxjs/toolkit\";\nimport { resolvePorts, type SummonPorts } from \"@ai-matrx/summon\";\nimport { createSummonStore } from \"@ai-matrx/summon\";\nimport {\n SummonConfigContext,\n SummonPortsContext,\n SummonStoreContext,\n type OverlayErrorExtrasContext,\n type OverlayErrorFallbackProps,\n type OverlayLoadingFallbackProps,\n type OverlayRenderContext,\n type SummonReactConfig,\n} from \"./context\";\nimport { OverlayErrorFallback, OverlayLoadingFallback } from \"./fallbacks\";\nimport { KeepAliveRegistry } from \"./keepAlive\";\nimport { LoaderCache } from \"./loaderCache\";\n\nimport { DEFAULT_IMPORT_TIMEOUT_MS, DEFAULT_KEEP_ALIVE_LIMIT, DEFAULT_STALL_WARN_MS } from \"./storeHooks\";\nexport { DEFAULT_IMPORT_TIMEOUT_MS, DEFAULT_KEEP_ALIVE_LIMIT, DEFAULT_STALL_WARN_MS };\n\nexport interface SummonProviderProps {\n /** The host's Redux store with `summonReducers` mounted at their root keys. Omit for a private store. */\n readonly store?: Store<unknown>;\n /** Host ports; anything omitted uses the working default. */\n readonly ports?: Partial<SummonPorts>;\n readonly fallbacks?: {\n readonly loading?: ComponentType<OverlayLoadingFallbackProps>;\n readonly error?: ComponentType<OverlayErrorFallbackProps>;\n };\n /** Extra controls in the default error card's footer (AI Matrx: \"Copy for AI\"). */\n readonly errorReportExtras?: (context: OverlayErrorExtrasContext) => ReactNode;\n /** Wrap every rendered overlay (AI Matrx: its surface layer boundary). */\n readonly renderWrapper?: (node: ReactNode, context: OverlayRenderContext) => ReactNode;\n /** Most closed-but-alive (`keepAlive: \"hidden\"`) instances kept mounted. Default 8. */\n readonly keepAliveLimit?: number;\n /** A render-module import that has not settled by then becomes a ChunkLoadError. Default 12 s. */\n readonly importTimeoutMs?: number;\n /** When the loading fallback reports a stall to the error port. Default 10 s. */\n readonly stallWarnMs?: number;\n readonly children?: ReactNode;\n}\n\nexport function SummonProvider({\n store,\n ports,\n fallbacks,\n errorReportExtras,\n renderWrapper,\n keepAliveLimit = DEFAULT_KEEP_ALIVE_LIMIT,\n importTimeoutMs = DEFAULT_IMPORT_TIMEOUT_MS,\n stallWarnMs = DEFAULT_STALL_WARN_MS,\n children,\n}: SummonProviderProps) {\n const resolvedPorts = useMemo(() => resolvePorts(ports), [ports]);\n const [privateStore] = useState(() => (store ? null : createSummonStore({ ports: resolvedPorts })));\n const activeStore: Store<unknown> = store ?? (privateStore as Store<unknown>);\n\n const timeoutRef = useRef(importTimeoutMs);\n timeoutRef.current = importTimeoutMs;\n const [keepAlive] = useState(() => new KeepAliveRegistry(keepAliveLimit));\n const [loaders] = useState(() => new LoaderCache({ timeoutMs: () => timeoutRef.current }));\n useEffect(() => keepAlive.setLimit(keepAliveLimit), [keepAlive, keepAliveLimit]);\n\n const loading = fallbacks?.loading ?? OverlayLoadingFallback;\n const error = fallbacks?.error ?? OverlayErrorFallback;\n const config = useMemo<SummonReactConfig>(\n () => ({\n loadingFallback: loading,\n errorFallback: error,\n errorReportExtras: errorReportExtras ?? null,\n renderWrapper: renderWrapper ?? null,\n importTimeoutMs,\n stallWarnMs,\n keepAlive,\n loaders,\n }),\n [loading, error, errorReportExtras, renderWrapper, importTimeoutMs, stallWarnMs, keepAlive, loaders],\n );\n\n return (\n <Provider store={activeStore} context={SummonStoreContext}>\n <SummonPortsContext.Provider value={resolvedPorts}>\n <SummonConfigContext.Provider value={config}>{children}</SummonConfigContext.Provider>\n </SummonPortsContext.Provider>\n </Provider>\n );\n}\n","// The React section's own contexts. The overlays store rides its OWN react-redux context\n// (chat-package pattern), so a private overlays store never collides with a host's store and a\n// host that mounts `summonReducers` into its one store simply passes it in.\n\nimport { createContext, type ComponentType, type ReactNode } from \"react\";\nimport type { KeepAliveRegistry } from \"./keepAlive\";\nimport type { LoaderCache } from \"./loaderCache\";\nimport type { OverlayRenderContext, OverlayErrorExtrasContext } from \"@ai-matrx/summon/root\";\n\n// One identity: the store and ports contexts live in the light root section.\nexport { SummonStoreContext, SummonPortsContext } from \"@ai-matrx/summon/root\";\nexport type { OverlayRenderContext, OverlayErrorExtrasContext };\n\nexport interface OverlayLoadingFallbackProps {\n readonly overlayId: string;\n readonly label: string;\n}\n\nexport interface OverlayErrorFallbackProps {\n readonly overlayId: string;\n readonly instanceId: string;\n readonly label: string;\n readonly error: unknown;\n readonly componentStack: string | null;\n /** Re-import the render module and mount again. */\n readonly retry: () => void;\n /** Close this instance (no reload). */\n readonly close: () => void;\n /** Host-provided extras (AI Matrx: \"Copy for AI\"), already rendered for this error. */\n readonly extras: ReactNode;\n}\n\nexport interface SummonReactConfig {\n readonly loadingFallback: ComponentType<OverlayLoadingFallbackProps>;\n readonly errorFallback: ComponentType<OverlayErrorFallbackProps>;\n readonly errorReportExtras: ((context: OverlayErrorExtrasContext) => ReactNode) | null;\n readonly renderWrapper: ((node: ReactNode, context: OverlayRenderContext) => ReactNode) | null;\n readonly importTimeoutMs: number;\n readonly stallWarnMs: number;\n readonly keepAlive: KeepAliveRegistry;\n readonly loaders: LoaderCache;\n}\n\nexport const SummonConfigContext = createContext<SummonReactConfig | null>(null);\nSummonConfigContext.displayName = \"SummonConfigContext\";\n","// The default loading and error fallbacks every overlay renders through. A host replaces either\n// with `<SummonProvider fallbacks>`; AI Matrx adds its \"Copy for AI\" through `errorReportExtras`.\n// Design-system components and tokens only — no app imports.\n\nimport { useEffect } from \"react\";\nimport { Button } from \"@ai-matrx/design-system\";\nimport type { OverlayErrorFallbackProps, OverlayLoadingFallbackProps } from \"./context\";\nimport { useSummonConfig, useSummonPorts } from \"./storeHooks\";\n\nexport interface NormalizedOverlayError {\n readonly name: string;\n readonly message: string;\n readonly stack: string | null;\n readonly isChunkLoadError: boolean;\n}\n\nexport function normalizeOverlayError(error: unknown): NormalizedOverlayError {\n if (error instanceof Error) {\n const isChunkLoadError =\n error.name === \"ChunkLoadError\" ||\n /Loading chunk [\\w-]+ failed|Failed to fetch dynamically imported module|Importing a module script failed/i.test(\n error.message,\n );\n return { name: error.name, message: error.message, stack: error.stack ?? null, isChunkLoadError };\n }\n return { name: \"Error\", message: typeof error === \"string\" ? error : String(error), stack: null, isChunkLoadError: false };\n}\n\n/**\n * Spinner while the render module is in flight. Never blank. At the stall threshold it reports\n * once through the error port; the loader's import timeout (later) turns a hung import into a\n * real error so the error fallback takes over.\n */\nexport function OverlayLoadingFallback({ overlayId, label }: OverlayLoadingFallbackProps) {\n const ports = useSummonPorts();\n const { stallWarnMs } = useSummonConfig();\n useEffect(() => {\n const timer = setTimeout(() => {\n ports.errors.capture(new Error(`Overlay \"${overlayId}\" still loading after ${stallWarnMs}ms`), {\n stage: \"overlay-load-stall\",\n overlayId,\n level: \"warning\",\n });\n }, stallWarnMs);\n return () => clearTimeout(timer);\n }, [ports, overlayId, stallWarnMs]);\n\n return (\n <div className=\"pointer-events-none fixed inset-0 z-[2147483000] flex items-center justify-center p-4\">\n <div\n role=\"status\"\n aria-label={`Loading ${label}`}\n className=\"pointer-events-auto flex items-center gap-3 rounded-xl border border-border bg-card px-5 py-4 text-sm text-muted-foreground shadow-md\"\n >\n <span aria-hidden className=\"size-4 animate-spin rounded-full border-2 border-border border-t-primary\" />\n <span>Loading…</span>\n </div>\n </div>\n );\n}\n\n/** The error card: what failed, and a way out that never needs a page reload. */\nexport function OverlayErrorFallback({ label, error, retry, close, extras }: OverlayErrorFallbackProps) {\n const e = normalizeOverlayError(error);\n return (\n <div className=\"pointer-events-none fixed inset-0 z-[2147483001] flex items-center justify-center p-4\">\n <div\n role=\"alertdialog\"\n aria-label={`${label} failed to load`}\n className=\"pointer-events-auto flex max-h-[85dvh] w-full max-w-lg flex-col overflow-hidden rounded-xl border border-destructive bg-card shadow-lg\"\n >\n <div className=\"border-b border-border px-5 py-4\">\n <h2 className=\"text-sm font-semibold text-foreground\">{label} failed to load</h2>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {e.isChunkLoadError ? \"Part of it did not finish loading.\" : \"It hit an error while rendering.\"}\n </p>\n </div>\n <div className=\"min-h-0 flex-1 overflow-auto px-5 py-4\">\n <div className=\"rounded-lg bg-muted px-3 py-2 font-mono text-xs text-foreground\">\n <span className=\"text-destructive\">{e.name}</span>: {e.message}\n </div>\n </div>\n <div className=\"flex items-center justify-between gap-2 border-t border-border px-5 py-3\">\n <div>{extras}</div>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={close}>\n Close\n </Button>\n <Button variant=\"primary\" size=\"sm\" onClick={retry}>\n Try again\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n if (typeof window !== \"undefined\") window.location.reload();\n }}\n >\n Reload page\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","// The store hooks live in the light root section (one context identity); the render-layer config\n// hook stays here: the nearest SummonProvider's config, else one built from the root's settings.\nimport { useContext } from \"react\";\nimport { getSummonHostConfig, getSummonHostVersion } from \"@ai-matrx/summon/root\";\nimport { globalSlot } from \"@ai-matrx/kit/global-slot\";\nimport { SummonConfigContext, type SummonReactConfig } from \"./context\";\nimport { OverlayErrorFallback, OverlayLoadingFallback } from \"./fallbacks\";\nimport { KeepAliveRegistry } from \"./keepAlive\";\nimport { LoaderCache } from \"./loaderCache\";\n\nexport {\n useSummonSelector,\n useSummonDispatch,\n useSummonStore,\n useSummonPorts,\n useOptionalSummonPorts,\n useOptionalSummonStore,\n type SummonReactDispatch,\n type SummonReactStore,\n} from \"@ai-matrx/summon/root\";\n\nexport const DEFAULT_KEEP_ALIVE_LIMIT = 8;\nexport const DEFAULT_IMPORT_TIMEOUT_MS = 12_000;\nexport const DEFAULT_STALL_WARN_MS = 10_000;\n\ninterface HostConfigSlot {\n version: number;\n config: SummonReactConfig | null;\n keepAlive: KeepAliveRegistry | null;\n loaders: LoaderCache | null;\n}\n\nconst hostConfigSlot = (): HostConfigSlot =>\n globalSlot<HostConfigSlot>(\"ai-matrx.summon.hostReactConfig\", () => ({ version: -1, config: null, keepAlive: null, loaders: null }));\n\n/** The render config when no SummonProvider is above: the root's settings, one keep-alive and loader cache per page. */\nexport function hostReactConfig(): SummonReactConfig {\n const s = hostConfigSlot();\n const version = getSummonHostVersion();\n if (s.config && s.version === version) return s.config;\n const host = getSummonHostConfig();\n s.keepAlive ??= new KeepAliveRegistry(DEFAULT_KEEP_ALIVE_LIMIT);\n s.loaders ??= new LoaderCache({ timeoutMs: () => DEFAULT_IMPORT_TIMEOUT_MS });\n s.config = {\n loadingFallback: OverlayLoadingFallback,\n errorFallback: OverlayErrorFallback,\n errorReportExtras: host.errorReportExtras ?? null,\n renderWrapper: host.renderWrapper ?? null,\n importTimeoutMs: DEFAULT_IMPORT_TIMEOUT_MS,\n stallWarnMs: DEFAULT_STALL_WARN_MS,\n keepAlive: s.keepAlive,\n loaders: s.loaders,\n };\n s.version = version;\n return s.config;\n}\n\nexport function useSummonConfig(): SummonReactConfig {\n return useContext(SummonConfigContext) ?? hostReactConfig();\n}\n","// The provider's LRU of closed-but-alive instances (`keepAlive: \"hidden\"`, C38 R3). Each slot\n// retains its own hidden instances; this registry only keeps the global order and tells the\n// owning slot when one falls off the end, so at most `limit` hidden components stay mounted.\n\nexport class KeepAliveRegistry {\n private readonly order: string[] = [];\n private readonly evictors = new Map<string, () => void>();\n\n private limit: number;\n\n constructor(limit: number) {\n this.limit = limit;\n }\n\n setLimit(limit: number): void {\n this.limit = Math.max(0, Math.floor(limit));\n this.trim();\n }\n\n /** Mark `key` as hidden-alive (most recent). `evict` unmounts it when the cap is exceeded. */\n retain(key: string, evict: () => void): void {\n this.drop(key);\n this.order.push(key);\n this.evictors.set(key, evict);\n this.trim();\n }\n\n /** `key` reopened or its slot went away: no longer counted. */\n release(key: string): void {\n this.drop(key);\n }\n\n size(): number {\n return this.order.length;\n }\n\n private drop(key: string): void {\n const at = this.order.indexOf(key);\n if (at >= 0) this.order.splice(at, 1);\n this.evictors.delete(key);\n }\n\n private trim(): void {\n while (this.order.length > this.limit) {\n const oldest = this.order.shift();\n if (oldest === undefined) return;\n const evict = this.evictors.get(oldest);\n this.evictors.delete(oldest);\n evict?.();\n }\n }\n}\n","// Per-provider cache of each definition's lazily loaded render component. Lives in the provider\n// (React state), never at module level. A definition's render module is fetched the first time\n// one of its instances mounts — never before — and a retry swaps in a FRESH lazy so the import is\n// genuinely attempted again (a React.lazy caches its first rejection forever).\n\nimport { lazy, type ComponentType, type LazyExoticComponent } from \"react\";\n\nexport interface RenderModule<P> {\n readonly default: ComponentType<P>;\n}\n\nexport type RenderLoader<P> = () => Promise<RenderModule<P>>;\n\nexport interface LoaderEntry<P> {\n readonly attempt: number;\n readonly Component: LazyExoticComponent<ComponentType<P>>;\n}\n\nexport interface LoaderCacheOptions {\n readonly timeoutMs: () => number;\n readonly onImportStart?: (key: string, attempt: number) => void;\n}\n\n/** The error a stalled import becomes, so the error boundary always fires. */\nexport function chunkTimeoutError(key: string, timeoutMs: number): Error {\n const error = new Error(\n `Overlay \"${key}\" render module did not load within ${timeoutMs}ms. The import() did not resolve before the recovery timeout.`,\n );\n error.name = \"ChunkLoadError\";\n return error;\n}\n\nfunction raceTimeout<T>(key: string, real: Promise<T>, timeoutMs: number): Promise<T> {\n // A late rejection after the timeout won must not surface as unhandled.\n real.catch(() => undefined);\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(chunkTimeoutError(key, timeoutMs)), timeoutMs);\n });\n return Promise.race([real, timeout]).finally(() => {\n if (timer !== undefined) clearTimeout(timer);\n });\n}\n\nexport class LoaderCache {\n private readonly entries = new Map<string, LoaderEntry<unknown>>();\n\n private readonly options: LoaderCacheOptions;\n\n constructor(options: LoaderCacheOptions) {\n this.options = options;\n }\n\n private create<P>(key: string, loader: RenderLoader<P>, attempt: number): LoaderEntry<P> {\n const Component = lazy(() => {\n this.options.onImportStart?.(key, attempt);\n return raceTimeout(key, loader(), this.options.timeoutMs());\n });\n return { attempt, Component };\n }\n\n /** The current lazy component for `key`, created on first request. */\n get<P>(key: string, loader: RenderLoader<P>): LoaderEntry<P> {\n const existing = this.entries.get(key);\n // Sound by construction: an entry under `key` is only ever created from that key's loader.\n if (existing) return existing as LoaderEntry<P>;\n const created = this.create(key, loader, 0);\n this.entries.set(key, created as LoaderEntry<unknown>);\n return created;\n }\n\n /** Replace `key`'s lazy with a fresh one so the next render re-imports. */\n retry<P>(key: string, loader: RenderLoader<P>, failedAttempt: number): void {\n const existing = this.entries.get(key);\n // Another instance already retried past the failed attempt: share its fresh lazy.\n if (existing && existing.attempt > failedAttempt) return;\n const next = this.create(key, loader, failedAttempt + 1);\n this.entries.set(key, next as LoaderEntry<unknown>);\n }\n}\n","// @ai-matrx/summon/react — the render layer: provider (own store context), declare-once\n// definitions, the host, the lazy loader with its boundary and fallbacks, and the hooks.\nexport { SummonProvider, DEFAULT_IMPORT_TIMEOUT_MS, DEFAULT_KEEP_ALIVE_LIMIT, DEFAULT_STALL_WARN_MS, type SummonProviderProps } from \"./react/SummonProvider\";\nexport {\n SummonStoreContext,\n type OverlayRenderContext,\n type OverlayLoadingFallbackProps,\n type OverlayErrorFallbackProps,\n type OverlayErrorExtrasContext,\n} from \"./react/context\";\nexport {\n useSummonSelector,\n useSummonDispatch,\n useSummonStore,\n useSummonPorts,\n useOptionalSummonPorts,\n useOptionalSummonStore,\n type SummonReactDispatch,\n type SummonReactStore,\n} from \"./react/storeHooks\";\nexport {\n defineOverlay,\n CALLBACK_GROUP_KEY,\n type OverlayDefinition,\n type OverlaySpec,\n type HostableOverlay,\n type OverlayHandle,\n type OverlayOpener,\n type OverlayOpenOptions,\n type OverlayControllerProps,\n type OverlayEmitter,\n} from \"@ai-matrx/summon/define\";\nexport type { OverlayRenderProps } from \"./react/instanceBody\";\nexport { emitOverlayEvent, type OverlayEventMap, type OverlayHandlers } from \"./react/events\";\nexport type { RenderModule, RenderLoader } from \"./react/loaderCache\";\nexport { SummonHost, useCloseOnNavigation, type SummonHostProps } from \"./react/SummonHost\";\nexport { MISSING_RENDER_ERROR, type ErasedRenderLoader, type OverlayRenderMap } from \"./react/hostRenders\";\nexport { SummonRoot, type SummonRootProps, configureSummonHost, type SummonHostConfig } from \"@ai-matrx/summon/root\";\nexport {\n useOverlayInstance,\n useOptionalOverlayInstance,\n useOverlayState,\n type OverlayInstanceContextValue,\n type OverlayStateSetter,\n} from \"./react/instance\";\nexport { useIsOverlayOpen, useOpenOverlay, useCloseOverlay, type OpenOverlayOptions } from \"./react/hooks\";\n// Also on `./url`; lives here so a render module can publish its link without loading the link section.\nexport { useOverlayLink } from \"@ai-matrx/summon/root\";\nexport { OverlayErrorBoundary, type OverlayErrorBoundaryProps } from \"./react/OverlayErrorBoundary\";\nexport { OverlayErrorFallback, OverlayLoadingFallback, normalizeOverlayError, type NormalizedOverlayError } from \"./react/fallbacks\";\nexport { chunkTimeoutError } from \"./react/loaderCache\";\n","// Overlay events on the render side. Opening (the channel id that rides open data) is light and\n// lives in the root section; here, with the handles registry loaded, an emit first creates any\n// channel still pending and then delivers synchronously. Registered on evaluation so a\n// definition's `useEmit` (light) emits synchronously inside the render tree.\n\nimport { createEventChannel, getEventChannel } from \"@ai-matrx/summon/handles\";\nimport { materializePendingChannels, type OverlayEventMessage } from \"@ai-matrx/summon/open\";\nimport { registerOverlayEmitter } from \"@ai-matrx/summon/root\";\n\nexport type { OverlayEventMap, OverlayHandlers } from \"@ai-matrx/summon/root\";\nexport type { OverlayEventMessage };\n\n/** Deliver one event on a channel; a disposed or unknown channel is a silent no-op by contract. */\nexport function emitOverlayEvent(channelId: string, type: string, payload: unknown): void {\n materializePendingChannels(createEventChannel);\n getEventChannel<OverlayEventMessage>(channelId)?.emit({ type, payload });\n}\n\nregisterOverlayEmitter(emitOverlayEvent);\n","// `<SummonHost definitions>` — registers each definition's metadata and renders every definition\n// through its OWN subscriber (`DefinitionSlot`), so opening overlay A never re-renders B (the old\n// controller held ~440 subscriptions in one component). A closed overlay puts nothing in the tree\n// and fetches no chunk. `keepAlive: \"hidden\"` keeps closed instances mounted inside\n// `<Activity mode=\"hidden\">`, LRU-capped per provider.\n\nimport { Activity, memo, useCallback, useEffect, useRef, useState, type ComponentType, type ReactNode } from \"react\";\nimport { releaseOverlayInstance } from \"@ai-matrx/summon\";\nimport { registerOverlayMeta } from \"@ai-matrx/summon\";\nimport { closeOverlaysBoundToPage, overlayIdsBoundToPage, selectOpenInstances, type OpenInstanceView } from \"@ai-matrx/summon\";\nimport { instanceKey as toInstanceKey, type OverlayRawData } from \"@ai-matrx/summon\";\nimport { dispatchClose, type HostableOverlay } from \"@ai-matrx/summon/root\";\nimport { HostRendersContext, type OverlayRenderMap } from \"./hostRenders\";\nimport { createInstanceBody, type InstanceBodyProps, type OverlayRenderProps } from \"./instanceBody\";\nimport type { RenderLoader } from \"./loaderCache\";\nimport { useSummonConfig, useSummonDispatch, useSummonPorts, useSummonSelector } from \"./storeHooks\";\n\nexport interface SummonHostProps {\n /** Every overlay this host can render — the app's definition list, passed once. */\n readonly definitions: readonly HostableOverlay[];\n /**\n * id → `() => import(\"./<id>.render\")` for definitions declared without `render`. Large apps\n * use it so opener importers never reach a window subtree; a definition's own `render` wins.\n */\n readonly renders?: OverlayRenderMap;\n}\n\nfunction asRawData(data: unknown): OverlayRawData {\n return typeof data === \"object\" && data !== null && !Array.isArray(data) ? (data as OverlayRawData) : null;\n}\n\n/** Equal when the same instances are open with the same data references. */\nfunction sameInstances(a: readonly OpenInstanceView[], b: readonly OpenInstanceView[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) {\n const x = a[i];\n const y = b[i];\n if (!x || !y || x.instanceId !== y.instanceId || x.data !== y.data) return false;\n }\n return true;\n}\n\n// A definition is light (it carries no render code); the host builds each one's instance body on\n// first render and keeps it for the definition's lifetime.\nconst bodies = new WeakMap<HostableOverlay, ComponentType<InstanceBodyProps>>();\nfunction bodyOf(definition: HostableOverlay): ComponentType<InstanceBodyProps> {\n let body = bodies.get(definition);\n if (!body) {\n const parse = definition.parse ?? ((raw: OverlayRawData) => raw);\n // The definition's loader returns its own render module; erased here like the host map's entries.\n const render = definition.render as RenderLoader<OverlayRenderProps<unknown>> | undefined;\n body = createInstanceBody<unknown>(definition.id, definition.label, render, parse, definition.parse !== undefined);\n bodies.set(definition, body);\n }\n return body;\n}\n\nconst NO_RETAINED: ReadonlyMap<string, OverlayRawData> = new Map();\n\n/** Close-on-navigation: on a pathname change, close every overlay bound to the page. */\nexport function useCloseOnNavigation(): void {\n const ports = useSummonPorts();\n const dispatch = useSummonDispatch();\n useEffect(() => {\n const router = ports.router;\n let previous = router.pathname();\n return router.subscribe(() => {\n const next = router.pathname();\n if (next === previous) return;\n previous = next;\n const overlayIds = overlayIdsBoundToPage();\n if (overlayIds.length > 0) dispatch(closeOverlaysBoundToPage({ overlayIds }));\n });\n }, [ports, dispatch]);\n}\n\ninterface InstanceSlotProps {\n readonly definition: HostableOverlay;\n readonly instanceId: string;\n readonly data: OverlayRawData;\n readonly hidden: boolean;\n}\n\n// Memoized: a slot re-renders only when its own instance changes, never because the host did.\nconst InstanceSlot = memo(function InstanceSlot({ definition, instanceId, data, hidden }: InstanceSlotProps) {\n const dispatch = useSummonDispatch();\n const close = useCallback(() => dispatchClose(dispatch, definition.id, instanceId), [dispatch, definition.id, instanceId]);\n const Body = bodyOf(definition);\n return <Body instanceId={instanceId} instanceKey={toInstanceKey(definition.id, instanceId)} data={data} hidden={hidden} close={close} />;\n});\n\n// Memoized on the definition: the slot re-renders from its own store subscription (one overlay's\n// open instances) and nothing else. Unmemoized, every re-render of the host's parent re-rendered\n// every open overlay's render module (the ~425-renders-in-2-s storm the runtime sweep measured).\nconst DefinitionSlot = memo(function DefinitionSlot({ definition }: { readonly definition: HostableOverlay }) {\n const { keepAlive } = useSummonConfig();\n const dispatch = useSummonDispatch();\n const open = useSummonSelector((state) => selectOpenInstances(state, definition.id), sameInstances);\n const keepHidden = definition.keepAlive === \"hidden\";\n\n // Closed-but-alive instances, derived during render (no unmount/remount flash on close).\n const [retained, setRetained] = useState(NO_RETAINED);\n const [previousOpen, setPreviousOpen] = useState(open);\n if (previousOpen !== open) {\n setPreviousOpen(open);\n if (keepHidden) {\n const openIds = new Set(open.map((instance) => instance.instanceId));\n const next = new Map(retained);\n for (const instance of previousOpen) {\n if (!openIds.has(instance.instanceId)) next.set(instance.instanceId, asRawData(instance.data));\n }\n for (const id of openIds) next.delete(id);\n setRetained(next);\n }\n }\n\n // Mirror the retained set into the provider LRU; eviction unmounts here.\n const registered = useRef(new Set<string>());\n useEffect(() => {\n const seen = registered.current;\n for (const instanceId of retained.keys()) {\n if (seen.has(instanceId)) continue;\n seen.add(instanceId);\n const key = toInstanceKey(definition.id, instanceId);\n keepAlive.retain(key, () => {\n seen.delete(instanceId);\n // Evicted: its handles and saved state go now, as a plain close would have done.\n releaseOverlayInstance(dispatch, key);\n setRetained((current) => {\n if (!current.has(instanceId)) return current;\n const next = new Map(current);\n next.delete(instanceId);\n return next;\n });\n });\n }\n for (const instanceId of [...seen]) {\n if (retained.has(instanceId)) continue;\n seen.delete(instanceId);\n keepAlive.release(toInstanceKey(definition.id, instanceId));\n }\n }, [retained, keepAlive, definition.id, dispatch]);\n useEffect(() => {\n const seen = registered.current;\n return () => {\n for (const instanceId of seen) {\n const key = toInstanceKey(definition.id, instanceId);\n keepAlive.release(key);\n releaseOverlayInstance(dispatch, key);\n }\n seen.clear();\n };\n }, [keepAlive, definition.id, dispatch]);\n\n if (open.length === 0 && retained.size === 0) return null;\n\n const nodes: ReactNode[] = [];\n for (const instance of open) {\n const node = (\n <InstanceSlot key={instance.instanceId} definition={definition} instanceId={instance.instanceId} data={asRawData(instance.data)} hidden={false} />\n );\n nodes.push(\n keepHidden ? (\n <Activity key={instance.instanceId} mode=\"visible\">\n {node}\n </Activity>\n ) : (\n node\n ),\n );\n }\n if (keepHidden) {\n for (const [instanceId, data] of retained) {\n nodes.push(\n <Activity key={instanceId} mode=\"hidden\">\n <InstanceSlot key={instanceId} definition={definition} instanceId={instanceId} data={data} hidden />\n </Activity>,\n );\n }\n }\n return <>{nodes}</>;\n});\n\nexport function SummonHost({ definitions, renders }: SummonHostProps) {\n // Register before any slot renders: links, the close middleware and defaults read the registry.\n const registeredFor = useRef<readonly HostableOverlay[] | null>(null);\n if (registeredFor.current !== definitions) {\n registerOverlayMeta(definitions.map((definition) => definition.meta));\n registeredFor.current = definitions;\n }\n useCloseOnNavigation();\n return (\n <HostRendersContext.Provider value={renders ?? null}>\n {definitions.map((definition) => (\n <DefinitionSlot key={definition.id} definition={definition} />\n ))}\n </HostRendersContext.Provider>\n );\n}\n","// The host-side render map. A definition may omit `render`; the host then resolves the overlay's\n// render module from `<SummonHost renders={…}>`. This keeps import() edges out of every file\n// that imports a definition only to open it: in a large app, ~450 opener importers each gaining\n// an edge to a window subtree multiplied the build graph (the host-build law). One generated map\n// imported by the host alone keeps every import() behind the host's own lazy boundary.\n\nimport { createContext, type JSXElementConstructor } from \"react\";\nimport type { OverlayRenderProps } from \"./instanceBody\";\nimport type { RenderLoader } from \"./loaderCache\";\n\n/**\n * One overlay's loader with its data type erased. `never` data accepts every render component\n * typed `OverlayRenderProps<Data>`, so a map of differently typed render modules type-checks\n * without `any` (JSXElementConstructor, not ComponentType: `defaultProps` would make a class\n * component's props covariant and refuse the erasure).\n */\nexport type ErasedRenderLoader = () => Promise<{ readonly default: JSXElementConstructor<OverlayRenderProps<never>> }>;\n\n/** id → lazy render module, for definitions declared without `render`. */\nexport type OverlayRenderMap = Readonly<Record<string, ErasedRenderLoader>>;\n\nexport const HostRendersContext = createContext<OverlayRenderMap | null>(null);\n\n/** The name of the error an overlay with no render source raises into its error card. */\nexport const MISSING_RENDER_ERROR = \"OverlayRenderMissingError\";\n\nconst missing = new Map<string, () => Promise<never>>();\n\n/**\n * A loader for an overlay that is open but has no render module anywhere (no `render` on the\n * definition and no entry in the host's `renders`). It rejects, so the instance shows the error\n * card; in development it also logs once. Never a silent blank.\n */\nexport function missingRenderLoader<P>(overlayId: string): RenderLoader<P> {\n let loader = missing.get(overlayId);\n if (!loader) {\n const message = `Overlay \"${overlayId}\" is open but has no render module: its definition has no \\`render\\` and <SummonHost renders> has no \"${overlayId}\" entry.`;\n loader = () => {\n if (process.env.NODE_ENV !== \"production\") console.error(`[summon] ${message}`);\n const error = new Error(message);\n error.name = MISSING_RENDER_ERROR;\n return Promise.reject(error);\n };\n missing.set(overlayId, loader);\n }\n return loader;\n}\n","// One open instance, rendered: instance context → host wrapper → error boundary → Suspense →\n// the lazily loaded render module with its typed props. Created per definition (inside\n// `defineOverlay`) so the parsed-data type stays inside the closure and the host deals only in\n// untyped instances — no casts at the host.\n\nimport { Suspense, memo, useContext, useEffect, useMemo, useRef, type ComponentType, type ReactNode } from \"react\";\nimport type { InstanceKey, OverlayRawData } from \"@ai-matrx/summon\";\nimport type { OverlayRenderContext } from \"./context\";\nimport { OverlayErrorBoundary } from \"./OverlayErrorBoundary\";\nimport { OverlayInstanceContext, type OverlayInstanceContextValue } from \"./instance\";\nimport { HostRendersContext, missingRenderLoader } from \"./hostRenders\";\nimport type { RenderLoader } from \"./loaderCache\";\nimport { useSummonConfig, useSummonPorts } from \"./storeHooks\";\n\n/** The props every overlay's render module receives. */\nexport interface OverlayRenderProps<Data = OverlayRawData> {\n readonly overlayId: string;\n readonly instanceId: string;\n /** The open data: raw (narrow it yourself) unless the definition declares `parse`. */\n readonly data: Data;\n readonly isOpen: true;\n readonly close: () => void;\n /** True while kept alive behind a close (`keepAlive: \"hidden\"`). */\n readonly hidden: boolean;\n}\n\n/** What the host hands each instance — no data type, by design. */\nexport interface InstanceBodyProps {\n readonly instanceId: string;\n readonly instanceKey: InstanceKey;\n readonly data: OverlayRawData;\n readonly hidden: boolean;\n readonly close: () => void;\n}\n\ninterface LazyRenderProps<Parsed> {\n readonly overlayId: string;\n readonly instanceId: string;\n readonly data: Parsed;\n readonly hidden: boolean;\n readonly close: () => void;\n readonly render: RenderLoader<OverlayRenderProps<Parsed>>;\n readonly attemptRef: { current: number };\n}\n\nfunction LazyRender<Parsed>({ overlayId, instanceId, data, hidden, close, render, attemptRef }: LazyRenderProps<Parsed>) {\n const { loaders } = useSummonConfig();\n const entry = loaders.get(overlayId, render);\n attemptRef.current = entry.attempt;\n const Render = entry.Component;\n return <Render overlayId={overlayId} instanceId={instanceId} data={data} isOpen close={close} hidden={hidden} />;\n}\n\nexport function createInstanceBody<Parsed>(\n overlayId: string,\n label: string,\n /** The definition's own loader; when absent the host's `renders` map supplies it. */\n ownRender: RenderLoader<OverlayRenderProps<Parsed>> | undefined,\n parse: (raw: OverlayRawData) => Parsed | null,\n /** False when the definition has no `parse`: a null result is then just empty data. */\n refusable: boolean,\n): ComponentType<InstanceBodyProps> {\n function OverlayInstanceBody({ instanceId, instanceKey, data, hidden, close }: InstanceBodyProps) {\n const config = useSummonConfig();\n const ports = useSummonPorts();\n const hostRenders = useContext(HostRendersContext);\n const hostRender = ownRender ? undefined : hostRenders?.[overlayId];\n // The host map is erased (it holds every overlay's loader); the entry under this id was\n // generated from this definition's own render file, so narrowing it to Parsed is sound.\n const render: RenderLoader<OverlayRenderProps<Parsed>> =\n ownRender ?? (hostRender as RenderLoader<OverlayRenderProps<Parsed>> | undefined) ?? missingRenderLoader(overlayId);\n const attemptRef = useRef(0);\n const parsed = useMemo(() => parse(data), [data]);\n const refused = refusable && parsed === null;\n\n useEffect(() => {\n if (!refused) return;\n if (process.env.NODE_ENV !== \"production\") {\n ports.notify.warn(`Overlay \"${overlayId}\" was opened with data its parse() refused; closing it.`, {\n id: `overlays-parse-${instanceKey}`,\n });\n }\n close();\n }, [refused, ports, instanceKey, close]);\n\n const instance = useMemo<OverlayInstanceContextValue>(\n () => ({ overlayId, instanceId, instanceKey, close, hidden, rawData: data }),\n [instanceId, instanceKey, close, hidden, data],\n );\n\n if (refused) return null;\n\n const context: OverlayRenderContext = { overlayId, instanceId, instanceKey, label };\n const body: ReactNode = (\n <OverlayErrorBoundary\n overlayId={overlayId}\n instanceId={instanceId}\n instanceKey={instanceKey}\n label={label}\n errors={ports.errors}\n fallback={config.errorFallback}\n extras={config.errorReportExtras}\n onRetry={() => config.loaders.retry(overlayId, render, attemptRef.current)}\n onClose={close}\n >\n <Suspense fallback={<config.loadingFallback overlayId={overlayId} label={label} />}>\n <LazyRender\n overlayId={overlayId}\n instanceId={instanceId}\n data={parsed as Parsed}\n hidden={hidden}\n close={close}\n render={render}\n attemptRef={attemptRef}\n />\n </Suspense>\n </OverlayErrorBoundary>\n );\n\n return (\n <OverlayInstanceContext.Provider value={instance}>\n {config.renderWrapper ? config.renderWrapper(body, context) : body}\n </OverlayInstanceContext.Provider>\n );\n }\n OverlayInstanceBody.displayName = `Overlay(${overlayId})`;\n // Memoized: props are the instance's own (ids, data reference, hidden, a stable close).\n return memo(OverlayInstanceBody);\n}\n","// A per-instance error boundary. React.lazy + Suspense give a loading state but no error state,\n// so a rejected import (or a render throw) would otherwise unmount the whole host. Outcomes are\n// exactly: the overlay, its loading fallback, or a meaningful error with Close and Try again.\n\nimport { Component, type ComponentType, type ErrorInfo, type ReactNode } from \"react\";\nimport type { ErrorSinkPort } from \"@ai-matrx/summon\";\nimport type { OverlayErrorExtrasContext, OverlayErrorFallbackProps } from \"./context\";\nimport { normalizeOverlayError } from \"./fallbacks\";\n\nexport interface OverlayErrorBoundaryProps {\n readonly overlayId: string;\n readonly instanceId: string;\n readonly instanceKey: string;\n readonly label: string;\n readonly errors: ErrorSinkPort;\n readonly fallback: ComponentType<OverlayErrorFallbackProps>;\n readonly extras: ((context: OverlayErrorExtrasContext) => ReactNode) | null;\n /** Swap in a fresh loader BEFORE the boundary clears, so the remount re-imports. */\n readonly onRetry: () => void;\n readonly onClose: () => void;\n readonly children: ReactNode;\n}\n\ninterface OverlayErrorBoundaryState {\n readonly error: unknown;\n readonly hasError: boolean;\n readonly componentStack: string | null;\n}\n\nconst CLEAR: OverlayErrorBoundaryState = { error: null, hasError: false, componentStack: null };\n\nexport class OverlayErrorBoundary extends Component<OverlayErrorBoundaryProps, OverlayErrorBoundaryState> {\n override state: OverlayErrorBoundaryState = CLEAR;\n\n static getDerivedStateFromError(error: unknown): Partial<OverlayErrorBoundaryState> {\n return { error, hasError: true };\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n const componentStack = info.componentStack ?? null;\n this.setState({ componentStack });\n const e = normalizeOverlayError(error);\n // Loud recovery: a caught overlay error is a real bug or a broken chunk graph.\n this.props.errors.capture(error, {\n boundary: \"OverlayErrorBoundary\",\n overlayId: this.props.overlayId,\n instanceId: this.props.instanceId,\n errorName: e.name,\n isChunkLoadError: e.isChunkLoadError,\n componentStack,\n });\n }\n\n private readonly retry = (): void => {\n this.props.onRetry();\n this.setState(CLEAR);\n };\n\n override render(): ReactNode {\n const { hasError, error, componentStack } = this.state;\n if (!hasError) return this.props.children;\n const { overlayId, instanceId, instanceKey, label, extras, onClose } = this.props;\n const Fallback = this.props.fallback;\n const renderedExtras = extras ? extras({ overlayId, instanceId, instanceKey, label, error, componentStack }) : null;\n return (\n <Fallback\n overlayId={overlayId}\n instanceId={instanceId}\n label={label}\n error={error}\n componentStack={componentStack}\n retry={this.retry}\n close={onClose}\n extras={renderedExtras}\n />\n );\n }\n}\n","// The context every rendered overlay instance provides to its subtree, and the hooks that read\n// it: who am I, close me, am I hidden, and `useOverlayState` — saved component state scoped to\n// the open instance that survives `keepAlive: \"restore\"` (and persistence, when on).\n\nimport { useCallback } from \"react\";\nimport { selectOverlayStateValue, setOverlayStateValue } from \"@ai-matrx/summon\";\nimport { useOverlayInstance } from \"@ai-matrx/summon/root\";\nimport { useSummonDispatch, useSummonSelector, useSummonStore } from \"./storeHooks\";\n\nexport {\n OverlayInstanceContext,\n useOverlayInstance,\n useOptionalOverlayInstance,\n type OverlayInstanceContextValue,\n} from \"@ai-matrx/summon/root\";\n\nexport type OverlayStateSetter<T> = (next: T | ((previous: T) => T)) => void;\n\n/**\n * Saved state for the current overlay instance — `useState`, but kept in the overlays store under\n * `overlayId:instanceId` so it survives `keepAlive: \"restore\"` close/reopen and is persisted when\n * persistence is on. Any descendant of the overlay may call it; the same `name` reads the same\n * value. Values must be serialisable.\n */\nexport function useOverlayState<T>(name: string, initial: T): [T, OverlayStateSetter<T>] {\n const { instanceKey } = useOverlayInstance();\n const dispatch = useSummonDispatch();\n const store = useSummonStore();\n const stored = useSummonSelector((state) => selectOverlayStateValue(state, instanceKey, name));\n const value = stored === undefined ? initial : (stored as T);\n const setValue = useCallback<OverlayStateSetter<T>>(\n (next) => {\n const current = selectOverlayStateValue(store.getState(), instanceKey, name);\n const previous = current === undefined ? initial : (current as T);\n const resolved = typeof next === \"function\" ? (next as (previous: T) => T)(previous) : next;\n dispatch(setOverlayStateValue({ key: instanceKey, name, value: resolved }));\n },\n // `initial` is the first-render default, like useState's; its identity never re-binds.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dispatch, store, instanceKey, name],\n );\n return [value, setValue];\n}\n","// Id-addressed hooks — the escape hatch when a caller has an overlay id rather than its\n// definition. Typed through the host's `OverlayRegistry` augmentation.\n\nimport { useCallback } from \"react\";\nimport { getOverlayMeta } from \"@ai-matrx/summon\";\nimport { selectIsOverlayOpen } from \"@ai-matrx/summon\";\nimport { DEFAULT_INSTANCE_ID, type OverlayDataOf, type OverlayId } from \"@ai-matrx/summon\";\nimport { dispatchClose, dispatchOpen, newInstanceId, type OverlayHandle } from \"@ai-matrx/summon/root\";\nimport { useSummonDispatch, useSummonSelector } from \"./storeHooks\";\n\n/** True while the instance is open. */\nexport function useIsOverlayOpen(overlayId: OverlayId, instanceId: string = DEFAULT_INSTANCE_ID): boolean {\n return useSummonSelector((state) => selectIsOverlayOpen(state, overlayId, instanceId));\n}\n\nexport interface OpenOverlayOptions<Id extends OverlayId> {\n readonly data?: OverlayDataOf<Id>;\n readonly instanceId?: string;\n}\n\n/**\n * Open an overlay by id. A multi-instance overlay (per its registered definition) gets a fresh\n * instance id when none is given; a single-instance one opens \"default\".\n */\nexport function useOpenOverlay<Id extends OverlayId>(overlayId: Id): (options?: OpenOverlayOptions<Id>) => OverlayHandle {\n const dispatch = useSummonDispatch();\n return useCallback(\n (options?: OpenOverlayOptions<Id>) => {\n const multi = getOverlayMeta(overlayId)?.instance === \"multi\";\n const instanceId = options?.instanceId ?? (multi ? newInstanceId(overlayId) : DEFAULT_INSTANCE_ID);\n dispatchOpen(dispatch, overlayId, instanceId, options?.data ?? null);\n return { overlayId, instanceId, close: () => dispatchClose(dispatch, overlayId, instanceId) };\n },\n [dispatch, overlayId],\n );\n}\n\n/** A stable close function for one instance (pass straight to an `onClose` prop). */\nexport function useCloseOverlay(overlayId: OverlayId, instanceId: string = DEFAULT_INSTANCE_ID): () => void {\n const dispatch = useSummonDispatch();\n return useCallback(() => dispatchClose(dispatch, overlayId, instanceId), [dispatch, overlayId, instanceId]);\n}\n"],"mappings":"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","names":["useEffect","Component","jsx","useEffect","jsx","memo","useCallback","useEffect","useRef","useState","createContext","useContext","useEffect","useMemo","useRef","jsx","useOverlayInstance","jsx","useContext","useRef","useMemo","useEffect","jsx","useEffect","memo","InstanceSlot","useCallback","DefinitionSlot","useState","useRef","useCallback","dispatchClose","useCallback","dispatchClose"]}
|
package/dist/window.cjs
CHANGED
|
@@ -132,39 +132,13 @@ function glyph(children) {
|
|
|
132
132
|
);
|
|
133
133
|
};
|
|
134
134
|
}
|
|
135
|
-
var XIcon = glyph(/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
136
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M18 6 6 18" }),
|
|
137
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m6 6 12 12" })
|
|
138
|
-
] }));
|
|
139
135
|
var MinusIcon = glyph(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M5 12h14" }));
|
|
140
|
-
var Maximize2Icon = glyph(/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
141
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M15 3h6v6" }),
|
|
142
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m21 3-7 7" }),
|
|
143
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m3 21 7-7" }),
|
|
144
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M9 21H3v-6" })
|
|
145
|
-
] }));
|
|
146
|
-
var Minimize2Icon = glyph(/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
147
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m14 10 7-7" }),
|
|
148
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M20 10h-6V4" }),
|
|
149
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m3 21 7-7" }),
|
|
150
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M4 14h6v6" })
|
|
151
|
-
] }));
|
|
152
136
|
var RectangleVerticalIcon = glyph(/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { width: "12", height: "20", x: "6", y: "2", rx: "2" }));
|
|
153
137
|
var PanelLeftCloseIcon = glyph(/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
154
138
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { width: "18", height: "18", x: "3", y: "3", rx: "2" }),
|
|
155
139
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M9 3v18" }),
|
|
156
140
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m16 15-3-3 3-3" })
|
|
157
141
|
] }));
|
|
158
|
-
var PanelLeftIcon = glyph(/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
159
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { width: "18", height: "18", x: "3", y: "3", rx: "2" }),
|
|
160
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M9 3v18" })
|
|
161
|
-
] }));
|
|
162
|
-
var AppWindowIcon = glyph(/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
163
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "2", y: "4", width: "20", height: "16", rx: "2" }),
|
|
164
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M10 4v4" }),
|
|
165
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M2 8h20" }),
|
|
166
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M6 4v4" })
|
|
167
|
-
] }));
|
|
168
142
|
var SaveIcon = glyph(
|
|
169
143
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
170
144
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z" }),
|
|
@@ -172,19 +146,15 @@ var SaveIcon = glyph(
|
|
|
172
146
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M7 3v4a1 1 0 0 0 1 1h7" })
|
|
173
147
|
] })
|
|
174
148
|
);
|
|
175
|
-
var TriangleAlertIcon = glyph(
|
|
176
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
177
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" }),
|
|
178
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 9v4" }),
|
|
179
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 17h.01" })
|
|
180
|
-
] })
|
|
181
|
-
);
|
|
182
149
|
var ArrowLeftToLineIcon = glyph(/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
183
150
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M3 19V5" }),
|
|
184
151
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "m13 6-6 6 6 6" }),
|
|
185
152
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M7 12h14" })
|
|
186
153
|
] }));
|
|
187
154
|
|
|
155
|
+
// src/window/WindowPanel.tsx
|
|
156
|
+
var import_icons8 = require("@ai-matrx/design-system/icons");
|
|
157
|
+
|
|
188
158
|
// src/window/LayoutIcon.tsx
|
|
189
159
|
var import_cn = require("@ai-matrx/design-system/cn");
|
|
190
160
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
@@ -858,6 +828,7 @@ var import_react4 = require("react");
|
|
|
858
828
|
var import_design_system2 = require("@ai-matrx/design-system");
|
|
859
829
|
var import_design_system3 = require("@ai-matrx/design-system");
|
|
860
830
|
var import_cn3 = require("@ai-matrx/design-system/cn");
|
|
831
|
+
var import_icons = require("@ai-matrx/design-system/icons");
|
|
861
832
|
|
|
862
833
|
// src/window/chrome/MobileTitleRow.tsx
|
|
863
834
|
var import_cn2 = require("@ai-matrx/design-system/cn");
|
|
@@ -963,7 +934,7 @@ function MobileDrawerSurface({
|
|
|
963
934
|
size: "icon",
|
|
964
935
|
className: "h-8 w-8 shrink-0",
|
|
965
936
|
"aria-label": "Close",
|
|
966
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(XIcon, { className: "w-4 h-4" })
|
|
937
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons.XIcon, { className: "w-4 h-4" })
|
|
967
938
|
}
|
|
968
939
|
) }),
|
|
969
940
|
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
@@ -991,7 +962,7 @@ function MobileDrawerSurface({
|
|
|
991
962
|
className: "h-8 w-8",
|
|
992
963
|
"aria-label": sidebarOpen ? "Close sidebar" : "Open sidebar",
|
|
993
964
|
onClick: () => setSidebarOpen((v) => !v),
|
|
994
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PanelLeftIcon, { className: "w-4 h-4" })
|
|
965
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons.PanelLeftIcon, { className: "w-4 h-4" })
|
|
995
966
|
}
|
|
996
967
|
)
|
|
997
968
|
] }) : null
|
|
@@ -1033,7 +1004,7 @@ function MobileDrawerSurface({
|
|
|
1033
1004
|
size: "icon",
|
|
1034
1005
|
className: "h-8 w-8",
|
|
1035
1006
|
"aria-label": "Close sidebar",
|
|
1036
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(XIcon, { className: "w-4 h-4" })
|
|
1007
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_icons.XIcon, { className: "w-4 h-4" })
|
|
1037
1008
|
}
|
|
1038
1009
|
) })
|
|
1039
1010
|
] }),
|
|
@@ -1053,6 +1024,7 @@ var import_react_dom = require("react-dom");
|
|
|
1053
1024
|
var import_design_system4 = require("@ai-matrx/design-system");
|
|
1054
1025
|
var import_design_system5 = require("@ai-matrx/design-system");
|
|
1055
1026
|
var import_cn4 = require("@ai-matrx/design-system/cn");
|
|
1027
|
+
var import_icons2 = require("@ai-matrx/design-system/icons");
|
|
1056
1028
|
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
1057
1029
|
function MobileCardSurface({
|
|
1058
1030
|
title,
|
|
@@ -1109,7 +1081,7 @@ function MobileCardSurface({
|
|
|
1109
1081
|
className: "h-11 w-11 shrink-0",
|
|
1110
1082
|
"aria-label": "Close",
|
|
1111
1083
|
onClick: onClose,
|
|
1112
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(XIcon, { className: "w-3.5 h-3.5" })
|
|
1084
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_icons2.XIcon, { className: "w-3.5 h-3.5" })
|
|
1113
1085
|
}
|
|
1114
1086
|
),
|
|
1115
1087
|
children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(MobileWindowTitle, { title })
|
|
@@ -1202,6 +1174,9 @@ function DebugStrip({ rect, zIndex }) {
|
|
|
1202
1174
|
] });
|
|
1203
1175
|
}
|
|
1204
1176
|
|
|
1177
|
+
// src/window/chrome/MobileHeader.tsx
|
|
1178
|
+
var import_icons4 = require("@ai-matrx/design-system/icons");
|
|
1179
|
+
|
|
1205
1180
|
// src/window/chrome/chromeClasses.ts
|
|
1206
1181
|
var import_cn5 = require("@ai-matrx/design-system/cn");
|
|
1207
1182
|
var WINDOW_CHROME_INTERACTIVE = "[&_button:not(:disabled)]:cursor-pointer [&_a]:cursor-pointer [&_[role=button]:not([aria-disabled=true])]:cursor-pointer [&_summary]:cursor-pointer [&_label:has(input,[role=checkbox],[role=radio])]:cursor-pointer";
|
|
@@ -1230,7 +1205,7 @@ function MobileWindowHeader({
|
|
|
1230
1205
|
className: "flex h-11 w-11 shrink-0 cursor-pointer items-center justify-center",
|
|
1231
1206
|
onClick: onClose,
|
|
1232
1207
|
"aria-label": "Close",
|
|
1233
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "flex h-6 w-6 items-center justify-center rounded-full matrx-window-light-close", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(XIcon, { className: "h-2.5 w-2.5 matrx-window-light-glyph" }) })
|
|
1208
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "flex h-6 w-6 items-center justify-center rounded-full matrx-window-light-close", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_icons4.XIcon, { className: "h-2.5 w-2.5 matrx-window-light-glyph" }) })
|
|
1234
1209
|
}
|
|
1235
1210
|
),
|
|
1236
1211
|
onMinimize && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
|
|
@@ -1264,6 +1239,7 @@ function MobileWindowHeader({
|
|
|
1264
1239
|
|
|
1265
1240
|
// src/window/chrome/DeprecationBanner.tsx
|
|
1266
1241
|
var import_react7 = require("react");
|
|
1242
|
+
var import_icons5 = require("@ai-matrx/design-system/icons");
|
|
1267
1243
|
var import_cn6 = require("@ai-matrx/design-system/cn");
|
|
1268
1244
|
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
1269
1245
|
function DeprecationBanner({
|
|
@@ -1282,7 +1258,7 @@ function DeprecationBanner({
|
|
|
1282
1258
|
className
|
|
1283
1259
|
),
|
|
1284
1260
|
children: [
|
|
1285
|
-
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
1261
|
+
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_icons5.AlertTriangleIcon, { className: "w-3.5 h-3.5 mt-[1px] shrink-0" }),
|
|
1286
1262
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "flex-1 break-words", children: message }),
|
|
1287
1263
|
/* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
|
|
1288
1264
|
"button",
|
|
@@ -1291,7 +1267,7 @@ function DeprecationBanner({
|
|
|
1291
1267
|
"aria-label": "Dismiss deprecation notice",
|
|
1292
1268
|
className: "shrink-0 rounded hover:bg-destructive/20 p-0.5 transition-colors",
|
|
1293
1269
|
onClick: () => setDismissed(true),
|
|
1294
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(XIcon, { className: "w-3 h-3" })
|
|
1270
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_icons5.XIcon, { className: "w-3 h-3" })
|
|
1295
1271
|
}
|
|
1296
1272
|
)
|
|
1297
1273
|
]
|
|
@@ -3140,7 +3116,7 @@ function PopOutHeaderButton({ onClick }) {
|
|
|
3140
3116
|
onPointerDown: (e) => e.stopPropagation(),
|
|
3141
3117
|
title: "Pop out into a separate window",
|
|
3142
3118
|
"aria-label": "Pop out into a separate window",
|
|
3143
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(AppWindowIcon, { className: "w-3.5 h-3.5" })
|
|
3119
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_icons8.AppWindowIcon, { className: "w-3.5 h-3.5" })
|
|
3144
3120
|
}
|
|
3145
3121
|
);
|
|
3146
3122
|
}
|
|
@@ -3298,7 +3274,7 @@ function TrafficLightGroup({
|
|
|
3298
3274
|
TrafficLight,
|
|
3299
3275
|
{
|
|
3300
3276
|
color: "red",
|
|
3301
|
-
icon: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(XIcon, { className: "w-2 h-2 matrx-window-light-glyph" }),
|
|
3277
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_icons8.XIcon, { className: "w-2 h-2 matrx-window-light-glyph" }),
|
|
3302
3278
|
onClick: onClose ?? void 0,
|
|
3303
3279
|
disabled: !onClose,
|
|
3304
3280
|
"aria-label": "Close"
|
|
@@ -3309,7 +3285,7 @@ function TrafficLightGroup({
|
|
|
3309
3285
|
{
|
|
3310
3286
|
color: "yellow",
|
|
3311
3287
|
icon: isMinimized ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3312
|
-
Maximize2Icon,
|
|
3288
|
+
import_icons8.Maximize2Icon,
|
|
3313
3289
|
{
|
|
3314
3290
|
className: "w-2 h-2 matrx-window-light-glyph"
|
|
3315
3291
|
}
|
|
@@ -3347,7 +3323,7 @@ function TrafficLightGroup({
|
|
|
3347
3323
|
onClick: onToggleSidebar,
|
|
3348
3324
|
title: sidebarOpen ? "Hide sidebar" : "Show sidebar",
|
|
3349
3325
|
"aria-label": sidebarOpen ? "Hide sidebar" : "Show sidebar",
|
|
3350
|
-
children: sidebarOpen ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(PanelLeftCloseIcon, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(PanelLeftIcon, { className: "w-3.5 h-3.5" })
|
|
3326
|
+
children: sidebarOpen ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(PanelLeftCloseIcon, { className: "w-3.5 h-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_icons8.PanelLeftIcon, { className: "w-3.5 h-3.5" })
|
|
3351
3327
|
}
|
|
3352
3328
|
)
|
|
3353
3329
|
] });
|
|
@@ -3450,12 +3426,12 @@ function GreenTrafficLight({
|
|
|
3450
3426
|
onPointerDown: (e) => e.stopPropagation(),
|
|
3451
3427
|
"aria-label": isMaximized ? "Restore" : "Maximize",
|
|
3452
3428
|
children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "opacity-0 group-hover/tl:opacity-100 transition-opacity duration-100 flex items-center justify-center relative w-full h-full", children: isMaximized ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3453
|
-
Minimize2Icon,
|
|
3429
|
+
import_icons8.Minimize2Icon,
|
|
3454
3430
|
{
|
|
3455
3431
|
className: "w-2 h-2 matrx-window-light-glyph absolute"
|
|
3456
3432
|
}
|
|
3457
3433
|
) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
|
|
3458
|
-
Maximize2Icon,
|
|
3434
|
+
import_icons8.Maximize2Icon,
|
|
3459
3435
|
{
|
|
3460
3436
|
className: "w-2 h-2 matrx-window-light-glyph absolute"
|
|
3461
3437
|
}
|
|
@@ -3635,7 +3611,7 @@ function GreenTrafficLight({
|
|
|
3635
3611
|
onClick: () => handleAction(onToggleMaximize),
|
|
3636
3612
|
onPointerDown: (e) => e.stopPropagation(),
|
|
3637
3613
|
children: isMaximized ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
|
|
3638
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Minimize2Icon, { className: "w-3.5 h-3.5 shrink-0" }),
|
|
3614
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_icons8.Minimize2Icon, { className: "w-3.5 h-3.5 shrink-0" }),
|
|
3639
3615
|
" Exit Full Screen"
|
|
3640
3616
|
] }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
|
|
3641
3617
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(RectangleVerticalIcon, { className: "w-3.5 h-3.5 shrink-0" }),
|
|
@@ -3651,7 +3627,7 @@ function GreenTrafficLight({
|
|
|
3651
3627
|
onClick: () => handleAction(onRestore),
|
|
3652
3628
|
onPointerDown: (e) => e.stopPropagation(),
|
|
3653
3629
|
children: [
|
|
3654
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Maximize2Icon, { className: "w-3.5 h-3.5 shrink-0" }),
|
|
3630
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_icons8.Maximize2Icon, { className: "w-3.5 h-3.5 shrink-0" }),
|
|
3655
3631
|
"Restore window"
|
|
3656
3632
|
]
|
|
3657
3633
|
}
|
|
@@ -3667,7 +3643,7 @@ function GreenTrafficLight({
|
|
|
3667
3643
|
onPointerDown: (e) => e.stopPropagation(),
|
|
3668
3644
|
title: "Pop out into a separate window",
|
|
3669
3645
|
children: [
|
|
3670
|
-
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(AppWindowIcon, { className: "w-3.5 h-3.5 shrink-0" }),
|
|
3646
|
+
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_icons8.AppWindowIcon, { className: "w-3.5 h-3.5 shrink-0" }),
|
|
3671
3647
|
/* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "flex-1 text-left", children: "Pop out" })
|
|
3672
3648
|
]
|
|
3673
3649
|
}
|