@runtypelabs/persona 4.22.1 → 4.23.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/launcher-global.ts","../src/utils/dom.ts","../src/utils/positioning.ts","../src/utils/dock.ts","../src/utils/icon-node.ts","../src/utils/chunk-loader.ts","../src/icons-extra-loader.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/activity.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/arrow-down.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/arrow-left.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/arrow-right.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/arrow-up-right.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/arrow-up.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/at-sign.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/bot.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/check.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/chevron-down.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/chevron-left.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/chevron-right.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/chevron-up.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/clipboard-copy.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/clipboard.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/code-xml.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/copy.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/download.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/ellipsis-vertical.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/ellipsis.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/external-link.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/eye.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/file-code.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/file-spreadsheet.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/file-text.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/file.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/history.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/image-plus.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/loader-circle.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/loader.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/maximize.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/menu.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/message-square.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/mic.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/minimize.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/minus.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/panel-left.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/paperclip.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/pencil.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/plus.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/quote.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/refresh-cw.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/search.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/send.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/shield-alert.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/shield-check.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/shield-x.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/square.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/star.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/thumbs-down.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/thumbs-up.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/trash-2.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/trash.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/upload.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/volume-2.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/x.ts","../src/utils/icons.ts","../src/utils/constants.ts","../src/components/launcher.ts","../src/utils/deep-merge.ts","../src/defaults.ts","../src/utils/tokens.ts","../src/utils/theme.ts"],"sourcesContent":["/**\n * Critical-path launcher entry: built to `launcher.global.js` (IIFE).\n *\n * Ships ONLY the real collapsed launcher surface (`createLauncherSurface`,\n * which carries the optional launcher teaser) plus the\n * theme application path, so the launcher paints pixel-identically to the full\n * widget from a tiny bundle. The heavy conversation panel is deferred until\n * first open by the installer (Phase 2).\n *\n * Icons: the CORE tier of the registry ships in this bundle, which covers the\n * launcher defaults (`bot`, `arrow-up-right`) and every widget-emitted name,\n * so default-config launchers paint with no flash. A site that configures an\n * EXTRA-tier icon (`launcher.agentIconName: \"shopping-cart\"`) paints a\n * correctly-sized empty placeholder and fills within one round-trip of the\n * `icons-extra.js` sibling chunk (loader registered below). See the\n * \"Deferred Launcher Loading\" pattern in CLAUDE.md.\n *\n * Public global (via tsup `--global-name AgentWidgetLauncher`):\n *\n * window.AgentWidgetLauncher.mount({ target, config, onOpen })\n * → { root, element, update, destroy }\n */\nimport { createLauncherSurface } from \"./components/launcher\";\nimport { applyThemeVariables } from \"./utils/theme\";\nimport { DEFAULT_LAUNCHER_CONFIG } from \"./defaults\";\nimport { setIconsExtraLoader } from \"./icons-extra-loader\";\nimport type { AgentWidgetConfig } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Deferred extra-icons loading (same sibling-URL scheme as index-global.ts,\n// derived from THIS script's src). Registered at module evaluation:\n// `document.currentScript` is null once execution leaves the initial run.\n// ---------------------------------------------------------------------------\nconst launcherScriptSrc: string | null =\n typeof document !== \"undefined\"\n ? ((document.currentScript as HTMLScriptElement | null)?.src ?? null)\n : null;\n\nsetIconsExtraLoader(() => {\n const chunkUrl = launcherScriptSrc?.replace(\n /launcher\\.global\\.js($|\\?)/,\n \"icons-extra.js$1\",\n );\n if (!chunkUrl || chunkUrl === launcherScriptSrc) {\n return Promise.reject(\n new Error(\n \"Could not derive the icons-extra.js URL from the launcher script URL \" +\n `(${launcherScriptSrc ?? \"unavailable\"}). Self-hosted deployments that ` +\n \"rename launcher.global.js should host icons-extra.js alongside it.\",\n ),\n );\n }\n return import(/* @vite-ignore */ chunkUrl);\n});\n\nexport interface AgentWidgetLauncherMountOptions {\n /** Where to mount. Defaults to `document.body` (the floating launcher is `position: fixed`). */\n target?: string | HTMLElement;\n /** The same widget config the full widget will receive: drives theme, icons, position, copy. */\n config?: AgentWidgetConfig;\n /** Called when the launcher is clicked; the installer loads the full widget and opens the panel. */\n onOpen: () => void;\n}\n\nexport interface AgentWidgetLauncherHandle {\n /** The `[data-persona-root]` wrapper that carries the theme CSS variables. */\n root: HTMLElement;\n /** The launcher button element itself. */\n element: HTMLButtonElement;\n /** Re-apply theme + re-render the launcher with new config. */\n update: (config: AgentWidgetConfig) => void;\n /** Remove the critical launcher (called at handoff once the full widget is mounted). */\n destroy: () => void;\n}\n\n/**\n * Marks the critical launcher's wrapper so the installer can find/remove it at\n * handoff without disturbing the full widget's own `[data-persona-root]`.\n */\nexport const CRITICAL_LAUNCHER_ATTR = \"data-persona-launcher-critical\";\n\nconst resolveTarget = (target?: string | HTMLElement): HTMLElement => {\n if (target instanceof HTMLElement) return target;\n if (typeof target === \"string\") {\n const el = document.querySelector<HTMLElement>(target);\n if (el) return el;\n }\n return document.body;\n};\n\nconst mergeCriticalLauncherConfig = (\n config?: AgentWidgetConfig\n): AgentWidgetConfig => ({\n ...config,\n launcher: {\n ...DEFAULT_LAUNCHER_CONFIG,\n ...config?.launcher,\n dock: {\n ...DEFAULT_LAUNCHER_CONFIG.dock,\n ...config?.launcher?.dock,\n },\n },\n});\n\n/**\n * Mount the real collapsed launcher from the critical bundle.\n *\n * Mirrors the full widget's DOM exactly (`runtime/init.ts` + `ui.ts`): a\n * `[data-persona-root]` wrapper carries the theme CSS variables and the launcher\n * button is its child. Keeping the theme vars on the wrapper (not the button)\n * leaves the button's own inline style matching the full widget's, so\n * the eventual mount-then-remove handoff is invisible.\n */\nexport const mount = (\n options: AgentWidgetLauncherMountOptions\n): AgentWidgetLauncherHandle => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\n \"AgentWidgetLauncher can only be mounted in a browser environment\"\n );\n }\n\n const { onOpen } = options;\n const target = resolveTarget(options.target);\n\n // Render from the same launcher defaults the full widget uses without pulling\n // the full widget default object into the critical bundle.\n const config = mergeCriticalLauncherConfig(options.config);\n\n const root = document.createElement(\"div\");\n root.setAttribute(\"data-persona-root\", \"true\");\n root.setAttribute(CRITICAL_LAUNCHER_ATTR, \"true\");\n applyThemeVariables(root, config);\n\n const surface = createLauncherSurface(config, onOpen);\n root.appendChild(surface.element);\n target.appendChild(root);\n\n return {\n root,\n element: surface.launcher.element,\n update: (next: AgentWidgetConfig) => {\n const merged = mergeCriticalLauncherConfig(next);\n applyThemeVariables(root, merged);\n surface.update(merged);\n },\n // Handoff destroys the whole surface, so a pending teaser timer cannot\n // outlive the critical launcher.\n destroy: () => {\n surface.destroy();\n root.remove();\n },\n };\n};\n\n// Note: the `window.AgentWidgetLauncher` global is created by tsup's\n// `--global-name AgentWidgetLauncher` at build time. The installer\n// (`install.ts`) declares the `Window` augmentation it needs; this entry never\n// reads the global, so re-declaring it here would only create a cross-file type\n// conflict.\n","/**\n * DOM utility functions\n */\nexport const createElement = <K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string\n): HTMLElementTagNameMap[K] => {\n const element = document.createElement(tag);\n if (className) {\n element.className = className;\n }\n return element;\n};\n\nexport const createElementInDocument = <K extends keyof HTMLElementTagNameMap>(\n documentRef: Document,\n tag: K,\n className?: string\n): HTMLElementTagNameMap[K] => {\n const element = documentRef.createElement(tag);\n if (className) {\n element.className = className;\n }\n return element;\n};\n\nexport const createFragment = (): DocumentFragment => {\n return document.createDocumentFragment();\n};\n\nexport interface CreateNodeOptions {\n /** Sets `element.className`. */\n className?: string;\n /** Sets `element.textContent` before any `children` are appended. */\n text?: string;\n /** Attribute name → value pairs applied via `setAttribute`. */\n attrs?: Record<string, string>;\n /**\n * Inline styles. Nullish (`undefined`/`null`) values are skipped so callers\n * can inline conditionals (e.g. `borderColor: cfg.borderColor`) without an\n * `if` per property. Note this only *sets* values, it never clears them, so\n * prefer it for constructing fresh elements rather than re-styling live ones.\n */\n style?: Partial<CSSStyleDeclaration>;\n}\n\n/**\n * Ergonomic element factory that bundles the className + attribute + style +\n * children boilerplate the widget's DOM builders otherwise repeat by hand.\n *\n * `createElement` stays the right tool for the simple `(tag, className)` case;\n * reach for `createNode` when a node also needs attributes, inline styles, or\n * up-front children. Nullish `children` are skipped so callers can inline\n * conditionals (e.g. `maybeIcon && el`).\n */\nexport const createNode = <K extends keyof HTMLElementTagNameMap>(\n tag: K,\n options: CreateNodeOptions = {},\n ...children: Array<Node | string | null | undefined>\n): HTMLElementTagNameMap[K] => {\n const element = document.createElement(tag);\n\n if (options.className) {\n element.className = options.className;\n }\n if (options.text !== undefined) {\n element.textContent = options.text;\n }\n if (options.attrs) {\n for (const [name, value] of Object.entries(options.attrs)) {\n element.setAttribute(name, value);\n }\n }\n if (options.style) {\n const style = element.style as unknown as Record<string, string>;\n const source = options.style as Record<string, string | null | undefined>;\n for (const property of Object.keys(source)) {\n const value = source[property];\n if (value != null) {\n style[property] = value;\n }\n }\n }\n\n const appendable = children.filter(\n (child): child is Node | string => child != null\n );\n if (appendable.length > 0) {\n element.append(...appendable);\n }\n\n return element;\n};\n\n/**\n * Join truthy class-name fragments into a single space-separated string\n * (the clsx / classnames pattern). Falsy fragments\n * (`false` / `null` / `undefined` / `\"\"`) are dropped, so conditional classes\n * read inline as `cond && \"persona-foo\"` instead of imperative\n * `classList.add(...)` branches.\n */\nexport const cx = (\n ...parts: Array<string | false | null | undefined>\n): string => parts.filter(Boolean).join(\" \");\n\n\n\n\n\n\n\n","export const positionMap: Record<\n \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\",\n string\n> = {\n \"bottom-right\": \"persona-bottom-6 persona-right-6\",\n \"bottom-left\": \"persona-bottom-6 persona-left-6\",\n \"top-right\": \"persona-top-6 persona-right-6\",\n \"top-left\": \"persona-top-6 persona-left-6\"\n};\n\n\n\n\n\n\n\n\n","import type { AgentWidgetConfig, AgentWidgetDockConfig } from \"../types\";\n\nconst DEFAULT_DOCK_CONFIG: Required<AgentWidgetDockConfig> = {\n side: \"right\",\n width: \"420px\",\n animate: true,\n reveal: \"resize\",\n maxHeight: \"100dvh\",\n};\n\nexport const isDockedMountMode = (config?: AgentWidgetConfig): boolean =>\n (config?.launcher?.mountMode ?? \"floating\") === \"docked\";\n\nexport const isComposerBarMountMode = (config?: AgentWidgetConfig): boolean =>\n (config?.launcher?.mountMode ?? \"floating\") === \"composer-bar\";\n\n/**\n * Resolved dock layout. For `reveal: \"resize\"`, when the panel is closed the dock column is `0px`.\n * For `reveal: \"overlay\"`, the panel overlays with `transform`. For `reveal: \"push\"`, a sliding track\n * moves content and panel together without width animation on the main column. For `emerge`,\n * the dock column still animates like `resize` but the widget stays `dock.width` wide inside the slot.\n * Unknown keys on `launcher.dock` (e.g. legacy `collapsedWidth`) are ignored.\n */\nexport const resolveDockConfig = (\n config?: AgentWidgetConfig\n): Required<AgentWidgetDockConfig> => {\n const dock = config?.launcher?.dock;\n return {\n side: dock?.side ?? DEFAULT_DOCK_CONFIG.side,\n width: dock?.width ?? DEFAULT_DOCK_CONFIG.width,\n animate: dock?.animate ?? DEFAULT_DOCK_CONFIG.animate,\n reveal: dock?.reveal ?? DEFAULT_DOCK_CONFIG.reveal,\n maxHeight: dock?.maxHeight ?? DEFAULT_DOCK_CONFIG.maxHeight,\n };\n};\n","import type { IconNode } from \"lucide\";\n\n/**\n * Registry-free lucide icon renderer.\n *\n * Two ways to render an icon, chosen by how the name is known:\n * - Name is a LITERAL no config can override → import the icon's data from\n * \"lucide\" (per-icon modules, tree-shakeable) and call `renderIconNode`.\n * Bundles then carry only the glyphs they use — critical for lazy chunks,\n * which would otherwise duplicate the whole ~21 kB registry (`noExternal`).\n * - Name is host-suppliable (config, mention providers, ComponentRenderers) →\n * `renderLucideIcon` in `./icons`, which resolves strings against the\n * curated registry. Chunk code must receive that resolver INJECTED (see\n * approval-deps.ts), never import it.\n *\n * This module must never import `./icons` — that would drag the registry\n * back into every bundle that only needs `renderIconNode`.\n */\nexport const renderIconNode = (\n iconData: IconNode,\n size: number | string = 24,\n color: string = \"currentColor\",\n strokeWidth: number = 2\n): SVGElement | null => {\n if (!Array.isArray(iconData)) return null;\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"width\", String(size));\n svg.setAttribute(\"height\", String(size));\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", color);\n svg.setAttribute(\"stroke-width\", String(strokeWidth));\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n\n // IconNode shape: [[\"path\", {\"d\": \"...\"}], [\"circle\", {\"cx\": \"...\"}], ...]\n iconData.forEach((elementData) => {\n if (!Array.isArray(elementData) || elementData.length < 2) return;\n const tagName = elementData[0] as string;\n const attrs = elementData[1] as Record<string, string> | undefined;\n if (!attrs) return;\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", tagName);\n Object.entries(attrs).forEach(([key, value]) => {\n // Skip 'stroke' so the parent SVG's stroke attribute drives color uniformly\n if (key !== \"stroke\") element.setAttribute(key, String(value));\n });\n svg.appendChild(element);\n });\n\n return svg;\n};\n","/**\n * Generic memoized loader for a lazy code-split chunk.\n *\n * Backs the near-identical loader indirections in the core/eager bundle\n * (`context-mentions-loader.ts`, `context-mentions-inline-loader.ts`,\n * `markdown-parsers-loader.ts`): each registers a runtime loader (IIFE/CDN\n * sibling-URL chunk) and falls back to an external/relative dynamic import for\n * ESM/CJS consumers. The shared semantics are:\n *\n * - `load()` memoizes the resolved module (`moduleCache`) and the in-flight\n * promise (`loadPromise`) so concurrent callers share one import.\n * - A rejected load clears `loadPromise` so a later call retries after a\n * transient failure (one dropped fetch must not disable the feature for the\n * whole session); the current caller still sees the rejection.\n * - The registered loader wins over `fallbackImport`; if no loader is\n * registered, `fallbackImport` is used.\n *\n * IMPORTANT: this module must import nothing beyond types. It sits in the core\n * bundle, so any value import here could drag chunk code back into core and\n * defeat the split (see `context-mentions-bundle.test.ts`).\n */\n\nexport type ChunkLoaderOptions<T> = {\n /**\n * Dynamic import used when no runtime loader has been registered. Keep the\n * `import(...)` literal in the calling module (not here) so the bundler\n * resolves it as an external subpath / relative chunk at that call site.\n */\n fallbackImport: () => Promise<T>;\n /**\n * When true, registering a new loader clears the cached module and any\n * in-flight promise, so a swapped loader (test injection) takes effect\n * deterministically. Production registers its loader once before any load, so\n * this only matters mid-session.\n */\n resetOnSetLoader?: boolean;\n};\n\nexport type ChunkLoader<T> = {\n setLoader: (l: () => Promise<T>) => void;\n load: () => Promise<T>;\n /** Register a resolved module synchronously (eager builds that bundle it). */\n provide: (mod: T) => void;\n /** The cached module, or null if not loaded/provided yet. */\n getSync: () => T | null;\n};\n\nexport const createChunkLoader = <T>(\n options: ChunkLoaderOptions<T>\n): ChunkLoader<T> => {\n const { fallbackImport, resetOnSetLoader = false } = options;\n\n let loader: (() => Promise<T>) | null = null;\n let moduleCache: T | null = null;\n let loadPromise: Promise<T> | null = null;\n\n const setLoader = (l: () => Promise<T>): void => {\n loader = l;\n if (resetOnSetLoader) {\n moduleCache = null;\n loadPromise = null;\n }\n };\n\n const load = (): Promise<T> => {\n if (moduleCache) return Promise.resolve(moduleCache);\n if (loadPromise) return loadPromise;\n const importChunk = loader ?? fallbackImport;\n loadPromise = importChunk()\n .then((mod) => {\n moduleCache = mod;\n return mod;\n })\n .catch((err) => {\n loadPromise = null;\n throw err;\n });\n return loadPromise;\n };\n\n const provide = (mod: T): void => {\n moduleCache = mod;\n };\n\n const getSync = (): T | null => moduleCache;\n\n return { setLoader, load, provide, getSync };\n};\n","import { createChunkLoader } from \"./utils/chunk-loader\";\nimport type { IconNode } from \"lucide\";\n\n/**\n * Loader indirection for the lazy icons-extra chunk (the config-only tail of\n * the icon registry). Stays in the core bundle AND the critical launcher\n * bundle — both register sibling-URL loaders in their IIFE entries, so a\n * launcher configured with a non-core icon paints a sized placeholder and\n * fills within one round-trip instead of shipping the whole registry.\n *\n * The fallback import must be the literal package subpath: `build:client` and\n * the launcher build run without splitting, so a relative import would be\n * inlined; the subpath is marked external in both builds and resolves through\n * the package's own `exports` map at consumer runtime (see\n * `history-view-loader.ts` for the full rationale).\n */\nexport type IconsExtraModule = {\n EXTRA_LUCIDE_ICONS: Record<string, IconNode>;\n};\n\nconst { setLoader, load } = createChunkLoader<IconsExtraModule>({\n fallbackImport: () => import(\"@runtypelabs/persona/icons-extra\"),\n});\n\n/** Override how the chunk is fetched (each IIFE registers a sibling-URL loader). */\nexport const setIconsExtraLoader = setLoader;\n\n/** Load the extra icon data. Memoized; retries after rejection. */\nexport const loadIconsExtra = load;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name activity\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjIgMTJoLTIuNDhhMiAyIDAgMCAwLTEuOTMgMS40NmwtMi4zNSA4LjM2YS4yNS4yNSAwIDAgMS0uNDggMEw5LjI0IDIuMThhLjI1LjI1IDAgMCAwLS40OCAwbC0yLjM1IDguMzZBMiAyIDAgMCAxIDQuNDkgMTJIMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/activity\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Activity: IconNode = [\n [\n 'path',\n {\n d: 'M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2',\n },\n ],\n];\n\nexport default Activity;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name arrow-down\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KICA8cGF0aCBkPSJtMTkgMTItNyA3LTctNyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/arrow-down\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ArrowDown: IconNode = [\n ['path', { d: 'M12 5v14' }],\n ['path', { d: 'm19 12-7 7-7-7' }],\n];\n\nexport default ArrowDown;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name arrow-left\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTIgMTktNy03IDctNyIgLz4KICA8cGF0aCBkPSJNMTkgMTJINSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/arrow-left\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ArrowLeft: IconNode = [\n ['path', { d: 'm12 19-7-7 7-7' }],\n ['path', { d: 'M19 12H5' }],\n];\n\nexport default ArrowLeft;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name arrow-right\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJtMTIgNSA3IDctNyA3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/arrow-right\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ArrowRight: IconNode = [\n ['path', { d: 'M5 12h14' }],\n ['path', { d: 'm12 5 7 7-7 7' }],\n];\n\nexport default ArrowRight;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name arrow-up-right\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNyA3aDEwdjEwIiAvPgogIDxwYXRoIGQ9Ik03IDE3IDE3IDciIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/arrow-up-right\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ArrowUpRight: IconNode = [\n ['path', { d: 'M7 7h10v10' }],\n ['path', { d: 'M7 17 17 7' }],\n];\n\nexport default ArrowUpRight;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name arrow-up\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNSAxMiA3LTcgNyA3IiAvPgogIDxwYXRoIGQ9Ik0xMiAxOVY1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/arrow-up\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ArrowUp: IconNode = [\n ['path', { d: 'm5 12 7-7 7 7' }],\n ['path', { d: 'M12 19V5' }],\n];\n\nexport default ArrowUp;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name at-sign\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiAvPgogIDxwYXRoIGQ9Ik0xNiA4djVhMyAzIDAgMCAwIDYgMHYtMWExMCAxMCAwIDEgMC00IDgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/at-sign\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst AtSign: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4' }],\n ['path', { d: 'M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8' }],\n];\n\nexport default AtSign;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name bot\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgOFY0SDgiIC8+CiAgPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjEyIiB4PSI0IiB5PSI4IiByeD0iMiIgLz4KICA8cGF0aCBkPSJNMiAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0xNSAxM3YyIiAvPgogIDxwYXRoIGQ9Ik05IDEzdjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/bot\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Bot: IconNode = [\n ['path', { d: 'M12 8V4H8' }],\n ['rect', { width: '16', height: '12', x: '4', y: '8', rx: '2' }],\n ['path', { d: 'M2 14h2' }],\n ['path', { d: 'M20 14h2' }],\n ['path', { d: 'M15 13v2' }],\n ['path', { d: 'M9 13v2' }],\n];\n\nexport default Bot;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name check\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Check: IconNode = [['path', { d: 'M20 6 9 17l-5-5' }]];\n\nexport default Check;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name chevron-down\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiA5IDYgNiA2LTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/chevron-down\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ChevronDown: IconNode = [['path', { d: 'm6 9 6 6 6-6' }]];\n\nexport default ChevronDown;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name chevron-left\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTgtNi02IDYtNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevron-left\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ChevronLeft: IconNode = [['path', { d: 'm15 18-6-6 6-6' }]];\n\nexport default ChevronLeft;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name chevron-right\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtOSAxOCA2LTYtNi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chevron-right\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ChevronRight: IconNode = [['path', { d: 'm9 18 6-6-6-6' }]];\n\nexport default ChevronRight;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name chevron-up\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTggMTUtNi02LTYgNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevron-up\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ChevronUp: IconNode = [['path', { d: 'm18 15-6-6-6 6' }]];\n\nexport default ChevronUp;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name clipboard-copy\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iOCIgaGVpZ2h0PSI0IiB4PSI4IiB5PSIyIiByeD0iMSIgcnk9IjEiIC8+CiAgPHBhdGggZD0iTTggNEg2YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0ydi0yIiAvPgogIDxwYXRoIGQ9Ik0xNiA0aDJhMiAyIDAgMCAxIDIgMnY0IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNEgxMSIgLz4KICA8cGF0aCBkPSJtMTUgMTAtNCA0IDQgNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/clipboard-copy\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ClipboardCopy: IconNode = [\n ['rect', { width: '8', height: '4', x: '8', y: '2', rx: '1', ry: '1' }],\n ['path', { d: 'M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2' }],\n ['path', { d: 'M16 4h2a2 2 0 0 1 2 2v4' }],\n ['path', { d: 'M21 14H11' }],\n ['path', { d: 'm15 10-4 4 4 4' }],\n];\n\nexport default ClipboardCopy;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name clipboard\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iOCIgaGVpZ2h0PSI0IiB4PSI4IiB5PSIyIiByeD0iMSIgcnk9IjEiIC8+CiAgPHBhdGggZD0iTTE2IDRoMmEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMmgyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/clipboard\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Clipboard: IconNode = [\n ['rect', { width: '8', height: '4', x: '8', y: '2', rx: '1', ry: '1' }],\n ['path', { d: 'M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2' }],\n];\n\nexport default Clipboard;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name code-xml\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTggMTYgNC00LTQtNCIgLz4KICA8cGF0aCBkPSJtNiA4LTQgNCA0IDQiIC8+CiAgPHBhdGggZD0ibTE0LjUgNC01IDE2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/code-xml\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst CodeXml: IconNode = [\n ['path', { d: 'm18 16 4-4-4-4' }],\n ['path', { d: 'm6 8-4 4 4 4' }],\n ['path', { d: 'm14.5 4-5 16' }],\n];\n\nexport default CodeXml;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name copy\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHg9IjgiIHk9IjgiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Copy: IconNode = [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2' }],\n];\n\nexport default Copy;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name download\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMTVWMyIgLz4KICA8cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNCIgLz4KICA8cGF0aCBkPSJtNyAxMCA1IDUgNS01IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/download\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Download: IconNode = [\n ['path', { d: 'M12 15V3' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4' }],\n ['path', { d: 'm7 10 5 5 5-5' }],\n];\n\nexport default Download;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name ellipsis-vertical\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iNSIgcj0iMSIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjE5IiByPSIxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/ellipsis-vertical\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst EllipsisVertical: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '1' }],\n ['circle', { cx: '12', cy: '5', r: '1' }],\n ['circle', { cx: '12', cy: '19', r: '1' }],\n];\n\nexport default EllipsisVertical;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name ellipsis\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE5IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iNSIgY3k9IjEyIiByPSIxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/ellipsis\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Ellipsis: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '1' }],\n ['circle', { cx: '19', cy: '12', r: '1' }],\n ['circle', { cx: '5', cy: '12', r: '1' }],\n];\n\nexport default Ellipsis;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name external-link\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0iTTEwIDE0IDIxIDMiIC8+CiAgPHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/external-link\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ExternalLink: IconNode = [\n ['path', { d: 'M15 3h6v6' }],\n ['path', { d: 'M10 14 21 3' }],\n ['path', { d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6' }],\n];\n\nexport default ExternalLink;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name eye\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMi4wNjIgMTIuMzQ4YTEgMSAwIDAgMSAwLS42OTYgMTAuNzUgMTAuNzUgMCAwIDEgMTkuODc2IDAgMSAxIDAgMCAxIDAgLjY5NiAxMC43NSAxMC43NSAwIDAgMS0xOS44NzYgMCIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Eye: IconNode = [\n [\n 'path',\n {\n d: 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3' }],\n];\n\nexport default Eye;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name file-code\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KICA8cGF0aCBkPSJNMTAgMTIuNSA4IDE1bDIgMi41IiAvPgogIDxwYXRoIGQ9Im0xNCAxMi41IDIgMi41LTIgMi41IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/file-code\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst FileCode: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5' }],\n ['path', { d: 'M10 12.5 8 15l2 2.5' }],\n ['path', { d: 'm14 12.5 2 2.5-2 2.5' }],\n];\n\nexport default FileCode;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name file-spreadsheet\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KICA8cGF0aCBkPSJNOCAxM2gyIiAvPgogIDxwYXRoIGQ9Ik0xNCAxM2gyIiAvPgogIDxwYXRoIGQ9Ik04IDE3aDIiIC8+CiAgPHBhdGggZD0iTTE0IDE3aDIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/file-spreadsheet\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst FileSpreadsheet: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5' }],\n ['path', { d: 'M8 13h2' }],\n ['path', { d: 'M14 13h2' }],\n ['path', { d: 'M8 17h2' }],\n ['path', { d: 'M14 17h2' }],\n];\n\nexport default FileSpreadsheet;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name file-text\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KICA8cGF0aCBkPSJNMTAgOUg4IiAvPgogIDxwYXRoIGQ9Ik0xNiAxM0g4IiAvPgogIDxwYXRoIGQ9Ik0xNiAxN0g4IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/file-text\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst FileText: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5' }],\n ['path', { d: 'M10 9H8' }],\n ['path', { d: 'M16 13H8' }],\n ['path', { d: 'M16 17H8' }],\n];\n\nexport default FileText;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name file\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/file\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst File: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5' }],\n];\n\nexport default File;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name history\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAxIDAgOS05IDkuNzUgOS43NSAwIDAgMC02Ljc0IDIuNzRMMyA4IiAvPgogIDxwYXRoIGQ9Ik0zIDN2NWg1IiAvPgogIDxwYXRoIGQ9Ik0xMiA3djVsNCAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/history\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst History: IconNode = [\n ['path', { d: 'M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8' }],\n ['path', { d: 'M3 3v5h5' }],\n ['path', { d: 'M12 7v5l4 2' }],\n];\n\nexport default History;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name image-plus\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTYgNWg2IiAvPgogIDxwYXRoIGQ9Ik0xOSAydjYiIC8+CiAgPHBhdGggZD0iTTIxIDExLjVWMTlhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDcuNSIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image-plus\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ImagePlus: IconNode = [\n ['path', { d: 'M16 5h6' }],\n ['path', { d: 'M19 2v6' }],\n ['path', { d: 'M21 11.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7.5' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21' }],\n ['circle', { cx: '9', cy: '9', r: '2' }],\n];\n\nexport default ImagePlus;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name loader-circle\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTJhOSA5IDAgMSAxLTYuMjE5LTguNTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/loader-circle\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst LoaderCircle: IconNode = [['path', { d: 'M21 12a9 9 0 1 1-6.219-8.56' }]];\n\nexport default LoaderCircle;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name loader\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMnY0IiAvPgogIDxwYXRoIGQ9Im0xNi4yIDcuOCAyLjktMi45IiAvPgogIDxwYXRoIGQ9Ik0xOCAxMmg0IiAvPgogIDxwYXRoIGQ9Im0xNi4yIDE2LjIgMi45IDIuOSIgLz4KICA8cGF0aCBkPSJNMTIgMTh2NCIgLz4KICA8cGF0aCBkPSJtNC45IDE5LjEgMi45LTIuOSIgLz4KICA8cGF0aCBkPSJNMiAxMmg0IiAvPgogIDxwYXRoIGQ9Im00LjkgNC45IDIuOSAyLjkiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/loader\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Loader: IconNode = [\n ['path', { d: 'M12 2v4' }],\n ['path', { d: 'm16.2 7.8 2.9-2.9' }],\n ['path', { d: 'M18 12h4' }],\n ['path', { d: 'm16.2 16.2 2.9 2.9' }],\n ['path', { d: 'M12 18v4' }],\n ['path', { d: 'm4.9 19.1 2.9-2.9' }],\n ['path', { d: 'M2 12h4' }],\n ['path', { d: 'm4.9 4.9 2.9 2.9' }],\n];\n\nexport default Loader;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name maximize\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOCAzSDVhMiAyIDAgMCAwLTIgMnYzIiAvPgogIDxwYXRoIGQ9Ik0yMSA4VjVhMiAyIDAgMCAwLTItMmgtMyIgLz4KICA8cGF0aCBkPSJNMyAxNnYzYTIgMiAwIDAgMCAyIDJoMyIgLz4KICA8cGF0aCBkPSJNMTYgMjFoM2EyIDIgMCAwIDAgMi0ydi0zIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/maximize\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Maximize: IconNode = [\n ['path', { d: 'M8 3H5a2 2 0 0 0-2 2v3' }],\n ['path', { d: 'M21 8V5a2 2 0 0 0-2-2h-3' }],\n ['path', { d: 'M3 16v3a2 2 0 0 0 2 2h3' }],\n ['path', { d: 'M16 21h3a2 2 0 0 0 2-2v-3' }],\n];\n\nexport default Maximize;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name menu\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNCA1aDE2IiAvPgogIDxwYXRoIGQ9Ik00IDEyaDE2IiAvPgogIDxwYXRoIGQ9Ik00IDE5aDE2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/menu\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Menu: IconNode = [\n ['path', { d: 'M4 5h16' }],\n ['path', { d: 'M4 12h16' }],\n ['path', { d: 'M4 19h16' }],\n];\n\nexport default Menu;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name message-square\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/message-square\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst MessageSquare: IconNode = [\n [\n 'path',\n {\n d: 'M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z',\n },\n ],\n];\n\nexport default MessageSquare;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name mic\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMTl2MyIgLz4KICA8cGF0aCBkPSJNMTkgMTB2MmE3IDcgMCAwIDEtMTQgMHYtMiIgLz4KICA8cmVjdCB4PSI5IiB5PSIyIiB3aWR0aD0iNiIgaGVpZ2h0PSIxMyIgcng9IjMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/mic\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Mic: IconNode = [\n ['path', { d: 'M12 19v3' }],\n ['path', { d: 'M19 10v2a7 7 0 0 1-14 0v-2' }],\n ['rect', { x: '9', y: '2', width: '6', height: '13', rx: '3' }],\n];\n\nexport default Mic;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name minimize\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOCAzdjNhMiAyIDAgMCAxLTIgMkgzIiAvPgogIDxwYXRoIGQ9Ik0yMSA4aC0zYTIgMiAwIDAgMS0yLTJWMyIgLz4KICA8cGF0aCBkPSJNMyAxNmgzYTIgMiAwIDAgMSAyIDJ2MyIgLz4KICA8cGF0aCBkPSJNMTYgMjF2LTNhMiAyIDAgMCAxIDItMmgzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/minimize\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Minimize: IconNode = [\n ['path', { d: 'M8 3v3a2 2 0 0 1-2 2H3' }],\n ['path', { d: 'M21 8h-3a2 2 0 0 1-2-2V3' }],\n ['path', { d: 'M3 16h3a2 2 0 0 1 2 2v3' }],\n ['path', { d: 'M16 21v-3a2 2 0 0 1 2-2h3' }],\n];\n\nexport default Minimize;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name minus\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/minus\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Minus: IconNode = [['path', { d: 'M5 12h14' }]];\n\nexport default Minus;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name panel-left\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik05IDN2MTgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/panel-left\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst PanelLeft: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2' }],\n ['path', { d: 'M9 3v18' }],\n];\n\nexport default PanelLeft;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name paperclip\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTYgNi04LjQxNCA4LjU4NmEyIDIgMCAwIDAgMi44MjkgMi44MjlsOC40MTQtOC41ODZhNCA0IDAgMSAwLTUuNjU3LTUuNjU3bC04LjM3OSA4LjU1MWE2IDYgMCAxIDAgOC40ODUgOC40ODVsOC4zNzktOC41NTEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/paperclip\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Paperclip: IconNode = [\n [\n 'path',\n {\n d: 'm16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551',\n },\n ],\n];\n\nexport default Paperclip;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name pencil\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMTc0IDYuODEyYTEgMSAwIDAgMC0zLjk4Ni0zLjk4N0wzLjg0MiAxNi4xNzRhMiAyIDAgMCAwLS41LjgzbC0xLjMyMSA0LjM1MmEuNS41IDAgMCAwIC42MjMuNjIybDQuMzUzLTEuMzJhMiAyIDAgMCAwIC44My0uNDk3eiIgLz4KICA8cGF0aCBkPSJtMTUgNSA0IDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/pencil\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Pencil: IconNode = [\n [\n 'path',\n {\n d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',\n },\n ],\n ['path', { d: 'm15 5 4 4' }],\n];\n\nexport default Pencil;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name plus\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/plus\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Plus: IconNode = [\n ['path', { d: 'M5 12h14' }],\n ['path', { d: 'M12 5v14' }],\n];\n\nexport default Plus;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name quote\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTYgM2EyIDIgMCAwIDAtMiAydjZhMiAyIDAgMCAwIDIgMiAxIDEgMCAwIDEgMSAxdjFhMiAyIDAgMCAxLTIgMiAxIDEgMCAwIDAtMSAxdjJhMSAxIDAgMCAwIDEgMSA2IDYgMCAwIDAgNi02VjVhMiAyIDAgMCAwLTItMnoiIC8+CiAgPHBhdGggZD0iTTUgM2EyIDIgMCAwIDAtMiAydjZhMiAyIDAgMCAwIDIgMiAxIDEgMCAwIDEgMSAxdjFhMiAyIDAgMCAxLTIgMiAxIDEgMCAwIDAtMSAxdjJhMSAxIDAgMCAwIDEgMSA2IDYgMCAwIDAgNi02VjVhMiAyIDAgMCAwLTItMnoiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/quote\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Quote: IconNode = [\n [\n 'path',\n {\n d: 'M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z',\n },\n ],\n [\n 'path',\n {\n d: 'M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z',\n },\n ],\n];\n\nexport default Quote;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name refresh-cw\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst RefreshCw: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8' }],\n ['path', { d: 'M21 3v5h-5' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16' }],\n ['path', { d: 'M8 16H3v5' }],\n];\n\nexport default RefreshCw;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name search\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEgMjEtNC4zNC00LjM0IiAvPgogIDxjaXJjbGUgY3g9IjExIiBjeT0iMTEiIHI9IjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/search\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Search: IconNode = [\n ['path', { d: 'm21 21-4.34-4.34' }],\n ['circle', { cx: '11', cy: '11', r: '8' }],\n];\n\nexport default Search;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name send\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTQuNTM2IDIxLjY4NmEuNS41IDAgMCAwIC45MzctLjAyNGw2LjUtMTlhLjQ5Ni40OTYgMCAwIDAtLjYzNS0uNjM1bC0xOSA2LjVhLjUuNSAwIDAgMC0uMDI0LjkzN2w3LjkzIDMuMThhMiAyIDAgMCAxIDEuMTEyIDEuMTF6IiAvPgogIDxwYXRoIGQ9Im0yMS44NTQgMi4xNDctMTAuOTQgMTAuOTM5IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/send\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Send: IconNode = [\n [\n 'path',\n {\n d: 'M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z',\n },\n ],\n ['path', { d: 'm21.854 2.147-10.94 10.939' }],\n];\n\nexport default Send;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name shield-alert\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiIC8+CiAgPHBhdGggZD0iTTEyIDh2NCIgLz4KICA8cGF0aCBkPSJNMTIgMTZoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/shield-alert\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ShieldAlert: IconNode = [\n [\n 'path',\n {\n d: 'M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z',\n },\n ],\n ['path', { d: 'M12 8v4' }],\n ['path', { d: 'M12 16h.01' }],\n];\n\nexport default ShieldAlert;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name shield-check\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiIC8+CiAgPHBhdGggZD0ibTkgMTIgMiAyIDQtNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/shield-check\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ShieldCheck: IconNode = [\n [\n 'path',\n {\n d: 'M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z',\n },\n ],\n ['path', { d: 'm9 12 2 2 4-4' }],\n];\n\nexport default ShieldCheck;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name shield-x\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiIC8+CiAgPHBhdGggZD0ibTE0LjUgOS41LTUgNSIgLz4KICA8cGF0aCBkPSJtOS41IDkuNSA1IDUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/shield-x\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ShieldX: IconNode = [\n [\n 'path',\n {\n d: 'M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z',\n },\n ],\n ['path', { d: 'm14.5 9.5-5 5' }],\n ['path', { d: 'm9.5 9.5 5 5' }],\n];\n\nexport default ShieldX;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name square\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/square\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Square: IconNode = [['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2' }]];\n\nexport default Square;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name star\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTEuNTI1IDIuMjk1YS41My41MyAwIDAgMSAuOTUgMGwyLjMxIDQuNjc5YTIuMTIzIDIuMTIzIDAgMCAwIDEuNTk1IDEuMTZsNS4xNjYuNzU2YS41My41MyAwIDAgMSAuMjk0LjkwNGwtMy43MzYgMy42MzhhMi4xMjMgMi4xMjMgMCAwIDAtLjYxMSAxLjg3OGwuODgyIDUuMTRhLjUzLjUzIDAgMCAxLS43NzEuNTZsLTQuNjE4LTIuNDI4YTIuMTIyIDIuMTIyIDAgMCAwLTEuOTczIDBMNi4zOTYgMjEuMDFhLjUzLjUzIDAgMCAxLS43Ny0uNTZsLjg4MS01LjEzOWEyLjEyMiAyLjEyMiAwIDAgMC0uNjExLTEuODc5TDIuMTYgOS43OTVhLjUzLjUzIDAgMCAxIC4yOTQtLjkwNmw1LjE2NS0uNzU1YTIuMTIyIDIuMTIyIDAgMCAwIDEuNTk3LTEuMTZ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/star\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Star: IconNode = [\n [\n 'path',\n {\n d: 'M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z',\n },\n ],\n];\n\nexport default Star;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name thumbs-down\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOSAxOC4xMiAxMCAxNEg0LjE3YTIgMiAwIDAgMS0xLjkyLTIuNTZsMi4zMy04QTIgMiAwIDAgMSA2LjUgMkgyMGEyIDIgMCAwIDEgMiAydjhhMiAyIDAgMCAxLTIgMmgtMi43NmEyIDIgMCAwIDAtMS43OSAxLjExTDEyIDIyYTMuMTMgMy4xMyAwIDAgMS0zLTMuODhaIiAvPgogIDxwYXRoIGQ9Ik0xNyAxNFYyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/thumbs-down\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ThumbsDown: IconNode = [\n [\n 'path',\n {\n d: 'M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z',\n },\n ],\n ['path', { d: 'M17 14V2' }],\n];\n\nexport default ThumbsDown;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name thumbs-up\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgNS44OCAxNCAxMGg1LjgzYTIgMiAwIDAgMSAxLjkyIDIuNTZsLTIuMzMgOEEyIDIgMCAwIDEgMTcuNSAyMkg0YTIgMiAwIDAgMS0yLTJ2LThhMiAyIDAgMCAxIDItMmgyLjc2YTIgMiAwIDAgMCAxLjc5LTEuMTFMMTIgMmEzLjEzIDMuMTMgMCAwIDEgMyAzLjg4WiIgLz4KICA8cGF0aCBkPSJNNyAxMHYxMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/thumbs-up\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ThumbsUp: IconNode = [\n [\n 'path',\n {\n d: 'M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z',\n },\n ],\n ['path', { d: 'M7 10v12' }],\n];\n\nexport default ThumbsUp;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name trash-2\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTQgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTkgNnYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2IiAvPgogIDxwYXRoIGQ9Ik0zIDZoMTgiIC8+CiAgPHBhdGggZD0iTTggNlY0YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/trash-2\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Trash2: IconNode = [\n ['path', { d: 'M10 11v6' }],\n ['path', { d: 'M14 11v6' }],\n ['path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6' }],\n ['path', { d: 'M3 6h18' }],\n ['path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2' }],\n];\n\nexport default Trash2;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name trash\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTkgNnYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2IiAvPgogIDxwYXRoIGQ9Ik0zIDZoMTgiIC8+CiAgPHBhdGggZD0iTTggNlY0YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/trash\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Trash: IconNode = [\n ['path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6' }],\n ['path', { d: 'M3 6h18' }],\n ['path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2' }],\n];\n\nexport default Trash;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name upload\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgM3YxMiIgLz4KICA8cGF0aCBkPSJtMTcgOC01LTUtNSA1IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Upload: IconNode = [\n ['path', { d: 'M12 3v12' }],\n ['path', { d: 'm17 8-5-5-5 5' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4' }],\n];\n\nexport default Upload;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name volume-2\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTEgNC43MDJhLjcwNS43MDUgMCAwIDAtMS4yMDMtLjQ5OEw2LjQxMyA3LjU4N0ExLjQgMS40IDAgMCAxIDUuNDE2IDhIM2ExIDEgMCAwIDAtMSAxdjZhMSAxIDAgMCAwIDEgMWgyLjQxNmExLjQgMS40IDAgMCAxIC45OTcuNDEzbDMuMzgzIDMuMzg0QS43MDUuNzA1IDAgMCAwIDExIDE5LjI5OHoiIC8+CiAgPHBhdGggZD0iTTE2IDlhNSA1IDAgMCAxIDAgNiIgLz4KICA8cGF0aCBkPSJNMTkuMzY0IDE4LjM2NGE5IDkgMCAwIDAgMC0xMi43MjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/volume-2\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Volume2: IconNode = [\n [\n 'path',\n {\n d: 'M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z',\n },\n ],\n ['path', { d: 'M16 9a5 5 0 0 1 0 6' }],\n ['path', { d: 'M19.364 18.364a9 9 0 0 0 0-12.728' }],\n];\n\nexport default Volume2;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name x\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst X: IconNode = [\n ['path', { d: 'M18 6 6 18' }],\n ['path', { d: 'm6 6 12 12' }],\n];\n\nexport default X;\n","import type { IconNode } from \"lucide\";\nimport { renderIconNode } from \"./icon-node\";\nimport { loadIconsExtra } from \"../icons-extra-loader\";\nimport {\n Activity,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowUpRight,\n AtSign,\n Bot,\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronUp,\n Clipboard,\n ClipboardCopy,\n CodeXml,\n Copy,\n Download,\n Ellipsis,\n EllipsisVertical,\n ExternalLink,\n Eye,\n File as FileIcon,\n FileCode,\n FileSpreadsheet,\n FileText,\n History,\n ImagePlus,\n Loader,\n LoaderCircle,\n Maximize,\n Menu,\n MessageSquare,\n Mic,\n Minimize,\n Minus,\n PanelLeft,\n Paperclip,\n Pencil,\n Plus,\n Quote,\n RefreshCw,\n Search,\n Send,\n ShieldAlert,\n ShieldCheck,\n ShieldX,\n Square,\n Star,\n ThumbsDown,\n ThumbsUp,\n Trash,\n Trash2,\n Upload,\n Volume2,\n X,\n} from \"lucide\";\n\n/**\n * Curated icon registry for `renderLucideIcon` (host-suppliable name strings).\n *\n * Two tiers keep the payload honest:\n * - CORE (55 names, below): every name the widget itself can emit —\n * config DEFAULTS (bot, send, mic, x, …) plus the chrome names routed\n * through `utils/buttons` / `utils/dropdown`. Always resolves synchronously.\n * - EXTRA (63 names, `src/icons-extra.ts`): the config-only tail\n * (forms, commerce, media, …). The DATA ships in the lazy `icons-extra.js`\n * sibling chunk; the first request for one of these names kicks the fetch\n * and returns a correctly-sized empty placeholder SVG that fills in place\n * when the chunk lands. Surfaces that clone/morph rendered icons should\n * subscribe to `onExtraIconsReady` and re-render (ui.ts does this for the\n * transcript, mirroring the markdown-parsers heal).\n *\n * Statically-known icons in widget code do NOT use this registry: they import\n * icon data directly and call `renderIconNode` (see utils/icon-node.ts).\n *\n * Hosts can extend the registry with custom or non-curated lucide icons via\n * `registerIcons` (public API).\n *\n * See `packages/widget/docs/icon-registry-shortlist.md` for curation rationale.\n */\nconst CORE_LUCIDE_ICONS = {\n \"activity\": Activity,\n \"arrow-down\": ArrowDown,\n \"arrow-up\": ArrowUp,\n \"arrow-up-right\": ArrowUpRight,\n \"bot\": Bot,\n \"chevron-down\": ChevronDown,\n \"chevron-up\": ChevronUp,\n \"chevron-right\": ChevronRight,\n \"chevron-left\": ChevronLeft,\n \"check\": Check,\n \"clipboard\": Clipboard,\n \"clipboard-copy\": ClipboardCopy,\n \"code-xml\": CodeXml,\n \"copy\": Copy,\n \"file\": FileIcon,\n \"file-code\": FileCode,\n \"file-spreadsheet\": FileSpreadsheet,\n \"file-text\": FileText,\n \"image-plus\": ImagePlus,\n \"loader\": Loader,\n \"loader-circle\": LoaderCircle,\n \"mic\": Mic,\n \"paperclip\": Paperclip,\n \"quote\": Quote,\n \"refresh-cw\": RefreshCw,\n \"search\": Search,\n \"send\": Send,\n \"shield-alert\": ShieldAlert,\n \"shield-check\": ShieldCheck,\n \"shield-x\": ShieldX,\n \"square\": Square,\n \"thumbs-down\": ThumbsDown,\n \"thumbs-up\": ThumbsUp,\n \"upload\": Upload,\n \"volume-2\": Volume2,\n \"x\": X,\n \"at-sign\": AtSign,\n \"arrow-left\": ArrowLeft,\n \"arrow-right\": ArrowRight,\n \"external-link\": ExternalLink,\n \"ellipsis\": Ellipsis,\n \"ellipsis-vertical\": EllipsisVertical,\n \"menu\": Menu,\n \"panel-left\": PanelLeft,\n \"plus\": Plus,\n \"minus\": Minus,\n \"pencil\": Pencil,\n \"trash\": Trash,\n \"trash-2\": Trash2,\n \"download\": Download,\n \"maximize\": Maximize,\n \"minimize\": Minimize,\n \"message-square\": MessageSquare,\n \"star\": Star,\n \"eye\": Eye,\n \"history\": History,\n} as const satisfies Record<string, IconNode>;\n\n/**\n * Names whose data lives in the lazy icons-extra chunk. Kept as a runtime\n * list (~0.8 kB) so an unknown-name typo warns immediately instead of\n * triggering a pointless chunk fetch. MUST stay in sync with the keys of\n * `EXTRA_LUCIDE_ICONS` in `src/icons-extra.ts` (asserted by\n * `icons-partition.test.ts`).\n */\nexport const EXTRA_ICON_NAMES = [\n \"user\",\n \"mail\",\n \"phone\",\n \"calendar\",\n \"clock\",\n \"building\",\n \"map-pin\",\n \"lock\",\n \"key\",\n \"credit-card\",\n \"hash\",\n \"globe\",\n \"link\",\n \"circle-check\",\n \"circle-x\",\n \"triangle-alert\",\n \"info\",\n \"ban\",\n \"shield\",\n \"house\",\n \"pen-line\",\n \"save\",\n \"share\",\n \"funnel\",\n \"settings\",\n \"rotate-cw\",\n \"shopping-cart\",\n \"shopping-bag\",\n \"package\",\n \"truck\",\n \"tag\",\n \"gift\",\n \"receipt\",\n \"wallet\",\n \"store\",\n \"dollar-sign\",\n \"percent\",\n \"play\",\n \"pause\",\n \"volume-x\",\n \"camera\",\n \"image\",\n \"film\",\n \"headphones\",\n \"message-circle\",\n \"bell\",\n \"heart\",\n \"eye-off\",\n \"bookmark\",\n \"calendar-days\",\n \"timer\",\n \"folder\",\n \"folder-open\",\n \"files\",\n \"chart-column\",\n \"sparkles\",\n \"zap\",\n \"sun\",\n \"moon\",\n \"flag\",\n \"lightbulb\",\n \"monitor\",\n \"smartphone\",\n] as const;\n\n/**\n * Names of lucide icons that ship with the widget (core + lazy extra). Names\n * not in this union return `null` from `renderLucideIcon` (with a console\n * warning) unless first added via `registerIcons`.\n */\nexport type IconName =\n | keyof typeof CORE_LUCIDE_ICONS\n | (typeof EXTRA_ICON_NAMES)[number];\n\n/** Runtime registry: core map + lazily-registered extra/custom icons. */\nconst runtimeIcons = new Map<string, IconNode>(\n Object.entries(CORE_LUCIDE_ICONS)\n);\n\n// ---------------------------------------------------------------------------\n// Extra-chunk heal machinery: placeholders fill in place; cloning surfaces\n// re-render via onExtraIconsReady.\n// ---------------------------------------------------------------------------\n\ntype PendingIcon = {\n el: SVGElement;\n name: string;\n size: number | string;\n color: string;\n strokeWidth: number;\n};\nconst pendingIcons = new Set<PendingIcon>();\n\nlet extraIconsLoaded = false;\nconst extraReadySubscribers = new Set<() => void>();\n\n/**\n * Notify heal subscribers. Unlike the markdown loader's fire-once model this\n * can fire MORE THAN ONCE: `registerIcons` may cover some pending names\n * before the chunk adoption covers the rest, and cloning surfaces must\n * re-render on each. Subscribers are only released once the chunk is adopted\n * (`final`) — after that every extra-tier name resolves synchronously, so\n * clones can no longer be created pending.\n */\nconst notifyExtraIconsReady = (final: boolean): void => {\n const subs = [...extraReadySubscribers];\n if (final) extraReadySubscribers.clear();\n for (const cb of subs) {\n try {\n cb();\n } catch {\n /* one bad subscriber must not starve the others */\n }\n }\n};\n\n/**\n * Register `cb` to run once the icons-extra chunk has been adopted (or\n * `registerIcons` supplied names that were pending). For surfaces whose\n * rendered icons get CLONED (fingerprint cache + idiomorph): a clone of a\n * pending placeholder never self-fills, so those surfaces must re-render.\n * Subscribing is passive — it never kicks the fetch (the first extra-name\n * render does). No-op when the extra icons are already registered.\n */\nexport const onExtraIconsReady = (cb: () => void): (() => void) => {\n if (extraIconsLoaded) return () => {};\n extraReadySubscribers.add(cb);\n return () => {\n extraReadySubscribers.delete(cb);\n };\n};\n\nconst fillPendingIcons = (): number => {\n let filled = 0;\n for (const pending of [...pendingIcons]) {\n const data = runtimeIcons.get(pending.name);\n if (!data) continue;\n pendingIcons.delete(pending);\n filled++;\n const real = renderIconNode(data, pending.size, pending.color, pending.strokeWidth);\n if (!real) continue;\n // Fill IN PLACE: the placeholder already carries the correct svg attrs,\n // so adopting the real children swaps nothing the layout depends on.\n pending.el.removeAttribute(\"data-persona-icon-pending\");\n while (real.firstChild) pending.el.appendChild(real.firstChild);\n }\n return filled;\n};\n\n/**\n * Extend the registry at runtime with custom icons (or non-curated lucide\n * data). Later registrations win. Pending placeholders for the added names\n * fill immediately. Public API.\n */\nexport const registerIcons = (icons: Record<string, IconNode>): void => {\n for (const [name, data] of Object.entries(icons)) {\n runtimeIcons.set(name, data);\n }\n // Registered names may cover pending placeholders (e.g. a self-hosted\n // deployment that renamed the bundle and registers icons instead of the\n // chunk). Cloning surfaces hold COPIES the in-place fill can't reach, so\n // notify the heal subscribers whenever anything actually filled.\n if (fillPendingIcons() > 0 && !extraIconsLoaded) {\n notifyExtraIconsReady(false);\n }\n};\n\n/**\n * npm eager path (imported via `index.ts` → `icons-extra-eager.ts`): supply\n * the extra-tier data synchronously so bundled consumers keep the historical\n * all-sync `renderLucideIcon` contract. The IIFE/CDN build never calls this —\n * it lazy-loads `icons-extra.js` instead. Host `registerIcons` overrides\n * registered before this runs still win.\n */\nexport const __eagerlyProvideExtraIcons = (\n icons: Record<string, IconNode>\n): void => {\n if (extraIconsLoaded) return;\n for (const [name, data] of Object.entries(icons)) {\n if (!runtimeIcons.has(name)) runtimeIcons.set(name, data);\n }\n extraIconsLoaded = true;\n fillPendingIcons();\n notifyExtraIconsReady(true);\n};\n\nlet extraIconsKickFailedRetry = false;\nconst kickExtraIcons = (): void => {\n void loadIconsExtra()\n .then((mod) => {\n if (extraIconsLoaded) return;\n for (const [name, data] of Object.entries(mod.EXTRA_LUCIDE_ICONS)) {\n // The chunk is BASE data: never clobber a host's registerIcons()\n // override (\"later registrations win\", and the host's came first).\n if (!runtimeIcons.has(name)) runtimeIcons.set(name, data);\n }\n extraIconsLoaded = true;\n fillPendingIcons();\n notifyExtraIconsReady(true);\n })\n .catch((err) => {\n // Failed fetch (ad blocker, offline, renamed self-hosted bundle):\n // placeholders stay empty and the next extra-name render retries via\n // the chunk loader's rejection-retry. Surface the loader's guidance\n // (e.g. the self-hosting rename message) instead of swallowing it.\n extraIconsKickFailedRetry = true;\n console.warn(\"[Persona] Failed to load the icons-extra chunk\", err);\n });\n};\n\nconst createPlaceholderSvg = (\n size: number | string,\n color: string,\n strokeWidth: number\n): SVGElement => {\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"width\", String(size));\n svg.setAttribute(\"height\", String(size));\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", color);\n svg.setAttribute(\"stroke-width\", String(strokeWidth));\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\"data-persona-icon-pending\", \"true\");\n return svg;\n};\n\n/**\n * Renders a lucide icon as an inline SVG element. Works inside Shadow\n * DOM and requires no CSS.\n *\n * Core names resolve synchronously. Extra-tier names (see EXTRA_ICON_NAMES)\n * return a correctly-sized empty placeholder on first use and fill in place\n * once the lazy icons-extra chunk lands. Unknown names return `null` and log\n * a warning.\n *\n * @param iconName - A lucide kebab-case name from the registry. See\n * `IconName` for the full list, or `docs/icon-registry-shortlist.md`\n * for rationale.\n * @param size - The size in pixels (number) or any CSS length string.\n * @param color - Stroke color (default: \"currentColor\").\n * @param strokeWidth - Stroke width (default: 2).\n * @returns SVGElement, or null if the name is not in the registry.\n */\nexport const renderLucideIcon = (\n iconName: IconName | (string & {}),\n size: number | string = 24,\n color: string = \"currentColor\",\n strokeWidth: number = 2\n): SVGElement | null => {\n const iconData = runtimeIcons.get(iconName);\n if (iconData) return renderIconNode(iconData, size, color, strokeWidth);\n\n if ((EXTRA_ICON_NAMES as readonly string[]).includes(iconName)) {\n if (extraIconsKickFailedRetry) extraIconsKickFailedRetry = false;\n const el = createPlaceholderSvg(size, color, strokeWidth);\n // Bounded: a permanently failing chunk (ad blocker) must not accumulate\n // element refs without limit. Oldest entries are dropped — they simply\n // stay empty, like any clone the fill can't reach.\n if (pendingIcons.size >= 500) {\n const oldest = pendingIcons.values().next().value;\n if (oldest) pendingIcons.delete(oldest);\n }\n pendingIcons.add({ el, name: iconName, size, color, strokeWidth });\n kickExtraIcons();\n return el;\n }\n\n console.warn(\n `Lucide icon \"${iconName}\" is not in the Persona registry. ` +\n `Register it via registerIcons(), or add it to packages/widget/src/utils/icons.ts ` +\n `(see docs/icon-registry-shortlist.md).`\n );\n return null;\n};\n","import { AgentWidgetSessionStatus } from \"../session\";\n\nexport const statusCopy: Record<AgentWidgetSessionStatus, string> = {\n idle: \"Online\",\n connecting: \"Connecting…\",\n connected: \"Streaming…\",\n error: \"Offline\",\n paused: \"Connection lost…\",\n resuming: \"Reconnecting…\"\n};\n\n/**\n * Default z-index for widget overlays. Used for the floating panel, launcher\n * button, sidebar, mobile fullscreen, and docked mobile fullscreen modes.\n * Integrators can override via `launcher.zIndex`.\n */\nexport const DEFAULT_OVERLAY_Z_INDEX = 100000;\n\n/**\n * Z-index for elements portaled to document.body (tooltips, dropdowns).\n * Must be above the widget overlay so portaled UI is not clipped.\n */\nexport const PORTALED_OVERLAY_Z_INDEX = DEFAULT_OVERLAY_Z_INDEX + 1;\n\n\n\n\n\n\n\n\n","import { createElement, createNode, cx } from \"../utils/dom\";\nimport { AgentWidgetConfig, AgentWidgetLauncherTeaserConfig } from \"../types\";\nimport { positionMap } from \"../utils/positioning\";\nimport { isDockedMountMode } from \"../utils/dock\";\nimport { renderLucideIcon } from \"../utils/icons\";\nimport { DEFAULT_OVERLAY_Z_INDEX } from \"../utils/constants\";\n\nexport interface LauncherButton {\n element: HTMLButtonElement;\n update: (config: AgentWidgetConfig) => void;\n destroy: () => void;\n}\n\nexport const createLauncherButton = (\n config: AgentWidgetConfig | undefined,\n onToggle: () => void\n): LauncherButton => {\n const button = createElement(\"button\") as HTMLButtonElement;\n button.type = \"button\";\n button.innerHTML = `\n <span class=\"persona-inline-flex persona-items-center persona-justify-center persona-rounded-full persona-bg-persona-primary persona-text-white\" data-role=\"launcher-icon\">💬</span>\n <img data-role=\"launcher-image\" class=\"persona-rounded-full persona-object-cover\" alt=\"\" style=\"display:none\" />\n <span class=\"persona-flex persona-min-w-0 persona-flex-1 persona-flex-col persona-items-start persona-text-left\">\n <span class=\"persona-block persona-w-full persona-truncate persona-text-sm persona-font-semibold persona-text-persona-launcher\" data-role=\"launcher-title\"></span>\n <span class=\"persona-block persona-w-full persona-truncate persona-text-xs persona-text-persona-launcher-muted\" data-role=\"launcher-subtitle\"></span>\n </span>\n <span class=\"persona-ml-2 persona-grid persona-place-items-center persona-rounded-full persona-bg-persona-primary persona-text-persona-call-to-action\" data-role=\"launcher-call-to-action-icon\">↗</span>\n `;\n button.addEventListener(\"click\", onToggle);\n\n const update = (newConfig: AgentWidgetConfig) => {\n const launcher = newConfig.launcher ?? {};\n const dockedMode = isDockedMountMode(newConfig);\n\n const titleEl = button.querySelector(\"[data-role='launcher-title']\");\n if (titleEl) {\n const t = launcher.title ?? \"Chat Assistant\";\n titleEl.textContent = t;\n titleEl.setAttribute(\"title\", t);\n }\n\n const subtitleEl = button.querySelector(\"[data-role='launcher-subtitle']\");\n if (subtitleEl) {\n const s = launcher.subtitle ?? \"Here to help you get answers fast\";\n subtitleEl.textContent = s;\n subtitleEl.setAttribute(\"title\", s);\n }\n\n // Hide/show text container\n const textContainer = button.querySelector(\".persona-flex-col\");\n if (textContainer) {\n if (launcher.textHidden || dockedMode) {\n (textContainer as HTMLElement).style.display = \"none\";\n } else {\n (textContainer as HTMLElement).style.display = \"\";\n }\n }\n\n const icon = button.querySelector<HTMLSpanElement>(\"[data-role='launcher-icon']\");\n if (icon) {\n if (launcher.agentIconHidden) {\n icon.style.display = \"none\";\n } else {\n const iconSize = launcher.agentIconSize ?? \"40px\";\n icon.style.height = iconSize;\n icon.style.width = iconSize;\n\n // Optional custom background color for the agent icon circle. When set,\n // override the default primary-color background; otherwise restore it.\n if (launcher.agentIconBackgroundColor) {\n icon.style.backgroundColor = launcher.agentIconBackgroundColor;\n icon.classList.remove(\"persona-bg-persona-primary\");\n } else {\n icon.style.backgroundColor = \"\";\n icon.classList.add(\"persona-bg-persona-primary\");\n }\n\n // Clear existing content\n icon.innerHTML = \"\";\n \n // Render icon based on priority: Lucide icon > iconUrl > agentIconText\n if (launcher.agentIconName) {\n // Use Lucide icon\n const iconSizeNum = parseFloat(iconSize) || 24;\n const iconSvg = renderLucideIcon(launcher.agentIconName, iconSizeNum * 0.6, \"var(--persona-text-inverse, #ffffff)\", 1.5);\n if (iconSvg) {\n icon.appendChild(iconSvg);\n icon.style.display = \"\";\n } else {\n // Fallback to agentIconText if Lucide icon fails\n icon.textContent = launcher.agentIconText ?? \"💬\";\n icon.style.display = \"\";\n }\n } else if (launcher.iconUrl) {\n // Use image URL - hide icon span and show img\n icon.style.display = \"none\";\n } else {\n // Use text/emoji\n icon.textContent = launcher.agentIconText ?? \"💬\";\n icon.style.display = \"\";\n }\n }\n }\n\n const img = button.querySelector<HTMLImageElement>(\"[data-role='launcher-image']\");\n if (img) {\n const iconSize = launcher.agentIconSize ?? \"40px\";\n img.style.height = iconSize;\n img.style.width = iconSize;\n if (launcher.iconUrl && !launcher.agentIconName && !launcher.agentIconHidden) {\n // Only show image if not using Lucide icon and not hidden\n img.src = launcher.iconUrl;\n img.style.display = \"block\";\n } else {\n img.style.display = \"none\";\n }\n }\n\n const callToActionIconEl = button.querySelector<HTMLSpanElement>(\"[data-role='launcher-call-to-action-icon']\");\n if (callToActionIconEl) {\n const callToActionIconSize = launcher.callToActionIconSize ?? \"32px\";\n callToActionIconEl.style.height = callToActionIconSize;\n callToActionIconEl.style.width = callToActionIconSize;\n \n // Apply background color if configured\n if (launcher.callToActionIconBackgroundColor) {\n callToActionIconEl.style.backgroundColor = launcher.callToActionIconBackgroundColor;\n callToActionIconEl.classList.remove(\"persona-bg-persona-primary\");\n } else {\n callToActionIconEl.style.backgroundColor = \"\";\n callToActionIconEl.classList.add(\"persona-bg-persona-primary\");\n }\n\n // Apply foreground/icon color if configured\n if (launcher.callToActionIconColor) {\n callToActionIconEl.style.color = launcher.callToActionIconColor;\n callToActionIconEl.classList.remove(\"persona-text-persona-call-to-action\");\n } else {\n callToActionIconEl.style.color = \"\";\n callToActionIconEl.classList.add(\"persona-text-persona-call-to-action\");\n }\n \n // Calculate padding to adjust icon size\n let paddingTotal = 0;\n if (launcher.callToActionIconPadding) {\n callToActionIconEl.style.boxSizing = \"border-box\";\n callToActionIconEl.style.padding = launcher.callToActionIconPadding;\n // Parse padding value to calculate total padding (padding applies to both sides)\n const paddingValue = parseFloat(launcher.callToActionIconPadding) || 0;\n paddingTotal = paddingValue * 2; // padding on both sides\n } else {\n callToActionIconEl.style.boxSizing = \"\";\n callToActionIconEl.style.padding = \"\";\n }\n \n if (launcher.callToActionIconHidden) {\n callToActionIconEl.style.display = \"none\";\n } else {\n callToActionIconEl.style.display = dockedMode ? \"none\" : \"\";\n \n // Clear existing content\n callToActionIconEl.innerHTML = \"\";\n \n // Use Lucide icon if provided, otherwise fall back to text\n if (launcher.callToActionIconName) {\n // Calculate actual icon size by subtracting padding\n const containerSize = parseFloat(callToActionIconSize) || 24;\n const iconSize = Math.max(containerSize - paddingTotal, 8); // Ensure minimum size of 8px\n const iconSvg = renderLucideIcon(launcher.callToActionIconName, iconSize, \"currentColor\", 1.5);\n if (iconSvg) {\n callToActionIconEl.appendChild(iconSvg);\n } else {\n // Fallback to text if icon fails to render\n callToActionIconEl.textContent = launcher.callToActionIconText ?? \"↗\";\n }\n } else {\n callToActionIconEl.textContent = launcher.callToActionIconText ?? \"↗\";\n }\n }\n }\n\n const positionClass =\n launcher.position && positionMap[launcher.position]\n ? positionMap[launcher.position]\n : positionMap[\"bottom-right\"];\n\n const floatingBase =\n \"persona-fixed persona-flex persona-items-center persona-gap-3 persona-rounded-launcher persona-bg-persona-launcher persona-py-2.5 persona-pl-3 persona-pr-3 persona-transition hover:persona-translate-y-[-2px] persona-cursor-pointer\";\n const dockedBase =\n \"persona-relative persona-mt-4 persona-mb-4 persona-mx-auto persona-flex persona-items-center persona-justify-center persona-rounded-launcher persona-bg-persona-launcher persona-transition hover:persona-translate-y-[-2px] persona-cursor-pointer\";\n\n button.className = dockedMode ? dockedBase : `${floatingBase} ${positionClass}`;\n\n if (!dockedMode) {\n button.style.zIndex = String(launcher.zIndex ?? DEFAULT_OVERLAY_Z_INDEX);\n }\n\n // Apply launcher border and shadow from config (with defaults matching previous Tailwind classes)\n const defaultBorder = \"1px solid var(--persona-launcher-border, var(--persona-border, #e5e7eb))\";\n const defaultShadow = \"var(--persona-launcher-shadow, 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1))\";\n\n button.style.border = launcher.border ?? defaultBorder;\n button.style.boxShadow =\n launcher.shadow !== undefined\n ? (launcher.shadow.trim() === \"\" ? \"none\" : launcher.shadow)\n : defaultShadow;\n\n if (dockedMode) {\n // Docked mode uses a 0px column when closed and hides this button; keep no hit target.\n button.style.width = \"0\";\n button.style.minWidth = \"0\";\n button.style.maxWidth = \"0\";\n button.style.padding = \"0\";\n button.style.overflow = \"hidden\";\n button.style.border = \"none\";\n button.style.boxShadow = \"none\";\n } else {\n button.style.width = \"\";\n button.style.minWidth = \"\";\n button.style.maxWidth = launcher.collapsedMaxWidth ?? \"\";\n button.style.justifyContent = \"\";\n button.style.padding = \"\";\n button.style.overflow = \"\";\n }\n };\n\n const destroy = () => {\n button.removeEventListener(\"click\", onToggle);\n button.remove();\n };\n\n // Initial update\n if (config) {\n update(config);\n }\n\n return {\n element: button,\n update,\n destroy\n };\n};\n\n/** Teaser bubble handle. `dismiss(true)` also writes the persisted flag. */\nexport interface LauncherTeaser {\n element: HTMLElement;\n show: () => void;\n dismiss: (persist: boolean) => void;\n}\n\n/** \"auto\" covers restored/hook-driven opens: they never persist the teaser flag. */\nexport type LauncherOpenOrigin = \"user\" | \"auto\";\n\nexport interface LauncherSurface {\n /** Positioned wrapper. Sibling teaser + launcher live inside it. */\n element: HTMLElement;\n launcher: LauncherButton;\n /** Null when no teaser is configured for the current config. */\n teaser: LauncherTeaser | null;\n /** Opening the panel consumes the teaser; closing never resurrects it. */\n setPanelOpen: (open: boolean, origin?: LauncherOpenOrigin) => void;\n update: (config: AgentWidgetConfig) => void;\n destroy: () => void;\n}\n\nconst TEASER_KEY_SUFFIX = \"teaser-dismissed\";\n\n/** Consumed teaser keys for this page load; also the blocked-storage fallback. */\nconst teaserMemoryDismissed = new Set<string>();\n\nconst teaserStorageKey = (config?: AgentWidgetConfig): string => {\n const persist = config?.persistState;\n const prefix =\n (typeof persist === \"object\" ? persist?.keyPrefix : undefined) ?? \"persona-\";\n return `${prefix}${TEASER_KEY_SUFFIX}`;\n};\n\n// localStorage access throws (not just fails) in Safari private mode and\n// partitioned iframes, so every access falls back to the in-memory set.\nconst readTeaserDismissed = (key: string, useStorage: boolean): boolean => {\n if (teaserMemoryDismissed.has(key)) return true;\n if (!useStorage) return false;\n try {\n return window.localStorage.getItem(key) === \"1\";\n } catch {\n return false;\n }\n};\n\nconst writeTeaserDismissed = (key: string, useStorage: boolean): void => {\n teaserMemoryDismissed.add(key);\n if (!useStorage) return;\n try {\n window.localStorage.setItem(key, \"1\");\n } catch {\n /* blocked storage: the in-memory flag above is the fallback */\n }\n};\n\nconst prefersReducedMotion = (): boolean =>\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\nconst resolveTeaserConfig = (\n config: AgentWidgetConfig | undefined\n): AgentWidgetLauncherTeaserConfig | null => {\n const teaser = config?.launcher?.teaser;\n if (!teaser || !teaser.text) return null;\n if (config?.launcher?.enabled === false) return null;\n if (isDockedMountMode(config ?? {})) return null;\n return teaser;\n};\n\n/**\n * Launcher wrapper owning the collapsed button and its optional teaser bubble.\n * Both the critical `launcher.global.js` bundle and the full widget build the\n * launcher through this, so teaser behavior and cleanup are identical on the\n * eager and deferred paths.\n */\nexport const createLauncherSurface = (\n config: AgentWidgetConfig | undefined,\n onToggle: () => void\n): LauncherSurface => {\n const wrapper = createElement(\"div\", \"persona-launcher-surface\");\n wrapper.setAttribute(\"data-persona-launcher-surface\", \"true\");\n\n let currentConfig: AgentWidgetConfig = config ?? {};\n let teaserConfig: AgentWidgetLauncherTeaserConfig | null = null;\n let teaserElement: HTMLElement | null = null;\n let dismissButton: HTMLButtonElement | null = null;\n let teaserTextButton: HTMLButtonElement | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let visible = false;\n let shown = false;\n let consumed = false;\n let panelOpen = false;\n\n const usesStorage = (): boolean =>\n (teaserConfig?.frequency ?? \"once\") === \"once\" &&\n currentConfig.persistState !== false;\n\n const clearTimer = () => {\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const hideBubble = () => {\n if (!teaserElement || !visible) return;\n visible = false;\n teaserElement.hidden = true;\n };\n\n const dismiss = (persist: boolean) => {\n clearTimer();\n consumed = true;\n hideBubble();\n writeTeaserDismissed(teaserStorageKey(currentConfig), persist && usesStorage());\n };\n\n /**\n * Click-through and launcher clicks consume; only a seen teaser persists.\n * An automatic open is never user intent, so it consumes in memory only.\n */\n const consumeForOpen = (origin: LauncherOpenOrigin) => {\n if (!teaserConfig || consumed) return;\n dismiss(origin === \"user\" && visible);\n };\n\n const show = () => {\n timer = null;\n if (!teaserElement || consumed || panelOpen) return;\n shown = true;\n visible = true;\n teaserElement.hidden = false;\n if (prefersReducedMotion() || typeof teaserElement.animate !== \"function\") return;\n teaserElement.animate(\n [\n { opacity: \"0\", transform: \"translateY(6px)\" },\n { opacity: \"1\", transform: \"none\" },\n ],\n { duration: 220, easing: \"ease-out\", fill: \"backwards\" }\n );\n };\n\n const schedule = () => {\n if (!teaserConfig || !teaserElement) return;\n if (consumed || shown || panelOpen) return;\n if (readTeaserDismissed(teaserStorageKey(currentConfig), usesStorage())) return;\n clearTimer();\n timer = setTimeout(show, Math.max(0, teaserConfig.delayMs ?? 0));\n };\n\n const handleTeaserClick = () => {\n dismiss(usesStorage());\n onToggle();\n };\n\n const handleDismissClick = (event: MouseEvent) => {\n event.stopPropagation();\n dismiss(usesStorage());\n };\n\n const handleLauncherToggle = () => {\n consumeForOpen(\"user\");\n onToggle();\n };\n\n const launcher = createLauncherButton(config, handleLauncherToggle);\n\n const removeTeaserElement = () => {\n clearTimer();\n teaserTextButton?.removeEventListener(\"click\", handleTeaserClick);\n dismissButton?.removeEventListener(\"click\", handleDismissClick);\n teaserElement?.remove();\n teaserElement = null;\n teaserTextButton = null;\n dismissButton = null;\n visible = false;\n };\n\n const buildTeaserElement = () => {\n teaserTextButton = createNode(\"button\", {\n className: \"persona-launcher-teaser-text\",\n attrs: { type: \"button\" },\n });\n teaserTextButton.addEventListener(\"click\", handleTeaserClick);\n\n dismissButton = createNode(\"button\", {\n className: \"persona-launcher-teaser-dismiss\",\n attrs: { type: \"button\" },\n text: \"\\u00d7\",\n });\n dismissButton.addEventListener(\"click\", handleDismissClick);\n\n teaserElement = createNode(\n \"div\",\n {\n className: \"persona-launcher-teaser\",\n attrs: {\n \"data-persona-launcher-teaser\": \"true\",\n role: \"status\",\n \"aria-live\": \"polite\",\n hidden: \"\",\n },\n },\n teaserTextButton,\n dismissButton\n );\n wrapper.insertBefore(teaserElement, launcher.element);\n };\n\n /**\n * The wrapper is `display: contents` until a teaser exists, so the launcher\n * keeps its own fixed placement; with a teaser the wrapper takes over the\n * corner and the button becomes static inside it.\n */\n const applyPlacement = () => {\n const position = currentConfig.launcher?.position ?? \"bottom-right\";\n const positionClass = positionMap[position] ?? positionMap[\"bottom-right\"];\n\n if (!teaserElement) {\n wrapper.className = \"persona-launcher-surface\";\n wrapper.removeAttribute(\"data-teaser\");\n wrapper.style.zIndex = \"\";\n launcher.element.style.position = \"\";\n return;\n }\n\n wrapper.className = cx(\"persona-launcher-surface\", positionClass);\n wrapper.setAttribute(\"data-teaser\", position);\n wrapper.style.zIndex = String(\n currentConfig.launcher?.zIndex ?? DEFAULT_OVERLAY_Z_INDEX\n );\n launcher.element.style.position = \"static\";\n };\n\n const syncTeaser = (nextConfig: AgentWidgetConfig) => {\n const next = resolveTeaserConfig(nextConfig);\n teaserConfig = next;\n\n if (!next) {\n removeTeaserElement();\n return;\n }\n\n // `shown` is deliberately not reset here: at most one appearance per load.\n if (!teaserElement) buildTeaserElement();\n\n teaserTextButton!.textContent = next.text;\n dismissButton!.hidden = next.dismissible === false;\n dismissButton!.setAttribute(\n \"aria-label\",\n next.dismissLabel ?? \"Dismiss message\"\n );\n schedule();\n };\n\n const update = (nextConfig: AgentWidgetConfig) => {\n currentConfig = nextConfig;\n launcher.update(nextConfig);\n syncTeaser(nextConfig);\n applyPlacement();\n };\n\n const setPanelOpen = (open: boolean, origin: LauncherOpenOrigin = \"user\") => {\n panelOpen = open;\n if (!open) return;\n consumeForOpen(origin);\n };\n\n const destroy = () => {\n removeTeaserElement();\n launcher.destroy();\n wrapper.remove();\n };\n\n wrapper.appendChild(launcher.element);\n if (config) {\n syncTeaser(config);\n applyPlacement();\n }\n\n return {\n element: wrapper,\n launcher,\n get teaser(): LauncherTeaser | null {\n if (!teaserElement) return null;\n return { element: teaserElement, show, dismiss };\n },\n setPanelOpen,\n update,\n destroy,\n };\n};\n","const isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/**\n * Deep-merge plain objects. Arrays and non-objects are replaced by override.\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n base: T | undefined,\n override: Record<string, unknown> | undefined\n): T | Record<string, unknown> | undefined {\n if (!base) return override;\n if (!override) return base;\n\n const merged: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(override)) {\n const existing = merged[key];\n if (isObject(existing) && isObject(value)) {\n merged[key] = deepMerge(existing, value);\n } else {\n merged[key] = value;\n }\n }\n\n return merged;\n}\n","import type { AgentWidgetConfig, AgentWidgetLauncherConfig } from \"./types\";\nimport type { DeepPartial, PersonaTheme } from \"./types/theme\";\nimport { deepMerge } from \"./utils/deep-merge\";\nimport {\n DEFAULT_TOOLTIP_DELAY_MS,\n DEFAULT_TOOLTIP_SKIP_DELAY_MS,\n} from \"./utils/tooltip-timing\";\n\n/**\n * Default width for the floating launcher panel (when not overridden).\n * Benchmarks: many chat products use ~300–400px; 400px is a frequent “standard” default.\n * We use 440px to better fit code/JSON and structured replies while staying responsive via `min(..., 100vw)`.\n */\nexport const DEFAULT_FLOATING_LAUNCHER_WIDTH = \"min(440px, calc(100vw - 24px))\";\n\n/** Max width cap paired with {@link DEFAULT_FLOATING_LAUNCHER_WIDTH} for theme defaults. */\nexport const DEFAULT_FLOATING_LAUNCHER_MAX_WIDTH = \"440px\";\n\n/**\n * Canonical composer placeholder. The low-level builders fall back to this so\n * they cannot drift from `DEFAULT_WIDGET_CONFIG.copy.inputPlaceholder`.\n */\nexport const DEFAULT_INPUT_PLACEHOLDER = \"How can I help...\";\n\nexport const DEFAULT_LAUNCHER_CONFIG: AgentWidgetLauncherConfig = {\n enabled: true,\n mountMode: \"floating\",\n dock: {\n side: \"right\",\n width: \"420px\",\n },\n title: \"Chat Assistant\",\n subtitle: \"Here to help you get answers fast\",\n agentIconText: \"💬\",\n agentIconName: \"bot\",\n headerIconName: \"bot\",\n position: \"bottom-right\",\n width: DEFAULT_FLOATING_LAUNCHER_WIDTH,\n heightOffset: 0,\n autoExpand: false,\n callToActionIconHidden: false,\n agentIconSize: \"40px\",\n headerIconSize: \"40px\",\n // closeButtonSize / clearChat.size omitted so theme.components.header.controlSize\n // sizes the header controls; setting either here would pin them past the token.\n // Zero out browser-default <button> padding so the icon gets the full\n // content box, matching clearChat.paddingX/Y below. Without this,\n // UA stylesheets add ~1-2px vertical and ~6px horizontal padding that\n // eats into the border-box width and shrinks the rendered icon.\n closeButtonPaddingX: \"0px\",\n closeButtonPaddingY: \"0px\",\n callToActionIconName: \"arrow-up-right\",\n callToActionIconText: \"\",\n callToActionIconSize: \"32px\",\n callToActionIconPadding: \"5px\",\n callToActionIconColor: undefined,\n callToActionIconBackgroundColor: undefined,\n // closeButtonColor / clearChat.iconColor omitted so theme.components.header.actionIconForeground applies.\n closeButtonBackgroundColor: \"transparent\",\n clearChat: {\n backgroundColor: \"transparent\",\n borderColor: \"transparent\",\n enabled: true,\n placement: \"inline\",\n iconName: \"refresh-cw\",\n showTooltip: true,\n tooltipText: \"Clear chat\",\n paddingX: \"0px\",\n paddingY: \"0px\",\n },\n headerIconHidden: false,\n border: undefined,\n shadow:\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)\",\n};\n\n/**\n * Default widget configuration\n * Single source of truth for all default values\n */\nexport const DEFAULT_WIDGET_CONFIG: Partial<AgentWidgetConfig> = {\n apiUrl: \"https://api.runtype.com/api/chat/dispatch\",\n // Client token mode defaults (optional, only used when clientToken is set)\n clientToken: undefined,\n agentId: undefined,\n target: undefined,\n theme: undefined,\n darkTheme: undefined,\n colorScheme: \"light\",\n tooltip: {\n delayMs: DEFAULT_TOOLTIP_DELAY_MS,\n skipDelayMs: DEFAULT_TOOLTIP_SKIP_DELAY_MS,\n },\n launcher: DEFAULT_LAUNCHER_CONFIG,\n copy: {\n // No welcomeTitle / welcomeSubtitle here on purpose: `resolveWelcomeConfig`\n // owns those defaults so presence still means \"the host set this\".\n inputPlaceholder: DEFAULT_INPUT_PLACEHOLDER,\n sendButtonLabel: \"Send\",\n },\n sendButton: {\n borderWidth: \"0px\",\n paddingX: \"12px\",\n paddingY: \"10px\",\n borderColor: undefined,\n useIcon: true,\n iconText: \"↑\",\n // No `size`: unset means \"follow --persona-composer-control-size\"\n // (theme.components.composer.controlSize), which defaults to 40px.\n showTooltip: true,\n tooltipText: \"Send message\",\n iconName: \"send\",\n },\n statusIndicator: {\n visible: true,\n idleText: \"Online\",\n connectingText: \"Connecting…\",\n connectedText: \"Streaming…\",\n errorText: \"Offline\",\n },\n voiceRecognition: {\n enabled: true,\n pauseDuration: 2000,\n iconName: \"mic\",\n // No `iconSize` / `paddingX` / `paddingY`: the mic sizes from\n // --persona-composer-control-size like every other composer control, so it\n // no longer needs the hand-tuned box that squeezed a 39px glyph.\n borderWidth: \"0px\",\n iconColor: undefined,\n backgroundColor: \"transparent\",\n borderColor: \"transparent\",\n recordingIconColor: undefined,\n recordingBackgroundColor: undefined,\n recordingBorderColor: \"transparent\",\n showTooltip: true,\n tooltipText: \"Start voice recognition\",\n },\n features: {\n showReasoning: true,\n showToolCalls: true,\n scrollToBottom: {\n enabled: true,\n iconName: \"arrow-down\",\n label: \"\",\n },\n scrollBehavior: {\n // ChatGPT-style default: pin the just-sent message near the top and let\n // the reply stream into the space below. Restore the old \"stick to the\n // bottom\" behavior with `mode: \"follow\"`.\n mode: \"anchor-top\",\n anchorTopOffset: 16,\n // Surface the unread count + \"streaming below\" hint while pinned, so the\n // reader still sees activity arriving off-screen under the pinned turn.\n // (Suppressed by default historically; opted on alongside the anchor-top\n // default so the default UX keeps the affordance.)\n showActivityWhilePinned: true,\n },\n toolCallDisplay: {\n collapsedMode: \"tool-call\",\n activePreview: false,\n grouped: false,\n groupedMode: \"stack\",\n previewMaxLines: 3,\n expandable: true,\n loadingAnimation: \"none\",\n },\n reasoningDisplay: {\n activePreview: false,\n previewMaxLines: 3,\n expandable: true,\n loadingAnimation: \"none\",\n },\n streamAnimation: {\n type: \"none\",\n placeholder: \"none\",\n speed: 120,\n duration: 1800,\n },\n askUserQuestion: {\n enabled: true,\n slideInMs: 180,\n freeTextLabel: \"Other…\",\n freeTextPlaceholder: \"Type your answer…\",\n submitLabel: \"Send\",\n },\n history: {\n enabled: false,\n presentation: \"panel\",\n showScopeStatus: true,\n showDelete: true,\n showDeleteAll: true,\n },\n },\n // Placeholder copy that models the right shape: verb-first, user-voice,\n // one line. Integrators should swap in domain prompts.\n suggestionChips: [\n \"Show me what you can help with\",\n \"Walk me through getting started\",\n \"Answer a question about this page\",\n ],\n suggestionChipsConfig: {\n fontFamily: \"sans-serif\",\n fontWeight: \"500\",\n paddingX: \"12px\",\n paddingY: \"6px\",\n },\n layout: {\n header: {\n layout: \"default\",\n showIcon: true,\n showTitle: true,\n showSubtitle: true,\n showCloseButton: true,\n showClearChat: true,\n },\n messages: {\n layout: \"bubble\",\n avatar: {\n show: false,\n position: \"left\",\n },\n timestamp: {\n show: false,\n position: \"below\",\n },\n groupConsecutive: false,\n },\n slots: {},\n },\n markdown: {\n options: {\n gfm: true,\n breaks: true,\n },\n disableDefaultStyles: false,\n },\n messageActions: {\n enabled: true,\n showCopy: true,\n showUpvote: false, // Requires backend - disabled by default\n showDownvote: false, // Requires backend - disabled by default\n visibility: \"hover\",\n align: \"right\",\n layout: \"pill-inside\",\n },\n debug: false,\n};\n\nfunction mergeThemePartials(\n base: DeepPartial<PersonaTheme> | undefined,\n override: DeepPartial<PersonaTheme> | undefined\n): DeepPartial<PersonaTheme> | undefined {\n if (!base && !override) return undefined;\n if (!base) return override;\n if (!override) return base;\n return deepMerge(\n base as Record<string, unknown>,\n override as Record<string, unknown>\n ) as DeepPartial<PersonaTheme>;\n}\n\n/**\n * Helper to deep merge user config with defaults\n * This ensures all default values are present while allowing selective overrides\n */\nexport function mergeWithDefaults(\n config?: Partial<AgentWidgetConfig>\n): Partial<AgentWidgetConfig> {\n if (!config) return DEFAULT_WIDGET_CONFIG;\n\n return {\n ...DEFAULT_WIDGET_CONFIG,\n ...config,\n theme: mergeThemePartials(DEFAULT_WIDGET_CONFIG.theme, config.theme),\n darkTheme: mergeThemePartials(DEFAULT_WIDGET_CONFIG.darkTheme, config.darkTheme),\n launcher: {\n ...DEFAULT_WIDGET_CONFIG.launcher,\n ...config.launcher,\n dock: {\n ...DEFAULT_WIDGET_CONFIG.launcher?.dock,\n ...config.launcher?.dock,\n },\n clearChat: {\n ...DEFAULT_WIDGET_CONFIG.launcher?.clearChat,\n ...config.launcher?.clearChat,\n },\n },\n tooltip: {\n ...DEFAULT_WIDGET_CONFIG.tooltip,\n ...config.tooltip,\n },\n copy: {\n ...DEFAULT_WIDGET_CONFIG.copy,\n ...config.copy,\n },\n sendButton: {\n ...DEFAULT_WIDGET_CONFIG.sendButton,\n ...config.sendButton,\n },\n statusIndicator: {\n ...DEFAULT_WIDGET_CONFIG.statusIndicator,\n ...config.statusIndicator,\n },\n voiceRecognition: {\n ...DEFAULT_WIDGET_CONFIG.voiceRecognition,\n ...config.voiceRecognition,\n },\n features: (() => {\n const da = DEFAULT_WIDGET_CONFIG.features?.artifacts;\n const ca = config.features?.artifacts;\n const dsb = DEFAULT_WIDGET_CONFIG.features?.scrollToBottom;\n const csb = config.features?.scrollToBottom;\n const dsc = DEFAULT_WIDGET_CONFIG.features?.scrollBehavior;\n const csc = config.features?.scrollBehavior;\n const dsa = DEFAULT_WIDGET_CONFIG.features?.streamAnimation;\n const csa = config.features?.streamAnimation;\n const dau = DEFAULT_WIDGET_CONFIG.features?.askUserQuestion;\n const cau = config.features?.askUserQuestion;\n const dh = DEFAULT_WIDGET_CONFIG.features?.history;\n const ch = config.features?.history;\n const mergedArtifacts =\n da === undefined && ca === undefined\n ? undefined\n : {\n ...da,\n ...ca,\n layout: {\n ...da?.layout,\n ...ca?.layout,\n },\n };\n const mergedScrollToBottom =\n dsb === undefined && csb === undefined\n ? undefined\n : {\n ...dsb,\n ...csb,\n };\n const mergedScrollBehavior =\n dsc === undefined && csc === undefined\n ? undefined\n : {\n ...dsc,\n ...csc,\n };\n const mergedStreamAnimation =\n dsa === undefined && csa === undefined\n ? undefined\n : {\n ...dsa,\n ...csa,\n };\n const mergedAskUserQuestion =\n dau === undefined && cau === undefined\n ? undefined\n : {\n ...dau,\n ...cau,\n styles: {\n ...dau?.styles,\n ...cau?.styles,\n },\n };\n const mergedHistory =\n dh === undefined && ch === undefined\n ? undefined\n : {\n ...dh,\n ...ch,\n copy: {\n ...dh?.copy,\n ...ch?.copy,\n },\n };\n return {\n ...DEFAULT_WIDGET_CONFIG.features,\n ...config.features,\n ...(mergedScrollToBottom !== undefined ? { scrollToBottom: mergedScrollToBottom } : {}),\n ...(mergedScrollBehavior !== undefined ? { scrollBehavior: mergedScrollBehavior } : {}),\n ...(mergedArtifacts !== undefined ? { artifacts: mergedArtifacts } : {}),\n ...(mergedStreamAnimation !== undefined ? { streamAnimation: mergedStreamAnimation } : {}),\n ...(mergedAskUserQuestion !== undefined ? { askUserQuestion: mergedAskUserQuestion } : {}),\n ...(mergedHistory !== undefined ? { history: mergedHistory } : {}),\n };\n })(),\n suggestionChips: config.suggestionChips ?? DEFAULT_WIDGET_CONFIG.suggestionChips,\n suggestionChipsConfig: {\n ...DEFAULT_WIDGET_CONFIG.suggestionChipsConfig,\n ...config.suggestionChipsConfig,\n },\n layout: {\n ...DEFAULT_WIDGET_CONFIG.layout,\n ...config.layout,\n header: {\n ...DEFAULT_WIDGET_CONFIG.layout?.header,\n ...config.layout?.header,\n },\n messages: {\n ...DEFAULT_WIDGET_CONFIG.layout?.messages,\n ...config.layout?.messages,\n avatar: {\n ...DEFAULT_WIDGET_CONFIG.layout?.messages?.avatar,\n ...config.layout?.messages?.avatar,\n },\n timestamp: {\n ...DEFAULT_WIDGET_CONFIG.layout?.messages?.timestamp,\n ...config.layout?.messages?.timestamp,\n },\n },\n slots: {\n ...DEFAULT_WIDGET_CONFIG.layout?.slots,\n ...config.layout?.slots,\n },\n },\n markdown: {\n ...DEFAULT_WIDGET_CONFIG.markdown,\n ...config.markdown,\n options: {\n ...DEFAULT_WIDGET_CONFIG.markdown?.options,\n ...config.markdown?.options,\n },\n },\n messageActions: {\n ...DEFAULT_WIDGET_CONFIG.messageActions,\n ...config.messageActions,\n },\n };\n}\n","import type {\n DeepPartial,\n PersonaTheme,\n ResolvedToken,\n ThemeValidationResult,\n ThemeValidationError,\n CreateThemeOptions,\n ComponentTokens,\n SemanticTokens,\n} from '../types/theme';\nimport {\n DEFAULT_FLOATING_LAUNCHER_MAX_WIDTH,\n DEFAULT_FLOATING_LAUNCHER_WIDTH,\n} from '../defaults';\n\n// Detached/docked panel defaults, shared by the panel token defaults, the alias\n// fallbacks below, host-layout, the theme editor, and the artifact gate.\nexport const DEFAULT_PANEL_INSET = '16px';\nexport const DEFAULT_PANEL_CANVAS_BACKGROUND = 'transparent';\n\nconst spacing = (() => {\n const s: Record<number, string> = {};\n for (const k of [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64])\n s[k] = k === 0 ? '0px' : `${k / 4}rem`;\n return s as Record<0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16 | 20 | 24 | 32 | 40 | 48 | 56 | 64, string>;\n})();\n\nexport const DEFAULT_PALETTE = {\n colors: {\n primary: {\n 50: '#ffffff',\n 100: '#f5f5f5',\n 200: '#d4d4d4',\n 300: '#a3a3a3',\n 400: '#737373',\n 500: '#171717',\n 600: '#0f0f0f',\n 700: '#0a0a0a',\n 800: '#050505',\n 900: '#030303',\n 950: '#000000',\n },\n secondary: {\n 50: '#f5f3ff',\n 100: '#ede9fe',\n 200: '#ddd6fe',\n 300: '#c4b5fd',\n 400: '#a78bfa',\n 500: '#8b5cf6',\n 600: '#7c3aed',\n 700: '#6d28d9',\n 800: '#5b21b6',\n 900: '#4c1d95',\n 950: '#2e1065',\n },\n accent: {\n 50: '#ecfeff',\n 100: '#cffafe',\n 200: '#a5f3fc',\n 300: '#67e8f9',\n 400: '#22d3ee',\n 500: '#06b6d4',\n 600: '#0891b2',\n 700: '#0e7490',\n 800: '#155e75',\n 900: '#164e63',\n 950: '#083344',\n },\n gray: {\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n success: {\n 50: '#f0fdf4',\n 100: '#dcfce7',\n 200: '#bbf7d0',\n 300: '#86efac',\n 400: '#4ade80',\n 500: '#22c55e',\n 600: '#16a34a',\n 700: '#15803d',\n 800: '#166534',\n 900: '#14532d',\n },\n warning: {\n 50: '#fefce8',\n 100: '#fef9c3',\n 200: '#fef08a',\n 300: '#fde047',\n 400: '#facc15',\n 500: '#eab308',\n 600: '#ca8a04',\n 700: '#a16207',\n 800: '#854d0e',\n 900: '#713f12',\n },\n error: {\n 50: '#fef2f2',\n 100: '#fee2e2',\n 200: '#fecaca',\n 300: '#fca5a5',\n 400: '#f87171',\n 500: '#ef4444',\n 600: '#dc2626',\n 700: '#b91c1c',\n 800: '#991b1b',\n 900: '#7f1d1d',\n },\n info: {\n 50: '#eff6ff',\n 100: '#dbeafe',\n 200: '#bfdbfe',\n 300: '#93c5fd',\n 400: '#60a5fa',\n 500: '#3b82f6',\n 600: '#2563eb',\n 700: '#1d4ed8',\n 800: '#1e40af',\n 900: '#1e3a8a',\n 950: '#172554',\n },\n purple: {\n 50: '#faf5ff',\n 100: '#f3e8ff',\n 200: '#e9d5ff',\n 300: '#d8b4fe',\n 400: '#c084fc',\n 500: '#a855f7',\n 600: '#9333ea',\n 700: '#7e22ce',\n 800: '#6b21a8',\n 900: '#581c87',\n 950: '#3b0764',\n },\n teal: {\n 50: '#f0fdfa',\n 100: '#ccfbf1',\n 200: '#99f6e4',\n 300: '#5eead4',\n 400: '#2dd4bf',\n 500: '#14b8a6',\n 600: '#0d9488',\n 700: '#0f766e',\n 800: '#115e59',\n 900: '#134e4a',\n 950: '#042f2e',\n },\n },\n spacing,\n typography: {\n fontFamily: {\n sans: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n serif: 'Georgia, Cambria, \"Times New Roman\", Times, serif',\n mono: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n },\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n '4xl': '2.25rem',\n },\n fontWeight: {\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n },\n lineHeight: {\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.625',\n },\n },\n shadows: {\n none: 'none',\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n '2xl': '0 25px 50px -12px rgb(0 0 0 / 0.25)',\n },\n borders: {\n none: 'none',\n sm: '1px solid',\n md: '2px solid',\n lg: '4px solid',\n },\n radius: {\n none: '0px',\n sm: '0.125rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n '2xl': '1rem',\n full: '9999px',\n },\n};\n\nexport const DEFAULT_SEMANTIC: SemanticTokens = {\n colors: {\n primary: 'palette.colors.primary.500',\n secondary: 'palette.colors.secondary.500',\n // Links/Focus role: solid primary\n accent: 'palette.colors.primary.600',\n // Surfaces role: soft gray\n surface: 'palette.colors.gray.50',\n background: 'palette.colors.gray.50',\n container: 'palette.colors.gray.50',\n text: 'palette.colors.gray.900',\n textMuted: 'palette.colors.gray.500',\n textInverse: 'palette.colors.gray.50',\n // Borders role: soft gray\n border: 'palette.colors.gray.200',\n divider: 'palette.colors.gray.200',\n interactive: {\n // Primary Actions role: solid primary\n default: 'palette.colors.primary.600',\n hover: 'palette.colors.primary.700',\n // Links/Focus role: solid primary\n focus: 'palette.colors.primary.600',\n active: 'palette.colors.primary.600',\n disabled: 'palette.colors.gray.300',\n },\n feedback: {\n success: 'palette.colors.success.500',\n warning: 'palette.colors.warning.500',\n error: 'palette.colors.error.500',\n info: 'palette.colors.info.500',\n },\n },\n spacing: {\n xs: 'palette.spacing.1',\n sm: 'palette.spacing.2',\n md: 'palette.spacing.4',\n lg: 'palette.spacing.6',\n xl: 'palette.spacing.8',\n '2xl': 'palette.spacing.10',\n },\n typography: {\n fontFamily: 'palette.typography.fontFamily.sans',\n fontSize: 'palette.typography.fontSize.base',\n fontWeight: 'palette.typography.fontWeight.normal',\n lineHeight: 'palette.typography.lineHeight.normal',\n },\n};\n\nexport const DEFAULT_COMPONENTS: ComponentTokens = {\n button: {\n primary: {\n // Primary Actions role: solid primary\n background: 'palette.colors.primary.500',\n foreground: 'palette.colors.primary.50',\n borderRadius: 'palette.radius.lg',\n padding: 'semantic.spacing.md',\n },\n secondary: {\n background: 'semantic.colors.surface',\n foreground: 'semantic.colors.secondary',\n borderRadius: 'palette.radius.lg',\n padding: 'semantic.spacing.md',\n },\n ghost: {\n background: 'transparent',\n foreground: 'semantic.colors.text',\n borderRadius: 'palette.radius.md',\n padding: 'semantic.spacing.sm',\n // Subtle neutral tint on hover — the composer's transparent icon buttons\n // (attachment, mention) read this via `--persona-button-ghost-hover-bg`.\n hoverBackground: 'rgba(0, 0, 0, 0.05)',\n },\n },\n input: {\n // Input role: semantic surface so host light/dark schemes cascade.\n background: 'semantic.colors.surface',\n placeholder: 'semantic.colors.textMuted',\n borderRadius: 'palette.radius.lg',\n padding: 'semantic.spacing.md',\n focus: {\n border: 'palette.colors.gray.400',\n ring: 'palette.colors.gray.400',\n },\n },\n launcher: {\n // Launcher pill role: shared surface/primary tones until a host overrides.\n background: 'semantic.colors.surface',\n foreground: 'semantic.colors.primary',\n border: 'semantic.colors.border',\n size: '60px',\n iconSize: '28px',\n borderRadius: 'palette.radius.full',\n shadow: 'palette.shadows.lg',\n },\n panel: {\n width: DEFAULT_FLOATING_LAUNCHER_WIDTH,\n maxWidth: DEFAULT_FLOATING_LAUNCHER_MAX_WIDTH,\n height: '600px',\n maxHeight: 'calc(100vh - 80px)',\n borderRadius: 'palette.radius.xl',\n shadow: 'palette.shadows.xl',\n inset: DEFAULT_PANEL_INSET,\n canvasBackground: DEFAULT_PANEL_CANVAS_BACKGROUND,\n },\n header: {\n // Header role: solid primary. Border, subtitle, and action icons stay\n // unset so they derive from this background/foreground pair.\n background: 'palette.colors.primary.500',\n foreground: 'palette.colors.primary.50',\n borderRadius: 'palette.radius.xl palette.radius.xl 0 0',\n padding: 'semantic.spacing.md',\n iconBackground: 'palette.colors.primary.600',\n iconForeground: 'palette.colors.primary.50',\n },\n message: {\n user: {\n // User Messages role: solid primary\n background: 'palette.colors.primary.500',\n text: 'palette.colors.primary.50',\n borderRadius: 'palette.radius.lg',\n shadow: 'palette.shadows.sm',\n },\n assistant: {\n // Assistant Messages role: semantic neutral container.\n background: 'semantic.colors.container',\n text: 'semantic.colors.text',\n borderRadius: 'palette.radius.lg',\n border: 'semantic.colors.border',\n shadow: 'palette.shadows.sm',\n },\n border: 'semantic.colors.border',\n },\n introCard: {\n // Flat by default: the greeting reads as plain text on the transcript\n // background (the industry norm), not an elevated card.\n background: 'transparent',\n borderRadius: 'palette.radius.2xl',\n padding: 'semantic.spacing.lg',\n shadow: 'palette.shadows.none',\n },\n suggestion: {\n chip: {\n background: 'semantic.colors.surface',\n foreground: 'semantic.colors.text',\n border: 'semantic.colors.border',\n borderRadius: 'palette.radius.full',\n padding: '0.5rem 0.875rem',\n gap: '0.5rem',\n itemGap: '8px',\n minHeight: '36px',\n fontSize: '0.8125rem',\n lineHeight: '1.25',\n iconSize: '16px',\n hoverBackground: 'palette.colors.gray.100',\n hoverBorder: 'palette.colors.gray.300',\n pressedBackground: 'palette.colors.gray.200',\n focusRing: 'semantic.colors.interactive.focus',\n disabledOpacity: '0.5',\n },\n card: {\n background: 'semantic.colors.surface',\n foreground: 'semantic.colors.text',\n border: 'semantic.colors.border',\n borderRadius: 'palette.radius.xl',\n padding: '1rem',\n shadow: 'palette.shadows.sm',\n gap: '0.625rem',\n itemGap: '8px',\n minHeight: '72px',\n fontSize: '0.875rem',\n lineHeight: '1.35',\n iconSize: '18px',\n hoverBackground: 'palette.colors.gray.100',\n hoverBorder: 'palette.colors.gray.300',\n pressedBackground: 'palette.colors.gray.200',\n focusRing: 'semantic.colors.interactive.focus',\n disabledOpacity: '0.5',\n },\n list: {\n background: 'transparent',\n foreground: 'semantic.colors.text',\n border: 'semantic.colors.border',\n borderRadius: 'palette.radius.md',\n padding: '0.75rem',\n gap: '0.625rem',\n itemGap: '8px',\n minHeight: '44px',\n fontSize: '0.875rem',\n lineHeight: '1.35',\n iconSize: '17px',\n hoverBackground: 'palette.colors.gray.100',\n hoverBorder: 'palette.colors.gray.300',\n pressedBackground: 'palette.colors.gray.200',\n focusRing: 'semantic.colors.interactive.focus',\n disabledOpacity: '0.5',\n },\n },\n toolBubble: {\n shadow: 'palette.shadows.sm',\n },\n reasoningBubble: {\n shadow: 'palette.shadows.sm',\n },\n composer: {\n shadow: 'palette.shadows.none',\n },\n scrollbar: {\n thumb: 'semantic.colors.border',\n track: 'transparent',\n },\n markdown: {\n inlineCode: {\n background: 'palette.colors.gray.50',\n foreground: 'palette.colors.gray.900',\n },\n link: {\n // Links/Focus role: solid primary\n foreground: 'palette.colors.primary.600',\n },\n prose: {\n fontFamily: 'inherit',\n },\n codeBlock: {\n background: 'semantic.colors.container',\n borderColor: 'semantic.colors.border',\n textColor: 'inherit',\n borderRadius: 'palette.radius.md',\n },\n table: {\n headerBackground: 'semantic.colors.container',\n borderColor: 'semantic.colors.border',\n },\n hr: {\n color: 'semantic.colors.divider',\n },\n blockquote: {\n borderColor: 'palette.colors.gray.900',\n background: 'transparent',\n textColor: 'palette.colors.gray.500',\n },\n },\n collapsibleWidget: {\n container: 'palette.colors.gray.50',\n surface: 'semantic.colors.surface',\n border: 'semantic.colors.border',\n },\n voice: {\n recording: {\n indicator: 'palette.colors.error.500',\n background: 'palette.colors.error.50',\n border: 'palette.colors.error.200',\n },\n processing: {\n icon: 'palette.colors.primary.500',\n background: 'palette.colors.primary.50',\n },\n speaking: {\n icon: 'palette.colors.success.500',\n },\n },\n // Neutral surface card (components/approval-actions.ts). The primary action\n // anchors to the brand primary; deny is a neutral tinted button. Consumers who\n // themed these (or set config.approval.* color overrides) still win.\n approval: {\n requested: {\n background: 'semantic.colors.surface',\n border: 'semantic.colors.border',\n text: 'palette.colors.gray.900',\n shadow: '0 1px 2px 0 rgba(11, 11, 11, 0.06), 0 2px 8px 0 rgba(11, 11, 11, 0.04)',\n },\n approve: {\n background: 'semantic.colors.primary',\n foreground: 'semantic.colors.textInverse',\n borderRadius: 'palette.radius.md',\n padding: 'semantic.spacing.sm',\n },\n deny: {\n background: 'semantic.colors.container',\n foreground: 'semantic.colors.text',\n borderRadius: 'palette.radius.md',\n padding: 'semantic.spacing.sm',\n },\n },\n attachment: {\n image: {\n background: 'palette.colors.gray.100',\n border: 'palette.colors.gray.200',\n },\n },\n // Event-stream badge chips: 100-tone fill / dark text per family. tool/agent\n // keep their pre-token literals (#6b21a8 / #115e59), which sit at the 800\n // step of the canonical purple/teal ramps.\n eventStream: {\n badge: {\n flow: { background: 'palette.colors.success.100', foreground: 'palette.colors.success.700' },\n step: { background: 'palette.colors.primary.100', foreground: 'palette.colors.primary.700' },\n reasoning: { background: 'palette.colors.warning.100', foreground: 'palette.colors.warning.700' },\n tool: { background: 'palette.colors.purple.100', foreground: 'palette.colors.purple.800' },\n agent: { background: 'palette.colors.teal.100', foreground: 'palette.colors.teal.800' },\n error: { background: 'palette.colors.error.100', foreground: 'palette.colors.error.700' },\n default: { background: 'palette.colors.gray.100', foreground: 'palette.colors.gray.600' },\n },\n },\n scrollToBottom: {\n background: 'components.button.primary.background',\n foreground: 'components.button.primary.foreground',\n border: 'semantic.colors.primary',\n size: '40px',\n borderRadius: 'palette.radius.full',\n shadow: 'palette.shadows.sm',\n padding: '0.5rem 0.875rem',\n gap: '0.5rem',\n fontSize: '0.875rem',\n iconSize: '14px',\n },\n artifact: {\n pane: {\n background: 'semantic.colors.container',\n toolbarBackground: 'semantic.colors.container',\n },\n },\n};\n\nexport function resolveTokenValue(theme: PersonaTheme, path: string): string | undefined {\n if (\n !path.startsWith('palette.') &&\n !path.startsWith('semantic.') &&\n !path.startsWith('components.')\n ) {\n return path;\n }\n\n const parts = path.split('.');\n let current: any = theme;\n\n for (const part of parts) {\n if (current === undefined || current === null) {\n return undefined;\n }\n current = current[part];\n }\n\n if (\n typeof current === 'string' &&\n (current.startsWith('palette.') ||\n current.startsWith('semantic.') ||\n current.startsWith('components.'))\n ) {\n return resolveTokenValue(theme, current);\n }\n\n return current;\n}\n\nexport function resolveTokens(theme: PersonaTheme): Record<string, ResolvedToken> {\n const resolved: Record<string, ResolvedToken> = {};\n\n function resolveObject(obj: any, prefix: string) {\n for (const [key, value] of Object.entries(obj)) {\n const path = `${prefix}.${key}`;\n\n if (typeof value === 'string') {\n const resolvedValue = resolveTokenValue(theme, value);\n if (resolvedValue !== undefined) {\n resolved[path] = {\n path,\n value: resolvedValue,\n type:\n prefix.includes('color')\n ? 'color'\n : prefix.includes('spacing')\n ? 'spacing'\n : prefix.includes('typography')\n ? 'typography'\n : prefix.includes('shadow')\n ? 'shadow'\n : prefix.includes('border')\n ? 'border'\n : 'color',\n };\n }\n } else if (typeof value === 'object' && value !== null) {\n resolveObject(value, path);\n }\n }\n }\n\n resolveObject(theme.palette, 'palette');\n resolveObject(theme.semantic, 'semantic');\n resolveObject(theme.components, 'components');\n\n return resolved;\n}\n\nexport function validateTheme(theme: Partial<PersonaTheme>): ThemeValidationResult {\n const errors: ThemeValidationError[] = [];\n const warnings: ThemeValidationError[] = [];\n\n if (!theme.palette) {\n errors.push({\n path: 'palette',\n message: 'Theme must include a palette',\n severity: 'error',\n });\n }\n\n if (!theme.semantic) {\n warnings.push({\n path: 'semantic',\n message: 'No semantic tokens defined - defaults will be used',\n severity: 'warning',\n });\n }\n\n if (!theme.components) {\n warnings.push({\n path: 'components',\n message: 'No component tokens defined - defaults will be used',\n severity: 'warning',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nfunction mergeRecords(\n base: Record<string, unknown>,\n override: Record<string, unknown>\n): Record<string, unknown> {\n const result = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const existing = result[key];\n if (existing && typeof existing === 'object' && !Array.isArray(existing) &&\n value && typeof value === 'object' && !Array.isArray(value)) {\n result[key] = mergeRecords(\n existing as Record<string, unknown>,\n value as Record<string, unknown>\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction deepMergeComponents(\n base: ComponentTokens,\n override?: Partial<ComponentTokens>\n): ComponentTokens {\n if (!override) return base;\n return mergeRecords(\n base as unknown as Record<string, unknown>,\n override as unknown as Record<string, unknown>\n ) as unknown as ComponentTokens;\n}\n\nexport function createTheme(\n userConfig?: DeepPartial<PersonaTheme>,\n options: CreateThemeOptions = {}\n): PersonaTheme {\n const baseTheme: PersonaTheme = {\n palette: DEFAULT_PALETTE as PersonaTheme['palette'],\n semantic: DEFAULT_SEMANTIC as PersonaTheme['semantic'],\n components: DEFAULT_COMPONENTS as PersonaTheme['components'],\n };\n\n let theme: PersonaTheme = {\n palette: {\n ...baseTheme.palette,\n ...userConfig?.palette,\n colors: {\n ...baseTheme.palette.colors,\n ...userConfig?.palette?.colors,\n },\n spacing: {\n ...baseTheme.palette.spacing,\n ...userConfig?.palette?.spacing,\n },\n typography: {\n ...baseTheme.palette.typography,\n ...userConfig?.palette?.typography,\n },\n shadows: {\n ...baseTheme.palette.shadows,\n ...userConfig?.palette?.shadows,\n },\n borders: {\n ...baseTheme.palette.borders,\n ...userConfig?.palette?.borders,\n },\n radius: {\n ...baseTheme.palette.radius,\n ...userConfig?.palette?.radius,\n },\n },\n semantic: {\n ...baseTheme.semantic,\n ...userConfig?.semantic,\n colors: {\n ...baseTheme.semantic.colors,\n ...userConfig?.semantic?.colors,\n interactive: {\n ...baseTheme.semantic.colors.interactive,\n ...userConfig?.semantic?.colors?.interactive,\n },\n feedback: {\n ...baseTheme.semantic.colors.feedback,\n ...userConfig?.semantic?.colors?.feedback,\n },\n },\n spacing: {\n ...baseTheme.semantic.spacing,\n ...userConfig?.semantic?.spacing,\n },\n typography: {\n ...baseTheme.semantic.typography,\n ...userConfig?.semantic?.typography,\n },\n },\n components: deepMergeComponents(\n baseTheme.components,\n userConfig?.components as Partial<ComponentTokens> | undefined\n ),\n } as PersonaTheme;\n\n if (options.validate !== false) {\n const validation = validateTheme(theme);\n if (!validation.valid) {\n throw new Error(\n `Theme validation failed: ${validation.errors.map((e) => e.message).join(', ')}`\n );\n }\n }\n\n if (options.plugins) {\n for (const plugin of options.plugins) {\n theme = plugin.transform(theme);\n }\n }\n\n return theme;\n}\n\n/** Coerce a unitless \"0\" to \"0px\" for vars consumed inside length calc()s. */\nconst zeroLength = (value: string): string => (value.trim() === '0' ? '0px' : value);\n\nconst V = '--persona-';\n\n/**\n * WCAG relative luminance of a hex (3/4/6/8 digit) or rgb()/rgba() color.\n * Returns undefined when the value is not parseable, so callers can fall back.\n */\nconst relativeLuminance = (color: string | undefined): number | undefined => {\n if (!color) return undefined;\n const value = color.trim().toLowerCase();\n let channels: number[] | undefined;\n\n if (value.charCodeAt(0) === 35 /* '#' */) {\n const digits = value.slice(1);\n if (!/^[0-9a-f]+$/.test(digits)) return undefined;\n if (digits.length === 3 || digits.length === 4) {\n channels = [0, 1, 2].map((i) => parseInt(digits[i] + digits[i], 16));\n } else if (digits.length === 6 || digits.length === 8) {\n channels = [0, 2, 4].map((i) => parseInt(digits.slice(i, i + 2), 16));\n }\n } else {\n const match = value.match(/^rgba?\\(([^)]+)\\)$/);\n if (match) {\n const parts = match[1].split(/[,/\\s]+/).filter(Boolean);\n if (parts.length >= 3) {\n channels = parts.slice(0, 3).map((raw) => {\n const pct = raw.endsWith('%');\n const n = parseFloat(pct ? raw.slice(0, -1) : raw);\n return pct ? (n / 100) * 255 : n;\n });\n }\n }\n }\n\n if (!channels || channels.some((c) => !Number.isFinite(c))) return undefined;\n const [r, g, b] = channels.map((c) => {\n const v = Math.max(0, Math.min(255, c)) / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\n/** Below the WCAG white/black crossover luminance, white text reads better. */\nconst DARK_SURFACE_LUMINANCE = 0.179;\n\n/**\n * Each row: [aliasSuffix, ...sources]. A source starting with '=' is a\n * literal; anything else is a cssVars lookup by suffix. First defined wins;\n * rows with no defined source emit nothing. Row order is significant.\n */\ntype AliasRow = [string, ...string[]];\n\nconst emitAliases = (cssVars: Record<string, string>, rows: AliasRow[]): void => {\n for (const [alias, ...sources] of rows) {\n let value: string | undefined;\n for (const s of sources) {\n value = s.charCodeAt(0) === 61 /* '=' */ ? s.slice(1) : cssVars[V + s];\n if (value !== undefined) break;\n }\n if (value !== undefined) cssVars[V + alias] = value;\n }\n};\n\nexport function themeToCssVariables(theme: PersonaTheme): Record<string, string> {\n const resolved = resolveTokens(theme);\n const cssVars: Record<string, string> = {};\n\n for (const [path, token] of Object.entries(resolved)) {\n const varName = path.replace(/\\./g, '-');\n cssVars[`--persona-${varName}`] = token.value;\n }\n\n emitAliases(cssVars, [\n ['primary', 'semantic-colors-primary', 'palette-colors-primary-500'],\n ['secondary', 'semantic-colors-secondary', 'palette-colors-secondary-500'],\n ['accent', 'semantic-colors-accent', 'palette-colors-accent-500'],\n ['surface', 'semantic-colors-surface', 'palette-colors-gray-50'],\n ['background', 'semantic-colors-background', 'palette-colors-gray-50'],\n ['container', 'semantic-colors-container', 'palette-colors-gray-100'],\n ['text', 'semantic-colors-text', 'palette-colors-gray-900'],\n ['text-muted', 'semantic-colors-text-muted', 'palette-colors-gray-500'],\n ['text-inverse', 'semantic-colors-text-inverse', 'palette-colors-gray-50'],\n ['border', 'semantic-colors-border', 'palette-colors-gray-200'],\n ['divider', 'semantic-colors-divider', 'palette-colors-gray-200'],\n ['muted', 'text-muted'],\n ['voice-recording-indicator', 'components-voice-recording-indicator', 'palette-colors-error-500'],\n ['voice-recording-bg', 'components-voice-recording-background', 'palette-colors-error-50'],\n ['voice-processing-icon', 'components-voice-processing-icon', 'palette-colors-primary-500'],\n ['voice-speaking-icon', 'components-voice-speaking-icon', 'palette-colors-success-500'],\n ['approval-bg', 'components-approval-requested-background', 'surface'],\n ['approval-border', 'components-approval-requested-border', 'border'],\n ['approval-text', 'components-approval-requested-text', 'palette-colors-gray-900'],\n ['approval-shadow', 'components-approval-requested-shadow', '=0 1px 2px 0 rgba(11, 11, 11, 0.06), 0 2px 8px 0 rgba(11, 11, 11, 0.04)'],\n ['approval-approve-bg', 'components-approval-approve-background', 'button-primary-bg'],\n ['approval-deny-bg', 'components-approval-deny-background', 'container'],\n ['attachment-image-bg', 'components-attachment-image-background', 'palette-colors-gray-100'],\n ['attachment-image-border', 'components-attachment-image-border', 'palette-colors-gray-200'],\n ['font-family', 'semantic-typography-fontFamily', 'palette-typography-fontFamily-sans'],\n ['font-size', 'semantic-typography-fontSize', 'palette-typography-fontSize-base'],\n ['font-weight', 'semantic-typography-fontWeight', 'palette-typography-fontWeight-normal'],\n ['line-height', 'semantic-typography-lineHeight', 'palette-typography-lineHeight-normal'],\n ['input-font-family', 'font-family'],\n ['input-font-weight', 'font-weight'],\n ['radius-sm', 'palette-radius-sm', '=0.125rem'],\n ['radius-md', 'palette-radius-md', '=0.375rem'],\n ['radius-lg', 'palette-radius-lg', '=0.5rem'],\n ['radius-xl', 'palette-radius-xl', '=0.75rem'],\n ['radius-full', 'palette-radius-full', '=9999px'],\n ['launcher-radius', 'components-launcher-borderRadius', 'palette-radius-full', '=9999px'],\n ['launcher-bg', 'components-launcher-background', 'surface'],\n ['launcher-fg', 'components-launcher-foreground', 'primary'],\n ]);\n // Subtitle keeps the shared muted tone while the foreground is stock (it\n // resolves to primary); a custom foreground washes to 70% so both pill\n // text lines recolor together. Compared by resolved value, not key\n // presence: DEFAULT_COMPONENTS materializes launcher.foreground into\n // every theme.\n const launcherFg = cssVars['--persona-components-launcher-foreground'];\n cssVars['--persona-launcher-fg-muted'] =\n launcherFg && launcherFg !== cssVars['--persona-primary']\n ? `color-mix(in srgb, ${launcherFg} 70%, transparent)`\n : cssVars['--persona-muted'];\n\n emitAliases(cssVars, [\n ['launcher-border', 'components-launcher-border', 'border'],\n ['button-primary-bg', 'components-button-primary-background', 'primary'],\n ['button-primary-fg', 'components-button-primary-foreground', 'text-inverse'],\n ['button-radius', 'components-button-primary-borderRadius', 'palette-radius-full', '=9999px'],\n // Stop-state send button. No fallback source: widget.css carries the idle\n // appearance in its var() fallbacks, so an unset token must stay undefined.\n ['button-stop-bg', 'components-button-stop-background'],\n ['button-stop-fg', 'components-button-stop-foreground'],\n ]);\n\n // Ghost variant: transparent, neutral-foreground icon buttons (the composer's\n // attachment + mention affordances). Wired to `components.button.ghost.*`.\n emitAliases(cssVars, [\n ['button-ghost-bg', 'components-button-ghost-background', '=transparent'],\n ['button-ghost-fg', 'components-button-ghost-foreground', 'text'],\n ['button-ghost-radius', 'components-button-ghost-borderRadius', 'radius-md', '=0.375rem'],\n ['button-ghost-hover-bg', 'components-button-ghost-hoverBackground', '=rgba(0, 0, 0, 0.05)'],\n ['panel-radius', 'components-panel-borderRadius', 'radius-xl', '=0.75rem'],\n ]);\n\n cssVars['--persona-panel-border'] =\n cssVars['--persona-components-panel-border'] ?? `1px solid ${cssVars['--persona-border']}`;\n\n emitAliases(cssVars, [\n ['panel-shadow', 'components-panel-shadow', 'palette-shadows-xl', '=0 25px 50px -12px rgba(0, 0, 0, 0.25)'],\n ]);\n\n cssVars['--persona-panel-inset'] =\n cssVars['--persona-components-panel-inset'] ?? DEFAULT_PANEL_INSET;\n cssVars['--persona-panel-canvas-bg'] =\n cssVars['--persona-components-panel-canvasBackground'] ?? DEFAULT_PANEL_CANVAS_BACKGROUND;\n\n emitAliases(cssVars, [\n ['launcher-shadow', 'components-launcher-shadow', '=0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)'],\n ['input-radius', 'components-input-borderRadius', 'radius-lg', '=0.5rem'],\n ['message-user-radius', 'components-message-user-borderRadius', 'radius-lg', '=0.5rem'],\n ['message-assistant-radius', 'components-message-assistant-borderRadius', 'radius-lg', '=0.5rem'],\n ]);\n\n // Component-level color overrides: these map component tokens to\n // dedicated CSS variables that the widget CSS reads for individual elements.\n emitAliases(cssVars, [\n ['header-bg', 'components-header-background', 'surface'],\n ]);\n\n // The background/foreground pair anchors every other header color: unset\n // text and border keys mix the two rather than falling back to page chrome.\n const headerBg = cssVars['--persona-header-bg'];\n const headerFg = cssVars['--persona-components-header-foreground'];\n const headerMutedFg = headerFg ? `color-mix(in srgb, ${headerFg} 72%, ${headerBg})` : undefined;\n cssVars['--persona-header-border'] =\n cssVars['--persona-components-header-border'] ??\n (headerFg ? `color-mix(in srgb, ${headerFg} 14%, ${headerBg})` : undefined) ??\n cssVars['--persona-divider'];\n\n emitAliases(cssVars, [\n ['header-icon-bg', 'components-header-iconBackground', 'primary'],\n ['header-icon-fg', 'components-header-iconForeground', 'text-inverse'],\n ]);\n\n // `title.color` / `subtitle.color` supersede the legacy *Foreground tokens.\n cssVars['--persona-header-title-fg'] =\n cssVars['--persona-components-header-title-color'] ??\n cssVars['--persona-components-header-titleForeground'] ??\n headerFg ??\n cssVars['--persona-primary'];\n cssVars['--persona-header-subtitle-fg'] =\n cssVars['--persona-components-header-subtitle-color'] ??\n cssVars['--persona-components-header-subtitleForeground'] ??\n headerMutedFg ??\n cssVars['--persona-text-muted'];\n cssVars['--persona-header-action-icon-fg'] =\n cssVars['--persona-components-header-actionIconForeground'] ??\n headerMutedFg ??\n cssVars['--persona-muted'];\n\n // Unified header control box. Every header icon button reads these two from\n // the stylesheet; per-control config keys stay inline and win. The third\n // control token, `header.controlStrokeWidth`, needs no alias: widget.css\n // reads its auto-emitted `--persona-components-header-controlStrokeWidth`\n // directly and carries the 1.5 default in the var() fallback.\n emitAliases(cssVars, [\n ['header-control-size', 'components-header-controlSize', '=32px'],\n ['header-control-icon-size', 'components-header-controlIconSize', '=20px'],\n ]);\n\n const headerTokens = theme.components?.header;\n if (headerTokens?.shadow) cssVars['--persona-header-shadow'] = headerTokens.shadow;\n if (headerTokens?.borderBottom) cssVars['--persona-header-border-bottom'] = headerTokens.borderBottom;\n // Conditional: the stylesheet carries `auto` / the rail's own fallback chain,\n // so an unset token must leave the variable undefined.\n if (headerTokens?.minHeight) cssVars['--persona-header-min-height'] = headerTokens.minHeight;\n\n // Messages rail header strip. Same conditional rule: the chunk's CSS carries\n // the surface/border/height fallback chain when a theme says nothing.\n const railHeaderBg = cssVars['--persona-components-history-railHeader-background'];\n if (railHeaderBg) cssVars['--persona-history-rail-header-bg'] = railHeaderBg;\n const railHeaderBorder = cssVars['--persona-components-history-railHeader-border'];\n if (railHeaderBorder) cssVars['--persona-history-rail-header-border'] = railHeaderBorder;\n const railHeaderMinHeight = cssVars['--persona-components-history-railHeader-minHeight'];\n if (railHeaderMinHeight)\n cssVars['--persona-history-rail-header-min-height'] = railHeaderMinHeight;\n\n // Floating (overlay-collapsed) rail. Same conditional rule: the host's\n // inline styles carry every default in their var() fallback.\n for (const [token, alias] of [\n ['margin', 'margin'],\n ['borderRadius', 'radius'],\n ['shadow', 'shadow'],\n ['background', 'bg'],\n ] as const) {\n const value = cssVars[`--persona-components-history-overlay-${token}`];\n if (value) cssVars[`--persona-history-overlay-${alias}`] = value;\n }\n\n // Row overflow menu. Same conditional rule: the chunk's CSS carries the\n // elevated color-mix default in its var() fallback.\n for (const [token, alias] of [\n ['background', 'bg'],\n ['borderRadius', 'radius'],\n ] as const) {\n const value = cssVars[`--persona-components-history-menu-${token}`];\n if (value) cssVars[`--persona-history-menu-${alias}`] = value;\n }\n // Messages enter/exit motion. Read straight off the theme: durations are\n // authored as bare millisecond NUMBERS, and resolveTokens collects only\n // string leaves, so these never reach the flattened vars. A unitless value\n // gains \"ms\" for the CSS animation shorthand; 0 emits \"0ms\" (leg disabled).\n const historyMotion = theme.components?.history?.motion;\n if (historyMotion) {\n const asTime = (value: number | string | undefined): string | undefined => {\n if (value === undefined) return undefined;\n const s = String(value).trim();\n return /^\\d+(\\.\\d+)?$/.test(s) ? `${s}ms` : s;\n };\n const enterMs = asTime(historyMotion.enterDurationMs);\n if (enterMs !== undefined) cssVars['--persona-history-enter-ms'] = enterMs;\n const exitMs = asTime(historyMotion.exitDurationMs);\n if (exitMs !== undefined) cssVars['--persona-history-exit-ms'] = exitMs;\n if (historyMotion.enterEasing)\n cssVars['--persona-history-enter-easing'] = historyMotion.enterEasing;\n if (historyMotion.exitEasing)\n cssVars['--persona-history-exit-easing'] = historyMotion.exitEasing;\n }\n // Destructive action text. The chunk falls back to the light-surface\n // error-600; the built-in dark theme sets this to a passing lighter red.\n const historyDangerFg = cssVars['--persona-components-history-dangerForeground'];\n if (historyDangerFg) cssVars['--persona-history-danger-fg'] = historyDangerFg;\n // Confirmation dialog. The danger fill/label pair is always emitted so the\n // dialog follows the error palette; scrim and shadow stay conditional with\n // the dialog's inline fallbacks as the defaults.\n cssVars['--persona-danger'] =\n cssVars['--persona-components-history-confirm-dangerBackground'] ??\n cssVars['--persona-palette-colors-error-700'] ??\n '#b42318';\n cssVars['--persona-danger-fg'] =\n cssVars['--persona-components-history-confirm-dangerForeground'] ?? '#ffffff';\n for (const token of ['scrim', 'shadow'] as const) {\n const value = cssVars[`--persona-components-history-confirm-${token}`];\n if (value) cssVars[`--persona-history-confirm-${token}`] = value;\n }\n\n // Portaled control tooltip. Same conditional rule: widget.css carries the\n // built-in look in every var() fallback, so an unset token stays undefined.\n for (const [token, alias] of [\n ['background', 'background'],\n ['foreground', 'foreground'],\n ['hintForeground', 'hint-fg'],\n ['borderRadius', 'radius'],\n ['fontSize', 'font-size'],\n ['padding', 'padding'],\n ['maxWidth', 'max-width'],\n ['shadow', 'shadow'],\n ]) {\n const value = cssVars[`--persona-components-tooltip-${token}`];\n if (value) cssVars[`--persona-tooltip-${alias}`] = value;\n }\n // Booleans never resolve into a token, so the arrow reads off the theme.\n if (theme.components?.tooltip?.arrow === false)\n cssVars['--persona-tooltip-arrow-display'] = 'none';\n\n // Per-message action row (copy, vote, read aloud). Same conditional rule:\n // widget.css falls back to the scheme-aware ghost wash and semantic text, so\n // an unset token must leave the variable undefined.\n for (const [token, alias] of [\n ['background', 'bg'],\n ['border', 'border'],\n ['hoverBackground', 'hover-bg'],\n ['hoverForeground', 'hover-fg'],\n ['borderRadius', 'radius'],\n ] as const) {\n const value = cssVars[`--persona-components-messageActions-${token}`];\n if (value) cssVars[`--persona-message-action-${alias}`] = value;\n }\n\n // Intro card aliases: short names the panel inline-styles read directly.\n // The full-path `--persona-components-introCard-*` variables auto-emit above.\n // Default is flat (transparent, no shadow): the greeting renders as plain\n // text on the transcript background; set introCard tokens for a card look.\n emitAliases(cssVars, [\n ['intro-card-bg', 'components-introCard-background', '=transparent'],\n ['intro-card-radius', 'components-introCard-borderRadius', '=1rem'],\n ]);\n\n // Flat cards (transparent background, no shadow) drop the horizontal\n // component of the stock padding so the welcome text shares the content\n // column's left edge instead of carrying an invisible card inset. Compared\n // by resolved value, not key presence: DEFAULT_COMPONENTS materializes the\n // introCard tokens into every theme. A non-stock padding is emitted as-is;\n // '1.5rem 1.5rem' forces the symmetric inset on a flat card.\n const introBg = cssVars['--persona-components-introCard-background'];\n const introShadow = cssVars['--persona-components-introCard-shadow'];\n const introCardFlat =\n (!introBg || introBg === 'transparent' || introBg === 'none') &&\n (!introShadow || introShadow === 'none');\n const introPadding =\n cssVars['--persona-components-introCard-padding'] ?? '1.5rem';\n cssVars['--persona-intro-card-padding'] =\n introCardFlat && introPadding === '1.5rem' ? '1.5rem 0' : introPadding;\n\n emitAliases(cssVars, [\n ['intro-card-shadow', 'components-introCard-shadow', '=none'],\n ['intro-card-border', 'components-introCard-border', '=none'],\n ['input-background', 'components-input-background', 'surface'],\n ['input-placeholder', 'components-input-placeholder', 'text-muted'],\n ['input-backdrop-filter', 'components-input-backdropFilter', '=none'],\n ['message-user-bg', 'components-message-user-background', 'accent'],\n ['message-user-text', 'components-message-user-text', 'text-inverse'],\n ['message-user-shadow', 'components-message-user-shadow', '=0 5px 15px rgba(15, 23, 42, 0.08)'],\n ['message-assistant-bg', 'components-message-assistant-background', 'surface'],\n ['message-assistant-text', 'components-message-assistant-text', 'text'],\n ['message-assistant-border', 'components-message-assistant-border', 'border'],\n ['message-assistant-shadow', 'components-message-assistant-shadow', '=0 1px 2px 0 rgb(0 0 0 / 0.05)'],\n ['scroll-to-bottom-bg', 'components-scrollToBottom-background', 'button-primary-bg', 'accent'],\n ['scroll-to-bottom-fg', 'components-scrollToBottom-foreground', 'button-primary-fg', 'text-inverse'],\n ['scroll-to-bottom-border', 'components-scrollToBottom-border', 'primary'],\n ['scroll-to-bottom-size', 'components-scrollToBottom-size', '=40px'],\n ['scroll-to-bottom-radius', 'components-scrollToBottom-borderRadius', 'button-radius', 'radius-full', '=9999px'],\n ['scroll-to-bottom-shadow', 'components-scrollToBottom-shadow', 'palette-shadows-sm', '=0 1px 2px 0 rgb(0 0 0 / 0.05)'],\n ['scroll-to-bottom-padding', 'components-scrollToBottom-padding', '=0.5rem 0.875rem'],\n ['scroll-to-bottom-gap', 'components-scrollToBottom-gap', '=0.5rem'],\n ['scroll-to-bottom-font-size', 'components-scrollToBottom-fontSize', 'palette-typography-fontSize-sm', '=0.875rem'],\n ['scroll-to-bottom-icon-size', 'components-scrollToBottom-iconSize', '=14px'],\n // Event-stream badge chips. Materialized in every theme (light defaults in\n // DEFAULT_COMPONENTS, dark pairs in the built-in dark layer), so the\n // chip's inline var() refs always resolve inside a themed root and\n // re-resolve on scheme toggles; the literal terminals only cover unthemed\n // direct mounts.\n ['event-badge-flow-bg', 'components-eventStream-badge-flow-background', '=#dcfce7'],\n ['event-badge-flow-fg', 'components-eventStream-badge-flow-foreground', '=#15803d'],\n ['event-badge-step-bg', 'components-eventStream-badge-step-background', '=#f5f5f5'],\n ['event-badge-step-fg', 'components-eventStream-badge-step-foreground', '=#0a0a0a'],\n ['event-badge-reasoning-bg', 'components-eventStream-badge-reasoning-background', '=#fef9c3'],\n ['event-badge-reasoning-fg', 'components-eventStream-badge-reasoning-foreground', '=#a16207'],\n ['event-badge-tool-bg', 'components-eventStream-badge-tool-background', '=#f3e8ff'],\n ['event-badge-tool-fg', 'components-eventStream-badge-tool-foreground', '=#6b21a8'],\n ['event-badge-agent-bg', 'components-eventStream-badge-agent-background', '=#ccfbf1'],\n ['event-badge-agent-fg', 'components-eventStream-badge-agent-foreground', '=#115e59'],\n ['event-badge-error-bg', 'components-eventStream-badge-error-background', '=#fee2e2'],\n ['event-badge-error-fg', 'components-eventStream-badge-error-foreground', '=#b91c1c'],\n ['event-badge-default-bg', 'components-eventStream-badge-default-background', '=#f3f4f6'],\n ['event-badge-default-fg', 'components-eventStream-badge-default-foreground', '=#4b5563'],\n ['tool-bubble-shadow', 'components-toolBubble-shadow', '=0 5px 15px rgba(15, 23, 42, 0.08)'],\n ['reasoning-bubble-shadow', 'components-reasoningBubble-shadow', '=0 5px 15px rgba(15, 23, 42, 0.08)'],\n ['composer-shadow', 'components-composer-shadow', '=none'],\n ]);\n\n // Composer spacing/type. Fallbacks reproduce the utility classes the form\n // used to carry (`px-4 py-3`, `gap-2`, `text-sm`) exactly.\n emitAliases(cssVars, [\n ['composer-padding', 'components-composer-padding', '=0.75rem 1rem'],\n ['composer-gap', 'components-composer-gap', '=0.5rem'],\n ['composer-font-size', 'components-composer-fontSize', '=0.875rem'],\n ['composer-line-height', 'components-composer-lineHeight', '=1.25rem'],\n // Unified composer control box. Every icon control in the action row reads\n // these two from the stylesheet; per-control config keys stay inline and win.\n ['composer-control-size', 'components-composer-controlSize', '=40px'],\n ['composer-control-icon-size', 'components-composer-controlIconSize', '=24px'],\n // Motion: one timing pair + easing for every composer animation. A `0ms`\n // duration is a kill switch; reduced-motion is enforced in CSS on top.\n ['motion-duration-fast', 'components-motion-durationFast', '=120ms'],\n ['motion-duration-base', 'components-motion-durationBase', '=200ms'],\n ['motion-easing', 'components-motion-easing', '=cubic-bezier(0.2, 0, 0, 1)'],\n ['composer-border-color', 'components-composer-borderColor', 'border', '=#e5e7eb'],\n ['composer-overlay-band', 'components-composer-overlayBand', '=transparent'],\n // `components.composer.segmented.*`, `.modelPicker.*`, and `.overflowMenu.*`\n // get no short aliases: the rows cost gzip in the critical launcher bundle,\n // which never draws a composer. widget.css reads the auto-emitted full\n // paths, like introCard title/subtitle.\n ['scrollbar-thumb', 'components-scrollbar-thumb', 'border', '=#e5e7eb'],\n ['scrollbar-track', 'components-scrollbar-track', '=transparent'],\n ['md-inline-code-bg', 'components-markdown-inlineCode-background', 'container'],\n ['md-inline-code-color', 'components-markdown-inlineCode-foreground', 'text'],\n ['md-link-color', 'components-markdown-link-foreground', 'accent', '=#0f0f0f'],\n ]);\n\n const mdH1Size = cssVars['--persona-components-markdown-heading-h1-fontSize'];\n if (mdH1Size) cssVars['--persona-md-h1-size'] = mdH1Size;\n const mdH1Weight = cssVars['--persona-components-markdown-heading-h1-fontWeight'];\n if (mdH1Weight) cssVars['--persona-md-h1-weight'] = mdH1Weight;\n const mdH2Size = cssVars['--persona-components-markdown-heading-h2-fontSize'];\n if (mdH2Size) cssVars['--persona-md-h2-size'] = mdH2Size;\n const mdH2Weight = cssVars['--persona-components-markdown-heading-h2-fontWeight'];\n if (mdH2Weight) cssVars['--persona-md-h2-weight'] = mdH2Weight;\n\n const mdProseFont = cssVars['--persona-components-markdown-prose-fontFamily'];\n if (mdProseFont && mdProseFont !== 'inherit') {\n cssVars['--persona-md-prose-font-family'] = mdProseFont;\n }\n\n // Markdown code block\n emitAliases(cssVars, [\n ['md-code-block-bg', 'components-markdown-codeBlock-background', 'container'],\n ['md-code-block-border-color', 'components-markdown-codeBlock-borderColor', 'border'],\n ['md-code-block-text-color', 'components-markdown-codeBlock-textColor', '=inherit'],\n ]);\n\n // Follows the palette radius so square-corner themes get square code blocks;\n // the 0.375rem fallback matches palette.radius.md's default.\n emitAliases(cssVars, [\n ['md-code-block-border-radius', 'components-markdown-codeBlock-borderRadius', 'radius-md', '=0.375rem'],\n ]);\n\n // Markdown table\n emitAliases(cssVars, [\n ['md-table-header-bg', 'components-markdown-table-headerBackground', 'container'],\n ['md-table-border-color', 'components-markdown-table-borderColor', 'border'],\n ]);\n\n // Markdown HR\n emitAliases(cssVars, [\n ['md-hr-color', 'components-markdown-hr-color', 'divider'],\n ]);\n\n // Markdown blockquote\n emitAliases(cssVars, [\n ['md-blockquote-border-color', 'components-markdown-blockquote-borderColor', 'palette-colors-gray-900'],\n ['md-blockquote-bg', 'components-markdown-blockquote-background', '=transparent'],\n ['md-blockquote-text-color', 'components-markdown-blockquote-textColor', 'palette-colors-gray-500'],\n ]);\n\n // Collapsible widget chrome (tool/reasoning/approval bubbles)\n cssVars['--cw-container'] =\n cssVars['--persona-components-collapsibleWidget-container'] ?? cssVars['--persona-surface'];\n cssVars['--cw-surface'] =\n cssVars['--persona-components-collapsibleWidget-surface'] ?? cssVars['--persona-surface'];\n cssVars['--cw-border'] =\n cssVars['--persona-components-collapsibleWidget-border'] ?? cssVars['--persona-border'];\n\n emitAliases(cssVars, [\n ['message-border', 'components-message-border', 'border'],\n ]);\n\n // Bubble geometry/type per role. No fallback source: the message layout\n // preset's value is carried in the consuming var() fallback (inline on the\n // bubble for type/padding, in widget.css for the row width cap), so an unset\n // token must leave the variable undefined.\n emitAliases(cssVars, [\n ['message-user-padding', 'components-message-user-padding'],\n ['message-user-max-width', 'components-message-user-maxWidth'],\n ['message-user-font-size', 'components-message-user-fontSize'],\n ['message-user-font-family', 'components-message-user-fontFamily'],\n ['message-user-line-height', 'components-message-user-lineHeight'],\n ['message-assistant-padding', 'components-message-assistant-padding'],\n ['message-assistant-max-width', 'components-message-assistant-maxWidth'],\n ['message-assistant-font-size', 'components-message-assistant-fontSize'],\n ['message-assistant-font-family', 'components-message-assistant-fontFamily'],\n ['message-assistant-line-height', 'components-message-assistant-lineHeight'],\n ]);\n\n // Icon button tokens\n const components = theme.components;\n const iconBtn = components?.iconButton;\n if (iconBtn) {\n if (iconBtn.background) cssVars['--persona-icon-btn-bg'] = iconBtn.background;\n if (iconBtn.border) cssVars['--persona-icon-btn-border'] = iconBtn.border;\n if (iconBtn.color) cssVars['--persona-icon-btn-color'] = iconBtn.color;\n if (iconBtn.padding) cssVars['--persona-icon-btn-padding'] = iconBtn.padding;\n if (iconBtn.borderRadius) cssVars['--persona-icon-btn-radius'] = iconBtn.borderRadius;\n if (iconBtn.hoverBackground) cssVars['--persona-icon-btn-hover-bg'] = iconBtn.hoverBackground;\n if (iconBtn.hoverColor) cssVars['--persona-icon-btn-hover-color'] = iconBtn.hoverColor;\n if (iconBtn.activeBackground) cssVars['--persona-icon-btn-active-bg'] = iconBtn.activeBackground;\n if (iconBtn.activeBorder) cssVars['--persona-icon-btn-active-border'] = iconBtn.activeBorder;\n }\n\n // Label button tokens\n const labelBtn = components?.labelButton;\n if (labelBtn) {\n if (labelBtn.background) cssVars['--persona-label-btn-bg'] = labelBtn.background;\n if (labelBtn.border) cssVars['--persona-label-btn-border'] = labelBtn.border;\n if (labelBtn.color) cssVars['--persona-label-btn-color'] = labelBtn.color;\n if (labelBtn.padding) cssVars['--persona-label-btn-padding'] = labelBtn.padding;\n if (labelBtn.borderRadius) cssVars['--persona-label-btn-radius'] = labelBtn.borderRadius;\n if (labelBtn.hoverBackground) cssVars['--persona-label-btn-hover-bg'] = labelBtn.hoverBackground;\n if (labelBtn.fontSize) cssVars['--persona-label-btn-font-size'] = labelBtn.fontSize;\n if (labelBtn.gap) cssVars['--persona-label-btn-gap'] = labelBtn.gap;\n }\n\n // Toggle group tokens\n const toggleGrp = components?.toggleGroup;\n if (toggleGrp) {\n if (toggleGrp.gap) cssVars['--persona-toggle-group-gap'] = toggleGrp.gap;\n if (toggleGrp.borderRadius) cssVars['--persona-toggle-group-radius'] = toggleGrp.borderRadius;\n }\n\n // Artifact tokens\n const artifact = components?.artifact;\n if (artifact?.toolbar) {\n const t = artifact.toolbar;\n if (t.iconHoverColor) cssVars['--persona-artifact-toolbar-icon-hover-color'] = t.iconHoverColor;\n if (t.iconHoverBackground) cssVars['--persona-artifact-toolbar-icon-hover-bg'] = t.iconHoverBackground;\n if (t.iconPadding) cssVars['--persona-artifact-toolbar-icon-padding'] = t.iconPadding;\n if (t.iconBorderRadius) cssVars['--persona-artifact-toolbar-icon-radius'] = t.iconBorderRadius;\n if (t.iconBorder) cssVars['--persona-artifact-toolbar-icon-border'] = t.iconBorder;\n // A bare \"0\" is a <number> in calc(), not a <length>; gap/padding feed the\n // toggle thumb's width calc, so a unitless zero would zero out the thumb.\n if (t.toggleGroupGap) cssVars['--persona-artifact-toolbar-toggle-group-gap'] = zeroLength(t.toggleGroupGap);\n if (t.toggleBorderRadius) cssVars['--persona-artifact-toolbar-toggle-radius'] = t.toggleBorderRadius;\n if (t.toggleGroupPadding) cssVars['--persona-artifact-toolbar-toggle-group-padding'] = zeroLength(t.toggleGroupPadding);\n if (t.toggleGroupBorder) cssVars['--persona-artifact-toolbar-toggle-group-border'] = t.toggleGroupBorder;\n if (t.toggleGroupBorderRadius) cssVars['--persona-artifact-toolbar-toggle-group-radius'] = t.toggleGroupBorderRadius;\n if (t.toggleGroupBackground) cssVars['--persona-artifact-toolbar-toggle-group-bg'] = resolveTokenValue(theme, t.toggleGroupBackground) ?? t.toggleGroupBackground;\n if (t.copyBackground) cssVars['--persona-artifact-toolbar-copy-bg'] = t.copyBackground;\n if (t.copyBorder) cssVars['--persona-artifact-toolbar-copy-border'] = t.copyBorder;\n if (t.copyColor) cssVars['--persona-artifact-toolbar-copy-color'] = t.copyColor;\n // Feeds the split-button halves' inner-radius calc; must stay a <length>.\n if (t.copyBorderRadius) cssVars['--persona-artifact-toolbar-copy-radius'] = zeroLength(t.copyBorderRadius);\n if (t.copyPadding) cssVars['--persona-artifact-toolbar-copy-padding'] = t.copyPadding;\n if (t.copyMenuBackground) {\n cssVars['--persona-artifact-toolbar-copy-menu-bg'] = t.copyMenuBackground;\n cssVars['--persona-dropdown-bg'] = cssVars['--persona-dropdown-bg'] ?? t.copyMenuBackground;\n }\n if (t.copyMenuBorder) {\n cssVars['--persona-artifact-toolbar-copy-menu-border'] = t.copyMenuBorder;\n cssVars['--persona-dropdown-border'] = cssVars['--persona-dropdown-border'] ?? t.copyMenuBorder;\n }\n if (t.copyMenuShadow) {\n cssVars['--persona-artifact-toolbar-copy-menu-shadow'] = t.copyMenuShadow;\n cssVars['--persona-dropdown-shadow'] = cssVars['--persona-dropdown-shadow'] ?? t.copyMenuShadow;\n }\n if (t.copyMenuBorderRadius) {\n cssVars['--persona-artifact-toolbar-copy-menu-radius'] = t.copyMenuBorderRadius;\n cssVars['--persona-dropdown-radius'] = cssVars['--persona-dropdown-radius'] ?? t.copyMenuBorderRadius;\n }\n if (t.copyMenuItemHoverBackground) {\n cssVars['--persona-artifact-toolbar-copy-menu-item-hover-bg'] = t.copyMenuItemHoverBackground;\n cssVars['--persona-dropdown-item-hover-bg'] = cssVars['--persona-dropdown-item-hover-bg'] ?? t.copyMenuItemHoverBackground;\n }\n if (t.iconBackground) cssVars['--persona-artifact-toolbar-icon-bg'] = t.iconBackground;\n if (t.toolbarBorder) cssVars['--persona-artifact-toolbar-border'] = t.toolbarBorder;\n }\n if (artifact?.tab) {\n const t = artifact.tab;\n if (t.background) cssVars['--persona-artifact-tab-bg'] = t.background;\n if (t.activeBackground) cssVars['--persona-artifact-tab-active-bg'] = t.activeBackground;\n if (t.activeBorder) cssVars['--persona-artifact-tab-active-border'] = t.activeBorder;\n if (t.borderRadius) cssVars['--persona-artifact-tab-radius'] = t.borderRadius;\n if (t.textColor) cssVars['--persona-artifact-tab-color'] = t.textColor;\n if (t.hoverBackground) cssVars['--persona-artifact-tab-hover-bg'] = t.hoverBackground;\n if (t.listBackground) cssVars['--persona-artifact-tab-list-bg'] = t.listBackground;\n if (t.listBorderColor) cssVars['--persona-artifact-tab-list-border-color'] = t.listBorderColor;\n if (t.listPadding) cssVars['--persona-artifact-tab-list-padding'] = t.listPadding;\n }\n if (artifact?.pane) {\n const t = artifact.pane;\n if (t.toolbarBackground) {\n const toolbarBg =\n resolveTokenValue(theme, t.toolbarBackground) ?? t.toolbarBackground;\n cssVars['--persona-artifact-toolbar-bg'] = toolbarBg;\n }\n }\n if (artifact?.card) {\n const t = artifact.card;\n if (t.background) cssVars['--persona-artifact-card-bg'] = t.background;\n if (t.border) cssVars['--persona-artifact-card-border'] = t.border;\n if (t.borderRadius) cssVars['--persona-artifact-card-radius'] = t.borderRadius;\n if (t.hoverBackground) cssVars['--persona-artifact-card-hover-bg'] = t.hoverBackground;\n if (t.hoverBorderColor) cssVars['--persona-artifact-card-hover-border'] = t.hoverBorderColor;\n }\n if (artifact?.inline) {\n const t = artifact.inline;\n if (t.background) {\n cssVars['--persona-artifact-inline-bg'] =\n resolveTokenValue(theme, t.background) ?? t.background;\n }\n if (t.border) cssVars['--persona-artifact-inline-border'] = t.border;\n if (t.borderRadius) cssVars['--persona-artifact-inline-radius'] = t.borderRadius;\n if (t.chromeBackground) {\n cssVars['--persona-artifact-inline-chrome-bg'] =\n resolveTokenValue(theme, t.chromeBackground) ?? t.chromeBackground;\n }\n if (t.chromeBorder) {\n cssVars['--persona-artifact-inline-chrome-border'] =\n resolveTokenValue(theme, t.chromeBorder) ?? t.chromeBorder;\n }\n if (t.titleColor) {\n cssVars['--persona-artifact-inline-title-color'] =\n resolveTokenValue(theme, t.titleColor) ?? t.titleColor;\n }\n if (t.mutedColor) {\n cssVars['--persona-artifact-inline-muted-color'] =\n resolveTokenValue(theme, t.mutedColor) ?? t.mutedColor;\n }\n if (t.frameHeight) cssVars['--persona-artifact-inline-frame-height'] = t.frameHeight;\n }\n\n // Code (syntax-highlighted artifact source view) tokens.\n const code = components?.code;\n if (code) {\n if (code.keywordColor) cssVars['--persona-code-keyword-color'] = code.keywordColor;\n if (code.stringColor) cssVars['--persona-code-string-color'] = code.stringColor;\n if (code.commentColor) cssVars['--persona-code-comment-color'] = code.commentColor;\n if (code.numberColor) cssVars['--persona-code-number-color'] = code.numberColor;\n if (code.tagColor) cssVars['--persona-code-tag-color'] = code.tagColor;\n if (code.attrColor) cssVars['--persona-code-attr-color'] = code.attrColor;\n if (code.propertyColor) cssVars['--persona-code-property-color'] = code.propertyColor;\n if (code.lineNumberColor) cssVars['--persona-code-line-number-color'] = code.lineNumberColor;\n if (code.gutterBorderColor) cssVars['--persona-code-gutter-border-color'] = code.gutterBorderColor;\n if (code.background)\n cssVars['--persona-code-bg'] = resolveTokenValue(theme, code.background) ?? code.background;\n }\n\n // Interactive-state defaults. The default preset resolves container === surface,\n // which turns every hover/active rule that falls back to --persona-container\n // into a visual no-op; anchor those states one gray step down in that case.\n // A flat DARK surface takes white-alpha washes instead: light grays paint a\n // near-white pill under light text. Unparseable surfaces keep the grays.\n // Component config emitted above must keep winning, so only fill vars not set.\n const stateSurface = cssVars['--persona-surface'];\n const stateContainer = cssVars['--persona-container'];\n const gray100 = cssVars['--persona-palette-colors-gray-100'] ?? '#f3f4f6';\n const gray200 = cssVars['--persona-palette-colors-gray-200'] ?? '#e5e7eb';\n const gray300 = cssVars['--persona-palette-colors-gray-300'] ?? '#d1d5db';\n const flatTheme = !stateContainer || stateContainer === stateSurface;\n const flatLuminance = relativeLuminance(stateSurface ?? cssVars['--persona-background']);\n const flatDark = flatTheme && flatLuminance !== undefined && flatLuminance < DARK_SURFACE_LUMINANCE;\n const flatHoverBg = flatDark ? 'rgba(255, 255, 255, 0.08)' : gray100;\n const flatActiveBg = flatDark ? 'rgba(255, 255, 255, 0.12)' : gray200;\n const flatActiveBorder = flatDark ? 'rgba(255, 255, 255, 0.16)' : gray300;\n const hoverBgDefault = flatTheme ? flatHoverBg : stateContainer;\n const activeBgDefault = flatTheme ? flatActiveBg : stateContainer;\n cssVars['--persona-icon-btn-hover-bg'] = cssVars['--persona-icon-btn-hover-bg'] ?? hoverBgDefault;\n cssVars['--persona-icon-btn-active-bg'] = cssVars['--persona-icon-btn-active-bg'] ?? activeBgDefault;\n if (flatTheme) {\n cssVars['--persona-icon-btn-active-border'] =\n cssVars['--persona-icon-btn-active-border'] ?? flatActiveBorder;\n }\n cssVars['--persona-label-btn-hover-bg'] = cssVars['--persona-label-btn-hover-bg'] ?? hoverBgDefault;\n cssVars['--persona-artifact-tab-hover-bg'] =\n cssVars['--persona-artifact-tab-hover-bg'] ?? hoverBgDefault;\n cssVars['--persona-artifact-card-hover-bg'] =\n cssVars['--persona-artifact-card-hover-bg'] ?? hoverBgDefault;\n\n return cssVars;\n}\n\nexport function applyThemeVariables(element: HTMLElement, theme: PersonaTheme): void {\n const cssVars = themeToCssVariables(theme);\n\n for (const [name, value] of Object.entries(cssVars)) {\n element.style.setProperty(name, value);\n }\n}\n\n/**\n * Stable `data-persona-theme-zone` values applied to key widget regions.\n * Visual editors should use `[data-persona-theme-zone=\"header\"]` selectors\n * rather than internal class names.\n */\nexport const THEME_ZONES = {\n header: 'Widget header bar',\n messages: 'Message list area',\n 'user-message': 'User message bubble',\n 'assistant-message': 'Assistant message bubble',\n composer: 'Footer / composer area',\n container: 'Main widget container',\n 'artifact-pane': 'Artifact sidebar',\n 'artifact-toolbar': 'Artifact toolbar',\n 'artifact-inline': 'Inline artifact block',\n 'artifact-inline-chrome': 'Inline artifact title bar',\n} as const;\n\nexport type ThemeZone = keyof typeof THEME_ZONES;\n","import type { DeepPartial, PersonaTheme } from '../types/theme';\nimport type { AgentWidgetConfig } from '../types';\nimport { createTheme, resolveTokens, themeToCssVariables } from './tokens';\nimport { deepMerge } from './deep-merge';\n\nexport type ColorScheme = 'light' | 'dark' | 'auto';\n\nexport interface PersonaWidgetConfig {\n theme?: DeepPartial<PersonaTheme>;\n darkTheme?: DeepPartial<PersonaTheme>;\n colorScheme?: ColorScheme;\n}\n\ntype WidgetConfig = PersonaWidgetConfig | AgentWidgetConfig;\n\nconst DARK_PALETTE = {\n colors: {\n primary: {\n 50: '#ffffff',\n 100: '#f5f5f5',\n 200: '#d4d4d4',\n 300: '#a3a3a3',\n 400: '#737373',\n 500: '#171717',\n 600: '#0f0f0f',\n 700: '#0a0a0a',\n 800: '#050505',\n 900: '#030303',\n 950: '#000000',\n },\n secondary: {\n 50: '#f5f3ff',\n 100: '#ede9fe',\n 200: '#ddd6fe',\n 300: '#c4b5fd',\n 400: '#a78bfa',\n 500: '#8b5cf6',\n 600: '#7c3aed',\n 700: '#6d28d9',\n 800: '#5b21b6',\n 900: '#4c1d95',\n 950: '#2e1065',\n },\n accent: {\n 50: '#ecfeff',\n 100: '#cffafe',\n 200: '#a5f3fc',\n 300: '#67e8f9',\n 400: '#22d3ee',\n 500: '#06b6d4',\n 600: '#0891b2',\n 700: '#0e7490',\n 800: '#155e75',\n 900: '#164e63',\n 950: '#083344',\n },\n gray: {\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n success: {\n 50: '#f0fdf4',\n 100: '#dcfce7',\n 200: '#bbf7d0',\n 300: '#86efac',\n 400: '#4ade80',\n 500: '#22c55e',\n 600: '#16a34a',\n 700: '#15803d',\n 800: '#166534',\n 900: '#14532d',\n },\n warning: {\n 50: '#fefce8',\n 100: '#fef9c3',\n 200: '#fef08a',\n 300: '#fde047',\n 400: '#facc15',\n 500: '#eab308',\n 600: '#ca8a04',\n 700: '#a16207',\n 800: '#854d0e',\n 900: '#713f12',\n },\n error: {\n 50: '#fef2f2',\n 100: '#fee2e2',\n 200: '#fecaca',\n 300: '#fca5a5',\n 400: '#f87171',\n 500: '#ef4444',\n 600: '#dc2626',\n 700: '#b91c1c',\n 800: '#991b1b',\n 900: '#7f1d1d',\n },\n },\n};\n\n/**\n * Component defaults that only hold in a dark color scheme. Layered UNDER the\n * host's theme, so any explicit value still wins.\n *\n * The ghost hover wash must invert with the scheme: 5% black is invisible on a\n * near-black surface, so every dark scheme gets a light alpha instead.\n */\nconst DARK_COMPONENTS: DeepPartial<PersonaTheme> = {\n components: {\n button: {\n ghost: {\n hoverBackground: 'rgba(255, 255, 255, 0.08)',\n },\n },\n markdown: {\n link: {\n // primary.600 is #0f0f0f in both palettes; on a charcoal bubble that\n // fails AA. primary.300 (#a3a3a3) is ~5.8:1 on gray.800 and still\n // distinct from body text (gray.100).\n foreground: 'palette.colors.primary.300',\n },\n },\n // Event-stream badge chips flip to a 900-tone fill with a 300-tone text\n // (primary is the inverted dark ramp, so 800/200 lands the same way).\n // The light defaults are 100-tone fills that read as glowing swatches on\n // a dark panel; every pair here keeps >=4.5:1 text contrast (locked by\n // event-stream-badge-theming.test.ts).\n eventStream: {\n badge: {\n flow: { background: 'palette.colors.success.900', foreground: 'palette.colors.success.300' },\n step: { background: 'palette.colors.primary.800', foreground: 'palette.colors.primary.200' },\n reasoning: { background: 'palette.colors.warning.900', foreground: 'palette.colors.warning.300' },\n tool: { background: 'palette.colors.purple.900', foreground: 'palette.colors.purple.300' },\n agent: { background: 'palette.colors.teal.900', foreground: 'palette.colors.teal.300' },\n error: { background: 'palette.colors.error.900', foreground: 'palette.colors.error.300' },\n default: { background: 'palette.colors.gray.800', foreground: 'palette.colors.gray.300' },\n },\n },\n history: {\n // error-400: the light-surface error-600 red lands ~3:1 on dark\n // surfaces, under the 4.5:1 AA floor for the 14px destructive labels.\n dangerForeground: '#f87171',\n confirm: {\n // error-600: bright enough to read as a control against a dark\n // surface (3:1 non-text) while the white label keeps 4.8:1.\n dangerBackground: 'palette.colors.error.600',\n // 45% slate darkens near-black surfaces by almost nothing; dark\n // schemes need a heavier dimmer for the modal to read as modal.\n scrim: 'rgba(0, 0, 0, 0.6)',\n },\n },\n },\n};\n\n/**\n * Normalize theme config for merging; rejects non-objects.\n */\nconst normalizeThemeConfig = (\n theme: DeepPartial<PersonaTheme> | Record<string, unknown> | undefined\n): DeepPartial<PersonaTheme> | undefined => {\n if (!theme || typeof theme !== 'object' || Array.isArray(theme)) return undefined;\n return theme as DeepPartial<PersonaTheme>;\n};\n\nexport const detectColorScheme = (): 'light' | 'dark' => {\n if (typeof document !== 'undefined' && document.documentElement.classList.contains('dark')) {\n return 'dark';\n }\n\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n\n return 'light';\n};\n\nconst getColorSchemeFromConfig = (config?: WidgetConfig): 'light' | 'dark' => {\n const colorScheme = config?.colorScheme ?? 'light';\n\n if (colorScheme === 'light') return 'light';\n if (colorScheme === 'dark') return 'dark';\n\n return detectColorScheme();\n};\n\nexport const getColorScheme = (config?: WidgetConfig): 'light' | 'dark' => {\n return getColorSchemeFromConfig(config);\n};\n\nexport const createLightTheme = (userConfig?: DeepPartial<PersonaTheme>): PersonaTheme => {\n return createTheme(userConfig);\n};\n\nexport const createDarkTheme = (userConfig?: DeepPartial<PersonaTheme>): PersonaTheme => {\n // createTheme() already merges every palette sub-object (radius, typography,\n // shadows, …) over the defaults, so only the dark color scales need to be\n // layered UNDER the user's colors here. Spreading a pre-built default\n // palette instead would clobber the user's non-color palette overrides\n // (radius/typography) in dark mode while light mode honored them.\n //\n // DARK_COMPONENTS goes underneath by deep merge, not spread: a shallow\n // spread of `components` would drop the dark ghost hover the moment a host\n // set any unrelated component token.\n const config = (deepMerge(\n DARK_COMPONENTS as Record<string, unknown>,\n (userConfig ?? {}) as Record<string, unknown>\n ) ?? {}) as DeepPartial<PersonaTheme>;\n\n return createTheme(\n {\n ...config,\n palette: {\n ...config.palette,\n colors: {\n ...DARK_PALETTE.colors,\n ...config.palette?.colors,\n },\n },\n },\n { validate: false }\n );\n};\n\nexport const getActiveTheme = (config?: WidgetConfig): PersonaTheme => {\n const scheme = getColorScheme(config);\n const lightThemeConfig = normalizeThemeConfig(config?.theme);\n const darkThemeConfig = normalizeThemeConfig(config?.darkTheme);\n\n if (scheme === 'dark') {\n return createDarkTheme(\n deepMerge(\n (lightThemeConfig ?? {}) as Record<string, unknown>,\n (darkThemeConfig ?? {}) as Record<string, unknown>\n ) as DeepPartial<PersonaTheme>\n );\n }\n\n return createLightTheme(lightThemeConfig);\n};\n\nexport const getCssVariables = (theme: PersonaTheme): Record<string, string> => {\n return themeToCssVariables(theme);\n};\n\nexport const applyThemeVariables = (\n element: HTMLElement,\n config?: WidgetConfig\n): void => {\n const theme = getActiveTheme(config);\n const cssVars = getCssVariables(theme);\n\n for (const [name, value] of Object.entries(cssVars)) {\n element.style.setProperty(name, value);\n }\n\n // Stamp the resolved scheme so stylesheet rules can key scheme-specific\n // defaults (e.g. the syntax-highlight palette) off the widget's own color\n // scheme instead of the OS prefers-color-scheme, which diverges whenever a\n // host pins colorScheme. Re-applied on every theme application, so live\n // config updates and theme-observer callbacks keep it current.\n element.setAttribute(\"data-persona-color-scheme\", getColorScheme(config));\n};\n\nexport const createThemeObserver = (\n callback: (scheme: 'light' | 'dark') => void\n): (() => void) => {\n const cleanupFns: Array<() => void> = [];\n\n if (typeof document !== 'undefined' && typeof MutationObserver !== 'undefined') {\n const observer = new MutationObserver(() => {\n callback(detectColorScheme());\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n cleanupFns.push(() => observer.disconnect());\n }\n\n if (typeof window !== 'undefined' && window.matchMedia) {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => callback(detectColorScheme());\n\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange);\n cleanupFns.push(() => mediaQuery.removeEventListener('change', handleChange));\n } else if (mediaQuery.addListener) {\n mediaQuery.addListener(handleChange);\n cleanupFns.push(() => mediaQuery.removeListener(handleChange));\n }\n }\n\n return () => {\n cleanupFns.forEach((fn) => fn());\n };\n};\n\nexport { createTheme, resolveTokens, themeToCssVariables };\n"],"mappings":"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GACb,mBAAoBC,GACpB,YAAaC,GACb,aAAcC,GACd,OAAUC,GACV,gBAAiBC,EACjB,IAAOC,GACP,UAAaC,GACb,MAASC,GACT,aAAcC,GACd,OAAUC,GACV,KAAQC,GACR,eAAgBC,GAChB,eAAgBC,GAChB,WAAYC,EACZ,OAAUC,GACV,cAAeC,GACf,YAAaC,GACb,OAAUC,GACV,WAAYC,GACZ,EAAKC,GACL,UAAWC,GACX,aAAcC,GACd,cAAeC,GACf,gBAAiBC,GACjB,SAAYC,EACZ,oBAAqBC,EACrB,KAAQC,GACR,aAAcC,EACd,KAAQC,GACR,MAASC,GACT,OAAUC,GACV,MAASC,GACT,UAAWC,GACX,SAAYC,GACZ,SAAYC,GACZ,SAAYC,GACZ,iBAAkBC,GAClB,KAAQC,GACR,IAAOC,GACP,QAAWC,EACb,EASaC,GAAmB,CAC9B,OACA,OACA,QACA,WACA,QACA,WACA,UACA,OACA,MACA,cACA,OACA,QACA,OACA,eACA,WACA,iBACA,OACA,MACA,SACA,QACA,WACA,OACA,QACA,SACA,WACA,YACA,gBACA,eACA,UACA,QACA,MACA,OACA,UACA,SACA,QACA,cACA,UACA,OACA,QACA,WACA,SACA,QACA,OACA,aACA,iBACA,OACA,QACA,UACA,WACA,gBACA,QACA,SACA,cACA,QACA,eACA,WACA,MACA,MACA,OACA,OACA,YACA,UACA,YACF,EAYMC,EAAe,IAAI,IACvB,OAAO,QAAQ1D,EAAiB,CAClC,EAcM2D,EAAe,IAAI,IAErBC,GAAmB,GACjBC,GAAwB,IAAI,IAU5BC,GAAyBC,GAAyB,CACtD,IAAMC,EAAO,CAAC,GAAGH,EAAqB,EAClCE,GAAOF,GAAsB,MAAM,EACvC,QAAWI,KAAMD,EACf,GAAI,CACFC,EAAG,CACL,MAAQ,CAER,CAEJ,EAkBA,IAAMC,GAAmB,IAAc,CACrC,IAAIC,EAAS,EACb,QAAWC,IAAW,CAAC,GAAGC,CAAY,EAAG,CACvC,IAAMC,EAAOC,EAAa,IAAIH,EAAQ,IAAI,EAC1C,GAAI,CAACE,EAAM,SACXD,EAAa,OAAOD,CAAO,EAC3BD,I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","names":["launcher_global_exports","__export","CRITICAL_LAUNCHER_ATTR","mount","createElement","tag","className","element","createNode","tag","options","children","element","name","value","style","source","property","appendable","child","cx","parts","positionMap","isDockedMountMode","config","renderIconNode","iconData","size","color","strokeWidth","svg","elementData","tagName","attrs","element","key","value","createChunkLoader","options","fallbackImport","resetOnSetLoader","loader","moduleCache","loadPromise","l","mod","err","setLoader","load","createChunkLoader","setIconsExtraLoader","loadIconsExtra","Activity","ArrowDown","ArrowLeft","ArrowRight","ArrowUpRight","ArrowUp","AtSign","Bot","Check","ChevronDown","ChevronLeft","ChevronRight","ChevronUp","ClipboardCopy","Clipboard","CodeXml","Copy","Download","EllipsisVertical","Ellipsis","ExternalLink","Eye","FileCode","FileSpreadsheet","FileText","File","History","ImagePlus","LoaderCircle","Loader","Maximize","Menu","MessageSquare","Mic","Minimize","Minus","PanelLeft","Paperclip","Pencil","Plus","Quote","RefreshCw","Search","Send","ShieldAlert","ShieldCheck","ShieldX","Square","Star","ThumbsDown","ThumbsUp","Trash2","Trash","Upload","Volume2","X","CORE_LUCIDE_ICONS","Activity","ArrowDown","ArrowUp","ArrowUpRight","Bot","ChevronDown","ChevronUp","ChevronRight","ChevronLeft","Check","Clipboard","ClipboardCopy","CodeXml","Copy","File","FileCode","FileSpreadsheet","FileText","ImagePlus","Loader","LoaderCircle","Mic","Paperclip","Quote","RefreshCw","Search","Send","ShieldAlert","ShieldCheck","ShieldX","Square","ThumbsDown","ThumbsUp","Upload","Volume2","X","AtSign","ArrowLeft","ArrowRight","ExternalLink","Ellipsis","EllipsisVertical","Menu","PanelLeft","Plus","Minus","Pencil","Trash","Trash2","Download","Maximize","Minimize","MessageSquare","Star","Eye","History","EXTRA_ICON_NAMES","runtimeIcons","pendingIcons","extraIconsLoaded","extraReadySubscribers","notifyExtraIconsReady","final","subs","cb","fillPendingIcons","filled","pending","pendingIcons","data","runtimeIcons","real","renderIconNode","extraIconsKickFailedRetry","kickExtraIcons","loadIconsExtra","mod","extraIconsLoaded","name","data","runtimeIcons","fillPendingIcons","notifyExtraIconsReady","err","createPlaceholderSvg","size","color","strokeWidth","svg","renderLucideIcon","iconName","iconData","renderIconNode","EXTRA_ICON_NAMES","el","pendingIcons","oldest","DEFAULT_OVERLAY_Z_INDEX","PORTALED_OVERLAY_Z_INDEX","createLauncherButton","config","onToggle","button","createElement","update","newConfig","launcher","dockedMode","isDockedMountMode","titleEl","t","subtitleEl","s","textContainer","icon","iconSize","iconSizeNum","iconSvg","renderLucideIcon","img","callToActionIconEl","callToActionIconSize","paddingTotal","containerSize","positionClass","positionMap","floatingBase","dockedBase","DEFAULT_OVERLAY_Z_INDEX","defaultBorder","defaultShadow","destroy","TEASER_KEY_SUFFIX","teaserMemoryDismissed","teaserStorageKey","persist","readTeaserDismissed","key","useStorage","writeTeaserDismissed","prefersReducedMotion","resolveTeaserConfig","teaser","createLauncherSurface","wrapper","currentConfig","teaserConfig","teaserElement","dismissButton","teaserTextButton","timer","visible","shown","consumed","panelOpen","usesStorage","clearTimer","hideBubble","dismiss","consumeForOpen","origin","show","schedule","handleTeaserClick","handleDismissClick","event","removeTeaserElement","buildTeaserElement","createNode","applyPlacement","position","cx","syncTeaser","nextConfig","next","setPanelOpen","open","isObject","value","deepMerge","base","override","merged","key","existing","DEFAULT_FLOATING_LAUNCHER_WIDTH","DEFAULT_FLOATING_LAUNCHER_MAX_WIDTH","DEFAULT_LAUNCHER_CONFIG","DEFAULT_FLOATING_LAUNCHER_WIDTH","DEFAULT_PANEL_INSET","DEFAULT_PANEL_CANVAS_BACKGROUND","spacing","s","k","DEFAULT_PALETTE","DEFAULT_SEMANTIC","DEFAULT_COMPONENTS","DEFAULT_FLOATING_LAUNCHER_WIDTH","DEFAULT_FLOATING_LAUNCHER_MAX_WIDTH","resolveTokenValue","theme","path","parts","current","part","resolveTokens","resolved","resolveObject","obj","prefix","key","value","resolvedValue","validateTheme","errors","warnings","mergeRecords","base","override","result","existing","deepMergeComponents","createTheme","userConfig","options","baseTheme","validation","e","plugin","zeroLength","V","relativeLuminance","color","channels","digits","i","match","raw","pct","n","c","r","g","b","v","DARK_SURFACE_LUMINANCE","emitAliases","cssVars","rows","alias","sources","themeToCssVariables","token","varName","launcherFg","headerBg","headerFg","headerMutedFg","headerTokens","railHeaderBg","railHeaderBorder","railHeaderMinHeight","historyMotion","asTime","enterMs","exitMs","historyDangerFg","introBg","introShadow","introCardFlat","introPadding","mdH1Size","mdH1Weight","mdH2Size","mdH2Weight","mdProseFont","components","iconBtn","labelBtn","toggleGrp","artifact","t","toolbarBg","code","stateSurface","stateContainer","gray100","gray200","gray300","flatTheme","flatLuminance","flatDark","flatHoverBg","flatActiveBg","flatActiveBorder","hoverBgDefault","activeBgDefault","DARK_PALETTE","DARK_COMPONENTS","normalizeThemeConfig","theme","detectColorScheme","getColorSchemeFromConfig","config","colorScheme","getColorScheme","createLightTheme","userConfig","createTheme","createDarkTheme","deepMerge","getActiveTheme","scheme","lightThemeConfig","darkThemeConfig","getCssVariables","themeToCssVariables","applyThemeVariables","element","cssVars","name","value","launcherScriptSrc","setIconsExtraLoader","chunkUrl","CRITICAL_LAUNCHER_ATTR","resolveTarget","target","el","mergeCriticalLauncherConfig","config","DEFAULT_LAUNCHER_CONFIG","mount","options","onOpen","root","applyThemeVariables","surface","createLauncherSurface","next","merged"]}
1
+ {"version":3,"sources":["../src/launcher-global.ts","../src/utils/dom.ts","../src/utils/positioning.ts","../src/utils/dock.ts","../src/utils/icon-node.ts","../src/utils/chunk-loader.ts","../src/icons-extra-loader.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/activity.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/arrow-down.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/arrow-left.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/arrow-right.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/arrow-up-right.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/arrow-up.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/at-sign.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/bot.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/check.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/chevron-down.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/chevron-left.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/chevron-right.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/chevron-up.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/clipboard-copy.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/clipboard.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/code-xml.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/copy.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/download.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/ellipsis-vertical.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/ellipsis.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/external-link.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/eye.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/file-code.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/file-spreadsheet.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/file-text.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/file.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/history.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/image-plus.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/loader-circle.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/loader.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/maximize.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/menu.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/message-square.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/mic.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/minimize.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/minus.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/panel-left.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/paperclip.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/pencil.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/plus.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/quote.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/refresh-cw.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/search.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/send.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/shield-alert.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/shield-check.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/shield-x.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/square.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/star.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/thumbs-down.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/thumbs-up.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/trash-2.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/trash.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/upload.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/volume-2.ts","../../../node_modules/.pnpm/lucide@1.18.0/node_modules/lucide/src/icons/x.ts","../src/utils/icons.ts","../src/utils/constants.ts","../src/components/launcher.ts","../src/utils/deep-merge.ts","../src/defaults.ts","../src/utils/tokens.ts","../src/utils/theme.ts"],"sourcesContent":["/**\n * Critical-path launcher entry: built to `launcher.global.js` (IIFE).\n *\n * Ships ONLY the real collapsed launcher surface (`createLauncherSurface`,\n * which carries the optional launcher teaser) plus the\n * theme application path, so the launcher paints pixel-identically to the full\n * widget from a tiny bundle. The heavy conversation panel is deferred until\n * first open by the installer (Phase 2).\n *\n * Icons: the CORE tier of the registry ships in this bundle, which covers the\n * launcher defaults (`bot`, `arrow-up-right`) and every widget-emitted name,\n * so default-config launchers paint with no flash. A site that configures an\n * EXTRA-tier icon (`launcher.agentIconName: \"shopping-cart\"`) paints a\n * correctly-sized empty placeholder and fills within one round-trip of the\n * `icons-extra.js` sibling chunk (loader registered below). See the\n * \"Deferred Launcher Loading\" pattern in AGENTS.md.\n *\n * Public global (via tsup `--global-name AgentWidgetLauncher`):\n *\n * window.AgentWidgetLauncher.mount({ target, config, onOpen })\n * → { root, element, update, destroy }\n */\nimport { createLauncherSurface } from \"./components/launcher\";\nimport { applyThemeVariables } from \"./utils/theme\";\nimport { DEFAULT_LAUNCHER_CONFIG } from \"./defaults\";\nimport { setIconsExtraLoader } from \"./icons-extra-loader\";\nimport type { AgentWidgetConfig } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Deferred extra-icons loading (same sibling-URL scheme as index-global.ts,\n// derived from THIS script's src). Registered at module evaluation:\n// `document.currentScript` is null once execution leaves the initial run.\n// ---------------------------------------------------------------------------\nconst launcherScriptSrc: string | null =\n typeof document !== \"undefined\"\n ? ((document.currentScript as HTMLScriptElement | null)?.src ?? null)\n : null;\n\nsetIconsExtraLoader(() => {\n const chunkUrl = launcherScriptSrc?.replace(\n /launcher\\.global\\.js($|\\?)/,\n \"icons-extra.js$1\",\n );\n if (!chunkUrl || chunkUrl === launcherScriptSrc) {\n return Promise.reject(\n new Error(\n \"Could not derive the icons-extra.js URL from the launcher script URL \" +\n `(${launcherScriptSrc ?? \"unavailable\"}). Self-hosted deployments that ` +\n \"rename launcher.global.js should host icons-extra.js alongside it.\",\n ),\n );\n }\n return import(/* @vite-ignore */ chunkUrl);\n});\n\nexport interface AgentWidgetLauncherMountOptions {\n /** Where to mount. Defaults to `document.body` (the floating launcher is `position: fixed`). */\n target?: string | HTMLElement;\n /** The same widget config the full widget will receive: drives theme, icons, position, copy. */\n config?: AgentWidgetConfig;\n /** Called when the launcher is clicked; the installer loads the full widget and opens the panel. */\n onOpen: () => void;\n}\n\nexport interface AgentWidgetLauncherHandle {\n /** The `[data-persona-root]` wrapper that carries the theme CSS variables. */\n root: HTMLElement;\n /** The launcher button element itself. */\n element: HTMLButtonElement;\n /** Re-apply theme + re-render the launcher with new config. */\n update: (config: AgentWidgetConfig) => void;\n /** Remove the critical launcher (called at handoff once the full widget is mounted). */\n destroy: () => void;\n}\n\n/**\n * Marks the critical launcher's wrapper so the installer can find/remove it at\n * handoff without disturbing the full widget's own `[data-persona-root]`.\n */\nexport const CRITICAL_LAUNCHER_ATTR = \"data-persona-launcher-critical\";\n\nconst resolveTarget = (target?: string | HTMLElement): HTMLElement => {\n if (target instanceof HTMLElement) return target;\n if (typeof target === \"string\") {\n const el = document.querySelector<HTMLElement>(target);\n if (el) return el;\n }\n return document.body;\n};\n\nconst mergeCriticalLauncherConfig = (\n config?: AgentWidgetConfig\n): AgentWidgetConfig => ({\n ...config,\n launcher: {\n ...DEFAULT_LAUNCHER_CONFIG,\n ...config?.launcher,\n dock: {\n ...DEFAULT_LAUNCHER_CONFIG.dock,\n ...config?.launcher?.dock,\n },\n },\n});\n\n/**\n * Mount the real collapsed launcher from the critical bundle.\n *\n * Mirrors the full widget's DOM exactly (`runtime/init.ts` + `ui.ts`): a\n * `[data-persona-root]` wrapper carries the theme CSS variables and the launcher\n * button is its child. Keeping the theme vars on the wrapper (not the button)\n * leaves the button's own inline style matching the full widget's, so\n * the eventual mount-then-remove handoff is invisible.\n */\nexport const mount = (\n options: AgentWidgetLauncherMountOptions\n): AgentWidgetLauncherHandle => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\n \"AgentWidgetLauncher can only be mounted in a browser environment\"\n );\n }\n\n const { onOpen } = options;\n const target = resolveTarget(options.target);\n\n // Render from the same launcher defaults the full widget uses without pulling\n // the full widget default object into the critical bundle.\n const config = mergeCriticalLauncherConfig(options.config);\n\n const root = document.createElement(\"div\");\n root.setAttribute(\"data-persona-root\", \"true\");\n root.setAttribute(CRITICAL_LAUNCHER_ATTR, \"true\");\n applyThemeVariables(root, config);\n\n const surface = createLauncherSurface(config, onOpen);\n root.appendChild(surface.element);\n target.appendChild(root);\n\n return {\n root,\n element: surface.launcher.element,\n update: (next: AgentWidgetConfig) => {\n const merged = mergeCriticalLauncherConfig(next);\n applyThemeVariables(root, merged);\n surface.update(merged);\n },\n // Handoff destroys the whole surface, so a pending teaser timer cannot\n // outlive the critical launcher.\n destroy: () => {\n surface.destroy();\n root.remove();\n },\n };\n};\n\n// Note: the `window.AgentWidgetLauncher` global is created by tsup's\n// `--global-name AgentWidgetLauncher` at build time. The installer\n// (`install.ts`) declares the `Window` augmentation it needs; this entry never\n// reads the global, so re-declaring it here would only create a cross-file type\n// conflict.\n","/**\n * DOM utility functions\n */\nexport const createElement = <K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string\n): HTMLElementTagNameMap[K] => {\n const element = document.createElement(tag);\n if (className) {\n element.className = className;\n }\n return element;\n};\n\nexport const createElementInDocument = <K extends keyof HTMLElementTagNameMap>(\n documentRef: Document,\n tag: K,\n className?: string\n): HTMLElementTagNameMap[K] => {\n const element = documentRef.createElement(tag);\n if (className) {\n element.className = className;\n }\n return element;\n};\n\nexport const createFragment = (): DocumentFragment => {\n return document.createDocumentFragment();\n};\n\nexport interface CreateNodeOptions {\n /** Sets `element.className`. */\n className?: string;\n /** Sets `element.textContent` before any `children` are appended. */\n text?: string;\n /** Attribute name → value pairs applied via `setAttribute`. */\n attrs?: Record<string, string>;\n /**\n * Inline styles. Nullish (`undefined`/`null`) values are skipped so callers\n * can inline conditionals (e.g. `borderColor: cfg.borderColor`) without an\n * `if` per property. Note this only *sets* values, it never clears them, so\n * prefer it for constructing fresh elements rather than re-styling live ones.\n */\n style?: Partial<CSSStyleDeclaration>;\n}\n\n/**\n * Ergonomic element factory that bundles the className + attribute + style +\n * children boilerplate the widget's DOM builders otherwise repeat by hand.\n *\n * `createElement` stays the right tool for the simple `(tag, className)` case;\n * reach for `createNode` when a node also needs attributes, inline styles, or\n * up-front children. Nullish `children` are skipped so callers can inline\n * conditionals (e.g. `maybeIcon && el`).\n */\nexport const createNode = <K extends keyof HTMLElementTagNameMap>(\n tag: K,\n options: CreateNodeOptions = {},\n ...children: Array<Node | string | null | undefined>\n): HTMLElementTagNameMap[K] => {\n const element = document.createElement(tag);\n\n if (options.className) {\n element.className = options.className;\n }\n if (options.text !== undefined) {\n element.textContent = options.text;\n }\n if (options.attrs) {\n for (const [name, value] of Object.entries(options.attrs)) {\n element.setAttribute(name, value);\n }\n }\n if (options.style) {\n const style = element.style as unknown as Record<string, string>;\n const source = options.style as Record<string, string | null | undefined>;\n for (const property of Object.keys(source)) {\n const value = source[property];\n if (value != null) {\n style[property] = value;\n }\n }\n }\n\n const appendable = children.filter(\n (child): child is Node | string => child != null\n );\n if (appendable.length > 0) {\n element.append(...appendable);\n }\n\n return element;\n};\n\n/**\n * Join truthy class-name fragments into a single space-separated string\n * (the clsx / classnames pattern). Falsy fragments\n * (`false` / `null` / `undefined` / `\"\"`) are dropped, so conditional classes\n * read inline as `cond && \"persona-foo\"` instead of imperative\n * `classList.add(...)` branches.\n */\nexport const cx = (\n ...parts: Array<string | false | null | undefined>\n): string => parts.filter(Boolean).join(\" \");\n\n\n\n\n\n\n\n","export const positionMap: Record<\n \"bottom-right\" | \"bottom-left\" | \"top-right\" | \"top-left\",\n string\n> = {\n \"bottom-right\": \"persona-bottom-6 persona-right-6\",\n \"bottom-left\": \"persona-bottom-6 persona-left-6\",\n \"top-right\": \"persona-top-6 persona-right-6\",\n \"top-left\": \"persona-top-6 persona-left-6\"\n};\n\n\n\n\n\n\n\n\n","import type { AgentWidgetConfig, AgentWidgetDockConfig } from \"../types\";\n\nconst DEFAULT_DOCK_CONFIG: Required<AgentWidgetDockConfig> = {\n side: \"right\",\n width: \"420px\",\n animate: true,\n reveal: \"resize\",\n maxHeight: \"100dvh\",\n};\n\nexport const isDockedMountMode = (config?: AgentWidgetConfig): boolean =>\n (config?.launcher?.mountMode ?? \"floating\") === \"docked\";\n\nexport const isComposerBarMountMode = (config?: AgentWidgetConfig): boolean =>\n (config?.launcher?.mountMode ?? \"floating\") === \"composer-bar\";\n\n/**\n * Resolved dock layout. For `reveal: \"resize\"`, when the panel is closed the dock column is `0px`.\n * For `reveal: \"overlay\"`, the panel overlays with `transform`. For `reveal: \"push\"`, a sliding track\n * moves content and panel together without width animation on the main column. For `emerge`,\n * the dock column still animates like `resize` but the widget stays `dock.width` wide inside the slot.\n * Unknown keys on `launcher.dock` (e.g. legacy `collapsedWidth`) are ignored.\n */\nexport const resolveDockConfig = (\n config?: AgentWidgetConfig\n): Required<AgentWidgetDockConfig> => {\n const dock = config?.launcher?.dock;\n return {\n side: dock?.side ?? DEFAULT_DOCK_CONFIG.side,\n width: dock?.width ?? DEFAULT_DOCK_CONFIG.width,\n animate: dock?.animate ?? DEFAULT_DOCK_CONFIG.animate,\n reveal: dock?.reveal ?? DEFAULT_DOCK_CONFIG.reveal,\n maxHeight: dock?.maxHeight ?? DEFAULT_DOCK_CONFIG.maxHeight,\n };\n};\n","import type { IconNode } from \"lucide\";\n\n/**\n * Registry-free lucide icon renderer.\n *\n * Two ways to render an icon, chosen by how the name is known:\n * - Name is a LITERAL no config can override → import the icon's data from\n * \"lucide\" (per-icon modules, tree-shakeable) and call `renderIconNode`.\n * Bundles then carry only the glyphs they use — critical for lazy chunks,\n * which would otherwise duplicate the whole ~21 kB registry (`noExternal`).\n * - Name is host-suppliable (config, mention providers, ComponentRenderers) →\n * `renderLucideIcon` in `./icons`, which resolves strings against the\n * curated registry. Chunk code must receive that resolver INJECTED (see\n * approval-deps.ts), never import it.\n *\n * This module must never import `./icons` — that would drag the registry\n * back into every bundle that only needs `renderIconNode`.\n */\nexport const renderIconNode = (\n iconData: IconNode,\n size: number | string = 24,\n color: string = \"currentColor\",\n strokeWidth: number = 2\n): SVGElement | null => {\n if (!Array.isArray(iconData)) return null;\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"width\", String(size));\n svg.setAttribute(\"height\", String(size));\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", color);\n svg.setAttribute(\"stroke-width\", String(strokeWidth));\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n\n // IconNode shape: [[\"path\", {\"d\": \"...\"}], [\"circle\", {\"cx\": \"...\"}], ...]\n iconData.forEach((elementData) => {\n if (!Array.isArray(elementData) || elementData.length < 2) return;\n const tagName = elementData[0] as string;\n const attrs = elementData[1] as Record<string, string> | undefined;\n if (!attrs) return;\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", tagName);\n Object.entries(attrs).forEach(([key, value]) => {\n // Skip 'stroke' so the parent SVG's stroke attribute drives color uniformly\n if (key !== \"stroke\") element.setAttribute(key, String(value));\n });\n svg.appendChild(element);\n });\n\n return svg;\n};\n","/**\n * Generic memoized loader for a lazy code-split chunk.\n *\n * Backs the near-identical loader indirections in the core/eager bundle\n * (`context-mentions-loader.ts`, `context-mentions-inline-loader.ts`,\n * `markdown-parsers-loader.ts`): each registers a runtime loader (IIFE/CDN\n * sibling-URL chunk) and falls back to an external/relative dynamic import for\n * ESM/CJS consumers. The shared semantics are:\n *\n * - `load()` memoizes the resolved module (`moduleCache`) and the in-flight\n * promise (`loadPromise`) so concurrent callers share one import.\n * - A rejected load clears `loadPromise` so a later call retries after a\n * transient failure (one dropped fetch must not disable the feature for the\n * whole session); the current caller still sees the rejection.\n * - The registered loader wins over `fallbackImport`; if no loader is\n * registered, `fallbackImport` is used.\n *\n * IMPORTANT: this module must import nothing beyond types. It sits in the core\n * bundle, so any value import here could drag chunk code back into core and\n * defeat the split (see `context-mentions-bundle.test.ts`).\n */\n\nexport type ChunkLoaderOptions<T> = {\n /**\n * Dynamic import used when no runtime loader has been registered. Keep the\n * `import(...)` literal in the calling module (not here) so the bundler\n * resolves it as an external subpath / relative chunk at that call site.\n */\n fallbackImport: () => Promise<T>;\n /**\n * When true, registering a new loader clears the cached module and any\n * in-flight promise, so a swapped loader (test injection) takes effect\n * deterministically. Production registers its loader once before any load, so\n * this only matters mid-session.\n */\n resetOnSetLoader?: boolean;\n};\n\nexport type ChunkLoader<T> = {\n setLoader: (l: () => Promise<T>) => void;\n load: () => Promise<T>;\n /** Register a resolved module synchronously (eager builds that bundle it). */\n provide: (mod: T) => void;\n /** The cached module, or null if not loaded/provided yet. */\n getSync: () => T | null;\n};\n\nexport const createChunkLoader = <T>(\n options: ChunkLoaderOptions<T>\n): ChunkLoader<T> => {\n const { fallbackImport, resetOnSetLoader = false } = options;\n\n let loader: (() => Promise<T>) | null = null;\n let moduleCache: T | null = null;\n let loadPromise: Promise<T> | null = null;\n\n const setLoader = (l: () => Promise<T>): void => {\n loader = l;\n if (resetOnSetLoader) {\n moduleCache = null;\n loadPromise = null;\n }\n };\n\n const load = (): Promise<T> => {\n if (moduleCache) return Promise.resolve(moduleCache);\n if (loadPromise) return loadPromise;\n const importChunk = loader ?? fallbackImport;\n loadPromise = importChunk()\n .then((mod) => {\n moduleCache = mod;\n return mod;\n })\n .catch((err) => {\n loadPromise = null;\n throw err;\n });\n return loadPromise;\n };\n\n const provide = (mod: T): void => {\n moduleCache = mod;\n };\n\n const getSync = (): T | null => moduleCache;\n\n return { setLoader, load, provide, getSync };\n};\n","import { createChunkLoader } from \"./utils/chunk-loader\";\nimport type { IconNode } from \"lucide\";\n\n/**\n * Loader indirection for the lazy icons-extra chunk (the config-only tail of\n * the icon registry). Stays in the core bundle AND the critical launcher\n * bundle — both register sibling-URL loaders in their IIFE entries, so a\n * launcher configured with a non-core icon paints a sized placeholder and\n * fills within one round-trip instead of shipping the whole registry.\n *\n * The fallback import must be the literal package subpath: `build:client` and\n * the launcher build run without splitting, so a relative import would be\n * inlined; the subpath is marked external in both builds and resolves through\n * the package's own `exports` map at consumer runtime (see\n * `history-view-loader.ts` for the full rationale).\n */\nexport type IconsExtraModule = {\n EXTRA_LUCIDE_ICONS: Record<string, IconNode>;\n};\n\nconst { setLoader, load } = createChunkLoader<IconsExtraModule>({\n fallbackImport: () => import(\"@runtypelabs/persona/icons-extra\"),\n});\n\n/** Override how the chunk is fetched (each IIFE registers a sibling-URL loader). */\nexport const setIconsExtraLoader = setLoader;\n\n/** Load the extra icon data. Memoized; retries after rejection. */\nexport const loadIconsExtra = load;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name activity\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjIgMTJoLTIuNDhhMiAyIDAgMCAwLTEuOTMgMS40NmwtMi4zNSA4LjM2YS4yNS4yNSAwIDAgMS0uNDggMEw5LjI0IDIuMThhLjI1LjI1IDAgMCAwLS40OCAwbC0yLjM1IDguMzZBMiAyIDAgMCAxIDQuNDkgMTJIMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/activity\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Activity: IconNode = [\n [\n 'path',\n {\n d: 'M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2',\n },\n ],\n];\n\nexport default Activity;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name arrow-down\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KICA8cGF0aCBkPSJtMTkgMTItNyA3LTctNyIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/arrow-down\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ArrowDown: IconNode = [\n ['path', { d: 'M12 5v14' }],\n ['path', { d: 'm19 12-7 7-7-7' }],\n];\n\nexport default ArrowDown;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name arrow-left\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTIgMTktNy03IDctNyIgLz4KICA8cGF0aCBkPSJNMTkgMTJINSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/arrow-left\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ArrowLeft: IconNode = [\n ['path', { d: 'm12 19-7-7 7-7' }],\n ['path', { d: 'M19 12H5' }],\n];\n\nexport default ArrowLeft;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name arrow-right\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJtMTIgNSA3IDctNyA3IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/arrow-right\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ArrowRight: IconNode = [\n ['path', { d: 'M5 12h14' }],\n ['path', { d: 'm12 5 7 7-7 7' }],\n];\n\nexport default ArrowRight;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name arrow-up-right\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNyA3aDEwdjEwIiAvPgogIDxwYXRoIGQ9Ik03IDE3IDE3IDciIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/arrow-up-right\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ArrowUpRight: IconNode = [\n ['path', { d: 'M7 7h10v10' }],\n ['path', { d: 'M7 17 17 7' }],\n];\n\nexport default ArrowUpRight;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name arrow-up\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNSAxMiA3LTcgNyA3IiAvPgogIDxwYXRoIGQ9Ik0xMiAxOVY1IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/arrow-up\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ArrowUp: IconNode = [\n ['path', { d: 'm5 12 7-7 7 7' }],\n ['path', { d: 'M12 19V5' }],\n];\n\nexport default ArrowUp;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name at-sign\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI0IiAvPgogIDxwYXRoIGQ9Ik0xNiA4djVhMyAzIDAgMCAwIDYgMHYtMWExMCAxMCAwIDEgMC00IDgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/at-sign\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst AtSign: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '4' }],\n ['path', { d: 'M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8' }],\n];\n\nexport default AtSign;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name bot\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgOFY0SDgiIC8+CiAgPHJlY3Qgd2lkdGg9IjE2IiBoZWlnaHQ9IjEyIiB4PSI0IiB5PSI4IiByeD0iMiIgLz4KICA8cGF0aCBkPSJNMiAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0yMCAxNGgyIiAvPgogIDxwYXRoIGQ9Ik0xNSAxM3YyIiAvPgogIDxwYXRoIGQ9Ik05IDEzdjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/bot\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Bot: IconNode = [\n ['path', { d: 'M12 8V4H8' }],\n ['rect', { width: '16', height: '12', x: '4', y: '8', rx: '2' }],\n ['path', { d: 'M2 14h2' }],\n ['path', { d: 'M20 14h2' }],\n ['path', { d: 'M15 13v2' }],\n ['path', { d: 'M9 13v2' }],\n];\n\nexport default Bot;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name check\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgNiA5IDE3bC01LTUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/check\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Check: IconNode = [['path', { d: 'M20 6 9 17l-5-5' }]];\n\nexport default Check;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name chevron-down\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtNiA5IDYgNiA2LTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/chevron-down\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ChevronDown: IconNode = [['path', { d: 'm6 9 6 6 6-6' }]];\n\nexport default ChevronDown;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name chevron-left\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTUgMTgtNi02IDYtNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevron-left\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ChevronLeft: IconNode = [['path', { d: 'm15 18-6-6 6-6' }]];\n\nexport default ChevronLeft;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name chevron-right\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtOSAxOCA2LTYtNi02IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/chevron-right\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ChevronRight: IconNode = [['path', { d: 'm9 18 6-6-6-6' }]];\n\nexport default ChevronRight;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name chevron-up\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTggMTUtNi02LTYgNiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/chevron-up\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ChevronUp: IconNode = [['path', { d: 'm18 15-6-6-6 6' }]];\n\nexport default ChevronUp;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name clipboard-copy\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iOCIgaGVpZ2h0PSI0IiB4PSI4IiB5PSIyIiByeD0iMSIgcnk9IjEiIC8+CiAgPHBhdGggZD0iTTggNEg2YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0ydi0yIiAvPgogIDxwYXRoIGQ9Ik0xNiA0aDJhMiAyIDAgMCAxIDIgMnY0IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNEgxMSIgLz4KICA8cGF0aCBkPSJtMTUgMTAtNCA0IDQgNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/clipboard-copy\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ClipboardCopy: IconNode = [\n ['rect', { width: '8', height: '4', x: '8', y: '2', rx: '1', ry: '1' }],\n ['path', { d: 'M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2' }],\n ['path', { d: 'M16 4h2a2 2 0 0 1 2 2v4' }],\n ['path', { d: 'M21 14H11' }],\n ['path', { d: 'm15 10-4 4 4 4' }],\n];\n\nexport default ClipboardCopy;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name clipboard\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iOCIgaGVpZ2h0PSI0IiB4PSI4IiB5PSIyIiByeD0iMSIgcnk9IjEiIC8+CiAgPHBhdGggZD0iTTE2IDRoMmEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJINmEyIDIgMCAwIDEtMi0yVjZhMiAyIDAgMCAxIDItMmgyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/clipboard\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Clipboard: IconNode = [\n ['rect', { width: '8', height: '4', x: '8', y: '2', rx: '1', ry: '1' }],\n ['path', { d: 'M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2' }],\n];\n\nexport default Clipboard;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name code-xml\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTggMTYgNC00LTQtNCIgLz4KICA8cGF0aCBkPSJtNiA4LTQgNCA0IDQiIC8+CiAgPHBhdGggZD0ibTE0LjUgNC01IDE2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/code-xml\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst CodeXml: IconNode = [\n ['path', { d: 'm18 16 4-4-4-4' }],\n ['path', { d: 'm6 8-4 4 4 4' }],\n ['path', { d: 'm14.5 4-5 16' }],\n];\n\nexport default CodeXml;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name copy\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHg9IjgiIHk9IjgiIHJ4PSIyIiByeT0iMiIgLz4KICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/copy\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Copy: IconNode = [\n ['rect', { width: '14', height: '14', x: '8', y: '8', rx: '2', ry: '2' }],\n ['path', { d: 'M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2' }],\n];\n\nexport default Copy;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name download\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMTVWMyIgLz4KICA8cGF0aCBkPSJNMjEgMTV2NGEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMnYtNCIgLz4KICA8cGF0aCBkPSJtNyAxMCA1IDUgNS01IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/download\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Download: IconNode = [\n ['path', { d: 'M12 15V3' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4' }],\n ['path', { d: 'm7 10 5 5 5-5' }],\n];\n\nexport default Download;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name ellipsis-vertical\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iNSIgcj0iMSIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjE5IiByPSIxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/ellipsis-vertical\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst EllipsisVertical: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '1' }],\n ['circle', { cx: '12', cy: '5', r: '1' }],\n ['circle', { cx: '12', cy: '19', r: '1' }],\n];\n\nexport default EllipsisVertical;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name ellipsis\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxIiAvPgogIDxjaXJjbGUgY3g9IjE5IiBjeT0iMTIiIHI9IjEiIC8+CiAgPGNpcmNsZSBjeD0iNSIgY3k9IjEyIiByPSIxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/ellipsis\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Ellipsis: IconNode = [\n ['circle', { cx: '12', cy: '12', r: '1' }],\n ['circle', { cx: '19', cy: '12', r: '1' }],\n ['circle', { cx: '5', cy: '12', r: '1' }],\n];\n\nexport default Ellipsis;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name external-link\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgM2g2djYiIC8+CiAgPHBhdGggZD0iTTEwIDE0IDIxIDMiIC8+CiAgPHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/external-link\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ExternalLink: IconNode = [\n ['path', { d: 'M15 3h6v6' }],\n ['path', { d: 'M10 14 21 3' }],\n ['path', { d: 'M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6' }],\n];\n\nexport default ExternalLink;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name eye\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMi4wNjIgMTIuMzQ4YTEgMSAwIDAgMSAwLS42OTYgMTAuNzUgMTAuNzUgMCAwIDEgMTkuODc2IDAgMSAxIDAgMCAxIDAgLjY5NiAxMC43NSAxMC43NSAwIDAgMS0xOS44NzYgMCIgLz4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/eye\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Eye: IconNode = [\n [\n 'path',\n {\n d: 'M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0',\n },\n ],\n ['circle', { cx: '12', cy: '12', r: '3' }],\n];\n\nexport default Eye;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name file-code\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KICA8cGF0aCBkPSJNMTAgMTIuNSA4IDE1bDIgMi41IiAvPgogIDxwYXRoIGQ9Im0xNCAxMi41IDIgMi41LTIgMi41IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/file-code\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst FileCode: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5' }],\n ['path', { d: 'M10 12.5 8 15l2 2.5' }],\n ['path', { d: 'm14 12.5 2 2.5-2 2.5' }],\n];\n\nexport default FileCode;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name file-spreadsheet\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KICA8cGF0aCBkPSJNOCAxM2gyIiAvPgogIDxwYXRoIGQ9Ik0xNCAxM2gyIiAvPgogIDxwYXRoIGQ9Ik04IDE3aDIiIC8+CiAgPHBhdGggZD0iTTE0IDE3aDIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/file-spreadsheet\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst FileSpreadsheet: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5' }],\n ['path', { d: 'M8 13h2' }],\n ['path', { d: 'M14 13h2' }],\n ['path', { d: 'M8 17h2' }],\n ['path', { d: 'M14 17h2' }],\n];\n\nexport default FileSpreadsheet;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name file-text\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KICA8cGF0aCBkPSJNMTAgOUg4IiAvPgogIDxwYXRoIGQ9Ik0xNiAxM0g4IiAvPgogIDxwYXRoIGQ9Ik0xNiAxN0g4IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/file-text\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst FileText: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5' }],\n ['path', { d: 'M10 9H8' }],\n ['path', { d: 'M16 13H8' }],\n ['path', { d: 'M16 17H8' }],\n];\n\nexport default FileText;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name file\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNiAyMmEyIDIgMCAwIDEtMi0yVjRhMiAyIDAgMCAxIDItMmg4YTIuNCAyLjQgMCAwIDEgMS43MDQuNzA2bDMuNTg4IDMuNTg4QTIuNCAyLjQgMCAwIDEgMjAgOHYxMmEyIDIgMCAwIDEtMiAyeiIgLz4KICA8cGF0aCBkPSJNMTQgMnY1YTEgMSAwIDAgMCAxIDFoNSIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/file\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst File: IconNode = [\n [\n 'path',\n {\n d: 'M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z',\n },\n ],\n ['path', { d: 'M14 2v5a1 1 0 0 0 1 1h5' }],\n];\n\nexport default File;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name history\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAxIDAgOS05IDkuNzUgOS43NSAwIDAgMC02Ljc0IDIuNzRMMyA4IiAvPgogIDxwYXRoIGQ9Ik0zIDN2NWg1IiAvPgogIDxwYXRoIGQ9Ik0xMiA3djVsNCAyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/history\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst History: IconNode = [\n ['path', { d: 'M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8' }],\n ['path', { d: 'M3 3v5h5' }],\n ['path', { d: 'M12 7v5l4 2' }],\n];\n\nexport default History;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name image-plus\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTYgNWg2IiAvPgogIDxwYXRoIGQ9Ik0xOSAydjYiIC8+CiAgPHBhdGggZD0iTTIxIDExLjVWMTlhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWNWEyIDIgMCAwIDEgMi0yaDcuNSIgLz4KICA8cGF0aCBkPSJtMjEgMTUtMy4wODYtMy4wODZhMiAyIDAgMCAwLTIuODI4IDBMNiAyMSIgLz4KICA8Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/image-plus\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ImagePlus: IconNode = [\n ['path', { d: 'M16 5h6' }],\n ['path', { d: 'M19 2v6' }],\n ['path', { d: 'M21 11.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7.5' }],\n ['path', { d: 'm21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21' }],\n ['circle', { cx: '9', cy: '9', r: '2' }],\n];\n\nexport default ImagePlus;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name loader-circle\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEgMTJhOSA5IDAgMSAxLTYuMjE5LTguNTYiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/loader-circle\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst LoaderCircle: IconNode = [['path', { d: 'M21 12a9 9 0 1 1-6.219-8.56' }]];\n\nexport default LoaderCircle;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name loader\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMnY0IiAvPgogIDxwYXRoIGQ9Im0xNi4yIDcuOCAyLjktMi45IiAvPgogIDxwYXRoIGQ9Ik0xOCAxMmg0IiAvPgogIDxwYXRoIGQ9Im0xNi4yIDE2LjIgMi45IDIuOSIgLz4KICA8cGF0aCBkPSJNMTIgMTh2NCIgLz4KICA8cGF0aCBkPSJtNC45IDE5LjEgMi45LTIuOSIgLz4KICA8cGF0aCBkPSJNMiAxMmg0IiAvPgogIDxwYXRoIGQ9Im00LjkgNC45IDIuOSAyLjkiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/loader\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Loader: IconNode = [\n ['path', { d: 'M12 2v4' }],\n ['path', { d: 'm16.2 7.8 2.9-2.9' }],\n ['path', { d: 'M18 12h4' }],\n ['path', { d: 'm16.2 16.2 2.9 2.9' }],\n ['path', { d: 'M12 18v4' }],\n ['path', { d: 'm4.9 19.1 2.9-2.9' }],\n ['path', { d: 'M2 12h4' }],\n ['path', { d: 'm4.9 4.9 2.9 2.9' }],\n];\n\nexport default Loader;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name maximize\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOCAzSDVhMiAyIDAgMCAwLTIgMnYzIiAvPgogIDxwYXRoIGQ9Ik0yMSA4VjVhMiAyIDAgMCAwLTItMmgtMyIgLz4KICA8cGF0aCBkPSJNMyAxNnYzYTIgMiAwIDAgMCAyIDJoMyIgLz4KICA8cGF0aCBkPSJNMTYgMjFoM2EyIDIgMCAwIDAgMi0ydi0zIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/maximize\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Maximize: IconNode = [\n ['path', { d: 'M8 3H5a2 2 0 0 0-2 2v3' }],\n ['path', { d: 'M21 8V5a2 2 0 0 0-2-2h-3' }],\n ['path', { d: 'M3 16v3a2 2 0 0 0 2 2h3' }],\n ['path', { d: 'M16 21h3a2 2 0 0 0 2-2v-3' }],\n];\n\nexport default Maximize;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name menu\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNCA1aDE2IiAvPgogIDxwYXRoIGQ9Ik00IDEyaDE2IiAvPgogIDxwYXRoIGQ9Ik00IDE5aDE2IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/menu\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Menu: IconNode = [\n ['path', { d: 'M4 5h16' }],\n ['path', { d: 'M4 12h16' }],\n ['path', { d: 'M4 19h16' }],\n];\n\nexport default Menu;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name message-square\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjIgMTdhMiAyIDAgMCAxLTIgMkg2LjgyOGEyIDIgMCAwIDAtMS40MTQuNTg2bC0yLjIwMiAyLjIwMkEuNzEuNzEgMCAwIDEgMiAyMS4yODZWNWEyIDIgMCAwIDEgMi0yaDE2YTIgMiAwIDAgMSAyIDJ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/message-square\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst MessageSquare: IconNode = [\n [\n 'path',\n {\n d: 'M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z',\n },\n ],\n];\n\nexport default MessageSquare;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name mic\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgMTl2MyIgLz4KICA8cGF0aCBkPSJNMTkgMTB2MmE3IDcgMCAwIDEtMTQgMHYtMiIgLz4KICA8cmVjdCB4PSI5IiB5PSIyIiB3aWR0aD0iNiIgaGVpZ2h0PSIxMyIgcng9IjMiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/mic\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Mic: IconNode = [\n ['path', { d: 'M12 19v3' }],\n ['path', { d: 'M19 10v2a7 7 0 0 1-14 0v-2' }],\n ['rect', { x: '9', y: '2', width: '6', height: '13', rx: '3' }],\n];\n\nexport default Mic;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name minimize\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOCAzdjNhMiAyIDAgMCAxLTIgMkgzIiAvPgogIDxwYXRoIGQ9Ik0yMSA4aC0zYTIgMiAwIDAgMS0yLTJWMyIgLz4KICA8cGF0aCBkPSJNMyAxNmgzYTIgMiAwIDAgMSAyIDJ2MyIgLz4KICA8cGF0aCBkPSJNMTYgMjF2LTNhMiAyIDAgMCAxIDItMmgzIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/minimize\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Minimize: IconNode = [\n ['path', { d: 'M8 3v3a2 2 0 0 1-2 2H3' }],\n ['path', { d: 'M21 8h-3a2 2 0 0 1-2-2V3' }],\n ['path', { d: 'M3 16h3a2 2 0 0 1 2 2v3' }],\n ['path', { d: 'M16 21v-3a2 2 0 0 1 2-2h3' }],\n];\n\nexport default Minimize;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name minus\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/minus\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Minus: IconNode = [['path', { d: 'M5 12h14' }]];\n\nexport default Minus;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name panel-left\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgogIDxwYXRoIGQ9Ik05IDN2MTgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/panel-left\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst PanelLeft: IconNode = [\n ['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2' }],\n ['path', { d: 'M9 3v18' }],\n];\n\nexport default PanelLeft;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name paperclip\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMTYgNi04LjQxNCA4LjU4NmEyIDIgMCAwIDAgMi44MjkgMi44MjlsOC40MTQtOC41ODZhNCA0IDAgMSAwLTUuNjU3LTUuNjU3bC04LjM3OSA4LjU1MWE2IDYgMCAxIDAgOC40ODUgOC40ODVsOC4zNzktOC41NTEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/paperclip\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Paperclip: IconNode = [\n [\n 'path',\n {\n d: 'm16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551',\n },\n ],\n];\n\nexport default Paperclip;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name pencil\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjEuMTc0IDYuODEyYTEgMSAwIDAgMC0zLjk4Ni0zLjk4N0wzLjg0MiAxNi4xNzRhMiAyIDAgMCAwLS41LjgzbC0xLjMyMSA0LjM1MmEuNS41IDAgMCAwIC42MjMuNjIybDQuMzUzLTEuMzJhMiAyIDAgMCAwIC44My0uNDk3eiIgLz4KICA8cGF0aCBkPSJtMTUgNSA0IDQiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/pencil\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Pencil: IconNode = [\n [\n 'path',\n {\n d: 'M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z',\n },\n ],\n ['path', { d: 'm15 5 4 4' }],\n];\n\nexport default Pencil;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name plus\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNNSAxMmgxNCIgLz4KICA8cGF0aCBkPSJNMTIgNXYxNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/plus\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Plus: IconNode = [\n ['path', { d: 'M5 12h14' }],\n ['path', { d: 'M12 5v14' }],\n];\n\nexport default Plus;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name quote\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTYgM2EyIDIgMCAwIDAtMiAydjZhMiAyIDAgMCAwIDIgMiAxIDEgMCAwIDEgMSAxdjFhMiAyIDAgMCAxLTIgMiAxIDEgMCAwIDAtMSAxdjJhMSAxIDAgMCAwIDEgMSA2IDYgMCAwIDAgNi02VjVhMiAyIDAgMCAwLTItMnoiIC8+CiAgPHBhdGggZD0iTTUgM2EyIDIgMCAwIDAtMiAydjZhMiAyIDAgMCAwIDIgMiAxIDEgMCAwIDEgMSAxdjFhMiAyIDAgMCAxLTIgMiAxIDEgMCAwIDAtMSAxdjJhMSAxIDAgMCAwIDEgMSA2IDYgMCAwIDAgNi02VjVhMiAyIDAgMCAwLTItMnoiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/quote\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Quote: IconNode = [\n [\n 'path',\n {\n d: 'M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z',\n },\n ],\n [\n 'path',\n {\n d: 'M5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2 1 1 0 0 1 1 1v1a2 2 0 0 1-2 2 1 1 0 0 0-1 1v2a1 1 0 0 0 1 1 6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z',\n },\n ],\n];\n\nexport default Quote;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name refresh-cw\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMyAxMmE5IDkgMCAwIDEgOS05IDkuNzUgOS43NSAwIDAgMSA2Ljc0IDIuNzRMMjEgOCIgLz4KICA8cGF0aCBkPSJNMjEgM3Y1aC01IiAvPgogIDxwYXRoIGQ9Ik0yMSAxMmE5IDkgMCAwIDEtOSA5IDkuNzUgOS43NSAwIDAgMS02Ljc0LTIuNzRMMyAxNiIgLz4KICA8cGF0aCBkPSJNOCAxNkgzdjUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/refresh-cw\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst RefreshCw: IconNode = [\n ['path', { d: 'M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8' }],\n ['path', { d: 'M21 3v5h-5' }],\n ['path', { d: 'M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16' }],\n ['path', { d: 'M8 16H3v5' }],\n];\n\nexport default RefreshCw;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name search\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJtMjEgMjEtNC4zNC00LjM0IiAvPgogIDxjaXJjbGUgY3g9IjExIiBjeT0iMTEiIHI9IjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/search\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Search: IconNode = [\n ['path', { d: 'm21 21-4.34-4.34' }],\n ['circle', { cx: '11', cy: '11', r: '8' }],\n];\n\nexport default Search;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name send\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTQuNTM2IDIxLjY4NmEuNS41IDAgMCAwIC45MzctLjAyNGw2LjUtMTlhLjQ5Ni40OTYgMCAwIDAtLjYzNS0uNjM1bC0xOSA2LjVhLjUuNSAwIDAgMC0uMDI0LjkzN2w3LjkzIDMuMThhMiAyIDAgMCAxIDEuMTEyIDEuMTF6IiAvPgogIDxwYXRoIGQ9Im0yMS44NTQgMi4xNDctMTAuOTQgMTAuOTM5IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/send\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Send: IconNode = [\n [\n 'path',\n {\n d: 'M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z',\n },\n ],\n ['path', { d: 'm21.854 2.147-10.94 10.939' }],\n];\n\nexport default Send;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name shield-alert\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiIC8+CiAgPHBhdGggZD0iTTEyIDh2NCIgLz4KICA8cGF0aCBkPSJNMTIgMTZoLjAxIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/shield-alert\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ShieldAlert: IconNode = [\n [\n 'path',\n {\n d: 'M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z',\n },\n ],\n ['path', { d: 'M12 8v4' }],\n ['path', { d: 'M12 16h.01' }],\n];\n\nexport default ShieldAlert;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name shield-check\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiIC8+CiAgPHBhdGggZD0ibTkgMTIgMiAyIDQtNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/shield-check\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ShieldCheck: IconNode = [\n [\n 'path',\n {\n d: 'M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z',\n },\n ],\n ['path', { d: 'm9 12 2 2 4-4' }],\n];\n\nexport default ShieldCheck;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name shield-x\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMjAgMTNjMCA1LTMuNSA3LjUtNy42NiA4Ljk1YTEgMSAwIDAgMS0uNjctLjAxQzcuNSAyMC41IDQgMTggNCAxM1Y2YTEgMSAwIDAgMSAxLTFjMiAwIDQuNS0xLjIgNi4yNC0yLjcyYTEuMTcgMS4xNyAwIDAgMSAxLjUyIDBDMTQuNTEgMy44MSAxNyA1IDE5IDVhMSAxIDAgMCAxIDEgMXoiIC8+CiAgPHBhdGggZD0ibTE0LjUgOS41LTUgNSIgLz4KICA8cGF0aCBkPSJtOS41IDkuNSA1IDUiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/shield-x\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ShieldX: IconNode = [\n [\n 'path',\n {\n d: 'M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z',\n },\n ],\n ['path', { d: 'm14.5 9.5-5 5' }],\n ['path', { d: 'm9.5 9.5 5 5' }],\n];\n\nexport default ShieldX;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name square\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHg9IjMiIHk9IjMiIHJ4PSIyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/square\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Square: IconNode = [['rect', { width: '18', height: '18', x: '3', y: '3', rx: '2' }]];\n\nexport default Square;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name star\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTEuNTI1IDIuMjk1YS41My41MyAwIDAgMSAuOTUgMGwyLjMxIDQuNjc5YTIuMTIzIDIuMTIzIDAgMCAwIDEuNTk1IDEuMTZsNS4xNjYuNzU2YS41My41MyAwIDAgMSAuMjk0LjkwNGwtMy43MzYgMy42MzhhMi4xMjMgMi4xMjMgMCAwIDAtLjYxMSAxLjg3OGwuODgyIDUuMTRhLjUzLjUzIDAgMCAxLS43NzEuNTZsLTQuNjE4LTIuNDI4YTIuMTIyIDIuMTIyIDAgMCAwLTEuOTczIDBMNi4zOTYgMjEuMDFhLjUzLjUzIDAgMCAxLS43Ny0uNTZsLjg4MS01LjEzOWEyLjEyMiAyLjEyMiAwIDAgMC0uNjExLTEuODc5TDIuMTYgOS43OTVhLjUzLjUzIDAgMCAxIC4yOTQtLjkwNmw1LjE2NS0uNzU1YTIuMTIyIDIuMTIyIDAgMCAwIDEuNTk3LTEuMTZ6IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/star\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Star: IconNode = [\n [\n 'path',\n {\n d: 'M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z',\n },\n ],\n];\n\nexport default Star;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name thumbs-down\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNOSAxOC4xMiAxMCAxNEg0LjE3YTIgMiAwIDAgMS0xLjkyLTIuNTZsMi4zMy04QTIgMiAwIDAgMSA2LjUgMkgyMGEyIDIgMCAwIDEgMiAydjhhMiAyIDAgMCAxLTIgMmgtMi43NmEyIDIgMCAwIDAtMS43OSAxLjExTDEyIDIyYTMuMTMgMy4xMyAwIDAgMS0zLTMuODhaIiAvPgogIDxwYXRoIGQ9Ik0xNyAxNFYyIiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/thumbs-down\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ThumbsDown: IconNode = [\n [\n 'path',\n {\n d: 'M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z',\n },\n ],\n ['path', { d: 'M17 14V2' }],\n];\n\nexport default ThumbsDown;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name thumbs-up\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTUgNS44OCAxNCAxMGg1LjgzYTIgMiAwIDAgMSAxLjkyIDIuNTZsLTIuMzMgOEEyIDIgMCAwIDEgMTcuNSAyMkg0YTIgMiAwIDAgMS0yLTJ2LThhMiAyIDAgMCAxIDItMmgyLjc2YTIgMiAwIDAgMCAxLjc5LTEuMTFMMTIgMmEzLjEzIDMuMTMgMCAwIDEgMyAzLjg4WiIgLz4KICA8cGF0aCBkPSJNNyAxMHYxMiIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/thumbs-up\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst ThumbsUp: IconNode = [\n [\n 'path',\n {\n d: 'M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z',\n },\n ],\n ['path', { d: 'M7 10v12' }],\n];\n\nexport default ThumbsUp;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name trash-2\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTAgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTQgMTF2NiIgLz4KICA8cGF0aCBkPSJNMTkgNnYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2IiAvPgogIDxwYXRoIGQ9Ik0zIDZoMTgiIC8+CiAgPHBhdGggZD0iTTggNlY0YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/trash-2\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Trash2: IconNode = [\n ['path', { d: 'M10 11v6' }],\n ['path', { d: 'M14 11v6' }],\n ['path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6' }],\n ['path', { d: 'M3 6h18' }],\n ['path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2' }],\n];\n\nexport default Trash2;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name trash\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTkgNnYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2IiAvPgogIDxwYXRoIGQ9Ik0zIDZoMTgiIC8+CiAgPHBhdGggZD0iTTggNlY0YTIgMiAwIDAgMSAyLTJoNGEyIDIgMCAwIDEgMiAydjIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/trash\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Trash: IconNode = [\n ['path', { d: 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6' }],\n ['path', { d: 'M3 6h18' }],\n ['path', { d: 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2' }],\n];\n\nexport default Trash;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name upload\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTIgM3YxMiIgLz4KICA8cGF0aCBkPSJtMTcgOC01LTUtNSA1IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00IiAvPgo8L3N2Zz4K) - https://lucide.dev/icons/upload\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Upload: IconNode = [\n ['path', { d: 'M12 3v12' }],\n ['path', { d: 'm17 8-5-5-5 5' }],\n ['path', { d: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4' }],\n];\n\nexport default Upload;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name volume-2\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTEgNC43MDJhLjcwNS43MDUgMCAwIDAtMS4yMDMtLjQ5OEw2LjQxMyA3LjU4N0ExLjQgMS40IDAgMCAxIDUuNDE2IDhIM2ExIDEgMCAwIDAtMSAxdjZhMSAxIDAgMCAwIDEgMWgyLjQxNmExLjQgMS40IDAgMCAxIC45OTcuNDEzbDMuMzgzIDMuMzg0QS43MDUuNzA1IDAgMCAwIDExIDE5LjI5OHoiIC8+CiAgPHBhdGggZD0iTTE2IDlhNSA1IDAgMCAxIDAgNiIgLz4KICA8cGF0aCBkPSJNMTkuMzY0IDE4LjM2NGE5IDkgMCAwIDAgMC0xMi43MjgiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/volume-2\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst Volume2: IconNode = [\n [\n 'path',\n {\n d: 'M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z',\n },\n ],\n ['path', { d: 'M16 9a5 5 0 0 1 0 6' }],\n ['path', { d: 'M19.364 18.364a9 9 0 0 0 0-12.728' }],\n];\n\nexport default Volume2;\n","import defaultAttributes from '../defaultAttributes';\nimport type { IconNode } from '../types';\n\n/**\n * @name x\n * @description Lucide SVG icon node.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cGF0aCBkPSJNMTggNiA2IDE4IiAvPgogIDxwYXRoIGQ9Im02IDYgMTIgMTIiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/x\n * @see https://lucide.dev/guide/packages/lucide - Documentation\n *\n * @returns {Array}\n *\n */\nconst X: IconNode = [\n ['path', { d: 'M18 6 6 18' }],\n ['path', { d: 'm6 6 12 12' }],\n];\n\nexport default X;\n","import type { IconNode } from \"lucide\";\nimport { renderIconNode } from \"./icon-node\";\nimport { loadIconsExtra } from \"../icons-extra-loader\";\nimport {\n Activity,\n ArrowDown,\n ArrowLeft,\n ArrowRight,\n ArrowUp,\n ArrowUpRight,\n AtSign,\n Bot,\n Check,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronUp,\n Clipboard,\n ClipboardCopy,\n CodeXml,\n Copy,\n Download,\n Ellipsis,\n EllipsisVertical,\n ExternalLink,\n Eye,\n File as FileIcon,\n FileCode,\n FileSpreadsheet,\n FileText,\n History,\n ImagePlus,\n Loader,\n LoaderCircle,\n Maximize,\n Menu,\n MessageSquare,\n Mic,\n Minimize,\n Minus,\n PanelLeft,\n Paperclip,\n Pencil,\n Plus,\n Quote,\n RefreshCw,\n Search,\n Send,\n ShieldAlert,\n ShieldCheck,\n ShieldX,\n Square,\n Star,\n ThumbsDown,\n ThumbsUp,\n Trash,\n Trash2,\n Upload,\n Volume2,\n X,\n} from \"lucide\";\n\n/**\n * Curated icon registry for `renderLucideIcon` (host-suppliable name strings).\n *\n * Two tiers keep the payload honest:\n * - CORE (55 names, below): every name the widget itself can emit —\n * config DEFAULTS (bot, send, mic, x, …) plus the chrome names routed\n * through `utils/buttons` / `utils/dropdown`. Always resolves synchronously.\n * - EXTRA (63 names, `src/icons-extra.ts`): the config-only tail\n * (forms, commerce, media, …). The DATA ships in the lazy `icons-extra.js`\n * sibling chunk; the first request for one of these names kicks the fetch\n * and returns a correctly-sized empty placeholder SVG that fills in place\n * when the chunk lands. Surfaces that clone/morph rendered icons should\n * subscribe to `onExtraIconsReady` and re-render (ui.ts does this for the\n * transcript, mirroring the markdown-parsers heal).\n *\n * Statically-known icons in widget code do NOT use this registry: they import\n * icon data directly and call `renderIconNode` (see utils/icon-node.ts).\n *\n * Hosts can extend the registry with custom or non-curated lucide icons via\n * `registerIcons` (public API).\n *\n * See `packages/widget/docs/icon-registry-shortlist.md` for curation rationale.\n */\nconst CORE_LUCIDE_ICONS = {\n \"activity\": Activity,\n \"arrow-down\": ArrowDown,\n \"arrow-up\": ArrowUp,\n \"arrow-up-right\": ArrowUpRight,\n \"bot\": Bot,\n \"chevron-down\": ChevronDown,\n \"chevron-up\": ChevronUp,\n \"chevron-right\": ChevronRight,\n \"chevron-left\": ChevronLeft,\n \"check\": Check,\n \"clipboard\": Clipboard,\n \"clipboard-copy\": ClipboardCopy,\n \"code-xml\": CodeXml,\n \"copy\": Copy,\n \"file\": FileIcon,\n \"file-code\": FileCode,\n \"file-spreadsheet\": FileSpreadsheet,\n \"file-text\": FileText,\n \"image-plus\": ImagePlus,\n \"loader\": Loader,\n \"loader-circle\": LoaderCircle,\n \"mic\": Mic,\n \"paperclip\": Paperclip,\n \"quote\": Quote,\n \"refresh-cw\": RefreshCw,\n \"search\": Search,\n \"send\": Send,\n \"shield-alert\": ShieldAlert,\n \"shield-check\": ShieldCheck,\n \"shield-x\": ShieldX,\n \"square\": Square,\n \"thumbs-down\": ThumbsDown,\n \"thumbs-up\": ThumbsUp,\n \"upload\": Upload,\n \"volume-2\": Volume2,\n \"x\": X,\n \"at-sign\": AtSign,\n \"arrow-left\": ArrowLeft,\n \"arrow-right\": ArrowRight,\n \"external-link\": ExternalLink,\n \"ellipsis\": Ellipsis,\n \"ellipsis-vertical\": EllipsisVertical,\n \"menu\": Menu,\n \"panel-left\": PanelLeft,\n \"plus\": Plus,\n \"minus\": Minus,\n \"pencil\": Pencil,\n \"trash\": Trash,\n \"trash-2\": Trash2,\n \"download\": Download,\n \"maximize\": Maximize,\n \"minimize\": Minimize,\n \"message-square\": MessageSquare,\n \"star\": Star,\n \"eye\": Eye,\n \"history\": History,\n} as const satisfies Record<string, IconNode>;\n\n/**\n * Names whose data lives in the lazy icons-extra chunk. Kept as a runtime\n * list (~0.8 kB) so an unknown-name typo warns immediately instead of\n * triggering a pointless chunk fetch. MUST stay in sync with the keys of\n * `EXTRA_LUCIDE_ICONS` in `src/icons-extra.ts` (asserted by\n * `icons-partition.test.ts`).\n */\nexport const EXTRA_ICON_NAMES = [\n \"user\",\n \"mail\",\n \"phone\",\n \"calendar\",\n \"clock\",\n \"building\",\n \"map-pin\",\n \"lock\",\n \"key\",\n \"credit-card\",\n \"hash\",\n \"globe\",\n \"link\",\n \"circle-check\",\n \"circle-x\",\n \"triangle-alert\",\n \"info\",\n \"ban\",\n \"shield\",\n \"house\",\n \"pen-line\",\n \"save\",\n \"share\",\n \"funnel\",\n \"settings\",\n \"rotate-cw\",\n \"shopping-cart\",\n \"shopping-bag\",\n \"package\",\n \"truck\",\n \"tag\",\n \"gift\",\n \"receipt\",\n \"wallet\",\n \"store\",\n \"dollar-sign\",\n \"percent\",\n \"play\",\n \"pause\",\n \"volume-x\",\n \"camera\",\n \"image\",\n \"film\",\n \"headphones\",\n \"message-circle\",\n \"bell\",\n \"heart\",\n \"eye-off\",\n \"bookmark\",\n \"calendar-days\",\n \"timer\",\n \"folder\",\n \"folder-open\",\n \"files\",\n \"chart-column\",\n \"sparkles\",\n \"zap\",\n \"sun\",\n \"moon\",\n \"flag\",\n \"lightbulb\",\n \"monitor\",\n \"smartphone\",\n] as const;\n\n/**\n * Names of lucide icons that ship with the widget (core + lazy extra). Names\n * not in this union return `null` from `renderLucideIcon` (with a console\n * warning) unless first added via `registerIcons`.\n */\nexport type IconName =\n | keyof typeof CORE_LUCIDE_ICONS\n | (typeof EXTRA_ICON_NAMES)[number];\n\n/** Runtime registry: core map + lazily-registered extra/custom icons. */\nconst runtimeIcons = new Map<string, IconNode>(\n Object.entries(CORE_LUCIDE_ICONS)\n);\n\n// ---------------------------------------------------------------------------\n// Extra-chunk heal machinery: placeholders fill in place; cloning surfaces\n// re-render via onExtraIconsReady.\n// ---------------------------------------------------------------------------\n\ntype PendingIcon = {\n el: SVGElement;\n name: string;\n size: number | string;\n color: string;\n strokeWidth: number;\n};\nconst pendingIcons = new Set<PendingIcon>();\n\nlet extraIconsLoaded = false;\nconst extraReadySubscribers = new Set<() => void>();\n\n/**\n * Notify heal subscribers. Unlike the markdown loader's fire-once model this\n * can fire MORE THAN ONCE: `registerIcons` may cover some pending names\n * before the chunk adoption covers the rest, and cloning surfaces must\n * re-render on each. Subscribers are only released once the chunk is adopted\n * (`final`) — after that every extra-tier name resolves synchronously, so\n * clones can no longer be created pending.\n */\nconst notifyExtraIconsReady = (final: boolean): void => {\n const subs = [...extraReadySubscribers];\n if (final) extraReadySubscribers.clear();\n for (const cb of subs) {\n try {\n cb();\n } catch {\n /* one bad subscriber must not starve the others */\n }\n }\n};\n\n/**\n * Register `cb` to run once the icons-extra chunk has been adopted (or\n * `registerIcons` supplied names that were pending). For surfaces whose\n * rendered icons get CLONED (fingerprint cache + idiomorph): a clone of a\n * pending placeholder never self-fills, so those surfaces must re-render.\n * Subscribing is passive — it never kicks the fetch (the first extra-name\n * render does). No-op when the extra icons are already registered.\n */\nexport const onExtraIconsReady = (cb: () => void): (() => void) => {\n if (extraIconsLoaded) return () => {};\n extraReadySubscribers.add(cb);\n return () => {\n extraReadySubscribers.delete(cb);\n };\n};\n\nconst fillPendingIcons = (): number => {\n let filled = 0;\n for (const pending of [...pendingIcons]) {\n const data = runtimeIcons.get(pending.name);\n if (!data) continue;\n pendingIcons.delete(pending);\n filled++;\n const real = renderIconNode(data, pending.size, pending.color, pending.strokeWidth);\n if (!real) continue;\n // Fill IN PLACE: the placeholder already carries the correct svg attrs,\n // so adopting the real children swaps nothing the layout depends on.\n pending.el.removeAttribute(\"data-persona-icon-pending\");\n while (real.firstChild) pending.el.appendChild(real.firstChild);\n }\n return filled;\n};\n\n/**\n * Extend the registry at runtime with custom icons (or non-curated lucide\n * data). Later registrations win. Pending placeholders for the added names\n * fill immediately. Public API.\n */\nexport const registerIcons = (icons: Record<string, IconNode>): void => {\n for (const [name, data] of Object.entries(icons)) {\n runtimeIcons.set(name, data);\n }\n // Registered names may cover pending placeholders (e.g. a self-hosted\n // deployment that renamed the bundle and registers icons instead of the\n // chunk). Cloning surfaces hold COPIES the in-place fill can't reach, so\n // notify the heal subscribers whenever anything actually filled.\n if (fillPendingIcons() > 0 && !extraIconsLoaded) {\n notifyExtraIconsReady(false);\n }\n};\n\n/**\n * npm eager path (imported via `index.ts` → `icons-extra-eager.ts`): supply\n * the extra-tier data synchronously so bundled consumers keep the historical\n * all-sync `renderLucideIcon` contract. The IIFE/CDN build never calls this —\n * it lazy-loads `icons-extra.js` instead. Host `registerIcons` overrides\n * registered before this runs still win.\n */\nexport const __eagerlyProvideExtraIcons = (\n icons: Record<string, IconNode>\n): void => {\n if (extraIconsLoaded) return;\n for (const [name, data] of Object.entries(icons)) {\n if (!runtimeIcons.has(name)) runtimeIcons.set(name, data);\n }\n extraIconsLoaded = true;\n fillPendingIcons();\n notifyExtraIconsReady(true);\n};\n\nlet extraIconsKickFailedRetry = false;\nconst kickExtraIcons = (): void => {\n void loadIconsExtra()\n .then((mod) => {\n if (extraIconsLoaded) return;\n for (const [name, data] of Object.entries(mod.EXTRA_LUCIDE_ICONS)) {\n // The chunk is BASE data: never clobber a host's registerIcons()\n // override (\"later registrations win\", and the host's came first).\n if (!runtimeIcons.has(name)) runtimeIcons.set(name, data);\n }\n extraIconsLoaded = true;\n fillPendingIcons();\n notifyExtraIconsReady(true);\n })\n .catch((err) => {\n // Failed fetch (ad blocker, offline, renamed self-hosted bundle):\n // placeholders stay empty and the next extra-name render retries via\n // the chunk loader's rejection-retry. Surface the loader's guidance\n // (e.g. the self-hosting rename message) instead of swallowing it.\n extraIconsKickFailedRetry = true;\n console.warn(\"[Persona] Failed to load the icons-extra chunk\", err);\n });\n};\n\nconst createPlaceholderSvg = (\n size: number | string,\n color: string,\n strokeWidth: number\n): SVGElement => {\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"width\", String(size));\n svg.setAttribute(\"height\", String(size));\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"fill\", \"none\");\n svg.setAttribute(\"stroke\", color);\n svg.setAttribute(\"stroke-width\", String(strokeWidth));\n svg.setAttribute(\"stroke-linecap\", \"round\");\n svg.setAttribute(\"stroke-linejoin\", \"round\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\"data-persona-icon-pending\", \"true\");\n return svg;\n};\n\n/**\n * Renders a lucide icon as an inline SVG element. Works inside Shadow\n * DOM and requires no CSS.\n *\n * Core names resolve synchronously. Extra-tier names (see EXTRA_ICON_NAMES)\n * return a correctly-sized empty placeholder on first use and fill in place\n * once the lazy icons-extra chunk lands. Unknown names return `null` and log\n * a warning.\n *\n * @param iconName - A lucide kebab-case name from the registry. See\n * `IconName` for the full list, or `docs/icon-registry-shortlist.md`\n * for rationale.\n * @param size - The size in pixels (number) or any CSS length string.\n * @param color - Stroke color (default: \"currentColor\").\n * @param strokeWidth - Stroke width (default: 2).\n * @returns SVGElement, or null if the name is not in the registry.\n */\nexport const renderLucideIcon = (\n iconName: IconName | (string & {}),\n size: number | string = 24,\n color: string = \"currentColor\",\n strokeWidth: number = 2\n): SVGElement | null => {\n const iconData = runtimeIcons.get(iconName);\n if (iconData) return renderIconNode(iconData, size, color, strokeWidth);\n\n if ((EXTRA_ICON_NAMES as readonly string[]).includes(iconName)) {\n if (extraIconsKickFailedRetry) extraIconsKickFailedRetry = false;\n const el = createPlaceholderSvg(size, color, strokeWidth);\n // Bounded: a permanently failing chunk (ad blocker) must not accumulate\n // element refs without limit. Oldest entries are dropped — they simply\n // stay empty, like any clone the fill can't reach.\n if (pendingIcons.size >= 500) {\n const oldest = pendingIcons.values().next().value;\n if (oldest) pendingIcons.delete(oldest);\n }\n pendingIcons.add({ el, name: iconName, size, color, strokeWidth });\n kickExtraIcons();\n return el;\n }\n\n console.warn(\n `Lucide icon \"${iconName}\" is not in the Persona registry. ` +\n `Register it via registerIcons(), or add it to packages/widget/src/utils/icons.ts ` +\n `(see docs/icon-registry-shortlist.md).`\n );\n return null;\n};\n","import { AgentWidgetSessionStatus } from \"../session\";\n\nexport const statusCopy: Record<AgentWidgetSessionStatus, string> = {\n idle: \"Online\",\n connecting: \"Connecting…\",\n connected: \"Streaming…\",\n error: \"Offline\",\n paused: \"Connection lost…\",\n resuming: \"Reconnecting…\"\n};\n\n/**\n * Default z-index for widget overlays. Used for the floating panel, launcher\n * button, sidebar, mobile fullscreen, and docked mobile fullscreen modes.\n * Integrators can override via `launcher.zIndex`.\n */\nexport const DEFAULT_OVERLAY_Z_INDEX = 100000;\n\n/**\n * Z-index for elements portaled to document.body (tooltips, dropdowns).\n * Must be above the widget overlay so portaled UI is not clipped.\n */\nexport const PORTALED_OVERLAY_Z_INDEX = DEFAULT_OVERLAY_Z_INDEX + 1;\n\n\n\n\n\n\n\n\n","import { createElement, createNode, cx } from \"../utils/dom\";\nimport { AgentWidgetConfig, AgentWidgetLauncherTeaserConfig } from \"../types\";\nimport { positionMap } from \"../utils/positioning\";\nimport { isDockedMountMode } from \"../utils/dock\";\nimport { renderLucideIcon } from \"../utils/icons\";\nimport { DEFAULT_OVERLAY_Z_INDEX } from \"../utils/constants\";\n\nexport interface LauncherButton {\n element: HTMLButtonElement;\n update: (config: AgentWidgetConfig) => void;\n destroy: () => void;\n}\n\nexport const createLauncherButton = (\n config: AgentWidgetConfig | undefined,\n onToggle: () => void\n): LauncherButton => {\n const button = createElement(\"button\") as HTMLButtonElement;\n button.type = \"button\";\n button.innerHTML = `\n <span class=\"persona-inline-flex persona-items-center persona-justify-center persona-rounded-full persona-bg-persona-primary persona-text-white\" data-role=\"launcher-icon\">💬</span>\n <img data-role=\"launcher-image\" class=\"persona-rounded-full persona-object-cover\" alt=\"\" style=\"display:none\" />\n <span class=\"persona-flex persona-min-w-0 persona-flex-1 persona-flex-col persona-items-start persona-text-left\">\n <span class=\"persona-block persona-w-full persona-truncate persona-text-sm persona-font-semibold persona-text-persona-launcher\" data-role=\"launcher-title\"></span>\n <span class=\"persona-block persona-w-full persona-truncate persona-text-xs persona-text-persona-launcher-muted\" data-role=\"launcher-subtitle\"></span>\n </span>\n <span class=\"persona-ml-2 persona-grid persona-place-items-center persona-rounded-full persona-bg-persona-primary persona-text-persona-call-to-action\" data-role=\"launcher-call-to-action-icon\">↗</span>\n `;\n button.addEventListener(\"click\", onToggle);\n\n const update = (newConfig: AgentWidgetConfig) => {\n const launcher = newConfig.launcher ?? {};\n const dockedMode = isDockedMountMode(newConfig);\n\n const titleEl = button.querySelector(\"[data-role='launcher-title']\");\n if (titleEl) {\n const t = launcher.title ?? \"Chat Assistant\";\n titleEl.textContent = t;\n titleEl.setAttribute(\"title\", t);\n }\n\n const subtitleEl = button.querySelector(\"[data-role='launcher-subtitle']\");\n if (subtitleEl) {\n const s = launcher.subtitle ?? \"Here to help you get answers fast\";\n subtitleEl.textContent = s;\n subtitleEl.setAttribute(\"title\", s);\n }\n\n // Hide/show text container\n const textContainer = button.querySelector(\".persona-flex-col\");\n if (textContainer) {\n if (launcher.textHidden || dockedMode) {\n (textContainer as HTMLElement).style.display = \"none\";\n } else {\n (textContainer as HTMLElement).style.display = \"\";\n }\n }\n\n const icon = button.querySelector<HTMLSpanElement>(\"[data-role='launcher-icon']\");\n if (icon) {\n if (launcher.agentIconHidden) {\n icon.style.display = \"none\";\n } else {\n const iconSize = launcher.agentIconSize ?? \"40px\";\n icon.style.height = iconSize;\n icon.style.width = iconSize;\n\n // Optional custom background color for the agent icon circle. When set,\n // override the default primary-color background; otherwise restore it.\n if (launcher.agentIconBackgroundColor) {\n icon.style.backgroundColor = launcher.agentIconBackgroundColor;\n icon.classList.remove(\"persona-bg-persona-primary\");\n } else {\n icon.style.backgroundColor = \"\";\n icon.classList.add(\"persona-bg-persona-primary\");\n }\n\n // Clear existing content\n icon.innerHTML = \"\";\n \n // Render icon based on priority: Lucide icon > iconUrl > agentIconText\n if (launcher.agentIconName) {\n // Use Lucide icon\n const iconSizeNum = parseFloat(iconSize) || 24;\n const iconSvg = renderLucideIcon(launcher.agentIconName, iconSizeNum * 0.6, \"var(--persona-text-inverse, #ffffff)\", 1.5);\n if (iconSvg) {\n icon.appendChild(iconSvg);\n icon.style.display = \"\";\n } else {\n // Fallback to agentIconText if Lucide icon fails\n icon.textContent = launcher.agentIconText ?? \"💬\";\n icon.style.display = \"\";\n }\n } else if (launcher.iconUrl) {\n // Use image URL - hide icon span and show img\n icon.style.display = \"none\";\n } else {\n // Use text/emoji\n icon.textContent = launcher.agentIconText ?? \"💬\";\n icon.style.display = \"\";\n }\n }\n }\n\n const img = button.querySelector<HTMLImageElement>(\"[data-role='launcher-image']\");\n if (img) {\n const iconSize = launcher.agentIconSize ?? \"40px\";\n img.style.height = iconSize;\n img.style.width = iconSize;\n if (launcher.iconUrl && !launcher.agentIconName && !launcher.agentIconHidden) {\n // Only show image if not using Lucide icon and not hidden\n img.src = launcher.iconUrl;\n img.style.display = \"block\";\n } else {\n img.style.display = \"none\";\n }\n }\n\n const callToActionIconEl = button.querySelector<HTMLSpanElement>(\"[data-role='launcher-call-to-action-icon']\");\n if (callToActionIconEl) {\n const callToActionIconSize = launcher.callToActionIconSize ?? \"32px\";\n callToActionIconEl.style.height = callToActionIconSize;\n callToActionIconEl.style.width = callToActionIconSize;\n \n // Apply background color if configured\n if (launcher.callToActionIconBackgroundColor) {\n callToActionIconEl.style.backgroundColor = launcher.callToActionIconBackgroundColor;\n callToActionIconEl.classList.remove(\"persona-bg-persona-primary\");\n } else {\n callToActionIconEl.style.backgroundColor = \"\";\n callToActionIconEl.classList.add(\"persona-bg-persona-primary\");\n }\n\n // Apply foreground/icon color if configured\n if (launcher.callToActionIconColor) {\n callToActionIconEl.style.color = launcher.callToActionIconColor;\n callToActionIconEl.classList.remove(\"persona-text-persona-call-to-action\");\n } else {\n callToActionIconEl.style.color = \"\";\n callToActionIconEl.classList.add(\"persona-text-persona-call-to-action\");\n }\n \n // Calculate padding to adjust icon size\n let paddingTotal = 0;\n if (launcher.callToActionIconPadding) {\n callToActionIconEl.style.boxSizing = \"border-box\";\n callToActionIconEl.style.padding = launcher.callToActionIconPadding;\n // Parse padding value to calculate total padding (padding applies to both sides)\n const paddingValue = parseFloat(launcher.callToActionIconPadding) || 0;\n paddingTotal = paddingValue * 2; // padding on both sides\n } else {\n callToActionIconEl.style.boxSizing = \"\";\n callToActionIconEl.style.padding = \"\";\n }\n \n if (launcher.callToActionIconHidden) {\n callToActionIconEl.style.display = \"none\";\n } else {\n callToActionIconEl.style.display = dockedMode ? \"none\" : \"\";\n \n // Clear existing content\n callToActionIconEl.innerHTML = \"\";\n \n // Use Lucide icon if provided, otherwise fall back to text\n if (launcher.callToActionIconName) {\n // Calculate actual icon size by subtracting padding\n const containerSize = parseFloat(callToActionIconSize) || 24;\n const iconSize = Math.max(containerSize - paddingTotal, 8); // Ensure minimum size of 8px\n const iconSvg = renderLucideIcon(launcher.callToActionIconName, iconSize, \"currentColor\", 1.5);\n if (iconSvg) {\n callToActionIconEl.appendChild(iconSvg);\n } else {\n // Fallback to text if icon fails to render\n callToActionIconEl.textContent = launcher.callToActionIconText ?? \"↗\";\n }\n } else {\n callToActionIconEl.textContent = launcher.callToActionIconText ?? \"↗\";\n }\n }\n }\n\n const positionClass =\n launcher.position && positionMap[launcher.position]\n ? positionMap[launcher.position]\n : positionMap[\"bottom-right\"];\n\n const floatingBase =\n \"persona-fixed persona-flex persona-items-center persona-gap-3 persona-rounded-launcher persona-bg-persona-launcher persona-py-2.5 persona-pl-3 persona-pr-3 persona-transition hover:persona-translate-y-[-2px] persona-cursor-pointer\";\n const dockedBase =\n \"persona-relative persona-mt-4 persona-mb-4 persona-mx-auto persona-flex persona-items-center persona-justify-center persona-rounded-launcher persona-bg-persona-launcher persona-transition hover:persona-translate-y-[-2px] persona-cursor-pointer\";\n\n button.className = dockedMode ? dockedBase : `${floatingBase} ${positionClass}`;\n\n if (!dockedMode) {\n button.style.zIndex = String(launcher.zIndex ?? DEFAULT_OVERLAY_Z_INDEX);\n }\n\n // Apply launcher border and shadow from config (with defaults matching previous Tailwind classes)\n const defaultBorder = \"1px solid var(--persona-launcher-border, var(--persona-border, #e5e7eb))\";\n const defaultShadow = \"var(--persona-launcher-shadow, 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1))\";\n\n button.style.border = launcher.border ?? defaultBorder;\n button.style.boxShadow =\n launcher.shadow !== undefined\n ? (launcher.shadow.trim() === \"\" ? \"none\" : launcher.shadow)\n : defaultShadow;\n\n if (dockedMode) {\n // Docked mode uses a 0px column when closed and hides this button; keep no hit target.\n button.style.width = \"0\";\n button.style.minWidth = \"0\";\n button.style.maxWidth = \"0\";\n button.style.padding = \"0\";\n button.style.overflow = \"hidden\";\n button.style.border = \"none\";\n button.style.boxShadow = \"none\";\n } else {\n button.style.width = \"\";\n button.style.minWidth = \"\";\n button.style.maxWidth = launcher.collapsedMaxWidth ?? \"\";\n button.style.justifyContent = \"\";\n button.style.padding = \"\";\n button.style.overflow = \"\";\n }\n };\n\n const destroy = () => {\n button.removeEventListener(\"click\", onToggle);\n button.remove();\n };\n\n // Initial update\n if (config) {\n update(config);\n }\n\n return {\n element: button,\n update,\n destroy\n };\n};\n\n/** Teaser bubble handle. `dismiss(true)` also writes the persisted flag. */\nexport interface LauncherTeaser {\n element: HTMLElement;\n show: () => void;\n dismiss: (persist: boolean) => void;\n}\n\n/** \"auto\" covers restored/hook-driven opens: they never persist the teaser flag. */\nexport type LauncherOpenOrigin = \"user\" | \"auto\";\n\nexport interface LauncherSurface {\n /** Positioned wrapper. Sibling teaser + launcher live inside it. */\n element: HTMLElement;\n launcher: LauncherButton;\n /** Null when no teaser is configured for the current config. */\n teaser: LauncherTeaser | null;\n /** Opening the panel consumes the teaser; closing never resurrects it. */\n setPanelOpen: (open: boolean, origin?: LauncherOpenOrigin) => void;\n update: (config: AgentWidgetConfig) => void;\n destroy: () => void;\n}\n\nconst TEASER_KEY_SUFFIX = \"teaser-dismissed\";\n\n/** Consumed teaser keys for this page load; also the blocked-storage fallback. */\nconst teaserMemoryDismissed = new Set<string>();\n\nconst teaserStorageKey = (config?: AgentWidgetConfig): string => {\n const persist = config?.persistState;\n const prefix =\n (typeof persist === \"object\" ? persist?.keyPrefix : undefined) ?? \"persona-\";\n return `${prefix}${TEASER_KEY_SUFFIX}`;\n};\n\n// localStorage access throws (not just fails) in Safari private mode and\n// partitioned iframes, so every access falls back to the in-memory set.\nconst readTeaserDismissed = (key: string, useStorage: boolean): boolean => {\n if (teaserMemoryDismissed.has(key)) return true;\n if (!useStorage) return false;\n try {\n return window.localStorage.getItem(key) === \"1\";\n } catch {\n return false;\n }\n};\n\nconst writeTeaserDismissed = (key: string, useStorage: boolean): void => {\n teaserMemoryDismissed.add(key);\n if (!useStorage) return;\n try {\n window.localStorage.setItem(key, \"1\");\n } catch {\n /* blocked storage: the in-memory flag above is the fallback */\n }\n};\n\nconst prefersReducedMotion = (): boolean =>\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n\nconst resolveTeaserConfig = (\n config: AgentWidgetConfig | undefined\n): AgentWidgetLauncherTeaserConfig | null => {\n const teaser = config?.launcher?.teaser;\n if (!teaser || !teaser.text) return null;\n if (config?.launcher?.enabled === false) return null;\n if (isDockedMountMode(config ?? {})) return null;\n return teaser;\n};\n\n/**\n * Launcher wrapper owning the collapsed button and its optional teaser bubble.\n * Both the critical `launcher.global.js` bundle and the full widget build the\n * launcher through this, so teaser behavior and cleanup are identical on the\n * eager and deferred paths.\n */\nexport const createLauncherSurface = (\n config: AgentWidgetConfig | undefined,\n onToggle: () => void\n): LauncherSurface => {\n const wrapper = createElement(\"div\", \"persona-launcher-surface\");\n wrapper.setAttribute(\"data-persona-launcher-surface\", \"true\");\n\n let currentConfig: AgentWidgetConfig = config ?? {};\n let teaserConfig: AgentWidgetLauncherTeaserConfig | null = null;\n let teaserElement: HTMLElement | null = null;\n let dismissButton: HTMLButtonElement | null = null;\n let teaserTextButton: HTMLButtonElement | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let visible = false;\n let shown = false;\n let consumed = false;\n let panelOpen = false;\n\n const usesStorage = (): boolean =>\n (teaserConfig?.frequency ?? \"once\") === \"once\" &&\n currentConfig.persistState !== false;\n\n const clearTimer = () => {\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const hideBubble = () => {\n if (!teaserElement || !visible) return;\n visible = false;\n teaserElement.hidden = true;\n };\n\n const dismiss = (persist: boolean) => {\n clearTimer();\n consumed = true;\n hideBubble();\n writeTeaserDismissed(teaserStorageKey(currentConfig), persist && usesStorage());\n };\n\n /**\n * Click-through and launcher clicks consume; only a seen teaser persists.\n * An automatic open is never user intent, so it consumes in memory only.\n */\n const consumeForOpen = (origin: LauncherOpenOrigin) => {\n if (!teaserConfig || consumed) return;\n dismiss(origin === \"user\" && visible);\n };\n\n const show = () => {\n timer = null;\n if (!teaserElement || consumed || panelOpen) return;\n shown = true;\n visible = true;\n teaserElement.hidden = false;\n if (prefersReducedMotion() || typeof teaserElement.animate !== \"function\") return;\n teaserElement.animate(\n [\n { opacity: \"0\", transform: \"translateY(6px)\" },\n { opacity: \"1\", transform: \"none\" },\n ],\n { duration: 220, easing: \"ease-out\", fill: \"backwards\" }\n );\n };\n\n const schedule = () => {\n if (!teaserConfig || !teaserElement) return;\n if (consumed || shown || panelOpen) return;\n if (readTeaserDismissed(teaserStorageKey(currentConfig), usesStorage())) return;\n clearTimer();\n timer = setTimeout(show, Math.max(0, teaserConfig.delayMs ?? 0));\n };\n\n const handleTeaserClick = () => {\n dismiss(usesStorage());\n onToggle();\n };\n\n const handleDismissClick = (event: MouseEvent) => {\n event.stopPropagation();\n dismiss(usesStorage());\n };\n\n const handleLauncherToggle = () => {\n consumeForOpen(\"user\");\n onToggle();\n };\n\n const launcher = createLauncherButton(config, handleLauncherToggle);\n\n const removeTeaserElement = () => {\n clearTimer();\n teaserTextButton?.removeEventListener(\"click\", handleTeaserClick);\n dismissButton?.removeEventListener(\"click\", handleDismissClick);\n teaserElement?.remove();\n teaserElement = null;\n teaserTextButton = null;\n dismissButton = null;\n visible = false;\n };\n\n const buildTeaserElement = () => {\n teaserTextButton = createNode(\"button\", {\n className: \"persona-launcher-teaser-text\",\n attrs: { type: \"button\" },\n });\n teaserTextButton.addEventListener(\"click\", handleTeaserClick);\n\n dismissButton = createNode(\"button\", {\n className: \"persona-launcher-teaser-dismiss\",\n attrs: { type: \"button\" },\n text: \"\\u00d7\",\n });\n dismissButton.addEventListener(\"click\", handleDismissClick);\n\n teaserElement = createNode(\n \"div\",\n {\n className: \"persona-launcher-teaser\",\n attrs: {\n \"data-persona-launcher-teaser\": \"true\",\n role: \"status\",\n \"aria-live\": \"polite\",\n hidden: \"\",\n },\n },\n teaserTextButton,\n dismissButton\n );\n wrapper.insertBefore(teaserElement, launcher.element);\n };\n\n /**\n * The wrapper is `display: contents` until a teaser exists, so the launcher\n * keeps its own fixed placement; with a teaser the wrapper takes over the\n * corner and the button becomes static inside it.\n */\n const applyPlacement = () => {\n const position = currentConfig.launcher?.position ?? \"bottom-right\";\n const positionClass = positionMap[position] ?? positionMap[\"bottom-right\"];\n\n if (!teaserElement) {\n wrapper.className = \"persona-launcher-surface\";\n wrapper.removeAttribute(\"data-teaser\");\n wrapper.style.zIndex = \"\";\n launcher.element.style.position = \"\";\n return;\n }\n\n wrapper.className = cx(\"persona-launcher-surface\", positionClass);\n wrapper.setAttribute(\"data-teaser\", position);\n wrapper.style.zIndex = String(\n currentConfig.launcher?.zIndex ?? DEFAULT_OVERLAY_Z_INDEX\n );\n launcher.element.style.position = \"static\";\n };\n\n const syncTeaser = (nextConfig: AgentWidgetConfig) => {\n const next = resolveTeaserConfig(nextConfig);\n teaserConfig = next;\n\n if (!next) {\n removeTeaserElement();\n return;\n }\n\n // `shown` is deliberately not reset here: at most one appearance per load.\n if (!teaserElement) buildTeaserElement();\n\n teaserTextButton!.textContent = next.text;\n dismissButton!.hidden = next.dismissible === false;\n dismissButton!.setAttribute(\n \"aria-label\",\n next.dismissLabel ?? \"Dismiss message\"\n );\n schedule();\n };\n\n const update = (nextConfig: AgentWidgetConfig) => {\n currentConfig = nextConfig;\n launcher.update(nextConfig);\n syncTeaser(nextConfig);\n applyPlacement();\n };\n\n const setPanelOpen = (open: boolean, origin: LauncherOpenOrigin = \"user\") => {\n panelOpen = open;\n if (!open) return;\n consumeForOpen(origin);\n };\n\n const destroy = () => {\n removeTeaserElement();\n launcher.destroy();\n wrapper.remove();\n };\n\n wrapper.appendChild(launcher.element);\n if (config) {\n syncTeaser(config);\n applyPlacement();\n }\n\n return {\n element: wrapper,\n launcher,\n get teaser(): LauncherTeaser | null {\n if (!teaserElement) return null;\n return { element: teaserElement, show, dismiss };\n },\n setPanelOpen,\n update,\n destroy,\n };\n};\n","const isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/**\n * Deep-merge plain objects. Arrays and non-objects are replaced by override.\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n base: T | undefined,\n override: Record<string, unknown> | undefined\n): T | Record<string, unknown> | undefined {\n if (!base) return override;\n if (!override) return base;\n\n const merged: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(override)) {\n const existing = merged[key];\n if (isObject(existing) && isObject(value)) {\n merged[key] = deepMerge(existing, value);\n } else {\n merged[key] = value;\n }\n }\n\n return merged;\n}\n","import type { AgentWidgetConfig, AgentWidgetLauncherConfig } from \"./types\";\nimport type { DeepPartial, PersonaTheme } from \"./types/theme\";\nimport { deepMerge } from \"./utils/deep-merge\";\nimport {\n DEFAULT_TOOLTIP_DELAY_MS,\n DEFAULT_TOOLTIP_SKIP_DELAY_MS,\n} from \"./utils/tooltip-timing\";\n\n/**\n * Default width for the floating launcher panel (when not overridden).\n * Benchmarks: many chat products use ~300–400px; 400px is a frequent “standard” default.\n * We use 440px to better fit code/JSON and structured replies while staying responsive via `min(..., 100vw)`.\n */\nexport const DEFAULT_FLOATING_LAUNCHER_WIDTH = \"min(440px, calc(100vw - 24px))\";\n\n/** Max width cap paired with {@link DEFAULT_FLOATING_LAUNCHER_WIDTH} for theme defaults. */\nexport const DEFAULT_FLOATING_LAUNCHER_MAX_WIDTH = \"440px\";\n\n/**\n * Canonical composer placeholder. The low-level builders fall back to this so\n * they cannot drift from `DEFAULT_WIDGET_CONFIG.copy.inputPlaceholder`.\n */\nexport const DEFAULT_INPUT_PLACEHOLDER = \"How can I help...\";\n\nexport const DEFAULT_LAUNCHER_CONFIG: AgentWidgetLauncherConfig = {\n enabled: true,\n mountMode: \"floating\",\n dock: {\n side: \"right\",\n width: \"420px\",\n },\n title: \"Chat Assistant\",\n subtitle: \"Here to help you get answers fast\",\n agentIconText: \"💬\",\n agentIconName: \"bot\",\n headerIconName: \"bot\",\n position: \"bottom-right\",\n width: DEFAULT_FLOATING_LAUNCHER_WIDTH,\n heightOffset: 0,\n autoExpand: false,\n callToActionIconHidden: false,\n agentIconSize: \"40px\",\n headerIconSize: \"40px\",\n // closeButtonSize / clearChat.size omitted so theme.components.header.controlSize\n // sizes the header controls; setting either here would pin them past the token.\n // Zero out browser-default <button> padding so the icon gets the full\n // content box, matching clearChat.paddingX/Y below. Without this,\n // UA stylesheets add ~1-2px vertical and ~6px horizontal padding that\n // eats into the border-box width and shrinks the rendered icon.\n closeButtonPaddingX: \"0px\",\n closeButtonPaddingY: \"0px\",\n callToActionIconName: \"arrow-up-right\",\n callToActionIconText: \"\",\n callToActionIconSize: \"32px\",\n callToActionIconPadding: \"5px\",\n callToActionIconColor: undefined,\n callToActionIconBackgroundColor: undefined,\n // closeButtonColor / clearChat.iconColor omitted so theme.components.header.actionIconForeground applies.\n closeButtonBackgroundColor: \"transparent\",\n clearChat: {\n backgroundColor: \"transparent\",\n borderColor: \"transparent\",\n enabled: true,\n placement: \"inline\",\n iconName: \"refresh-cw\",\n showTooltip: true,\n tooltipText: \"Clear chat\",\n paddingX: \"0px\",\n paddingY: \"0px\",\n },\n headerIconHidden: false,\n border: undefined,\n shadow:\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)\",\n};\n\n/**\n * Default widget configuration\n * Single source of truth for all default values\n */\nexport const DEFAULT_WIDGET_CONFIG: Partial<AgentWidgetConfig> = {\n apiUrl: \"https://api.runtype.com/api/chat/dispatch\",\n // Client token mode defaults (optional, only used when clientToken is set)\n clientToken: undefined,\n agentId: undefined,\n target: undefined,\n theme: undefined,\n darkTheme: undefined,\n colorScheme: \"light\",\n tooltip: {\n delayMs: DEFAULT_TOOLTIP_DELAY_MS,\n skipDelayMs: DEFAULT_TOOLTIP_SKIP_DELAY_MS,\n },\n launcher: DEFAULT_LAUNCHER_CONFIG,\n copy: {\n // No welcomeTitle / welcomeSubtitle here on purpose: `resolveWelcomeConfig`\n // owns those defaults so presence still means \"the host set this\".\n inputPlaceholder: DEFAULT_INPUT_PLACEHOLDER,\n sendButtonLabel: \"Send\",\n },\n sendButton: {\n borderWidth: \"0px\",\n paddingX: \"12px\",\n paddingY: \"10px\",\n borderColor: undefined,\n useIcon: true,\n iconText: \"↑\",\n // No `size`: unset means \"follow --persona-composer-control-size\"\n // (theme.components.composer.controlSize), which defaults to 40px.\n showTooltip: true,\n tooltipText: \"Send message\",\n iconName: \"send\",\n },\n statusIndicator: {\n visible: true,\n idleText: \"Online\",\n connectingText: \"Connecting…\",\n connectedText: \"Streaming…\",\n errorText: \"Offline\",\n },\n voiceRecognition: {\n enabled: true,\n pauseDuration: 2000,\n iconName: \"mic\",\n // No `iconSize` / `paddingX` / `paddingY`: the mic sizes from\n // --persona-composer-control-size like every other composer control, so it\n // no longer needs the hand-tuned box that squeezed a 39px glyph.\n borderWidth: \"0px\",\n iconColor: undefined,\n backgroundColor: \"transparent\",\n borderColor: \"transparent\",\n recordingIconColor: undefined,\n recordingBackgroundColor: undefined,\n recordingBorderColor: \"transparent\",\n showTooltip: true,\n tooltipText: \"Start voice recognition\",\n },\n features: {\n showReasoning: true,\n showToolCalls: true,\n scrollToBottom: {\n enabled: true,\n iconName: \"arrow-down\",\n label: \"\",\n },\n scrollBehavior: {\n // ChatGPT-style default: pin the just-sent message near the top and let\n // the reply stream into the space below. Restore the old \"stick to the\n // bottom\" behavior with `mode: \"follow\"`.\n mode: \"anchor-top\",\n anchorTopOffset: 16,\n // Surface the unread count + \"streaming below\" hint while pinned, so the\n // reader still sees activity arriving off-screen under the pinned turn.\n // (Suppressed by default historically; opted on alongside the anchor-top\n // default so the default UX keeps the affordance.)\n showActivityWhilePinned: true,\n },\n toolCallDisplay: {\n collapsedMode: \"tool-call\",\n activePreview: false,\n grouped: false,\n groupedMode: \"stack\",\n previewMaxLines: 3,\n expandable: true,\n loadingAnimation: \"none\",\n },\n reasoningDisplay: {\n activePreview: false,\n previewMaxLines: 3,\n expandable: true,\n loadingAnimation: \"none\",\n },\n streamAnimation: {\n type: \"none\",\n placeholder: \"none\",\n speed: 120,\n duration: 1800,\n },\n askUserQuestion: {\n enabled: true,\n slideInMs: 180,\n freeTextLabel: \"Other…\",\n freeTextPlaceholder: \"Type your answer…\",\n submitLabel: \"Send\",\n },\n history: {\n enabled: false,\n presentation: \"panel\",\n showScopeStatus: true,\n showDelete: true,\n showDeleteAll: true,\n },\n },\n // Placeholder copy that models the right shape: verb-first, user-voice,\n // one line. Integrators should swap in domain prompts.\n suggestionChips: [\n \"Show me what you can help with\",\n \"Walk me through getting started\",\n \"Answer a question about this page\",\n ],\n suggestionChipsConfig: {\n fontFamily: \"sans-serif\",\n fontWeight: \"500\",\n paddingX: \"12px\",\n paddingY: \"6px\",\n },\n layout: {\n header: {\n layout: \"default\",\n showIcon: true,\n showTitle: true,\n showSubtitle: true,\n showCloseButton: true,\n showClearChat: true,\n },\n messages: {\n layout: \"bubble\",\n avatar: {\n show: false,\n position: \"left\",\n },\n timestamp: {\n show: false,\n position: \"below\",\n },\n groupConsecutive: false,\n },\n slots: {},\n },\n markdown: {\n options: {\n gfm: true,\n breaks: true,\n },\n disableDefaultStyles: false,\n },\n messageActions: {\n enabled: true,\n showCopy: true,\n showUpvote: false, // Requires backend - disabled by default\n showDownvote: false, // Requires backend - disabled by default\n visibility: \"hover\",\n align: \"right\",\n layout: \"pill-inside\",\n },\n debug: false,\n};\n\nfunction mergeThemePartials(\n base: DeepPartial<PersonaTheme> | undefined,\n override: DeepPartial<PersonaTheme> | undefined\n): DeepPartial<PersonaTheme> | undefined {\n if (!base && !override) return undefined;\n if (!base) return override;\n if (!override) return base;\n return deepMerge(\n base as Record<string, unknown>,\n override as Record<string, unknown>\n ) as DeepPartial<PersonaTheme>;\n}\n\n/**\n * Helper to deep merge user config with defaults\n * This ensures all default values are present while allowing selective overrides\n */\nexport function mergeWithDefaults(\n config?: Partial<AgentWidgetConfig>\n): Partial<AgentWidgetConfig> {\n if (!config) return DEFAULT_WIDGET_CONFIG;\n\n return {\n ...DEFAULT_WIDGET_CONFIG,\n ...config,\n theme: mergeThemePartials(DEFAULT_WIDGET_CONFIG.theme, config.theme),\n darkTheme: mergeThemePartials(DEFAULT_WIDGET_CONFIG.darkTheme, config.darkTheme),\n launcher: {\n ...DEFAULT_WIDGET_CONFIG.launcher,\n ...config.launcher,\n dock: {\n ...DEFAULT_WIDGET_CONFIG.launcher?.dock,\n ...config.launcher?.dock,\n },\n clearChat: {\n ...DEFAULT_WIDGET_CONFIG.launcher?.clearChat,\n ...config.launcher?.clearChat,\n },\n },\n tooltip: {\n ...DEFAULT_WIDGET_CONFIG.tooltip,\n ...config.tooltip,\n },\n copy: {\n ...DEFAULT_WIDGET_CONFIG.copy,\n ...config.copy,\n },\n sendButton: {\n ...DEFAULT_WIDGET_CONFIG.sendButton,\n ...config.sendButton,\n },\n statusIndicator: {\n ...DEFAULT_WIDGET_CONFIG.statusIndicator,\n ...config.statusIndicator,\n },\n voiceRecognition: {\n ...DEFAULT_WIDGET_CONFIG.voiceRecognition,\n ...config.voiceRecognition,\n },\n features: (() => {\n const da = DEFAULT_WIDGET_CONFIG.features?.artifacts;\n const ca = config.features?.artifacts;\n const dsb = DEFAULT_WIDGET_CONFIG.features?.scrollToBottom;\n const csb = config.features?.scrollToBottom;\n const dsc = DEFAULT_WIDGET_CONFIG.features?.scrollBehavior;\n const csc = config.features?.scrollBehavior;\n const dsa = DEFAULT_WIDGET_CONFIG.features?.streamAnimation;\n const csa = config.features?.streamAnimation;\n const dau = DEFAULT_WIDGET_CONFIG.features?.askUserQuestion;\n const cau = config.features?.askUserQuestion;\n const dh = DEFAULT_WIDGET_CONFIG.features?.history;\n const ch = config.features?.history;\n const mergedArtifacts =\n da === undefined && ca === undefined\n ? undefined\n : {\n ...da,\n ...ca,\n layout: {\n ...da?.layout,\n ...ca?.layout,\n },\n };\n const mergedScrollToBottom =\n dsb === undefined && csb === undefined\n ? undefined\n : {\n ...dsb,\n ...csb,\n };\n const mergedScrollBehavior =\n dsc === undefined && csc === undefined\n ? undefined\n : {\n ...dsc,\n ...csc,\n };\n const mergedStreamAnimation =\n dsa === undefined && csa === undefined\n ? undefined\n : {\n ...dsa,\n ...csa,\n };\n const mergedAskUserQuestion =\n dau === undefined && cau === undefined\n ? undefined\n : {\n ...dau,\n ...cau,\n styles: {\n ...dau?.styles,\n ...cau?.styles,\n },\n };\n const mergedHistory =\n dh === undefined && ch === undefined\n ? undefined\n : {\n ...dh,\n ...ch,\n copy: {\n ...dh?.copy,\n ...ch?.copy,\n },\n };\n return {\n ...DEFAULT_WIDGET_CONFIG.features,\n ...config.features,\n ...(mergedScrollToBottom !== undefined ? { scrollToBottom: mergedScrollToBottom } : {}),\n ...(mergedScrollBehavior !== undefined ? { scrollBehavior: mergedScrollBehavior } : {}),\n ...(mergedArtifacts !== undefined ? { artifacts: mergedArtifacts } : {}),\n ...(mergedStreamAnimation !== undefined ? { streamAnimation: mergedStreamAnimation } : {}),\n ...(mergedAskUserQuestion !== undefined ? { askUserQuestion: mergedAskUserQuestion } : {}),\n ...(mergedHistory !== undefined ? { history: mergedHistory } : {}),\n };\n })(),\n suggestionChips: config.suggestionChips ?? DEFAULT_WIDGET_CONFIG.suggestionChips,\n suggestionChipsConfig: {\n ...DEFAULT_WIDGET_CONFIG.suggestionChipsConfig,\n ...config.suggestionChipsConfig,\n },\n layout: {\n ...DEFAULT_WIDGET_CONFIG.layout,\n ...config.layout,\n header: {\n ...DEFAULT_WIDGET_CONFIG.layout?.header,\n ...config.layout?.header,\n },\n messages: {\n ...DEFAULT_WIDGET_CONFIG.layout?.messages,\n ...config.layout?.messages,\n avatar: {\n ...DEFAULT_WIDGET_CONFIG.layout?.messages?.avatar,\n ...config.layout?.messages?.avatar,\n },\n timestamp: {\n ...DEFAULT_WIDGET_CONFIG.layout?.messages?.timestamp,\n ...config.layout?.messages?.timestamp,\n },\n },\n slots: {\n ...DEFAULT_WIDGET_CONFIG.layout?.slots,\n ...config.layout?.slots,\n },\n },\n markdown: {\n ...DEFAULT_WIDGET_CONFIG.markdown,\n ...config.markdown,\n options: {\n ...DEFAULT_WIDGET_CONFIG.markdown?.options,\n ...config.markdown?.options,\n },\n },\n messageActions: {\n ...DEFAULT_WIDGET_CONFIG.messageActions,\n ...config.messageActions,\n },\n };\n}\n","import type {\n DeepPartial,\n PersonaTheme,\n ResolvedToken,\n ThemeValidationResult,\n ThemeValidationError,\n CreateThemeOptions,\n ComponentTokens,\n SemanticTokens,\n} from '../types/theme';\nimport {\n DEFAULT_FLOATING_LAUNCHER_MAX_WIDTH,\n DEFAULT_FLOATING_LAUNCHER_WIDTH,\n} from '../defaults';\n\n// Detached/docked panel defaults, shared by the panel token defaults, the alias\n// fallbacks below, host-layout, the theme editor, and the artifact gate.\nexport const DEFAULT_PANEL_INSET = '16px';\nexport const DEFAULT_PANEL_CANVAS_BACKGROUND = 'transparent';\n\nconst spacing = (() => {\n const s: Record<number, string> = {};\n for (const k of [0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64])\n s[k] = k === 0 ? '0px' : `${k / 4}rem`;\n return s as Record<0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16 | 20 | 24 | 32 | 40 | 48 | 56 | 64, string>;\n})();\n\nexport const DEFAULT_PALETTE = {\n colors: {\n primary: {\n 50: '#ffffff',\n 100: '#f5f5f5',\n 200: '#d4d4d4',\n 300: '#a3a3a3',\n 400: '#737373',\n 500: '#171717',\n 600: '#0f0f0f',\n 700: '#0a0a0a',\n 800: '#050505',\n 900: '#030303',\n 950: '#000000',\n },\n secondary: {\n 50: '#f5f3ff',\n 100: '#ede9fe',\n 200: '#ddd6fe',\n 300: '#c4b5fd',\n 400: '#a78bfa',\n 500: '#8b5cf6',\n 600: '#7c3aed',\n 700: '#6d28d9',\n 800: '#5b21b6',\n 900: '#4c1d95',\n 950: '#2e1065',\n },\n accent: {\n 50: '#ecfeff',\n 100: '#cffafe',\n 200: '#a5f3fc',\n 300: '#67e8f9',\n 400: '#22d3ee',\n 500: '#06b6d4',\n 600: '#0891b2',\n 700: '#0e7490',\n 800: '#155e75',\n 900: '#164e63',\n 950: '#083344',\n },\n gray: {\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n success: {\n 50: '#f0fdf4',\n 100: '#dcfce7',\n 200: '#bbf7d0',\n 300: '#86efac',\n 400: '#4ade80',\n 500: '#22c55e',\n 600: '#16a34a',\n 700: '#15803d',\n 800: '#166534',\n 900: '#14532d',\n },\n warning: {\n 50: '#fefce8',\n 100: '#fef9c3',\n 200: '#fef08a',\n 300: '#fde047',\n 400: '#facc15',\n 500: '#eab308',\n 600: '#ca8a04',\n 700: '#a16207',\n 800: '#854d0e',\n 900: '#713f12',\n },\n error: {\n 50: '#fef2f2',\n 100: '#fee2e2',\n 200: '#fecaca',\n 300: '#fca5a5',\n 400: '#f87171',\n 500: '#ef4444',\n 600: '#dc2626',\n 700: '#b91c1c',\n 800: '#991b1b',\n 900: '#7f1d1d',\n },\n info: {\n 50: '#eff6ff',\n 100: '#dbeafe',\n 200: '#bfdbfe',\n 300: '#93c5fd',\n 400: '#60a5fa',\n 500: '#3b82f6',\n 600: '#2563eb',\n 700: '#1d4ed8',\n 800: '#1e40af',\n 900: '#1e3a8a',\n 950: '#172554',\n },\n purple: {\n 50: '#faf5ff',\n 100: '#f3e8ff',\n 200: '#e9d5ff',\n 300: '#d8b4fe',\n 400: '#c084fc',\n 500: '#a855f7',\n 600: '#9333ea',\n 700: '#7e22ce',\n 800: '#6b21a8',\n 900: '#581c87',\n 950: '#3b0764',\n },\n teal: {\n 50: '#f0fdfa',\n 100: '#ccfbf1',\n 200: '#99f6e4',\n 300: '#5eead4',\n 400: '#2dd4bf',\n 500: '#14b8a6',\n 600: '#0d9488',\n 700: '#0f766e',\n 800: '#115e59',\n 900: '#134e4a',\n 950: '#042f2e',\n },\n },\n spacing,\n typography: {\n fontFamily: {\n sans: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n serif: 'Georgia, Cambria, \"Times New Roman\", Times, serif',\n mono: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n },\n fontSize: {\n xs: '0.75rem',\n sm: '0.875rem',\n base: '1rem',\n lg: '1.125rem',\n xl: '1.25rem',\n '2xl': '1.5rem',\n '3xl': '1.875rem',\n '4xl': '2.25rem',\n },\n fontWeight: {\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n },\n lineHeight: {\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.625',\n },\n },\n shadows: {\n none: 'none',\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n '2xl': '0 25px 50px -12px rgb(0 0 0 / 0.25)',\n },\n borders: {\n none: 'none',\n sm: '1px solid',\n md: '2px solid',\n lg: '4px solid',\n },\n radius: {\n none: '0px',\n sm: '0.125rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n '2xl': '1rem',\n full: '9999px',\n },\n};\n\nexport const DEFAULT_SEMANTIC: SemanticTokens = {\n colors: {\n primary: 'palette.colors.primary.500',\n secondary: 'palette.colors.secondary.500',\n // Links/Focus role: solid primary\n accent: 'palette.colors.primary.600',\n // Surfaces role: soft gray\n surface: 'palette.colors.gray.50',\n background: 'palette.colors.gray.50',\n container: 'palette.colors.gray.50',\n text: 'palette.colors.gray.900',\n textMuted: 'palette.colors.gray.500',\n textInverse: 'palette.colors.gray.50',\n // Borders role: soft gray\n border: 'palette.colors.gray.200',\n divider: 'palette.colors.gray.200',\n interactive: {\n // Primary Actions role: solid primary\n default: 'palette.colors.primary.600',\n hover: 'palette.colors.primary.700',\n // Links/Focus role: solid primary\n focus: 'palette.colors.primary.600',\n active: 'palette.colors.primary.600',\n disabled: 'palette.colors.gray.300',\n },\n feedback: {\n success: 'palette.colors.success.500',\n warning: 'palette.colors.warning.500',\n error: 'palette.colors.error.500',\n info: 'palette.colors.info.500',\n },\n },\n spacing: {\n xs: 'palette.spacing.1',\n sm: 'palette.spacing.2',\n md: 'palette.spacing.4',\n lg: 'palette.spacing.6',\n xl: 'palette.spacing.8',\n '2xl': 'palette.spacing.10',\n },\n typography: {\n fontFamily: 'palette.typography.fontFamily.sans',\n fontSize: 'palette.typography.fontSize.base',\n fontWeight: 'palette.typography.fontWeight.normal',\n lineHeight: 'palette.typography.lineHeight.normal',\n },\n};\n\nexport const DEFAULT_COMPONENTS: ComponentTokens = {\n button: {\n primary: {\n // Primary Actions role: solid primary\n background: 'palette.colors.primary.500',\n foreground: 'palette.colors.primary.50',\n borderRadius: 'palette.radius.lg',\n padding: 'semantic.spacing.md',\n },\n secondary: {\n background: 'semantic.colors.surface',\n foreground: 'semantic.colors.secondary',\n borderRadius: 'palette.radius.lg',\n padding: 'semantic.spacing.md',\n },\n ghost: {\n background: 'transparent',\n foreground: 'semantic.colors.text',\n borderRadius: 'palette.radius.md',\n padding: 'semantic.spacing.sm',\n // Subtle neutral tint on hover — the composer's transparent icon buttons\n // (attachment, mention) read this via `--persona-button-ghost-hover-bg`.\n hoverBackground: 'rgba(0, 0, 0, 0.05)',\n },\n },\n input: {\n // Input role: semantic surface so host light/dark schemes cascade.\n background: 'semantic.colors.surface',\n placeholder: 'semantic.colors.textMuted',\n borderRadius: 'palette.radius.lg',\n padding: 'semantic.spacing.md',\n focus: {\n border: 'palette.colors.gray.400',\n ring: 'palette.colors.gray.400',\n },\n },\n launcher: {\n // Launcher pill role: shared surface/primary tones until a host overrides.\n background: 'semantic.colors.surface',\n foreground: 'semantic.colors.primary',\n border: 'semantic.colors.border',\n size: '60px',\n iconSize: '28px',\n borderRadius: 'palette.radius.full',\n shadow: 'palette.shadows.lg',\n },\n panel: {\n width: DEFAULT_FLOATING_LAUNCHER_WIDTH,\n maxWidth: DEFAULT_FLOATING_LAUNCHER_MAX_WIDTH,\n height: '600px',\n maxHeight: 'calc(100vh - 80px)',\n borderRadius: 'palette.radius.xl',\n shadow: 'palette.shadows.xl',\n inset: DEFAULT_PANEL_INSET,\n canvasBackground: DEFAULT_PANEL_CANVAS_BACKGROUND,\n },\n header: {\n // Header role: solid primary. Border, subtitle, and action icons stay\n // unset so they derive from this background/foreground pair.\n background: 'palette.colors.primary.500',\n foreground: 'palette.colors.primary.50',\n borderRadius: 'palette.radius.xl palette.radius.xl 0 0',\n padding: 'semantic.spacing.md',\n iconBackground: 'palette.colors.primary.600',\n iconForeground: 'palette.colors.primary.50',\n },\n message: {\n user: {\n // User Messages role: solid primary\n background: 'palette.colors.primary.500',\n text: 'palette.colors.primary.50',\n borderRadius: 'palette.radius.lg',\n shadow: 'palette.shadows.sm',\n },\n assistant: {\n // Assistant Messages role: semantic neutral container.\n background: 'semantic.colors.container',\n text: 'semantic.colors.text',\n borderRadius: 'palette.radius.lg',\n border: 'semantic.colors.border',\n shadow: 'palette.shadows.sm',\n },\n border: 'semantic.colors.border',\n },\n introCard: {\n // Flat by default: the greeting reads as plain text on the transcript\n // background (the industry norm), not an elevated card.\n background: 'transparent',\n borderRadius: 'palette.radius.2xl',\n padding: 'semantic.spacing.lg',\n shadow: 'palette.shadows.none',\n },\n suggestion: {\n chip: {\n background: 'semantic.colors.surface',\n foreground: 'semantic.colors.text',\n border: 'semantic.colors.border',\n borderRadius: 'palette.radius.full',\n padding: '0.5rem 0.875rem',\n gap: '0.5rem',\n itemGap: '8px',\n minHeight: '36px',\n fontSize: '0.8125rem',\n lineHeight: '1.25',\n iconSize: '16px',\n hoverBackground: 'palette.colors.gray.100',\n hoverBorder: 'palette.colors.gray.300',\n pressedBackground: 'palette.colors.gray.200',\n focusRing: 'semantic.colors.interactive.focus',\n disabledOpacity: '0.5',\n },\n card: {\n background: 'semantic.colors.surface',\n foreground: 'semantic.colors.text',\n border: 'semantic.colors.border',\n borderRadius: 'palette.radius.xl',\n padding: '1rem',\n shadow: 'palette.shadows.sm',\n gap: '0.625rem',\n itemGap: '8px',\n minHeight: '72px',\n fontSize: '0.875rem',\n lineHeight: '1.35',\n iconSize: '18px',\n hoverBackground: 'palette.colors.gray.100',\n hoverBorder: 'palette.colors.gray.300',\n pressedBackground: 'palette.colors.gray.200',\n focusRing: 'semantic.colors.interactive.focus',\n disabledOpacity: '0.5',\n },\n list: {\n background: 'transparent',\n foreground: 'semantic.colors.text',\n border: 'semantic.colors.border',\n borderRadius: 'palette.radius.md',\n padding: '0.75rem',\n gap: '0.625rem',\n itemGap: '8px',\n minHeight: '44px',\n fontSize: '0.875rem',\n lineHeight: '1.35',\n iconSize: '17px',\n hoverBackground: 'palette.colors.gray.100',\n hoverBorder: 'palette.colors.gray.300',\n pressedBackground: 'palette.colors.gray.200',\n focusRing: 'semantic.colors.interactive.focus',\n disabledOpacity: '0.5',\n },\n },\n toolBubble: {\n shadow: 'palette.shadows.sm',\n },\n reasoningBubble: {\n shadow: 'palette.shadows.sm',\n },\n composer: {\n shadow: 'palette.shadows.none',\n },\n scrollbar: {\n thumb: 'semantic.colors.border',\n track: 'transparent',\n },\n markdown: {\n inlineCode: {\n background: 'palette.colors.gray.50',\n foreground: 'palette.colors.gray.900',\n },\n link: {\n // Links/Focus role: solid primary\n foreground: 'palette.colors.primary.600',\n },\n prose: {\n fontFamily: 'inherit',\n },\n codeBlock: {\n background: 'semantic.colors.container',\n borderColor: 'semantic.colors.border',\n textColor: 'inherit',\n borderRadius: 'palette.radius.md',\n },\n table: {\n headerBackground: 'semantic.colors.container',\n borderColor: 'semantic.colors.border',\n },\n hr: {\n color: 'semantic.colors.divider',\n },\n blockquote: {\n borderColor: 'palette.colors.gray.900',\n background: 'transparent',\n textColor: 'palette.colors.gray.500',\n },\n },\n collapsibleWidget: {\n container: 'palette.colors.gray.50',\n surface: 'semantic.colors.surface',\n border: 'semantic.colors.border',\n },\n voice: {\n recording: {\n indicator: 'palette.colors.error.500',\n background: 'palette.colors.error.50',\n border: 'palette.colors.error.200',\n },\n processing: {\n icon: 'palette.colors.primary.500',\n background: 'palette.colors.primary.50',\n },\n speaking: {\n icon: 'palette.colors.success.500',\n },\n },\n // Neutral surface card (components/approval-actions.ts). The primary action\n // anchors to the brand primary; deny is a neutral tinted button. Consumers who\n // themed these (or set config.approval.* color overrides) still win.\n approval: {\n requested: {\n background: 'semantic.colors.surface',\n border: 'semantic.colors.border',\n text: 'palette.colors.gray.900',\n shadow: '0 1px 2px 0 rgba(11, 11, 11, 0.06), 0 2px 8px 0 rgba(11, 11, 11, 0.04)',\n },\n approve: {\n background: 'semantic.colors.primary',\n foreground: 'semantic.colors.textInverse',\n borderRadius: 'palette.radius.md',\n padding: 'semantic.spacing.sm',\n },\n deny: {\n background: 'semantic.colors.container',\n foreground: 'semantic.colors.text',\n borderRadius: 'palette.radius.md',\n padding: 'semantic.spacing.sm',\n },\n },\n attachment: {\n image: {\n background: 'palette.colors.gray.100',\n border: 'palette.colors.gray.200',\n },\n },\n // Event-stream badge chips: 100-tone fill / dark text per family. tool/agent\n // keep their pre-token literals (#6b21a8 / #115e59), which sit at the 800\n // step of the canonical purple/teal ramps.\n eventStream: {\n badge: {\n flow: { background: 'palette.colors.success.100', foreground: 'palette.colors.success.700' },\n step: { background: 'palette.colors.primary.100', foreground: 'palette.colors.primary.700' },\n reasoning: { background: 'palette.colors.warning.100', foreground: 'palette.colors.warning.700' },\n tool: { background: 'palette.colors.purple.100', foreground: 'palette.colors.purple.800' },\n agent: { background: 'palette.colors.teal.100', foreground: 'palette.colors.teal.800' },\n error: { background: 'palette.colors.error.100', foreground: 'palette.colors.error.700' },\n default: { background: 'palette.colors.gray.100', foreground: 'palette.colors.gray.600' },\n },\n },\n scrollToBottom: {\n background: 'components.button.primary.background',\n foreground: 'components.button.primary.foreground',\n border: 'semantic.colors.primary',\n size: '40px',\n borderRadius: 'palette.radius.full',\n shadow: 'palette.shadows.sm',\n padding: '0.5rem 0.875rem',\n gap: '0.5rem',\n fontSize: '0.875rem',\n iconSize: '14px',\n },\n artifact: {\n pane: {\n background: 'semantic.colors.container',\n toolbarBackground: 'semantic.colors.container',\n },\n },\n};\n\nexport function resolveTokenValue(theme: PersonaTheme, path: string): string | undefined {\n if (\n !path.startsWith('palette.') &&\n !path.startsWith('semantic.') &&\n !path.startsWith('components.')\n ) {\n return path;\n }\n\n const parts = path.split('.');\n let current: any = theme;\n\n for (const part of parts) {\n if (current === undefined || current === null) {\n return undefined;\n }\n current = current[part];\n }\n\n if (\n typeof current === 'string' &&\n (current.startsWith('palette.') ||\n current.startsWith('semantic.') ||\n current.startsWith('components.'))\n ) {\n return resolveTokenValue(theme, current);\n }\n\n return current;\n}\n\nexport function resolveTokens(theme: PersonaTheme): Record<string, ResolvedToken> {\n const resolved: Record<string, ResolvedToken> = {};\n\n function resolveObject(obj: any, prefix: string) {\n for (const [key, value] of Object.entries(obj)) {\n const path = `${prefix}.${key}`;\n\n if (typeof value === 'string') {\n const resolvedValue = resolveTokenValue(theme, value);\n if (resolvedValue !== undefined) {\n resolved[path] = {\n path,\n value: resolvedValue,\n type:\n prefix.includes('color')\n ? 'color'\n : prefix.includes('spacing')\n ? 'spacing'\n : prefix.includes('typography')\n ? 'typography'\n : prefix.includes('shadow')\n ? 'shadow'\n : prefix.includes('border')\n ? 'border'\n : 'color',\n };\n }\n } else if (typeof value === 'object' && value !== null) {\n resolveObject(value, path);\n }\n }\n }\n\n resolveObject(theme.palette, 'palette');\n resolveObject(theme.semantic, 'semantic');\n resolveObject(theme.components, 'components');\n\n return resolved;\n}\n\nexport function validateTheme(theme: Partial<PersonaTheme>): ThemeValidationResult {\n const errors: ThemeValidationError[] = [];\n const warnings: ThemeValidationError[] = [];\n\n if (!theme.palette) {\n errors.push({\n path: 'palette',\n message: 'Theme must include a palette',\n severity: 'error',\n });\n }\n\n if (!theme.semantic) {\n warnings.push({\n path: 'semantic',\n message: 'No semantic tokens defined - defaults will be used',\n severity: 'warning',\n });\n }\n\n if (!theme.components) {\n warnings.push({\n path: 'components',\n message: 'No component tokens defined - defaults will be used',\n severity: 'warning',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nfunction mergeRecords(\n base: Record<string, unknown>,\n override: Record<string, unknown>\n): Record<string, unknown> {\n const result = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const existing = result[key];\n if (existing && typeof existing === 'object' && !Array.isArray(existing) &&\n value && typeof value === 'object' && !Array.isArray(value)) {\n result[key] = mergeRecords(\n existing as Record<string, unknown>,\n value as Record<string, unknown>\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction deepMergeComponents(\n base: ComponentTokens,\n override?: Partial<ComponentTokens>\n): ComponentTokens {\n if (!override) return base;\n return mergeRecords(\n base as unknown as Record<string, unknown>,\n override as unknown as Record<string, unknown>\n ) as unknown as ComponentTokens;\n}\n\nexport function createTheme(\n userConfig?: DeepPartial<PersonaTheme>,\n options: CreateThemeOptions = {}\n): PersonaTheme {\n const baseTheme: PersonaTheme = {\n palette: DEFAULT_PALETTE as PersonaTheme['palette'],\n semantic: DEFAULT_SEMANTIC as PersonaTheme['semantic'],\n components: DEFAULT_COMPONENTS as PersonaTheme['components'],\n };\n\n let theme: PersonaTheme = {\n palette: {\n ...baseTheme.palette,\n ...userConfig?.palette,\n colors: {\n ...baseTheme.palette.colors,\n ...userConfig?.palette?.colors,\n },\n spacing: {\n ...baseTheme.palette.spacing,\n ...userConfig?.palette?.spacing,\n },\n typography: {\n ...baseTheme.palette.typography,\n ...userConfig?.palette?.typography,\n },\n shadows: {\n ...baseTheme.palette.shadows,\n ...userConfig?.palette?.shadows,\n },\n borders: {\n ...baseTheme.palette.borders,\n ...userConfig?.palette?.borders,\n },\n radius: {\n ...baseTheme.palette.radius,\n ...userConfig?.palette?.radius,\n },\n },\n semantic: {\n ...baseTheme.semantic,\n ...userConfig?.semantic,\n colors: {\n ...baseTheme.semantic.colors,\n ...userConfig?.semantic?.colors,\n interactive: {\n ...baseTheme.semantic.colors.interactive,\n ...userConfig?.semantic?.colors?.interactive,\n },\n feedback: {\n ...baseTheme.semantic.colors.feedback,\n ...userConfig?.semantic?.colors?.feedback,\n },\n },\n spacing: {\n ...baseTheme.semantic.spacing,\n ...userConfig?.semantic?.spacing,\n },\n typography: {\n ...baseTheme.semantic.typography,\n ...userConfig?.semantic?.typography,\n },\n },\n components: deepMergeComponents(\n baseTheme.components,\n userConfig?.components as Partial<ComponentTokens> | undefined\n ),\n } as PersonaTheme;\n\n if (options.validate !== false) {\n const validation = validateTheme(theme);\n if (!validation.valid) {\n throw new Error(\n `Theme validation failed: ${validation.errors.map((e) => e.message).join(', ')}`\n );\n }\n }\n\n if (options.plugins) {\n for (const plugin of options.plugins) {\n theme = plugin.transform(theme);\n }\n }\n\n return theme;\n}\n\n/** Coerce a unitless \"0\" to \"0px\" for vars consumed inside length calc()s. */\nconst zeroLength = (value: string): string => (value.trim() === '0' ? '0px' : value);\n\nconst V = '--persona-';\n\n/**\n * WCAG relative luminance of a hex (3/4/6/8 digit) or rgb()/rgba() color.\n * Returns undefined when the value is not parseable, so callers can fall back.\n */\nconst relativeLuminance = (color: string | undefined): number | undefined => {\n if (!color) return undefined;\n const value = color.trim().toLowerCase();\n let channels: number[] | undefined;\n\n if (value.charCodeAt(0) === 35 /* '#' */) {\n const digits = value.slice(1);\n if (!/^[0-9a-f]+$/.test(digits)) return undefined;\n if (digits.length === 3 || digits.length === 4) {\n channels = [0, 1, 2].map((i) => parseInt(digits[i] + digits[i], 16));\n } else if (digits.length === 6 || digits.length === 8) {\n channels = [0, 2, 4].map((i) => parseInt(digits.slice(i, i + 2), 16));\n }\n } else {\n const match = value.match(/^rgba?\\(([^)]+)\\)$/);\n if (match) {\n const parts = match[1].split(/[,/\\s]+/).filter(Boolean);\n if (parts.length >= 3) {\n channels = parts.slice(0, 3).map((raw) => {\n const pct = raw.endsWith('%');\n const n = parseFloat(pct ? raw.slice(0, -1) : raw);\n return pct ? (n / 100) * 255 : n;\n });\n }\n }\n }\n\n if (!channels || channels.some((c) => !Number.isFinite(c))) return undefined;\n const [r, g, b] = channels.map((c) => {\n const v = Math.max(0, Math.min(255, c)) / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\n/** Below the WCAG white/black crossover luminance, white text reads better. */\nconst DARK_SURFACE_LUMINANCE = 0.179;\n\n/**\n * Each row: [aliasSuffix, ...sources]. A source starting with '=' is a\n * literal; anything else is a cssVars lookup by suffix. First defined wins;\n * rows with no defined source emit nothing. Row order is significant.\n */\ntype AliasRow = [string, ...string[]];\n\nconst emitAliases = (cssVars: Record<string, string>, rows: AliasRow[]): void => {\n for (const [alias, ...sources] of rows) {\n let value: string | undefined;\n for (const s of sources) {\n value = s.charCodeAt(0) === 61 /* '=' */ ? s.slice(1) : cssVars[V + s];\n if (value !== undefined) break;\n }\n if (value !== undefined) cssVars[V + alias] = value;\n }\n};\n\nexport function themeToCssVariables(theme: PersonaTheme): Record<string, string> {\n const resolved = resolveTokens(theme);\n const cssVars: Record<string, string> = {};\n\n for (const [path, token] of Object.entries(resolved)) {\n const varName = path.replace(/\\./g, '-');\n cssVars[`--persona-${varName}`] = token.value;\n }\n\n emitAliases(cssVars, [\n ['primary', 'semantic-colors-primary', 'palette-colors-primary-500'],\n ['secondary', 'semantic-colors-secondary', 'palette-colors-secondary-500'],\n ['accent', 'semantic-colors-accent', 'palette-colors-accent-500'],\n ['surface', 'semantic-colors-surface', 'palette-colors-gray-50'],\n ['background', 'semantic-colors-background', 'palette-colors-gray-50'],\n ['container', 'semantic-colors-container', 'palette-colors-gray-100'],\n ['text', 'semantic-colors-text', 'palette-colors-gray-900'],\n ['text-muted', 'semantic-colors-text-muted', 'palette-colors-gray-500'],\n ['text-inverse', 'semantic-colors-text-inverse', 'palette-colors-gray-50'],\n ['border', 'semantic-colors-border', 'palette-colors-gray-200'],\n ['divider', 'semantic-colors-divider', 'palette-colors-gray-200'],\n ['muted', 'text-muted'],\n ['voice-recording-indicator', 'components-voice-recording-indicator', 'palette-colors-error-500'],\n ['voice-recording-bg', 'components-voice-recording-background', 'palette-colors-error-50'],\n ['voice-processing-icon', 'components-voice-processing-icon', 'palette-colors-primary-500'],\n ['voice-speaking-icon', 'components-voice-speaking-icon', 'palette-colors-success-500'],\n ['approval-bg', 'components-approval-requested-background', 'surface'],\n ['approval-border', 'components-approval-requested-border', 'border'],\n ['approval-text', 'components-approval-requested-text', 'palette-colors-gray-900'],\n ['approval-shadow', 'components-approval-requested-shadow', '=0 1px 2px 0 rgba(11, 11, 11, 0.06), 0 2px 8px 0 rgba(11, 11, 11, 0.04)'],\n ['approval-approve-bg', 'components-approval-approve-background', 'button-primary-bg'],\n ['approval-deny-bg', 'components-approval-deny-background', 'container'],\n ['attachment-image-bg', 'components-attachment-image-background', 'palette-colors-gray-100'],\n ['attachment-image-border', 'components-attachment-image-border', 'palette-colors-gray-200'],\n ['font-family', 'semantic-typography-fontFamily', 'palette-typography-fontFamily-sans'],\n ['font-size', 'semantic-typography-fontSize', 'palette-typography-fontSize-base'],\n ['font-weight', 'semantic-typography-fontWeight', 'palette-typography-fontWeight-normal'],\n ['line-height', 'semantic-typography-lineHeight', 'palette-typography-lineHeight-normal'],\n ['input-font-family', 'font-family'],\n ['input-font-weight', 'font-weight'],\n ['radius-sm', 'palette-radius-sm', '=0.125rem'],\n ['radius-md', 'palette-radius-md', '=0.375rem'],\n ['radius-lg', 'palette-radius-lg', '=0.5rem'],\n ['radius-xl', 'palette-radius-xl', '=0.75rem'],\n ['radius-full', 'palette-radius-full', '=9999px'],\n ['launcher-radius', 'components-launcher-borderRadius', 'palette-radius-full', '=9999px'],\n ['launcher-bg', 'components-launcher-background', 'surface'],\n ['launcher-fg', 'components-launcher-foreground', 'primary'],\n ]);\n // Subtitle keeps the shared muted tone while the foreground is stock (it\n // resolves to primary); a custom foreground washes to 70% so both pill\n // text lines recolor together. Compared by resolved value, not key\n // presence: DEFAULT_COMPONENTS materializes launcher.foreground into\n // every theme.\n const launcherFg = cssVars['--persona-components-launcher-foreground'];\n cssVars['--persona-launcher-fg-muted'] =\n launcherFg && launcherFg !== cssVars['--persona-primary']\n ? `color-mix(in srgb, ${launcherFg} 70%, transparent)`\n : cssVars['--persona-muted'];\n\n emitAliases(cssVars, [\n ['launcher-border', 'components-launcher-border', 'border'],\n ['button-primary-bg', 'components-button-primary-background', 'primary'],\n ['button-primary-fg', 'components-button-primary-foreground', 'text-inverse'],\n ['button-radius', 'components-button-primary-borderRadius', 'palette-radius-full', '=9999px'],\n // Stop-state send button. No fallback source: widget.css carries the idle\n // appearance in its var() fallbacks, so an unset token must stay undefined.\n ['button-stop-bg', 'components-button-stop-background'],\n ['button-stop-fg', 'components-button-stop-foreground'],\n ]);\n\n // Ghost variant: transparent, neutral-foreground icon buttons (the composer's\n // attachment + mention affordances). Wired to `components.button.ghost.*`.\n emitAliases(cssVars, [\n ['button-ghost-bg', 'components-button-ghost-background', '=transparent'],\n ['button-ghost-fg', 'components-button-ghost-foreground', 'text'],\n ['button-ghost-radius', 'components-button-ghost-borderRadius', 'radius-md', '=0.375rem'],\n ['button-ghost-hover-bg', 'components-button-ghost-hoverBackground', '=rgba(0, 0, 0, 0.05)'],\n ['panel-radius', 'components-panel-borderRadius', 'radius-xl', '=0.75rem'],\n ]);\n\n cssVars['--persona-panel-border'] =\n cssVars['--persona-components-panel-border'] ?? `1px solid ${cssVars['--persona-border']}`;\n\n emitAliases(cssVars, [\n ['panel-shadow', 'components-panel-shadow', 'palette-shadows-xl', '=0 25px 50px -12px rgba(0, 0, 0, 0.25)'],\n ]);\n\n cssVars['--persona-panel-inset'] =\n cssVars['--persona-components-panel-inset'] ?? DEFAULT_PANEL_INSET;\n cssVars['--persona-panel-canvas-bg'] =\n cssVars['--persona-components-panel-canvasBackground'] ?? DEFAULT_PANEL_CANVAS_BACKGROUND;\n\n emitAliases(cssVars, [\n ['launcher-shadow', 'components-launcher-shadow', '=0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)'],\n ['input-radius', 'components-input-borderRadius', 'radius-lg', '=0.5rem'],\n ['message-user-radius', 'components-message-user-borderRadius', 'radius-lg', '=0.5rem'],\n ['message-assistant-radius', 'components-message-assistant-borderRadius', 'radius-lg', '=0.5rem'],\n ]);\n\n // Component-level color overrides: these map component tokens to\n // dedicated CSS variables that the widget CSS reads for individual elements.\n emitAliases(cssVars, [\n ['header-bg', 'components-header-background', 'surface'],\n ]);\n\n // The background/foreground pair anchors every other header color: unset\n // text and border keys mix the two rather than falling back to page chrome.\n const headerBg = cssVars['--persona-header-bg'];\n const headerFg = cssVars['--persona-components-header-foreground'];\n const headerMutedFg = headerFg ? `color-mix(in srgb, ${headerFg} 72%, ${headerBg})` : undefined;\n cssVars['--persona-header-border'] =\n cssVars['--persona-components-header-border'] ??\n (headerFg ? `color-mix(in srgb, ${headerFg} 14%, ${headerBg})` : undefined) ??\n cssVars['--persona-divider'];\n\n emitAliases(cssVars, [\n ['header-icon-bg', 'components-header-iconBackground', 'primary'],\n ['header-icon-fg', 'components-header-iconForeground', 'text-inverse'],\n ]);\n\n // `title.color` / `subtitle.color` supersede the legacy *Foreground tokens.\n cssVars['--persona-header-title-fg'] =\n cssVars['--persona-components-header-title-color'] ??\n cssVars['--persona-components-header-titleForeground'] ??\n headerFg ??\n cssVars['--persona-primary'];\n cssVars['--persona-header-subtitle-fg'] =\n cssVars['--persona-components-header-subtitle-color'] ??\n cssVars['--persona-components-header-subtitleForeground'] ??\n headerMutedFg ??\n cssVars['--persona-text-muted'];\n cssVars['--persona-header-action-icon-fg'] =\n cssVars['--persona-components-header-actionIconForeground'] ??\n headerMutedFg ??\n cssVars['--persona-muted'];\n\n // Unified header control box. Every header icon button reads these two from\n // the stylesheet; per-control config keys stay inline and win. The third\n // control token, `header.controlStrokeWidth`, needs no alias: widget.css\n // reads its auto-emitted `--persona-components-header-controlStrokeWidth`\n // directly and carries the 1.5 default in the var() fallback.\n emitAliases(cssVars, [\n ['header-control-size', 'components-header-controlSize', '=32px'],\n ['header-control-icon-size', 'components-header-controlIconSize', '=20px'],\n ]);\n\n const headerTokens = theme.components?.header;\n if (headerTokens?.shadow) cssVars['--persona-header-shadow'] = headerTokens.shadow;\n if (headerTokens?.borderBottom) cssVars['--persona-header-border-bottom'] = headerTokens.borderBottom;\n // Conditional: the stylesheet carries `auto` / the rail's own fallback chain,\n // so an unset token must leave the variable undefined.\n if (headerTokens?.minHeight) cssVars['--persona-header-min-height'] = headerTokens.minHeight;\n\n // Messages rail header strip. Same conditional rule: the chunk's CSS carries\n // the surface/border/height fallback chain when a theme says nothing.\n const railHeaderBg = cssVars['--persona-components-history-railHeader-background'];\n if (railHeaderBg) cssVars['--persona-history-rail-header-bg'] = railHeaderBg;\n const railHeaderBorder = cssVars['--persona-components-history-railHeader-border'];\n if (railHeaderBorder) cssVars['--persona-history-rail-header-border'] = railHeaderBorder;\n const railHeaderMinHeight = cssVars['--persona-components-history-railHeader-minHeight'];\n if (railHeaderMinHeight)\n cssVars['--persona-history-rail-header-min-height'] = railHeaderMinHeight;\n\n // Floating (overlay-collapsed) rail. Same conditional rule: the host's\n // inline styles carry every default in their var() fallback.\n for (const [token, alias] of [\n ['margin', 'margin'],\n ['borderRadius', 'radius'],\n ['shadow', 'shadow'],\n ['background', 'bg'],\n ] as const) {\n const value = cssVars[`--persona-components-history-overlay-${token}`];\n if (value) cssVars[`--persona-history-overlay-${alias}`] = value;\n }\n\n // Row overflow menu. Same conditional rule: the chunk's CSS carries the\n // elevated color-mix default in its var() fallback.\n for (const [token, alias] of [\n ['background', 'bg'],\n ['borderRadius', 'radius'],\n ] as const) {\n const value = cssVars[`--persona-components-history-menu-${token}`];\n if (value) cssVars[`--persona-history-menu-${alias}`] = value;\n }\n // Messages enter/exit motion. Read straight off the theme: durations are\n // authored as bare millisecond NUMBERS, and resolveTokens collects only\n // string leaves, so these never reach the flattened vars. A unitless value\n // gains \"ms\" for the CSS animation shorthand; 0 emits \"0ms\" (leg disabled).\n const historyMotion = theme.components?.history?.motion;\n if (historyMotion) {\n const asTime = (value: number | string | undefined): string | undefined => {\n if (value === undefined) return undefined;\n const s = String(value).trim();\n return /^\\d+(\\.\\d+)?$/.test(s) ? `${s}ms` : s;\n };\n const enterMs = asTime(historyMotion.enterDurationMs);\n if (enterMs !== undefined) cssVars['--persona-history-enter-ms'] = enterMs;\n const exitMs = asTime(historyMotion.exitDurationMs);\n if (exitMs !== undefined) cssVars['--persona-history-exit-ms'] = exitMs;\n if (historyMotion.enterEasing)\n cssVars['--persona-history-enter-easing'] = historyMotion.enterEasing;\n if (historyMotion.exitEasing)\n cssVars['--persona-history-exit-easing'] = historyMotion.exitEasing;\n }\n // Destructive action text. The chunk falls back to the light-surface\n // error-600; the built-in dark theme sets this to a passing lighter red.\n const historyDangerFg = cssVars['--persona-components-history-dangerForeground'];\n if (historyDangerFg) cssVars['--persona-history-danger-fg'] = historyDangerFg;\n // Confirmation dialog. The danger fill/label pair is always emitted so the\n // dialog follows the error palette; scrim and shadow stay conditional with\n // the dialog's inline fallbacks as the defaults.\n cssVars['--persona-danger'] =\n cssVars['--persona-components-history-confirm-dangerBackground'] ??\n cssVars['--persona-palette-colors-error-700'] ??\n '#b42318';\n cssVars['--persona-danger-fg'] =\n cssVars['--persona-components-history-confirm-dangerForeground'] ?? '#ffffff';\n for (const token of ['scrim', 'shadow'] as const) {\n const value = cssVars[`--persona-components-history-confirm-${token}`];\n if (value) cssVars[`--persona-history-confirm-${token}`] = value;\n }\n\n // Portaled control tooltip. Same conditional rule: widget.css carries the\n // built-in look in every var() fallback, so an unset token stays undefined.\n for (const [token, alias] of [\n ['background', 'background'],\n ['foreground', 'foreground'],\n ['hintForeground', 'hint-fg'],\n ['borderRadius', 'radius'],\n ['fontSize', 'font-size'],\n ['padding', 'padding'],\n ['maxWidth', 'max-width'],\n ['shadow', 'shadow'],\n ]) {\n const value = cssVars[`--persona-components-tooltip-${token}`];\n if (value) cssVars[`--persona-tooltip-${alias}`] = value;\n }\n // Booleans never resolve into a token, so the arrow reads off the theme.\n if (theme.components?.tooltip?.arrow === false)\n cssVars['--persona-tooltip-arrow-display'] = 'none';\n\n // Per-message action row (copy, vote, read aloud). Same conditional rule:\n // widget.css falls back to the scheme-aware ghost wash and semantic text, so\n // an unset token must leave the variable undefined.\n for (const [token, alias] of [\n ['background', 'bg'],\n ['border', 'border'],\n ['hoverBackground', 'hover-bg'],\n ['hoverForeground', 'hover-fg'],\n ['borderRadius', 'radius'],\n ] as const) {\n const value = cssVars[`--persona-components-messageActions-${token}`];\n if (value) cssVars[`--persona-message-action-${alias}`] = value;\n }\n\n // Intro card aliases: short names the panel inline-styles read directly.\n // The full-path `--persona-components-introCard-*` variables auto-emit above.\n // Default is flat (transparent, no shadow): the greeting renders as plain\n // text on the transcript background; set introCard tokens for a card look.\n emitAliases(cssVars, [\n ['intro-card-bg', 'components-introCard-background', '=transparent'],\n ['intro-card-radius', 'components-introCard-borderRadius', '=1rem'],\n ]);\n\n // Flat cards (transparent background, no shadow) drop the horizontal\n // component of the stock padding so the welcome text shares the content\n // column's left edge instead of carrying an invisible card inset. Compared\n // by resolved value, not key presence: DEFAULT_COMPONENTS materializes the\n // introCard tokens into every theme. A non-stock padding is emitted as-is;\n // '1.5rem 1.5rem' forces the symmetric inset on a flat card.\n const introBg = cssVars['--persona-components-introCard-background'];\n const introShadow = cssVars['--persona-components-introCard-shadow'];\n const introCardFlat =\n (!introBg || introBg === 'transparent' || introBg === 'none') &&\n (!introShadow || introShadow === 'none');\n const introPadding =\n cssVars['--persona-components-introCard-padding'] ?? '1.5rem';\n cssVars['--persona-intro-card-padding'] =\n introCardFlat && introPadding === '1.5rem' ? '1.5rem 0' : introPadding;\n\n emitAliases(cssVars, [\n ['intro-card-shadow', 'components-introCard-shadow', '=none'],\n ['intro-card-border', 'components-introCard-border', '=none'],\n ['input-background', 'components-input-background', 'surface'],\n ['input-placeholder', 'components-input-placeholder', 'text-muted'],\n ['input-backdrop-filter', 'components-input-backdropFilter', '=none'],\n ['message-user-bg', 'components-message-user-background', 'accent'],\n ['message-user-text', 'components-message-user-text', 'text-inverse'],\n ['message-user-shadow', 'components-message-user-shadow', '=0 5px 15px rgba(15, 23, 42, 0.08)'],\n ['message-assistant-bg', 'components-message-assistant-background', 'surface'],\n ['message-assistant-text', 'components-message-assistant-text', 'text'],\n ['message-assistant-border', 'components-message-assistant-border', 'border'],\n ['message-assistant-shadow', 'components-message-assistant-shadow', '=0 1px 2px 0 rgb(0 0 0 / 0.05)'],\n ['scroll-to-bottom-bg', 'components-scrollToBottom-background', 'button-primary-bg', 'accent'],\n ['scroll-to-bottom-fg', 'components-scrollToBottom-foreground', 'button-primary-fg', 'text-inverse'],\n ['scroll-to-bottom-border', 'components-scrollToBottom-border', 'primary'],\n ['scroll-to-bottom-size', 'components-scrollToBottom-size', '=40px'],\n ['scroll-to-bottom-radius', 'components-scrollToBottom-borderRadius', 'button-radius', 'radius-full', '=9999px'],\n ['scroll-to-bottom-shadow', 'components-scrollToBottom-shadow', 'palette-shadows-sm', '=0 1px 2px 0 rgb(0 0 0 / 0.05)'],\n ['scroll-to-bottom-padding', 'components-scrollToBottom-padding', '=0.5rem 0.875rem'],\n ['scroll-to-bottom-gap', 'components-scrollToBottom-gap', '=0.5rem'],\n ['scroll-to-bottom-font-size', 'components-scrollToBottom-fontSize', 'palette-typography-fontSize-sm', '=0.875rem'],\n ['scroll-to-bottom-icon-size', 'components-scrollToBottom-iconSize', '=14px'],\n // Event-stream badge chips. Materialized in every theme (light defaults in\n // DEFAULT_COMPONENTS, dark pairs in the built-in dark layer), so the\n // chip's inline var() refs always resolve inside a themed root and\n // re-resolve on scheme toggles; the literal terminals only cover unthemed\n // direct mounts.\n ['event-badge-flow-bg', 'components-eventStream-badge-flow-background', '=#dcfce7'],\n ['event-badge-flow-fg', 'components-eventStream-badge-flow-foreground', '=#15803d'],\n ['event-badge-step-bg', 'components-eventStream-badge-step-background', '=#f5f5f5'],\n ['event-badge-step-fg', 'components-eventStream-badge-step-foreground', '=#0a0a0a'],\n ['event-badge-reasoning-bg', 'components-eventStream-badge-reasoning-background', '=#fef9c3'],\n ['event-badge-reasoning-fg', 'components-eventStream-badge-reasoning-foreground', '=#a16207'],\n ['event-badge-tool-bg', 'components-eventStream-badge-tool-background', '=#f3e8ff'],\n ['event-badge-tool-fg', 'components-eventStream-badge-tool-foreground', '=#6b21a8'],\n ['event-badge-agent-bg', 'components-eventStream-badge-agent-background', '=#ccfbf1'],\n ['event-badge-agent-fg', 'components-eventStream-badge-agent-foreground', '=#115e59'],\n ['event-badge-error-bg', 'components-eventStream-badge-error-background', '=#fee2e2'],\n ['event-badge-error-fg', 'components-eventStream-badge-error-foreground', '=#b91c1c'],\n ['event-badge-default-bg', 'components-eventStream-badge-default-background', '=#f3f4f6'],\n ['event-badge-default-fg', 'components-eventStream-badge-default-foreground', '=#4b5563'],\n ['tool-bubble-shadow', 'components-toolBubble-shadow', '=0 5px 15px rgba(15, 23, 42, 0.08)'],\n ['reasoning-bubble-shadow', 'components-reasoningBubble-shadow', '=0 5px 15px rgba(15, 23, 42, 0.08)'],\n ['composer-shadow', 'components-composer-shadow', '=none'],\n ]);\n\n // Composer spacing/type. Fallbacks reproduce the utility classes the form\n // used to carry (`px-4 py-3`, `gap-2`, `text-sm`) exactly.\n emitAliases(cssVars, [\n ['composer-padding', 'components-composer-padding', '=0.75rem 1rem'],\n ['composer-gap', 'components-composer-gap', '=0.5rem'],\n ['composer-font-size', 'components-composer-fontSize', '=0.875rem'],\n ['composer-line-height', 'components-composer-lineHeight', '=1.25rem'],\n // Unified composer control box. Every icon control in the action row reads\n // these two from the stylesheet; per-control config keys stay inline and win.\n ['composer-control-size', 'components-composer-controlSize', '=40px'],\n ['composer-control-icon-size', 'components-composer-controlIconSize', '=24px'],\n // Motion: one timing pair + easing for every composer animation. A `0ms`\n // duration is a kill switch; reduced-motion is enforced in CSS on top.\n ['motion-duration-fast', 'components-motion-durationFast', '=120ms'],\n ['motion-duration-base', 'components-motion-durationBase', '=200ms'],\n ['motion-easing', 'components-motion-easing', '=cubic-bezier(0.2, 0, 0, 1)'],\n ['composer-border-color', 'components-composer-borderColor', 'border', '=#e5e7eb'],\n ['composer-overlay-band', 'components-composer-overlayBand', '=transparent'],\n // `components.composer.segmented.*`, `.modelPicker.*`, and `.overflowMenu.*`\n // get no short aliases: the rows cost gzip in the critical launcher bundle,\n // which never draws a composer. widget.css reads the auto-emitted full\n // paths, like introCard title/subtitle.\n ['scrollbar-thumb', 'components-scrollbar-thumb', 'border', '=#e5e7eb'],\n ['scrollbar-track', 'components-scrollbar-track', '=transparent'],\n ['md-inline-code-bg', 'components-markdown-inlineCode-background', 'container'],\n ['md-inline-code-color', 'components-markdown-inlineCode-foreground', 'text'],\n ['md-link-color', 'components-markdown-link-foreground', 'accent', '=#0f0f0f'],\n ]);\n\n const mdH1Size = cssVars['--persona-components-markdown-heading-h1-fontSize'];\n if (mdH1Size) cssVars['--persona-md-h1-size'] = mdH1Size;\n const mdH1Weight = cssVars['--persona-components-markdown-heading-h1-fontWeight'];\n if (mdH1Weight) cssVars['--persona-md-h1-weight'] = mdH1Weight;\n const mdH2Size = cssVars['--persona-components-markdown-heading-h2-fontSize'];\n if (mdH2Size) cssVars['--persona-md-h2-size'] = mdH2Size;\n const mdH2Weight = cssVars['--persona-components-markdown-heading-h2-fontWeight'];\n if (mdH2Weight) cssVars['--persona-md-h2-weight'] = mdH2Weight;\n\n const mdProseFont = cssVars['--persona-components-markdown-prose-fontFamily'];\n if (mdProseFont && mdProseFont !== 'inherit') {\n cssVars['--persona-md-prose-font-family'] = mdProseFont;\n }\n\n // Markdown code block\n emitAliases(cssVars, [\n ['md-code-block-bg', 'components-markdown-codeBlock-background', 'container'],\n ['md-code-block-border-color', 'components-markdown-codeBlock-borderColor', 'border'],\n ['md-code-block-text-color', 'components-markdown-codeBlock-textColor', '=inherit'],\n ]);\n\n // Follows the palette radius so square-corner themes get square code blocks;\n // the 0.375rem fallback matches palette.radius.md's default.\n emitAliases(cssVars, [\n ['md-code-block-border-radius', 'components-markdown-codeBlock-borderRadius', 'radius-md', '=0.375rem'],\n ]);\n\n // Markdown table\n emitAliases(cssVars, [\n ['md-table-header-bg', 'components-markdown-table-headerBackground', 'container'],\n ['md-table-border-color', 'components-markdown-table-borderColor', 'border'],\n ]);\n\n // Markdown HR\n emitAliases(cssVars, [\n ['md-hr-color', 'components-markdown-hr-color', 'divider'],\n ]);\n\n // Markdown blockquote\n emitAliases(cssVars, [\n ['md-blockquote-border-color', 'components-markdown-blockquote-borderColor', 'palette-colors-gray-900'],\n ['md-blockquote-bg', 'components-markdown-blockquote-background', '=transparent'],\n ['md-blockquote-text-color', 'components-markdown-blockquote-textColor', 'palette-colors-gray-500'],\n ]);\n\n // Collapsible widget chrome (tool/reasoning/approval bubbles)\n cssVars['--cw-container'] =\n cssVars['--persona-components-collapsibleWidget-container'] ?? cssVars['--persona-surface'];\n cssVars['--cw-surface'] =\n cssVars['--persona-components-collapsibleWidget-surface'] ?? cssVars['--persona-surface'];\n cssVars['--cw-border'] =\n cssVars['--persona-components-collapsibleWidget-border'] ?? cssVars['--persona-border'];\n\n emitAliases(cssVars, [\n ['message-border', 'components-message-border', 'border'],\n ]);\n\n // Bubble geometry/type per role. No fallback source: the message layout\n // preset's value is carried in the consuming var() fallback (inline on the\n // bubble for type/padding, in widget.css for the row width cap), so an unset\n // token must leave the variable undefined.\n emitAliases(cssVars, [\n ['message-user-padding', 'components-message-user-padding'],\n ['message-user-max-width', 'components-message-user-maxWidth'],\n ['message-user-font-size', 'components-message-user-fontSize'],\n ['message-user-font-family', 'components-message-user-fontFamily'],\n ['message-user-line-height', 'components-message-user-lineHeight'],\n ['message-assistant-padding', 'components-message-assistant-padding'],\n ['message-assistant-max-width', 'components-message-assistant-maxWidth'],\n ['message-assistant-font-size', 'components-message-assistant-fontSize'],\n ['message-assistant-font-family', 'components-message-assistant-fontFamily'],\n ['message-assistant-line-height', 'components-message-assistant-lineHeight'],\n ]);\n\n // Icon button tokens\n const components = theme.components;\n const iconBtn = components?.iconButton;\n if (iconBtn) {\n if (iconBtn.background) cssVars['--persona-icon-btn-bg'] = iconBtn.background;\n if (iconBtn.border) cssVars['--persona-icon-btn-border'] = iconBtn.border;\n if (iconBtn.color) cssVars['--persona-icon-btn-color'] = iconBtn.color;\n if (iconBtn.padding) cssVars['--persona-icon-btn-padding'] = iconBtn.padding;\n if (iconBtn.borderRadius) cssVars['--persona-icon-btn-radius'] = iconBtn.borderRadius;\n if (iconBtn.hoverBackground) cssVars['--persona-icon-btn-hover-bg'] = iconBtn.hoverBackground;\n if (iconBtn.hoverColor) cssVars['--persona-icon-btn-hover-color'] = iconBtn.hoverColor;\n if (iconBtn.activeBackground) cssVars['--persona-icon-btn-active-bg'] = iconBtn.activeBackground;\n if (iconBtn.activeBorder) cssVars['--persona-icon-btn-active-border'] = iconBtn.activeBorder;\n }\n\n // Label button tokens\n const labelBtn = components?.labelButton;\n if (labelBtn) {\n if (labelBtn.background) cssVars['--persona-label-btn-bg'] = labelBtn.background;\n if (labelBtn.border) cssVars['--persona-label-btn-border'] = labelBtn.border;\n if (labelBtn.color) cssVars['--persona-label-btn-color'] = labelBtn.color;\n if (labelBtn.padding) cssVars['--persona-label-btn-padding'] = labelBtn.padding;\n if (labelBtn.borderRadius) cssVars['--persona-label-btn-radius'] = labelBtn.borderRadius;\n if (labelBtn.hoverBackground) cssVars['--persona-label-btn-hover-bg'] = labelBtn.hoverBackground;\n if (labelBtn.fontSize) cssVars['--persona-label-btn-font-size'] = labelBtn.fontSize;\n if (labelBtn.gap) cssVars['--persona-label-btn-gap'] = labelBtn.gap;\n }\n\n // Toggle group tokens\n const toggleGrp = components?.toggleGroup;\n if (toggleGrp) {\n if (toggleGrp.gap) cssVars['--persona-toggle-group-gap'] = toggleGrp.gap;\n if (toggleGrp.borderRadius) cssVars['--persona-toggle-group-radius'] = toggleGrp.borderRadius;\n }\n\n // Artifact tokens\n const artifact = components?.artifact;\n if (artifact?.toolbar) {\n const t = artifact.toolbar;\n if (t.iconHoverColor) cssVars['--persona-artifact-toolbar-icon-hover-color'] = t.iconHoverColor;\n if (t.iconHoverBackground) cssVars['--persona-artifact-toolbar-icon-hover-bg'] = t.iconHoverBackground;\n if (t.iconPadding) cssVars['--persona-artifact-toolbar-icon-padding'] = t.iconPadding;\n if (t.iconBorderRadius) cssVars['--persona-artifact-toolbar-icon-radius'] = t.iconBorderRadius;\n if (t.iconBorder) cssVars['--persona-artifact-toolbar-icon-border'] = t.iconBorder;\n // A bare \"0\" is a <number> in calc(), not a <length>; gap/padding feed the\n // toggle thumb's width calc, so a unitless zero would zero out the thumb.\n if (t.toggleGroupGap) cssVars['--persona-artifact-toolbar-toggle-group-gap'] = zeroLength(t.toggleGroupGap);\n if (t.toggleBorderRadius) cssVars['--persona-artifact-toolbar-toggle-radius'] = t.toggleBorderRadius;\n if (t.toggleGroupPadding) cssVars['--persona-artifact-toolbar-toggle-group-padding'] = zeroLength(t.toggleGroupPadding);\n if (t.toggleGroupBorder) cssVars['--persona-artifact-toolbar-toggle-group-border'] = t.toggleGroupBorder;\n if (t.toggleGroupBorderRadius) cssVars['--persona-artifact-toolbar-toggle-group-radius'] = t.toggleGroupBorderRadius;\n if (t.toggleGroupBackground) cssVars['--persona-artifact-toolbar-toggle-group-bg'] = resolveTokenValue(theme, t.toggleGroupBackground) ?? t.toggleGroupBackground;\n if (t.copyBackground) cssVars['--persona-artifact-toolbar-copy-bg'] = t.copyBackground;\n if (t.copyBorder) cssVars['--persona-artifact-toolbar-copy-border'] = t.copyBorder;\n if (t.copyColor) cssVars['--persona-artifact-toolbar-copy-color'] = t.copyColor;\n // Feeds the split-button halves' inner-radius calc; must stay a <length>.\n if (t.copyBorderRadius) cssVars['--persona-artifact-toolbar-copy-radius'] = zeroLength(t.copyBorderRadius);\n if (t.copyPadding) cssVars['--persona-artifact-toolbar-copy-padding'] = t.copyPadding;\n if (t.copyMenuBackground) {\n cssVars['--persona-artifact-toolbar-copy-menu-bg'] = t.copyMenuBackground;\n cssVars['--persona-dropdown-bg'] = cssVars['--persona-dropdown-bg'] ?? t.copyMenuBackground;\n }\n if (t.copyMenuBorder) {\n cssVars['--persona-artifact-toolbar-copy-menu-border'] = t.copyMenuBorder;\n cssVars['--persona-dropdown-border'] = cssVars['--persona-dropdown-border'] ?? t.copyMenuBorder;\n }\n if (t.copyMenuShadow) {\n cssVars['--persona-artifact-toolbar-copy-menu-shadow'] = t.copyMenuShadow;\n cssVars['--persona-dropdown-shadow'] = cssVars['--persona-dropdown-shadow'] ?? t.copyMenuShadow;\n }\n if (t.copyMenuBorderRadius) {\n cssVars['--persona-artifact-toolbar-copy-menu-radius'] = t.copyMenuBorderRadius;\n cssVars['--persona-dropdown-radius'] = cssVars['--persona-dropdown-radius'] ?? t.copyMenuBorderRadius;\n }\n if (t.copyMenuItemHoverBackground) {\n cssVars['--persona-artifact-toolbar-copy-menu-item-hover-bg'] = t.copyMenuItemHoverBackground;\n cssVars['--persona-dropdown-item-hover-bg'] = cssVars['--persona-dropdown-item-hover-bg'] ?? t.copyMenuItemHoverBackground;\n }\n if (t.iconBackground) cssVars['--persona-artifact-toolbar-icon-bg'] = t.iconBackground;\n if (t.toolbarBorder) cssVars['--persona-artifact-toolbar-border'] = t.toolbarBorder;\n }\n if (artifact?.tab) {\n const t = artifact.tab;\n if (t.background) cssVars['--persona-artifact-tab-bg'] = t.background;\n if (t.activeBackground) cssVars['--persona-artifact-tab-active-bg'] = t.activeBackground;\n if (t.activeBorder) cssVars['--persona-artifact-tab-active-border'] = t.activeBorder;\n if (t.borderRadius) cssVars['--persona-artifact-tab-radius'] = t.borderRadius;\n if (t.textColor) cssVars['--persona-artifact-tab-color'] = t.textColor;\n if (t.hoverBackground) cssVars['--persona-artifact-tab-hover-bg'] = t.hoverBackground;\n if (t.listBackground) cssVars['--persona-artifact-tab-list-bg'] = t.listBackground;\n if (t.listBorderColor) cssVars['--persona-artifact-tab-list-border-color'] = t.listBorderColor;\n if (t.listPadding) cssVars['--persona-artifact-tab-list-padding'] = t.listPadding;\n }\n if (artifact?.pane) {\n const t = artifact.pane;\n if (t.toolbarBackground) {\n const toolbarBg =\n resolveTokenValue(theme, t.toolbarBackground) ?? t.toolbarBackground;\n cssVars['--persona-artifact-toolbar-bg'] = toolbarBg;\n }\n }\n if (artifact?.card) {\n const t = artifact.card;\n if (t.background) cssVars['--persona-artifact-card-bg'] = t.background;\n if (t.border) cssVars['--persona-artifact-card-border'] = t.border;\n if (t.borderRadius) cssVars['--persona-artifact-card-radius'] = t.borderRadius;\n if (t.hoverBackground) cssVars['--persona-artifact-card-hover-bg'] = t.hoverBackground;\n if (t.hoverBorderColor) cssVars['--persona-artifact-card-hover-border'] = t.hoverBorderColor;\n }\n if (artifact?.inline) {\n const t = artifact.inline;\n if (t.background) {\n cssVars['--persona-artifact-inline-bg'] =\n resolveTokenValue(theme, t.background) ?? t.background;\n }\n if (t.border) cssVars['--persona-artifact-inline-border'] = t.border;\n if (t.borderRadius) cssVars['--persona-artifact-inline-radius'] = t.borderRadius;\n if (t.chromeBackground) {\n cssVars['--persona-artifact-inline-chrome-bg'] =\n resolveTokenValue(theme, t.chromeBackground) ?? t.chromeBackground;\n }\n if (t.chromeBorder) {\n cssVars['--persona-artifact-inline-chrome-border'] =\n resolveTokenValue(theme, t.chromeBorder) ?? t.chromeBorder;\n }\n if (t.titleColor) {\n cssVars['--persona-artifact-inline-title-color'] =\n resolveTokenValue(theme, t.titleColor) ?? t.titleColor;\n }\n if (t.mutedColor) {\n cssVars['--persona-artifact-inline-muted-color'] =\n resolveTokenValue(theme, t.mutedColor) ?? t.mutedColor;\n }\n if (t.frameHeight) cssVars['--persona-artifact-inline-frame-height'] = t.frameHeight;\n }\n\n // Code (syntax-highlighted artifact source view) tokens.\n const code = components?.code;\n if (code) {\n if (code.keywordColor) cssVars['--persona-code-keyword-color'] = code.keywordColor;\n if (code.stringColor) cssVars['--persona-code-string-color'] = code.stringColor;\n if (code.commentColor) cssVars['--persona-code-comment-color'] = code.commentColor;\n if (code.numberColor) cssVars['--persona-code-number-color'] = code.numberColor;\n if (code.tagColor) cssVars['--persona-code-tag-color'] = code.tagColor;\n if (code.attrColor) cssVars['--persona-code-attr-color'] = code.attrColor;\n if (code.propertyColor) cssVars['--persona-code-property-color'] = code.propertyColor;\n if (code.lineNumberColor) cssVars['--persona-code-line-number-color'] = code.lineNumberColor;\n if (code.gutterBorderColor) cssVars['--persona-code-gutter-border-color'] = code.gutterBorderColor;\n if (code.background)\n cssVars['--persona-code-bg'] = resolveTokenValue(theme, code.background) ?? code.background;\n }\n\n // Interactive-state defaults. The default preset resolves container === surface,\n // which turns every hover/active rule that falls back to --persona-container\n // into a visual no-op; anchor those states one gray step down in that case.\n // A flat DARK surface takes white-alpha washes instead: light grays paint a\n // near-white pill under light text. Unparseable surfaces keep the grays.\n // Component config emitted above must keep winning, so only fill vars not set.\n const stateSurface = cssVars['--persona-surface'];\n const stateContainer = cssVars['--persona-container'];\n const gray100 = cssVars['--persona-palette-colors-gray-100'] ?? '#f3f4f6';\n const gray200 = cssVars['--persona-palette-colors-gray-200'] ?? '#e5e7eb';\n const gray300 = cssVars['--persona-palette-colors-gray-300'] ?? '#d1d5db';\n const flatTheme = !stateContainer || stateContainer === stateSurface;\n const flatLuminance = relativeLuminance(stateSurface ?? cssVars['--persona-background']);\n const flatDark = flatTheme && flatLuminance !== undefined && flatLuminance < DARK_SURFACE_LUMINANCE;\n const flatHoverBg = flatDark ? 'rgba(255, 255, 255, 0.08)' : gray100;\n const flatActiveBg = flatDark ? 'rgba(255, 255, 255, 0.12)' : gray200;\n const flatActiveBorder = flatDark ? 'rgba(255, 255, 255, 0.16)' : gray300;\n const hoverBgDefault = flatTheme ? flatHoverBg : stateContainer;\n const activeBgDefault = flatTheme ? flatActiveBg : stateContainer;\n cssVars['--persona-icon-btn-hover-bg'] = cssVars['--persona-icon-btn-hover-bg'] ?? hoverBgDefault;\n cssVars['--persona-icon-btn-active-bg'] = cssVars['--persona-icon-btn-active-bg'] ?? activeBgDefault;\n if (flatTheme) {\n cssVars['--persona-icon-btn-active-border'] =\n cssVars['--persona-icon-btn-active-border'] ?? flatActiveBorder;\n }\n cssVars['--persona-label-btn-hover-bg'] = cssVars['--persona-label-btn-hover-bg'] ?? hoverBgDefault;\n cssVars['--persona-artifact-tab-hover-bg'] =\n cssVars['--persona-artifact-tab-hover-bg'] ?? hoverBgDefault;\n cssVars['--persona-artifact-card-hover-bg'] =\n cssVars['--persona-artifact-card-hover-bg'] ?? hoverBgDefault;\n\n return cssVars;\n}\n\nexport function applyThemeVariables(element: HTMLElement, theme: PersonaTheme): void {\n const cssVars = themeToCssVariables(theme);\n\n for (const [name, value] of Object.entries(cssVars)) {\n element.style.setProperty(name, value);\n }\n}\n\n/**\n * Stable `data-persona-theme-zone` values applied to key widget regions.\n * Visual editors should use `[data-persona-theme-zone=\"header\"]` selectors\n * rather than internal class names.\n */\nexport const THEME_ZONES = {\n header: 'Widget header bar',\n messages: 'Message list area',\n 'user-message': 'User message bubble',\n 'assistant-message': 'Assistant message bubble',\n composer: 'Footer / composer area',\n container: 'Main widget container',\n 'artifact-pane': 'Artifact sidebar',\n 'artifact-toolbar': 'Artifact toolbar',\n 'artifact-inline': 'Inline artifact block',\n 'artifact-inline-chrome': 'Inline artifact title bar',\n} as const;\n\nexport type ThemeZone = keyof typeof THEME_ZONES;\n","import type { DeepPartial, PersonaTheme } from '../types/theme';\nimport type { AgentWidgetConfig } from '../types';\nimport { createTheme, resolveTokens, themeToCssVariables } from './tokens';\nimport { deepMerge } from './deep-merge';\n\nexport type ColorScheme = 'light' | 'dark' | 'auto';\n\nexport interface PersonaWidgetConfig {\n theme?: DeepPartial<PersonaTheme>;\n darkTheme?: DeepPartial<PersonaTheme>;\n colorScheme?: ColorScheme;\n}\n\ntype WidgetConfig = PersonaWidgetConfig | AgentWidgetConfig;\n\nconst DARK_PALETTE = {\n colors: {\n primary: {\n 50: '#ffffff',\n 100: '#f5f5f5',\n 200: '#d4d4d4',\n 300: '#a3a3a3',\n 400: '#737373',\n 500: '#171717',\n 600: '#0f0f0f',\n 700: '#0a0a0a',\n 800: '#050505',\n 900: '#030303',\n 950: '#000000',\n },\n secondary: {\n 50: '#f5f3ff',\n 100: '#ede9fe',\n 200: '#ddd6fe',\n 300: '#c4b5fd',\n 400: '#a78bfa',\n 500: '#8b5cf6',\n 600: '#7c3aed',\n 700: '#6d28d9',\n 800: '#5b21b6',\n 900: '#4c1d95',\n 950: '#2e1065',\n },\n accent: {\n 50: '#ecfeff',\n 100: '#cffafe',\n 200: '#a5f3fc',\n 300: '#67e8f9',\n 400: '#22d3ee',\n 500: '#06b6d4',\n 600: '#0891b2',\n 700: '#0e7490',\n 800: '#155e75',\n 900: '#164e63',\n 950: '#083344',\n },\n gray: {\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n success: {\n 50: '#f0fdf4',\n 100: '#dcfce7',\n 200: '#bbf7d0',\n 300: '#86efac',\n 400: '#4ade80',\n 500: '#22c55e',\n 600: '#16a34a',\n 700: '#15803d',\n 800: '#166534',\n 900: '#14532d',\n },\n warning: {\n 50: '#fefce8',\n 100: '#fef9c3',\n 200: '#fef08a',\n 300: '#fde047',\n 400: '#facc15',\n 500: '#eab308',\n 600: '#ca8a04',\n 700: '#a16207',\n 800: '#854d0e',\n 900: '#713f12',\n },\n error: {\n 50: '#fef2f2',\n 100: '#fee2e2',\n 200: '#fecaca',\n 300: '#fca5a5',\n 400: '#f87171',\n 500: '#ef4444',\n 600: '#dc2626',\n 700: '#b91c1c',\n 800: '#991b1b',\n 900: '#7f1d1d',\n },\n },\n};\n\n/**\n * Component defaults that only hold in a dark color scheme. Layered UNDER the\n * host's theme, so any explicit value still wins.\n *\n * The ghost hover wash must invert with the scheme: 5% black is invisible on a\n * near-black surface, so every dark scheme gets a light alpha instead.\n */\nconst DARK_COMPONENTS: DeepPartial<PersonaTheme> = {\n components: {\n button: {\n ghost: {\n hoverBackground: 'rgba(255, 255, 255, 0.08)',\n },\n },\n markdown: {\n link: {\n // primary.600 is #0f0f0f in both palettes; on a charcoal bubble that\n // fails AA. primary.300 (#a3a3a3) is ~5.8:1 on gray.800 and still\n // distinct from body text (gray.100).\n foreground: 'palette.colors.primary.300',\n },\n },\n // Event-stream badge chips flip to a 900-tone fill with a 300-tone text\n // (primary is the inverted dark ramp, so 800/200 lands the same way).\n // The light defaults are 100-tone fills that read as glowing swatches on\n // a dark panel; every pair here keeps >=4.5:1 text contrast (locked by\n // event-stream-badge-theming.test.ts).\n eventStream: {\n badge: {\n flow: { background: 'palette.colors.success.900', foreground: 'palette.colors.success.300' },\n step: { background: 'palette.colors.primary.800', foreground: 'palette.colors.primary.200' },\n reasoning: { background: 'palette.colors.warning.900', foreground: 'palette.colors.warning.300' },\n tool: { background: 'palette.colors.purple.900', foreground: 'palette.colors.purple.300' },\n agent: { background: 'palette.colors.teal.900', foreground: 'palette.colors.teal.300' },\n error: { background: 'palette.colors.error.900', foreground: 'palette.colors.error.300' },\n default: { background: 'palette.colors.gray.800', foreground: 'palette.colors.gray.300' },\n },\n },\n history: {\n // error-400: the light-surface error-600 red lands ~3:1 on dark\n // surfaces, under the 4.5:1 AA floor for the 14px destructive labels.\n dangerForeground: '#f87171',\n confirm: {\n // error-600: bright enough to read as a control against a dark\n // surface (3:1 non-text) while the white label keeps 4.8:1.\n dangerBackground: 'palette.colors.error.600',\n // 45% slate darkens near-black surfaces by almost nothing; dark\n // schemes need a heavier dimmer for the modal to read as modal.\n scrim: 'rgba(0, 0, 0, 0.6)',\n },\n },\n },\n};\n\n/**\n * Normalize theme config for merging; rejects non-objects.\n */\nconst normalizeThemeConfig = (\n theme: DeepPartial<PersonaTheme> | Record<string, unknown> | undefined\n): DeepPartial<PersonaTheme> | undefined => {\n if (!theme || typeof theme !== 'object' || Array.isArray(theme)) return undefined;\n return theme as DeepPartial<PersonaTheme>;\n};\n\nexport const detectColorScheme = (): 'light' | 'dark' => {\n if (typeof document !== 'undefined' && document.documentElement.classList.contains('dark')) {\n return 'dark';\n }\n\n if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n\n return 'light';\n};\n\nconst getColorSchemeFromConfig = (config?: WidgetConfig): 'light' | 'dark' => {\n const colorScheme = config?.colorScheme ?? 'light';\n\n if (colorScheme === 'light') return 'light';\n if (colorScheme === 'dark') return 'dark';\n\n return detectColorScheme();\n};\n\nexport const getColorScheme = (config?: WidgetConfig): 'light' | 'dark' => {\n return getColorSchemeFromConfig(config);\n};\n\nexport const createLightTheme = (userConfig?: DeepPartial<PersonaTheme>): PersonaTheme => {\n return createTheme(userConfig);\n};\n\nexport const createDarkTheme = (userConfig?: DeepPartial<PersonaTheme>): PersonaTheme => {\n // createTheme() already merges every palette sub-object (radius, typography,\n // shadows, …) over the defaults, so only the dark color scales need to be\n // layered UNDER the user's colors here. Spreading a pre-built default\n // palette instead would clobber the user's non-color palette overrides\n // (radius/typography) in dark mode while light mode honored them.\n //\n // DARK_COMPONENTS goes underneath by deep merge, not spread: a shallow\n // spread of `components` would drop the dark ghost hover the moment a host\n // set any unrelated component token.\n const config = (deepMerge(\n DARK_COMPONENTS as Record<string, unknown>,\n (userConfig ?? {}) as Record<string, unknown>\n ) ?? {}) as DeepPartial<PersonaTheme>;\n\n return createTheme(\n {\n ...config,\n palette: {\n ...config.palette,\n colors: {\n ...DARK_PALETTE.colors,\n ...config.palette?.colors,\n },\n },\n },\n { validate: false }\n );\n};\n\nexport const getActiveTheme = (config?: WidgetConfig): PersonaTheme => {\n const scheme = getColorScheme(config);\n const lightThemeConfig = normalizeThemeConfig(config?.theme);\n const darkThemeConfig = normalizeThemeConfig(config?.darkTheme);\n\n if (scheme === 'dark') {\n return createDarkTheme(\n deepMerge(\n (lightThemeConfig ?? {}) as Record<string, unknown>,\n (darkThemeConfig ?? {}) as Record<string, unknown>\n ) as DeepPartial<PersonaTheme>\n );\n }\n\n return createLightTheme(lightThemeConfig);\n};\n\nexport const getCssVariables = (theme: PersonaTheme): Record<string, string> => {\n return themeToCssVariables(theme);\n};\n\nexport const applyThemeVariables = (\n element: HTMLElement,\n config?: WidgetConfig\n): void => {\n const theme = getActiveTheme(config);\n const cssVars = getCssVariables(theme);\n\n for (const [name, value] of Object.entries(cssVars)) {\n element.style.setProperty(name, value);\n }\n\n // Stamp the resolved scheme so stylesheet rules can key scheme-specific\n // defaults (e.g. the syntax-highlight palette) off the widget's own color\n // scheme instead of the OS prefers-color-scheme, which diverges whenever a\n // host pins colorScheme. Re-applied on every theme application, so live\n // config updates and theme-observer callbacks keep it current.\n element.setAttribute(\"data-persona-color-scheme\", getColorScheme(config));\n};\n\nexport const createThemeObserver = (\n callback: (scheme: 'light' | 'dark') => void\n): (() => void) => {\n const cleanupFns: Array<() => void> = [];\n\n if (typeof document !== 'undefined' && typeof MutationObserver !== 'undefined') {\n const observer = new MutationObserver(() => {\n callback(detectColorScheme());\n });\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n cleanupFns.push(() => observer.disconnect());\n }\n\n if (typeof window !== 'undefined' && window.matchMedia) {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => callback(detectColorScheme());\n\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange);\n cleanupFns.push(() => mediaQuery.removeEventListener('change', handleChange));\n } else if (mediaQuery.addListener) {\n mediaQuery.addListener(handleChange);\n cleanupFns.push(() => mediaQuery.removeListener(handleChange));\n }\n }\n\n return () => {\n cleanupFns.forEach((fn) => fn());\n };\n};\n\nexport { createTheme, resolveTokens, themeToCssVariables };\n"],"mappings":"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GACb,mBAAoBC,GACpB,YAAaC,GACb,aAAcC,GACd,OAAUC,GACV,gBAAiBC,EACjB,IAAOC,GACP,UAAaC,GACb,MAASC,GACT,aAAcC,GACd,OAAUC,GACV,KAAQC,GACR,eAAgBC,GAChB,eAAgBC,GAChB,WAAYC,EACZ,OAAUC,GACV,cAAeC,GACf,YAAaC,GACb,OAAUC,GACV,WAAYC,GACZ,EAAKC,GACL,UAAWC,GACX,aAAcC,GACd,cAAeC,GACf,gBAAiBC,GACjB,SAAYC,EACZ,oBAAqBC,EACrB,KAAQC,GACR,aAAcC,EACd,KAAQC,GACR,MAASC,GACT,OAAUC,GACV,MAASC,GACT,UAAWC,GACX,SAAYC,GACZ,SAAYC,GACZ,SAAYC,GACZ,iBAAkBC,GAClB,KAAQC,GACR,IAAOC,GACP,QAAWC,EACb,EASaC,GAAmB,CAC9B,OACA,OACA,QACA,WACA,QACA,WACA,UACA,OACA,MACA,cACA,OACA,QACA,OACA,eACA,WACA,iBACA,OACA,MACA,SACA,QACA,WACA,OACA,QACA,SACA,WACA,YACA,gBACA,eACA,UACA,QACA,MACA,OACA,UACA,SACA,QACA,cACA,UACA,OACA,QACA,WACA,SACA,QACA,OACA,aACA,iBACA,OACA,QACA,UACA,WACA,gBACA,QACA,SACA,cACA,QACA,eACA,WACA,MACA,MACA,OACA,OACA,YACA,UACA,YACF,EAYMC,EAAe,IAAI,IACvB,OAAO,QAAQ1D,EAAiB,CAClC,EAcM2D,EAAe,IAAI,IAErBC,GAAmB,GACjBC,GAAwB,IAAI,IAU5BC,GAAyBC,GAAyB,CACtD,IAAMC,EAAO,CAAC,GAAGH,EAAqB,EAClCE,GAAOF,GAAsB,MAAM,EACvC,QAAWI,KAAMD,EACf,GAAI,CACFC,EAAG,CACL,MAAQ,CAER,CAEJ,EAkBA,IAAMC,GAAmB,IAAc,CACrC,IAAIC,EAAS,EACb,QAAWC,IAAW,CAAC,GAAGC,CAAY,EAAG,CACvC,IAAMC,EAAOC,EAAa,IAAIH,EAAQ,IAAI,EAC1C,GAAI,CAACE,EAAM,SACXD,EAAa,OAAOD,CAAO,EAC3BD,I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","names":["launcher_global_exports","__export","CRITICAL_LAUNCHER_ATTR","mount","createElement","tag","className","element","createNode","tag","options","children","element","name","value","style","source","property","appendable","child","cx","parts","positionMap","isDockedMountMode","config","renderIconNode","iconData","size","color","strokeWidth","svg","elementData","tagName","attrs","element","key","value","createChunkLoader","options","fallbackImport","resetOnSetLoader","loader","moduleCache","loadPromise","l","mod","err","setLoader","load","createChunkLoader","setIconsExtraLoader","loadIconsExtra","Activity","ArrowDown","ArrowLeft","ArrowRight","ArrowUpRight","ArrowUp","AtSign","Bot","Check","ChevronDown","ChevronLeft","ChevronRight","ChevronUp","ClipboardCopy","Clipboard","CodeXml","Copy","Download","EllipsisVertical","Ellipsis","ExternalLink","Eye","FileCode","FileSpreadsheet","FileText","File","History","ImagePlus","LoaderCircle","Loader","Maximize","Menu","MessageSquare","Mic","Minimize","Minus","PanelLeft","Paperclip","Pencil","Plus","Quote","RefreshCw","Search","Send","ShieldAlert","ShieldCheck","ShieldX","Square","Star","ThumbsDown","ThumbsUp","Trash2","Trash","Upload","Volume2","X","CORE_LUCIDE_ICONS","Activity","ArrowDown","ArrowUp","ArrowUpRight","Bot","ChevronDown","ChevronUp","ChevronRight","ChevronLeft","Check","Clipboard","ClipboardCopy","CodeXml","Copy","File","FileCode","FileSpreadsheet","FileText","ImagePlus","Loader","LoaderCircle","Mic","Paperclip","Quote","RefreshCw","Search","Send","ShieldAlert","ShieldCheck","ShieldX","Square","ThumbsDown","ThumbsUp","Upload","Volume2","X","AtSign","ArrowLeft","ArrowRight","ExternalLink","Ellipsis","EllipsisVertical","Menu","PanelLeft","Plus","Minus","Pencil","Trash","Trash2","Download","Maximize","Minimize","MessageSquare","Star","Eye","History","EXTRA_ICON_NAMES","runtimeIcons","pendingIcons","extraIconsLoaded","extraReadySubscribers","notifyExtraIconsReady","final","subs","cb","fillPendingIcons","filled","pending","pendingIcons","data","runtimeIcons","real","renderIconNode","extraIconsKickFailedRetry","kickExtraIcons","loadIconsExtra","mod","extraIconsLoaded","name","data","runtimeIcons","fillPendingIcons","notifyExtraIconsReady","err","createPlaceholderSvg","size","color","strokeWidth","svg","renderLucideIcon","iconName","iconData","renderIconNode","EXTRA_ICON_NAMES","el","pendingIcons","oldest","DEFAULT_OVERLAY_Z_INDEX","PORTALED_OVERLAY_Z_INDEX","createLauncherButton","config","onToggle","button","createElement","update","newConfig","launcher","dockedMode","isDockedMountMode","titleEl","t","subtitleEl","s","textContainer","icon","iconSize","iconSizeNum","iconSvg","renderLucideIcon","img","callToActionIconEl","callToActionIconSize","paddingTotal","containerSize","positionClass","positionMap","floatingBase","dockedBase","DEFAULT_OVERLAY_Z_INDEX","defaultBorder","defaultShadow","destroy","TEASER_KEY_SUFFIX","teaserMemoryDismissed","teaserStorageKey","persist","readTeaserDismissed","key","useStorage","writeTeaserDismissed","prefersReducedMotion","resolveTeaserConfig","teaser","createLauncherSurface","wrapper","currentConfig","teaserConfig","teaserElement","dismissButton","teaserTextButton","timer","visible","shown","consumed","panelOpen","usesStorage","clearTimer","hideBubble","dismiss","consumeForOpen","origin","show","schedule","handleTeaserClick","handleDismissClick","event","removeTeaserElement","buildTeaserElement","createNode","applyPlacement","position","cx","syncTeaser","nextConfig","next","setPanelOpen","open","isObject","value","deepMerge","base","override","merged","key","existing","DEFAULT_FLOATING_LAUNCHER_WIDTH","DEFAULT_FLOATING_LAUNCHER_MAX_WIDTH","DEFAULT_LAUNCHER_CONFIG","DEFAULT_FLOATING_LAUNCHER_WIDTH","DEFAULT_PANEL_INSET","DEFAULT_PANEL_CANVAS_BACKGROUND","spacing","s","k","DEFAULT_PALETTE","DEFAULT_SEMANTIC","DEFAULT_COMPONENTS","DEFAULT_FLOATING_LAUNCHER_WIDTH","DEFAULT_FLOATING_LAUNCHER_MAX_WIDTH","resolveTokenValue","theme","path","parts","current","part","resolveTokens","resolved","resolveObject","obj","prefix","key","value","resolvedValue","validateTheme","errors","warnings","mergeRecords","base","override","result","existing","deepMergeComponents","createTheme","userConfig","options","baseTheme","validation","e","plugin","zeroLength","V","relativeLuminance","color","channels","digits","i","match","raw","pct","n","c","r","g","b","v","DARK_SURFACE_LUMINANCE","emitAliases","cssVars","rows","alias","sources","themeToCssVariables","token","varName","launcherFg","headerBg","headerFg","headerMutedFg","headerTokens","railHeaderBg","railHeaderBorder","railHeaderMinHeight","historyMotion","asTime","enterMs","exitMs","historyDangerFg","introBg","introShadow","introCardFlat","introPadding","mdH1Size","mdH1Weight","mdH2Size","mdH2Weight","mdProseFont","components","iconBtn","labelBtn","toggleGrp","artifact","t","toolbarBg","code","stateSurface","stateContainer","gray100","gray200","gray300","flatTheme","flatLuminance","flatDark","flatHoverBg","flatActiveBg","flatActiveBorder","hoverBgDefault","activeBgDefault","DARK_PALETTE","DARK_COMPONENTS","normalizeThemeConfig","theme","detectColorScheme","getColorSchemeFromConfig","config","colorScheme","getColorScheme","createLightTheme","userConfig","createTheme","createDarkTheme","deepMerge","getActiveTheme","scheme","lightThemeConfig","darkThemeConfig","getCssVariables","themeToCssVariables","applyThemeVariables","element","cssVars","name","value","launcherScriptSrc","setIconsExtraLoader","chunkUrl","CRITICAL_LAUNCHER_ATTR","resolveTarget","target","el","mergeCriticalLauncherConfig","config","DEFAULT_LAUNCHER_CONFIG","mount","options","onOpen","root","applyThemeVariables","surface","createLauncherSurface","next","merged"]}