@walkeros/explorer 0.0.7 → 0.0.8

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/core/css-theme-system.ts","../src/index.ts","../src/core/Component.ts","../src/utils/dom.ts","../src/core/UnifiedHeader.ts","../src/core/UnifiedContainer.ts","../src/core/MultiColumnLayout.ts","../src/utils/syntax.ts","../src/utils/debounce.ts","../src/components/CodeEditor.ts","../src/components/ResultDisplay.ts","../src/utils/evaluation.ts","../src/components/LiveCodeJS.ts","../src/components/Destination.ts"],"sourcesContent":["/**\n * CSS-Based Theme System\n *\n * Uses CSS custom properties with fallback chain for theming.\n * Supports parent theme inheritance (e.g., from website html[data-theme]).\n * Transparent backgrounds by default for embedded usage.\n */\n\nexport const CSS_THEME_VARIABLES = `\n :root,\n [data-theme=\"light\"],\n html[data-theme=\"light\"] .explorer-component,\n html[data-theme=\"light\"] [class*=\"explorer-\"] {\n /* Base colors - transparent by default for website integration */\n --explorer-bg-primary: transparent;\n --explorer-bg-primary-opaque: #ffffff;\n --explorer-bg-secondary: rgba(248, 250, 252, 0.8);\n --explorer-bg-tertiary: rgba(241, 245, 249, 0.9);\n --explorer-bg-input: #fafafa;\n \n /* Text colors */\n --explorer-text-primary: #1f2937;\n --explorer-text-secondary: #6b7280;\n --explorer-text-muted: #9ca3af;\n --explorer-text-inverse: #ffffff;\n \n /* Border colors */\n --explorer-border-primary: #d1d5db;\n --explorer-border-secondary: #e5e7eb;\n --explorer-border-focus: #3b82f6;\n \n /* Action colors */\n --explorer-primary: #3b82f6;\n --explorer-primary-hover: #2563eb;\n --explorer-primary-active: #1d4ed8;\n \n --explorer-success: #10b981;\n --explorer-success-hover: #059669;\n --explorer-success-active: #047857;\n \n --explorer-warning: #f59e0b;\n --explorer-warning-hover: #d97706;\n --explorer-warning-active: #b45309;\n \n --explorer-danger: #ef4444;\n --explorer-danger-hover: #dc2626;\n --explorer-danger-active: #b91c1c;\n \n /* Surface colors */\n --explorer-surface-hover: #f1f5f9;\n --explorer-surface-active: #e2e8f0;\n --explorer-surface-selected: #dbeafe;\n \n /* Shadow colors */\n --explorer-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --explorer-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --explorer-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n \n /* Scrollbar colors */\n --explorer-scrollbar-track: #f1f5f9;\n --explorer-scrollbar-thumb: #cbd5e1;\n --explorer-scrollbar-thumb-hover: #94a3b8;\n }\n\n [data-theme=\"dark\"],\n html[data-theme=\"dark\"] .explorer-component,\n html[data-theme=\"dark\"] [class*=\"explorer-\"] {\n /* Base colors - transparent by default for website integration */\n --explorer-bg-primary: transparent;\n --explorer-bg-primary-opaque: #1f2937;\n --explorer-bg-secondary: rgba(55, 65, 81, 0.8);\n --explorer-bg-tertiary: rgba(75, 85, 99, 0.9);\n --explorer-bg-input: #111827;\n \n /* Text colors */\n --explorer-text-primary: #f3f4f6;\n --explorer-text-secondary: #d1d5db;\n --explorer-text-muted: #9ca3af;\n --explorer-text-inverse: #1f2937;\n \n /* Border colors */\n --explorer-border-primary: #374151;\n --explorer-border-secondary: #4b5563;\n --explorer-border-focus: #3b82f6;\n \n /* Action colors remain the same for consistency */\n --explorer-primary: #3b82f6;\n --explorer-primary-hover: #2563eb;\n --explorer-primary-active: #1d4ed8;\n \n --explorer-success: #10b981;\n --explorer-success-hover: #059669;\n --explorer-success-active: #047857;\n \n --explorer-warning: #f59e0b;\n --explorer-warning-hover: #d97706;\n --explorer-warning-active: #b45309;\n \n --explorer-danger: #ef4444;\n --explorer-danger-hover: #dc2626;\n --explorer-danger-active: #b91c1c;\n \n /* Surface colors */\n --explorer-surface-hover: #374151;\n --explorer-surface-active: #4b5563;\n --explorer-surface-selected: #1e3a8a;\n \n /* Shadow colors */\n --explorer-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);\n --explorer-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2);\n --explorer-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2);\n \n /* Scrollbar colors */\n --explorer-scrollbar-track: #374151;\n --explorer-scrollbar-thumb: #6b7280;\n --explorer-scrollbar-thumb-hover: #9ca3af;\n }\n`;\n\nexport const CSS_COMPONENT_STYLES = `\n /* Base component styles */\n .explorer-component {\n color: var(--explorer-text-primary);\n background-color: var(--explorer-bg-primary);\n border-color: var(--explorer-border-primary);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n box-sizing: border-box;\n transition: all 0.2s ease-in-out;\n }\n\n .explorer-component *,\n .explorer-component *::before,\n .explorer-component *::after {\n box-sizing: border-box;\n }\n\n /* Header styles */\n .explorer-header {\n background-color: var(--explorer-bg-secondary);\n border-bottom: 1px solid var(--explorer-border-secondary);\n color: var(--explorer-text-primary);\n padding: 12px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 40px;\n user-select: none;\n }\n\n .explorer-header-title {\n font-size: 14px;\n font-weight: 500;\n color: var(--explorer-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .explorer-header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n }\n\n /* Button styles */\n .explorer-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n margin: 0;\n border: none;\n border-radius: 4px;\n background-color: transparent;\n color: var(--explorer-text-secondary);\n cursor: pointer;\n font-size: 12px;\n transition: all 0.15s ease-in-out;\n outline: none;\n }\n\n .explorer-button:hover {\n background-color: var(--explorer-surface-hover);\n color: var(--explorer-text-primary);\n transform: translateY(-1px);\n }\n\n .explorer-button:active {\n background-color: var(--explorer-surface-active);\n transform: translateY(0);\n }\n\n .explorer-button:focus-visible {\n outline: 2px solid var(--explorer-border-focus);\n outline-offset: 2px;\n }\n\n .explorer-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n }\n\n /* Button variants */\n .explorer-button--primary {\n background-color: var(--explorer-primary);\n color: var(--explorer-text-inverse);\n }\n\n .explorer-button--primary:hover:not(:disabled) {\n background-color: var(--explorer-primary-hover);\n }\n\n .explorer-button--primary:active:not(:disabled) {\n background-color: var(--explorer-primary-active);\n }\n\n .explorer-button--success {\n background-color: var(--explorer-success);\n color: var(--explorer-text-inverse);\n }\n\n .explorer-button--success:hover:not(:disabled) {\n background-color: var(--explorer-success-hover);\n }\n\n .explorer-button--danger {\n background-color: var(--explorer-danger);\n color: var(--explorer-text-inverse);\n }\n\n .explorer-button--danger:hover:not(:disabled) {\n background-color: var(--explorer-danger-hover);\n }\n\n /* Container styles */\n .explorer-container {\n background-color: var(--explorer-bg-primary);\n border: 1px solid var(--explorer-border-primary);\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .explorer-container--elevated {\n box-shadow: var(--explorer-shadow-md);\n }\n\n /* Content area styles */\n .explorer-content {\n flex: 1;\n min-height: 0;\n background-color: var(--explorer-bg-input);\n }\n\n /* Input/Editor styles */\n .explorer-input,\n .explorer-textarea {\n background-color: var(--explorer-bg-input);\n color: var(--explorer-text-primary);\n border: 1px solid var(--explorer-border-primary);\n border-radius: 4px;\n padding: 12px;\n font-family: 'Fira Code', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n outline: none;\n transition: border-color 0.2s ease;\n }\n\n .explorer-input:focus,\n .explorer-textarea:focus {\n border-color: var(--explorer-border-focus);\n box-shadow: 0 0 0 2px var(--explorer-border-focus)40;\n }\n\n .explorer-textarea {\n resize: none;\n font-variant-ligatures: normal;\n font-feature-settings: \"liga\" 1, \"calt\" 1;\n }\n\n .explorer-textarea::placeholder {\n color: var(--explorer-text-muted);\n opacity: 1;\n }\n\n .explorer-textarea::selection {\n background-color: var(--explorer-surface-selected);\n }\n\n /* Scrollbar styles */\n .explorer-component *::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n\n .explorer-component *::-webkit-scrollbar-track {\n background: var(--explorer-scrollbar-track);\n }\n\n .explorer-component *::-webkit-scrollbar-thumb {\n background: var(--explorer-scrollbar-thumb);\n border-radius: 4px;\n }\n\n .explorer-component *::-webkit-scrollbar-thumb:hover {\n background: var(--explorer-scrollbar-thumb-hover);\n }\n\n /* Panel layout styles */\n .explorer-panels {\n display: grid;\n gap: 1px;\n background-color: var(--explorer-border-secondary);\n flex: 1;\n min-height: 0;\n }\n\n .explorer-panel {\n background-color: var(--explorer-bg-primary);\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n }\n\n /* Responsive grid templates */\n .explorer-panels--two-column {\n grid-template-columns: 1fr 1fr;\n }\n\n .explorer-panels--three-column {\n grid-template-columns: 1fr 1fr 1fr;\n }\n\n .explorer-panels--single-column {\n grid-template-columns: 1fr;\n }\n\n @media (max-width: 768px) {\n .explorer-panels--two-column,\n .explorer-panels--three-column {\n grid-template-columns: 1fr !important;\n grid-template-rows: auto auto auto;\n }\n }\n\n /* Animation utilities */\n .explorer-fade-in {\n animation: explorer-fade-in 0.2s ease-out;\n }\n\n @keyframes explorer-fade-in {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Loading states */\n .explorer-loading {\n opacity: 0.6;\n pointer-events: none;\n }\n\n /* Status indicators */\n .explorer-status--success {\n border-left: 4px solid var(--explorer-success);\n }\n\n .explorer-status--error {\n border-left: 4px solid var(--explorer-danger);\n }\n\n .explorer-status--warning {\n border-left: 4px solid var(--explorer-warning);\n }\n`;\n\n/**\n * Utility function to set theme on an element\n * Checks for website context to avoid conflicts\n */\nexport function setElementTheme(\n element: HTMLElement | ShadowRoot | DocumentFragment,\n theme: 'light' | 'dark',\n): void {\n // Check if we're in a website context (html has data-theme)\n const htmlTheme = document.documentElement.getAttribute('data-theme');\n if (htmlTheme && (htmlTheme === 'light' || htmlTheme === 'dark')) {\n // Website context - don't override, just add explorer class for targeting\n if (element instanceof HTMLElement) {\n element.classList.add('explorer-component');\n }\n return;\n }\n\n // Standalone context - apply theme normally\n if (element instanceof HTMLElement) {\n element.setAttribute('data-theme', theme);\n } else if (element instanceof ShadowRoot) {\n // For shadow roots, set the attribute on the host element if available\n if (element.host instanceof HTMLElement) {\n element.host.setAttribute('data-theme', theme);\n }\n } else if (element instanceof DocumentFragment) {\n // For document fragments, we can't set attributes, so skip\n // The theme will be inherited from the parent when attached\n }\n}\n\n/**\n * Utility function to get current theme from element or parent context\n */\nexport function getElementTheme(element: HTMLElement): 'light' | 'dark' {\n // Check website context first\n const htmlTheme = document.documentElement.getAttribute('data-theme');\n if (htmlTheme === 'light' || htmlTheme === 'dark') {\n return htmlTheme;\n }\n\n // Check element's own theme\n const elementTheme = element.getAttribute('data-theme') as 'light' | 'dark';\n if (elementTheme) {\n return elementTheme;\n }\n\n // Default fallback\n return 'light';\n}\n\n/**\n * Detect the current theme based on the environment\n */\nexport function detectTheme(): 'light' | 'dark' {\n // Check if document has a theme set\n const htmlTheme = document.documentElement.getAttribute('data-theme');\n if (htmlTheme === 'light' || htmlTheme === 'dark') {\n return htmlTheme;\n }\n\n // Check for dark mode classes on html element (common pattern)\n if (document.documentElement.classList.contains('dark')) {\n return 'dark';\n }\n\n // Check system preference if available\n if (typeof window !== 'undefined' && window.matchMedia) {\n const prefersDark = window.matchMedia(\n '(prefers-color-scheme: dark)',\n ).matches;\n if (prefersDark) {\n return 'dark';\n }\n }\n\n // Default to light\n return 'light';\n}\n\n/**\n * Utility function to toggle theme on an element\n */\nexport function toggleElementTheme(element: HTMLElement): 'light' | 'dark' {\n const currentTheme = getElementTheme(element);\n const newTheme = currentTheme === 'light' ? 'dark' : 'light';\n setElementTheme(element, newTheme);\n return newTheme;\n}\n\n/**\n * Enhanced syntax highlighting CSS with Palenight theme for both light and dark modes\n */\nexport const CSS_SYNTAX_HIGHLIGHTING = `\n/* Light mode - Palenight-inspired colors adapted for light backgrounds */\n.explorer-component .syntax-keyword,\n.explorer-shadow-container .syntax-keyword,\n:host .syntax-keyword { \n color: #ab47bc !important; \n font-weight: 600 !important; \n}\n\n.explorer-component .syntax-string,\n.explorer-shadow-container .syntax-string,\n:host .syntax-string { \n color: #689f38 !important; \n}\n\n.explorer-component .syntax-number,\n.explorer-shadow-container .syntax-number,\n:host .syntax-number { \n color: #f57c00 !important; \n}\n\n.explorer-component .syntax-comment,\n.explorer-shadow-container .syntax-comment,\n:host .syntax-comment { \n color: #757575 !important; \n font-style: italic !important; \n}\n\n.explorer-component .syntax-function,\n.explorer-shadow-container .syntax-function,\n:host .syntax-function {\n color: #3f51b5 !important;\n font-weight: 500 !important;\n}\n\n.explorer-component .syntax-tag,\n.explorer-shadow-container .syntax-tag,\n:host .syntax-tag { \n color: #e91e63 !important; \n font-weight: 600 !important; \n}\n\n.explorer-component .syntax-attribute,\n.explorer-shadow-container .syntax-attribute,\n:host .syntax-attribute { \n color: #6f42c1 !important; \n}\n\n.explorer-component .syntax-value,\n.explorer-shadow-container .syntax-value,\n:host .syntax-value { \n color: #032f62 !important; \n}\n\n.explorer-component .syntax-operator,\n.explorer-shadow-container .syntax-operator,\n:host .syntax-operator { \n color: #d73a49 !important; \n}\n\n.explorer-component .syntax-type,\n.explorer-shadow-container .syntax-type,\n:host .syntax-type { \n color: #005cc5 !important; \n font-weight: 500 !important; \n}\n\n.explorer-component .syntax-property,\n.explorer-shadow-container .syntax-property,\n:host .syntax-property { \n color: #6f42c1 !important; \n}\n\n/* JSON-specific styling for better readability */\n.explorer-component[data-language=\"json\"] .syntax-string,\n.explorer-shadow-container[data-language=\"json\"] .syntax-string,\n:host([data-language=\"json\"]) .syntax-string { \n color: #22863a !important; /* GitHub green for JSON strings */\n}\n\n.explorer-component[data-language=\"json\"] .syntax-number,\n.explorer-shadow-container[data-language=\"json\"] .syntax-number,\n:host([data-language=\"json\"]) .syntax-number { \n color: #005cc5 !important; /* GitHub blue for JSON numbers */\n}\n\n.explorer-component[data-language=\"json\"] .syntax-property,\n.explorer-shadow-container[data-language=\"json\"] .syntax-property,\n:host([data-language=\"json\"]) .syntax-property { \n color: #032f62 !important; /* GitHub dark blue for JSON keys */\n font-weight: 500 !important;\n}\n\n.explorer-component[data-language=\"json\"] .syntax-keyword,\n.explorer-shadow-container[data-language=\"json\"] .syntax-keyword,\n:host([data-language=\"json\"]) .syntax-keyword { \n color: #d73a49 !important; /* GitHub red for true/false/null */\n font-weight: 600 !important;\n}\n\n/* JSON-specific dark mode styling */\n[data-theme='dark'] .explorer-component[data-language=\"json\"] .syntax-string,\n[data-theme='dark'] .explorer-shadow-container[data-language=\"json\"] .syntax-string,\n:host([data-theme='dark'][data-language=\"json\"]) .syntax-string { \n color: #98d982 !important; /* Softer green for dark mode JSON strings */\n}\n\n[data-theme='dark'] .explorer-component[data-language=\"json\"] .syntax-number,\n[data-theme='dark'] .explorer-shadow-container[data-language=\"json\"] .syntax-number,\n:host([data-theme='dark'][data-language=\"json\"]) .syntax-number { \n color: #79b8ff !important; /* Softer blue for dark mode JSON numbers */\n}\n\n[data-theme='dark'] .explorer-component[data-language=\"json\"] .syntax-property,\n[data-theme='dark'] .explorer-shadow-container[data-language=\"json\"] .syntax-property,\n:host([data-theme='dark'][data-language=\"json\"]) .syntax-property { \n color: #b392f0 !important; /* Light purple for dark mode JSON keys */\n font-weight: 500 !important;\n}\n\n[data-theme='dark'] .explorer-component[data-language=\"json\"] .syntax-keyword,\n[data-theme='dark'] .explorer-shadow-container[data-language=\"json\"] .syntax-keyword,\n:host([data-theme='dark'][data-language=\"json\"]) .syntax-keyword { \n color: #f97583 !important; /* Soft red for dark mode true/false/null */\n font-weight: 600 !important;\n}\n\n/* Special highlighting for elb attributes */\n.explorer-component .syntax-elb-attribute,\n.explorer-shadow-container .syntax-elb-attribute,\n:host .syntax-elb-attribute { \n color: #28a745 !important; \n font-weight: 700 !important; \n}\n\n.explorer-component .syntax-elb-value,\n.explorer-shadow-container .syntax-elb-value,\n:host .syntax-elb-value { \n color: #28a745 !important; \n font-weight: 500 !important; \n}\n\n/* Dark mode - Palenight theme with higher specificity */\n[data-theme='dark'] .explorer-component .syntax-keyword,\n[data-theme='dark'] .explorer-shadow-container .syntax-keyword,\n:host([data-theme='dark']) .syntax-keyword { \n color: #c792ea !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-string,\n[data-theme='dark'] .explorer-shadow-container .syntax-string,\n:host([data-theme='dark']) .syntax-string { \n color: #c3e88d !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-number,\n[data-theme='dark'] .explorer-shadow-container .syntax-number,\n:host([data-theme='dark']) .syntax-number { \n color: #f78c6c !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-comment,\n[data-theme='dark'] .explorer-shadow-container .syntax-comment,\n:host([data-theme='dark']) .syntax-comment { \n color: #676e95 !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-function,\n[data-theme='dark'] .explorer-shadow-container .syntax-function,\n:host([data-theme='dark']) .syntax-function {\n color: #82aaff !important;\n}\n\n[data-theme='dark'] .explorer-component .syntax-tag,\n[data-theme='dark'] .explorer-shadow-container .syntax-tag,\n:host([data-theme='dark']) .syntax-tag { \n color: #f07178 !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-attribute,\n[data-theme='dark'] .explorer-shadow-container .syntax-attribute,\n:host([data-theme='dark']) .syntax-attribute { \n color: #ffcb6b !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-value,\n[data-theme='dark'] .explorer-shadow-container .syntax-value,\n:host([data-theme='dark']) .syntax-value { \n color: #c3e88d !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-operator,\n[data-theme='dark'] .explorer-shadow-container .syntax-operator,\n:host([data-theme='dark']) .syntax-operator { \n color: #89ddff !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-type,\n[data-theme='dark'] .explorer-shadow-container .syntax-type,\n:host([data-theme='dark']) .syntax-type { \n color: #ffcb6b !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-property,\n[data-theme='dark'] .explorer-shadow-container .syntax-property,\n:host([data-theme='dark']) .syntax-property { \n color: #82aaff !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-elb-attribute,\n[data-theme='dark'] .explorer-shadow-container .syntax-elb-attribute,\n:host([data-theme='dark']) .syntax-elb-attribute { \n color: #c3e88d !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-elb-value,\n[data-theme='dark'] .explorer-shadow-container .syntax-elb-value,\n:host([data-theme='dark']) .syntax-elb-value { \n color: #c3e88d !important; \n}\n`;\n\n/**\n * Inject CSS directly into shadow root with theme context awareness\n */\nexport function injectShadowRootCSS(\n shadowRoot: ShadowRoot,\n css: string,\n id: string,\n): void {\n // Remove existing style with same ID\n const existingStyle = shadowRoot.querySelector(`#${id}`);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n // Create and inject new style\n const style = document.createElement('style');\n style.id = id;\n style.textContent = css;\n shadowRoot.appendChild(style);\n}\n\n/**\n * Get complete CSS including syntax highlighting for shadow DOM injection\n */\nexport function getCompleteShadowCSS(): string {\n return (\n CSS_THEME_VARIABLES +\n '\\n\\n' +\n CSS_COMPONENT_STYLES +\n '\\n\\n' +\n CSS_SYNTAX_HIGHLIGHTING\n );\n}\n\n/**\n * Get the complete CSS for theming\n */\nexport function getThemeCSS(): string {\n return CSS_THEME_VARIABLES + '\\n\\n' + CSS_COMPONENT_STYLES;\n}\n","/**\n * WalkerOS Explorer - LiveCodeJS Component\n *\n * JavaScript evaluation component with context injection\n * Zero dependencies, framework-agnostic\n */\n\n// Main component\nexport {\n createLiveCodeJS,\n type LiveCodeJSAPI,\n type LiveCodeJSOptions,\n} from './components/LiveCodeJS';\n\n// Supporting components (used by LiveCodeJS)\nexport {\n createCodeEditor,\n type CodeEditorAPI,\n type CodeEditorOptions,\n} from './components/CodeEditor';\n\nexport {\n createResultDisplay,\n type ResultDisplayAPI,\n type ResultDisplayOptions,\n type ResultItem,\n type ResultType,\n} from './components/ResultDisplay';\n\nexport {\n createDestination,\n type DestinationAPI,\n type DestinationOptions,\n} from './components/Destination';\n\n// Core types that might be useful\nexport { type ComponentAPI } from './core/Component';\n\n// Utilities that might be useful\nexport {\n evaluateJavaScript,\n createSafeContext,\n formatEvaluationResult,\n type EvaluationContext,\n type EvaluationResult,\n type EvaluationOptions,\n} from './utils/evaluation';\n\n// Export version info\nexport const version = '1.0.0';\nexport const name = '@walkeros/explorer';\n","/**\n * Core Component Factory - Base for all walkerOS Explorer components\n *\n * Provides:\n * - Isolated state per instance\n * - Unique ID generation to prevent conflicts\n * - Event system for component communication\n * - Lifecycle management\n * - DOM utilities\n * - Enhanced shadow DOM theme inheritance\n */\n\nimport { setElementTheme, detectTheme } from './css-theme-system';\n\nexport interface ComponentOptions {\n className?: string;\n autoMount?: boolean;\n useShadowDOM?: boolean;\n theme?: 'light' | 'dark' | 'auto';\n [key: string]: unknown;\n}\n\nexport interface ComponentAPI {\n id: string;\n mount(): void;\n unmount(): void;\n destroy(): void;\n on(event: string, handler: Function): () => void;\n emit(event: string, data?: unknown): void;\n getElement(): HTMLElement | null;\n getShadowRoot(): ShadowRoot | null;\n getContentRoot(): HTMLElement | ShadowRoot;\n injectCSS(css: string, id?: string): void;\n}\n\n// Global registry to track all component instances\nconst componentRegistry = new Map<string, ComponentAPI>();\n\n/**\n * Generate unique ID for component instances\n */\nexport function generateUniqueId(prefix = 'explorer'): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${prefix}-${timestamp}-${random}`;\n}\n\n/**\n * Get element from selector or HTMLElement\n */\nfunction getElement(elementOrSelector: HTMLElement | string): HTMLElement {\n if (typeof elementOrSelector === 'string') {\n const element = document.querySelector(elementOrSelector);\n if (!element) {\n throw new Error(`Element not found: ${elementOrSelector}`);\n }\n return element as HTMLElement;\n }\n return elementOrSelector;\n}\n\n/**\n * Core Component Factory\n * Creates isolated component instances with unique IDs and event systems\n */\nexport function createComponent(\n elementOrSelector: HTMLElement | string,\n options: ComponentOptions = {},\n): ComponentAPI {\n const element = getElement(elementOrSelector);\n\n // Check for existing component instance to prevent duplicates\n const existingId = element.getAttribute('data-explorer-component');\n if (existingId && componentRegistry.has(existingId)) {\n console.warn(\n `Component already exists on element, destroying existing instance: ${existingId}`,\n );\n const existingComponent = componentRegistry.get(existingId);\n existingComponent?.destroy();\n }\n\n const id = generateUniqueId();\n\n // Component state (isolated per instance)\n let mounted = false;\n let destroyed = false;\n const eventListeners = new Map<string, Set<Function>>();\n const cleanupFunctions: Function[] = [];\n let shadowRoot: ShadowRoot | null = null;\n\n // Set unique ID on element to prevent conflicts\n if (!element.id) {\n element.id = id;\n }\n\n // Add component marker\n element.setAttribute('data-explorer-component', id);\n\n // Create shadow DOM if requested and supported\n if (options.useShadowDOM && element.attachShadow) {\n try {\n shadowRoot = element.attachShadow({ mode: 'open' });\n // Add unique class to shadow root for styling\n const shadowContainer = document.createElement('div');\n shadowContainer.className = 'explorer-shadow-container';\n shadowContainer.setAttribute('data-explorer-component', id);\n shadowRoot.appendChild(shadowContainer);\n } catch (error) {\n console.warn(\n 'Failed to create shadow DOM, falling back to light DOM:',\n error,\n );\n shadowRoot = null;\n }\n }\n\n // Basic component setup\n const setupComponent = () => {\n const targetElement =\n (shadowRoot?.firstElementChild as HTMLElement) || element;\n\n // Always add explorer class for CSS targeting\n targetElement.classList.add('explorer-component');\n };\n\n // Component API\n const api: ComponentAPI = {\n id,\n\n mount() {\n if (mounted || destroyed) return;\n\n mounted = true;\n setupComponent();\n\n // Add component class\n if (options.className) {\n element.classList.add(options.className);\n }\n\n // Handle theme setting\n if (options.theme) {\n if (options.theme === 'auto') {\n const detectedTheme = detectTheme();\n setElementTheme(element, detectedTheme);\n } else {\n setElementTheme(element, options.theme);\n }\n }\n\n api.emit('mount');\n },\n\n unmount() {\n if (!mounted || destroyed) return;\n\n mounted = false;\n api.emit('unmount');\n },\n\n destroy() {\n if (destroyed) return;\n\n destroyed = true;\n\n if (mounted) {\n api.unmount();\n }\n\n // Emit destroy event before clearing listeners\n api.emit('destroy');\n\n // Clear all event listeners\n eventListeners.clear();\n\n // Run cleanup functions\n cleanupFunctions.forEach((cleanup) => cleanup());\n cleanupFunctions.length = 0;\n\n // Remove component marker and classes\n element.removeAttribute('data-explorer-component');\n element.classList.remove('explorer-component');\n\n // Clean up shadow DOM\n if (shadowRoot) {\n shadowRoot.innerHTML = '';\n shadowRoot = null;\n }\n\n // Remove from registry\n componentRegistry.delete(id);\n },\n\n on(event: string, handler: Function): () => void {\n if (!eventListeners.has(event)) {\n eventListeners.set(event, new Set());\n }\n\n const handlers = eventListeners.get(event)!;\n handlers.add(handler);\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler);\n if (handlers.size === 0) {\n eventListeners.delete(event);\n }\n };\n },\n\n emit(event: string, data?: unknown) {\n const handlers = eventListeners.get(event);\n if (!handlers) return;\n\n handlers.forEach((handler) => {\n try {\n handler(data, api);\n } catch (error) {\n console.error(`Error in event handler for '${event}':`, error);\n }\n });\n },\n\n getElement() {\n return destroyed ? null : element;\n },\n\n getShadowRoot() {\n return destroyed ? null : shadowRoot;\n },\n\n getContentRoot(): HTMLElement | ShadowRoot {\n if (destroyed) return element;\n return (shadowRoot?.firstElementChild as HTMLElement) || element;\n },\n\n injectCSS(css: string, id?: string): void {\n if (destroyed) return;\n\n const targetRoot = shadowRoot || document.head;\n const styleId = id || `explorer-css-${api.id}`;\n\n // Remove existing style with same ID\n const existingStyle = targetRoot.querySelector(`#${styleId}`);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n // Create and inject new style\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = css;\n\n if (shadowRoot) {\n shadowRoot.appendChild(style);\n } else {\n document.head.appendChild(style);\n }\n },\n };\n\n // Register component\n componentRegistry.set(id, api);\n\n // Auto-mount if requested\n if (options.autoMount !== false) {\n api.mount();\n }\n\n return api;\n}\n\n/**\n * Get all active component instances\n */\nexport function getAllComponents(): ComponentAPI[] {\n return Array.from(componentRegistry.values());\n}\n\n/**\n * Get component by ID\n */\nexport function getComponent(id: string): ComponentAPI | undefined {\n return componentRegistry.get(id);\n}\n\n/**\n * Destroy all components (useful for cleanup)\n */\nexport function destroyAllComponents(): void {\n const components = Array.from(componentRegistry.values());\n components.forEach((component) => component.destroy());\n}\n\n/**\n * Find components by selector\n */\nexport function findComponents(selector: string): ComponentAPI[] {\n const elements = document.querySelectorAll(selector);\n const components: ComponentAPI[] = [];\n\n elements.forEach((element) => {\n const componentId = element.getAttribute('data-explorer-component');\n if (componentId) {\n const component = componentRegistry.get(componentId);\n if (component) {\n components.push(component);\n }\n }\n });\n\n return components;\n}\n","/**\n * DOM Utilities - Helper functions for DOM manipulation\n *\n * Features:\n * - Safe element creation and manipulation\n * - Event delegation\n * - CSS injection\n * - Element queries with error handling\n */\n\n/**\n * Create element with attributes and styles\n */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n attributes: Record<string, string> = {},\n styles: Record<string, string> = {},\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tagName);\n\n // Set attributes\n Object.entries(attributes).forEach(([key, value]) => {\n if (key === 'className') {\n element.className = value;\n } else if (key === 'textContent') {\n element.textContent = value;\n } else if (key === 'innerHTML') {\n element.innerHTML = value;\n } else {\n element.setAttribute(key, value);\n }\n });\n\n // Set styles\n Object.entries(styles).forEach(([property, value]) => {\n (element.style as any)[property] = value;\n });\n\n return element;\n}\n\n/**\n * Safe element query with error handling\n */\nexport function getElement(selector: string | HTMLElement): HTMLElement {\n if (typeof selector === 'string') {\n const element = document.querySelector(selector);\n if (!element) {\n throw new Error(`Element not found: ${selector}`);\n }\n return element as HTMLElement;\n }\n return selector;\n}\n\n/**\n * Safe element query that returns null if not found\n */\nexport function findElement(selector: string): HTMLElement | null {\n try {\n return getElement(selector);\n } catch {\n return null;\n }\n}\n\n/**\n * Get all elements matching a selector\n */\nexport function getElements(selector: string): HTMLElement[] {\n return Array.from(document.querySelectorAll(selector)) as HTMLElement[];\n}\n\n/**\n * Check if element matches selector\n */\nexport function matches(element: Element, selector: string): boolean {\n return element.matches ? element.matches(selector) : false;\n}\n\n/**\n * Find closest parent element matching selector\n */\nexport function closest(element: Element, selector: string): Element | null {\n return element.closest ? element.closest(selector) : null;\n}\n\n/**\n * Add event listener with automatic cleanup\n */\nexport function addEventListener<K extends keyof HTMLElementEventMap>(\n element: Element | Document | Window,\n event: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n): () => void {\n element.addEventListener(event as string, handler as EventListener, options);\n\n return () => {\n element.removeEventListener(\n event as string,\n handler as EventListener,\n options,\n );\n };\n}\n\n/**\n * Event delegation helper\n */\nexport function delegate<K extends keyof HTMLElementEventMap>(\n container: Element,\n selector: string,\n event: K,\n handler: (event: HTMLElementEventMap[K], target: Element) => void,\n): () => void {\n const delegateHandler = (e: Event) => {\n const target = (e.target as Element)?.closest?.(selector);\n if (target && container.contains(target)) {\n handler(e as HTMLElementEventMap[K], target);\n }\n };\n\n return addEventListener(container, event, delegateHandler);\n}\n\n/**\n * Inject CSS into document head or shadow root\n */\nexport function injectCSS(\n css: string,\n id?: string,\n target?: HTMLElement | ShadowRoot | Document,\n): HTMLStyleElement {\n const targetDocument = target || document;\n const targetHead =\n target instanceof ShadowRoot\n ? target\n : target instanceof HTMLElement\n ? target\n : document.head;\n\n // Remove existing style with same ID\n if (id) {\n const existing = targetDocument.querySelector\n ? targetDocument.querySelector(`#${id}`)\n : document.getElementById(id);\n if (existing) {\n existing.remove();\n }\n }\n\n const style = createElement('style', {\n type: 'text/css',\n ...(id && { id }),\n });\n\n style.textContent = css;\n targetHead.appendChild(style);\n\n return style;\n}\n\n/**\n * Enhanced CSS injection for shadow DOM components\n */\nexport function injectComponentCSS(\n css: string,\n id: string,\n shadowRoot?: ShadowRoot | null,\n scopePrefix?: string,\n): HTMLStyleElement {\n // Add scoping if no shadow DOM\n let scopedCSS = css;\n if (!shadowRoot && scopePrefix) {\n // Add CSS scoping for light DOM usage\n scopedCSS = css.replace(/(\\.explorer-[\\w-]+)/g, `${scopePrefix} $1`);\n }\n\n // Inject into shadow root or document\n const target = shadowRoot || document;\n return injectCSS(scopedCSS, id, target);\n}\n\n/**\n * Get computed style value\n */\nexport function getComputedStyleValue(\n element: Element,\n property: string,\n): string {\n return window.getComputedStyle(element).getPropertyValue(property);\n}\n\n/**\n * Check if element is visible\n */\nexport function isVisible(element: Element): boolean {\n const style = window.getComputedStyle(element);\n return (\n style.display !== 'none' &&\n style.visibility !== 'hidden' &&\n parseFloat(style.opacity) > 0\n );\n}\n\n/**\n * Get element dimensions\n */\nexport function getDimensions(element: Element) {\n const rect = element.getBoundingClientRect();\n return {\n width: rect.width,\n height: rect.height,\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n };\n}\n\n/**\n * Scroll element into view smoothly\n */\nexport function scrollIntoView(\n element: Element,\n options: ScrollIntoViewOptions = { behavior: 'smooth', block: 'nearest' },\n): void {\n if (element.scrollIntoView) {\n element.scrollIntoView(options);\n }\n}\n\n/**\n * Copy text to clipboard\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n return true;\n } else {\n // Fallback for older browsers\n const textArea = createElement('textarea', {\n value: text,\n style: 'position: absolute; left: -999999px',\n });\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n const successful = document.execCommand('copy');\n document.body.removeChild(textArea);\n return successful;\n } catch {\n document.body.removeChild(textArea);\n return false;\n }\n }\n } catch {\n return false;\n }\n}\n\n/**\n * Create a DocumentFragment from HTML string\n */\nexport function createFragment(html: string): DocumentFragment {\n const template = createElement('template');\n template.innerHTML = html.trim();\n return template.content;\n}\n\n/**\n * Safe innerHTML replacement\n */\nexport function setHTML(element: Element, html: string): void {\n // Clear existing content\n element.innerHTML = '';\n\n // Create fragment and append\n const fragment = createFragment(html);\n element.appendChild(fragment);\n}\n\n/**\n * Escape HTML to prevent XSS\n */\nexport function escapeHTML(text: string): string {\n const div = createElement('div');\n div.textContent = text;\n return div.innerHTML;\n}\n\n/**\n * Debounced resize observer\n */\nexport function observeResize(\n element: Element,\n callback: (entry: ResizeObserverEntry) => void,\n debounceMs = 100,\n): () => void {\n if (!window.ResizeObserver) {\n // Fallback for browsers without ResizeObserver\n const handler = () => callback({} as ResizeObserverEntry);\n const debouncedHandler = debounce(handler, debounceMs);\n\n return addEventListener(window, 'resize', debouncedHandler);\n }\n\n const debouncedCallback = debounce((entries: ResizeObserverEntry[]) => {\n entries.forEach(callback);\n }, debounceMs);\n\n const observer = new ResizeObserver(debouncedCallback);\n observer.observe(element);\n\n return () => observer.disconnect();\n}\n\n/**\n * Mutation observer helper\n */\nexport function observeMutations(\n element: Element,\n callback: (mutations: MutationRecord[]) => void,\n options: MutationObserverInit = { childList: true, subtree: true },\n): () => void {\n const observer = new MutationObserver(callback);\n observer.observe(element, options);\n\n return () => observer.disconnect();\n}\n\n/**\n * Simple debounce utility\n */\nfunction debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout>;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\n/**\n * Check if element is in viewport\n */\nexport function isInViewport(element: Element, threshold = 0): boolean {\n const rect = element.getBoundingClientRect();\n const windowHeight =\n window.innerHeight || document.documentElement.clientHeight;\n const windowWidth = window.innerWidth || document.documentElement.clientWidth;\n\n return (\n rect.top >= -threshold &&\n rect.left >= -threshold &&\n rect.bottom <= windowHeight + threshold &&\n rect.right <= windowWidth + threshold\n );\n}\n\n/**\n * Get unique selector for element\n */\nexport function getUniqueSelector(element: Element): string {\n if (element.id) {\n return `#${element.id}`;\n }\n\n const path: string[] = [];\n\n while (element && element.nodeType === Node.ELEMENT_NODE) {\n let selector = element.nodeName.toLowerCase();\n\n if (element.className) {\n selector += '.' + element.className.trim().split(/\\s+/).join('.');\n }\n\n // Add nth-child if needed for uniqueness\n const parent = element.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children);\n const index = siblings.indexOf(element) + 1;\n if (siblings.length > 1) {\n selector += `:nth-child(${index})`;\n }\n }\n\n path.unshift(selector);\n element = element.parentElement as Element;\n }\n\n return path.join(' > ');\n}\n","/**\n * UnifiedHeader - Consistent header component for all explorer boxes\n *\n * Features:\n * - Unified styling across all components\n * - Callback-driven button visibility (no separate flags)\n * - Flexible button configuration\n * - Theme-aware styling\n * - Consistent spacing and layout\n */\n\nimport {\n createElement,\n addEventListener,\n injectComponentCSS,\n} from '../utils/dom';\nimport { toggleElementTheme } from './css-theme-system';\n\nexport interface HeaderButton {\n text: string;\n callback: () => void;\n className?: string;\n title?: string;\n}\n\nexport interface UnifiedHeaderOptions {\n title: string;\n onClear?: () => void;\n onCopy?: () => void;\n onRefresh?: () => void;\n onThemeToggle?: () => void;\n customButtons?: HeaderButton[];\n className?: string;\n shadowRoot?: ShadowRoot | null;\n}\n\nexport interface UnifiedHeaderAPI {\n getElement(): HTMLElement;\n setTitle(title: string): void;\n updateButtons(options: Partial<UnifiedHeaderOptions>): void;\n destroy(): void;\n}\n\n/**\n * Create a unified header component\n */\nexport function createUnifiedHeader(\n options: UnifiedHeaderOptions,\n): UnifiedHeaderAPI {\n let currentTitle = options.title;\n let headerElement: HTMLElement;\n let titleElement: HTMLElement;\n let actionsElement: HTMLElement;\n const cleanupFunctions: Array<() => void> = [];\n const shadowRoot = options.shadowRoot || null;\n\n /**\n * Inject unified header CSS styles\n */\n function injectStyles(): void {\n const css = `\n/* UnifiedHeader Component Styles */\n.explorer-unified-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--explorer-bg-tertiary, #f9fafb);\n border-bottom: 1px solid var(--explorer-border-primary, #e5e7eb);\n font-size: 12px;\n font-weight: 600;\n color: var(--explorer-text-secondary, #6b7280);\n min-height: 32px;\n box-sizing: border-box;\n}\n\n.explorer-unified-header__title {\n flex: 1;\n color: var(--explorer-text-secondary, #6b7280);\n font-weight: 600;\n font-size: 12px;\n margin: 0;\n padding: 0;\n}\n\n.explorer-unified-header__actions {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: auto;\n}\n\n.explorer-unified-header__btn {\n background: none;\n border: 1px solid var(--explorer-border-primary, #e5e7eb);\n color: var(--explorer-text-secondary, #6b7280);\n cursor: pointer;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n transition: all 0.2s ease;\n line-height: 1.2;\n min-width: auto;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.explorer-unified-header__btn:hover {\n background: var(--explorer-interactive-hover, #f3f4f6);\n color: var(--explorer-text-primary, #111827);\n border-color: var(--explorer-border-secondary, #d1d5db);\n}\n\n.explorer-unified-header__btn:active {\n background: var(--explorer-interactive-active, #e5e7eb);\n}\n\n.explorer-unified-header__btn--clear {\n /* Specific styling for clear button if needed */\n}\n\n.explorer-unified-header__btn--copy {\n /* Specific styling for copy button if needed */\n}\n\n.explorer-unified-header__btn--refresh {\n /* Specific styling for refresh button if needed */\n}\n\n.explorer-unified-header__btn--theme {\n /* Specific styling for theme toggle button */\n font-size: 12px;\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .explorer-unified-header {\n padding: 6px 10px;\n min-height: 28px;\n }\n \n .explorer-unified-header__btn {\n padding: 1px 4px;\n font-size: 9px;\n height: 18px;\n }\n}\n`;\n\n // Use shadow DOM-aware CSS injection\n injectComponentCSS(\n css,\n 'explorer-unified-header-styles',\n shadowRoot,\n '.explorer-unified-header',\n );\n }\n\n /**\n * Create header buttons based on options\n */\n function createButtons(opts: UnifiedHeaderOptions): HTMLElement[] {\n const buttons: HTMLElement[] = [];\n\n // Clear button (show if onClear callback exists)\n if (opts.onClear) {\n const clearBtn = createElement('button', {\n className:\n 'explorer-unified-header__btn explorer-unified-header__btn--clear',\n textContent: 'Clear',\n title: 'Clear content',\n }) as HTMLButtonElement;\n\n cleanupFunctions.push(addEventListener(clearBtn, 'click', opts.onClear));\n buttons.push(clearBtn);\n }\n\n // Copy button (show if onCopy callback exists)\n if (opts.onCopy) {\n const copyBtn = createElement('button', {\n className:\n 'explorer-unified-header__btn explorer-unified-header__btn--copy',\n textContent: '📋',\n title: 'Copy content',\n }) as HTMLButtonElement;\n\n cleanupFunctions.push(addEventListener(copyBtn, 'click', opts.onCopy));\n buttons.push(copyBtn);\n }\n\n // Refresh button (show if onRefresh callback exists)\n if (opts.onRefresh) {\n const refreshBtn = createElement('button', {\n className:\n 'explorer-unified-header__btn explorer-unified-header__btn--refresh',\n textContent: '🔄',\n title: 'Refresh',\n }) as HTMLButtonElement;\n\n cleanupFunctions.push(\n addEventListener(refreshBtn, 'click', opts.onRefresh),\n );\n buttons.push(refreshBtn);\n }\n\n // Theme toggle button (show if onThemeToggle callback exists)\n if (opts.onThemeToggle) {\n const themeBtn = createElement('button', {\n className:\n 'explorer-unified-header__btn explorer-unified-header__btn--theme',\n textContent: '🌙',\n title: 'Toggle theme',\n }) as HTMLButtonElement;\n\n cleanupFunctions.push(\n addEventListener(themeBtn, 'click', opts.onThemeToggle),\n );\n buttons.push(themeBtn);\n }\n\n // Custom buttons\n if (opts.customButtons) {\n opts.customButtons.forEach((buttonConfig) => {\n const customBtn = createElement('button', {\n className: `explorer-unified-header__btn ${buttonConfig.className || ''}`,\n textContent: buttonConfig.text,\n title: buttonConfig.title || buttonConfig.text,\n }) as HTMLButtonElement;\n\n cleanupFunctions.push(\n addEventListener(customBtn, 'click', buttonConfig.callback),\n );\n buttons.push(customBtn);\n });\n }\n\n return buttons;\n }\n\n /**\n * Create the DOM structure\n */\n function createDOM(): HTMLElement {\n headerElement = createElement('div', {\n className: `explorer-unified-header ${options.className || ''}`,\n });\n\n titleElement = createElement('div', {\n className: 'explorer-unified-header__title',\n textContent: currentTitle,\n });\n\n actionsElement = createElement('div', {\n className: 'explorer-unified-header__actions',\n });\n\n // Add buttons\n const buttons = createButtons(options);\n buttons.forEach((button) => actionsElement.appendChild(button));\n\n headerElement.appendChild(titleElement);\n headerElement.appendChild(actionsElement);\n\n return headerElement;\n }\n\n /**\n * Update buttons based on new options\n */\n function updateButtons(newOptions: Partial<UnifiedHeaderOptions>): void {\n // Clear existing buttons and cleanup\n actionsElement.innerHTML = '';\n cleanupFunctions.forEach((cleanup) => cleanup());\n cleanupFunctions.length = 0;\n\n // Create new buttons with merged options\n const mergedOptions = { ...options, ...newOptions };\n const buttons = createButtons(mergedOptions);\n buttons.forEach((button) => actionsElement.appendChild(button));\n\n // Update stored options\n Object.assign(options, newOptions);\n }\n\n // Enhanced API\n const api: UnifiedHeaderAPI = {\n getElement(): HTMLElement {\n return headerElement;\n },\n\n setTitle(title: string): void {\n currentTitle = title;\n titleElement.textContent = title;\n },\n\n updateButtons(newOptions: Partial<UnifiedHeaderOptions>): void {\n updateButtons(newOptions);\n },\n\n destroy(): void {\n cleanupFunctions.forEach((cleanup) => cleanup());\n cleanupFunctions.length = 0;\n headerElement?.remove();\n },\n };\n\n // Initialize component\n injectStyles();\n createDOM();\n\n return api;\n}\n","/**\n * UnifiedContainer - Consistent container component for all explorer boxes\n *\n * Features:\n * - Unified styling across all components\n * - Individual rounded borders on each box\n * - Consistent spacing and layout\n * - Theme-aware styling\n * - No borders on parent containers\n */\n\nimport { createElement, injectComponentCSS } from '../utils/dom';\nimport {\n createUnifiedHeader,\n type UnifiedHeaderOptions,\n type UnifiedHeaderAPI,\n} from './UnifiedHeader';\n\nexport interface UnifiedContainerOptions {\n className?: string;\n height?: string;\n showHeader?: boolean;\n headerOptions?: UnifiedHeaderOptions;\n contentClassName?: string;\n useShadowDOM?: boolean;\n shadowRoot?: ShadowRoot | null;\n}\n\nexport interface UnifiedContainerAPI {\n getElement(): HTMLElement;\n getContentElement(): HTMLElement;\n getHeader(): UnifiedHeaderAPI | null;\n setHeight(height: string): void;\n destroy(): void;\n}\n\n/**\n * Create a unified container component\n */\nexport function createUnifiedContainer(\n options: UnifiedContainerOptions = {},\n): UnifiedContainerAPI {\n let containerElement: HTMLElement;\n let contentElement: HTMLElement;\n let headerAPI: UnifiedHeaderAPI | null = null;\n const shadowRoot = options.shadowRoot || null;\n\n /**\n * Inject unified container CSS styles\n */\n function injectStyles(): void {\n const css = `\n/* UnifiedContainer Component Styles */\n.explorer-unified-container {\n display: flex;\n flex-direction: column;\n background: var(--explorer-bg-primary);\n border: 1px solid var(--explorer-border-primary, #e5e7eb);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n transition: all 0.2s ease;\n}\n\n\n.explorer-unified-container:focus-within {\n border-color: var(--explorer-interactive-primary, #2563eb);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1), 0 1px 3px 0 rgba(0, 0, 0, 0.1);\n}\n\n.explorer-unified-container__content {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n background: transparent;\n}\n\n/* Specific container variants */\n.explorer-unified-container--code-editor {\n /* Specific styling for code editor containers */\n}\n\n.explorer-unified-container--result-display {\n /* Specific styling for result display containers */\n}\n\n.explorer-unified-container--preview {\n /* Specific styling for preview containers */\n}\n\n.explorer-unified-container--destination {\n /* Specific styling for destination containers */\n}\n\n/* Height management */\n.explorer-unified-container--fixed-height {\n height: var(--container-height);\n}\n\n.explorer-unified-container--flex-height {\n flex: 1;\n min-height: 0;\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .explorer-unified-container {\n border-radius: 6px;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n }\n}\n`;\n\n // Use shadow DOM-aware CSS injection\n injectComponentCSS(\n css,\n 'explorer-unified-container-styles',\n shadowRoot,\n '.explorer-unified-container',\n );\n }\n\n /**\n * Create the DOM structure\n */\n function createDOM(): HTMLElement {\n containerElement = createElement('div', {\n className: `explorer-unified-container ${options.className || ''}`,\n });\n\n // Set height if provided\n if (options.height) {\n containerElement.style.setProperty('--container-height', options.height);\n containerElement.classList.add(\n 'explorer-unified-container--fixed-height',\n );\n } else {\n containerElement.classList.add('explorer-unified-container--flex-height');\n }\n\n // Create header if requested\n if (options.showHeader && options.headerOptions) {\n const headerOptions = { ...options.headerOptions, shadowRoot };\n headerAPI = createUnifiedHeader(headerOptions);\n containerElement.appendChild(headerAPI.getElement());\n }\n\n // Create content container\n contentElement = createElement('div', {\n className: `explorer-unified-container__content ${options.contentClassName || ''}`,\n });\n\n containerElement.appendChild(contentElement);\n\n return containerElement;\n }\n\n // Enhanced API\n const api: UnifiedContainerAPI = {\n getElement(): HTMLElement {\n return containerElement;\n },\n\n getContentElement(): HTMLElement {\n return contentElement;\n },\n\n getHeader(): UnifiedHeaderAPI | null {\n return headerAPI;\n },\n\n setHeight(height: string): void {\n containerElement.style.setProperty('--container-height', height);\n if (\n !containerElement.classList.contains(\n 'explorer-unified-container--fixed-height',\n )\n ) {\n containerElement.classList.remove(\n 'explorer-unified-container--flex-height',\n );\n containerElement.classList.add(\n 'explorer-unified-container--fixed-height',\n );\n }\n },\n\n destroy(): void {\n headerAPI?.destroy();\n containerElement?.remove();\n },\n };\n\n // Initialize component\n injectStyles();\n createDOM();\n\n return api;\n}\n","/**\n * MultiColumnLayout - Reusable multi-column layout component\n *\n * Features:\n * - Configurable column count and titles\n * - Unified styling with existing explorer components\n * - Shadow DOM support for CSS isolation\n * - Consistent theming and layout behavior\n * - Based on proven LiveCodeBase architecture\n */\n\nimport { createComponent, type ComponentAPI } from './Component';\nimport {\n createUnifiedContainer,\n type UnifiedContainerAPI,\n} from './UnifiedContainer';\nimport { createElement, injectComponentCSS } from '../utils/dom';\nimport {\n CSS_THEME_VARIABLES,\n CSS_SYNTAX_HIGHLIGHTING,\n} from './css-theme-system';\nimport { CODE_EDITOR_CSS } from '../components/CodeEditor';\nimport { RESULT_DISPLAY_CSS } from '../components/ResultDisplay';\n\nexport interface ColumnConfig {\n title: string;\n className?: string;\n contentClassName?: string;\n}\n\nexport interface MultiColumnLayoutOptions {\n columns: ColumnConfig[];\n layout?: 'horizontal' | 'vertical';\n height?: string;\n showHeader?: boolean;\n title?: string;\n useShadowDOM?: boolean;\n gap?: string;\n}\n\nexport interface MultiColumnLayoutAPI extends ComponentAPI {\n getColumnElement(index: number): HTMLElement | null;\n getColumnContentElement(index: number): HTMLElement | null;\n setLayout(layout: 'horizontal' | 'vertical'): void;\n getLayout(): string;\n}\n\nconst MULTI_COLUMN_CSS = `\n/* Multi-Column Layout Component Styles */\n.explorer-multi-column-layout {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: transparent;\n overflow: hidden;\n}\n\n.explorer-multi-column-layout__content {\n display: grid;\n flex: 1;\n gap: var(--column-gap, 16px);\n height: 100%;\n min-height: 0;\n}\n\n.explorer-multi-column-layout__content--horizontal {\n grid-auto-flow: column;\n grid-auto-columns: 1fr;\n}\n\n.explorer-multi-column-layout__content--vertical {\n grid-auto-flow: row;\n grid-auto-rows: 1fr;\n}\n\n/* Responsive design */\n@media (max-width: 1024px) {\n .explorer-multi-column-layout__content--horizontal {\n grid-auto-flow: row;\n grid-auto-rows: minmax(300px, 1fr);\n gap: 12px;\n }\n}\n\n@media (max-width: 768px) {\n .explorer-multi-column-layout__content {\n gap: 8px;\n }\n}\n`;\n\n/**\n * Create a multi-column layout component\n */\nexport function createMultiColumnLayout(\n elementOrSelector: HTMLElement | string,\n options: MultiColumnLayoutOptions,\n): {\n api: MultiColumnLayoutAPI;\n contentElement: HTMLElement;\n columnContainers: UnifiedContainerAPI[];\n cleanup: Array<() => void>;\n} {\n const { columns, layout = 'horizontal', gap = '16px' } = options;\n\n if (!columns || columns.length === 0) {\n throw new Error(\n 'MultiColumnLayout requires at least one column configuration',\n );\n }\n\n // Create base component with shadow DOM for CSS isolation\n const baseComponent = createComponent(elementOrSelector, {\n autoMount: false,\n useShadowDOM: true, // Always use shadow DOM for optimal CSS isolation\n });\n\n const element = baseComponent.getElement()!;\n const shadowRoot = baseComponent.getShadowRoot();\n const contentRoot = baseComponent.getContentRoot() as HTMLElement;\n\n // Add classes for styling\n element.classList.add('explorer-multi-column-layout');\n contentRoot.classList.add('explorer-multi-column-layout');\n\n // Component state\n let currentLayout = layout;\n const columnContainers: UnifiedContainerAPI[] = [];\n const cleanupFunctions: Array<() => void> = [];\n\n /**\n * Inject all CSS styles (foundation, layout, and child component styles)\n */\n function injectStyles(): void {\n if (!shadowRoot) {\n throw new Error(\n 'MultiColumnLayout requires shadow DOM for CSS isolation',\n );\n }\n\n // Inject all required CSS into the single shadow DOM\n // 1. Foundation theme variables (required by all components)\n baseComponent.injectCSS(CSS_THEME_VARIABLES, 'explorer-foundation-theme');\n\n // 2. Syntax highlighting (required by CodeEditor and ResultDisplay)\n baseComponent.injectCSS(\n CSS_SYNTAX_HIGHLIGHTING,\n 'syntax-highlighting-styles',\n );\n\n // 3. Component-specific styles\n baseComponent.injectCSS(CODE_EDITOR_CSS, 'code-editor-styles');\n baseComponent.injectCSS(RESULT_DISPLAY_CSS, 'result-display-styles');\n\n // 4. Layout-specific styles\n baseComponent.injectCSS(\n MULTI_COLUMN_CSS,\n 'explorer-multi-column-layout-styles',\n );\n }\n\n /**\n * Create the column structure\n */\n function createColumns(): HTMLElement {\n const contentElement = createElement('div', {\n className: `explorer-multi-column-layout__content explorer-multi-column-layout__content--${currentLayout}`,\n });\n\n // Set CSS custom property for gap\n contentElement.style.setProperty('--column-gap', gap);\n\n // Create each column\n columns.forEach((columnConfig, index) => {\n const container = createUnifiedContainer({\n className: `explorer-multi-column-layout__column ${columnConfig.className || ''}`,\n contentClassName: columnConfig.contentClassName,\n showHeader: true,\n headerOptions: {\n title: columnConfig.title,\n },\n shadowRoot: shadowRoot,\n });\n\n columnContainers.push(container);\n contentElement.appendChild(container.getElement());\n });\n\n return contentElement;\n }\n\n /**\n * Initialize the layout\n */\n function initialize(): HTMLElement {\n injectStyles();\n const contentElement = createColumns();\n contentRoot.appendChild(contentElement);\n return contentElement;\n }\n\n // Create the layout\n const contentElement = initialize();\n\n // Enhanced API\n const api: MultiColumnLayoutAPI = {\n ...baseComponent,\n\n getColumnElement(index: number): HTMLElement | null {\n if (index < 0 || index >= columnContainers.length) {\n return null;\n }\n return columnContainers[index].getElement();\n },\n\n getColumnContentElement(index: number): HTMLElement | null {\n if (index < 0 || index >= columnContainers.length) {\n return null;\n }\n return columnContainers[index].getContentElement();\n },\n\n setLayout(newLayout: 'horizontal' | 'vertical'): void {\n if (newLayout === currentLayout) return;\n\n currentLayout = newLayout;\n const content = contentRoot.querySelector(\n '.explorer-multi-column-layout__content',\n );\n if (content) {\n content.className = `explorer-multi-column-layout__content explorer-multi-column-layout__content--${currentLayout}`;\n }\n },\n\n getLayout(): string {\n return currentLayout;\n },\n\n destroy(): void {\n // Cleanup column containers\n columnContainers.forEach((container) => {\n container.destroy?.();\n });\n\n // Run cleanup functions\n cleanupFunctions.forEach((fn) => fn());\n\n // Destroy base component\n baseComponent.destroy();\n },\n };\n\n return {\n api,\n contentElement,\n columnContainers,\n cleanup: cleanupFunctions,\n };\n}\n","/**\n * Syntax Highlighting - Lightweight syntax highlighting without external dependencies\n *\n * Features:\n * - JavaScript, HTML, CSS, JSON syntax highlighting\n * - Regex-based parsing for performance\n * - Customizable themes\n * - No external dependencies\n */\n\nexport interface SyntaxToken {\n type: string;\n value: string;\n start: number;\n end: number;\n}\n\nexport type SupportedLanguage =\n | 'javascript'\n | 'html'\n | 'css'\n | 'json'\n | 'typescript'\n | 'text';\n\n/**\n * Language definitions with regex patterns\n */\nconst languageDefinitions: Record<\n SupportedLanguage,\n Array<{ type: string; pattern: RegExp; className: string }>\n> = {\n javascript: [\n {\n type: 'comment',\n pattern: /\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*$/gm,\n className: 'syntax-comment',\n },\n {\n type: 'string',\n pattern: /\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|`(?:\\\\.|[^`\\\\])*`/g,\n className: 'syntax-string',\n },\n {\n type: 'keyword',\n pattern:\n /\\b(?:async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|export|extends|finally|for|function|if|import|in|instanceof|let|new|return|super|switch|this|throw|try|typeof|var|void|while|with|yield)\\b/g,\n className: 'syntax-keyword',\n },\n {\n type: 'boolean',\n pattern: /\\b(?:true|false|null|undefined)\\b/g,\n className: 'syntax-keyword',\n },\n {\n type: 'number',\n pattern: /\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b/g,\n className: 'syntax-number',\n },\n {\n type: 'function',\n pattern: /\\b[a-zA-Z_$][a-zA-Z0-9_$]*(?=\\s*\\()/g,\n className: 'syntax-function',\n },\n {\n type: 'operator',\n pattern:\n /[+\\-*/%=!<>?:&|^~]+|===|!==|==|!=|<=|>=|\\|\\||&&|\\+\\+|--|=>|\\.\\.\\./g,\n className: 'syntax-operator',\n },\n ],\n\n typescript: [\n {\n type: 'comment',\n pattern: /\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*$/gm,\n className: 'syntax-comment',\n },\n {\n type: 'string',\n pattern: /\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|`(?:\\\\.|[^`\\\\])*`/g,\n className: 'syntax-string',\n },\n {\n type: 'keyword',\n pattern:\n /\\b(?:abstract|any|as|async|await|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|namespace|new|private|protected|public|readonly|return|set|static|string|super|switch|this|throw|try|type|typeof|var|void|while|with|yield)\\b/g,\n className: 'syntax-keyword',\n },\n {\n type: 'boolean',\n pattern: /\\b(?:true|false|null|undefined)\\b/g,\n className: 'syntax-keyword',\n },\n {\n type: 'number',\n pattern: /\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b/g,\n className: 'syntax-number',\n },\n {\n type: 'function',\n pattern: /\\b[a-zA-Z_$][a-zA-Z0-9_$]*(?=\\s*\\()/g,\n className: 'syntax-function',\n },\n {\n type: 'type',\n pattern: /\\b[A-Z][a-zA-Z0-9]*\\b/g,\n className: 'syntax-type',\n },\n {\n type: 'operator',\n pattern:\n /[+\\-*/%=!<>?:&|^~]+|===|!==|==|!=|<=|>=|\\|\\||&&|\\+\\+|--|=>|\\.\\.\\./g,\n className: 'syntax-operator',\n },\n ],\n\n html: [\n {\n type: 'comment',\n pattern: /<!--[\\s\\S]*?-->/g,\n className: 'syntax-comment',\n },\n {\n type: 'tag',\n pattern: /<\\/?[a-zA-Z][a-zA-Z0-9-]*\\b/g,\n className: 'syntax-tag',\n },\n {\n type: 'elb-attribute',\n pattern: /\\bdata-elb[a-zA-Z-]*(?==)/g,\n className: 'syntax-elb-attribute',\n },\n {\n type: 'elb-value',\n pattern:\n /(?<=data-elb[a-zA-Z-]*=)\"[^\"]*\"|(?<=data-elb[a-zA-Z-]*=)'[^']*'/g,\n className: 'syntax-elb-value',\n },\n {\n type: 'attribute',\n pattern: /\\b[a-zA-Z-]+(?==)/g,\n className: 'syntax-attribute',\n },\n { type: 'value', pattern: /\"[^\"]*\"|'[^']*'/g, className: 'syntax-value' },\n ],\n\n json: [\n {\n type: 'key',\n pattern: /\"(?:\\\\.|[^\"\\\\])*\"(?=\\s*:)/g,\n className: 'syntax-attribute',\n },\n {\n type: 'string',\n pattern: /\"(?:\\\\.|[^\"\\\\])*\"/g,\n className: 'syntax-string',\n },\n {\n type: 'number',\n pattern: /-?\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b/g,\n className: 'syntax-number',\n },\n {\n type: 'boolean',\n pattern: /\\b(true|false|null)\\b/g,\n className: 'syntax-keyword',\n },\n ],\n\n css: [\n {\n type: 'comment',\n pattern: /\\/\\*[\\s\\S]*?\\*\\//g,\n className: 'syntax-comment',\n },\n {\n type: 'selector',\n pattern: /[.#]?[a-zA-Z][\\w-]*(?=\\s*\\{)/g,\n className: 'syntax-tag',\n },\n {\n type: 'property',\n pattern: /(?<=\\{|\\;)\\s*[a-zA-Z-]+(?=\\s*:)/g,\n className: 'syntax-property',\n },\n {\n type: 'value',\n pattern: /(?<=:\\s*)[^;}]+/g,\n className: 'syntax-string',\n },\n {\n type: 'unit',\n pattern: /\\b\\d+(?:px|em|rem|%|vh|vw|pt|pc|in|cm|mm|ex|ch|fr)\\b/g,\n className: 'syntax-number',\n },\n {\n type: 'color',\n pattern:\n /#[0-9a-fA-F]{3,6}\\b|rgb\\([^)]+\\)|rgba\\([^)]+\\)|hsl\\([^)]+\\)|hsla\\([^)]+\\)/g,\n className: 'syntax-number',\n },\n ],\n\n text: [],\n};\n\n/**\n * Highlight syntax for given language\n */\nexport function highlightSyntax(\n code: string,\n language: SupportedLanguage = 'text',\n): string {\n if (language === 'text' || !code.trim()) {\n return escapeHtml(code);\n }\n\n const definition = languageDefinitions[language];\n if (!definition) {\n return escapeHtml(code);\n }\n\n // Collect all matches with their positions\n const matches: Array<{\n start: number;\n end: number;\n type: string;\n className: string;\n content: string;\n }> = [];\n\n definition.forEach(({ type, pattern, className }) => {\n let match;\n while ((match = pattern.exec(code)) !== null) {\n matches.push({\n start: match.index,\n end: match.index + match[0].length,\n type,\n className,\n content: match[0],\n });\n }\n });\n\n // Sort matches by start position\n matches.sort((a, b) => a.start - b.start);\n\n // Remove overlapping matches (keep the first one)\n const filteredMatches = [];\n let lastEnd = 0;\n\n for (const match of matches) {\n if (match.start >= lastEnd) {\n filteredMatches.push(match);\n lastEnd = match.end;\n }\n }\n\n // Build highlighted HTML\n let result = '';\n let currentPos = 0;\n\n for (const match of filteredMatches) {\n // Add text before the match\n if (match.start > currentPos) {\n result += escapeHtml(code.slice(currentPos, match.start));\n }\n\n // Add highlighted match\n result += `<span class=\"${match.className}\">${escapeHtml(match.content)}</span>`;\n currentPos = match.end;\n }\n\n // Add remaining text\n if (currentPos < code.length) {\n result += escapeHtml(code.slice(currentPos));\n }\n\n return result;\n}\n\n/**\n * Get language from file extension or MIME type\n */\nexport function detectLanguage(filename: string): SupportedLanguage {\n const extension = filename.split('.').pop()?.toLowerCase();\n\n switch (extension) {\n case 'js':\n case 'jsx':\n return 'javascript';\n case 'ts':\n case 'tsx':\n return 'typescript';\n case 'html':\n case 'htm':\n return 'html';\n case 'css':\n return 'css';\n case 'json':\n return 'json';\n default:\n return 'text';\n }\n}\n\n/**\n * Format code with basic indentation\n */\nexport function formatCode(\n code: string,\n language: SupportedLanguage,\n indentSize = 2,\n): string {\n if (language === 'json') {\n try {\n return JSON.stringify(JSON.parse(code), null, indentSize);\n } catch {\n return code; // Return original if parsing fails\n }\n }\n\n if (language === 'html') {\n return formatHTML(code, indentSize);\n }\n\n // Basic formatting for other languages\n return code\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join('\\n');\n}\n\n/**\n * Format HTML with proper indentation\n */\nfunction formatHTML(html: string, indentSize = 2): string {\n const tab = ' '.repeat(indentSize);\n let result = '';\n let indent = 0;\n\n // Split by tags but preserve content\n const tokens = html.split(/(<\\/?[^>]+>)/g).filter((token) => token.trim());\n\n for (const token of tokens) {\n if (token.startsWith('</')) {\n // Closing tag\n indent = Math.max(0, indent - 1);\n result += tab.repeat(indent) + token + '\\n';\n } else if (\n token.startsWith('<') &&\n !token.endsWith('/>') &&\n !token.includes('</')\n ) {\n // Opening tag\n result += tab.repeat(indent) + token + '\\n';\n indent++;\n } else if (token.startsWith('<')) {\n // Self-closing tag\n result += tab.repeat(indent) + token + '\\n';\n } else {\n // Content\n const trimmed = token.trim();\n if (trimmed) {\n result += tab.repeat(indent) + trimmed + '\\n';\n }\n }\n }\n\n return result.trim();\n}\n\n/**\n * Escape HTML characters\n */\nfunction escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n };\n\n return text.replace(/[&<>\"']/g, (char) => map[char]);\n}\n\n/**\n * Get CSS for syntax highlighting\n * @deprecated Use CSS_SYNTAX_HIGHLIGHTING from css-theme-system.ts for enhanced shadow DOM support\n */\nexport function getSyntaxHighlightCSS(): string {\n // Import the enhanced CSS from the theme system for consistency\n // This maintains backward compatibility while using the improved system\n const { CSS_SYNTAX_HIGHLIGHTING } = require('../core/css-theme-system');\n return CSS_SYNTAX_HIGHLIGHTING;\n}\n\n/**\n * Create a syntax-highlighted code block\n */\nexport function createCodeBlock(\n code: string,\n language: SupportedLanguage = 'text',\n options: {\n className?: string;\n maxHeight?: string;\n } = {},\n): HTMLElement {\n const pre = document.createElement('pre');\n const codeElement = document.createElement('code');\n\n // Set classes\n pre.className = `syntax-highlight ${options.className || ''}`;\n codeElement.className = `language-${language}`;\n\n // Highlight and set content\n codeElement.innerHTML = highlightSyntax(code, language);\n pre.appendChild(codeElement);\n\n // Set max height if specified\n if (options.maxHeight) {\n pre.style.maxHeight = options.maxHeight;\n pre.style.overflow = 'auto';\n }\n\n return pre;\n}\n\n/**\n * Extract tokens from code for advanced processing\n */\nexport function tokenize(\n code: string,\n language: SupportedLanguage,\n): SyntaxToken[] {\n const definition = languageDefinitions[language];\n if (!definition) {\n return [{ type: 'text', value: code, start: 0, end: code.length }];\n }\n\n const tokens: SyntaxToken[] = [];\n const matches: Array<{\n start: number;\n end: number;\n type: string;\n value: string;\n }> = [];\n\n // Collect all matches\n definition.forEach(({ type, pattern }) => {\n let match;\n while ((match = pattern.exec(code)) !== null) {\n matches.push({\n start: match.index,\n end: match.index + match[0].length,\n type,\n value: match[0],\n });\n }\n });\n\n // Sort and filter overlapping matches\n matches.sort((a, b) => a.start - b.start);\n\n let currentPos = 0;\n for (const match of matches) {\n if (match.start >= currentPos) {\n // Add text token before this match\n if (match.start > currentPos) {\n tokens.push({\n type: 'text',\n value: code.slice(currentPos, match.start),\n start: currentPos,\n end: match.start,\n });\n }\n\n // Add the match token\n tokens.push({\n type: match.type,\n value: match.value,\n start: match.start,\n end: match.end,\n });\n\n currentPos = match.end;\n }\n }\n\n // Add remaining text\n if (currentPos < code.length) {\n tokens.push({\n type: 'text',\n value: code.slice(currentPos),\n start: currentPos,\n end: code.length,\n });\n }\n\n return tokens;\n}\n","/**\n * Performance Utilities - Debouncing, throttling, and other performance helpers\n *\n * Features:\n * - Debounce with immediate execution option\n * - Throttle for high-frequency events\n * - RAF-based scheduling\n * - Memory-efficient cleanup\n */\n\n/**\n * Debounce function - delays execution until after delay milliseconds have elapsed\n * since the last time it was invoked\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number,\n immediate = false,\n): {\n (...args: Parameters<T>): void;\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n} {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: Parameters<T> | undefined;\n let lastResult: ReturnType<T>;\n\n const debounced = (...args: Parameters<T>): void => {\n lastArgs = args;\n\n const callNow = immediate && !timeoutId;\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = undefined;\n if (!immediate) {\n lastResult = func(...args);\n }\n }, delay);\n\n if (callNow) {\n lastResult = func(...args);\n }\n };\n\n debounced.cancel = (): void => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n };\n\n debounced.flush = (): ReturnType<T> | undefined => {\n if (timeoutId && lastArgs) {\n debounced.cancel();\n lastResult = func(...lastArgs);\n }\n return lastResult;\n };\n\n return debounced;\n}\n\n/**\n * Throttle function - ensures function is called at most once per specified interval\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n interval: number,\n options: { leading?: boolean; trailing?: boolean } = {},\n): {\n (...args: Parameters<T>): void;\n cancel(): void;\n} {\n const { leading = true, trailing = true } = options;\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let lastCallTime: number | undefined;\n let lastArgs: Parameters<T> | undefined;\n\n const throttled = (...args: Parameters<T>): void => {\n const now = Date.now();\n\n if (!lastCallTime && !leading) {\n lastCallTime = now;\n }\n\n const remaining = interval - (now - (lastCallTime || 0));\n\n lastArgs = args;\n\n if (remaining <= 0 || remaining > interval) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n lastCallTime = now;\n func(...args);\n } else if (!timeoutId && trailing) {\n timeoutId = setTimeout(() => {\n lastCallTime = leading ? Date.now() : undefined;\n timeoutId = undefined;\n if (lastArgs) {\n func(...lastArgs);\n }\n }, remaining);\n }\n };\n\n throttled.cancel = (): void => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n lastCallTime = undefined;\n };\n\n return throttled;\n}\n\n/**\n * RAF-based throttle for smooth animations\n */\nexport function rafThrottle<T extends (...args: any[]) => any>(\n func: T,\n): {\n (...args: Parameters<T>): void;\n cancel(): void;\n} {\n let rafId: number | undefined;\n let lastArgs: Parameters<T> | undefined;\n\n const throttled = (...args: Parameters<T>): void => {\n lastArgs = args;\n\n if (!rafId) {\n rafId = requestAnimationFrame(() => {\n rafId = undefined;\n if (lastArgs) {\n func(...lastArgs);\n }\n });\n }\n };\n\n throttled.cancel = (): void => {\n if (rafId) {\n cancelAnimationFrame(rafId);\n rafId = undefined;\n }\n };\n\n return throttled;\n}\n\n/**\n * Async debounce for promises\n */\nexport function debounceAsync<T extends (...args: any[]) => Promise<any>>(\n func: T,\n delay: number,\n): {\n (...args: Parameters<T>): Promise<Awaited<ReturnType<T>>>;\n cancel(): void;\n} {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let pendingPromise: Promise<Awaited<ReturnType<T>>> | undefined;\n let resolvePending: ((value: Awaited<ReturnType<T>>) => void) | undefined;\n let rejectPending: ((reason: any) => void) | undefined;\n\n const debounced = (\n ...args: Parameters<T>\n ): Promise<Awaited<ReturnType<T>>> => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n if (!pendingPromise) {\n pendingPromise = new Promise<Awaited<ReturnType<T>>>(\n (resolve, reject) => {\n resolvePending = resolve;\n rejectPending = reject;\n },\n );\n }\n\n timeoutId = setTimeout(async () => {\n try {\n const result = await func(...args);\n resolvePending?.(result);\n } catch (error) {\n rejectPending?.(error);\n } finally {\n timeoutId = undefined;\n pendingPromise = undefined;\n resolvePending = undefined;\n rejectPending = undefined;\n }\n }, delay);\n\n return pendingPromise;\n };\n\n debounced.cancel = (): void => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n if (rejectPending) {\n rejectPending(new Error('Debounced async function cancelled'));\n pendingPromise = undefined;\n resolvePending = undefined;\n rejectPending = undefined;\n }\n };\n\n return debounced;\n}\n\n/**\n * Batch multiple calls into a single execution\n */\nexport function batch<T>(\n func: (items: T[]) => void,\n maxBatchSize = 10,\n maxWaitTime = 100,\n): {\n (item: T): void;\n flush(): void;\n cancel(): void;\n} {\n let batch: T[] = [];\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const flush = (): void => {\n if (batch.length > 0) {\n const currentBatch = batch;\n batch = [];\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n func(currentBatch);\n }\n };\n\n const batchedFunc = (item: T): void => {\n batch.push(item);\n\n if (batch.length >= maxBatchSize) {\n flush();\n } else if (!timeoutId) {\n timeoutId = setTimeout(flush, maxWaitTime);\n }\n };\n\n batchedFunc.flush = flush;\n\n batchedFunc.cancel = (): void => {\n batch = [];\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n };\n\n return batchedFunc;\n}\n\n/**\n * Memoize function results with optional TTL\n */\nexport function memoize<T extends (...args: any[]) => any>(\n func: T,\n options: {\n maxSize?: number;\n ttl?: number;\n keyGenerator?: (...args: Parameters<T>) => string;\n } = {},\n): T & { clear(): void; delete(...args: Parameters<T>): boolean } {\n const {\n maxSize = 100,\n ttl,\n keyGenerator = (...args) => JSON.stringify(args),\n } = options;\n\n const cache = new Map<string, { value: ReturnType<T>; timestamp: number }>();\n\n const memoized = ((...args: Parameters<T>): ReturnType<T> => {\n const key = keyGenerator(...args);\n const now = Date.now();\n\n const cached = cache.get(key);\n if (cached) {\n // Check TTL if specified\n if (!ttl || now - cached.timestamp < ttl) {\n return cached.value;\n } else {\n cache.delete(key);\n }\n }\n\n const result = func(...args);\n\n // Add to cache\n cache.set(key, { value: result, timestamp: now });\n\n // Enforce max size\n if (cache.size > maxSize) {\n const firstKey = cache.keys().next().value;\n if (firstKey !== undefined) {\n cache.delete(firstKey);\n }\n }\n\n return result;\n }) as T & { clear(): void; delete(...args: Parameters<T>): boolean };\n\n memoized.clear = (): void => {\n cache.clear();\n };\n\n memoized.delete = (...args: Parameters<T>): boolean => {\n const key = keyGenerator(...args);\n return cache.delete(key);\n };\n\n return memoized;\n}\n\n/**\n * Schedule work to be done during idle time\n */\nexport function scheduleIdleWork<T>(\n work: () => T,\n options: { timeout?: number } = {},\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const { timeout = 5000 } = options;\n\n if (window.requestIdleCallback) {\n const id = window.requestIdleCallback(\n (deadline) => {\n try {\n const result = work();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n },\n { timeout },\n );\n\n // Fallback timeout\n setTimeout(() => {\n window.cancelIdleCallback(id);\n try {\n const result = work();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n }, timeout);\n } else {\n // Fallback for browsers without requestIdleCallback\n setTimeout(() => {\n try {\n const result = work();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n }, 0);\n }\n });\n}\n\n/**\n * Measure execution time of a function\n */\nexport function measurePerformance<T extends (...args: any[]) => any>(\n func: T,\n label?: string,\n): T & {\n getStats(): { averageTime: number; callCount: number; totalTime: number };\n} {\n let totalTime = 0;\n let callCount = 0;\n\n const measured = ((...args: Parameters<T>): ReturnType<T> => {\n const start = performance.now();\n\n try {\n const result = func(...args);\n\n // Handle both sync and async functions\n if (result && typeof result.then === 'function') {\n return result.finally(() => {\n const end = performance.now();\n const duration = end - start;\n totalTime += duration;\n callCount++;\n\n if (label) {\n console.log(`${label}: ${duration.toFixed(2)}ms`);\n }\n });\n } else {\n const end = performance.now();\n const duration = end - start;\n totalTime += duration;\n callCount++;\n\n if (label) {\n console.log(`${label}: ${duration.toFixed(2)}ms`);\n }\n\n return result;\n }\n } catch (error) {\n const end = performance.now();\n const duration = end - start;\n totalTime += duration;\n callCount++;\n\n if (label) {\n console.log(`${label} (error): ${duration.toFixed(2)}ms`);\n }\n\n throw error;\n }\n }) as T & {\n getStats(): { averageTime: number; callCount: number; totalTime: number };\n };\n\n measured.getStats = () => ({\n averageTime: callCount > 0 ? totalTime / callCount : 0,\n callCount,\n totalTime,\n });\n\n return measured;\n}\n","/**\n * CodeEditor Component - Interactive code editor with syntax highlighting\n *\n * Features:\n * - Syntax highlighting for multiple languages\n * - Live editing with change events\n * - Copy to clipboard functionality\n * - Theme-aware styling\n * - Functional factory pattern\n */\n\nimport { createComponent, type ComponentAPI } from '../core/Component';\nimport { highlightSyntax, type SupportedLanguage } from '../utils/syntax';\nimport {\n createElement,\n addEventListener,\n injectComponentCSS,\n} from '../utils/dom';\nimport { debounce } from '../utils/debounce';\n\nexport const CODE_EDITOR_CSS = `\n/* CodeEditor Component Styles */\n.explorer-code-editor {\n position: relative;\n background: var(--explorer-bg-primary);\n overflow: hidden;\n font-family: 'Fira Code', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace;\n height: 100%;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n}\n\n.explorer-code-editor * {\n box-sizing: border-box;\n}\n\n.explorer-code-editor:focus-within {\n border-color: var(--explorer-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1), 0 1px 3px 0 rgba(0, 0, 0, 0.1);\n}\n\n.explorer-code-editor--readonly {\n background: var(--explorer-bg-tertiary);\n}\n\n.explorer-code-editor__content {\n position: relative;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.explorer-code-editor__textarea {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n padding: 4px !important;\n margin: 0 !important;\n border: none !important;\n outline: none !important;\n background: transparent !important;\n color: transparent !important;\n font-family: 'Fira Code', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace !important;\n font-size: 14px !important;\n line-height: 1.6 !important;\n resize: none !important;\n z-index: 2 !important;\n white-space: pre !important;\n overflow-wrap: normal !important;\n word-break: normal !important;\n caret-color: var(--explorer-text-primary) !important;\n box-sizing: border-box !important;\n /* Force cursor visibility and animation */\n cursor: text !important;\n}\n\n.explorer-code-editor__textarea::placeholder {\n color: var(--explorer-text-muted);\n font-style: italic;\n}\n\n/* Ensure cursor animation is enabled */\n.explorer-code-editor__textarea:focus {\n caret-color: var(--explorer-text-primary) !important;\n animation: none !important; /* Remove any conflicting animations */\n}\n\n/* Force caret visibility across browsers */\n@supports (caret-color: var(--explorer-text-primary)) {\n .explorer-code-editor__textarea {\n caret-color: var(--explorer-text-primary) !important;\n }\n}\n\n/* Fallback for browsers that don't support caret-color */\n@supports not (caret-color: var(--explorer-text-primary)) {\n .explorer-code-editor__textarea {\n color: var(--explorer-text-primary) !important;\n text-shadow: none !important;\n background: transparent !important;\n }\n .explorer-code-editor__highlight {\n display: none !important;\n }\n}\n\n.explorer-code-editor__highlight {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n padding: 4px !important;\n margin: 0 !important;\n border: none !important;\n background: transparent !important;\n color: var(--explorer-text-primary) !important;\n font-family: 'Fira Code', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace !important;\n font-size: 14px !important;\n line-height: 1.6 !important;\n white-space: pre !important;\n overflow-wrap: normal !important;\n word-break: normal !important;\n z-index: 1 !important;\n pointer-events: none !important;\n overflow: auto !important;\n box-sizing: border-box !important;\n}\n\n.explorer-code-editor__highlight pre {\n margin: 0;\n padding: 0;\n background: transparent;\n color: var(--explorer-text-primary);\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .explorer-code-editor__textarea,\n .explorer-code-editor__highlight {\n font-size: 13px;\n padding: 4px;\n }\n}\n`;\n\nexport interface CodeEditorOptions {\n language?: SupportedLanguage;\n value?: string;\n placeholder?: string;\n readOnly?: boolean;\n tabSize?: number;\n fontSize?: string;\n height?: string;\n maxHeight?: string;\n onChange?: (value: string, language: SupportedLanguage) => void;\n onLanguageChange?: (language: SupportedLanguage) => void;\n}\n\nexport interface CodeEditorAPI extends ComponentAPI {\n getValue(): string;\n setValue(value: string): void;\n getLanguage(): SupportedLanguage;\n setLanguage(language: SupportedLanguage): void;\n focus(): void;\n selectAll(): void;\n insertText(text: string): void;\n getSelection(): { start: number; end: number; text: string };\n}\n\n/**\n * Create a CodeEditor component\n */\nexport function createCodeEditor(\n elementOrSelector: HTMLElement | string,\n options: CodeEditorOptions = {},\n): CodeEditorAPI {\n const baseComponent = createComponent(elementOrSelector, {\n autoMount: false,\n useShadowDOM: false, // No shadow DOM - parent layout provides CSS isolation\n });\n\n const element = baseComponent.getElement()!;\n const shadowRoot = baseComponent.getShadowRoot();\n const contentRoot = baseComponent.getContentRoot() as HTMLElement;\n\n // Add class to both host element (for tests/API) and content root (for styling)\n element.classList.add('explorer-code-editor');\n contentRoot.classList.add('explorer-code-editor');\n\n // Component state\n let currentValue = options.value || '';\n let currentLanguage: SupportedLanguage = options.language || 'text';\n let textArea: HTMLTextAreaElement;\n let highlightLayer: HTMLElement;\n let isHighlighting = false;\n let lastHighlightedValue = ''; // Cache last highlighted value to avoid unnecessary work\n\n // Cleanup functions\n const cleanupFunctions: Array<() => void> = [];\n\n // Debounced highlighting for performance\n const debouncedHighlight = debounce(() => {\n updateHighlighting();\n }, 20);\n\n // Debounced change notification\n const debouncedChange = debounce((value: string) => {\n options.onChange?.(value, currentLanguage);\n }, 200);\n\n /**\n * CSS injection handled by parent MultiColumnLayout\n */\n function injectStyles(): void {\n // CSS is injected by parent MultiColumnLayout - no individual injection needed\n // This reduces CSS duplication and shadow DOM overhead\n }\n\n /**\n * Create the DOM structure\n */\n function createDOM(): void {\n contentRoot.innerHTML = '';\n\n // Create content container\n const content = createElement('div', {\n className: 'explorer-code-editor__content',\n });\n\n // Set height\n if (options.height) {\n content.style.height = options.height;\n } else if (options.maxHeight) {\n content.style.maxHeight = options.maxHeight;\n content.style.overflow = 'auto';\n } else {\n content.style.height = '100%';\n }\n\n // Create textarea\n textArea = createElement('textarea', {\n className: 'explorer-code-editor__textarea',\n placeholder: options.placeholder || `Enter ${currentLanguage} code...`,\n spellcheck: 'false',\n autocomplete: 'off',\n autocorrect: 'off',\n autocapitalize: 'off',\n }) as HTMLTextAreaElement;\n\n if (options.readOnly) {\n textArea.readOnly = true;\n element.classList.add('explorer-code-editor--readonly');\n }\n\n if (options.tabSize) {\n textArea.style.tabSize = options.tabSize.toString();\n }\n\n if (options.fontSize) {\n textArea.style.fontSize = options.fontSize;\n }\n\n textArea.value = currentValue;\n\n // Create highlight layer\n highlightLayer = createElement('div', {\n className: 'explorer-code-editor__highlight',\n });\n\n content.appendChild(highlightLayer);\n content.appendChild(textArea);\n\n contentRoot.appendChild(content);\n }\n\n /**\n * Update syntax highlighting\n */\n function updateHighlighting(): void {\n if (isHighlighting || currentValue === lastHighlightedValue) return;\n isHighlighting = true;\n\n requestAnimationFrame(() => {\n const highlighted = highlightSyntax(currentValue, currentLanguage);\n highlightLayer.innerHTML = `<pre>${highlighted}</pre>`;\n lastHighlightedValue = currentValue;\n isHighlighting = false;\n });\n }\n\n /**\n * Setup event listeners\n */\n function setupEventListeners(): void {\n // Textarea events\n const onInput = () => {\n const newValue = textArea.value;\n if (newValue !== currentValue) {\n currentValue = newValue;\n debouncedHighlight();\n debouncedChange(newValue);\n }\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n // Tab handling\n if (e.key === 'Tab') {\n e.preventDefault();\n const start = textArea.selectionStart;\n const end = textArea.selectionEnd;\n const tabChar = ' '.repeat(options.tabSize || 2);\n\n textArea.value =\n currentValue.substring(0, start) +\n tabChar +\n currentValue.substring(end);\n textArea.selectionStart = textArea.selectionEnd =\n start + tabChar.length;\n\n onInput();\n }\n };\n\n const onScroll = () => {\n highlightLayer.scrollTop = textArea.scrollTop;\n highlightLayer.scrollLeft = textArea.scrollLeft;\n };\n\n // Add click event to ensure focus\n const onClick = () => {\n textArea.focus();\n };\n\n cleanupFunctions.push(addEventListener(textArea, 'input', onInput));\n cleanupFunctions.push(addEventListener(textArea, 'keydown', onKeyDown));\n cleanupFunctions.push(addEventListener(textArea, 'scroll', onScroll));\n cleanupFunctions.push(addEventListener(contentRoot, 'click', onClick));\n cleanupFunctions.push(addEventListener(highlightLayer, 'click', onClick));\n }\n\n // Enhanced API\n const api: CodeEditorAPI = {\n ...baseComponent,\n\n getValue(): string {\n return currentValue;\n },\n\n setValue(value: string): void {\n currentValue = value;\n textArea.value = value;\n updateHighlighting();\n },\n\n getLanguage(): SupportedLanguage {\n return currentLanguage;\n },\n\n setLanguage(language: SupportedLanguage): void {\n currentLanguage = language;\n textArea.placeholder = options.placeholder || `Enter ${language} code...`;\n\n updateHighlighting();\n options.onLanguageChange?.(language);\n },\n\n focus(): void {\n textArea.focus();\n },\n\n selectAll(): void {\n textArea.select();\n },\n\n insertText(text: string): void {\n const start = textArea.selectionStart;\n const end = textArea.selectionEnd;\n\n const newValue =\n currentValue.substring(0, start) + text + currentValue.substring(end);\n this.setValue(newValue);\n\n // Move cursor to end of inserted text\n textArea.selectionStart = textArea.selectionEnd = start + text.length;\n textArea.focus();\n\n options.onChange?.(newValue, currentLanguage);\n },\n\n getSelection(): { start: number; end: number; text: string } {\n const start = textArea.selectionStart;\n const end = textArea.selectionEnd;\n return {\n start,\n end,\n text: currentValue.substring(start, end),\n };\n },\n\n destroy(): void {\n cleanupFunctions.forEach((cleanup) => cleanup());\n cleanupFunctions.length = 0;\n baseComponent.destroy();\n },\n };\n\n // Initialize component\n injectStyles();\n createDOM();\n setupEventListeners();\n updateHighlighting();\n\n // Mount the base component\n api.mount();\n\n // Auto-focus the textarea after a brief delay to ensure cursor is visible\n setTimeout(() => {\n if (!options.readOnly) {\n textArea.focus();\n }\n }, 100);\n\n return api;\n}\n","/**\n * ResultDisplay Component - Display execution results, logs, and errors\n *\n * Features:\n * - Multiple result types (value, error, log)\n * - JSON formatting and syntax highlighting\n * - Collapsible sections\n * - Copy functionality\n * - Theme-aware styling\n * - Functional factory pattern\n */\n\nimport { createComponent, type ComponentAPI } from '../core/Component';\nimport { highlightSyntax } from '../utils/syntax';\nimport {\n createElement,\n addEventListener,\n copyToClipboard,\n injectCSS,\n} from '../utils/dom';\n\nexport const RESULT_DISPLAY_CSS = `\n/* ResultDisplay Component Styles */\n.explorer-result-display {\n background: var(--explorer-bg-primary);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n height: 100%;\n box-sizing: border-box;\n}\n\n.explorer-result-display * {\n box-sizing: border-box;\n}\n\n.explorer-result-display__content {\n flex: 1;\n overflow-y: auto;\n padding: 4px;\n font-family: 'Fira Code', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace;\n font-size: 13px;\n line-height: 1.4;\n}\n\n.explorer-result-display__empty {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100px;\n color: var(--explorer-text-muted);\n font-style: italic;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.explorer-result-item__content {\n color: var(--explorer-text-primary);\n word-break: break-word;\n padding: 0;\n margin: 0;\n}\n\n.explorer-result-item__content pre {\n margin: 0;\n padding: 0;\n background: transparent;\n border: none;\n font-family: inherit;\n font-size: inherit;\n white-space: pre-wrap;\n}\n\n.explorer-result-item__content--json {\n}\n\n.explorer-result-item__content--error {\n color: var(--explorer-danger);\n}\n\n.explorer-result-item__content--collapsed {\n max-height: 100px;\n overflow: hidden;\n position: relative;\n}\n\n.explorer-result-item__content--collapsed::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 20px;\n background: linear-gradient(transparent, var(--explorer-bg-secondary));\n}\n\n.explorer-result-item__expand-btn {\n background: none;\n border: none;\n color: var(--explorer-primary);\n cursor: pointer;\n font-size: 11px;\n margin-top: 4px;\n text-decoration: underline;\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .explorer-result-display__content {\n font-size: 12px;\n padding: 4px;\n }\n \n .explorer-result-item {\n padding: 4px;\n margin-bottom: 8px;\n }\n}\n`;\n\nexport type ResultType = 'value' | 'error' | 'log' | 'warning' | 'info';\n\nexport interface ResultItem {\n type: ResultType;\n content: unknown;\n timestamp?: number;\n label?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ResultDisplayOptions {\n maxResults?: number;\n collapsible?: boolean;\n autoScroll?: boolean;\n height?: string;\n onCopy?: (content: string) => void;\n onClear?: () => void;\n}\n\nexport interface ResultDisplayAPI extends ComponentAPI {\n addResult(result: ResultItem): void;\n addValue(value: unknown, label?: string): void;\n addError(error: Error | string, label?: string): void;\n addLog(message: string, label?: string): void;\n addWarning(message: string, label?: string): void;\n addInfo(message: string, label?: string): void;\n clear(): void;\n getResults(): ResultItem[];\n setResults(results: ResultItem[]): void;\n}\n\n/**\n * Create a ResultDisplay component\n */\nexport function createResultDisplay(\n elementOrSelector: HTMLElement | string,\n options: ResultDisplayOptions = {},\n): ResultDisplayAPI {\n const baseComponent = createComponent(elementOrSelector, {\n autoMount: false,\n useShadowDOM: false, // No shadow DOM - parent layout provides CSS isolation\n });\n\n const element = baseComponent.getElement()!;\n const shadowRoot = baseComponent.getShadowRoot();\n const contentRoot = baseComponent.getContentRoot() as HTMLElement;\n\n // Add class to both host element (for tests/API) and content root (for styling)\n element.classList.add('explorer-result-display');\n contentRoot.classList.add('explorer-result-display');\n\n // Component state\n let results: ResultItem[] = [];\n let contentContainer: HTMLElement;\n\n // Cleanup functions\n const cleanupFunctions: Array<() => void> = [];\n\n /**\n * CSS injection handled by parent MultiColumnLayout\n */\n function injectStyles(): void {\n // CSS is injected by parent MultiColumnLayout - no individual injection needed\n // This reduces CSS duplication and shadow DOM overhead\n }\n\n /**\n * Create the DOM structure\n */\n function createDOM(): void {\n contentRoot.innerHTML = '';\n\n // Create content container\n contentContainer = createElement('div', {\n className: 'explorer-result-display__content',\n });\n\n // Set height\n if (options.height) {\n contentContainer.style.height = options.height;\n } else {\n contentContainer.style.minHeight = '150px';\n contentContainer.style.maxHeight = '400px';\n }\n\n contentRoot.appendChild(contentContainer);\n\n // Show empty state\n updateDisplay();\n }\n\n /**\n * Format content for display\n */\n function formatContent(content: unknown): { html: string; isJSON: boolean } {\n if (content === null) {\n return { html: '<span class=\"syntax-null\">null</span>', isJSON: false };\n }\n\n if (content === undefined) {\n return {\n html: '<span class=\"syntax-null\">undefined</span>',\n isJSON: false,\n };\n }\n\n if (typeof content === 'string') {\n return { html: `\"${content}\"`, isJSON: false };\n }\n\n if (typeof content === 'number') {\n return {\n html: `<span class=\"syntax-number\">${content}</span>`,\n isJSON: false,\n };\n }\n\n if (typeof content === 'boolean') {\n return {\n html: `<span class=\"syntax-boolean\">${content}</span>`,\n isJSON: false,\n };\n }\n\n if (typeof content === 'function') {\n return { html: '[Function]', isJSON: false };\n }\n\n if (content instanceof Error) {\n return { html: `${content.name}: ${content.message}`, isJSON: false };\n }\n\n // For objects and arrays, format as JSON\n try {\n const json = JSON.stringify(content, null, 2);\n const highlighted = highlightSyntax(json, 'json');\n return { html: highlighted, isJSON: true };\n } catch {\n return { html: String(content), isJSON: false };\n }\n }\n\n /**\n * Format timestamp\n */\n function formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp);\n return date.toLocaleTimeString();\n }\n\n /**\n * Create result item element\n */\n function createResultItem(result: ResultItem, index: number): HTMLElement {\n // Content\n const { html, isJSON } = formatContent(result.content);\n const content = createElement('div', {\n className: `explorer-result-item__content ${isJSON ? 'explorer-result-item__content--json' : ''} ${result.type === 'error' ? 'explorer-result-item__content--error' : ''}`,\n });\n\n if (isJSON) {\n content.innerHTML = `<pre>${html}</pre>`;\n } else {\n content.innerHTML = html;\n }\n\n // Add collapsible functionality for long content\n if (options.collapsible && content.scrollHeight > 120) {\n content.classList.add('explorer-result-item__content--collapsed');\n\n const expandBtn = createElement('button', {\n className: 'explorer-result-item__expand-btn',\n textContent: 'Show more',\n }) as HTMLButtonElement;\n\n const onExpand = () => {\n content.classList.remove('explorer-result-item__content--collapsed');\n expandBtn.remove();\n };\n\n cleanupFunctions.push(addEventListener(expandBtn, 'click', onExpand));\n content.appendChild(expandBtn);\n }\n\n return content;\n }\n\n /**\n * Update the display\n */\n function updateDisplay(): void {\n contentContainer.innerHTML = '';\n\n if (results.length === 0) {\n const empty = createElement('div', {\n className: 'explorer-result-display__empty',\n textContent: 'No results yet',\n });\n contentContainer.appendChild(empty);\n return;\n }\n\n results.forEach((result, index) => {\n const item = createResultItem(result, index);\n contentContainer.appendChild(item);\n\n // Add spacing between items\n if (index < results.length - 1) {\n const spacer = createElement('div', {\n style: 'margin-bottom: 12px;',\n });\n contentContainer.appendChild(spacer);\n }\n });\n\n // Auto-scroll to bottom\n if (options.autoScroll !== false) {\n contentContainer.scrollTop = contentContainer.scrollHeight;\n }\n }\n\n /**\n * Setup event listeners\n */\n function setupEventListeners(): void {\n // No event listeners needed in this component\n }\n\n // Enhanced API\n const api: ResultDisplayAPI = {\n ...baseComponent,\n\n addResult(result: ResultItem): void {\n const newResult = {\n ...result,\n timestamp: result.timestamp || Date.now(),\n };\n\n results.push(newResult);\n\n // Limit results if specified\n if (options.maxResults && results.length > options.maxResults) {\n results = results.slice(-options.maxResults);\n }\n\n updateDisplay();\n },\n\n addValue(value: unknown, label?: string): void {\n this.addResult({ type: 'value', content: value, label });\n },\n\n addError(error: Error | string, label?: string): void {\n const content = error instanceof Error ? error : new Error(error);\n this.addResult({ type: 'error', content, label });\n },\n\n addLog(message: string, label?: string): void {\n this.addResult({ type: 'log', content: message, label });\n },\n\n addWarning(message: string, label?: string): void {\n this.addResult({ type: 'warning', content: message, label });\n },\n\n addInfo(message: string, label?: string): void {\n this.addResult({ type: 'info', content: message, label });\n },\n\n clear(): void {\n results = [];\n updateDisplay();\n },\n\n getResults(): ResultItem[] {\n return [...results];\n },\n\n setResults(newResults: ResultItem[]): void {\n results = [...newResults];\n updateDisplay();\n },\n\n destroy(): void {\n cleanupFunctions.forEach((cleanup) => cleanup());\n cleanupFunctions.length = 0;\n baseComponent.destroy();\n },\n };\n\n // Initialize component\n injectStyles();\n createDOM();\n setupEventListeners();\n\n // Mount the base component\n api.mount();\n\n return api;\n}\n","/**\n * JavaScript Evaluation Utilities\n *\n * Provides safe JavaScript evaluation with context injection\n * and result formatting for explorer components.\n */\n\nexport interface EvaluationContext {\n [key: string]: unknown;\n}\n\nexport interface EvaluationResult {\n success: boolean;\n result?: unknown;\n error?: string;\n executionTime?: number;\n}\n\nexport interface EvaluationOptions {\n autoReturn?: boolean;\n}\n\n/**\n * Safely evaluate JavaScript code with injected context\n */\nexport async function evaluateJavaScript(\n code: string,\n context: EvaluationContext = {},\n options: EvaluationOptions = {},\n): Promise<EvaluationResult> {\n const startTime = performance.now();\n\n try {\n // Create function with context variables as parameters\n const contextKeys = Object.keys(context);\n const contextValues = Object.values(context);\n\n // Auto-add return if option is enabled\n const processedCode = options.autoReturn ? `return ${code}` : code;\n\n // Wrap code in async function to support await\n const wrappedCode = `\n \"use strict\";\n return (async () => {\n ${processedCode}\n })();\n `;\n\n // Create and execute function with context\n const evalFunction = new Function(...contextKeys, wrappedCode);\n const result = await evalFunction(...contextValues);\n\n const executionTime = performance.now() - startTime;\n\n return {\n success: true,\n result,\n executionTime,\n };\n } catch (error) {\n const executionTime = performance.now() - startTime;\n\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n executionTime,\n };\n }\n}\n\n/**\n * Format evaluation result for display\n */\nexport function formatEvaluationResult(result: unknown): string {\n if (result === undefined) {\n return 'undefined';\n }\n\n if (result === null) {\n return 'null';\n }\n\n if (typeof result === 'string') {\n return result; // Don't add quotes around strings\n }\n\n if (typeof result === 'number' || typeof result === 'boolean') {\n return String(result);\n }\n\n if (typeof result === 'function') {\n return '[Function]';\n }\n\n if (typeof result === 'object') {\n try {\n return JSON.stringify(result, null, 2);\n } catch {\n return '[Object]';\n }\n }\n\n return String(result);\n}\n\n/**\n * Validate JavaScript code for basic syntax errors\n */\nexport function validateJavaScript(code: string): {\n valid: boolean;\n error?: string;\n} {\n try {\n new Function(code);\n return { valid: true };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Create a safe evaluation context with common utilities\n */\nexport function createSafeContext(\n additionalContext: EvaluationContext = {},\n): EvaluationContext {\n const safeContext: EvaluationContext = {\n // Safe built-ins\n console: {\n log: (...args: unknown[]) => console.log(...args),\n error: (...args: unknown[]) => console.error(...args),\n warn: (...args: unknown[]) => console.warn(...args),\n },\n JSON,\n Math,\n Date,\n Array,\n Object,\n String,\n Number,\n Boolean,\n\n // Add user context\n ...additionalContext,\n };\n\n return safeContext;\n}\n","/**\n * LiveCodeJS Component - JavaScript evaluation with context injection\n *\n * Features:\n * - Single JavaScript editor with syntax highlighting\n * - Direct evaluation results (no iframe)\n * - Context injection for functions like getMappingValue\n * - Two-panel layout (editor + results)\n * - Automatic evaluation with debouncing\n */\n\nimport { type ComponentAPI } from '../core/Component';\nimport {\n createMultiColumnLayout,\n type MultiColumnLayoutAPI,\n} from '../core/MultiColumnLayout';\nimport { createCodeEditor, type CodeEditorAPI } from './CodeEditor';\nimport { createResultDisplay, type ResultDisplayAPI } from './ResultDisplay';\nimport { debounce } from '../utils/debounce';\nimport {\n evaluateJavaScript,\n createSafeContext,\n type EvaluationContext,\n} from '../utils/evaluation';\nimport { toggleElementTheme, getElementTheme } from '../core/css-theme-system';\n\nexport interface LiveCodeJSOptions {\n initCode?: string;\n context?: Record<string, unknown>;\n layout?: 'horizontal' | 'vertical';\n autoEvaluate?: boolean;\n evaluationDelay?: number;\n height?: string;\n showHeader?: boolean;\n title?: string;\n autoReturn?: boolean;\n}\n\nexport interface LiveCodeJSAPI extends ComponentAPI {\n getCode(): string;\n setCode(code: string): void;\n setContext(context: Record<string, unknown>): void;\n evaluate(): void;\n clear(): void;\n getResults(): any[];\n setLayout(layout: 'horizontal' | 'vertical'): void;\n getLayout(): string;\n}\n\n/**\n * Create a LiveCodeJS component\n */\nexport function createLiveCodeJS(\n elementOrSelector: HTMLElement | string,\n options: LiveCodeJSOptions = {},\n): LiveCodeJSAPI {\n // Foundation CSS will be injected by individual components with shadow DOM\n\n // Component state\n let currentCode = options.initCode || '';\n let currentContext: EvaluationContext = createSafeContext(options.context);\n let codeEditor: CodeEditorAPI;\n let resultDisplay: ResultDisplayAPI;\n\n // Create multi-column layout with 2 columns\n const {\n api: baseApi,\n contentElement,\n columnContainers,\n cleanup,\n } = createMultiColumnLayout(elementOrSelector, {\n columns: [\n {\n title: 'JavaScript Code',\n className: 'explorer-unified-container--code-editor',\n },\n {\n title: 'Results',\n className: 'explorer-unified-container--result-display',\n },\n ],\n layout: options.layout || 'horizontal',\n height: options.height,\n showHeader: options.showHeader,\n title: options.title || 'JavaScript Evaluator',\n });\n\n // Add theme toggle functionality to the first column header\n const handleThemeToggle = () => {\n const element = baseApi.getElement();\n if (element) {\n const newTheme = toggleElementTheme(element);\n // Update theme icon in any theme buttons found\n const themeButtons = element.querySelectorAll(\n '.explorer-unified-header__btn--theme',\n );\n themeButtons.forEach((btn) => {\n btn.textContent = newTheme === 'dark' ? '☀️' : '🌙';\n });\n }\n };\n\n // Get the first column container and add theme toggle to its header\n setTimeout(() => {\n const firstColumn = baseApi.getColumnElement(0);\n if (firstColumn) {\n const container = firstColumn.querySelector(\n '.explorer-unified-container',\n ) as HTMLElement;\n if (container) {\n // Access the container's header API to add theme toggle\n const headerElement = container.querySelector(\n '.explorer-unified-header',\n );\n if (headerElement) {\n const actionsElement = headerElement.querySelector(\n '.explorer-unified-header__actions',\n );\n if (actionsElement) {\n // Create theme toggle button\n const themeBtn = document.createElement('button');\n themeBtn.className =\n 'explorer-unified-header__btn explorer-unified-header__btn--theme';\n themeBtn.textContent =\n getElementTheme(baseApi.getElement()!) === 'dark' ? '☀️' : '🌙';\n themeBtn.title = 'Toggle theme';\n themeBtn.addEventListener('click', handleThemeToggle);\n actionsElement.appendChild(themeBtn);\n }\n }\n }\n }\n }, 10);\n\n // Debounced evaluation for performance\n const debouncedEvaluate = debounce(() => {\n if (options.autoEvaluate !== false) {\n evaluateCode();\n }\n }, options.evaluationDelay || 500);\n\n /**\n * Create the panel structure using multi-column layout\n */\n function createPanels(): void {\n // Get column content elements from the multi-column layout\n const editorContentElement = baseApi.getColumnContentElement(0); // First column for JavaScript Code\n const resultContentElement = baseApi.getColumnContentElement(1); // Second column for Results\n\n if (!editorContentElement || !resultContentElement) {\n throw new Error(\n 'Failed to get column content elements from multi-column layout',\n );\n }\n\n // Create components\n codeEditor = createCodeEditor(editorContentElement, {\n language: 'javascript',\n value: currentCode,\n height: '100%',\n onChange: (value) => {\n currentCode = value;\n debouncedEvaluate();\n },\n });\n\n resultDisplay = createResultDisplay(resultContentElement, {\n height: '100%',\n maxResults: 10,\n });\n\n // Initial evaluation\n if (currentCode && options.autoEvaluate !== false) {\n evaluateCode();\n }\n }\n\n /**\n * Evaluate the current code\n */\n async function evaluateCode(): Promise<void> {\n if (!currentCode.trim()) {\n resultDisplay.clear();\n return;\n }\n\n try {\n resultDisplay.clear();\n\n const result = await evaluateJavaScript(currentCode, currentContext, {\n autoReturn: options.autoReturn,\n });\n\n if (result.success) {\n resultDisplay.addValue(result.result);\n } else {\n resultDisplay.addError(result.error || 'Unknown error');\n }\n } catch (error) {\n resultDisplay.clear();\n resultDisplay.addError(String(error));\n }\n }\n\n // Enhanced API\n const api: LiveCodeJSAPI = {\n ...baseApi,\n\n getCode(): string {\n return currentCode;\n },\n\n setCode(code: string): void {\n currentCode = code;\n codeEditor.setValue(code);\n if (options.autoEvaluate !== false) {\n debouncedEvaluate();\n }\n },\n\n setContext(context: Record<string, unknown>): void {\n currentContext = createSafeContext(context);\n if (options.autoEvaluate !== false) {\n debouncedEvaluate();\n }\n },\n\n evaluate(): void {\n evaluateCode();\n },\n\n clear(): void {\n currentCode = '';\n codeEditor.setValue('');\n resultDisplay.clear();\n },\n\n getResults(): any[] {\n return resultDisplay.getResults();\n },\n\n setLayout(layout: 'horizontal' | 'vertical'): void {\n baseApi.setLayout(layout);\n },\n\n getLayout(): string {\n return baseApi.getLayout();\n },\n\n destroy(): void {\n cleanup.forEach((fn) => fn());\n codeEditor?.destroy();\n resultDisplay?.destroy();\n baseApi.destroy();\n },\n };\n\n // Initialize component\n createPanels();\n\n // Mount the base component\n api.mount();\n\n return api;\n}\n","/**\n * Destination Component - Three-column layout for Event, Mapping, and Result\n *\n * Features:\n * - Three-column layout with Event, Mapping, and Result\n * - Two CodeEditor components for JSON input\n * - Live walkerOS collector integration with custom destination\n * - Real destination processing with mapping transformations\n * - Wrap function to capture destination calls and display results\n * - Theme-aware styling with shadow DOM support\n */\n\nimport {\n createMultiColumnLayout,\n type MultiColumnLayoutAPI,\n} from '../core/MultiColumnLayout';\nimport { createCodeEditor, type CodeEditorAPI } from './CodeEditor';\nimport { createResultDisplay, type ResultDisplayAPI } from './ResultDisplay';\nimport { debounce } from '../utils/debounce';\nimport { createCollector } from '@walkeros/collector';\nimport type { Collector, WalkerOS, Destination, Elb } from '@walkeros/core';\nimport { toggleElementTheme, getElementTheme } from '../core/css-theme-system';\n\nexport interface DestinationOptions {\n height?: string;\n showHeader?: boolean;\n title?: string;\n initialEvent?: string;\n initialMapping?: string;\n updateDelay?: number;\n destination?: Destination.Instance;\n}\n\ninterface CapturedResult {\n type?: string;\n mappingRule?: string;\n data?: unknown;\n event?: unknown;\n message?: string;\n [key: string]: unknown;\n}\n\nexport interface DestinationAPI extends MultiColumnLayoutAPI {\n getEventData(): string;\n setEventData(data: string): void;\n getMappingData(): string;\n setMappingData(data: string): void;\n getResults(): CapturedResult[];\n refresh(): void;\n clear(): void;\n}\n\n/**\n * Create a Destination component\n */\nexport function createDestination(\n elementOrSelector: HTMLElement | string,\n options: DestinationOptions = {},\n): DestinationAPI {\n // Component state\n let eventData = options.initialEvent || '';\n let mappingData = options.initialMapping || '';\n let eventEditor: CodeEditorAPI;\n let mappingEditor: CodeEditorAPI;\n let resultDisplay: ResultDisplayAPI;\n let elbFunction: Elb.Fn | null = null;\n let collector: Collector.Instance | null = null;\n let capturedResults: CapturedResult[] = [];\n\n // Create multi-column layout with 3 columns\n const { api: baseApi, cleanup } = createMultiColumnLayout(elementOrSelector, {\n columns: [\n {\n title: 'Event',\n className: 'explorer-unified-container--code-editor',\n },\n {\n title: 'Mapping',\n className: 'explorer-unified-container--code-editor',\n },\n {\n title: 'Result',\n className: 'explorer-unified-container--result-display',\n },\n ],\n layout: 'horizontal',\n height: options.height,\n showHeader: options.showHeader,\n title: options.title || 'Destination Mapping',\n });\n\n // Add theme toggle functionality to the first column header\n const handleThemeToggle = () => {\n const element = baseApi.getElement();\n if (element) {\n const newTheme = toggleElementTheme(element);\n // Update theme icon in any theme buttons found\n const themeButtons = element.querySelectorAll(\n '.explorer-unified-header__btn--theme',\n );\n themeButtons.forEach((btn) => {\n btn.textContent = newTheme === 'dark' ? '☀️' : '🌙';\n });\n }\n };\n\n // Get the first column container and add theme toggle to its header\n setTimeout(() => {\n const firstColumn = baseApi.getColumnElement(0);\n if (firstColumn) {\n const container = firstColumn.querySelector(\n '.explorer-unified-container',\n ) as HTMLElement;\n if (container) {\n // Access the container's header API to add theme toggle\n const headerElement = container.querySelector(\n '.explorer-unified-header',\n );\n if (headerElement) {\n const actionsElement = headerElement.querySelector(\n '.explorer-unified-header__actions',\n );\n if (actionsElement) {\n // Create theme toggle button\n const themeBtn = document.createElement('button');\n themeBtn.className =\n 'explorer-unified-header__btn explorer-unified-header__btn--theme';\n themeBtn.textContent =\n getElementTheme(baseApi.getElement()!) === 'dark' ? '☀️' : '🌙';\n themeBtn.title = 'Toggle theme';\n themeBtn.addEventListener('click', handleThemeToggle);\n actionsElement.appendChild(themeBtn);\n }\n }\n }\n }\n }, 10);\n\n // Debounced update for performance\n const debouncedUpdate = debounce(() => {\n updateResults();\n }, options.updateDelay || 300);\n\n /**\n * Create default demo destination if none provided\n */\n function createDemoDestination(): Destination.Instance {\n return {\n type: 'demo',\n config: {},\n\n push(event: WalkerOS.Event, context: Destination.PushContext) {\n const { data, mapping } = context;\n\n // Clear previous results for this push\n capturedResults = [];\n\n // Show what the destination receives after collector processing\n if (data !== undefined) {\n // Mapping produced data - this is what would be sent to the destination\n capturedResults.push({\n type: 'mapped_result',\n mappingRule: mapping?.name || 'default',\n data: data,\n timestamp: Date.now(),\n });\n } else {\n // No mapping matched or no data produced\n capturedResults.push({\n type: 'no_mapping',\n event: event,\n message: 'No mapping rule matched or no data produced',\n timestamp: Date.now(),\n });\n }\n\n // Update display to show the result\n updateResultDisplay();\n },\n };\n }\n\n /**\n * Initialize the walkerOS collector with destination\n */\n async function initializeCollector(): Promise<{\n elb: Elb.Fn;\n collector: Collector.Instance;\n } | null> {\n try {\n // Use provided destination or create default demo destination\n const destination = options.destination || createDemoDestination();\n\n const { elb, collector: newCollector } = await createCollector({\n destinations: {\n demo: destination,\n },\n run: true,\n });\n\n return { elb, collector: newCollector };\n } catch (error) {\n capturedResults = [\n {\n type: 'error',\n message: `Failed to initialize collector: ${String(error)}`,\n timestamp: Date.now(),\n },\n ];\n updateResultDisplay();\n return null;\n }\n }\n\n /**\n * Create components using multi-column layout\n */\n function createComponents(): void {\n // Get column content elements from the multi-column layout\n const eventContentElement = baseApi.getColumnContentElement(0); // First column for Event\n const mappingContentElement = baseApi.getColumnContentElement(1); // Second column for Mapping\n const resultContentElement = baseApi.getColumnContentElement(2); // Third column for Result\n\n if (\n !eventContentElement ||\n !mappingContentElement ||\n !resultContentElement\n ) {\n throw new Error(\n 'Failed to get column content elements from multi-column layout',\n );\n }\n\n // Create components\n eventEditor = createCodeEditor(eventContentElement, {\n language: 'json',\n value: eventData,\n height: '100%',\n onChange: (value) => {\n eventData = value;\n debouncedUpdate();\n },\n });\n\n mappingEditor = createCodeEditor(mappingContentElement, {\n language: 'json',\n value: mappingData,\n height: '100%',\n onChange: (value) => {\n mappingData = value;\n debouncedUpdate();\n },\n });\n\n resultDisplay = createResultDisplay(resultContentElement, {\n height: '100%',\n maxResults: 1,\n });\n\n // Show initial ready state\n updateResultDisplay();\n\n // Initialize collector once\n initializeCollector().then((result) => {\n if (result) {\n elbFunction = result.elb;\n collector = result.collector;\n // Initial update after collector is ready\n setTimeout(() => {\n updateResults();\n }, 200);\n }\n });\n }\n\n /**\n * Update results by processing event through walkerOS collector\n */\n async function updateResults(): Promise<void> {\n try {\n // Clear previous results\n capturedResults = [];\n\n if (!elbFunction) {\n resultDisplay.clear();\n resultDisplay.addError('Collector not initialized');\n return;\n }\n\n // Parse and push event through collector\n let parsedEvent: WalkerOS.PartialEvent | null;\n try {\n parsedEvent = eventData.trim()\n ? (JSON.parse(eventData) as WalkerOS.PartialEvent)\n : null;\n } catch (error) {\n resultDisplay.clear();\n resultDisplay.addError(`Invalid JSON in Event: ${String(error)}`);\n return;\n }\n\n if (parsedEvent) {\n // Update destination mapping before pushing\n updateDestinationMapping();\n\n // Push event through collector using elb function - this will trigger our destination\n await elbFunction(parsedEvent);\n }\n\n // Update display will be called by the destination push function\n } catch (error) {\n resultDisplay.clear();\n resultDisplay.addError(`Processing error: ${String(error)}`);\n }\n }\n\n /**\n * Update destination mapping by directly modifying the collector's destination config\n */\n function updateDestinationMapping(): void {\n if (!collector) return;\n\n try {\n // Parse and set mapping directly on the existing destination\n const demoDestination = collector.destinations.demo;\n if (demoDestination && mappingData.trim()) {\n const mapping = JSON.parse(mappingData);\n demoDestination.config.mapping = mapping;\n }\n } catch (error) {\n capturedResults.push({\n type: 'error',\n message: `Failed to update mapping: ${String(error)}`,\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Update the result display with captured results\n */\n function updateResultDisplay(): void {\n resultDisplay.clear();\n\n if (capturedResults.length === 0) {\n resultDisplay.addInfo(\n 'Ready - modify the event or mapping and see the destination processing results',\n );\n return;\n }\n\n capturedResults.forEach((result) => {\n if (result.type === 'mapped_result') {\n // Show the mapped data cleanly\n resultDisplay.addValue(\n result.data,\n `Destination receives (${result.mappingRule})`,\n );\n } else if (result.type === 'no_mapping') {\n resultDisplay.addInfo(result.message || 'No mapping applied');\n } else {\n // Fallback for any other types\n resultDisplay.addValue(result);\n }\n });\n }\n\n // Enhanced API\n const api: DestinationAPI = {\n ...baseApi,\n\n getEventData(): string {\n return eventData;\n },\n\n setEventData(data: string): void {\n eventData = data;\n eventEditor?.setValue(data);\n debouncedUpdate();\n },\n\n getMappingData(): string {\n return mappingData;\n },\n\n setMappingData(data: string): void {\n mappingData = data;\n mappingEditor?.setValue(data);\n debouncedUpdate();\n },\n\n getResults(): CapturedResult[] {\n return capturedResults || [];\n },\n\n refresh(): void {\n updateResults();\n },\n\n clear(): void {\n eventData = '{}';\n mappingData = '{}';\n eventEditor?.setValue('{}');\n mappingEditor?.setValue('{}');\n capturedResults = [];\n resultDisplay?.clear();\n },\n\n destroy(): void {\n cleanup.forEach((fn) => fn());\n eventEditor?.destroy();\n mappingEditor?.destroy();\n resultDisplay?.destroy();\n elbFunction = null;\n collector = null;\n capturedResults = [];\n baseApi.destroy();\n },\n };\n\n // Initialize component\n createComponents();\n\n // Mount the base component\n api.mount();\n\n return api;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwYO,WAAS,gBACd,SACA,OACM;AAEN,UAAM,YAAY,SAAS,gBAAgB,aAAa,YAAY;AACpE,QAAI,cAAc,cAAc,WAAW,cAAc,SAAS;AAEhE,UAAI,mBAAmB,aAAa;AAClC,gBAAQ,UAAU,IAAI,oBAAoB;AAAA,MAC5C;AACA;AAAA,IACF;AAGA,QAAI,mBAAmB,aAAa;AAClC,cAAQ,aAAa,cAAc,KAAK;AAAA,IAC1C,WAAW,mBAAmB,YAAY;AAExC,UAAI,QAAQ,gBAAgB,aAAa;AACvC,gBAAQ,KAAK,aAAa,cAAc,KAAK;AAAA,MAC/C;AAAA,IACF,WAAW,mBAAmB,kBAAkB;AAAA,IAGhD;AAAA,EACF;AAKO,WAAS,gBAAgB,SAAwC;AAEtE,UAAM,YAAY,SAAS,gBAAgB,aAAa,YAAY;AACpE,QAAI,cAAc,WAAW,cAAc,QAAQ;AACjD,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,QAAQ,aAAa,YAAY;AACtD,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAKO,WAAS,cAAgC;AAE9C,UAAM,YAAY,SAAS,gBAAgB,aAAa,YAAY;AACpE,QAAI,cAAc,WAAW,cAAc,QAAQ;AACjD,aAAO;AAAA,IACT;AAGA,QAAI,SAAS,gBAAgB,UAAU,SAAS,MAAM,GAAG;AACvD,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,WAAW,eAAe,OAAO,YAAY;AACtD,YAAM,cAAc,OAAO;AAAA,QACzB;AAAA,MACF,EAAE;AACF,UAAI,aAAa;AACf,eAAO;AAAA,MACT;AAAA,IACF;AAGA,WAAO;AAAA,EACT;AAKO,WAAS,mBAAmB,SAAwC;AACzE,UAAM,eAAe,gBAAgB,OAAO;AAC5C,UAAM,WAAW,iBAAiB,UAAU,SAAS;AACrD,oBAAgB,SAAS,QAAQ;AACjC,WAAO;AAAA,EACT;AA7dA,MAQa,qBA0dA;AAleb;AAAA;AAAA;AAQO,MAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0d5B,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["id","e","e","contentElement","e","J"]}
1
+ {"version":3,"sources":["../src/core/css-theme-system.ts","../src/index.ts","../src/core/Component.ts","../src/utils/dom.ts","../src/core/UnifiedHeader.ts","../src/core/UnifiedContainer.ts","../src/core/MultiColumnLayout.ts","../src/utils/syntax.ts","../src/utils/debounce.ts","../src/components/CodeEditor.ts","../src/components/ResultDisplay.ts","../src/utils/evaluation.ts","../src/components/LiveCodeJS.ts","../src/components/Destination.ts"],"sourcesContent":["/**\n * CSS-Based Theme System\n *\n * Uses CSS custom properties with fallback chain for theming.\n * Supports parent theme inheritance (e.g., from website html[data-theme]).\n * Transparent backgrounds by default for embedded usage.\n */\n\nexport const CSS_THEME_VARIABLES = `\n :root,\n [data-theme=\"light\"],\n html[data-theme=\"light\"] .explorer-component,\n html[data-theme=\"light\"] [class*=\"explorer-\"] {\n /* Base colors - transparent by default for website integration */\n --explorer-bg-primary: transparent;\n --explorer-bg-primary-opaque: #ffffff;\n --explorer-bg-secondary: rgba(248, 250, 252, 0.8);\n --explorer-bg-tertiary: rgba(241, 245, 249, 0.9);\n --explorer-bg-input: #fafafa;\n \n /* Text colors */\n --explorer-text-primary: #1f2937;\n --explorer-text-secondary: #6b7280;\n --explorer-text-muted: #9ca3af;\n --explorer-text-inverse: #ffffff;\n \n /* Border colors */\n --explorer-border-primary: #d1d5db;\n --explorer-border-secondary: #e5e7eb;\n --explorer-border-focus: #3b82f6;\n \n /* Action colors */\n --explorer-primary: #3b82f6;\n --explorer-primary-hover: #2563eb;\n --explorer-primary-active: #1d4ed8;\n \n --explorer-success: #10b981;\n --explorer-success-hover: #059669;\n --explorer-success-active: #047857;\n \n --explorer-warning: #f59e0b;\n --explorer-warning-hover: #d97706;\n --explorer-warning-active: #b45309;\n \n --explorer-danger: #ef4444;\n --explorer-danger-hover: #dc2626;\n --explorer-danger-active: #b91c1c;\n \n /* Surface colors */\n --explorer-surface-hover: #f1f5f9;\n --explorer-surface-active: #e2e8f0;\n --explorer-surface-selected: #dbeafe;\n \n /* Shadow colors */\n --explorer-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --explorer-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --explorer-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n \n /* Scrollbar colors */\n --explorer-scrollbar-track: #f1f5f9;\n --explorer-scrollbar-thumb: #cbd5e1;\n --explorer-scrollbar-thumb-hover: #94a3b8;\n }\n\n [data-theme=\"dark\"],\n html[data-theme=\"dark\"] .explorer-component,\n html[data-theme=\"dark\"] [class*=\"explorer-\"] {\n /* Base colors - transparent by default for website integration */\n --explorer-bg-primary: transparent;\n --explorer-bg-primary-opaque: #1f2937;\n --explorer-bg-secondary: rgba(55, 65, 81, 0.8);\n --explorer-bg-tertiary: rgba(75, 85, 99, 0.9);\n --explorer-bg-input: #111827;\n \n /* Text colors */\n --explorer-text-primary: #f3f4f6;\n --explorer-text-secondary: #d1d5db;\n --explorer-text-muted: #9ca3af;\n --explorer-text-inverse: #1f2937;\n \n /* Border colors */\n --explorer-border-primary: #374151;\n --explorer-border-secondary: #4b5563;\n --explorer-border-focus: #3b82f6;\n \n /* Action colors remain the same for consistency */\n --explorer-primary: #3b82f6;\n --explorer-primary-hover: #2563eb;\n --explorer-primary-active: #1d4ed8;\n \n --explorer-success: #10b981;\n --explorer-success-hover: #059669;\n --explorer-success-active: #047857;\n \n --explorer-warning: #f59e0b;\n --explorer-warning-hover: #d97706;\n --explorer-warning-active: #b45309;\n \n --explorer-danger: #ef4444;\n --explorer-danger-hover: #dc2626;\n --explorer-danger-active: #b91c1c;\n \n /* Surface colors */\n --explorer-surface-hover: #374151;\n --explorer-surface-active: #4b5563;\n --explorer-surface-selected: #1e3a8a;\n \n /* Shadow colors */\n --explorer-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);\n --explorer-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2);\n --explorer-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2);\n \n /* Scrollbar colors */\n --explorer-scrollbar-track: #374151;\n --explorer-scrollbar-thumb: #6b7280;\n --explorer-scrollbar-thumb-hover: #9ca3af;\n }\n`;\n\nexport const CSS_COMPONENT_STYLES = `\n /* Base component styles */\n .explorer-component {\n color: var(--explorer-text-primary);\n background-color: var(--explorer-bg-primary);\n border-color: var(--explorer-border-primary);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n box-sizing: border-box;\n transition: all 0.2s ease-in-out;\n }\n\n .explorer-component *,\n .explorer-component *::before,\n .explorer-component *::after {\n box-sizing: border-box;\n }\n\n /* Header styles */\n .explorer-header {\n background-color: var(--explorer-bg-secondary);\n border-bottom: 1px solid var(--explorer-border-secondary);\n color: var(--explorer-text-primary);\n padding: 12px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 40px;\n user-select: none;\n }\n\n .explorer-header-title {\n font-size: 14px;\n font-weight: 500;\n color: var(--explorer-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .explorer-header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n }\n\n /* Button styles */\n .explorer-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n margin: 0;\n border: none;\n border-radius: 4px;\n background-color: transparent;\n color: var(--explorer-text-secondary);\n cursor: pointer;\n font-size: 12px;\n transition: all 0.15s ease-in-out;\n outline: none;\n }\n\n .explorer-button:hover {\n background-color: var(--explorer-surface-hover);\n color: var(--explorer-text-primary);\n transform: translateY(-1px);\n }\n\n .explorer-button:active {\n background-color: var(--explorer-surface-active);\n transform: translateY(0);\n }\n\n .explorer-button:focus-visible {\n outline: 2px solid var(--explorer-border-focus);\n outline-offset: 2px;\n }\n\n .explorer-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n transform: none;\n }\n\n /* Button variants */\n .explorer-button--primary {\n background-color: var(--explorer-primary);\n color: var(--explorer-text-inverse);\n }\n\n .explorer-button--primary:hover:not(:disabled) {\n background-color: var(--explorer-primary-hover);\n }\n\n .explorer-button--primary:active:not(:disabled) {\n background-color: var(--explorer-primary-active);\n }\n\n .explorer-button--success {\n background-color: var(--explorer-success);\n color: var(--explorer-text-inverse);\n }\n\n .explorer-button--success:hover:not(:disabled) {\n background-color: var(--explorer-success-hover);\n }\n\n .explorer-button--danger {\n background-color: var(--explorer-danger);\n color: var(--explorer-text-inverse);\n }\n\n .explorer-button--danger:hover:not(:disabled) {\n background-color: var(--explorer-danger-hover);\n }\n\n /* Container styles */\n .explorer-container {\n background-color: var(--explorer-bg-primary);\n border: 1px solid var(--explorer-border-primary);\n border-radius: 8px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .explorer-container--elevated {\n box-shadow: var(--explorer-shadow-md);\n }\n\n /* Content area styles */\n .explorer-content {\n flex: 1;\n min-height: 0;\n background-color: var(--explorer-bg-input);\n }\n\n /* Input/Editor styles */\n .explorer-input,\n .explorer-textarea {\n background-color: var(--explorer-bg-input);\n color: var(--explorer-text-primary);\n border: 1px solid var(--explorer-border-primary);\n border-radius: 4px;\n padding: 12px;\n font-family: 'Fira Code', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace;\n font-size: 14px;\n line-height: 1.5;\n outline: none;\n transition: border-color 0.2s ease;\n }\n\n .explorer-input:focus,\n .explorer-textarea:focus {\n border-color: var(--explorer-border-focus);\n box-shadow: 0 0 0 2px var(--explorer-border-focus)40;\n }\n\n .explorer-textarea {\n resize: none;\n font-variant-ligatures: normal;\n font-feature-settings: \"liga\" 1, \"calt\" 1;\n }\n\n .explorer-textarea::placeholder {\n color: var(--explorer-text-muted);\n opacity: 1;\n }\n\n .explorer-textarea::selection {\n background-color: var(--explorer-surface-selected);\n }\n\n /* Scrollbar styles */\n .explorer-component *::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n\n .explorer-component *::-webkit-scrollbar-track {\n background: var(--explorer-scrollbar-track);\n }\n\n .explorer-component *::-webkit-scrollbar-thumb {\n background: var(--explorer-scrollbar-thumb);\n border-radius: 4px;\n }\n\n .explorer-component *::-webkit-scrollbar-thumb:hover {\n background: var(--explorer-scrollbar-thumb-hover);\n }\n\n /* Panel layout styles */\n .explorer-panels {\n display: grid;\n gap: 1px;\n background-color: var(--explorer-border-secondary);\n flex: 1;\n min-height: 0;\n }\n\n .explorer-panel {\n background-color: var(--explorer-bg-primary);\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n }\n\n /* Responsive grid templates */\n .explorer-panels--two-column {\n grid-template-columns: 1fr 1fr;\n }\n\n .explorer-panels--three-column {\n grid-template-columns: 1fr 1fr 1fr;\n }\n\n .explorer-panels--single-column {\n grid-template-columns: 1fr;\n }\n\n @media (max-width: 768px) {\n .explorer-panels--two-column,\n .explorer-panels--three-column {\n grid-template-columns: 1fr !important;\n grid-template-rows: auto auto auto;\n }\n }\n\n /* Animation utilities */\n .explorer-fade-in {\n animation: explorer-fade-in 0.2s ease-out;\n }\n\n @keyframes explorer-fade-in {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Loading states */\n .explorer-loading {\n opacity: 0.6;\n pointer-events: none;\n }\n\n /* Status indicators */\n .explorer-status--success {\n border-left: 4px solid var(--explorer-success);\n }\n\n .explorer-status--error {\n border-left: 4px solid var(--explorer-danger);\n }\n\n .explorer-status--warning {\n border-left: 4px solid var(--explorer-warning);\n }\n`;\n\n/**\n * Utility function to set theme on an element\n * Checks for website context to avoid conflicts\n */\nexport function setElementTheme(\n element: HTMLElement | ShadowRoot | DocumentFragment,\n theme: 'light' | 'dark',\n): void {\n // Check if we're in a website context (html has data-theme)\n const htmlTheme = document.documentElement.getAttribute('data-theme');\n if (htmlTheme && (htmlTheme === 'light' || htmlTheme === 'dark')) {\n // Website context - don't override, just add explorer class for targeting\n if (element instanceof HTMLElement) {\n element.classList.add('explorer-component');\n }\n return;\n }\n\n // Standalone context - apply theme normally\n if (element instanceof HTMLElement) {\n element.setAttribute('data-theme', theme);\n } else if (element instanceof ShadowRoot) {\n // For shadow roots, set the attribute on the host element if available\n if (element.host instanceof HTMLElement) {\n element.host.setAttribute('data-theme', theme);\n }\n } else if (element instanceof DocumentFragment) {\n // For document fragments, we can't set attributes, so skip\n // The theme will be inherited from the parent when attached\n }\n}\n\n/**\n * Utility function to get current theme from element or parent context\n */\nexport function getElementTheme(element: HTMLElement): 'light' | 'dark' {\n // Check website context first\n const htmlTheme = document.documentElement.getAttribute('data-theme');\n if (htmlTheme === 'light' || htmlTheme === 'dark') {\n return htmlTheme;\n }\n\n // Check element's own theme\n const elementTheme = element.getAttribute('data-theme') as 'light' | 'dark';\n if (elementTheme) {\n return elementTheme;\n }\n\n // Default fallback\n return 'light';\n}\n\n/**\n * Detect the current theme based on the environment\n */\nexport function detectTheme(): 'light' | 'dark' {\n // Check if document has a theme set\n const htmlTheme = document.documentElement.getAttribute('data-theme');\n if (htmlTheme === 'light' || htmlTheme === 'dark') {\n return htmlTheme;\n }\n\n // Check for dark mode classes on html element (common pattern)\n if (document.documentElement.classList.contains('dark')) {\n return 'dark';\n }\n\n // Check system preference if available\n if (typeof window !== 'undefined' && window.matchMedia) {\n const prefersDark = window.matchMedia(\n '(prefers-color-scheme: dark)',\n ).matches;\n if (prefersDark) {\n return 'dark';\n }\n }\n\n // Default to light\n return 'light';\n}\n\n/**\n * Utility function to toggle theme on an element\n */\nexport function toggleElementTheme(element: HTMLElement): 'light' | 'dark' {\n const currentTheme = getElementTheme(element);\n const newTheme = currentTheme === 'light' ? 'dark' : 'light';\n setElementTheme(element, newTheme);\n return newTheme;\n}\n\n/**\n * Enhanced syntax highlighting CSS with Palenight theme for both light and dark modes\n */\nexport const CSS_SYNTAX_HIGHLIGHTING = `\n/* Light mode - Palenight-inspired colors adapted for light backgrounds */\n.explorer-component .syntax-keyword,\n.explorer-shadow-container .syntax-keyword,\n:host .syntax-keyword { \n color: #ab47bc !important; \n font-weight: 600 !important; \n}\n\n.explorer-component .syntax-string,\n.explorer-shadow-container .syntax-string,\n:host .syntax-string { \n color: #689f38 !important; \n}\n\n.explorer-component .syntax-number,\n.explorer-shadow-container .syntax-number,\n:host .syntax-number { \n color: #f57c00 !important; \n}\n\n.explorer-component .syntax-comment,\n.explorer-shadow-container .syntax-comment,\n:host .syntax-comment { \n color: #757575 !important; \n font-style: italic !important; \n}\n\n.explorer-component .syntax-function,\n.explorer-shadow-container .syntax-function,\n:host .syntax-function {\n color: #3f51b5 !important;\n font-weight: 500 !important;\n}\n\n.explorer-component .syntax-tag,\n.explorer-shadow-container .syntax-tag,\n:host .syntax-tag { \n color: #e91e63 !important; \n font-weight: 600 !important; \n}\n\n.explorer-component .syntax-attribute,\n.explorer-shadow-container .syntax-attribute,\n:host .syntax-attribute { \n color: #6f42c1 !important; \n}\n\n.explorer-component .syntax-value,\n.explorer-shadow-container .syntax-value,\n:host .syntax-value { \n color: #032f62 !important; \n}\n\n.explorer-component .syntax-operator,\n.explorer-shadow-container .syntax-operator,\n:host .syntax-operator { \n color: #d73a49 !important; \n}\n\n.explorer-component .syntax-type,\n.explorer-shadow-container .syntax-type,\n:host .syntax-type { \n color: #005cc5 !important; \n font-weight: 500 !important; \n}\n\n.explorer-component .syntax-property,\n.explorer-shadow-container .syntax-property,\n:host .syntax-property { \n color: #6f42c1 !important; \n}\n\n/* JSON-specific styling for better readability */\n.explorer-component[data-language=\"json\"] .syntax-string,\n.explorer-shadow-container[data-language=\"json\"] .syntax-string,\n:host([data-language=\"json\"]) .syntax-string { \n color: #22863a !important; /* GitHub green for JSON strings */\n}\n\n.explorer-component[data-language=\"json\"] .syntax-number,\n.explorer-shadow-container[data-language=\"json\"] .syntax-number,\n:host([data-language=\"json\"]) .syntax-number { \n color: #005cc5 !important; /* GitHub blue for JSON numbers */\n}\n\n.explorer-component[data-language=\"json\"] .syntax-property,\n.explorer-shadow-container[data-language=\"json\"] .syntax-property,\n:host([data-language=\"json\"]) .syntax-property { \n color: #032f62 !important; /* GitHub dark blue for JSON keys */\n font-weight: 500 !important;\n}\n\n.explorer-component[data-language=\"json\"] .syntax-keyword,\n.explorer-shadow-container[data-language=\"json\"] .syntax-keyword,\n:host([data-language=\"json\"]) .syntax-keyword { \n color: #d73a49 !important; /* GitHub red for true/false/null */\n font-weight: 600 !important;\n}\n\n/* JSON-specific dark mode styling */\n[data-theme='dark'] .explorer-component[data-language=\"json\"] .syntax-string,\n[data-theme='dark'] .explorer-shadow-container[data-language=\"json\"] .syntax-string,\n:host([data-theme='dark'][data-language=\"json\"]) .syntax-string { \n color: #98d982 !important; /* Softer green for dark mode JSON strings */\n}\n\n[data-theme='dark'] .explorer-component[data-language=\"json\"] .syntax-number,\n[data-theme='dark'] .explorer-shadow-container[data-language=\"json\"] .syntax-number,\n:host([data-theme='dark'][data-language=\"json\"]) .syntax-number { \n color: #79b8ff !important; /* Softer blue for dark mode JSON numbers */\n}\n\n[data-theme='dark'] .explorer-component[data-language=\"json\"] .syntax-property,\n[data-theme='dark'] .explorer-shadow-container[data-language=\"json\"] .syntax-property,\n:host([data-theme='dark'][data-language=\"json\"]) .syntax-property { \n color: #b392f0 !important; /* Light purple for dark mode JSON keys */\n font-weight: 500 !important;\n}\n\n[data-theme='dark'] .explorer-component[data-language=\"json\"] .syntax-keyword,\n[data-theme='dark'] .explorer-shadow-container[data-language=\"json\"] .syntax-keyword,\n:host([data-theme='dark'][data-language=\"json\"]) .syntax-keyword { \n color: #f97583 !important; /* Soft red for dark mode true/false/null */\n font-weight: 600 !important;\n}\n\n/* Special highlighting for elb attributes */\n.explorer-component .syntax-elb-attribute,\n.explorer-shadow-container .syntax-elb-attribute,\n:host .syntax-elb-attribute { \n color: #28a745 !important; \n font-weight: 700 !important; \n}\n\n.explorer-component .syntax-elb-value,\n.explorer-shadow-container .syntax-elb-value,\n:host .syntax-elb-value { \n color: #28a745 !important; \n font-weight: 500 !important; \n}\n\n/* Dark mode - Palenight theme with higher specificity */\n[data-theme='dark'] .explorer-component .syntax-keyword,\n[data-theme='dark'] .explorer-shadow-container .syntax-keyword,\n:host([data-theme='dark']) .syntax-keyword { \n color: #c792ea !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-string,\n[data-theme='dark'] .explorer-shadow-container .syntax-string,\n:host([data-theme='dark']) .syntax-string { \n color: #c3e88d !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-number,\n[data-theme='dark'] .explorer-shadow-container .syntax-number,\n:host([data-theme='dark']) .syntax-number { \n color: #f78c6c !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-comment,\n[data-theme='dark'] .explorer-shadow-container .syntax-comment,\n:host([data-theme='dark']) .syntax-comment { \n color: #676e95 !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-function,\n[data-theme='dark'] .explorer-shadow-container .syntax-function,\n:host([data-theme='dark']) .syntax-function {\n color: #82aaff !important;\n}\n\n[data-theme='dark'] .explorer-component .syntax-tag,\n[data-theme='dark'] .explorer-shadow-container .syntax-tag,\n:host([data-theme='dark']) .syntax-tag { \n color: #f07178 !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-attribute,\n[data-theme='dark'] .explorer-shadow-container .syntax-attribute,\n:host([data-theme='dark']) .syntax-attribute { \n color: #ffcb6b !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-value,\n[data-theme='dark'] .explorer-shadow-container .syntax-value,\n:host([data-theme='dark']) .syntax-value { \n color: #c3e88d !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-operator,\n[data-theme='dark'] .explorer-shadow-container .syntax-operator,\n:host([data-theme='dark']) .syntax-operator { \n color: #89ddff !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-type,\n[data-theme='dark'] .explorer-shadow-container .syntax-type,\n:host([data-theme='dark']) .syntax-type { \n color: #ffcb6b !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-property,\n[data-theme='dark'] .explorer-shadow-container .syntax-property,\n:host([data-theme='dark']) .syntax-property { \n color: #82aaff !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-elb-attribute,\n[data-theme='dark'] .explorer-shadow-container .syntax-elb-attribute,\n:host([data-theme='dark']) .syntax-elb-attribute { \n color: #c3e88d !important; \n}\n\n[data-theme='dark'] .explorer-component .syntax-elb-value,\n[data-theme='dark'] .explorer-shadow-container .syntax-elb-value,\n:host([data-theme='dark']) .syntax-elb-value { \n color: #c3e88d !important; \n}\n`;\n\n/**\n * Inject CSS directly into shadow root with theme context awareness\n */\nexport function injectShadowRootCSS(\n shadowRoot: ShadowRoot,\n css: string,\n id: string,\n): void {\n // Remove existing style with same ID\n const existingStyle = shadowRoot.querySelector(`#${id}`);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n // Create and inject new style\n const style = document.createElement('style');\n style.id = id;\n style.textContent = css;\n shadowRoot.appendChild(style);\n}\n\n/**\n * Get complete CSS including syntax highlighting for shadow DOM injection\n */\nexport function getCompleteShadowCSS(): string {\n return (\n CSS_THEME_VARIABLES +\n '\\n\\n' +\n CSS_COMPONENT_STYLES +\n '\\n\\n' +\n CSS_SYNTAX_HIGHLIGHTING\n );\n}\n\n/**\n * Get the complete CSS for theming\n */\nexport function getThemeCSS(): string {\n return CSS_THEME_VARIABLES + '\\n\\n' + CSS_COMPONENT_STYLES;\n}\n","/**\n * WalkerOS Explorer - LiveCodeJS Component\n *\n * JavaScript evaluation component with context injection\n * Zero dependencies, framework-agnostic\n */\n\n// Main component\nexport {\n createLiveCodeJS,\n type LiveCodeJSAPI,\n type LiveCodeJSOptions,\n} from './components/LiveCodeJS';\n\n// Supporting components (used by LiveCodeJS)\nexport {\n createCodeEditor,\n type CodeEditorAPI,\n type CodeEditorOptions,\n} from './components/CodeEditor';\n\nexport {\n createResultDisplay,\n type ResultDisplayAPI,\n type ResultDisplayOptions,\n type ResultItem,\n type ResultType,\n} from './components/ResultDisplay';\n\nexport {\n createDestination,\n type DestinationAPI,\n type DestinationOptions,\n} from './components/Destination';\n\n// Core types that might be useful\nexport { type ComponentAPI } from './core/Component';\n\n// Utilities that might be useful\nexport {\n evaluateJavaScript,\n createSafeContext,\n formatEvaluationResult,\n type EvaluationContext,\n type EvaluationResult,\n type EvaluationOptions,\n} from './utils/evaluation';\n\n// Export version info\nexport const version = '1.0.0';\nexport const name = '@walkeros/explorer';\n","/**\n * Core Component Factory - Base for all walkerOS Explorer components\n *\n * Provides:\n * - Isolated state per instance\n * - Unique ID generation to prevent conflicts\n * - Event system for component communication\n * - Lifecycle management\n * - DOM utilities\n * - Enhanced shadow DOM theme inheritance\n */\n\nimport { setElementTheme, detectTheme } from './css-theme-system';\n\nexport interface ComponentOptions {\n className?: string;\n autoMount?: boolean;\n useShadowDOM?: boolean;\n theme?: 'light' | 'dark' | 'auto';\n [key: string]: unknown;\n}\n\nexport interface ComponentAPI {\n id: string;\n mount(): void;\n unmount(): void;\n destroy(): void;\n on(event: string, handler: Function): () => void;\n emit(event: string, data?: unknown): void;\n getElement(): HTMLElement | null;\n getShadowRoot(): ShadowRoot | null;\n getContentRoot(): HTMLElement | ShadowRoot;\n injectCSS(css: string, id?: string): void;\n}\n\n// Global registry to track all component instances\nconst componentRegistry = new Map<string, ComponentAPI>();\n\n/**\n * Generate unique ID for component instances\n */\nexport function generateUniqueId(prefix = 'explorer'): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${prefix}-${timestamp}-${random}`;\n}\n\n/**\n * Get element from selector or HTMLElement\n */\nfunction getElement(elementOrSelector: HTMLElement | string): HTMLElement {\n if (typeof elementOrSelector === 'string') {\n const element = document.querySelector(elementOrSelector);\n if (!element) {\n throw new Error(`Element not found: ${elementOrSelector}`);\n }\n return element as HTMLElement;\n }\n return elementOrSelector;\n}\n\n/**\n * Core Component Factory\n * Creates isolated component instances with unique IDs and event systems\n */\nexport function createComponent(\n elementOrSelector: HTMLElement | string,\n options: ComponentOptions = {},\n): ComponentAPI {\n const element = getElement(elementOrSelector);\n\n // Check for existing component instance to prevent duplicates\n const existingId = element.getAttribute('data-explorer-component');\n if (existingId && componentRegistry.has(existingId)) {\n console.warn(\n `Component already exists on element, destroying existing instance: ${existingId}`,\n );\n const existingComponent = componentRegistry.get(existingId);\n existingComponent?.destroy();\n }\n\n const id = generateUniqueId();\n\n // Component state (isolated per instance)\n let mounted = false;\n let destroyed = false;\n const eventListeners = new Map<string, Set<Function>>();\n const cleanupFunctions: Function[] = [];\n let shadowRoot: ShadowRoot | null = null;\n\n // Set unique ID on element to prevent conflicts\n if (!element.id) {\n element.id = id;\n }\n\n // Add component marker\n element.setAttribute('data-explorer-component', id);\n\n // Create shadow DOM if requested and supported\n if (options.useShadowDOM && element.attachShadow) {\n try {\n shadowRoot = element.attachShadow({ mode: 'open' });\n // Add unique class to shadow root for styling\n const shadowContainer = document.createElement('div');\n shadowContainer.className = 'explorer-shadow-container';\n shadowContainer.setAttribute('data-explorer-component', id);\n shadowRoot.appendChild(shadowContainer);\n } catch (error) {\n console.warn(\n 'Failed to create shadow DOM, falling back to light DOM:',\n error,\n );\n shadowRoot = null;\n }\n }\n\n // Basic component setup\n const setupComponent = () => {\n const targetElement =\n (shadowRoot?.firstElementChild as HTMLElement) || element;\n\n // Always add explorer class for CSS targeting\n targetElement.classList.add('explorer-component');\n };\n\n // Component API\n const api: ComponentAPI = {\n id,\n\n mount() {\n if (mounted || destroyed) return;\n\n mounted = true;\n setupComponent();\n\n // Add component class\n if (options.className) {\n element.classList.add(options.className);\n }\n\n // Handle theme setting\n if (options.theme) {\n if (options.theme === 'auto') {\n const detectedTheme = detectTheme();\n setElementTheme(element, detectedTheme);\n } else {\n setElementTheme(element, options.theme);\n }\n }\n\n api.emit('mount');\n },\n\n unmount() {\n if (!mounted || destroyed) return;\n\n mounted = false;\n api.emit('unmount');\n },\n\n destroy() {\n if (destroyed) return;\n\n destroyed = true;\n\n if (mounted) {\n api.unmount();\n }\n\n // Emit destroy event before clearing listeners\n api.emit('destroy');\n\n // Clear all event listeners\n eventListeners.clear();\n\n // Run cleanup functions\n cleanupFunctions.forEach((cleanup) => cleanup());\n cleanupFunctions.length = 0;\n\n // Remove component marker and classes\n element.removeAttribute('data-explorer-component');\n element.classList.remove('explorer-component');\n\n // Clean up shadow DOM\n if (shadowRoot) {\n shadowRoot.innerHTML = '';\n shadowRoot = null;\n }\n\n // Remove from registry\n componentRegistry.delete(id);\n },\n\n on(event: string, handler: Function): () => void {\n if (!eventListeners.has(event)) {\n eventListeners.set(event, new Set());\n }\n\n const handlers = eventListeners.get(event)!;\n handlers.add(handler);\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler);\n if (handlers.size === 0) {\n eventListeners.delete(event);\n }\n };\n },\n\n emit(event: string, data?: unknown) {\n const handlers = eventListeners.get(event);\n if (!handlers) return;\n\n handlers.forEach((handler) => {\n try {\n handler(data, api);\n } catch (error) {\n console.error(`Error in event handler for '${event}':`, error);\n }\n });\n },\n\n getElement() {\n return destroyed ? null : element;\n },\n\n getShadowRoot() {\n return destroyed ? null : shadowRoot;\n },\n\n getContentRoot(): HTMLElement | ShadowRoot {\n if (destroyed) return element;\n return (shadowRoot?.firstElementChild as HTMLElement) || element;\n },\n\n injectCSS(css: string, id?: string): void {\n if (destroyed) return;\n\n const targetRoot = shadowRoot || document.head;\n const styleId = id || `explorer-css-${api.id}`;\n\n // Remove existing style with same ID\n const existingStyle = targetRoot.querySelector(`#${styleId}`);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n // Create and inject new style\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = css;\n\n if (shadowRoot) {\n shadowRoot.appendChild(style);\n } else {\n document.head.appendChild(style);\n }\n },\n };\n\n // Register component\n componentRegistry.set(id, api);\n\n // Auto-mount if requested\n if (options.autoMount !== false) {\n api.mount();\n }\n\n return api;\n}\n\n/**\n * Get all active component instances\n */\nexport function getAllComponents(): ComponentAPI[] {\n return Array.from(componentRegistry.values());\n}\n\n/**\n * Get component by ID\n */\nexport function getComponent(id: string): ComponentAPI | undefined {\n return componentRegistry.get(id);\n}\n\n/**\n * Destroy all components (useful for cleanup)\n */\nexport function destroyAllComponents(): void {\n const components = Array.from(componentRegistry.values());\n components.forEach((component) => component.destroy());\n}\n\n/**\n * Find components by selector\n */\nexport function findComponents(selector: string): ComponentAPI[] {\n const elements = document.querySelectorAll(selector);\n const components: ComponentAPI[] = [];\n\n elements.forEach((element) => {\n const componentId = element.getAttribute('data-explorer-component');\n if (componentId) {\n const component = componentRegistry.get(componentId);\n if (component) {\n components.push(component);\n }\n }\n });\n\n return components;\n}\n","/**\n * DOM Utilities - Helper functions for DOM manipulation\n *\n * Features:\n * - Safe element creation and manipulation\n * - Event delegation\n * - CSS injection\n * - Element queries with error handling\n */\n\n/**\n * Create element with attributes and styles\n */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n attributes: Record<string, string> = {},\n styles: Record<string, string> = {},\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tagName);\n\n // Set attributes\n Object.entries(attributes).forEach(([key, value]) => {\n if (key === 'className') {\n element.className = value;\n } else if (key === 'textContent') {\n element.textContent = value;\n } else if (key === 'innerHTML') {\n element.innerHTML = value;\n } else {\n element.setAttribute(key, value);\n }\n });\n\n // Set styles\n Object.entries(styles).forEach(([property, value]) => {\n (element.style as any)[property] = value;\n });\n\n return element;\n}\n\n/**\n * Safe element query with error handling\n */\nexport function getElement(selector: string | HTMLElement): HTMLElement {\n if (typeof selector === 'string') {\n const element = document.querySelector(selector);\n if (!element) {\n throw new Error(`Element not found: ${selector}`);\n }\n return element as HTMLElement;\n }\n return selector;\n}\n\n/**\n * Safe element query that returns null if not found\n */\nexport function findElement(selector: string): HTMLElement | null {\n try {\n return getElement(selector);\n } catch {\n return null;\n }\n}\n\n/**\n * Get all elements matching a selector\n */\nexport function getElements(selector: string): HTMLElement[] {\n return Array.from(document.querySelectorAll(selector)) as HTMLElement[];\n}\n\n/**\n * Check if element matches selector\n */\nexport function matches(element: Element, selector: string): boolean {\n return element.matches ? element.matches(selector) : false;\n}\n\n/**\n * Find closest parent element matching selector\n */\nexport function closest(element: Element, selector: string): Element | null {\n return element.closest ? element.closest(selector) : null;\n}\n\n/**\n * Add event listener with automatic cleanup\n */\nexport function addEventListener<K extends keyof HTMLElementEventMap>(\n element: Element | Document | Window,\n event: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n): () => void {\n element.addEventListener(event as string, handler as EventListener, options);\n\n return () => {\n element.removeEventListener(\n event as string,\n handler as EventListener,\n options,\n );\n };\n}\n\n/**\n * Event delegation helper\n */\nexport function delegate<K extends keyof HTMLElementEventMap>(\n container: Element,\n selector: string,\n event: K,\n handler: (event: HTMLElementEventMap[K], target: Element) => void,\n): () => void {\n const delegateHandler = (e: Event) => {\n const target = (e.target as Element)?.closest?.(selector);\n if (target && container.contains(target)) {\n handler(e as HTMLElementEventMap[K], target);\n }\n };\n\n return addEventListener(container, event, delegateHandler);\n}\n\n/**\n * Inject CSS into document head or shadow root\n */\nexport function injectCSS(\n css: string,\n id?: string,\n target?: HTMLElement | ShadowRoot | Document,\n): HTMLStyleElement {\n const targetDocument = target || document;\n const targetHead =\n target instanceof ShadowRoot\n ? target\n : target instanceof HTMLElement\n ? target\n : document.head;\n\n // Remove existing style with same ID\n if (id) {\n const existing = targetDocument.querySelector\n ? targetDocument.querySelector(`#${id}`)\n : document.getElementById(id);\n if (existing) {\n existing.remove();\n }\n }\n\n const style = createElement('style', {\n type: 'text/css',\n ...(id && { id }),\n });\n\n style.textContent = css;\n targetHead.appendChild(style);\n\n return style;\n}\n\n/**\n * Enhanced CSS injection for shadow DOM components\n */\nexport function injectComponentCSS(\n css: string,\n id: string,\n shadowRoot?: ShadowRoot | null,\n scopePrefix?: string,\n): HTMLStyleElement {\n // Add scoping if no shadow DOM\n let scopedCSS = css;\n if (!shadowRoot && scopePrefix) {\n // Add CSS scoping for light DOM usage\n scopedCSS = css.replace(/(\\.explorer-[\\w-]+)/g, `${scopePrefix} $1`);\n }\n\n // Inject into shadow root or document\n const target = shadowRoot || document;\n return injectCSS(scopedCSS, id, target);\n}\n\n/**\n * Get computed style value\n */\nexport function getComputedStyleValue(\n element: Element,\n property: string,\n): string {\n return window.getComputedStyle(element).getPropertyValue(property);\n}\n\n/**\n * Check if element is visible\n */\nexport function isVisible(element: Element): boolean {\n const style = window.getComputedStyle(element);\n return (\n style.display !== 'none' &&\n style.visibility !== 'hidden' &&\n parseFloat(style.opacity) > 0\n );\n}\n\n/**\n * Get element dimensions\n */\nexport function getDimensions(element: Element) {\n const rect = element.getBoundingClientRect();\n return {\n width: rect.width,\n height: rect.height,\n top: rect.top,\n left: rect.left,\n right: rect.right,\n bottom: rect.bottom,\n };\n}\n\n/**\n * Scroll element into view smoothly\n */\nexport function scrollIntoView(\n element: Element,\n options: ScrollIntoViewOptions = { behavior: 'smooth', block: 'nearest' },\n): void {\n if (element.scrollIntoView) {\n element.scrollIntoView(options);\n }\n}\n\n/**\n * Copy text to clipboard\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n if (navigator.clipboard && window.isSecureContext) {\n await navigator.clipboard.writeText(text);\n return true;\n } else {\n // Fallback for older browsers\n const textArea = createElement('textarea', {\n value: text,\n style: 'position: absolute; left: -999999px',\n });\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n const successful = document.execCommand('copy');\n document.body.removeChild(textArea);\n return successful;\n } catch {\n document.body.removeChild(textArea);\n return false;\n }\n }\n } catch {\n return false;\n }\n}\n\n/**\n * Create a DocumentFragment from HTML string\n */\nexport function createFragment(html: string): DocumentFragment {\n const template = createElement('template');\n template.innerHTML = html.trim();\n return template.content;\n}\n\n/**\n * Safe innerHTML replacement\n */\nexport function setHTML(element: Element, html: string): void {\n // Clear existing content\n element.innerHTML = '';\n\n // Create fragment and append\n const fragment = createFragment(html);\n element.appendChild(fragment);\n}\n\n/**\n * Escape HTML to prevent XSS\n */\nexport function escapeHTML(text: string): string {\n const div = createElement('div');\n div.textContent = text;\n return div.innerHTML;\n}\n\n/**\n * Debounced resize observer\n */\nexport function observeResize(\n element: Element,\n callback: (entry: ResizeObserverEntry) => void,\n debounceMs = 100,\n): () => void {\n if (!window.ResizeObserver) {\n // Fallback for browsers without ResizeObserver\n const handler = () => callback({} as ResizeObserverEntry);\n const debouncedHandler = debounce(handler, debounceMs);\n\n return addEventListener(window, 'resize', debouncedHandler);\n }\n\n const debouncedCallback = debounce((entries: ResizeObserverEntry[]) => {\n entries.forEach(callback);\n }, debounceMs);\n\n const observer = new ResizeObserver(debouncedCallback);\n observer.observe(element);\n\n return () => observer.disconnect();\n}\n\n/**\n * Mutation observer helper\n */\nexport function observeMutations(\n element: Element,\n callback: (mutations: MutationRecord[]) => void,\n options: MutationObserverInit = { childList: true, subtree: true },\n): () => void {\n const observer = new MutationObserver(callback);\n observer.observe(element, options);\n\n return () => observer.disconnect();\n}\n\n/**\n * Simple debounce utility\n */\nfunction debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timeout: ReturnType<typeof setTimeout>;\n\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\n/**\n * Check if element is in viewport\n */\nexport function isInViewport(element: Element, threshold = 0): boolean {\n const rect = element.getBoundingClientRect();\n const windowHeight =\n window.innerHeight || document.documentElement.clientHeight;\n const windowWidth = window.innerWidth || document.documentElement.clientWidth;\n\n return (\n rect.top >= -threshold &&\n rect.left >= -threshold &&\n rect.bottom <= windowHeight + threshold &&\n rect.right <= windowWidth + threshold\n );\n}\n\n/**\n * Get unique selector for element\n */\nexport function getUniqueSelector(element: Element): string {\n if (element.id) {\n return `#${element.id}`;\n }\n\n const path: string[] = [];\n\n while (element && element.nodeType === Node.ELEMENT_NODE) {\n let selector = element.nodeName.toLowerCase();\n\n if (element.className) {\n selector += '.' + element.className.trim().split(/\\s+/).join('.');\n }\n\n // Add nth-child if needed for uniqueness\n const parent = element.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children);\n const index = siblings.indexOf(element) + 1;\n if (siblings.length > 1) {\n selector += `:nth-child(${index})`;\n }\n }\n\n path.unshift(selector);\n element = element.parentElement as Element;\n }\n\n return path.join(' > ');\n}\n","/**\n * UnifiedHeader - Consistent header component for all explorer boxes\n *\n * Features:\n * - Unified styling across all components\n * - Callback-driven button visibility (no separate flags)\n * - Flexible button configuration\n * - Theme-aware styling\n * - Consistent spacing and layout\n */\n\nimport {\n createElement,\n addEventListener,\n injectComponentCSS,\n} from '../utils/dom';\nimport { toggleElementTheme } from './css-theme-system';\n\nexport interface HeaderButton {\n text: string;\n callback: () => void;\n className?: string;\n title?: string;\n}\n\nexport interface UnifiedHeaderOptions {\n title: string;\n onClear?: () => void;\n onCopy?: () => void;\n onRefresh?: () => void;\n onThemeToggle?: () => void;\n customButtons?: HeaderButton[];\n className?: string;\n shadowRoot?: ShadowRoot | null;\n}\n\nexport interface UnifiedHeaderAPI {\n getElement(): HTMLElement;\n setTitle(title: string): void;\n updateButtons(options: Partial<UnifiedHeaderOptions>): void;\n destroy(): void;\n}\n\n/**\n * Create a unified header component\n */\nexport function createUnifiedHeader(\n options: UnifiedHeaderOptions,\n): UnifiedHeaderAPI {\n let currentTitle = options.title;\n let headerElement: HTMLElement;\n let titleElement: HTMLElement;\n let actionsElement: HTMLElement;\n const cleanupFunctions: Array<() => void> = [];\n const shadowRoot = options.shadowRoot || null;\n\n /**\n * Inject unified header CSS styles\n */\n function injectStyles(): void {\n const css = `\n/* UnifiedHeader Component Styles */\n.explorer-unified-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: var(--explorer-bg-tertiary, #f9fafb);\n border-bottom: 1px solid var(--explorer-border-primary, #e5e7eb);\n font-size: 12px;\n font-weight: 600;\n color: var(--explorer-text-secondary, #6b7280);\n min-height: 32px;\n box-sizing: border-box;\n}\n\n.explorer-unified-header__title {\n flex: 1;\n color: var(--explorer-text-secondary, #6b7280);\n font-weight: 600;\n font-size: 12px;\n margin: 0;\n padding: 0;\n}\n\n.explorer-unified-header__actions {\n display: flex;\n align-items: center;\n gap: 4px;\n margin-left: auto;\n}\n\n.explorer-unified-header__btn {\n background: none;\n border: 1px solid var(--explorer-border-primary, #e5e7eb);\n color: var(--explorer-text-secondary, #6b7280);\n cursor: pointer;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 10px;\n font-weight: 500;\n transition: all 0.2s ease;\n line-height: 1.2;\n min-width: auto;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.explorer-unified-header__btn:hover {\n background: var(--explorer-interactive-hover, #f3f4f6);\n color: var(--explorer-text-primary, #111827);\n border-color: var(--explorer-border-secondary, #d1d5db);\n}\n\n.explorer-unified-header__btn:active {\n background: var(--explorer-interactive-active, #e5e7eb);\n}\n\n.explorer-unified-header__btn--clear {\n /* Specific styling for clear button if needed */\n}\n\n.explorer-unified-header__btn--copy {\n /* Specific styling for copy button if needed */\n}\n\n.explorer-unified-header__btn--refresh {\n /* Specific styling for refresh button if needed */\n}\n\n.explorer-unified-header__btn--theme {\n /* Specific styling for theme toggle button */\n font-size: 12px;\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .explorer-unified-header {\n padding: 6px 10px;\n min-height: 28px;\n }\n \n .explorer-unified-header__btn {\n padding: 1px 4px;\n font-size: 9px;\n height: 18px;\n }\n}\n`;\n\n // Use shadow DOM-aware CSS injection\n injectComponentCSS(\n css,\n 'explorer-unified-header-styles',\n shadowRoot,\n '.explorer-unified-header',\n );\n }\n\n /**\n * Create header buttons based on options\n */\n function createButtons(opts: UnifiedHeaderOptions): HTMLElement[] {\n const buttons: HTMLElement[] = [];\n\n // Clear button (show if onClear callback exists)\n if (opts.onClear) {\n const clearBtn = createElement('button', {\n className:\n 'explorer-unified-header__btn explorer-unified-header__btn--clear',\n textContent: 'Clear',\n title: 'Clear content',\n }) as HTMLButtonElement;\n\n cleanupFunctions.push(addEventListener(clearBtn, 'click', opts.onClear));\n buttons.push(clearBtn);\n }\n\n // Copy button (show if onCopy callback exists)\n if (opts.onCopy) {\n const copyBtn = createElement('button', {\n className:\n 'explorer-unified-header__btn explorer-unified-header__btn--copy',\n textContent: '📋',\n title: 'Copy content',\n }) as HTMLButtonElement;\n\n cleanupFunctions.push(addEventListener(copyBtn, 'click', opts.onCopy));\n buttons.push(copyBtn);\n }\n\n // Refresh button (show if onRefresh callback exists)\n if (opts.onRefresh) {\n const refreshBtn = createElement('button', {\n className:\n 'explorer-unified-header__btn explorer-unified-header__btn--refresh',\n textContent: '🔄',\n title: 'Refresh',\n }) as HTMLButtonElement;\n\n cleanupFunctions.push(\n addEventListener(refreshBtn, 'click', opts.onRefresh),\n );\n buttons.push(refreshBtn);\n }\n\n // Theme toggle button (show if onThemeToggle callback exists)\n if (opts.onThemeToggle) {\n const themeBtn = createElement('button', {\n className:\n 'explorer-unified-header__btn explorer-unified-header__btn--theme',\n textContent: '🌙',\n title: 'Toggle theme',\n }) as HTMLButtonElement;\n\n cleanupFunctions.push(\n addEventListener(themeBtn, 'click', opts.onThemeToggle),\n );\n buttons.push(themeBtn);\n }\n\n // Custom buttons\n if (opts.customButtons) {\n opts.customButtons.forEach((buttonConfig) => {\n const customBtn = createElement('button', {\n className: `explorer-unified-header__btn ${buttonConfig.className || ''}`,\n textContent: buttonConfig.text,\n title: buttonConfig.title || buttonConfig.text,\n }) as HTMLButtonElement;\n\n cleanupFunctions.push(\n addEventListener(customBtn, 'click', buttonConfig.callback),\n );\n buttons.push(customBtn);\n });\n }\n\n return buttons;\n }\n\n /**\n * Create the DOM structure\n */\n function createDOM(): HTMLElement {\n headerElement = createElement('div', {\n className: `explorer-unified-header ${options.className || ''}`,\n });\n\n titleElement = createElement('div', {\n className: 'explorer-unified-header__title',\n textContent: currentTitle,\n });\n\n actionsElement = createElement('div', {\n className: 'explorer-unified-header__actions',\n });\n\n // Add buttons\n const buttons = createButtons(options);\n buttons.forEach((button) => actionsElement.appendChild(button));\n\n headerElement.appendChild(titleElement);\n headerElement.appendChild(actionsElement);\n\n return headerElement;\n }\n\n /**\n * Update buttons based on new options\n */\n function updateButtons(newOptions: Partial<UnifiedHeaderOptions>): void {\n // Clear existing buttons and cleanup\n actionsElement.innerHTML = '';\n cleanupFunctions.forEach((cleanup) => cleanup());\n cleanupFunctions.length = 0;\n\n // Create new buttons with merged options\n const mergedOptions = { ...options, ...newOptions };\n const buttons = createButtons(mergedOptions);\n buttons.forEach((button) => actionsElement.appendChild(button));\n\n // Update stored options\n Object.assign(options, newOptions);\n }\n\n // Enhanced API\n const api: UnifiedHeaderAPI = {\n getElement(): HTMLElement {\n return headerElement;\n },\n\n setTitle(title: string): void {\n currentTitle = title;\n titleElement.textContent = title;\n },\n\n updateButtons(newOptions: Partial<UnifiedHeaderOptions>): void {\n updateButtons(newOptions);\n },\n\n destroy(): void {\n cleanupFunctions.forEach((cleanup) => cleanup());\n cleanupFunctions.length = 0;\n headerElement?.remove();\n },\n };\n\n // Initialize component\n injectStyles();\n createDOM();\n\n return api;\n}\n","/**\n * UnifiedContainer - Consistent container component for all explorer boxes\n *\n * Features:\n * - Unified styling across all components\n * - Individual rounded borders on each box\n * - Consistent spacing and layout\n * - Theme-aware styling\n * - No borders on parent containers\n */\n\nimport { createElement, injectComponentCSS } from '../utils/dom';\nimport {\n createUnifiedHeader,\n type UnifiedHeaderOptions,\n type UnifiedHeaderAPI,\n} from './UnifiedHeader';\n\nexport interface UnifiedContainerOptions {\n className?: string;\n height?: string;\n showHeader?: boolean;\n headerOptions?: UnifiedHeaderOptions;\n contentClassName?: string;\n useShadowDOM?: boolean;\n shadowRoot?: ShadowRoot | null;\n}\n\nexport interface UnifiedContainerAPI {\n getElement(): HTMLElement;\n getContentElement(): HTMLElement;\n getHeader(): UnifiedHeaderAPI | null;\n setHeight(height: string): void;\n destroy(): void;\n}\n\n/**\n * Create a unified container component\n */\nexport function createUnifiedContainer(\n options: UnifiedContainerOptions = {},\n): UnifiedContainerAPI {\n let containerElement: HTMLElement;\n let contentElement: HTMLElement;\n let headerAPI: UnifiedHeaderAPI | null = null;\n const shadowRoot = options.shadowRoot || null;\n\n /**\n * Inject unified container CSS styles\n */\n function injectStyles(): void {\n const css = `\n/* UnifiedContainer Component Styles */\n.explorer-unified-container {\n display: flex;\n flex-direction: column;\n background: var(--explorer-bg-primary);\n border: 1px solid var(--explorer-border-primary, #e5e7eb);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n transition: all 0.2s ease;\n}\n\n\n.explorer-unified-container:focus-within {\n border-color: var(--explorer-interactive-primary, #2563eb);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1), 0 1px 3px 0 rgba(0, 0, 0, 0.1);\n}\n\n.explorer-unified-container__content {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n background: transparent;\n}\n\n/* Specific container variants */\n.explorer-unified-container--code-editor {\n /* Specific styling for code editor containers */\n}\n\n.explorer-unified-container--result-display {\n /* Specific styling for result display containers */\n}\n\n.explorer-unified-container--preview {\n /* Specific styling for preview containers */\n}\n\n.explorer-unified-container--destination {\n /* Specific styling for destination containers */\n}\n\n/* Height management */\n.explorer-unified-container--fixed-height {\n height: var(--container-height);\n}\n\n.explorer-unified-container--flex-height {\n flex: 1;\n min-height: 0;\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .explorer-unified-container {\n border-radius: 6px;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n }\n}\n`;\n\n // Use shadow DOM-aware CSS injection\n injectComponentCSS(\n css,\n 'explorer-unified-container-styles',\n shadowRoot,\n '.explorer-unified-container',\n );\n }\n\n /**\n * Create the DOM structure\n */\n function createDOM(): HTMLElement {\n containerElement = createElement('div', {\n className: `explorer-unified-container ${options.className || ''}`,\n });\n\n // Set height if provided\n if (options.height) {\n containerElement.style.setProperty('--container-height', options.height);\n containerElement.classList.add(\n 'explorer-unified-container--fixed-height',\n );\n } else {\n containerElement.classList.add('explorer-unified-container--flex-height');\n }\n\n // Create header if requested\n if (options.showHeader && options.headerOptions) {\n const headerOptions = { ...options.headerOptions, shadowRoot };\n headerAPI = createUnifiedHeader(headerOptions);\n containerElement.appendChild(headerAPI.getElement());\n }\n\n // Create content container\n contentElement = createElement('div', {\n className: `explorer-unified-container__content ${options.contentClassName || ''}`,\n });\n\n containerElement.appendChild(contentElement);\n\n return containerElement;\n }\n\n // Enhanced API\n const api: UnifiedContainerAPI = {\n getElement(): HTMLElement {\n return containerElement;\n },\n\n getContentElement(): HTMLElement {\n return contentElement;\n },\n\n getHeader(): UnifiedHeaderAPI | null {\n return headerAPI;\n },\n\n setHeight(height: string): void {\n containerElement.style.setProperty('--container-height', height);\n if (\n !containerElement.classList.contains(\n 'explorer-unified-container--fixed-height',\n )\n ) {\n containerElement.classList.remove(\n 'explorer-unified-container--flex-height',\n );\n containerElement.classList.add(\n 'explorer-unified-container--fixed-height',\n );\n }\n },\n\n destroy(): void {\n headerAPI?.destroy();\n containerElement?.remove();\n },\n };\n\n // Initialize component\n injectStyles();\n createDOM();\n\n return api;\n}\n","/**\n * MultiColumnLayout - Reusable multi-column layout component\n *\n * Features:\n * - Configurable column count and titles\n * - Unified styling with existing explorer components\n * - Shadow DOM support for CSS isolation\n * - Consistent theming and layout behavior\n * - Based on proven LiveCodeBase architecture\n */\n\nimport { createComponent, type ComponentAPI } from './Component';\nimport {\n createUnifiedContainer,\n type UnifiedContainerAPI,\n} from './UnifiedContainer';\nimport { createElement, injectComponentCSS } from '../utils/dom';\nimport {\n CSS_THEME_VARIABLES,\n CSS_SYNTAX_HIGHLIGHTING,\n} from './css-theme-system';\nimport { CODE_EDITOR_CSS } from '../components/CodeEditor';\nimport { RESULT_DISPLAY_CSS } from '../components/ResultDisplay';\n\nexport interface ColumnConfig {\n title: string;\n className?: string;\n contentClassName?: string;\n}\n\nexport interface MultiColumnLayoutOptions {\n columns: ColumnConfig[];\n layout?: 'horizontal' | 'vertical';\n height?: string;\n showHeader?: boolean;\n title?: string;\n useShadowDOM?: boolean;\n gap?: string;\n}\n\nexport interface MultiColumnLayoutAPI extends ComponentAPI {\n getColumnElement(index: number): HTMLElement | null;\n getColumnContentElement(index: number): HTMLElement | null;\n setLayout(layout: 'horizontal' | 'vertical'): void;\n getLayout(): string;\n}\n\nconst MULTI_COLUMN_CSS = `\n/* Multi-Column Layout Component Styles */\n.explorer-multi-column-layout {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: transparent;\n overflow: hidden;\n}\n\n.explorer-multi-column-layout__content {\n display: grid;\n flex: 1;\n gap: var(--column-gap, 16px);\n height: 100%;\n min-height: 0;\n}\n\n.explorer-multi-column-layout__content--horizontal {\n grid-auto-flow: column;\n grid-auto-columns: 1fr;\n}\n\n.explorer-multi-column-layout__content--vertical {\n grid-auto-flow: row;\n grid-auto-rows: 1fr;\n}\n\n/* Responsive design */\n@media (max-width: 1024px) {\n .explorer-multi-column-layout__content--horizontal {\n grid-auto-flow: row;\n grid-auto-rows: minmax(300px, 1fr);\n gap: 12px;\n }\n}\n\n@media (max-width: 768px) {\n .explorer-multi-column-layout__content {\n gap: 8px;\n }\n}\n`;\n\n/**\n * Create a multi-column layout component\n */\nexport function createMultiColumnLayout(\n elementOrSelector: HTMLElement | string,\n options: MultiColumnLayoutOptions,\n): {\n api: MultiColumnLayoutAPI;\n contentElement: HTMLElement;\n columnContainers: UnifiedContainerAPI[];\n cleanup: Array<() => void>;\n} {\n const { columns, layout = 'horizontal', gap = '16px' } = options;\n\n if (!columns || columns.length === 0) {\n throw new Error(\n 'MultiColumnLayout requires at least one column configuration',\n );\n }\n\n // Create base component with shadow DOM for CSS isolation\n const baseComponent = createComponent(elementOrSelector, {\n autoMount: false,\n useShadowDOM: true, // Always use shadow DOM for optimal CSS isolation\n });\n\n const element = baseComponent.getElement()!;\n const shadowRoot = baseComponent.getShadowRoot();\n const contentRoot = baseComponent.getContentRoot() as HTMLElement;\n\n // Add classes for styling\n element.classList.add('explorer-multi-column-layout');\n contentRoot.classList.add('explorer-multi-column-layout');\n\n // Component state\n let currentLayout = layout;\n const columnContainers: UnifiedContainerAPI[] = [];\n const cleanupFunctions: Array<() => void> = [];\n\n /**\n * Inject all CSS styles (foundation, layout, and child component styles)\n */\n function injectStyles(): void {\n if (!shadowRoot) {\n throw new Error(\n 'MultiColumnLayout requires shadow DOM for CSS isolation',\n );\n }\n\n // Inject all required CSS into the single shadow DOM\n // 1. Foundation theme variables (required by all components)\n baseComponent.injectCSS(CSS_THEME_VARIABLES, 'explorer-foundation-theme');\n\n // 2. Syntax highlighting (required by CodeEditor and ResultDisplay)\n baseComponent.injectCSS(\n CSS_SYNTAX_HIGHLIGHTING,\n 'syntax-highlighting-styles',\n );\n\n // 3. Component-specific styles\n baseComponent.injectCSS(CODE_EDITOR_CSS, 'code-editor-styles');\n baseComponent.injectCSS(RESULT_DISPLAY_CSS, 'result-display-styles');\n\n // 4. Layout-specific styles\n baseComponent.injectCSS(\n MULTI_COLUMN_CSS,\n 'explorer-multi-column-layout-styles',\n );\n }\n\n /**\n * Create the column structure\n */\n function createColumns(): HTMLElement {\n const contentElement = createElement('div', {\n className: `explorer-multi-column-layout__content explorer-multi-column-layout__content--${currentLayout}`,\n });\n\n // Set CSS custom property for gap\n contentElement.style.setProperty('--column-gap', gap);\n\n // Create each column\n columns.forEach((columnConfig, index) => {\n const container = createUnifiedContainer({\n className: `explorer-multi-column-layout__column ${columnConfig.className || ''}`,\n contentClassName: columnConfig.contentClassName,\n showHeader: true,\n headerOptions: {\n title: columnConfig.title,\n },\n shadowRoot: shadowRoot,\n });\n\n columnContainers.push(container);\n contentElement.appendChild(container.getElement());\n });\n\n return contentElement;\n }\n\n /**\n * Initialize the layout\n */\n function initialize(): HTMLElement {\n injectStyles();\n const contentElement = createColumns();\n contentRoot.appendChild(contentElement);\n return contentElement;\n }\n\n // Create the layout\n const contentElement = initialize();\n\n // Enhanced API\n const api: MultiColumnLayoutAPI = {\n ...baseComponent,\n\n getColumnElement(index: number): HTMLElement | null {\n if (index < 0 || index >= columnContainers.length) {\n return null;\n }\n return columnContainers[index].getElement();\n },\n\n getColumnContentElement(index: number): HTMLElement | null {\n if (index < 0 || index >= columnContainers.length) {\n return null;\n }\n return columnContainers[index].getContentElement();\n },\n\n setLayout(newLayout: 'horizontal' | 'vertical'): void {\n if (newLayout === currentLayout) return;\n\n currentLayout = newLayout;\n const content = contentRoot.querySelector(\n '.explorer-multi-column-layout__content',\n );\n if (content) {\n content.className = `explorer-multi-column-layout__content explorer-multi-column-layout__content--${currentLayout}`;\n }\n },\n\n getLayout(): string {\n return currentLayout;\n },\n\n destroy(): void {\n // Cleanup column containers\n columnContainers.forEach((container) => {\n container.destroy?.();\n });\n\n // Run cleanup functions\n cleanupFunctions.forEach((fn) => fn());\n\n // Destroy base component\n baseComponent.destroy();\n },\n };\n\n return {\n api,\n contentElement,\n columnContainers,\n cleanup: cleanupFunctions,\n };\n}\n","/**\n * Syntax Highlighting - Lightweight syntax highlighting without external dependencies\n *\n * Features:\n * - JavaScript, HTML, CSS, JSON syntax highlighting\n * - Regex-based parsing for performance\n * - Customizable themes\n * - No external dependencies\n */\n\nexport interface SyntaxToken {\n type: string;\n value: string;\n start: number;\n end: number;\n}\n\nexport type SupportedLanguage =\n | 'javascript'\n | 'html'\n | 'css'\n | 'json'\n | 'typescript'\n | 'text';\n\n/**\n * Language definitions with regex patterns\n */\nconst languageDefinitions: Record<\n SupportedLanguage,\n Array<{ type: string; pattern: RegExp; className: string }>\n> = {\n javascript: [\n {\n type: 'comment',\n pattern: /\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*$/gm,\n className: 'syntax-comment',\n },\n {\n type: 'string',\n pattern: /\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|`(?:\\\\.|[^`\\\\])*`/g,\n className: 'syntax-string',\n },\n {\n type: 'keyword',\n pattern:\n /\\b(?:async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|export|extends|finally|for|function|if|import|in|instanceof|let|new|return|super|switch|this|throw|try|typeof|var|void|while|with|yield)\\b/g,\n className: 'syntax-keyword',\n },\n {\n type: 'boolean',\n pattern: /\\b(?:true|false|null|undefined)\\b/g,\n className: 'syntax-keyword',\n },\n {\n type: 'number',\n pattern: /\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b/g,\n className: 'syntax-number',\n },\n {\n type: 'function',\n pattern: /\\b[a-zA-Z_$][a-zA-Z0-9_$]*(?=\\s*\\()/g,\n className: 'syntax-function',\n },\n {\n type: 'operator',\n pattern:\n /[+\\-*/%=!<>?:&|^~]+|===|!==|==|!=|<=|>=|\\|\\||&&|\\+\\+|--|=>|\\.\\.\\./g,\n className: 'syntax-operator',\n },\n ],\n\n typescript: [\n {\n type: 'comment',\n pattern: /\\/\\*[\\s\\S]*?\\*\\/|\\/\\/.*$/gm,\n className: 'syntax-comment',\n },\n {\n type: 'string',\n pattern: /\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|`(?:\\\\.|[^`\\\\])*`/g,\n className: 'syntax-string',\n },\n {\n type: 'keyword',\n pattern:\n /\\b(?:abstract|any|as|async|await|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|namespace|new|private|protected|public|readonly|return|set|static|string|super|switch|this|throw|try|type|typeof|var|void|while|with|yield)\\b/g,\n className: 'syntax-keyword',\n },\n {\n type: 'boolean',\n pattern: /\\b(?:true|false|null|undefined)\\b/g,\n className: 'syntax-keyword',\n },\n {\n type: 'number',\n pattern: /\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b/g,\n className: 'syntax-number',\n },\n {\n type: 'function',\n pattern: /\\b[a-zA-Z_$][a-zA-Z0-9_$]*(?=\\s*\\()/g,\n className: 'syntax-function',\n },\n {\n type: 'type',\n pattern: /\\b[A-Z][a-zA-Z0-9]*\\b/g,\n className: 'syntax-type',\n },\n {\n type: 'operator',\n pattern:\n /[+\\-*/%=!<>?:&|^~]+|===|!==|==|!=|<=|>=|\\|\\||&&|\\+\\+|--|=>|\\.\\.\\./g,\n className: 'syntax-operator',\n },\n ],\n\n html: [\n {\n type: 'comment',\n pattern: /<!--[\\s\\S]*?-->/g,\n className: 'syntax-comment',\n },\n {\n type: 'tag',\n pattern: /<\\/?[a-zA-Z][a-zA-Z0-9-]*\\b/g,\n className: 'syntax-tag',\n },\n {\n type: 'elb-attribute',\n pattern: /\\bdata-elb[a-zA-Z-]*(?==)/g,\n className: 'syntax-elb-attribute',\n },\n {\n type: 'elb-value',\n pattern:\n /(?<=data-elb[a-zA-Z-]*=)\"[^\"]*\"|(?<=data-elb[a-zA-Z-]*=)'[^']*'/g,\n className: 'syntax-elb-value',\n },\n {\n type: 'attribute',\n pattern: /\\b[a-zA-Z-]+(?==)/g,\n className: 'syntax-attribute',\n },\n { type: 'value', pattern: /\"[^\"]*\"|'[^']*'/g, className: 'syntax-value' },\n ],\n\n json: [\n {\n type: 'key',\n pattern: /\"(?:\\\\.|[^\"\\\\])*\"(?=\\s*:)/g,\n className: 'syntax-attribute',\n },\n {\n type: 'string',\n pattern: /\"(?:\\\\.|[^\"\\\\])*\"/g,\n className: 'syntax-string',\n },\n {\n type: 'number',\n pattern: /-?\\b\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?\\b/g,\n className: 'syntax-number',\n },\n {\n type: 'boolean',\n pattern: /\\b(true|false|null)\\b/g,\n className: 'syntax-keyword',\n },\n ],\n\n css: [\n {\n type: 'comment',\n pattern: /\\/\\*[\\s\\S]*?\\*\\//g,\n className: 'syntax-comment',\n },\n {\n type: 'selector',\n pattern: /[.#]?[a-zA-Z][\\w-]*(?=\\s*\\{)/g,\n className: 'syntax-tag',\n },\n {\n type: 'property',\n pattern: /(?<=\\{|\\;)\\s*[a-zA-Z-]+(?=\\s*:)/g,\n className: 'syntax-property',\n },\n {\n type: 'value',\n pattern: /(?<=:\\s*)[^;}]+/g,\n className: 'syntax-string',\n },\n {\n type: 'unit',\n pattern: /\\b\\d+(?:px|em|rem|%|vh|vw|pt|pc|in|cm|mm|ex|ch|fr)\\b/g,\n className: 'syntax-number',\n },\n {\n type: 'color',\n pattern:\n /#[0-9a-fA-F]{3,6}\\b|rgb\\([^)]+\\)|rgba\\([^)]+\\)|hsl\\([^)]+\\)|hsla\\([^)]+\\)/g,\n className: 'syntax-number',\n },\n ],\n\n text: [],\n};\n\n/**\n * Highlight syntax for given language\n */\nexport function highlightSyntax(\n code: string,\n language: SupportedLanguage = 'text',\n): string {\n if (language === 'text' || !code.trim()) {\n return escapeHtml(code);\n }\n\n const definition = languageDefinitions[language];\n if (!definition) {\n return escapeHtml(code);\n }\n\n // Collect all matches with their positions\n const matches: Array<{\n start: number;\n end: number;\n type: string;\n className: string;\n content: string;\n }> = [];\n\n definition.forEach(({ type, pattern, className }) => {\n let match;\n while ((match = pattern.exec(code)) !== null) {\n matches.push({\n start: match.index,\n end: match.index + match[0].length,\n type,\n className,\n content: match[0],\n });\n }\n });\n\n // Sort matches by start position\n matches.sort((a, b) => a.start - b.start);\n\n // Remove overlapping matches (keep the first one)\n const filteredMatches = [];\n let lastEnd = 0;\n\n for (const match of matches) {\n if (match.start >= lastEnd) {\n filteredMatches.push(match);\n lastEnd = match.end;\n }\n }\n\n // Build highlighted HTML\n let result = '';\n let currentPos = 0;\n\n for (const match of filteredMatches) {\n // Add text before the match\n if (match.start > currentPos) {\n result += escapeHtml(code.slice(currentPos, match.start));\n }\n\n // Add highlighted match\n result += `<span class=\"${match.className}\">${escapeHtml(match.content)}</span>`;\n currentPos = match.end;\n }\n\n // Add remaining text\n if (currentPos < code.length) {\n result += escapeHtml(code.slice(currentPos));\n }\n\n return result;\n}\n\n/**\n * Get language from file extension or MIME type\n */\nexport function detectLanguage(filename: string): SupportedLanguage {\n const extension = filename.split('.').pop()?.toLowerCase();\n\n switch (extension) {\n case 'js':\n case 'jsx':\n return 'javascript';\n case 'ts':\n case 'tsx':\n return 'typescript';\n case 'html':\n case 'htm':\n return 'html';\n case 'css':\n return 'css';\n case 'json':\n return 'json';\n default:\n return 'text';\n }\n}\n\n/**\n * Format code with basic indentation\n */\nexport function formatCode(\n code: string,\n language: SupportedLanguage,\n indentSize = 2,\n): string {\n if (language === 'json') {\n try {\n return JSON.stringify(JSON.parse(code), null, indentSize);\n } catch {\n return code; // Return original if parsing fails\n }\n }\n\n if (language === 'html') {\n return formatHTML(code, indentSize);\n }\n\n // Basic formatting for other languages\n return code\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join('\\n');\n}\n\n/**\n * Format HTML with proper indentation\n */\nfunction formatHTML(html: string, indentSize = 2): string {\n const tab = ' '.repeat(indentSize);\n let result = '';\n let indent = 0;\n\n // Split by tags but preserve content\n const tokens = html.split(/(<\\/?[^>]+>)/g).filter((token) => token.trim());\n\n for (const token of tokens) {\n if (token.startsWith('</')) {\n // Closing tag\n indent = Math.max(0, indent - 1);\n result += tab.repeat(indent) + token + '\\n';\n } else if (\n token.startsWith('<') &&\n !token.endsWith('/>') &&\n !token.includes('</')\n ) {\n // Opening tag\n result += tab.repeat(indent) + token + '\\n';\n indent++;\n } else if (token.startsWith('<')) {\n // Self-closing tag\n result += tab.repeat(indent) + token + '\\n';\n } else {\n // Content\n const trimmed = token.trim();\n if (trimmed) {\n result += tab.repeat(indent) + trimmed + '\\n';\n }\n }\n }\n\n return result.trim();\n}\n\n/**\n * Escape HTML characters\n */\nfunction escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n };\n\n return text.replace(/[&<>\"']/g, (char) => map[char]);\n}\n\n/**\n * Get CSS for syntax highlighting\n * @deprecated Use CSS_SYNTAX_HIGHLIGHTING from css-theme-system.ts for enhanced shadow DOM support\n */\nexport function getSyntaxHighlightCSS(): string {\n // Import the enhanced CSS from the theme system for consistency\n // This maintains backward compatibility while using the improved system\n const { CSS_SYNTAX_HIGHLIGHTING } = require('../core/css-theme-system');\n return CSS_SYNTAX_HIGHLIGHTING;\n}\n\n/**\n * Create a syntax-highlighted code block\n */\nexport function createCodeBlock(\n code: string,\n language: SupportedLanguage = 'text',\n options: {\n className?: string;\n maxHeight?: string;\n } = {},\n): HTMLElement {\n const pre = document.createElement('pre');\n const codeElement = document.createElement('code');\n\n // Set classes\n pre.className = `syntax-highlight ${options.className || ''}`;\n codeElement.className = `language-${language}`;\n\n // Highlight and set content\n codeElement.innerHTML = highlightSyntax(code, language);\n pre.appendChild(codeElement);\n\n // Set max height if specified\n if (options.maxHeight) {\n pre.style.maxHeight = options.maxHeight;\n pre.style.overflow = 'auto';\n }\n\n return pre;\n}\n\n/**\n * Extract tokens from code for advanced processing\n */\nexport function tokenize(\n code: string,\n language: SupportedLanguage,\n): SyntaxToken[] {\n const definition = languageDefinitions[language];\n if (!definition) {\n return [{ type: 'text', value: code, start: 0, end: code.length }];\n }\n\n const tokens: SyntaxToken[] = [];\n const matches: Array<{\n start: number;\n end: number;\n type: string;\n value: string;\n }> = [];\n\n // Collect all matches\n definition.forEach(({ type, pattern }) => {\n let match;\n while ((match = pattern.exec(code)) !== null) {\n matches.push({\n start: match.index,\n end: match.index + match[0].length,\n type,\n value: match[0],\n });\n }\n });\n\n // Sort and filter overlapping matches\n matches.sort((a, b) => a.start - b.start);\n\n let currentPos = 0;\n for (const match of matches) {\n if (match.start >= currentPos) {\n // Add text token before this match\n if (match.start > currentPos) {\n tokens.push({\n type: 'text',\n value: code.slice(currentPos, match.start),\n start: currentPos,\n end: match.start,\n });\n }\n\n // Add the match token\n tokens.push({\n type: match.type,\n value: match.value,\n start: match.start,\n end: match.end,\n });\n\n currentPos = match.end;\n }\n }\n\n // Add remaining text\n if (currentPos < code.length) {\n tokens.push({\n type: 'text',\n value: code.slice(currentPos),\n start: currentPos,\n end: code.length,\n });\n }\n\n return tokens;\n}\n","/**\n * Performance Utilities - Debouncing, throttling, and other performance helpers\n *\n * Features:\n * - Debounce with immediate execution option\n * - Throttle for high-frequency events\n * - RAF-based scheduling\n * - Memory-efficient cleanup\n */\n\n/**\n * Debounce function - delays execution until after delay milliseconds have elapsed\n * since the last time it was invoked\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number,\n immediate = false,\n): {\n (...args: Parameters<T>): void;\n cancel(): void;\n flush(): ReturnType<T> | undefined;\n} {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let lastArgs: Parameters<T> | undefined;\n let lastResult: ReturnType<T>;\n\n const debounced = (...args: Parameters<T>): void => {\n lastArgs = args;\n\n const callNow = immediate && !timeoutId;\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = undefined;\n if (!immediate) {\n lastResult = func(...args);\n }\n }, delay);\n\n if (callNow) {\n lastResult = func(...args);\n }\n };\n\n debounced.cancel = (): void => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n };\n\n debounced.flush = (): ReturnType<T> | undefined => {\n if (timeoutId && lastArgs) {\n debounced.cancel();\n lastResult = func(...lastArgs);\n }\n return lastResult;\n };\n\n return debounced;\n}\n\n/**\n * Throttle function - ensures function is called at most once per specified interval\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n interval: number,\n options: { leading?: boolean; trailing?: boolean } = {},\n): {\n (...args: Parameters<T>): void;\n cancel(): void;\n} {\n const { leading = true, trailing = true } = options;\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let lastCallTime: number | undefined;\n let lastArgs: Parameters<T> | undefined;\n\n const throttled = (...args: Parameters<T>): void => {\n const now = Date.now();\n\n if (!lastCallTime && !leading) {\n lastCallTime = now;\n }\n\n const remaining = interval - (now - (lastCallTime || 0));\n\n lastArgs = args;\n\n if (remaining <= 0 || remaining > interval) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n lastCallTime = now;\n func(...args);\n } else if (!timeoutId && trailing) {\n timeoutId = setTimeout(() => {\n lastCallTime = leading ? Date.now() : undefined;\n timeoutId = undefined;\n if (lastArgs) {\n func(...lastArgs);\n }\n }, remaining);\n }\n };\n\n throttled.cancel = (): void => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n lastCallTime = undefined;\n };\n\n return throttled;\n}\n\n/**\n * RAF-based throttle for smooth animations\n */\nexport function rafThrottle<T extends (...args: any[]) => any>(\n func: T,\n): {\n (...args: Parameters<T>): void;\n cancel(): void;\n} {\n let rafId: number | undefined;\n let lastArgs: Parameters<T> | undefined;\n\n const throttled = (...args: Parameters<T>): void => {\n lastArgs = args;\n\n if (!rafId) {\n rafId = requestAnimationFrame(() => {\n rafId = undefined;\n if (lastArgs) {\n func(...lastArgs);\n }\n });\n }\n };\n\n throttled.cancel = (): void => {\n if (rafId) {\n cancelAnimationFrame(rafId);\n rafId = undefined;\n }\n };\n\n return throttled;\n}\n\n/**\n * Async debounce for promises\n */\nexport function debounceAsync<T extends (...args: any[]) => Promise<any>>(\n func: T,\n delay: number,\n): {\n (...args: Parameters<T>): Promise<Awaited<ReturnType<T>>>;\n cancel(): void;\n} {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let pendingPromise: Promise<Awaited<ReturnType<T>>> | undefined;\n let resolvePending: ((value: Awaited<ReturnType<T>>) => void) | undefined;\n let rejectPending: ((reason: any) => void) | undefined;\n\n const debounced = (\n ...args: Parameters<T>\n ): Promise<Awaited<ReturnType<T>>> => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n if (!pendingPromise) {\n pendingPromise = new Promise<Awaited<ReturnType<T>>>(\n (resolve, reject) => {\n resolvePending = resolve;\n rejectPending = reject;\n },\n );\n }\n\n timeoutId = setTimeout(async () => {\n try {\n const result = await func(...args);\n resolvePending?.(result);\n } catch (error) {\n rejectPending?.(error);\n } finally {\n timeoutId = undefined;\n pendingPromise = undefined;\n resolvePending = undefined;\n rejectPending = undefined;\n }\n }, delay);\n\n return pendingPromise;\n };\n\n debounced.cancel = (): void => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n if (rejectPending) {\n rejectPending(new Error('Debounced async function cancelled'));\n pendingPromise = undefined;\n resolvePending = undefined;\n rejectPending = undefined;\n }\n };\n\n return debounced;\n}\n\n/**\n * Batch multiple calls into a single execution\n */\nexport function batch<T>(\n func: (items: T[]) => void,\n maxBatchSize = 10,\n maxWaitTime = 100,\n): {\n (item: T): void;\n flush(): void;\n cancel(): void;\n} {\n let batch: T[] = [];\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const flush = (): void => {\n if (batch.length > 0) {\n const currentBatch = batch;\n batch = [];\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n func(currentBatch);\n }\n };\n\n const batchedFunc = (item: T): void => {\n batch.push(item);\n\n if (batch.length >= maxBatchSize) {\n flush();\n } else if (!timeoutId) {\n timeoutId = setTimeout(flush, maxWaitTime);\n }\n };\n\n batchedFunc.flush = flush;\n\n batchedFunc.cancel = (): void => {\n batch = [];\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n };\n\n return batchedFunc;\n}\n\n/**\n * Memoize function results with optional TTL\n */\nexport function memoize<T extends (...args: any[]) => any>(\n func: T,\n options: {\n maxSize?: number;\n ttl?: number;\n keyGenerator?: (...args: Parameters<T>) => string;\n } = {},\n): T & { clear(): void; delete(...args: Parameters<T>): boolean } {\n const {\n maxSize = 100,\n ttl,\n keyGenerator = (...args) => JSON.stringify(args),\n } = options;\n\n const cache = new Map<string, { value: ReturnType<T>; timestamp: number }>();\n\n const memoized = ((...args: Parameters<T>): ReturnType<T> => {\n const key = keyGenerator(...args);\n const now = Date.now();\n\n const cached = cache.get(key);\n if (cached) {\n // Check TTL if specified\n if (!ttl || now - cached.timestamp < ttl) {\n return cached.value;\n } else {\n cache.delete(key);\n }\n }\n\n const result = func(...args);\n\n // Add to cache\n cache.set(key, { value: result, timestamp: now });\n\n // Enforce max size\n if (cache.size > maxSize) {\n const firstKey = cache.keys().next().value;\n if (firstKey !== undefined) {\n cache.delete(firstKey);\n }\n }\n\n return result;\n }) as T & { clear(): void; delete(...args: Parameters<T>): boolean };\n\n memoized.clear = (): void => {\n cache.clear();\n };\n\n memoized.delete = (...args: Parameters<T>): boolean => {\n const key = keyGenerator(...args);\n return cache.delete(key);\n };\n\n return memoized;\n}\n\n/**\n * Schedule work to be done during idle time\n */\nexport function scheduleIdleWork<T>(\n work: () => T,\n options: { timeout?: number } = {},\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const { timeout = 5000 } = options;\n\n if (window.requestIdleCallback) {\n const id = window.requestIdleCallback(\n (deadline) => {\n try {\n const result = work();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n },\n { timeout },\n );\n\n // Fallback timeout\n setTimeout(() => {\n window.cancelIdleCallback(id);\n try {\n const result = work();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n }, timeout);\n } else {\n // Fallback for browsers without requestIdleCallback\n setTimeout(() => {\n try {\n const result = work();\n resolve(result);\n } catch (error) {\n reject(error);\n }\n }, 0);\n }\n });\n}\n\n/**\n * Measure execution time of a function\n */\nexport function measurePerformance<T extends (...args: any[]) => any>(\n func: T,\n label?: string,\n): T & {\n getStats(): { averageTime: number; callCount: number; totalTime: number };\n} {\n let totalTime = 0;\n let callCount = 0;\n\n const measured = ((...args: Parameters<T>): ReturnType<T> => {\n const start = performance.now();\n\n try {\n const result = func(...args);\n\n // Handle both sync and async functions\n if (result && typeof result.then === 'function') {\n return result.finally(() => {\n const end = performance.now();\n const duration = end - start;\n totalTime += duration;\n callCount++;\n\n if (label) {\n console.log(`${label}: ${duration.toFixed(2)}ms`);\n }\n });\n } else {\n const end = performance.now();\n const duration = end - start;\n totalTime += duration;\n callCount++;\n\n if (label) {\n console.log(`${label}: ${duration.toFixed(2)}ms`);\n }\n\n return result;\n }\n } catch (error) {\n const end = performance.now();\n const duration = end - start;\n totalTime += duration;\n callCount++;\n\n if (label) {\n console.log(`${label} (error): ${duration.toFixed(2)}ms`);\n }\n\n throw error;\n }\n }) as T & {\n getStats(): { averageTime: number; callCount: number; totalTime: number };\n };\n\n measured.getStats = () => ({\n averageTime: callCount > 0 ? totalTime / callCount : 0,\n callCount,\n totalTime,\n });\n\n return measured;\n}\n","/**\n * CodeEditor Component - Interactive code editor with syntax highlighting\n *\n * Features:\n * - Syntax highlighting for multiple languages\n * - Live editing with change events\n * - Copy to clipboard functionality\n * - Theme-aware styling\n * - Functional factory pattern\n */\n\nimport { createComponent, type ComponentAPI } from '../core/Component';\nimport { highlightSyntax, type SupportedLanguage } from '../utils/syntax';\nimport {\n createElement,\n addEventListener,\n injectComponentCSS,\n} from '../utils/dom';\nimport { debounce } from '../utils/debounce';\n\nexport const CODE_EDITOR_CSS = `\n/* CodeEditor Component Styles */\n.explorer-code-editor {\n position: relative;\n background: var(--explorer-bg-primary);\n overflow: hidden;\n font-family: 'Fira Code', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace;\n height: 100%;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n}\n\n.explorer-code-editor * {\n box-sizing: border-box;\n}\n\n.explorer-code-editor:focus-within {\n border-color: var(--explorer-primary);\n box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1), 0 1px 3px 0 rgba(0, 0, 0, 0.1);\n}\n\n.explorer-code-editor--readonly {\n background: var(--explorer-bg-tertiary);\n}\n\n.explorer-code-editor__content {\n position: relative;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.explorer-code-editor__textarea {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n padding: 4px !important;\n margin: 0 !important;\n border: none !important;\n outline: none !important;\n background: transparent !important;\n color: transparent !important;\n font-family: 'Fira Code', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace !important;\n font-size: 14px !important;\n line-height: 1.6 !important;\n resize: none !important;\n z-index: 2 !important;\n white-space: pre !important;\n overflow-wrap: normal !important;\n word-break: normal !important;\n caret-color: var(--explorer-text-primary) !important;\n box-sizing: border-box !important;\n /* Force cursor visibility and animation */\n cursor: text !important;\n}\n\n.explorer-code-editor__textarea::placeholder {\n color: var(--explorer-text-muted);\n font-style: italic;\n}\n\n/* Ensure cursor animation is enabled */\n.explorer-code-editor__textarea:focus {\n caret-color: var(--explorer-text-primary) !important;\n animation: none !important; /* Remove any conflicting animations */\n}\n\n/* Force caret visibility across browsers */\n@supports (caret-color: var(--explorer-text-primary)) {\n .explorer-code-editor__textarea {\n caret-color: var(--explorer-text-primary) !important;\n }\n}\n\n/* Fallback for browsers that don't support caret-color */\n@supports not (caret-color: var(--explorer-text-primary)) {\n .explorer-code-editor__textarea {\n color: var(--explorer-text-primary) !important;\n text-shadow: none !important;\n background: transparent !important;\n }\n .explorer-code-editor__highlight {\n display: none !important;\n }\n}\n\n.explorer-code-editor__highlight {\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n width: 100% !important;\n height: 100% !important;\n padding: 4px !important;\n margin: 0 !important;\n border: none !important;\n background: transparent !important;\n color: var(--explorer-text-primary) !important;\n font-family: 'Fira Code', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace !important;\n font-size: 14px !important;\n line-height: 1.6 !important;\n white-space: pre !important;\n overflow-wrap: normal !important;\n word-break: normal !important;\n z-index: 1 !important;\n pointer-events: none !important;\n overflow: auto !important;\n box-sizing: border-box !important;\n}\n\n.explorer-code-editor__highlight pre {\n margin: 0;\n padding: 0;\n background: transparent;\n color: var(--explorer-text-primary);\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .explorer-code-editor__textarea,\n .explorer-code-editor__highlight {\n font-size: 13px;\n padding: 4px;\n }\n}\n`;\n\nexport interface CodeEditorOptions {\n language?: SupportedLanguage;\n value?: string;\n placeholder?: string;\n readOnly?: boolean;\n tabSize?: number;\n fontSize?: string;\n height?: string;\n maxHeight?: string;\n onChange?: (value: string, language: SupportedLanguage) => void;\n onLanguageChange?: (language: SupportedLanguage) => void;\n}\n\nexport interface CodeEditorAPI extends ComponentAPI {\n getValue(): string;\n setValue(value: string): void;\n getLanguage(): SupportedLanguage;\n setLanguage(language: SupportedLanguage): void;\n focus(): void;\n selectAll(): void;\n insertText(text: string): void;\n getSelection(): { start: number; end: number; text: string };\n}\n\n/**\n * Create a CodeEditor component\n */\nexport function createCodeEditor(\n elementOrSelector: HTMLElement | string,\n options: CodeEditorOptions = {},\n): CodeEditorAPI {\n const baseComponent = createComponent(elementOrSelector, {\n autoMount: false,\n useShadowDOM: false, // No shadow DOM - parent layout provides CSS isolation\n });\n\n const element = baseComponent.getElement()!;\n const shadowRoot = baseComponent.getShadowRoot();\n const contentRoot = baseComponent.getContentRoot() as HTMLElement;\n\n // Add class to both host element (for tests/API) and content root (for styling)\n element.classList.add('explorer-code-editor');\n contentRoot.classList.add('explorer-code-editor');\n\n // Component state\n let currentValue = options.value || '';\n let currentLanguage: SupportedLanguage = options.language || 'text';\n let textArea: HTMLTextAreaElement;\n let highlightLayer: HTMLElement;\n let isHighlighting = false;\n let lastHighlightedValue = ''; // Cache last highlighted value to avoid unnecessary work\n\n // Cleanup functions\n const cleanupFunctions: Array<() => void> = [];\n\n // Debounced highlighting for performance\n const debouncedHighlight = debounce(() => {\n updateHighlighting();\n }, 20);\n\n // Debounced change notification\n const debouncedChange = debounce((value: string) => {\n options.onChange?.(value, currentLanguage);\n }, 200);\n\n /**\n * CSS injection handled by parent MultiColumnLayout\n */\n function injectStyles(): void {\n // CSS is injected by parent MultiColumnLayout - no individual injection needed\n // This reduces CSS duplication and shadow DOM overhead\n }\n\n /**\n * Create the DOM structure\n */\n function createDOM(): void {\n contentRoot.innerHTML = '';\n\n // Create content container\n const content = createElement('div', {\n className: 'explorer-code-editor__content',\n });\n\n // Set height\n if (options.height) {\n content.style.height = options.height;\n } else if (options.maxHeight) {\n content.style.maxHeight = options.maxHeight;\n content.style.overflow = 'auto';\n } else {\n content.style.height = '100%';\n }\n\n // Create textarea\n textArea = createElement('textarea', {\n className: 'explorer-code-editor__textarea',\n placeholder: options.placeholder || `Enter ${currentLanguage} code...`,\n spellcheck: 'false',\n autocomplete: 'off',\n autocorrect: 'off',\n autocapitalize: 'off',\n }) as HTMLTextAreaElement;\n\n if (options.readOnly) {\n textArea.readOnly = true;\n element.classList.add('explorer-code-editor--readonly');\n }\n\n if (options.tabSize) {\n textArea.style.tabSize = options.tabSize.toString();\n }\n\n if (options.fontSize) {\n textArea.style.fontSize = options.fontSize;\n }\n\n textArea.value = currentValue;\n\n // Create highlight layer\n highlightLayer = createElement('div', {\n className: 'explorer-code-editor__highlight',\n });\n\n content.appendChild(highlightLayer);\n content.appendChild(textArea);\n\n contentRoot.appendChild(content);\n }\n\n /**\n * Update syntax highlighting\n */\n function updateHighlighting(): void {\n if (isHighlighting || currentValue === lastHighlightedValue) return;\n isHighlighting = true;\n\n requestAnimationFrame(() => {\n const highlighted = highlightSyntax(currentValue, currentLanguage);\n highlightLayer.innerHTML = `<pre>${highlighted}</pre>`;\n lastHighlightedValue = currentValue;\n isHighlighting = false;\n });\n }\n\n /**\n * Setup event listeners\n */\n function setupEventListeners(): void {\n // Textarea events\n const onInput = () => {\n const newValue = textArea.value;\n if (newValue !== currentValue) {\n currentValue = newValue;\n debouncedHighlight();\n debouncedChange(newValue);\n }\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n // Tab handling\n if (e.key === 'Tab') {\n e.preventDefault();\n const start = textArea.selectionStart;\n const end = textArea.selectionEnd;\n const tabChar = ' '.repeat(options.tabSize || 2);\n\n textArea.value =\n currentValue.substring(0, start) +\n tabChar +\n currentValue.substring(end);\n textArea.selectionStart = textArea.selectionEnd =\n start + tabChar.length;\n\n onInput();\n }\n };\n\n const onScroll = () => {\n highlightLayer.scrollTop = textArea.scrollTop;\n highlightLayer.scrollLeft = textArea.scrollLeft;\n };\n\n // Add click event to ensure focus\n const onClick = () => {\n textArea.focus();\n };\n\n cleanupFunctions.push(addEventListener(textArea, 'input', onInput));\n cleanupFunctions.push(addEventListener(textArea, 'keydown', onKeyDown));\n cleanupFunctions.push(addEventListener(textArea, 'scroll', onScroll));\n cleanupFunctions.push(addEventListener(contentRoot, 'click', onClick));\n cleanupFunctions.push(addEventListener(highlightLayer, 'click', onClick));\n }\n\n // Enhanced API\n const api: CodeEditorAPI = {\n ...baseComponent,\n\n getValue(): string {\n return currentValue;\n },\n\n setValue(value: string): void {\n currentValue = value;\n textArea.value = value;\n updateHighlighting();\n },\n\n getLanguage(): SupportedLanguage {\n return currentLanguage;\n },\n\n setLanguage(language: SupportedLanguage): void {\n currentLanguage = language;\n textArea.placeholder = options.placeholder || `Enter ${language} code...`;\n\n updateHighlighting();\n options.onLanguageChange?.(language);\n },\n\n focus(): void {\n textArea.focus();\n },\n\n selectAll(): void {\n textArea.select();\n },\n\n insertText(text: string): void {\n const start = textArea.selectionStart;\n const end = textArea.selectionEnd;\n\n const newValue =\n currentValue.substring(0, start) + text + currentValue.substring(end);\n this.setValue(newValue);\n\n // Move cursor to end of inserted text\n textArea.selectionStart = textArea.selectionEnd = start + text.length;\n textArea.focus();\n\n options.onChange?.(newValue, currentLanguage);\n },\n\n getSelection(): { start: number; end: number; text: string } {\n const start = textArea.selectionStart;\n const end = textArea.selectionEnd;\n return {\n start,\n end,\n text: currentValue.substring(start, end),\n };\n },\n\n destroy(): void {\n cleanupFunctions.forEach((cleanup) => cleanup());\n cleanupFunctions.length = 0;\n baseComponent.destroy();\n },\n };\n\n // Initialize component\n injectStyles();\n createDOM();\n setupEventListeners();\n updateHighlighting();\n\n // Mount the base component\n api.mount();\n\n // Auto-focus the textarea after a brief delay to ensure cursor is visible\n setTimeout(() => {\n if (!options.readOnly) {\n textArea.focus();\n }\n }, 100);\n\n return api;\n}\n","/**\n * ResultDisplay Component - Display execution results, logs, and errors\n *\n * Features:\n * - Multiple result types (value, error, log)\n * - JSON formatting and syntax highlighting\n * - Collapsible sections\n * - Copy functionality\n * - Theme-aware styling\n * - Functional factory pattern\n */\n\nimport { createComponent, type ComponentAPI } from '../core/Component';\nimport { highlightSyntax } from '../utils/syntax';\nimport {\n createElement,\n addEventListener,\n copyToClipboard,\n injectCSS,\n} from '../utils/dom';\n\nexport const RESULT_DISPLAY_CSS = `\n/* ResultDisplay Component Styles */\n.explorer-result-display {\n background: var(--explorer-bg-primary);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n height: 100%;\n box-sizing: border-box;\n}\n\n.explorer-result-display * {\n box-sizing: border-box;\n}\n\n.explorer-result-display__content {\n flex: 1;\n overflow-y: auto;\n padding: 4px;\n font-family: 'Fira Code', 'JetBrains Mono', Menlo, Monaco, 'Courier New', monospace;\n font-size: 13px;\n line-height: 1.4;\n}\n\n.explorer-result-display__empty {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100px;\n color: var(--explorer-text-muted);\n font-style: italic;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n.explorer-result-item__content {\n color: var(--explorer-text-primary);\n word-break: break-word;\n padding: 0;\n margin: 0;\n}\n\n.explorer-result-item__content pre {\n margin: 0;\n padding: 0;\n background: transparent;\n border: none;\n font-family: inherit;\n font-size: inherit;\n white-space: pre-wrap;\n}\n\n.explorer-result-item__content--json {\n}\n\n.explorer-result-item__content--error {\n color: var(--explorer-danger);\n}\n\n.explorer-result-item__content--collapsed {\n max-height: 100px;\n overflow: hidden;\n position: relative;\n}\n\n.explorer-result-item__content--collapsed::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 20px;\n background: linear-gradient(transparent, var(--explorer-bg-secondary));\n}\n\n.explorer-result-item__expand-btn {\n background: none;\n border: none;\n color: var(--explorer-primary);\n cursor: pointer;\n font-size: 11px;\n margin-top: 4px;\n text-decoration: underline;\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .explorer-result-display__content {\n font-size: 12px;\n padding: 4px;\n }\n \n .explorer-result-item {\n padding: 4px;\n margin-bottom: 8px;\n }\n}\n`;\n\nexport type ResultType = 'value' | 'error' | 'log' | 'warning' | 'info';\n\nexport interface ResultItem {\n type: ResultType;\n content: unknown;\n timestamp?: number;\n label?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ResultDisplayOptions {\n maxResults?: number;\n collapsible?: boolean;\n autoScroll?: boolean;\n height?: string;\n onCopy?: (content: string) => void;\n onClear?: () => void;\n}\n\nexport interface ResultDisplayAPI extends ComponentAPI {\n addResult(result: ResultItem): void;\n addValue(value: unknown, label?: string): void;\n addError(error: Error | string, label?: string): void;\n addLog(message: string, label?: string): void;\n addWarning(message: string, label?: string): void;\n addInfo(message: string, label?: string): void;\n clear(): void;\n getResults(): ResultItem[];\n setResults(results: ResultItem[]): void;\n}\n\n/**\n * Create a ResultDisplay component\n */\nexport function createResultDisplay(\n elementOrSelector: HTMLElement | string,\n options: ResultDisplayOptions = {},\n): ResultDisplayAPI {\n const baseComponent = createComponent(elementOrSelector, {\n autoMount: false,\n useShadowDOM: false, // No shadow DOM - parent layout provides CSS isolation\n });\n\n const element = baseComponent.getElement()!;\n const shadowRoot = baseComponent.getShadowRoot();\n const contentRoot = baseComponent.getContentRoot() as HTMLElement;\n\n // Add class to both host element (for tests/API) and content root (for styling)\n element.classList.add('explorer-result-display');\n contentRoot.classList.add('explorer-result-display');\n\n // Component state\n let results: ResultItem[] = [];\n let contentContainer: HTMLElement;\n\n // Cleanup functions\n const cleanupFunctions: Array<() => void> = [];\n\n /**\n * CSS injection handled by parent MultiColumnLayout\n */\n function injectStyles(): void {\n // CSS is injected by parent MultiColumnLayout - no individual injection needed\n // This reduces CSS duplication and shadow DOM overhead\n }\n\n /**\n * Create the DOM structure\n */\n function createDOM(): void {\n contentRoot.innerHTML = '';\n\n // Create content container\n contentContainer = createElement('div', {\n className: 'explorer-result-display__content',\n });\n\n // Set height\n if (options.height) {\n contentContainer.style.height = options.height;\n } else {\n contentContainer.style.minHeight = '150px';\n contentContainer.style.maxHeight = '400px';\n }\n\n contentRoot.appendChild(contentContainer);\n\n // Show empty state\n updateDisplay();\n }\n\n /**\n * Format content for display\n */\n function formatContent(content: unknown): { html: string; isJSON: boolean } {\n if (content === null) {\n return { html: '<span class=\"syntax-null\">null</span>', isJSON: false };\n }\n\n if (content === undefined) {\n return {\n html: '<span class=\"syntax-null\">undefined</span>',\n isJSON: false,\n };\n }\n\n if (typeof content === 'string') {\n return { html: `\"${content}\"`, isJSON: false };\n }\n\n if (typeof content === 'number') {\n return {\n html: `<span class=\"syntax-number\">${content}</span>`,\n isJSON: false,\n };\n }\n\n if (typeof content === 'boolean') {\n return {\n html: `<span class=\"syntax-boolean\">${content}</span>`,\n isJSON: false,\n };\n }\n\n if (typeof content === 'function') {\n return { html: '[Function]', isJSON: false };\n }\n\n if (content instanceof Error) {\n return { html: `${content.name}: ${content.message}`, isJSON: false };\n }\n\n // For objects and arrays, format as JSON\n try {\n const json = JSON.stringify(content, null, 2);\n const highlighted = highlightSyntax(json, 'json');\n return { html: highlighted, isJSON: true };\n } catch {\n return { html: String(content), isJSON: false };\n }\n }\n\n /**\n * Format timestamp\n */\n function formatTimestamp(timestamp: number): string {\n const date = new Date(timestamp);\n return date.toLocaleTimeString();\n }\n\n /**\n * Create result item element\n */\n function createResultItem(result: ResultItem, index: number): HTMLElement {\n // Content\n const { html, isJSON } = formatContent(result.content);\n const content = createElement('div', {\n className: `explorer-result-item__content ${isJSON ? 'explorer-result-item__content--json' : ''} ${result.type === 'error' ? 'explorer-result-item__content--error' : ''}`,\n });\n\n if (isJSON) {\n content.innerHTML = `<pre>${html}</pre>`;\n } else {\n content.innerHTML = html;\n }\n\n // Add collapsible functionality for long content\n if (options.collapsible && content.scrollHeight > 120) {\n content.classList.add('explorer-result-item__content--collapsed');\n\n const expandBtn = createElement('button', {\n className: 'explorer-result-item__expand-btn',\n textContent: 'Show more',\n }) as HTMLButtonElement;\n\n const onExpand = () => {\n content.classList.remove('explorer-result-item__content--collapsed');\n expandBtn.remove();\n };\n\n cleanupFunctions.push(addEventListener(expandBtn, 'click', onExpand));\n content.appendChild(expandBtn);\n }\n\n return content;\n }\n\n /**\n * Update the display\n */\n function updateDisplay(): void {\n contentContainer.innerHTML = '';\n\n if (results.length === 0) {\n const empty = createElement('div', {\n className: 'explorer-result-display__empty',\n textContent: 'No results yet',\n });\n contentContainer.appendChild(empty);\n return;\n }\n\n results.forEach((result, index) => {\n const item = createResultItem(result, index);\n contentContainer.appendChild(item);\n\n // Add spacing between items\n if (index < results.length - 1) {\n const spacer = createElement('div', {\n style: 'margin-bottom: 12px;',\n });\n contentContainer.appendChild(spacer);\n }\n });\n\n // Auto-scroll to bottom\n if (options.autoScroll !== false) {\n contentContainer.scrollTop = contentContainer.scrollHeight;\n }\n }\n\n /**\n * Setup event listeners\n */\n function setupEventListeners(): void {\n // No event listeners needed in this component\n }\n\n // Enhanced API\n const api: ResultDisplayAPI = {\n ...baseComponent,\n\n addResult(result: ResultItem): void {\n const newResult = {\n ...result,\n timestamp: result.timestamp || Date.now(),\n };\n\n results.push(newResult);\n\n // Limit results if specified\n if (options.maxResults && results.length > options.maxResults) {\n results = results.slice(-options.maxResults);\n }\n\n updateDisplay();\n },\n\n addValue(value: unknown, label?: string): void {\n this.addResult({ type: 'value', content: value, label });\n },\n\n addError(error: Error | string, label?: string): void {\n const content = error instanceof Error ? error : new Error(error);\n this.addResult({ type: 'error', content, label });\n },\n\n addLog(message: string, label?: string): void {\n this.addResult({ type: 'log', content: message, label });\n },\n\n addWarning(message: string, label?: string): void {\n this.addResult({ type: 'warning', content: message, label });\n },\n\n addInfo(message: string, label?: string): void {\n this.addResult({ type: 'info', content: message, label });\n },\n\n clear(): void {\n results = [];\n updateDisplay();\n },\n\n getResults(): ResultItem[] {\n return [...results];\n },\n\n setResults(newResults: ResultItem[]): void {\n results = [...newResults];\n updateDisplay();\n },\n\n destroy(): void {\n cleanupFunctions.forEach((cleanup) => cleanup());\n cleanupFunctions.length = 0;\n baseComponent.destroy();\n },\n };\n\n // Initialize component\n injectStyles();\n createDOM();\n setupEventListeners();\n\n // Mount the base component\n api.mount();\n\n return api;\n}\n","/**\n * JavaScript Evaluation Utilities\n *\n * Provides safe JavaScript evaluation with context injection\n * and result formatting for explorer components.\n */\n\nexport interface EvaluationContext {\n [key: string]: unknown;\n}\n\nexport interface EvaluationResult {\n success: boolean;\n result?: unknown;\n error?: string;\n executionTime?: number;\n}\n\nexport interface EvaluationOptions {\n autoReturn?: boolean;\n}\n\n/**\n * Safely evaluate JavaScript code with injected context\n */\nexport async function evaluateJavaScript(\n code: string,\n context: EvaluationContext = {},\n options: EvaluationOptions = {},\n): Promise<EvaluationResult> {\n const startTime = performance.now();\n\n try {\n // Create function with context variables as parameters\n const contextKeys = Object.keys(context);\n const contextValues = Object.values(context);\n\n // Auto-add return if option is enabled\n const processedCode = options.autoReturn ? `return ${code}` : code;\n\n // Wrap code in async function to support await\n const wrappedCode = `\n \"use strict\";\n return (async () => {\n ${processedCode}\n })();\n `;\n\n // Create and execute function with context\n const evalFunction = new Function(...contextKeys, wrappedCode);\n const result = await evalFunction(...contextValues);\n\n const executionTime = performance.now() - startTime;\n\n return {\n success: true,\n result,\n executionTime,\n };\n } catch (error) {\n const executionTime = performance.now() - startTime;\n\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n executionTime,\n };\n }\n}\n\n/**\n * Format evaluation result for display\n */\nexport function formatEvaluationResult(result: unknown): string {\n if (result === undefined) {\n return 'undefined';\n }\n\n if (result === null) {\n return 'null';\n }\n\n if (typeof result === 'string') {\n return result; // Don't add quotes around strings\n }\n\n if (typeof result === 'number' || typeof result === 'boolean') {\n return String(result);\n }\n\n if (typeof result === 'function') {\n return '[Function]';\n }\n\n if (typeof result === 'object') {\n try {\n return JSON.stringify(result, null, 2);\n } catch {\n return '[Object]';\n }\n }\n\n return String(result);\n}\n\n/**\n * Validate JavaScript code for basic syntax errors\n */\nexport function validateJavaScript(code: string): {\n valid: boolean;\n error?: string;\n} {\n try {\n new Function(code);\n return { valid: true };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Create a safe evaluation context with common utilities\n */\nexport function createSafeContext(\n additionalContext: EvaluationContext = {},\n): EvaluationContext {\n const safeContext: EvaluationContext = {\n // Safe built-ins\n console: {\n log: (...args: unknown[]) => console.log(...args),\n error: (...args: unknown[]) => console.error(...args),\n warn: (...args: unknown[]) => console.warn(...args),\n },\n JSON,\n Math,\n Date,\n Array,\n Object,\n String,\n Number,\n Boolean,\n\n // Add user context\n ...additionalContext,\n };\n\n return safeContext;\n}\n","/**\n * LiveCodeJS Component - JavaScript evaluation with context injection\n *\n * Features:\n * - Single JavaScript editor with syntax highlighting\n * - Direct evaluation results (no iframe)\n * - Context injection for functions like getMappingValue\n * - Two-panel layout (editor + results)\n * - Automatic evaluation with debouncing\n */\n\nimport { type ComponentAPI } from '../core/Component';\nimport {\n createMultiColumnLayout,\n type MultiColumnLayoutAPI,\n} from '../core/MultiColumnLayout';\nimport { createCodeEditor, type CodeEditorAPI } from './CodeEditor';\nimport { createResultDisplay, type ResultDisplayAPI } from './ResultDisplay';\nimport { debounce } from '../utils/debounce';\nimport {\n evaluateJavaScript,\n createSafeContext,\n type EvaluationContext,\n} from '../utils/evaluation';\nimport { toggleElementTheme, getElementTheme } from '../core/css-theme-system';\n\nexport interface LiveCodeJSOptions {\n initCode?: string;\n context?: Record<string, unknown>;\n layout?: 'horizontal' | 'vertical';\n autoEvaluate?: boolean;\n evaluationDelay?: number;\n height?: string;\n showHeader?: boolean;\n title?: string;\n autoReturn?: boolean;\n}\n\nexport interface LiveCodeJSAPI extends ComponentAPI {\n getCode(): string;\n setCode(code: string): void;\n setContext(context: Record<string, unknown>): void;\n evaluate(): void;\n clear(): void;\n getResults(): any[];\n setLayout(layout: 'horizontal' | 'vertical'): void;\n getLayout(): string;\n}\n\n/**\n * Create a LiveCodeJS component\n */\nexport function createLiveCodeJS(\n elementOrSelector: HTMLElement | string,\n options: LiveCodeJSOptions = {},\n): LiveCodeJSAPI {\n // Foundation CSS will be injected by individual components with shadow DOM\n\n // Component state\n let currentCode = options.initCode || '';\n let currentContext: EvaluationContext = createSafeContext(options.context);\n let codeEditor: CodeEditorAPI;\n let resultDisplay: ResultDisplayAPI;\n\n // Create multi-column layout with 2 columns\n const {\n api: baseApi,\n contentElement,\n columnContainers,\n cleanup,\n } = createMultiColumnLayout(elementOrSelector, {\n columns: [\n {\n title: 'JavaScript Code',\n className: 'explorer-unified-container--code-editor',\n },\n {\n title: 'Results',\n className: 'explorer-unified-container--result-display',\n },\n ],\n layout: options.layout || 'horizontal',\n height: options.height,\n showHeader: options.showHeader,\n title: options.title || 'JavaScript Evaluator',\n });\n\n // Add theme toggle functionality to the first column header\n const handleThemeToggle = () => {\n const element = baseApi.getElement();\n if (element) {\n const newTheme = toggleElementTheme(element);\n // Update theme icon in any theme buttons found\n const themeButtons = element.querySelectorAll(\n '.explorer-unified-header__btn--theme',\n );\n themeButtons.forEach((btn) => {\n btn.textContent = newTheme === 'dark' ? '☀️' : '🌙';\n });\n }\n };\n\n // Get the first column container and add theme toggle to its header\n setTimeout(() => {\n const firstColumn = baseApi.getColumnElement(0);\n if (firstColumn) {\n const container = firstColumn.querySelector(\n '.explorer-unified-container',\n ) as HTMLElement;\n if (container) {\n // Access the container's header API to add theme toggle\n const headerElement = container.querySelector(\n '.explorer-unified-header',\n );\n if (headerElement) {\n const actionsElement = headerElement.querySelector(\n '.explorer-unified-header__actions',\n );\n if (actionsElement) {\n // Create theme toggle button\n const themeBtn = document.createElement('button');\n themeBtn.className =\n 'explorer-unified-header__btn explorer-unified-header__btn--theme';\n themeBtn.textContent =\n getElementTheme(baseApi.getElement()!) === 'dark' ? '☀️' : '🌙';\n themeBtn.title = 'Toggle theme';\n themeBtn.addEventListener('click', handleThemeToggle);\n actionsElement.appendChild(themeBtn);\n }\n }\n }\n }\n }, 10);\n\n // Debounced evaluation for performance\n const debouncedEvaluate = debounce(() => {\n if (options.autoEvaluate !== false) {\n evaluateCode();\n }\n }, options.evaluationDelay || 500);\n\n /**\n * Create the panel structure using multi-column layout\n */\n function createPanels(): void {\n // Get column content elements from the multi-column layout\n const editorContentElement = baseApi.getColumnContentElement(0); // First column for JavaScript Code\n const resultContentElement = baseApi.getColumnContentElement(1); // Second column for Results\n\n if (!editorContentElement || !resultContentElement) {\n throw new Error(\n 'Failed to get column content elements from multi-column layout',\n );\n }\n\n // Create components\n codeEditor = createCodeEditor(editorContentElement, {\n language: 'javascript',\n value: currentCode,\n height: '100%',\n onChange: (value) => {\n currentCode = value;\n debouncedEvaluate();\n },\n });\n\n resultDisplay = createResultDisplay(resultContentElement, {\n height: '100%',\n maxResults: 10,\n });\n\n // Initial evaluation\n if (currentCode && options.autoEvaluate !== false) {\n evaluateCode();\n }\n }\n\n /**\n * Evaluate the current code\n */\n async function evaluateCode(): Promise<void> {\n if (!currentCode.trim()) {\n resultDisplay.clear();\n return;\n }\n\n try {\n resultDisplay.clear();\n\n const result = await evaluateJavaScript(currentCode, currentContext, {\n autoReturn: options.autoReturn,\n });\n\n if (result.success) {\n resultDisplay.addValue(result.result);\n } else {\n resultDisplay.addError(result.error || 'Unknown error');\n }\n } catch (error) {\n resultDisplay.clear();\n resultDisplay.addError(String(error));\n }\n }\n\n // Enhanced API\n const api: LiveCodeJSAPI = {\n ...baseApi,\n\n getCode(): string {\n return currentCode;\n },\n\n setCode(code: string): void {\n currentCode = code;\n codeEditor.setValue(code);\n if (options.autoEvaluate !== false) {\n debouncedEvaluate();\n }\n },\n\n setContext(context: Record<string, unknown>): void {\n currentContext = createSafeContext(context);\n if (options.autoEvaluate !== false) {\n debouncedEvaluate();\n }\n },\n\n evaluate(): void {\n evaluateCode();\n },\n\n clear(): void {\n currentCode = '';\n codeEditor.setValue('');\n resultDisplay.clear();\n },\n\n getResults(): any[] {\n return resultDisplay.getResults();\n },\n\n setLayout(layout: 'horizontal' | 'vertical'): void {\n baseApi.setLayout(layout);\n },\n\n getLayout(): string {\n return baseApi.getLayout();\n },\n\n destroy(): void {\n cleanup.forEach((fn) => fn());\n codeEditor?.destroy();\n resultDisplay?.destroy();\n baseApi.destroy();\n },\n };\n\n // Initialize component\n createPanels();\n\n // Mount the base component\n api.mount();\n\n return api;\n}\n","/**\n * Destination Component - Three-column layout for Event, Mapping, and Result\n *\n * Features:\n * - Three-column layout with Event, Mapping, and Result\n * - Two CodeEditor components for JSON input\n * - Live walkerOS collector integration with custom destination\n * - Real destination processing with mapping transformations\n * - Wrap function to capture destination calls and display results\n * - Theme-aware styling with shadow DOM support\n */\n\nimport {\n createMultiColumnLayout,\n type MultiColumnLayoutAPI,\n} from '../core/MultiColumnLayout';\nimport { createCodeEditor, type CodeEditorAPI } from './CodeEditor';\nimport { createResultDisplay, type ResultDisplayAPI } from './ResultDisplay';\nimport { debounce } from '../utils/debounce';\nimport { createCollector } from '@walkeros/collector';\nimport type { Collector, WalkerOS, Destination, Elb } from '@walkeros/core';\nimport { toggleElementTheme, getElementTheme } from '../core/css-theme-system';\n\nexport interface DestinationOptions {\n height?: string;\n showHeader?: boolean;\n title?: string;\n initialEvent?: string;\n initialMapping?: string;\n updateDelay?: number;\n destination?: Destination.Instance;\n}\n\ninterface CapturedResult {\n type?: string;\n mappingRule?: string;\n data?: unknown;\n event?: unknown;\n message?: string;\n [key: string]: unknown;\n}\n\nexport interface DestinationAPI extends MultiColumnLayoutAPI {\n getEventData(): string;\n setEventData(data: string): void;\n getMappingData(): string;\n setMappingData(data: string): void;\n getResults(): CapturedResult[];\n refresh(): void;\n clear(): void;\n}\n\n/**\n * Create a Destination component\n */\nexport function createDestination(\n elementOrSelector: HTMLElement | string,\n options: DestinationOptions = {},\n): DestinationAPI {\n // Component state\n let eventData = options.initialEvent || '';\n let mappingData = options.initialMapping || '';\n let eventEditor: CodeEditorAPI;\n let mappingEditor: CodeEditorAPI;\n let resultDisplay: ResultDisplayAPI;\n let elbFunction: Elb.Fn | null = null;\n let collector: Collector.Instance | null = null;\n let capturedResults: CapturedResult[] = [];\n\n // Create multi-column layout with 3 columns\n const { api: baseApi, cleanup } = createMultiColumnLayout(elementOrSelector, {\n columns: [\n {\n title: 'Event',\n className: 'explorer-unified-container--code-editor',\n },\n {\n title: 'Mapping',\n className: 'explorer-unified-container--code-editor',\n },\n {\n title: 'Result',\n className: 'explorer-unified-container--result-display',\n },\n ],\n layout: 'horizontal',\n height: options.height,\n showHeader: options.showHeader,\n title: options.title || 'Destination Mapping',\n });\n\n // Add theme toggle functionality to the first column header\n const handleThemeToggle = () => {\n const element = baseApi.getElement();\n if (element) {\n const newTheme = toggleElementTheme(element);\n // Update theme icon in any theme buttons found\n const themeButtons = element.querySelectorAll(\n '.explorer-unified-header__btn--theme',\n );\n themeButtons.forEach((btn) => {\n btn.textContent = newTheme === 'dark' ? '☀️' : '🌙';\n });\n }\n };\n\n // Get the first column container and add theme toggle to its header\n setTimeout(() => {\n const firstColumn = baseApi.getColumnElement(0);\n if (firstColumn) {\n const container = firstColumn.querySelector(\n '.explorer-unified-container',\n ) as HTMLElement;\n if (container) {\n // Access the container's header API to add theme toggle\n const headerElement = container.querySelector(\n '.explorer-unified-header',\n );\n if (headerElement) {\n const actionsElement = headerElement.querySelector(\n '.explorer-unified-header__actions',\n );\n if (actionsElement) {\n // Create theme toggle button\n const themeBtn = document.createElement('button');\n themeBtn.className =\n 'explorer-unified-header__btn explorer-unified-header__btn--theme';\n themeBtn.textContent =\n getElementTheme(baseApi.getElement()!) === 'dark' ? '☀️' : '🌙';\n themeBtn.title = 'Toggle theme';\n themeBtn.addEventListener('click', handleThemeToggle);\n actionsElement.appendChild(themeBtn);\n }\n }\n }\n }\n }, 10);\n\n // Debounced update for performance\n const debouncedUpdate = debounce(() => {\n updateResults();\n }, options.updateDelay || 300);\n\n /**\n * Create default demo destination if none provided\n */\n function createDemoDestination(): Destination.Instance {\n return {\n type: 'demo',\n config: {},\n\n push(event: WalkerOS.Event, context: Destination.PushContext) {\n const { data, mapping } = context;\n\n // Clear previous results for this push\n capturedResults = [];\n\n // Show what the destination receives after collector processing\n if (data !== undefined) {\n // Mapping produced data - this is what would be sent to the destination\n capturedResults.push({\n type: 'mapped_result',\n mappingRule: mapping?.name || 'default',\n data: data,\n timestamp: Date.now(),\n });\n } else {\n // No mapping matched or no data produced\n capturedResults.push({\n type: 'no_mapping',\n event: event,\n message: 'No mapping rule matched or no data produced',\n timestamp: Date.now(),\n });\n }\n\n // Update display to show the result\n updateResultDisplay();\n },\n };\n }\n\n /**\n * Initialize the walkerOS collector with destination\n */\n async function initializeCollector(): Promise<{\n elb: Elb.Fn;\n collector: Collector.Instance;\n } | null> {\n try {\n // Use provided destination or create default demo destination\n const destination = options.destination || createDemoDestination();\n\n const { elb, collector: newCollector } = await createCollector({\n destinations: {\n demo: destination,\n },\n run: true,\n });\n\n return { elb, collector: newCollector };\n } catch (error) {\n capturedResults = [\n {\n type: 'error',\n message: `Failed to initialize collector: ${String(error)}`,\n timestamp: Date.now(),\n },\n ];\n updateResultDisplay();\n return null;\n }\n }\n\n /**\n * Create components using multi-column layout\n */\n function createComponents(): void {\n // Get column content elements from the multi-column layout\n const eventContentElement = baseApi.getColumnContentElement(0); // First column for Event\n const mappingContentElement = baseApi.getColumnContentElement(1); // Second column for Mapping\n const resultContentElement = baseApi.getColumnContentElement(2); // Third column for Result\n\n if (\n !eventContentElement ||\n !mappingContentElement ||\n !resultContentElement\n ) {\n throw new Error(\n 'Failed to get column content elements from multi-column layout',\n );\n }\n\n // Create components\n eventEditor = createCodeEditor(eventContentElement, {\n language: 'json',\n value: eventData,\n height: '100%',\n onChange: (value) => {\n eventData = value;\n debouncedUpdate();\n },\n });\n\n mappingEditor = createCodeEditor(mappingContentElement, {\n language: 'json',\n value: mappingData,\n height: '100%',\n onChange: (value) => {\n mappingData = value;\n debouncedUpdate();\n },\n });\n\n resultDisplay = createResultDisplay(resultContentElement, {\n height: '100%',\n maxResults: 1,\n });\n\n // Show initial ready state\n updateResultDisplay();\n\n // Initialize collector once\n initializeCollector().then((result) => {\n if (result) {\n elbFunction = result.elb;\n collector = result.collector;\n // Initial update after collector is ready\n setTimeout(() => {\n updateResults();\n }, 200);\n }\n });\n }\n\n /**\n * Update results by processing event through walkerOS collector\n */\n async function updateResults(): Promise<void> {\n try {\n // Clear previous results\n capturedResults = [];\n\n if (!elbFunction) {\n resultDisplay.clear();\n resultDisplay.addError('Collector not initialized');\n return;\n }\n\n // Parse and push event through collector\n let parsedEvent: WalkerOS.PartialEvent | null;\n try {\n parsedEvent = eventData.trim()\n ? (JSON.parse(eventData) as WalkerOS.PartialEvent)\n : null;\n } catch (error) {\n resultDisplay.clear();\n resultDisplay.addError(`Invalid JSON in Event: ${String(error)}`);\n return;\n }\n\n if (parsedEvent) {\n // Update destination mapping before pushing\n updateDestinationMapping();\n\n // Push event through collector using elb function - this will trigger our destination\n await elbFunction(parsedEvent);\n }\n\n // Update display will be called by the destination push function\n } catch (error) {\n resultDisplay.clear();\n resultDisplay.addError(`Processing error: ${String(error)}`);\n }\n }\n\n /**\n * Update destination mapping by directly modifying the collector's destination config\n */\n function updateDestinationMapping(): void {\n if (!collector) return;\n\n try {\n // Parse and set mapping directly on the existing destination\n const demoDestination = collector.destinations.demo;\n if (demoDestination && mappingData.trim()) {\n const mapping = JSON.parse(mappingData);\n demoDestination.config.mapping = mapping;\n }\n } catch (error) {\n capturedResults.push({\n type: 'error',\n message: `Failed to update mapping: ${String(error)}`,\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Update the result display with captured results\n */\n function updateResultDisplay(): void {\n resultDisplay.clear();\n\n if (capturedResults.length === 0) {\n resultDisplay.addInfo(\n 'Ready - modify the event or mapping and see the destination processing results',\n );\n return;\n }\n\n capturedResults.forEach((result) => {\n if (result.type === 'mapped_result') {\n // Show the mapped data cleanly\n resultDisplay.addValue(\n result.data,\n `Destination receives (${result.mappingRule})`,\n );\n } else if (result.type === 'no_mapping') {\n resultDisplay.addInfo(result.message || 'No mapping applied');\n } else {\n // Fallback for any other types\n resultDisplay.addValue(result);\n }\n });\n }\n\n // Enhanced API\n const api: DestinationAPI = {\n ...baseApi,\n\n getEventData(): string {\n return eventData;\n },\n\n setEventData(data: string): void {\n eventData = data;\n eventEditor?.setValue(data);\n debouncedUpdate();\n },\n\n getMappingData(): string {\n return mappingData;\n },\n\n setMappingData(data: string): void {\n mappingData = data;\n mappingEditor?.setValue(data);\n debouncedUpdate();\n },\n\n getResults(): CapturedResult[] {\n return capturedResults || [];\n },\n\n refresh(): void {\n updateResults();\n },\n\n clear(): void {\n eventData = '{}';\n mappingData = '{}';\n eventEditor?.setValue('{}');\n mappingEditor?.setValue('{}');\n capturedResults = [];\n resultDisplay?.clear();\n },\n\n destroy(): void {\n cleanup.forEach((fn) => fn());\n eventEditor?.destroy();\n mappingEditor?.destroy();\n resultDisplay?.destroy();\n elbFunction = null;\n collector = null;\n capturedResults = [];\n baseApi.destroy();\n },\n };\n\n // Initialize component\n createComponents();\n\n // Mount the base component\n api.mount();\n\n return api;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwYO,WAAS,gBACd,SACA,OACM;AAEN,UAAM,YAAY,SAAS,gBAAgB,aAAa,YAAY;AACpE,QAAI,cAAc,cAAc,WAAW,cAAc,SAAS;AAEhE,UAAI,mBAAmB,aAAa;AAClC,gBAAQ,UAAU,IAAI,oBAAoB;AAAA,MAC5C;AACA;AAAA,IACF;AAGA,QAAI,mBAAmB,aAAa;AAClC,cAAQ,aAAa,cAAc,KAAK;AAAA,IAC1C,WAAW,mBAAmB,YAAY;AAExC,UAAI,QAAQ,gBAAgB,aAAa;AACvC,gBAAQ,KAAK,aAAa,cAAc,KAAK;AAAA,MAC/C;AAAA,IACF,WAAW,mBAAmB,kBAAkB;AAAA,IAGhD;AAAA,EACF;AAKO,WAAS,gBAAgB,SAAwC;AAEtE,UAAM,YAAY,SAAS,gBAAgB,aAAa,YAAY;AACpE,QAAI,cAAc,WAAW,cAAc,QAAQ;AACjD,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,QAAQ,aAAa,YAAY;AACtD,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAKO,WAAS,cAAgC;AAE9C,UAAM,YAAY,SAAS,gBAAgB,aAAa,YAAY;AACpE,QAAI,cAAc,WAAW,cAAc,QAAQ;AACjD,aAAO;AAAA,IACT;AAGA,QAAI,SAAS,gBAAgB,UAAU,SAAS,MAAM,GAAG;AACvD,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,WAAW,eAAe,OAAO,YAAY;AACtD,YAAM,cAAc,OAAO;AAAA,QACzB;AAAA,MACF,EAAE;AACF,UAAI,aAAa;AACf,eAAO;AAAA,MACT;AAAA,IACF;AAGA,WAAO;AAAA,EACT;AAKO,WAAS,mBAAmB,SAAwC;AACzE,UAAM,eAAe,gBAAgB,OAAO;AAC5C,UAAM,WAAW,iBAAiB,UAAU,SAAS;AACrD,oBAAgB,SAAS,QAAQ;AACjC,WAAO;AAAA,EACT;AA7dA,MAQa,qBA0dA;AAleb;AAAA;AAAA;AAQO,MAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0d5B,MAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["id","e","e","contentElement","e","J"]}