@iota-uz/sdk 0.4.23 → 0.4.25

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/dist/index.cjs CHANGED
@@ -279,8 +279,27 @@ function defineReactAppletElement(options) {
279
279
  static get observedAttributes() {
280
280
  return Array.from(getEntry().observed);
281
281
  }
282
+ get useShadow() {
283
+ return getEntry().options.shadow !== false;
284
+ }
285
+ /** The root node that holds the container and styles (shadow root or the element itself). Call ensureMountMode() before reading when using shadow. */
286
+ get styleRoot() {
287
+ if (!this.useShadow) {
288
+ return this;
289
+ }
290
+ if (!this.shadowRoot) {
291
+ throw new Error(`[${tagName}] shadowRoot missing; call ensureMountMode() first`);
292
+ }
293
+ return this.shadowRoot;
294
+ }
295
+ /** Ensures shadow root exists when needed and the React container is in the correct root (shadow or light). */
296
+ ensureMountMode() {
297
+ const targetRoot = this.useShadow ? this.shadowRoot ?? this.attachShadow({ mode: "open" }) : this;
298
+ if (this.container && this.container.parentNode !== targetRoot) {
299
+ targetRoot.appendChild(this.container);
300
+ }
301
+ }
282
302
  connectedCallback() {
283
- const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: "open" });
284
303
  if (!this.container) {
285
304
  this.container = document.createElement("div");
286
305
  this.container.id = "react-root";
@@ -291,12 +310,14 @@ function defineReactAppletElement(options) {
291
310
  this.container.style.height = "100%";
292
311
  this.container.style.width = "100%";
293
312
  }
294
- const existingContainer = shadowRoot.querySelector("#react-root");
313
+ this.ensureMountMode();
314
+ const root = this.styleRoot;
315
+ const existingContainer = root.querySelector("#react-root");
295
316
  if (!existingContainer) {
296
- if (this.styleEl) {
297
- shadowRoot.appendChild(this.styleEl);
317
+ if (this.useShadow && this.styleEl) {
318
+ root.appendChild(this.styleEl);
298
319
  }
299
- shadowRoot.appendChild(this.container);
320
+ root.appendChild(this.container);
300
321
  } else if (existingContainer !== this.container) {
301
322
  this.container = existingContainer;
302
323
  }
@@ -323,6 +344,14 @@ function defineReactAppletElement(options) {
323
344
  this.darkModeObserver = null;
324
345
  this.reactRoot?.unmount();
325
346
  this.reactRoot = null;
347
+ if (this.styleEl) {
348
+ if (this.styleEl.parentNode === document.head) {
349
+ releaseLightStyle(tagName);
350
+ } else {
351
+ this.styleEl.remove();
352
+ }
353
+ this.styleEl = null;
354
+ }
326
355
  }
327
356
  attributeChangedCallback(_name, oldValue, newValue) {
328
357
  if (oldValue === newValue) {
@@ -356,16 +385,44 @@ function defineReactAppletElement(options) {
356
385
  }
357
386
  }
358
387
  syncFromRegistry() {
388
+ this.ensureMountMode();
359
389
  const entry = getEntry();
360
390
  const styles = typeof entry.options.styles === "function" ? entry.options.styles() : entry.options.styles;
361
391
  if (styles) {
362
- this.styleEl ?? (this.styleEl = document.createElement("style"));
363
- this.styleEl.textContent = styles;
364
- if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {
365
- this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild);
392
+ if (this.useShadow) {
393
+ if (this.styleEl && this.styleEl.parentNode === document.head) {
394
+ releaseLightStyle(tagName);
395
+ this.styleEl = null;
396
+ }
397
+ this.styleEl ?? (this.styleEl = document.createElement("style"));
398
+ this.styleEl.textContent = styles;
399
+ if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {
400
+ this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild);
401
+ }
402
+ } else {
403
+ if (this.styleEl && this.shadowRoot?.contains(this.styleEl)) {
404
+ this.styleEl.remove();
405
+ this.styleEl = null;
406
+ }
407
+ if (this.styleEl && this.styleEl.parentNode !== document.head) {
408
+ releaseLightStyle(tagName);
409
+ this.styleEl = null;
410
+ }
411
+ if (!this.styleEl) {
412
+ this.styleEl = getOrCreateLightStyle(tagName, styles);
413
+ } else {
414
+ this.styleEl.textContent = styles;
415
+ }
416
+ if (!document.head.contains(this.styleEl)) {
417
+ document.head.appendChild(this.styleEl);
418
+ }
366
419
  }
367
420
  } else if (this.styleEl) {
368
- this.styleEl.remove();
421
+ if (this.styleEl.parentNode === document.head) {
422
+ releaseLightStyle(tagName);
423
+ } else {
424
+ this.styleEl.remove();
425
+ }
369
426
  this.styleEl = null;
370
427
  }
371
428
  if (entry.options.observeDarkMode !== false) {
@@ -400,6 +457,36 @@ function getRegistry() {
400
457
  g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ?? (g.__IOTA_REACT_APPLET_HOST_REGISTRY__ = /* @__PURE__ */ new Map());
401
458
  return g.__IOTA_REACT_APPLET_HOST_REGISTRY__;
402
459
  }
460
+ function getLightStyleRegistry() {
461
+ const g = globalThis;
462
+ g.__IOTA_REACT_APPLET_LIGHT_STYLES__ ?? (g.__IOTA_REACT_APPLET_LIGHT_STYLES__ = /* @__PURE__ */ new Map());
463
+ return g.__IOTA_REACT_APPLET_LIGHT_STYLES__;
464
+ }
465
+ function getOrCreateLightStyle(tagName, styles) {
466
+ const registry = getLightStyleRegistry();
467
+ let entry = registry.get(tagName);
468
+ if (!entry) {
469
+ const el = document.createElement("style");
470
+ el.id = `${tagName}-styles`;
471
+ entry = { element: el, refCount: 0 };
472
+ registry.set(tagName, entry);
473
+ }
474
+ entry.refCount++;
475
+ entry.element.textContent = styles;
476
+ return entry.element;
477
+ }
478
+ function releaseLightStyle(tagName) {
479
+ const registry = getLightStyleRegistry();
480
+ const entry = registry.get(tagName);
481
+ if (!entry) {
482
+ return;
483
+ }
484
+ entry.refCount--;
485
+ if (entry.refCount <= 0) {
486
+ entry.element.remove();
487
+ registry.delete(tagName);
488
+ }
489
+ }
403
490
 
404
491
  // ui/src/applet-devtools/enabled.ts
405
492
  function shouldEnableAppletDevtools() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../ui/src/applet-core/context/AppletContext.tsx","../ui/src/applet-core/context/ConfigProvider.tsx","../ui/src/applet-core/hooks/useAppletContext.ts","../ui/src/applet-core/hooks/useConfig.ts","../ui/src/applet-core/hooks/useUser.ts","../ui/src/applet-core/hooks/usePermissions.ts","../ui/src/applet-core/hooks/useTranslation.ts","../ui/src/applet-core/hooks/useSession.ts","../ui/src/applet-core/hooks/useRoute.ts","../ui/src/applet-core/hooks/useStreaming.ts","../ui/src/applet-core/hooks/useAppletRuntime.ts","../ui/src/applet-host/react-element.ts","../ui/src/applet-devtools/enabled.ts","../ui/src/applet-host/rpc.ts","../ui/src/applet-host/router.tsx","../ui/src/applet-devtools/overlay.tsx"],"names":["createContext","useContext","jsx","useAppletContext","useMemo","useState","useRef","useCallback","createRoot","useEffect","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useContext, ReactNode } from 'react';\nimport type { InitialContext } from '../types';\n\n/**\n * AppletContext provides access to the global context injected by the backend.\n * The context is read from window.__*_CONTEXT__ (configured via windowKey).\n */\nconst AppletContext = createContext<InitialContext | null>(null);\n\nconst REQUIRED_KEYS: Array<keyof InitialContext> = ['user', 'tenant', 'locale', 'config', 'route', 'session'];\n\nfunction validateInitialContext(value: unknown, windowKey: string): InitialContext {\n if (!value || typeof value !== 'object') {\n throw new Error(`${windowKey}: expected an object, got ${typeof value}`);\n }\n const obj = value as Record<string, unknown>;\n const missing = REQUIRED_KEYS.filter((k) => !(k in obj));\n if (missing.length > 0) {\n throw new Error(`${windowKey}: missing required keys: ${missing.join(', ')}`);\n }\n\n // Deep validation for nested required fields\n const user = obj.user as Record<string, unknown> | undefined;\n if (!user || typeof user !== 'object') {\n throw new Error(`${windowKey}.user: expected an object, got ${typeof user}`);\n }\n if (typeof user.id !== 'number') {\n throw new Error(`${windowKey}.user.id: expected number, got ${typeof user.id}`);\n }\n if (!Array.isArray(user.permissions)) {\n throw new Error(`${windowKey}.user.permissions: expected array, got ${typeof user.permissions}`);\n }\n\n const tenant = obj.tenant as Record<string, unknown> | undefined;\n if (!tenant || typeof tenant !== 'object') {\n throw new Error(`${windowKey}.tenant: expected an object, got ${typeof tenant}`);\n }\n if (typeof tenant.id !== 'string') {\n throw new Error(`${windowKey}.tenant.id: expected string, got ${typeof tenant.id}`);\n }\n\n const session = obj.session as Record<string, unknown> | undefined;\n if (!session || typeof session !== 'object') {\n throw new Error(`${windowKey}.session: expected an object, got ${typeof session}`);\n }\n if (typeof session.csrfToken !== 'string') {\n throw new Error(`${windowKey}.session.csrfToken: expected string, got ${typeof session.csrfToken}`);\n }\n if (typeof session.expiresAt !== 'number') {\n throw new Error(`${windowKey}.session.expiresAt: expected number, got ${typeof session.expiresAt}`);\n }\n if (typeof session.refreshURL !== 'string') {\n throw new Error(`${windowKey}.session.refreshURL: expected string, got ${typeof session.refreshURL}`);\n }\n\n const config = obj.config;\n if (!config || typeof config !== 'object') {\n throw new Error(`${windowKey}.config: expected object, got ${typeof config}`);\n }\n\n return value as InitialContext;\n}\n\nexport interface AppletProviderProps {\n children: ReactNode\n windowKey: string\n context?: InitialContext\n}\n\n/**\n * AppletProvider reads context from window global and provides it to hooks.\n *\n * Usage:\n * <AppletProvider windowKey=\"__APPLET_CONTEXT__\">\n * <App />\n * </AppletProvider>\n */\nexport function AppletProvider({ children, windowKey, context }: AppletProviderProps) {\n // Use provided context or read from window global\n const raw = context ?? (window as unknown as Record<string, unknown>)[windowKey];\n\n if (!raw) {\n throw new Error(`${windowKey} not found on window. Ensure backend context injection is working.`);\n }\n\n const initialContext = validateInitialContext(raw, windowKey);\n\n return (\n <AppletContext.Provider value={initialContext}>\n {children}\n </AppletContext.Provider>\n );\n}\n\n/**\n * useAppletContext provides access to the full applet context.\n * Use specialized hooks (useUser, useConfig, etc.) for specific context parts.\n */\nexport function useAppletContext<T = InitialContext>(): T {\n const context = useContext(AppletContext);\n if (!context) {\n throw new Error('useAppletContext must be used within AppletProvider');\n }\n return context as T;\n}\n","import { createContext, useContext, ReactNode } from 'react';\nimport type { InitialContext } from '../types';\n\n/**\n * ConfigProvider is an alternative to AppletProvider that accepts context via props\n * instead of reading from window global. Useful for testing and server-side rendering.\n */\n\nconst ConfigContext = createContext<InitialContext | null>(null);\n\nexport interface ConfigProviderProps {\n children: ReactNode\n config: InitialContext\n}\n\n/**\n * ConfigProvider accepts context configuration via props.\n *\n * Usage:\n * <ConfigProvider config={initialContext}>\n * <App />\n * </ConfigProvider>\n */\nexport function ConfigProvider({ children, config }: ConfigProviderProps) {\n return (\n <ConfigContext.Provider value={config}>\n {children}\n </ConfigContext.Provider>\n );\n}\n\n/**\n * useConfigContext provides access to the applet context when using ConfigProvider.\n */\nexport function useConfigContext<T = InitialContext>(): T {\n const context = useContext(ConfigContext);\n if (!context) {\n throw new Error('useConfigContext must be used within ConfigProvider');\n }\n return context as T;\n}\n","import type { InitialContext } from '../types';\n\n/**\n * useAppletContext provides direct access to the window global context.\n * This is a standalone version that doesn't require AppletProvider.\n *\n * Usage:\n * const context = useAppletContext('__APPLET_CONTEXT__')\n *\n * Note: Prefer using AppletProvider + context hooks for better type safety\n * and testability. Use this hook only when provider setup is not possible.\n */\nexport function useAppletContext<T = InitialContext>(windowKey: string): T {\n const context = (window as unknown as Record<string, unknown>)[windowKey];\n\n if (!context) {\n throw new Error(`${windowKey} not found on window. Ensure backend context injection is working.`);\n }\n\n return context as T;\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { AppConfig } from '../types';\n\n/**\n * useConfig provides access to applet configuration (endpoints, etc.)\n *\n * Usage:\n * const { graphQLEndpoint, streamEndpoint } = useConfig()\n */\nexport function useConfig(): AppConfig {\n const { config } = useAppletContext();\n return config;\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { UserContext } from '../types';\n\n/**\n * useUser provides access to current user information.\n *\n * Usage:\n * const { id, email, firstName, lastName, permissions } = useUser()\n */\nexport function useUser(): UserContext {\n const { user } = useAppletContext();\n return user;\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { PermissionsHook } from '../types';\n\n/**\n * usePermissions provides permission checking utilities.\n * All user permissions are automatically passed from backend.\n *\n * Usage:\n * const { hasPermission, hasAnyPermission } = usePermissions()\n *\n * if (hasPermission('BiChat.Access')) {\n * // User has bichat access\n * }\n *\n * if (hasAnyPermission('finance.view', 'finance.edit')) {\n * // User has at least one of these permissions\n * }\n */\nexport function usePermissions(): PermissionsHook {\n const { user } = useAppletContext();\n\n const hasPermission = (permission: string): boolean => {\n return user.permissions.includes(permission);\n };\n\n const hasAnyPermission = (...permissions: string[]): boolean => {\n return permissions.some(p => user.permissions.includes(p));\n };\n\n return {\n hasPermission,\n hasAnyPermission,\n permissions: user.permissions\n };\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { TranslationHook } from '../types';\n\n/**\n * useTranslation provides i18n translation utilities.\n * All translations are automatically passed from backend locale bundle.\n *\n * Usage:\n * const { t, language } = useTranslation()\n *\n * // Simple translation\n * t('BiChat.Title') // Returns translated text\n *\n * // Translation with interpolation\n * t('Common.WelcomeMessage', { name: 'John' })\n * // If translation is \"Welcome {name}!\" -> Returns \"Welcome John!\"\n *\n * React uses same keys as Go backend:\n * Go: pageCtx.T(\"BiChat.Title\")\n * React: t(\"BiChat.Title\")\n */\nexport function useTranslation(): TranslationHook {\n const { locale } = useAppletContext();\n\n const t = (key: string, params?: Record<string, unknown>): string => {\n let text = locale.translations[key] || key;\n\n // Simple interpolation: \"Hello {name}\" with {name: \"World\"}\n if (params) {\n Object.entries(params).forEach(([k, v]) => {\n text = text.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), String(v));\n });\n }\n\n return text;\n };\n\n return {\n t,\n language: locale.language\n };\n}\n","import { useMemo } from 'react';\nimport { useAppletContext } from '../context/AppletContext';\nimport type { SessionHook } from '../types';\n\nexport interface UseSessionOptions {\n loginPath?: string\n}\n\n/**\n * useSession provides session and authentication handling utilities.\n *\n * Usage:\n * const { isExpiringSoon, refreshSession, csrfToken } = useSession()\n *\n * // Check if session is expiring soon (5 min buffer)\n * if (isExpiringSoon) {\n * await refreshSession()\n * }\n *\n * // Include CSRF token in requests\n * fetch('/api/endpoint', {\n * headers: { 'X-CSRF-Token': csrfToken }\n * })\n */\nexport function useSession(options?: UseSessionOptions): SessionHook {\n const { session } = useAppletContext();\n const loginPath = options?.loginPath ?? '/login';\n\n // Check if session is expiring soon (5 minute buffer)\n const isExpiringSoon = useMemo(() => {\n const bufferMs = 5 * 60 * 1000; // 5 minutes\n return session.expiresAt - Date.now() < bufferMs;\n }, [session.expiresAt]);\n\n const refreshSession = async (): Promise<void> => {\n const response = await fetch(session.refreshURL, {\n method: 'POST',\n headers: {\n 'X-CSRF-Token': session.csrfToken\n }\n });\n\n if (!response.ok) {\n // Session refresh failed - redirect to login with return URL\n const returnUrl = encodeURIComponent(window.location.pathname);\n window.location.href = `${loginPath}?redirect=${returnUrl}`;\n return;\n }\n\n // Dispatch event for CSRF token update\n const newToken = response.headers.get('X-CSRF-Token');\n if (newToken) {\n window.dispatchEvent(\n new CustomEvent('iota:csrf-refresh', {\n detail: { token: newToken }\n })\n );\n }\n };\n\n return {\n isExpiringSoon,\n refreshSession,\n csrfToken: session.csrfToken,\n expiresAt: session.expiresAt\n };\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { RouteContext } from '../types';\n\n/**\n * useRoute provides access to the current route context.\n * Route context is initialized from the backend and includes path, params, and query.\n *\n * Usage:\n * const { path, params, query } = useRoute()\n *\n * // Example values:\n * // path: \"/sessions/123\"\n * // params: { id: \"123\" }\n * // query: { tab: \"history\" }\n */\nexport function useRoute(): RouteContext {\n const { route } = useAppletContext();\n return route;\n}\n","import { useState, useRef, useCallback } from 'react';\nimport type { StreamingHook } from '../types';\n\n/**\n * useStreaming provides SSE (Server-Sent Events) streaming utilities with cancellation support.\n *\n * Usage:\n * const { isStreaming, processStream, cancel, reset } = useStreaming()\n *\n * // Process async generator stream\n * await processStream(messageStream, (chunk) => {\n * console.log('Received:', chunk)\n * })\n *\n * // Cancel ongoing stream\n * cancel()\n *\n * // Reset state after stream completion\n * reset()\n */\nexport function useStreaming(): StreamingHook {\n const [isStreaming, setIsStreaming] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const processStream = useCallback(\n async <T,>(\n generator: AsyncGenerator<T>,\n onChunk: (chunk: T) => void,\n signal?: AbortSignal\n ): Promise<void> => {\n setIsStreaming(true);\n\n // Create abort controller if not provided\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n // Listen to external signal if provided\n const onExternalAbort = signal ? () => { controller.abort(); } : undefined;\n if (signal && onExternalAbort) {\n signal.addEventListener('abort', onExternalAbort);\n }\n\n try {\n for await (const chunk of generator) {\n // Check if stream was cancelled\n if (controller.signal.aborted) {\n break;\n }\n\n onChunk(chunk);\n }\n } catch (error) {\n // Stream was cancelled or errored\n if (controller.signal.aborted) {\n // Cancellation is expected, don't throw\n return;\n }\n throw error;\n } finally {\n if (signal && onExternalAbort) {\n signal.removeEventListener('abort', onExternalAbort);\n }\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n },\n []\n );\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n setIsStreaming(false);\n }, []);\n\n const reset = useCallback(() => {\n abortControllerRef.current = null;\n setIsStreaming(false);\n }, []);\n\n return {\n isStreaming,\n processStream,\n cancel,\n reset\n };\n}\n","import { useConfig } from './useConfig';\n\nexport type ShellMode = 'embedded' | 'standalone'\n\nexport interface AppletRuntime {\n basePath: string\n assetsBasePath: string\n rpcEndpoint?: string\n shellMode?: ShellMode\n}\n\nexport function useAppletRuntime(): AppletRuntime {\n const config = useConfig();\n\n const basePath = config.basePath ?? '';\n const normalizedBasePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n const assetsBasePath = config.assetsBasePath ?? `${normalizedBasePath || ''}/assets`;\n const rpcEndpoint = config.rpcUIEndpoint;\n const shellMode = config.shellMode;\n\n return { basePath: normalizedBasePath, assetsBasePath, rpcEndpoint, shellMode };\n}\n","import type React from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase();\n\n const registry = getRegistry();\n const existing = registry.get(tagName);\n if (existing) {\n existing.options = options;\n for (const a of options.observedAttributes ?? []) {existing.observed.add(a);}\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode']);\n for (const a of options.observedAttributes ?? []) {observed.add(a);}\n registry.set(tagName, { options, observed });\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }));\n }\n return;\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName);\n if (!entry) {throw new Error(`[${tagName}] applet host registry entry missing`);}\n return entry;\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null;\n private container: HTMLDivElement | null = null;\n private darkModeObserver: MutationObserver | null = null;\n private styleEl: HTMLStyleElement | null = null;\n private updateListener: ((e: Event) => void) | null = null;\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed);\n }\n\n connectedCallback(): void {\n const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: 'open' });\n\n if (!this.container) {\n this.container = document.createElement('div');\n this.container.id = 'react-root';\n this.container.style.display = 'flex';\n this.container.style.flexDirection = 'column';\n this.container.style.flex = '1';\n this.container.style.minHeight = '0';\n this.container.style.height = '100%';\n this.container.style.width = '100%';\n }\n\n const existingContainer = shadowRoot.querySelector('#react-root');\n if (!existingContainer) {\n if (this.styleEl) {shadowRoot.appendChild(this.styleEl);}\n shadowRoot.appendChild(this.container);\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement;\n }\n\n this.syncFromRegistry();\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) {return;}\n const detail = (e as CustomEvent<{ tagName?: string }>).detail;\n if (!detail || detail.tagName !== tagName) {return;}\n this.syncFromRegistry();\n this.renderReact();\n };\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener);\n\n this.renderReact();\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener);\n }\n\n this.darkModeObserver?.disconnect();\n this.darkModeObserver = null;\n\n this.reactRoot?.unmount();\n this.reactRoot = null;\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) {return;}\n if (this.container) {this.renderReact();}\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {};\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value;\n }\n\n const basePath = this.getAttribute('base-path') ?? '';\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined;\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url';\n\n return { basePath, shellMode, routerMode, attrs };\n }\n\n private renderReact(): void {\n if (!this.container) {return;}\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container);\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()));\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err);\n }\n }\n\n private syncFromRegistry(): void {\n const entry = getEntry();\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles;\n if (styles) {\n this.styleEl ??= document.createElement('style');\n this.styleEl.textContent = styles;\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild);\n }\n } else if (this.styleEl) {\n this.styleEl.remove();\n this.styleEl = null;\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode();\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect();\n this.darkModeObserver = null;\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container;\n if (!root) {throw new Error('react root container not found');}\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) {root.classList.add('dark');}\n else {root.classList.remove('dark');}\n };\n\n apply();\n\n const observer = new MutationObserver(apply);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return observer;\n }\n }\n\n customElements.define(tagName, ReactAppletElement);\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const g = globalThis as Record<string, unknown>;\n g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>();\n return g.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>;\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') {return false;}\n\n const url = new URL(window.location.href);\n if (url.searchParams.get('appletDebug') === '1') {return true;}\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1';\n } catch {\n return false;\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled';\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string;\n details?: unknown;\n cause?: unknown;\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message);\n this.name = 'AppletRPCException';\n this.code = args.code;\n this.details = args.details;\n this.cause = args.cause;\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch;\n const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0;\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params };\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const abortController = timeoutMs > 0 ? new AbortController() : undefined;\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n });\n\n try {\n if (abortController) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, timeoutMs);\n }\n\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n signal: abortController?.signal,\n });\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n });\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>;\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n });\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n });\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n });\n\n return json.result as TResult;\n } catch (err) {\n let rpcErr: unknown = err;\n if (err instanceof Error && err.name === 'AbortError') {\n rpcErr = new AppletRPCException({\n code: timedOut ? 'timeout' : 'aborted',\n message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n cause: err,\n });\n }\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: rpcErr,\n });\n throw rpcErr;\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle);\n }\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>;\n }\n\n return { call, callTyped };\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') {return;}\n\n if (!shouldEnableAppletDevtools()) {return;}\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }));\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n return Math.max(0, Math.round(now - startedAt));\n}\n","import type React from 'react';\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<Record<string, unknown>>\n MemoryRouter: React.ComponentType<Record<string, unknown>>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? '';\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter;\n return <MemoryRouter>{children}</MemoryRouter>;\n }\n\n const BrowserRouter = options.BrowserRouter;\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>;\n };\n\n return { Router };\n}\n\n","import { useEffect, useMemo, useState } from 'react';\nimport { useAppletContext } from '../applet-core/context/AppletContext';\nimport { useAppletRuntime } from '../applet-core/hooks/useAppletRuntime';\n\ntype RPCEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nexport function AppletDevtoolsOverlay() {\n const ctx = useAppletContext();\n const runtime = useAppletRuntime();\n const [rpcEvents, setRPCEvents] = useState<RPCEvent[]>([]);\n\n useEffect(() => {\n const onEvent = (e: Event) => {\n if (!(e instanceof CustomEvent)) {return;}\n const detail = (e as CustomEvent<RPCEvent>).detail;\n if (!detail) {return;}\n setRPCEvents((prev) => [detail, ...prev].slice(0, 50));\n };\n window.addEventListener('iota:applet-rpc', onEvent as EventListener);\n return () => window.removeEventListener('iota:applet-rpc', onEvent as EventListener);\n }, []);\n\n const summary = useMemo(() => {\n return {\n basePath: runtime.basePath,\n assetsBasePath: runtime.assetsBasePath,\n rpcEndpoint: runtime.rpcEndpoint,\n shellMode: runtime.shellMode,\n route: ctx.route,\n user: { id: ctx.user.id, email: ctx.user.email },\n tenant: ctx.tenant,\n };\n }, [ctx.route, ctx.tenant, ctx.user.email, ctx.user.id, runtime.assetsBasePath, runtime.basePath, runtime.rpcEndpoint, runtime.shellMode]);\n\n return (\n <div\n style={{\n position: 'fixed',\n right: 12,\n bottom: 12,\n width: 420,\n maxHeight: '60vh',\n overflow: 'auto',\n background: 'rgba(17, 24, 39, 0.92)',\n color: '#E5E7EB',\n border: '1px solid rgba(255,255,255,0.12)',\n borderRadius: 10,\n padding: 12,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n fontSize: 12,\n zIndex: 2147483647,\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>\n <div style={{ fontWeight: 700 }}>Applet Devtools</div>\n <div style={{ opacity: 0.7 }}>{runtime.shellMode ?? 'unknown'}</div>\n </div>\n\n <div style={{ marginBottom: 10 }}>\n <div style={{ opacity: 0.85, marginBottom: 4 }}>Context</div>\n <pre style={{ margin: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{JSON.stringify(summary, null, 2)}</pre>\n </div>\n\n <div>\n <div style={{ opacity: 0.85, marginBottom: 4 }}>RPC</div>\n {rpcEvents.length === 0 ? (\n <div style={{ opacity: 0.7 }}>No calls yet</div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {rpcEvents.map((ev) => (\n <div key={`${ev.id}:${ev.status}`} style={{ padding: 8, border: '1px solid rgba(255,255,255,0.08)', borderRadius: 8 }}>\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <div>{ev.method}</div>\n <div style={{ opacity: 0.8 }}>\n {ev.status}\n {typeof ev.durationMs === 'number' ? ` (${ev.durationMs}ms)` : ''}\n </div>\n </div>\n {ev.status === 'error' ? (\n <pre style={{ margin: '6px 0 0', opacity: 0.8, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {JSON.stringify(serializeError(ev.error) ?? {}, null, 2)}\n </pre>\n ) : null}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction serializeError(err: unknown): unknown {\n if (err instanceof Error) {\n const out: Record<string, unknown> = {\n name: err.name,\n message: err.message,\n };\n if (err.stack) {out.stack = err.stack;}\n const errRecord = err as unknown as Record<string, unknown>;\n if ('code' in err && typeof errRecord.code === 'string') {out.code = errRecord.code;}\n if ('details' in err) {out.details = errRecord.details;}\n if ('cause' in err) {out.cause = errRecord.cause;}\n return out;\n }\n return err;\n}\n"]}
1
+ {"version":3,"sources":["../ui/src/applet-core/context/AppletContext.tsx","../ui/src/applet-core/context/ConfigProvider.tsx","../ui/src/applet-core/hooks/useAppletContext.ts","../ui/src/applet-core/hooks/useConfig.ts","../ui/src/applet-core/hooks/useUser.ts","../ui/src/applet-core/hooks/usePermissions.ts","../ui/src/applet-core/hooks/useTranslation.ts","../ui/src/applet-core/hooks/useSession.ts","../ui/src/applet-core/hooks/useRoute.ts","../ui/src/applet-core/hooks/useStreaming.ts","../ui/src/applet-core/hooks/useAppletRuntime.ts","../ui/src/applet-host/react-element.ts","../ui/src/applet-devtools/enabled.ts","../ui/src/applet-host/rpc.ts","../ui/src/applet-host/router.tsx","../ui/src/applet-devtools/overlay.tsx"],"names":["createContext","useContext","jsx","useAppletContext","useMemo","useState","useRef","useCallback","createRoot","useEffect","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useContext, ReactNode } from 'react';\nimport type { InitialContext } from '../types';\n\n/**\n * AppletContext provides access to the global context injected by the backend.\n * The context is read from window.__*_CONTEXT__ (configured via windowKey).\n */\nconst AppletContext = createContext<InitialContext | null>(null);\n\nconst REQUIRED_KEYS: Array<keyof InitialContext> = ['user', 'tenant', 'locale', 'config', 'route', 'session'];\n\nfunction validateInitialContext(value: unknown, windowKey: string): InitialContext {\n if (!value || typeof value !== 'object') {\n throw new Error(`${windowKey}: expected an object, got ${typeof value}`);\n }\n const obj = value as Record<string, unknown>;\n const missing = REQUIRED_KEYS.filter((k) => !(k in obj));\n if (missing.length > 0) {\n throw new Error(`${windowKey}: missing required keys: ${missing.join(', ')}`);\n }\n\n // Deep validation for nested required fields\n const user = obj.user as Record<string, unknown> | undefined;\n if (!user || typeof user !== 'object') {\n throw new Error(`${windowKey}.user: expected an object, got ${typeof user}`);\n }\n if (typeof user.id !== 'number') {\n throw new Error(`${windowKey}.user.id: expected number, got ${typeof user.id}`);\n }\n if (!Array.isArray(user.permissions)) {\n throw new Error(`${windowKey}.user.permissions: expected array, got ${typeof user.permissions}`);\n }\n\n const tenant = obj.tenant as Record<string, unknown> | undefined;\n if (!tenant || typeof tenant !== 'object') {\n throw new Error(`${windowKey}.tenant: expected an object, got ${typeof tenant}`);\n }\n if (typeof tenant.id !== 'string') {\n throw new Error(`${windowKey}.tenant.id: expected string, got ${typeof tenant.id}`);\n }\n\n const session = obj.session as Record<string, unknown> | undefined;\n if (!session || typeof session !== 'object') {\n throw new Error(`${windowKey}.session: expected an object, got ${typeof session}`);\n }\n if (typeof session.csrfToken !== 'string') {\n throw new Error(`${windowKey}.session.csrfToken: expected string, got ${typeof session.csrfToken}`);\n }\n if (typeof session.expiresAt !== 'number') {\n throw new Error(`${windowKey}.session.expiresAt: expected number, got ${typeof session.expiresAt}`);\n }\n if (typeof session.refreshURL !== 'string') {\n throw new Error(`${windowKey}.session.refreshURL: expected string, got ${typeof session.refreshURL}`);\n }\n\n const config = obj.config;\n if (!config || typeof config !== 'object') {\n throw new Error(`${windowKey}.config: expected object, got ${typeof config}`);\n }\n\n return value as InitialContext;\n}\n\nexport interface AppletProviderProps {\n children: ReactNode\n windowKey: string\n context?: InitialContext\n}\n\n/**\n * AppletProvider reads context from window global and provides it to hooks.\n *\n * Usage:\n * <AppletProvider windowKey=\"__APPLET_CONTEXT__\">\n * <App />\n * </AppletProvider>\n */\nexport function AppletProvider({ children, windowKey, context }: AppletProviderProps) {\n // Use provided context or read from window global\n const raw = context ?? (window as unknown as Record<string, unknown>)[windowKey];\n\n if (!raw) {\n throw new Error(`${windowKey} not found on window. Ensure backend context injection is working.`);\n }\n\n const initialContext = validateInitialContext(raw, windowKey);\n\n return (\n <AppletContext.Provider value={initialContext}>\n {children}\n </AppletContext.Provider>\n );\n}\n\n/**\n * useAppletContext provides access to the full applet context.\n * Use specialized hooks (useUser, useConfig, etc.) for specific context parts.\n */\nexport function useAppletContext<T = InitialContext>(): T {\n const context = useContext(AppletContext);\n if (!context) {\n throw new Error('useAppletContext must be used within AppletProvider');\n }\n return context as T;\n}\n","import { createContext, useContext, ReactNode } from 'react';\nimport type { InitialContext } from '../types';\n\n/**\n * ConfigProvider is an alternative to AppletProvider that accepts context via props\n * instead of reading from window global. Useful for testing and server-side rendering.\n */\n\nconst ConfigContext = createContext<InitialContext | null>(null);\n\nexport interface ConfigProviderProps {\n children: ReactNode\n config: InitialContext\n}\n\n/**\n * ConfigProvider accepts context configuration via props.\n *\n * Usage:\n * <ConfigProvider config={initialContext}>\n * <App />\n * </ConfigProvider>\n */\nexport function ConfigProvider({ children, config }: ConfigProviderProps) {\n return (\n <ConfigContext.Provider value={config}>\n {children}\n </ConfigContext.Provider>\n );\n}\n\n/**\n * useConfigContext provides access to the applet context when using ConfigProvider.\n */\nexport function useConfigContext<T = InitialContext>(): T {\n const context = useContext(ConfigContext);\n if (!context) {\n throw new Error('useConfigContext must be used within ConfigProvider');\n }\n return context as T;\n}\n","import type { InitialContext } from '../types';\n\n/**\n * useAppletContext provides direct access to the window global context.\n * This is a standalone version that doesn't require AppletProvider.\n *\n * Usage:\n * const context = useAppletContext('__APPLET_CONTEXT__')\n *\n * Note: Prefer using AppletProvider + context hooks for better type safety\n * and testability. Use this hook only when provider setup is not possible.\n */\nexport function useAppletContext<T = InitialContext>(windowKey: string): T {\n const context = (window as unknown as Record<string, unknown>)[windowKey];\n\n if (!context) {\n throw new Error(`${windowKey} not found on window. Ensure backend context injection is working.`);\n }\n\n return context as T;\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { AppConfig } from '../types';\n\n/**\n * useConfig provides access to applet configuration (endpoints, etc.)\n *\n * Usage:\n * const { graphQLEndpoint, streamEndpoint } = useConfig()\n */\nexport function useConfig(): AppConfig {\n const { config } = useAppletContext();\n return config;\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { UserContext } from '../types';\n\n/**\n * useUser provides access to current user information.\n *\n * Usage:\n * const { id, email, firstName, lastName, permissions } = useUser()\n */\nexport function useUser(): UserContext {\n const { user } = useAppletContext();\n return user;\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { PermissionsHook } from '../types';\n\n/**\n * usePermissions provides permission checking utilities.\n * All user permissions are automatically passed from backend.\n *\n * Usage:\n * const { hasPermission, hasAnyPermission } = usePermissions()\n *\n * if (hasPermission('BiChat.Access')) {\n * // User has bichat access\n * }\n *\n * if (hasAnyPermission('finance.view', 'finance.edit')) {\n * // User has at least one of these permissions\n * }\n */\nexport function usePermissions(): PermissionsHook {\n const { user } = useAppletContext();\n\n const hasPermission = (permission: string): boolean => {\n return user.permissions.includes(permission);\n };\n\n const hasAnyPermission = (...permissions: string[]): boolean => {\n return permissions.some(p => user.permissions.includes(p));\n };\n\n return {\n hasPermission,\n hasAnyPermission,\n permissions: user.permissions\n };\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { TranslationHook } from '../types';\n\n/**\n * useTranslation provides i18n translation utilities.\n * All translations are automatically passed from backend locale bundle.\n *\n * Usage:\n * const { t, language } = useTranslation()\n *\n * // Simple translation\n * t('BiChat.Title') // Returns translated text\n *\n * // Translation with interpolation\n * t('Common.WelcomeMessage', { name: 'John' })\n * // If translation is \"Welcome {name}!\" -> Returns \"Welcome John!\"\n *\n * React uses same keys as Go backend:\n * Go: pageCtx.T(\"BiChat.Title\")\n * React: t(\"BiChat.Title\")\n */\nexport function useTranslation(): TranslationHook {\n const { locale } = useAppletContext();\n\n const t = (key: string, params?: Record<string, unknown>): string => {\n let text = locale.translations[key] || key;\n\n // Simple interpolation: \"Hello {name}\" with {name: \"World\"}\n if (params) {\n Object.entries(params).forEach(([k, v]) => {\n text = text.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), String(v));\n });\n }\n\n return text;\n };\n\n return {\n t,\n language: locale.language\n };\n}\n","import { useMemo } from 'react';\nimport { useAppletContext } from '../context/AppletContext';\nimport type { SessionHook } from '../types';\n\nexport interface UseSessionOptions {\n loginPath?: string\n}\n\n/**\n * useSession provides session and authentication handling utilities.\n *\n * Usage:\n * const { isExpiringSoon, refreshSession, csrfToken } = useSession()\n *\n * // Check if session is expiring soon (5 min buffer)\n * if (isExpiringSoon) {\n * await refreshSession()\n * }\n *\n * // Include CSRF token in requests\n * fetch('/api/endpoint', {\n * headers: { 'X-CSRF-Token': csrfToken }\n * })\n */\nexport function useSession(options?: UseSessionOptions): SessionHook {\n const { session } = useAppletContext();\n const loginPath = options?.loginPath ?? '/login';\n\n // Check if session is expiring soon (5 minute buffer)\n const isExpiringSoon = useMemo(() => {\n const bufferMs = 5 * 60 * 1000; // 5 minutes\n return session.expiresAt - Date.now() < bufferMs;\n }, [session.expiresAt]);\n\n const refreshSession = async (): Promise<void> => {\n const response = await fetch(session.refreshURL, {\n method: 'POST',\n headers: {\n 'X-CSRF-Token': session.csrfToken\n }\n });\n\n if (!response.ok) {\n // Session refresh failed - redirect to login with return URL\n const returnUrl = encodeURIComponent(window.location.pathname);\n window.location.href = `${loginPath}?redirect=${returnUrl}`;\n return;\n }\n\n // Dispatch event for CSRF token update\n const newToken = response.headers.get('X-CSRF-Token');\n if (newToken) {\n window.dispatchEvent(\n new CustomEvent('iota:csrf-refresh', {\n detail: { token: newToken }\n })\n );\n }\n };\n\n return {\n isExpiringSoon,\n refreshSession,\n csrfToken: session.csrfToken,\n expiresAt: session.expiresAt\n };\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { RouteContext } from '../types';\n\n/**\n * useRoute provides access to the current route context.\n * Route context is initialized from the backend and includes path, params, and query.\n *\n * Usage:\n * const { path, params, query } = useRoute()\n *\n * // Example values:\n * // path: \"/sessions/123\"\n * // params: { id: \"123\" }\n * // query: { tab: \"history\" }\n */\nexport function useRoute(): RouteContext {\n const { route } = useAppletContext();\n return route;\n}\n","import { useState, useRef, useCallback } from 'react';\nimport type { StreamingHook } from '../types';\n\n/**\n * useStreaming provides SSE (Server-Sent Events) streaming utilities with cancellation support.\n *\n * Usage:\n * const { isStreaming, processStream, cancel, reset } = useStreaming()\n *\n * // Process async generator stream\n * await processStream(messageStream, (chunk) => {\n * console.log('Received:', chunk)\n * })\n *\n * // Cancel ongoing stream\n * cancel()\n *\n * // Reset state after stream completion\n * reset()\n */\nexport function useStreaming(): StreamingHook {\n const [isStreaming, setIsStreaming] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const processStream = useCallback(\n async <T,>(\n generator: AsyncGenerator<T>,\n onChunk: (chunk: T) => void,\n signal?: AbortSignal\n ): Promise<void> => {\n setIsStreaming(true);\n\n // Create abort controller if not provided\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n // Listen to external signal if provided\n const onExternalAbort = signal ? () => { controller.abort(); } : undefined;\n if (signal && onExternalAbort) {\n signal.addEventListener('abort', onExternalAbort);\n }\n\n try {\n for await (const chunk of generator) {\n // Check if stream was cancelled\n if (controller.signal.aborted) {\n break;\n }\n\n onChunk(chunk);\n }\n } catch (error) {\n // Stream was cancelled or errored\n if (controller.signal.aborted) {\n // Cancellation is expected, don't throw\n return;\n }\n throw error;\n } finally {\n if (signal && onExternalAbort) {\n signal.removeEventListener('abort', onExternalAbort);\n }\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n },\n []\n );\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n setIsStreaming(false);\n }, []);\n\n const reset = useCallback(() => {\n abortControllerRef.current = null;\n setIsStreaming(false);\n }, []);\n\n return {\n isStreaming,\n processStream,\n cancel,\n reset\n };\n}\n","import { useConfig } from './useConfig';\n\nexport type ShellMode = 'embedded' | 'standalone'\n\nexport interface AppletRuntime {\n basePath: string\n assetsBasePath: string\n rpcEndpoint?: string\n shellMode?: ShellMode\n}\n\nexport function useAppletRuntime(): AppletRuntime {\n const config = useConfig();\n\n const basePath = config.basePath ?? '';\n const normalizedBasePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n const assetsBasePath = config.assetsBasePath ?? `${normalizedBasePath || ''}/assets`;\n const rpcEndpoint = config.rpcUIEndpoint;\n const shellMode = config.shellMode;\n\n return { basePath: normalizedBasePath, assetsBasePath, rpcEndpoint, shellMode };\n}\n","import { createRoot, type Root } from 'react-dom/client';\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n /**\n * Use Shadow DOM for CSS isolation (default: true).\n *\n * Set to `false` for full-page applets that use libraries requiring\n * document-level DOM access (e.g. Headless UI Dialog portals).\n * When false, styles are injected into document.head instead.\n */\n shadow?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase();\n\n const registry = getRegistry();\n const existing = registry.get(tagName);\n if (existing) {\n existing.options = options;\n for (const a of options.observedAttributes ?? []) {existing.observed.add(a);}\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode']);\n for (const a of options.observedAttributes ?? []) {observed.add(a);}\n registry.set(tagName, { options, observed });\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }));\n }\n return;\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName);\n if (!entry) {throw new Error(`[${tagName}] applet host registry entry missing`);}\n return entry;\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null;\n private container: HTMLDivElement | null = null;\n private darkModeObserver: MutationObserver | null = null;\n private styleEl: HTMLStyleElement | null = null;\n private updateListener: ((e: Event) => void) | null = null;\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed);\n }\n\n private get useShadow(): boolean {\n return getEntry().options.shadow !== false;\n }\n\n /** The root node that holds the container and styles (shadow root or the element itself). Call ensureMountMode() before reading when using shadow. */\n private get styleRoot(): ShadowRoot | this {\n if (!this.useShadow) {\n return this;\n }\n if (!this.shadowRoot) {\n throw new Error(`[${tagName}] shadowRoot missing; call ensureMountMode() first`);\n }\n return this.shadowRoot;\n }\n\n /** Ensures shadow root exists when needed and the React container is in the correct root (shadow or light). */\n private ensureMountMode(): void {\n const targetRoot = this.useShadow\n ? (this.shadowRoot ?? this.attachShadow({ mode: 'open' }))\n : this;\n if (this.container && this.container.parentNode !== targetRoot) {\n targetRoot.appendChild(this.container);\n }\n }\n\n connectedCallback(): void {\n if (!this.container) {\n this.container = document.createElement('div');\n this.container.id = 'react-root';\n this.container.style.display = 'flex';\n this.container.style.flexDirection = 'column';\n this.container.style.flex = '1';\n this.container.style.minHeight = '0';\n this.container.style.height = '100%';\n this.container.style.width = '100%';\n }\n\n this.ensureMountMode();\n const root = this.styleRoot;\n\n const existingContainer = root.querySelector('#react-root');\n if (!existingContainer) {\n if (this.useShadow && this.styleEl) {root.appendChild(this.styleEl);}\n root.appendChild(this.container);\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement;\n }\n\n this.syncFromRegistry();\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) {return;}\n const detail = (e as CustomEvent<{ tagName?: string }>).detail;\n if (!detail || detail.tagName !== tagName) {return;}\n this.syncFromRegistry();\n this.renderReact();\n };\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener);\n\n this.renderReact();\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener);\n }\n\n this.darkModeObserver?.disconnect();\n this.darkModeObserver = null;\n\n this.reactRoot?.unmount();\n this.reactRoot = null;\n\n // Clean up style: release shared light-mode style or remove shadow style\n if (this.styleEl) {\n if (this.styleEl.parentNode === document.head) {\n releaseLightStyle(tagName);\n } else {\n this.styleEl.remove();\n }\n this.styleEl = null;\n }\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) {return;}\n if (this.container) {this.renderReact();}\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {};\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value;\n }\n\n const basePath = this.getAttribute('base-path') ?? '';\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined;\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url';\n\n return { basePath, shellMode, routerMode, attrs };\n }\n\n private renderReact(): void {\n if (!this.container) {return;}\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container);\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()));\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err);\n }\n }\n\n private syncFromRegistry(): void {\n this.ensureMountMode();\n const entry = getEntry();\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles;\n if (styles) {\n if (this.useShadow) {\n // Shadow mode: per-instance <style> in shadow root (release shared if we were in light mode)\n if (this.styleEl && this.styleEl.parentNode === document.head) {\n releaseLightStyle(tagName);\n this.styleEl = null;\n }\n this.styleEl ??= document.createElement('style');\n this.styleEl.textContent = styles;\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild);\n }\n } else {\n // Light mode: shared <style> per tagName in document.head (ref-counted)\n if (this.styleEl && this.shadowRoot?.contains(this.styleEl)) {\n this.styleEl.remove();\n this.styleEl = null;\n }\n // Release any stale ref (orphaned or from a previous cycle) before acquiring a new one.\n if (this.styleEl && this.styleEl.parentNode !== document.head) {\n releaseLightStyle(tagName);\n this.styleEl = null;\n }\n if (!this.styleEl) {\n this.styleEl = getOrCreateLightStyle(tagName, styles);\n } else {\n this.styleEl.textContent = styles;\n }\n if (!document.head.contains(this.styleEl)) {\n document.head.appendChild(this.styleEl);\n }\n }\n } else if (this.styleEl) {\n if (this.styleEl.parentNode === document.head) {\n releaseLightStyle(tagName);\n } else {\n this.styleEl.remove();\n }\n this.styleEl = null;\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode();\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect();\n this.darkModeObserver = null;\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container;\n if (!root) {throw new Error('react root container not found');}\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) {root.classList.add('dark');}\n else {root.classList.remove('dark');}\n };\n\n apply();\n\n const observer = new MutationObserver(apply);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return observer;\n }\n }\n\n customElements.define(tagName, ReactAppletElement);\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const g = globalThis as Record<string, unknown>;\n g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>();\n return g.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>;\n}\n\n// Light-mode style registry: one shared <style> per tagName, ref-counted\ninterface LightStyleEntry {\n element: HTMLStyleElement\n refCount: number\n}\n\nfunction getLightStyleRegistry(): Map<string, LightStyleEntry> {\n const g = globalThis as Record<string, unknown>;\n g.__IOTA_REACT_APPLET_LIGHT_STYLES__ ??= new Map<string, LightStyleEntry>();\n return g.__IOTA_REACT_APPLET_LIGHT_STYLES__ as Map<string, LightStyleEntry>;\n}\n\n/**\n * Returns a shared <style> element for the given tagName (ref-counted).\n * Callers (e.g. syncFromRegistry) are responsible for appending the element\n * to document.head; it is not appended here.\n */\nfunction getOrCreateLightStyle(tagName: string, styles: string): HTMLStyleElement {\n const registry = getLightStyleRegistry();\n let entry = registry.get(tagName);\n if (!entry) {\n const el = document.createElement('style');\n el.id = `${tagName}-styles`;\n entry = { element: el, refCount: 0 };\n registry.set(tagName, entry);\n }\n entry.refCount++;\n entry.element.textContent = styles;\n return entry.element;\n}\n\nfunction releaseLightStyle(tagName: string): void {\n const registry = getLightStyleRegistry();\n const entry = registry.get(tagName);\n if (!entry) {return;}\n entry.refCount--;\n if (entry.refCount <= 0) {\n entry.element.remove();\n registry.delete(tagName);\n }\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') {return false;}\n\n const url = new URL(window.location.href);\n if (url.searchParams.get('appletDebug') === '1') {return true;}\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1';\n } catch {\n return false;\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled';\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string;\n details?: unknown;\n cause?: unknown;\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message);\n this.name = 'AppletRPCException';\n this.code = args.code;\n this.details = args.details;\n this.cause = args.cause;\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch;\n const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0;\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params };\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const abortController = timeoutMs > 0 ? new AbortController() : undefined;\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n });\n\n try {\n if (abortController) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, timeoutMs);\n }\n\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n signal: abortController?.signal,\n });\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n });\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>;\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n });\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n });\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n });\n\n return json.result as TResult;\n } catch (err) {\n let rpcErr: unknown = err;\n if (err instanceof Error && err.name === 'AbortError') {\n rpcErr = new AppletRPCException({\n code: timedOut ? 'timeout' : 'aborted',\n message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n cause: err,\n });\n }\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: rpcErr,\n });\n throw rpcErr;\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle);\n }\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>;\n }\n\n return { call, callTyped };\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') {return;}\n\n if (!shouldEnableAppletDevtools()) {return;}\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }));\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n return Math.max(0, Math.round(now - startedAt));\n}\n","import type React from 'react';\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<Record<string, unknown>>\n MemoryRouter: React.ComponentType<Record<string, unknown>>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? '';\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter;\n return <MemoryRouter>{children}</MemoryRouter>;\n }\n\n const BrowserRouter = options.BrowserRouter;\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>;\n };\n\n return { Router };\n}\n\n","import { useEffect, useMemo, useState } from 'react';\nimport { useAppletContext } from '../applet-core/context/AppletContext';\nimport { useAppletRuntime } from '../applet-core/hooks/useAppletRuntime';\n\ntype RPCEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nexport function AppletDevtoolsOverlay() {\n const ctx = useAppletContext();\n const runtime = useAppletRuntime();\n const [rpcEvents, setRPCEvents] = useState<RPCEvent[]>([]);\n\n useEffect(() => {\n const onEvent = (e: Event) => {\n if (!(e instanceof CustomEvent)) {return;}\n const detail = (e as CustomEvent<RPCEvent>).detail;\n if (!detail) {return;}\n setRPCEvents((prev) => [detail, ...prev].slice(0, 50));\n };\n window.addEventListener('iota:applet-rpc', onEvent as EventListener);\n return () => window.removeEventListener('iota:applet-rpc', onEvent as EventListener);\n }, []);\n\n const summary = useMemo(() => {\n return {\n basePath: runtime.basePath,\n assetsBasePath: runtime.assetsBasePath,\n rpcEndpoint: runtime.rpcEndpoint,\n shellMode: runtime.shellMode,\n route: ctx.route,\n user: { id: ctx.user.id, email: ctx.user.email },\n tenant: ctx.tenant,\n };\n }, [ctx.route, ctx.tenant, ctx.user.email, ctx.user.id, runtime.assetsBasePath, runtime.basePath, runtime.rpcEndpoint, runtime.shellMode]);\n\n return (\n <div\n style={{\n position: 'fixed',\n right: 12,\n bottom: 12,\n width: 420,\n maxHeight: '60vh',\n overflow: 'auto',\n background: 'rgba(17, 24, 39, 0.92)',\n color: '#E5E7EB',\n border: '1px solid rgba(255,255,255,0.12)',\n borderRadius: 10,\n padding: 12,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n fontSize: 12,\n zIndex: 2147483647,\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>\n <div style={{ fontWeight: 700 }}>Applet Devtools</div>\n <div style={{ opacity: 0.7 }}>{runtime.shellMode ?? 'unknown'}</div>\n </div>\n\n <div style={{ marginBottom: 10 }}>\n <div style={{ opacity: 0.85, marginBottom: 4 }}>Context</div>\n <pre style={{ margin: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{JSON.stringify(summary, null, 2)}</pre>\n </div>\n\n <div>\n <div style={{ opacity: 0.85, marginBottom: 4 }}>RPC</div>\n {rpcEvents.length === 0 ? (\n <div style={{ opacity: 0.7 }}>No calls yet</div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {rpcEvents.map((ev) => (\n <div key={`${ev.id}:${ev.status}`} style={{ padding: 8, border: '1px solid rgba(255,255,255,0.08)', borderRadius: 8 }}>\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <div>{ev.method}</div>\n <div style={{ opacity: 0.8 }}>\n {ev.status}\n {typeof ev.durationMs === 'number' ? ` (${ev.durationMs}ms)` : ''}\n </div>\n </div>\n {ev.status === 'error' ? (\n <pre style={{ margin: '6px 0 0', opacity: 0.8, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {JSON.stringify(serializeError(ev.error) ?? {}, null, 2)}\n </pre>\n ) : null}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction serializeError(err: unknown): unknown {\n if (err instanceof Error) {\n const out: Record<string, unknown> = {\n name: err.name,\n message: err.message,\n };\n if (err.stack) {out.stack = err.stack;}\n const errRecord = err as unknown as Record<string, unknown>;\n if ('code' in err && typeof errRecord.code === 'string') {out.code = errRecord.code;}\n if ('details' in err) {out.details = errRecord.details;}\n if ('cause' in err) {out.cause = errRecord.cause;}\n return out;\n }\n return err;\n}\n"]}
package/dist/index.mjs CHANGED
@@ -277,8 +277,27 @@ function defineReactAppletElement(options) {
277
277
  static get observedAttributes() {
278
278
  return Array.from(getEntry().observed);
279
279
  }
280
+ get useShadow() {
281
+ return getEntry().options.shadow !== false;
282
+ }
283
+ /** The root node that holds the container and styles (shadow root or the element itself). Call ensureMountMode() before reading when using shadow. */
284
+ get styleRoot() {
285
+ if (!this.useShadow) {
286
+ return this;
287
+ }
288
+ if (!this.shadowRoot) {
289
+ throw new Error(`[${tagName}] shadowRoot missing; call ensureMountMode() first`);
290
+ }
291
+ return this.shadowRoot;
292
+ }
293
+ /** Ensures shadow root exists when needed and the React container is in the correct root (shadow or light). */
294
+ ensureMountMode() {
295
+ const targetRoot = this.useShadow ? this.shadowRoot ?? this.attachShadow({ mode: "open" }) : this;
296
+ if (this.container && this.container.parentNode !== targetRoot) {
297
+ targetRoot.appendChild(this.container);
298
+ }
299
+ }
280
300
  connectedCallback() {
281
- const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: "open" });
282
301
  if (!this.container) {
283
302
  this.container = document.createElement("div");
284
303
  this.container.id = "react-root";
@@ -289,12 +308,14 @@ function defineReactAppletElement(options) {
289
308
  this.container.style.height = "100%";
290
309
  this.container.style.width = "100%";
291
310
  }
292
- const existingContainer = shadowRoot.querySelector("#react-root");
311
+ this.ensureMountMode();
312
+ const root = this.styleRoot;
313
+ const existingContainer = root.querySelector("#react-root");
293
314
  if (!existingContainer) {
294
- if (this.styleEl) {
295
- shadowRoot.appendChild(this.styleEl);
315
+ if (this.useShadow && this.styleEl) {
316
+ root.appendChild(this.styleEl);
296
317
  }
297
- shadowRoot.appendChild(this.container);
318
+ root.appendChild(this.container);
298
319
  } else if (existingContainer !== this.container) {
299
320
  this.container = existingContainer;
300
321
  }
@@ -321,6 +342,14 @@ function defineReactAppletElement(options) {
321
342
  this.darkModeObserver = null;
322
343
  this.reactRoot?.unmount();
323
344
  this.reactRoot = null;
345
+ if (this.styleEl) {
346
+ if (this.styleEl.parentNode === document.head) {
347
+ releaseLightStyle(tagName);
348
+ } else {
349
+ this.styleEl.remove();
350
+ }
351
+ this.styleEl = null;
352
+ }
324
353
  }
325
354
  attributeChangedCallback(_name, oldValue, newValue) {
326
355
  if (oldValue === newValue) {
@@ -354,16 +383,44 @@ function defineReactAppletElement(options) {
354
383
  }
355
384
  }
356
385
  syncFromRegistry() {
386
+ this.ensureMountMode();
357
387
  const entry = getEntry();
358
388
  const styles = typeof entry.options.styles === "function" ? entry.options.styles() : entry.options.styles;
359
389
  if (styles) {
360
- this.styleEl ?? (this.styleEl = document.createElement("style"));
361
- this.styleEl.textContent = styles;
362
- if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {
363
- this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild);
390
+ if (this.useShadow) {
391
+ if (this.styleEl && this.styleEl.parentNode === document.head) {
392
+ releaseLightStyle(tagName);
393
+ this.styleEl = null;
394
+ }
395
+ this.styleEl ?? (this.styleEl = document.createElement("style"));
396
+ this.styleEl.textContent = styles;
397
+ if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {
398
+ this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild);
399
+ }
400
+ } else {
401
+ if (this.styleEl && this.shadowRoot?.contains(this.styleEl)) {
402
+ this.styleEl.remove();
403
+ this.styleEl = null;
404
+ }
405
+ if (this.styleEl && this.styleEl.parentNode !== document.head) {
406
+ releaseLightStyle(tagName);
407
+ this.styleEl = null;
408
+ }
409
+ if (!this.styleEl) {
410
+ this.styleEl = getOrCreateLightStyle(tagName, styles);
411
+ } else {
412
+ this.styleEl.textContent = styles;
413
+ }
414
+ if (!document.head.contains(this.styleEl)) {
415
+ document.head.appendChild(this.styleEl);
416
+ }
364
417
  }
365
418
  } else if (this.styleEl) {
366
- this.styleEl.remove();
419
+ if (this.styleEl.parentNode === document.head) {
420
+ releaseLightStyle(tagName);
421
+ } else {
422
+ this.styleEl.remove();
423
+ }
367
424
  this.styleEl = null;
368
425
  }
369
426
  if (entry.options.observeDarkMode !== false) {
@@ -398,6 +455,36 @@ function getRegistry() {
398
455
  g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ?? (g.__IOTA_REACT_APPLET_HOST_REGISTRY__ = /* @__PURE__ */ new Map());
399
456
  return g.__IOTA_REACT_APPLET_HOST_REGISTRY__;
400
457
  }
458
+ function getLightStyleRegistry() {
459
+ const g = globalThis;
460
+ g.__IOTA_REACT_APPLET_LIGHT_STYLES__ ?? (g.__IOTA_REACT_APPLET_LIGHT_STYLES__ = /* @__PURE__ */ new Map());
461
+ return g.__IOTA_REACT_APPLET_LIGHT_STYLES__;
462
+ }
463
+ function getOrCreateLightStyle(tagName, styles) {
464
+ const registry = getLightStyleRegistry();
465
+ let entry = registry.get(tagName);
466
+ if (!entry) {
467
+ const el = document.createElement("style");
468
+ el.id = `${tagName}-styles`;
469
+ entry = { element: el, refCount: 0 };
470
+ registry.set(tagName, entry);
471
+ }
472
+ entry.refCount++;
473
+ entry.element.textContent = styles;
474
+ return entry.element;
475
+ }
476
+ function releaseLightStyle(tagName) {
477
+ const registry = getLightStyleRegistry();
478
+ const entry = registry.get(tagName);
479
+ if (!entry) {
480
+ return;
481
+ }
482
+ entry.refCount--;
483
+ if (entry.refCount <= 0) {
484
+ entry.element.remove();
485
+ registry.delete(tagName);
486
+ }
487
+ }
401
488
 
402
489
  // ui/src/applet-devtools/enabled.ts
403
490
  function shouldEnableAppletDevtools() {