@walkeros/explorer 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-BEAIHYJ5.mjs +587 -0
- package/dist/chunk-BEAIHYJ5.mjs.map +1 -0
- package/dist/index.d.cts +19 -2
- package/dist/index.d.ts +19 -2
- package/dist/index.js +246 -17920
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +240 -16
- package/dist/index.mjs.map +1 -1
- package/dist/{monaco-types-T3WXA7KH.mjs → monaco-types-GBPMPIMU.mjs} +2 -2
- package/package.json +7 -7
- package/dist/chunk-P5UDSGZL.mjs +0 -18485
- package/dist/chunk-P5UDSGZL.mjs.map +0 -1
- /package/dist/{monaco-types-T3WXA7KH.mjs.map → monaco-types-GBPMPIMU.mjs.map} +0 -0
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/demos/MappingDemo.tsx","../src/components/molecules/code-box.tsx","../src/components/atoms/header.tsx","../src/components/atoms/box.tsx","../src/components/atoms/code.tsx","../src/themes/palenight.ts","../src/themes/lighthouse.ts","../src/themes/index.ts","../src/utils/monaco-decorators.ts","../src/hooks/useMonacoHeight.ts","../src/contexts/GridHeightContext.tsx","../src/components/atoms/grid.tsx","../src/components/demos/MappingCode.tsx","../src/components/demos/DestinationDemo.tsx","../src/helpers/capture.ts","../src/components/demos/DestinationInitDemo.tsx","../src/components/demos/PromotionPlayground.tsx","../src/components/molecules/preview.tsx","../src/components/atoms/preview-footer.tsx","../src/components/organisms/browser-box.tsx","../src/components/atoms/button.tsx","../src/components/atoms/button-group.tsx","../src/components/organisms/collector-box.tsx","../src/helpers/destinations.ts","../src/components/organisms/live-code.tsx","../src/components/organisms/config-editor/config-editor-box.tsx","../src/components/organisms/config-editor/config-editor-tabs.tsx","../src/hooks/useMappingState.ts","../src/utils/mapping-path.ts","../src/hooks/useMappingNavigation.ts","../src/utils/path-analyzer.ts","../src/schemas/config-structures/mapping-rule.ts","../src/utils/type-detector.ts","../src/hooks/useTreeState.ts","../src/components/atoms/mapping-breadcrumb.tsx","../src/components/atoms/mapping-confirm-button.tsx","../src/components/molecules/mapping-navigation-header.tsx","../src/components/molecules/config-tree-sidebar.tsx","../src/components/atoms/mapping-input.tsx","../src/components/atoms/mapping-input-with-button.tsx","../src/components/molecules/mapping-entity-pane.tsx","../src/components/atoms/pane-header.tsx","../src/components/atoms/base-mapping-pane.tsx","../src/components/atoms/config-tile.tsx","../src/components/molecules/config-overview-pane.tsx","../src/components/molecules/mapping-policy-overview-pane.tsx","../src/utils/value-display-formatter.ts","../src/components/molecules/mapping-value-config-pane-view.tsx","../src/components/molecules/mapping-value-type-pane-view.tsx","../src/components/molecules/mapping-value-pane-view.tsx","../src/components/molecules/mapping-key-pane-view.tsx","../src/components/molecules/mapping-function-pane-base.tsx","../src/utils/code-normalizer.ts","../src/components/molecules/mapping-condition-pane-view.tsx","../src/components/molecules/mapping-fn-pane-view.tsx","../src/components/molecules/mapping-validate-pane-view.tsx","../src/utils/schema-validation.ts","../src/components/molecules/mapping-name-pane-view.tsx","../src/components/molecules/mapping-batch-pane-view.tsx","../src/components/molecules/mapping-consent-pane-view.tsx","../src/components/atoms/consent-state-tile.tsx","../src/utils/consent-scanner.ts","../src/components/molecules/mapping-set-pane-view.tsx","../src/components/molecules/mapping-loop-pane-view.tsx","../src/components/forms/mapping-form-wrapper.tsx","../src/components/atoms/mapping-string.tsx","../src/components/atoms/mapping-number.tsx","../src/components/atoms/mapping-boolean.tsx","../src/components/atoms/mapping-consent.tsx","../src/components/atoms/mapping-collapsible.tsx","../src/components/atoms/icon-button.tsx","../src/components/molecules/mapping-consent-row.tsx","../src/components/atoms/mapping-value.tsx","../src/components/atoms/field-header.tsx","../src/components/atoms/toggle.tsx","../src/components/atoms/mapping-object-explorer.tsx","../src/components/molecules/property-suggestions.tsx","../src/components/forms/widget-registry.ts","../src/components/atoms/mapping-consent-field.tsx","../src/components/atoms/mapping-condition.tsx","../src/components/atoms/mapping-condition-field.tsx","../src/components/atoms/mapping-fn.tsx","../src/components/atoms/mapping-fn-field.tsx","../src/components/atoms/mapping-key.tsx","../src/components/atoms/mapping-key-field.tsx","../src/components/atoms/mapping-validate.tsx","../src/components/atoms/mapping-validate-field.tsx","../src/components/atoms/mapping-data.tsx","../src/schemas/value-config-schema.ts","../src/utils/clean-form-data.ts","../src/components/atoms/mapping-data-field.tsx","../src/components/atoms/mapping-settings.tsx","../src/components/atoms/mapping-settings-field.tsx","../src/components/atoms/mapping-object-explorer-field.tsx","../src/components/molecules/mapping-map-field.tsx","../src/components/atoms/mapping-map-entry.tsx","../src/components/molecules/mapping-set-field.tsx","../src/components/atoms/mapping-set-entry.tsx","../src/components/molecules/mapping-loop-field.tsx","../src/components/forms/field-registry.ts","../src/components/atoms/mapping-grid.tsx","../src/components/molecules/mapping-map-pane-view-rjsf.tsx","../src/components/atoms/mapping-enum-select.tsx","../src/components/molecules/mapping-enum-pane-view.tsx","../src/components/molecules/mapping-boolean-pane-view.tsx","../src/components/molecules/mapping-primitive-pane-view.tsx","../src/components/molecules/settings-overview-pane.tsx","../src/schemas/rule-properties-schema.ts","../src/components/molecules/mapping-pane.tsx","../src/utils/config-validator.ts","../src/components/molecules/validation-overview-pane.tsx","../src/utils/generic-tree-builder.ts","../src/components/organisms/config-editor/config-editor.tsx","../src/components/molecules/code-snippet.tsx","../src/components/molecules/property-table.tsx","../src/schemas/config-structures/destination-config.ts","../src/components/atoms/footer.tsx","../src/components/atoms/panel-hints.tsx","../node_modules/@mdx-js/react/lib/index.js","../src/components/atoms/mdx-code.tsx","../src/providers/MDXProvider.tsx","../node_modules/clsx/dist/clsx.mjs","../node_modules/tailwind-merge/src/lib/class-group-utils.ts","../node_modules/tailwind-merge/src/lib/lru-cache.ts","../node_modules/tailwind-merge/src/lib/parse-class-name.ts","../node_modules/tailwind-merge/src/lib/config-utils.ts","../node_modules/tailwind-merge/src/lib/merge-classlist.ts","../node_modules/tailwind-merge/src/lib/tw-join.ts","../node_modules/tailwind-merge/src/lib/create-tailwind-merge.ts","../node_modules/tailwind-merge/src/lib/from-theme.ts","../node_modules/tailwind-merge/src/lib/validators.ts","../node_modules/tailwind-merge/src/lib/default-config.ts","../node_modules/tailwind-merge/src/lib/merge-configs.ts","../node_modules/tailwind-merge/src/lib/extend-tailwind-merge.ts","../node_modules/tailwind-merge/src/lib/tw-merge.ts","../src/lib/utils.ts"],"sourcesContent":["import React, { useState, useCallback, useEffect } from 'react';\nimport { CodeBox } from '../molecules/code-box';\nimport { Grid } from '../atoms/grid';\n\n// NOTE: Monaco Editor configuration (workers, etc.) must be handled by the consuming application.\n// See apps/explorer/demo/main.tsx for an example with Vite\n\nexport interface MappingDemoProps {\n input?: string;\n config?: string;\n labelInput?: string;\n labelConfig?: string;\n labelOutput?: string;\n fn?: (input: string, config: string) => Promise<string>;\n}\n\n/**\n * MappingDemo - Interactive dual-editor component with Monaco Editor\n *\n * A generic component with two editable JSON editors and one output display.\n * Requires a transformation function to process input+config into output.\n *\n * Props:\n * - input: Initial JSON string for left editor (default: '{}')\n * - config: Initial JSON string for middle editor (default: '{}')\n * - labelInput: Label for input editor (default: \"Input\")\n * - labelConfig: Label for config editor (default: \"Config\")\n * - labelOutput: Label for output editor (default: \"Output\")\n * - fn: Transformation function (input, config) => Promise<string> (required for output)\n *\n * Example:\n * ```tsx\n * <MappingDemo\n * input='{ \"name\": \"example\" }'\n * config='{ \"transform\": \"uppercase\" }'\n * labelInput=\"Data\"\n * labelConfig=\"Rules\"\n * labelOutput=\"Result\"\n * fn={async (input, config) => {\n * const data = JSON.parse(input);\n * const rules = JSON.parse(config);\n * // Your transformation logic\n * return JSON.stringify(result, null, 2);\n * }}\n * />\n * ```\n */\n\nexport function MappingDemo({\n input: initialInput = '{}',\n config: initialConfig = '{}',\n labelInput = 'Input',\n labelConfig = 'Config',\n labelOutput = 'Output',\n fn,\n}: MappingDemoProps = {}) {\n const [input, setInput] = useState(initialInput);\n const [config, setConfig] = useState(initialConfig);\n const [output, setOutput] = useState('');\n\n const updateOutput = useCallback(async () => {\n try {\n if (fn) {\n // Use custom function if provided\n const result = await fn(input, config);\n setOutput(result);\n } else {\n // Default behavior: just show the parsed JSON\n setOutput('No transformation function provided');\n }\n } catch (error) {\n setOutput(\n `Error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }, [input, config, fn]);\n\n useEffect(() => {\n const timeoutId = setTimeout(updateOutput, 500);\n return () => clearTimeout(timeoutId);\n }, [updateOutput]);\n\n return (\n <Grid columns={3} rowHeight=\"synced\">\n <CodeBox\n label={labelInput}\n code={input}\n onChange={setInput}\n language=\"json\"\n showFormat\n autoHeight\n />\n <CodeBox\n label={labelConfig}\n code={config}\n onChange={setConfig}\n language=\"json\"\n showFormat\n autoHeight\n />\n <CodeBox\n label={labelOutput}\n code={output}\n disabled\n language=\"json\"\n autoHeight\n />\n </Grid>\n );\n}\n","import React, { useState } from 'react';\nimport { Box } from '../atoms/box';\nimport { Code, type CodeProps } from '../atoms/code';\nimport { useGridHeight } from '../../contexts/GridHeightContext';\n\nexport interface CodeBoxProps extends CodeProps {\n label?: string;\n showCopy?: boolean;\n showFormat?: boolean;\n showHeader?: boolean;\n height?: string | number;\n}\n\n/**\n * CodeBox - Monaco editor wrapped in a Box with header and actions\n *\n * Molecule that combines Box + Code atom + toolbar actions.\n * Use this when you need an editor with header, copy, and format buttons.\n * Use Code atom directly when you need an editor without Box wrapper.\n *\n * Height Behavior:\n *\n * Three height modes:\n * 1. Grid context: Equal row heights (250-450px), fills available space\n * 2. Explicit height prop: Fixed height (e.g., height={600} or height=\"50vh\")\n * 3. Auto-height prop: Dynamically sizes to content (min-max boundaries)\n *\n * @example\n * // Grid context - use default (no autoHeight) for equal row heights\n * <Grid columns={3}>\n * <CodeBox code={event} label=\"Event\" showCopy />\n * <CodeBox code={mapping} label=\"Mapping\" showFormat />\n * <CodeBox code={output} label=\"Output\" disabled />\n * </Grid>\n *\n * @example\n * // Standalone with auto-height - fits content, no blank space\n * <CodeBox\n * code={setupCode}\n * label=\"Setup\"\n * autoHeight={{ min: 100, max: 600 }}\n * disabled\n * />\n *\n * @example\n * // Explicit height override\n * <CodeBox\n * code={largeConfig}\n * label=\"Configuration\"\n * height={600}\n * showFormat\n * />\n */\nexport function CodeBox({\n code,\n language = 'javascript',\n label = 'Code',\n onChange,\n disabled = false,\n showCopy = false,\n showFormat = false,\n showHeader = true,\n height,\n className,\n autoHeight,\n ...codeProps\n}: CodeBoxProps) {\n const [copied, setCopied] = useState(false);\n const gridContext = useGridHeight();\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n };\n\n const handleFormat = () => {\n if (!onChange || disabled || language !== 'json') return;\n\n try {\n const parsed = JSON.parse(code);\n const formatted = JSON.stringify(parsed, null, 2);\n onChange(formatted);\n } catch (e) {\n // Invalid JSON, do nothing\n }\n };\n\n // Build header actions\n const actions = (\n <>\n {showFormat && !disabled && language === 'json' && (\n <button\n className=\"elb-explorer-btn\"\n onClick={handleFormat}\n title=\"Format JSON\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n </button>\n )}\n {showCopy && (\n <button\n className=\"elb-explorer-btn\"\n onClick={handleCopy}\n title={copied ? 'Copied!' : 'Copy to clipboard'}\n >\n {copied ? (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )}\n </button>\n )}\n </>\n );\n\n const boxStyle: React.CSSProperties = {};\n if (height !== undefined) {\n boxStyle.height = typeof height === 'number' ? `${height}px` : height;\n } else if (gridContext?.syncedHeight) {\n boxStyle.height = `${gridContext.syncedHeight}px`;\n }\n\n const useContentHeight = !!autoHeight || !!gridContext?.enabled;\n const boxClassName = `${className || ''} ${useContentHeight ? 'elb-box--auto-height' : ''}`.trim();\n\n return (\n <Box\n header={label}\n headerActions={actions}\n className={boxClassName}\n style={boxStyle}\n showHeader={showHeader}\n >\n <Code\n code={code}\n language={language}\n onChange={onChange}\n disabled={disabled}\n autoHeight={autoHeight}\n {...codeProps}\n />\n </Box>\n );\n}\n","import React from 'react';\n\nexport interface HeaderProps {\n label: string;\n children?: React.ReactNode;\n}\n\nexport function Header({ label, children }: HeaderProps) {\n return (\n <div className=\"elb-explorer-header\">\n <span className=\"elb-explorer-label\">{label}</span>\n {children}\n </div>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Header } from './header';\n\nexport interface BoxProps {\n header: string;\n headerActions?: React.ReactNode;\n footer?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n minHeight?: number | string;\n maxHeight?: number | string;\n tiny?: boolean;\n resizable?: boolean;\n showHeader?: boolean; // Hide header (default: true)\n}\n\n/**\n * Box - Container atom component\n *\n * Provides a consistent box container with header and content area.\n * Used across all explorer components for consistent styling.\n *\n * Height behavior:\n * - Default: minHeight 100px, grows as needed\n * - tiny prop: sets minHeight to 100px explicitly\n * - Custom minHeight/maxHeight: override defaults\n * - In Grid: fills row height (equal heights per row)\n *\n * @example\n * <Box header=\"Preview\">\n * <Preview html={html} css={css} />\n * </Box>\n *\n * @example\n * <Box header=\"Code\" minHeight={200} maxHeight={600}>\n * <CodeBox ... />\n * </Box>\n */\nexport function Box({\n header,\n headerActions,\n footer,\n children,\n className = '',\n style,\n minHeight,\n maxHeight,\n tiny = false,\n resizable = false,\n showHeader = true,\n}: BoxProps) {\n const boxStyle: React.CSSProperties = { ...style };\n\n if (tiny) {\n boxStyle.height = 'auto';\n boxStyle.minHeight =\n minHeight !== undefined\n ? typeof minHeight === 'number'\n ? `${minHeight}px`\n : minHeight\n : '100px';\n } else if (minHeight !== undefined) {\n boxStyle.minHeight =\n typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n }\n\n if (maxHeight !== undefined) {\n boxStyle.maxHeight =\n typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n }\n\n if (resizable) {\n boxStyle.resize = 'vertical';\n boxStyle.overflow = 'auto';\n }\n\n return (\n <div className={`elb-explorer elb-explorer-box ${className}`} style={boxStyle}>\n {showHeader && <Header label={header}>{headerActions}</Header>}\n <div className=\"elb-explorer-content\">{children}</div>\n {footer && <div className=\"elb-explorer-footer\">{footer}</div>}\n </div>\n );\n}\n","import React, {\n type ComponentType,\n useEffect,\n useState,\n useRef,\n useCallback,\n} from 'react';\nimport { Editor, loader } from '@monaco-editor/react';\nimport type { editor } from 'monaco-editor';\nimport { registerAllThemes } from '../../themes';\nimport { registerWalkerOSTypes } from '../../utils/monaco-types';\nimport {\n applyDataElbDecorations,\n registerDataElbStyles,\n} from '../../utils/monaco-decorators';\nimport { useMonacoHeight } from '../../hooks/useMonacoHeight';\nimport { useGridHeight } from '../../contexts/GridHeightContext';\n\n// Monaco Editor configuration\n// NOTE: MonacoEnvironment.getWorker and loader.config() should be configured\n// by the consuming application. See examples in the explorer app's main.tsx\nimport * as monaco from 'monaco-editor';\n\nexport interface CodeProps {\n code: string;\n language?: string;\n onChange?: (code: string) => void;\n disabled?: boolean;\n lineNumbers?: boolean;\n folding?: boolean;\n wordWrap?: boolean;\n className?: string;\n beforeMount?: (monaco: typeof import('monaco-editor')) => void;\n onMount?: (editor: editor.IStandaloneCodeEditor) => void;\n autoHeight?: boolean | { min?: number; max?: number };\n fontSize?: number;\n packages?: string[];\n}\n\n/**\n * Code - Pure Monaco editor atom\n *\n * Height Management:\n * Two modes controlled by `autoHeight` prop:\n *\n * 1. Default (autoHeight=false): height=\"100%\" - fills parent container\n * - Uses flex: 1 + min-height: 0 for proper flex overflow containment\n * - Monaco set to height=\"100%\" to fill container\n * - automaticLayout: true + ResizeObserver for reliable resize detection\n * - Use in Grid (equal heights) and Flex contexts (fill parent)\n *\n * 2. Auto-height (autoHeight=true): Dynamically sizes to content\n * - Uses Monaco's getContentHeight() API for accurate content measurement\n * - Respects min/max boundaries (default: 100-600px)\n * - Updates automatically when content changes\n * - Use in standalone contexts (docs) to eliminate blank space\n *\n * @example\n * // Grid context - use default height=\"100%\" for equal row heights\n * <Grid columns={3}>\n * <CodeBox code={event} />\n * <CodeBox code={mapping} />\n * </Grid>\n *\n * @example\n * // Standalone context - use autoHeight to fit content\n * <CodeBox\n * code={shortExample}\n * autoHeight={{ min: 100, max: 600 }}\n * />\n */\nexport function Code({\n code,\n language = 'javascript',\n onChange,\n disabled = false,\n lineNumbers = false,\n folding = false,\n wordWrap = false,\n className,\n beforeMount,\n onMount,\n autoHeight,\n fontSize = 13,\n packages,\n}: CodeProps) {\n const [monacoTheme, setMonacoTheme] = useState('vs-light');\n const decorationsCleanupRef = useRef<(() => void) | null>(null);\n const monacoRef = useRef<typeof import('monaco-editor') | null>(null);\n const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const gridContext = useGridHeight();\n const boxIdRef = useRef<number | null>(null);\n\n if (gridContext?.enabled && boxIdRef.current === null) {\n boxIdRef.current = gridContext.getBoxId();\n }\n\n const handleHeightChange = useCallback(\n (height: number) => {\n if (gridContext?.enabled && boxIdRef.current !== null) {\n gridContext.registerBox(boxIdRef.current, height);\n }\n },\n [gridContext],\n );\n\n useEffect(() => {\n return () => {\n if (gridContext?.enabled && boxIdRef.current !== null) {\n gridContext.unregisterBox(boxIdRef.current);\n }\n };\n }, [gridContext]);\n\n const heightConfig = typeof autoHeight === 'object' ? autoHeight : {};\n const [calculatedHeight, registerEditor] = useMonacoHeight({\n enabled: !!autoHeight || !!gridContext?.enabled,\n minHeight: heightConfig.min ?? (gridContext?.enabled ? 1 : 20),\n maxHeight: heightConfig.max ?? 600,\n defaultHeight: gridContext?.enabled ? 250 : 400,\n onHeightChange: handleHeightChange,\n });\n\n // Register data-elb styles on mount\n useEffect(() => {\n registerDataElbStyles();\n }, []);\n\n // Helper: Find data-theme attribute from closest ancestor or document\n const getDataTheme = useCallback((): string | null => {\n // Check container ref first (closest to Monaco)\n if (containerRef.current) {\n const closest = containerRef.current.closest('[data-theme]');\n if (closest) {\n return closest.getAttribute('data-theme');\n }\n }\n\n // Fall back to document root\n return document.documentElement.getAttribute('data-theme');\n }, []);\n\n // Theme detection\n useEffect(() => {\n const checkTheme = () => {\n const dataTheme = getDataTheme();\n const isDark =\n dataTheme === 'dark' ||\n (dataTheme === null &&\n window.matchMedia('(prefers-color-scheme: dark)').matches);\n const newTheme = isDark ? 'elbTheme-dark' : 'elbTheme-light';\n\n setMonacoTheme(newTheme);\n };\n\n checkTheme();\n\n const observer = new MutationObserver(() => {\n checkTheme();\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => {\n checkTheme();\n };\n mediaQuery.addEventListener('change', handleChange);\n\n return () => {\n observer.disconnect();\n mediaQuery.removeEventListener('change', handleChange);\n };\n }, [getDataTheme]);\n\n // ResizeObserver for container size changes\n // Complements automaticLayout: true for more reliable detection\n // Handles cases where Grid constraints change or parent container resizes\n useEffect(() => {\n const editor = editorRef.current;\n const container = containerRef.current;\n\n if (!editor || !container) return;\n\n const resizeObserver = new ResizeObserver(() => {\n // Debounce layout calls to prevent excessive updates\n requestAnimationFrame(() => {\n editor.layout();\n });\n });\n\n resizeObserver.observe(container);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n const handleChange = (value: string | undefined) => {\n if (onChange && value !== undefined) {\n onChange(value);\n }\n };\n\n const handleBeforeMount = async (monaco: typeof import('monaco-editor')) => {\n monacoRef.current = monaco;\n\n if (beforeMount) {\n beforeMount(monaco);\n return;\n }\n\n registerAllThemes(monaco);\n\n if (packages && packages.length > 0) {\n registerWalkerOSTypes(monaco);\n\n const { loadPackageTypes } = await import('../../utils/monaco-types');\n for (const pkg of packages) {\n if (pkg !== '@walkeros/core') {\n await loadPackageTypes(monaco, { package: pkg }).catch(err => {\n console.warn(`Failed to load types for ${pkg}:`, err);\n });\n }\n }\n }\n\n const dataTheme = getDataTheme();\n const isDark =\n dataTheme === 'dark' ||\n (dataTheme === null &&\n window.matchMedia('(prefers-color-scheme: dark)').matches);\n const themeName = isDark ? 'elbTheme-dark' : 'elbTheme-light';\n\n monaco.editor.setTheme(themeName);\n };\n\n const MonacoEditor = Editor as ComponentType<{\n height: string;\n language: string;\n value: string;\n onChange: (value: string | undefined) => void;\n beforeMount?: (monaco: typeof import('monaco-editor')) => void;\n onMount?: (editor: editor.IStandaloneCodeEditor) => void;\n theme: string;\n options: Record<string, unknown>;\n }>;\n\n const handleEditorMount = (monacoEditor: editor.IStandaloneCodeEditor) => {\n editorRef.current = monacoEditor;\n\n // Register with height hook if auto-height or grid context is enabled\n if (autoHeight || gridContext?.enabled) {\n registerEditor(monacoEditor);\n }\n\n // Apply data-elb decorations for HTML\n if (language === 'html' && monacoRef.current) {\n decorationsCleanupRef.current = applyDataElbDecorations(\n monacoEditor,\n monacoRef.current,\n );\n }\n\n // Initial layout call after mount\n requestAnimationFrame(() => {\n monacoEditor.layout();\n });\n\n if (onMount) {\n onMount(monacoEditor);\n }\n };\n\n // Cleanup\n useEffect(() => {\n return () => {\n if (decorationsCleanupRef.current) {\n decorationsCleanupRef.current();\n }\n };\n }, []);\n\n // Choose height strategy: auto-calculated or fill parent\n // Note: When grid context is enabled with synced mode, CodeBox applies\n // syncedHeight to the Box container. Monaco should use calculatedHeight\n // (content-only) here, not syncedHeight (which includes header + border).\n const monacoHeight =\n autoHeight || gridContext?.enabled ? `${calculatedHeight}px` : '100%';\n\n // Add modifier class when using auto-height or synced height\n const useContentHeight = !!autoHeight || !!gridContext?.enabled;\n const codeClassName =\n `elb-code ${useContentHeight ? 'elb-code--auto-height' : ''} ${className || ''}`.trim();\n\n return (\n <div className={codeClassName} ref={containerRef}>\n <MonacoEditor\n height={monacoHeight}\n language={language}\n value={code}\n onChange={handleChange}\n beforeMount={handleBeforeMount}\n onMount={handleEditorMount}\n theme={monacoTheme}\n options={{\n readOnly: disabled || !onChange,\n minimap: { enabled: false },\n fontSize: fontSize,\n lineHeight: Math.round(fontSize * 1.5),\n padding: 0,\n lineNumbers: lineNumbers ? 'on' : 'off',\n lineNumbersMinChars: 0,\n glyphMargin: false,\n folding: folding,\n lineDecorationsWidth: 0,\n scrollBeyondLastLine: false,\n automaticLayout: true,\n tabSize: 2,\n wordWrap: wordWrap ? 'on' : 'off',\n fixedOverflowWidgets: true,\n overviewRulerLanes: 0,\n renderLineHighlight: 'none',\n 'bracketPairColorization.enabled': false,\n guides: {\n bracketPairs: false,\n bracketPairsHorizontal: false,\n highlightActiveBracketPair: false,\n indentation: false, // Disable indentation guide lines\n },\n scrollbar: {\n vertical: 'auto',\n horizontal: 'auto',\n alwaysConsumeMouseWheel: false,\n },\n }}\n />\n </div>\n );\n}\n","/**\n * Palenight Theme for Monaco Editor\n *\n * Dark theme for walkerOS Explorer matching Prism's palenight theme.\n * Aligned with website documentation syntax highlighting for consistency.\n *\n * Token Color Mappings (Matching Prism Palenight):\n * - comment: #697098 - gray, italic\n * - string/inserted: #c3e88d - green\n * - number: #f78c6c - orange\n * - builtin/char/constant/function: #82aaff - blue\n * - punctuation/delimiter: #c792ea - purple\n * - variable: #bfc7d5 - light gray\n * - class-name: #ffcb6b - yellow/gold\n * - attr-name: #c3e88d - green (matching string color)\n * - tag/deleted: #ff5572 - red/pink\n * - operator: #89ddff - cyan\n * - boolean: #ff5874 - red\n * - keyword: #c084fc - bright purple, italic\n * - doctype: #c084fc - purple, italic\n * - namespace: #b2ccd6 - blue-gray\n * - url: #dddddd - white\n */\n\nimport type { editor } from 'monaco-editor';\n\nexport const palenightTheme: editor.IStandaloneThemeData = {\n base: 'vs-dark',\n inherit: true,\n rules: [\n // Comments\n { token: 'comment', foreground: '697098', fontStyle: 'italic' },\n { token: 'comment.block', foreground: '697098', fontStyle: 'italic' },\n { token: 'comment.line', foreground: '697098', fontStyle: 'italic' },\n\n // Strings - green matching Prism palenight\n { token: 'string', foreground: 'c3e88d' },\n { token: 'string.quoted', foreground: 'c3e88d' },\n { token: 'string.template', foreground: 'c3e88d' },\n { token: 'string.regexp', foreground: '89ddff' },\n\n // Language-specific strings (Monaco uses these exact token names)\n { token: 'string.value.json', foreground: 'c3e88d' },\n { token: 'string.json', foreground: 'c3e88d' },\n { token: 'string.html', foreground: 'c3e88d' },\n { token: 'string.css', foreground: 'c3e88d' },\n { token: 'string.js', foreground: 'c3e88d' },\n { token: 'string.ts', foreground: 'c3e88d' },\n\n // Numbers\n { token: 'number', foreground: 'f78c6c' },\n { token: 'number.hex', foreground: 'f78c6c' },\n { token: 'number.binary', foreground: 'f78c6c' },\n { token: 'number.octal', foreground: 'f78c6c' },\n { token: 'number.float', foreground: 'f78c6c' },\n\n // Keywords - brighter purple/magenta\n { token: 'keyword', foreground: 'c084fc', fontStyle: 'italic' },\n { token: 'keyword.control', foreground: 'c084fc', fontStyle: 'italic' },\n { token: 'keyword.operator', foreground: '89ddff' },\n { token: 'keyword.other', foreground: 'c084fc' },\n\n // Operators - cyan matching Prism palenight\n { token: 'operator', foreground: '89ddff' },\n { token: 'operators', foreground: '89ddff' },\n\n // Functions\n { token: 'function', foreground: '82aaff' },\n { token: 'identifier.function', foreground: '82aaff' },\n { token: 'support.function', foreground: '82aaff' },\n { token: 'entity.name.function', foreground: '82aaff' },\n\n // Types & Classes\n { token: 'type', foreground: 'ffcb6b' },\n { token: 'type.identifier', foreground: 'ffcb6b' },\n { token: 'entity.name.type', foreground: 'ffcb6b' },\n { token: 'entity.name.class', foreground: 'ffcb6b' },\n { token: 'support.type', foreground: 'ffcb6b' },\n { token: 'support.class', foreground: 'ffcb6b' },\n\n // Variables\n { token: 'variable', foreground: 'bfc7d5' },\n { token: 'variable.name', foreground: 'bfc7d5' },\n { token: 'variable.parameter', foreground: 'bfc7d5' },\n\n // Constants & Built-ins\n { token: 'constant', foreground: '82aaff' },\n { token: 'constant.language', foreground: 'ff5874' },\n { token: 'constant.numeric', foreground: 'f78c6c' },\n { token: 'constant.character', foreground: '82aaff' },\n { token: 'support.constant', foreground: '82aaff' },\n\n // Booleans\n { token: 'constant.language.boolean', foreground: 'ff5874' },\n { token: 'keyword.constant.boolean', foreground: 'ff5874' },\n\n // Delimiters & Punctuation - purple matching Prism palenight\n { token: 'delimiter', foreground: 'c792ea' },\n { token: 'delimiter.bracket', foreground: 'c792ea' },\n { token: 'delimiter.parenthesis', foreground: 'c792ea' },\n { token: 'delimiter.square', foreground: 'c792ea' },\n { token: 'punctuation', foreground: 'c792ea' },\n\n // Tags (HTML/XML/JSX)\n { token: 'tag', foreground: 'ff5572' },\n { token: 'meta.tag', foreground: 'ff5572' },\n { token: 'entity.name.tag', foreground: 'ff5572' },\n\n // Tag Attributes (using string color for consistency with how Prism treats attributes)\n { token: 'attribute.name', foreground: 'c3e88d' },\n { token: 'entity.other.attribute-name', foreground: 'c3e88d' },\n\n // Namespaces\n { token: 'namespace', foreground: 'b2ccd6' },\n { token: 'entity.name.namespace', foreground: 'b2ccd6' },\n\n // URLs\n { token: 'markup.underline.link', foreground: 'dddddd' },\n\n // Doctype\n {\n token: 'meta.tag.sgml.doctype',\n foreground: 'c084fc',\n fontStyle: 'italic',\n },\n\n // JSON Keys - Monaco creates special tokens for JSON keys\n // Use light gray for property names (distinct from string values)\n { token: 'support.type.property-name', foreground: 'bfc7d5' },\n { token: 'support.type.property-name.json', foreground: 'bfc7d5' },\n { token: 'string.key.json', foreground: 'bfc7d5' },\n\n // Markdown\n { token: 'markup.bold', fontStyle: 'bold' },\n { token: 'markup.italic', fontStyle: 'italic' },\n { token: 'markup.heading', foreground: 'c084fc', fontStyle: 'bold' },\n\n // Language-Specific: JavaScript/TypeScript\n { token: 'variable.parameter.ts', foreground: 'bfc7d5' },\n { token: 'variable.parameter.js', foreground: 'bfc7d5' },\n { token: 'support.type.primitive.ts', foreground: 'ffcb6b' },\n { token: 'support.type.primitive.js', foreground: 'ffcb6b' },\n { token: 'entity.name.type.ts', foreground: 'ffcb6b' },\n { token: 'entity.name.type.js', foreground: 'ffcb6b' },\n { token: 'meta.type.annotation.ts', foreground: 'ffcb6b' },\n { token: 'keyword.operator.type.ts', foreground: '89ddff' },\n\n // Language-Specific: HTML\n { token: 'entity.name.tag.html', foreground: 'bfc7d5' },\n { token: 'tag.html', foreground: 'bfc7d5' },\n { token: 'entity.other.attribute-name.html', foreground: 'bfc7d5' },\n { token: 'attribute.name.html', foreground: 'bfc7d5' },\n { token: 'attribute.value.html', foreground: 'c3e88d' },\n { token: 'delimiter.html', foreground: 'c792ea' },\n { token: 'comment.html', foreground: '697098', fontStyle: 'italic' },\n { token: 'meta.tag.html', foreground: 'c792ea' },\n { token: 'punctuation.definition.tag.html', foreground: 'c792ea' },\n\n // Language-Specific: CSS\n { token: 'entity.name.tag.css', foreground: 'ff5572' },\n { token: 'entity.other.attribute-name.class.css', foreground: 'ffcb6b' },\n { token: 'entity.other.attribute-name.id.css', foreground: '82aaff' },\n { token: 'support.type.property-name.css', foreground: 'c084fc' },\n { token: 'support.constant.property-value.css', foreground: 'f78c6c' },\n { token: 'keyword.other.unit.css', foreground: 'f78c6c' },\n\n // Errors & Warnings\n { token: 'invalid', foreground: 'ff5572' },\n { token: 'invalid.illegal', foreground: 'ff5572' },\n { token: 'invalid.deprecated', foreground: 'f78c6c' },\n ],\n colors: {\n // Editor Background - transparent, let box handle background\n // Falls back to CSS var(--bg-input) in _code.scss\n 'editor.background': '#00000000', // Transparent\n 'editor.foreground': '#bfc7d5',\n\n // Editor Lines - transparent to inherit box background\n 'editor.lineHighlightBackground': '#00000000', // Transparent\n 'editorLineNumber.foreground': '#676E95',\n 'editorLineNumber.activeForeground': '#c084fc',\n\n // Editor Cursor & Selection - transparent for read-only snippets\n 'editorCursor.foreground': '#00000000',\n 'editor.selectionBackground': '#00000000',\n 'editor.inactiveSelectionBackground': '#00000000',\n 'editor.selectionHighlightBackground': '#00000000',\n\n // Editor Gutter - transparent to inherit box background\n 'editorGutter.background': '#00000000', // Transparent\n 'editorGutter.modifiedBackground': '#82aaff',\n 'editorGutter.addedBackground': '#c3e88d',\n 'editorGutter.deletedBackground': '#ff5572',\n\n // Editor Widgets\n 'editorWidget.background': '#1e1e2e',\n 'editorWidget.border': '#676E95',\n 'editorSuggestWidget.background': '#1e1e2e',\n 'editorSuggestWidget.border': '#676E95',\n 'editorSuggestWidget.selectedBackground': '#717CB440',\n\n // Sticky Scroll - CRITICAL: Must have solid background to prevent transparency when scrolling\n 'editorStickyScroll.background': '#1e1e2e',\n 'editorStickyScroll.border': '#676E95',\n\n // Hover Widgets - Tooltips and hover information\n 'editorHoverWidget.background': '#1e1e2e',\n 'editorHoverWidget.border': '#676E95',\n 'editorHoverWidget.statusBarBackground': '#676E95',\n\n // Inline Hints - Type hints, parameter hints, inline suggestions\n 'editorInlineHint.background': '#292d3e',\n 'editorInlineHint.foreground': '#676E95',\n\n // Code Lens - Reference counts, test indicators\n 'editorCodeLens.foreground': '#697098',\n\n // Ghost Text - Autocomplete suggestions shown inline\n 'editorGhostText.foreground': '#676E9540',\n\n // Editor Whitespace & Indentation\n 'editorWhitespace.foreground': '#676E9540',\n 'editorIndentGuide.background': '#676E9520',\n 'editorIndentGuide.activeBackground': '#676E95',\n\n // Scrollbar\n 'scrollbarSlider.background': '#676E9530',\n 'scrollbarSlider.hoverBackground': '#676E9550',\n 'scrollbarSlider.activeBackground': '#676E9570',\n\n // Bracket Matching\n 'editorBracketMatch.background': '#676E9540',\n 'editorBracketMatch.border': '#676E95',\n\n // Find/Replace\n 'editor.findMatchBackground': '#717CB440',\n 'editor.findMatchHighlightBackground': '#676E9530',\n 'editor.findRangeHighlightBackground': '#676E9520',\n\n // Minimap\n 'minimap.background': '#292d3e',\n 'minimap.selectionHighlight': '#717CB440',\n 'minimap.findMatchHighlight': '#717CB440',\n\n // Overview Ruler\n 'editorOverviewRuler.border': '#676E9520',\n 'editorOverviewRuler.modifiedForeground': '#82aaff',\n 'editorOverviewRuler.addedForeground': '#c3e88d',\n 'editorOverviewRuler.deletedForeground': '#ff5572',\n\n // Peek View\n 'peekView.border': '#676E95',\n 'peekViewEditor.background': '#1e1e2e',\n 'peekViewResult.background': '#1e1e2e',\n 'peekViewTitle.background': '#1e1e2e',\n\n // Diff Editor\n 'diffEditor.insertedTextBackground': '#c3e88d20',\n 'diffEditor.removedTextBackground': '#ff557220',\n },\n};\n\n/**\n * Register the palenight theme with Monaco Editor\n * Call this function before creating any editor instances\n */\nexport function registerPalenightTheme(monaco: typeof import('monaco-editor')) {\n monaco.editor.defineTheme('elbTheme-dark', palenightTheme);\n}\n","/**\n * Lighthouse Theme for Monaco Editor\n *\n * Custom light theme for walkerOS Explorer, designed to complement the Palenight dark theme.\n * Based on VS Code Light+ with adjustments for optimal readability and brand consistency.\n *\n * Color Palette Strategy:\n * - Comments: Muted green (#6A737D) for subtle annotations\n * - Strings: Dark green (#22863A) for clear text distinction\n * - Numbers: Brick red (#D73A49) for numeric emphasis\n * - Functions: Deep blue (#005CC5) for callable identification\n * - Keywords: Purple (#6F42C1) maintaining syntax hierarchy\n * - Variables: Near black (#24292E) for primary code elements\n * - Types/Classes: Dark gold (#B08800) for type definitions\n * - Tags: Red (#D73A49) for HTML/JSX elements\n * - Operators: Teal (#0086B3) for logical operations\n * - Booleans: Red (#D73A49) for literal values\n */\n\nimport type { editor } from 'monaco-editor';\n\nexport const lighthouseTheme: editor.IStandaloneThemeData = {\n base: 'vs',\n inherit: true,\n rules: [\n // Comments\n { token: 'comment', foreground: '6A737D', fontStyle: 'italic' },\n { token: 'comment.block', foreground: '6A737D', fontStyle: 'italic' },\n { token: 'comment.line', foreground: '6A737D', fontStyle: 'italic' },\n\n // Strings - dark green for good contrast on white\n { token: 'string', foreground: '22863A' },\n { token: 'string.quoted', foreground: '22863A' },\n { token: 'string.template', foreground: '22863A' },\n { token: 'string.regexp', foreground: '032F62' },\n\n // Language-specific strings (Monaco uses these exact token names)\n { token: 'string.value.json', foreground: '22863A' },\n { token: 'string.json', foreground: '22863A' },\n { token: 'string.html', foreground: '22863A' },\n { token: 'string.css', foreground: '22863A' },\n { token: 'string.js', foreground: '22863A' },\n { token: 'string.ts', foreground: '22863A' },\n\n // Numbers - dark red/burgundy for contrast\n { token: 'number', foreground: 'D73A49' },\n { token: 'number.hex', foreground: 'D73A49' },\n { token: 'number.binary', foreground: 'D73A49' },\n { token: 'number.octal', foreground: 'D73A49' },\n { token: 'number.float', foreground: 'D73A49' },\n\n // Keywords - dark purple for contrast\n { token: 'keyword', foreground: '6F42C1', fontStyle: 'italic' },\n { token: 'keyword.control', foreground: '6F42C1', fontStyle: 'italic' },\n { token: 'keyword.operator', foreground: '0086B3' },\n { token: 'keyword.other', foreground: '6F42C1' },\n\n // Operators - cyan (brand color)\n { token: 'operator', foreground: '01b5e2' },\n { token: 'operators', foreground: '01b5e2' },\n\n // Functions\n { token: 'function', foreground: '005CC5' },\n { token: 'identifier.function', foreground: '005CC5' },\n { token: 'support.function', foreground: '005CC5' },\n { token: 'entity.name.function', foreground: '005CC5' },\n\n // Types & Classes\n { token: 'type', foreground: 'B08800' },\n { token: 'type.identifier', foreground: 'B08800' },\n { token: 'entity.name.type', foreground: 'B08800' },\n { token: 'entity.name.class', foreground: 'B08800' },\n { token: 'support.type', foreground: 'B08800' },\n { token: 'support.class', foreground: 'B08800' },\n\n // Variables\n { token: 'variable', foreground: '24292E' },\n { token: 'variable.name', foreground: '24292E' },\n { token: 'variable.parameter', foreground: '24292E' },\n\n // Constants & Built-ins\n { token: 'constant', foreground: '005CC5' },\n { token: 'constant.language', foreground: 'ef4444' },\n { token: 'constant.numeric', foreground: 'fb923c' },\n { token: 'constant.character', foreground: '005CC5' },\n { token: 'support.constant', foreground: '005CC5' },\n\n // Booleans - red/pink accent (matching screenshot)\n { token: 'constant.language.boolean', foreground: 'ef4444' },\n { token: 'keyword.constant.boolean', foreground: 'ef4444' },\n\n // Delimiters & Punctuation\n { token: 'delimiter', foreground: '24292E' },\n { token: 'delimiter.bracket', foreground: '24292E' },\n { token: 'delimiter.parenthesis', foreground: '24292E' },\n { token: 'delimiter.square', foreground: '24292E' },\n { token: 'punctuation', foreground: '24292E' },\n\n // Tags (HTML/XML/JSX)\n { token: 'tag', foreground: 'D73A49' },\n { token: 'meta.tag', foreground: 'D73A49' },\n { token: 'entity.name.tag', foreground: 'D73A49' },\n\n // Tag Attributes (using string color for consistency with Prism)\n { token: 'attribute.name', foreground: '22863A' },\n { token: 'entity.other.attribute-name', foreground: '22863A' },\n\n // Namespaces\n { token: 'namespace', foreground: '6F42C1' },\n { token: 'entity.name.namespace', foreground: '6F42C1' },\n\n // URLs\n { token: 'markup.underline.link', foreground: '005CC5' },\n\n // Doctype\n {\n token: 'meta.tag.sgml.doctype',\n foreground: '6A737D',\n fontStyle: 'italic',\n },\n\n // JSON Keys - Force string color for consistency with Prism behavior\n { token: 'support.type.property-name', foreground: '22863A' },\n { token: 'support.type.property-name.json', foreground: '22863A' },\n { token: 'string.key.json', foreground: '22863A' },\n\n // Markdown\n { token: 'markup.bold', fontStyle: 'bold' },\n { token: 'markup.italic', fontStyle: 'italic' },\n { token: 'markup.heading', foreground: '6F42C1', fontStyle: 'bold' },\n\n // Language-Specific: JavaScript/TypeScript\n { token: 'variable.parameter.ts', foreground: '24292E' },\n { token: 'variable.parameter.js', foreground: '24292E' },\n { token: 'support.type.primitive.ts', foreground: 'B08800' },\n { token: 'support.type.primitive.js', foreground: 'B08800' },\n { token: 'entity.name.type.ts', foreground: 'B08800' },\n { token: 'entity.name.type.js', foreground: 'B08800' },\n { token: 'meta.type.annotation.ts', foreground: 'B08800' },\n { token: 'keyword.operator.type.ts', foreground: '0086B3' },\n\n // Language-Specific: HTML\n { token: 'entity.name.tag.html', foreground: '24292E' },\n { token: 'tag.html', foreground: '24292E' },\n { token: 'entity.other.attribute-name.html', foreground: '24292E' },\n { token: 'attribute.name.html', foreground: '24292E' },\n { token: 'attribute.value.html', foreground: '22863A' },\n { token: 'delimiter.html', foreground: '24292E' },\n { token: 'comment.html', foreground: '6A737D', fontStyle: 'italic' },\n { token: 'meta.tag.html', foreground: '24292E' },\n { token: 'punctuation.definition.tag.html', foreground: '24292E' },\n\n // Language-Specific: CSS\n { token: 'entity.name.tag.css', foreground: 'D73A49' },\n { token: 'entity.other.attribute-name.class.css', foreground: 'B08800' },\n { token: 'entity.other.attribute-name.id.css', foreground: '005CC5' },\n { token: 'support.type.property-name.css', foreground: '6F42C1' },\n { token: 'support.constant.property-value.css', foreground: 'D73A49' },\n { token: 'keyword.other.unit.css', foreground: 'D73A49' },\n\n // Errors & Warnings\n { token: 'invalid', foreground: 'CB2431' },\n { token: 'invalid.illegal', foreground: 'CB2431' },\n { token: 'invalid.deprecated', foreground: 'D73A49' },\n ],\n colors: {\n // Editor Background - transparent, let box handle background\n 'editor.background': '#00000000', // Transparent\n 'editor.foreground': '#24292E',\n\n // Editor Lines - transparent to inherit box background\n 'editor.lineHighlightBackground': '#00000000', // Transparent\n 'editorLineNumber.foreground': '#1B1F2380',\n 'editorLineNumber.activeForeground': '#6F42C1',\n\n // Editor Cursor & Selection - transparent for read-only snippets\n 'editorCursor.foreground': '#00000000',\n 'editor.selectionBackground': '#00000000',\n 'editor.inactiveSelectionBackground': '#00000000',\n 'editor.selectionHighlightBackground': '#00000000',\n\n // Editor Gutter - transparent to inherit box background\n 'editorGutter.background': '#00000000', // Transparent\n 'editorGutter.modifiedBackground': '#005CC5',\n 'editorGutter.addedBackground': '#28A745',\n 'editorGutter.deletedBackground': '#D73A49',\n\n // Editor Widgets\n 'editorWidget.background': '#F6F8FA',\n 'editorWidget.border': '#E1E4E8',\n 'editorSuggestWidget.background': '#F6F8FA',\n 'editorSuggestWidget.border': '#E1E4E8',\n 'editorSuggestWidget.selectedBackground': '#0366D625',\n\n // Sticky Scroll - CRITICAL: Must have solid background to prevent transparency when scrolling\n 'editorStickyScroll.background': '#F6F8FA',\n 'editorStickyScroll.border': '#E1E4E8',\n\n // Hover Widgets - Tooltips and hover information\n 'editorHoverWidget.background': '#F6F8FA',\n 'editorHoverWidget.border': '#E1E4E8',\n 'editorHoverWidget.statusBarBackground': '#E1E4E8',\n\n // Inline Hints - Type hints, parameter hints, inline suggestions\n 'editorInlineHint.background': '#F6F8FA',\n 'editorInlineHint.foreground': '#6A737D',\n\n // Code Lens - Reference counts, test indicators\n 'editorCodeLens.foreground': '#6A737D',\n\n // Ghost Text - Autocomplete suggestions shown inline\n 'editorGhostText.foreground': '#1B1F2350',\n\n // Editor Whitespace & Indentation\n 'editorWhitespace.foreground': '#1B1F2340',\n 'editorIndentGuide.background': '#E1E4E820',\n 'editorIndentGuide.activeBackground': '#E1E4E8',\n\n // Scrollbar\n 'scrollbarSlider.background': '#1B1F2330',\n 'scrollbarSlider.hoverBackground': '#1B1F2350',\n 'scrollbarSlider.activeBackground': '#1B1F2370',\n\n // Bracket Matching\n 'editorBracketMatch.background': '#34D05840',\n 'editorBracketMatch.border': '#34D058',\n\n // Find/Replace\n 'editor.findMatchBackground': '#FFDF5D40',\n 'editor.findMatchHighlightBackground': '#FFDF5D30',\n 'editor.findRangeHighlightBackground': '#0366D620',\n\n // Minimap\n 'minimap.background': '#FAFBFC',\n 'minimap.selectionHighlight': '#0366D625',\n 'minimap.findMatchHighlight': '#FFDF5D40',\n\n // Overview Ruler\n 'editorOverviewRuler.border': '#E1E4E820',\n 'editorOverviewRuler.modifiedForeground': '#005CC5',\n 'editorOverviewRuler.addedForeground': '#28A745',\n 'editorOverviewRuler.deletedForeground': '#D73A49',\n\n // Peek View\n 'peekView.border': '#0366D6',\n 'peekViewEditor.background': '#F6F8FA',\n 'peekViewResult.background': '#FAFBFC',\n 'peekViewTitle.background': '#F6F8FA',\n\n // Diff Editor\n 'diffEditor.insertedTextBackground': '#28A74520',\n 'diffEditor.removedTextBackground': '#D73A4920',\n },\n};\n\n/**\n * Register the lighthouse theme with Monaco Editor\n * Call this function before creating any editor instances\n */\nexport function registerLighthouseTheme(monaco: typeof import('monaco-editor')) {\n monaco.editor.defineTheme('elbTheme-light', lighthouseTheme);\n}\n","/**\n * Monaco Editor Themes for walkerOS Explorer\n *\n * Custom Monaco themes that integrate seamlessly with the CSS-based theme system.\n * Theme switching is handled via CSS `data-theme` attribute on document root.\n */\n\n// Import registration functions for use in registerAllThemes\nimport { registerPalenightTheme } from './palenight';\nimport { registerLighthouseTheme } from './lighthouse';\n\n// Monaco Editor themes\nexport { palenightTheme, registerPalenightTheme } from './palenight';\nexport { lighthouseTheme, registerLighthouseTheme } from './lighthouse';\n\n// Theme types (for documentation and TypeScript support)\nexport type { ExplorerTheme } from './types';\n\n/**\n * Register all Monaco themes\n * Convenience function for registering both themes at once\n *\n * @example\n * ```typescript\n * import { registerAllThemes } from '@walkeros/explorer';\n * import * as monaco from 'monaco-editor';\n *\n * registerAllThemes(monaco);\n * ```\n */\nexport function registerAllThemes(monaco: typeof import('monaco-editor')): void {\n registerPalenightTheme(monaco);\n registerLighthouseTheme(monaco);\n}\n","import type { editor } from 'monaco-editor';\n\n/**\n * Regular expressions to match walkerOS data attributes\n */\nconst DATA_ELB_PATTERNS = [\n /\\bdata-elb(?!-)\\b/g, // data-elb (not followed by hyphen)\n /\\bdata-elbaction\\b/g, // data-elbaction\n /\\bdata-elbglobals\\b/g, // data-elbglobals\n /\\bdata-elbcontext\\b/g, // data-elbcontext\n /\\bdata-elb-[\\w-]+\\b/g, // data-elb-* (property attributes)\n];\n\n/**\n * Apply decorations to highlight walkerOS data attributes in Monaco editor\n *\n * This function scans the editor content for data-elb* attributes and\n * applies color highlighting to match the website's Prism.js styling.\n *\n * @param editor - Monaco editor instance\n * @param monaco - Monaco module\n */\nexport function applyDataElbDecorations(\n monacoEditor: editor.IStandaloneCodeEditor,\n monaco: typeof import('monaco-editor'),\n): () => void {\n const decorationIds: string[] = [];\n\n const updateDecorations = () => {\n const model = monacoEditor.getModel();\n if (!model) return;\n\n const content = model.getValue();\n const decorations: editor.IModelDeltaDecoration[] = [];\n\n // Find all matches for each pattern\n DATA_ELB_PATTERNS.forEach((pattern) => {\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content)) !== null) {\n const startPos = model.getPositionAt(match.index);\n const endPos = model.getPositionAt(match.index + match[0].length);\n\n decorations.push({\n range: new monaco.Range(\n startPos.lineNumber,\n startPos.column,\n endPos.lineNumber,\n endPos.column,\n ),\n options: {\n inlineClassName: 'elb-data-attribute',\n inlineClassNameAffectsLetterSpacing: true,\n },\n });\n }\n });\n\n // Apply decorations\n const newDecorationIds = monacoEditor.deltaDecorations(\n decorationIds,\n decorations,\n );\n decorationIds.length = 0;\n decorationIds.push(...newDecorationIds);\n };\n\n // Initial decoration\n updateDecorations();\n\n // Update decorations on content change\n const disposable = monacoEditor.onDidChangeModelContent(() => {\n updateDecorations();\n });\n\n // Return cleanup function\n return () => {\n disposable.dispose();\n monacoEditor.deltaDecorations(decorationIds, []);\n };\n}\n\n/**\n * Register CSS styles for data-elb attribute decorations\n * Call this once during app initialization\n */\nexport function registerDataElbStyles() {\n if (typeof document === 'undefined') return;\n\n const styleId = 'elb-monaco-data-attribute-styles';\n if (document.getElementById(styleId)) return;\n\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `\n .monaco-editor .elb-data-attribute {\n color: var(--color-highlight-primary, #01b5e2) !important;\n }\n `;\n document.head.appendChild(style);\n}\n","import { useEffect, useState, useRef, useCallback } from 'react';\nimport type { editor } from 'monaco-editor';\n\nexport interface UseMonacoHeightOptions {\n enabled?: boolean;\n minHeight?: number;\n maxHeight?: number;\n defaultHeight?: number;\n onHeightChange?: (height: number) => void;\n}\n\n/**\n * Hook to automatically calculate Monaco Editor height based on content\n *\n * @param enabled - Whether to enable auto-height calculation\n * @param minHeight - Minimum height in pixels (default: 100)\n * @param maxHeight - Maximum height in pixels (default: 800)\n * @param defaultHeight - Default height when not auto-sizing (default: 400)\n *\n * @returns [height, setEditor] - Current height and function to register editor instance\n *\n * @example\n * const [height, setEditor] = useMonacoHeight({ enabled: autoHeight });\n *\n * <Editor\n * height={height}\n * onMount={(editor) => setEditor(editor)}\n * />\n */\nexport function useMonacoHeight({\n enabled = false,\n minHeight = 100,\n maxHeight = 800,\n defaultHeight = 400,\n onHeightChange,\n}: UseMonacoHeightOptions = {}): [\n number,\n (editor: editor.IStandaloneCodeEditor | null) => void,\n] {\n const [height, setHeight] = useState<number>(\n enabled ? minHeight : defaultHeight,\n );\n const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);\n const previousHeightRef = useRef<number>(\n enabled ? minHeight : defaultHeight,\n );\n const updateTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const updateHeight = useCallback(() => {\n if (!enabled || !editorRef.current) return;\n\n try {\n const monacoContentHeight = editorRef.current.getContentHeight();\n const boundedMonacoHeight = Math.max(\n minHeight,\n Math.min(maxHeight, monacoContentHeight),\n );\n\n if (boundedMonacoHeight === previousHeightRef.current) {\n return;\n }\n\n previousHeightRef.current = boundedMonacoHeight;\n setHeight(boundedMonacoHeight);\n\n if (onHeightChange) {\n const HEADER_HEIGHT = 36;\n const BORDER = 2;\n const totalBoxHeight = boundedMonacoHeight + HEADER_HEIGHT + BORDER;\n onHeightChange(totalBoxHeight);\n }\n\n // Note: We don't call editor.layout() here because Monaco's\n // automaticLayout option handles layout updates automatically.\n // Calling layout() here would create a feedback loop with\n // onDidContentSizeChange, causing height to grow indefinitely.\n } catch (error) {\n // Silently fail - editor might not be fully initialized\n }\n }, [enabled, minHeight, maxHeight, onHeightChange]);\n\n const setEditor = useCallback(\n (editor: editor.IStandaloneCodeEditor | null) => {\n // Clean up previous timeout if it exists\n if (updateTimeoutRef.current) {\n clearTimeout(updateTimeoutRef.current);\n updateTimeoutRef.current = null;\n }\n\n editorRef.current = editor;\n\n if (!enabled || !editor) {\n setHeight(defaultHeight);\n previousHeightRef.current = defaultHeight;\n return;\n }\n\n // Trigger initial height calculation\n setTimeout(() => updateHeight(), 50);\n\n // Listen for content changes with debouncing\n const disposable = editor.onDidContentSizeChange(() => {\n // Clear any pending update\n if (updateTimeoutRef.current) {\n clearTimeout(updateTimeoutRef.current);\n }\n\n // Debounce updates to prevent rapid-fire recalculations\n updateTimeoutRef.current = setTimeout(() => {\n updateHeight();\n updateTimeoutRef.current = null;\n }, 150);\n });\n\n // Store disposable for cleanup\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (editor as any).__heightDisposable = disposable;\n },\n [enabled, defaultHeight, updateHeight],\n );\n\n return [height, setEditor];\n}\n","import { createContext, useContext, useRef } from 'react';\n\nexport interface GridHeightContextValue {\n registerBox: (id: number, height: number) => void;\n unregisterBox: (id: number) => void;\n getBoxId: () => number;\n syncedHeight: number | null;\n enabled: boolean;\n}\n\nexport const GridHeightContext = createContext<GridHeightContextValue | null>(\n null,\n);\n\nexport function useGridHeight(): GridHeightContextValue | null {\n return useContext(GridHeightContext);\n}\n\nlet nextBoxId = 0;\nexport function useBoxId(): number {\n const idRef = useRef<number | null>(null);\n if (idRef.current === null) {\n idRef.current = nextBoxId++;\n }\n return idRef.current;\n}\n","import React, { useRef, useState, useEffect, useCallback, useMemo } from 'react';\nimport {\n GridHeightContext,\n type GridHeightContextValue,\n} from '../../contexts/GridHeightContext';\n\nexport interface GridProps {\n children: React.ReactNode;\n columns?: number;\n minBoxWidth?: number | string;\n gap?: number | string;\n rowHeight?: 'auto' | 'equal' | 'synced' | number;\n maxRowHeight?: number | string | 'none';\n showScrollButtons?: boolean;\n className?: string;\n}\n\n/**\n * Grid - Horizontal scrolling layout component for arranging boxes\n *\n * Provides consistent grid layout for box components with horizontal\n * scrolling when content exceeds available space. Boxes maintain minimum\n * width and never wrap to new rows.\n *\n * @example\n * // 5 boxes with default 350px minimum width\n * <Grid columns={5}>\n * <CodeBox ... />\n * <CodeBox ... />\n * <CodeBox ... />\n * <CodeBox ... />\n * <CodeBox ... />\n * </Grid>\n *\n * @example\n * // Custom minimum box width\n * <Grid columns={3} minBoxWidth={400}>\n * <BrowserBox ... />\n * <CodeBox ... />\n * <CodeBox ... />\n * </Grid>\n *\n * @example\n * // Custom row height\n * <Grid columns={2} rowHeight={300}>\n * <CodeBox ... />\n * <CodeBox ... />\n * </Grid>\n *\n * @example\n * // Auto row height (no minimum)\n * <Grid columns={3} rowHeight=\"auto\">\n * <CodeBox ... />\n * </Grid>\n *\n * @example\n * // Unlimited row height (no max constraint)\n * <Grid columns={2} maxRowHeight=\"none\">\n * <PropertyTable ... />\n * <CodeBox ... />\n * </Grid>\n *\n * @example\n * // Custom max row height\n * <Grid columns={2} maxRowHeight={800}>\n * <PropertyTable ... />\n * <CodeBox ... />\n * </Grid>\n */\nexport function Grid({\n children,\n columns,\n minBoxWidth,\n gap,\n rowHeight = 'equal',\n maxRowHeight,\n showScrollButtons = true,\n className = '',\n}: GridProps) {\n const gridRef = useRef<HTMLDivElement>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n\n const [boxHeights, setBoxHeights] = useState<Map<number, number>>(new Map());\n const boxIdCounter = useRef(0);\n\n const getBoxId = useCallback(() => boxIdCounter.current++, []);\n\n const registerBox = useCallback((id: number, height: number) => {\n setBoxHeights((prev) => {\n const next = new Map(prev);\n next.set(id, height);\n return next;\n });\n }, []);\n\n const unregisterBox = useCallback((id: number) => {\n setBoxHeights((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const syncedHeight = useMemo(() => {\n if (rowHeight !== 'synced' || boxHeights.size === 0) return null;\n return Math.min(600, Math.max(...Array.from(boxHeights.values())));\n }, [boxHeights, rowHeight]);\n\n const contextValue: GridHeightContextValue = useMemo(\n () => ({\n registerBox,\n unregisterBox,\n getBoxId,\n syncedHeight,\n enabled: rowHeight === 'synced',\n }),\n [registerBox, unregisterBox, getBoxId, syncedHeight, rowHeight],\n );\n\n const classNames = ['elb-explorer-grid'];\n const gridStyle: React.CSSProperties = {};\n\n // Row height modifiers\n if (rowHeight === 'auto') {\n classNames.push('elb-explorer-grid--row-auto');\n } else if (rowHeight === 'equal') {\n classNames.push('elb-explorer-grid--row-equal');\n } else if (rowHeight === 'synced') {\n classNames.push('elb-explorer-grid--row-synced');\n } else if (typeof rowHeight === 'number') {\n // Apply custom row height via CSS variable\n (gridStyle as Record<string, string>)['--grid-row-min-height'] = `${rowHeight}px`;\n (gridStyle as Record<string, string>)['--grid-row-max-height'] = `${rowHeight}px`;\n }\n\n // Add custom className\n if (className) {\n classNames.push(className);\n }\n\n // Apply custom gap if provided\n if (gap !== undefined) {\n gridStyle.gap = typeof gap === 'number' ? `${gap}px` : gap;\n }\n\n // Apply custom minimum box width if provided\n if (minBoxWidth !== undefined) {\n (gridStyle as Record<string, string>)['--grid-min-box-width'] =\n typeof minBoxWidth === 'number' ? `${minBoxWidth}px` : minBoxWidth;\n }\n\n if (maxRowHeight !== undefined) {\n // Warn about dangerous configuration that can cause infinite growth\n if (\n maxRowHeight === 'none' &&\n rowHeight !== 'auto' &&\n rowHeight !== 'synced'\n ) {\n console.warn(\n 'Grid: maxRowHeight=\"none\" without rowHeight=\"auto\" or \"synced\" can cause infinite growth loops. ' +\n 'This occurs when boxes try to fill the grid row (height: 100%) while the grid tries to fit box content. ' +\n 'Consider using rowHeight=\"synced\" or setting a specific maxRowHeight value (e.g., 800).',\n );\n }\n\n (gridStyle as Record<string, string>)['--grid-row-max-height'] =\n maxRowHeight === 'none'\n ? 'none'\n : typeof maxRowHeight === 'number'\n ? `${maxRowHeight}px`\n : maxRowHeight;\n }\n\n // Check scroll state\n const updateScrollState = useCallback(() => {\n const el = gridRef.current;\n if (!el) return;\n\n const hasOverflow = el.scrollWidth > el.clientWidth;\n const isAtStart = el.scrollLeft <= 1;\n const isAtEnd = el.scrollLeft + el.clientWidth >= el.scrollWidth - 1;\n\n setCanScrollLeft(hasOverflow && !isAtStart);\n setCanScrollRight(hasOverflow && !isAtEnd);\n }, []);\n\n // Scroll handlers\n const scrollLeft = () => {\n if (!gridRef.current) return;\n const scrollAmount = gridRef.current.clientWidth * 0.8;\n gridRef.current.scrollBy({ left: -scrollAmount, behavior: 'smooth' });\n };\n\n const scrollRight = () => {\n if (!gridRef.current) return;\n const scrollAmount = gridRef.current.clientWidth * 0.8;\n gridRef.current.scrollBy({ left: scrollAmount, behavior: 'smooth' });\n };\n\n // Update scroll state on mount, scroll, and resize\n useEffect(() => {\n const el = gridRef.current;\n if (!el || !showScrollButtons) return;\n\n updateScrollState();\n\n el.addEventListener('scroll', updateScrollState);\n window.addEventListener('resize', updateScrollState);\n\n return () => {\n el.removeEventListener('scroll', updateScrollState);\n window.removeEventListener('resize', updateScrollState);\n };\n }, [updateScrollState, showScrollButtons]);\n\n return (\n <GridHeightContext.Provider value={contextValue}>\n <div className=\"elb-explorer elb-explorer-grid-wrapper\">\n {showScrollButtons && canScrollLeft && (\n <button\n className=\"elb-explorer-grid-scroll-button elb-explorer-grid-scroll-button--left\"\n onClick={scrollLeft}\n aria-label=\"Scroll left\"\n type=\"button\"\n >\n ‹\n </button>\n )}\n\n <div ref={gridRef} className={classNames.join(' ')} style={gridStyle}>\n {children}\n </div>\n\n {showScrollButtons && canScrollRight && (\n <button\n className=\"elb-explorer-grid-scroll-button elb-explorer-grid-scroll-button--right\"\n onClick={scrollRight}\n aria-label=\"Scroll right\"\n type=\"button\"\n >\n ›\n </button>\n )}\n </div>\n </GridHeightContext.Provider>\n );\n}\n","import React, { useState, useCallback, useEffect } from 'react';\nimport { getMappingEvent, getMappingValue, createEvent } from '@walkeros/core';\nimport type { Mapping, WalkerOS } from '@walkeros/core';\nimport { CodeBox } from '../molecules/code-box';\nimport { Grid } from '../atoms/grid';\n\nexport interface MappingCodeProps {\n input: string;\n config?: string;\n labelInput?: string;\n labelOutput?: string;\n}\n\n/**\n * MappingCode - Specialized component for walkerOS mapping demonstrations\n *\n * Similar to LiveCode but specifically for mapping transformations.\n * Shows input code and output result side-by-side with built-in mapping logic.\n *\n * Props:\n * - input: Code string to execute (can use await getMappingEvent, getMappingValue)\n * - config: Optional mapping configuration JSON\n * - labelInput: Label for input editor (default: \"Configuration\")\n * - labelOutput: Label for output display (default: \"Result\")\n *\n * Example:\n * ```tsx\n * <MappingCode\n * input={`await getMappingEvent(\n * { name: 'product view' },\n * {\n * product: {\n * view: { name: 'product_viewed' }\n * }\n * }\n * );`}\n * />\n * ```\n */\n\nexport function MappingCode({\n input: initialInput,\n config,\n labelInput = 'Configuration',\n labelOutput = 'Result',\n}: MappingCodeProps) {\n const [input, setInput] = useState(initialInput);\n const [output, setOutput] = useState('');\n\n const executeCode = useCallback(async () => {\n try {\n // Wrap input in async function and execute\n const asyncFunction = new Function(\n 'getMappingEvent',\n 'getMappingValue',\n 'createEvent',\n `return (async () => {\n return ${input}\n })();`,\n );\n\n const result = await asyncFunction(\n getMappingEvent,\n getMappingValue,\n createEvent,\n );\n\n setOutput(JSON.stringify(result, null, 2));\n } catch (error) {\n setOutput(\n `Error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }, [input, config]);\n\n useEffect(() => {\n const timeoutId = setTimeout(executeCode, 500);\n return () => clearTimeout(timeoutId);\n }, [executeCode]);\n\n return (\n <Grid columns={2}>\n <CodeBox\n label={labelInput}\n code={input}\n onChange={setInput}\n language=\"javascript\"\n />\n <CodeBox label={labelOutput} code={output} disabled language=\"json\" />\n </Grid>\n );\n}\n","import React, { useState, useCallback, useEffect } from 'react';\nimport type { WalkerOS, Mapping, Destination } from '@walkeros/core';\nimport {\n createEvent,\n tryCatchAsync,\n processEventMapping,\n} from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport { CodeBox } from '../molecules/code-box';\nimport { Grid } from '../atoms/grid';\nimport { captureDestinationPush } from '../../helpers/capture';\n\nexport interface DestinationDemoProps {\n destination: Destination.Instance;\n event: WalkerOS.PartialEvent;\n mapping?: Mapping.Rule | string;\n settings?: unknown;\n generic?: boolean; // When true, wraps mapping in '*': { '*': mapping }\n labelEvent?: string;\n labelMapping?: string;\n labelOutput?: string;\n fn?: (\n event: WalkerOS.Event,\n context: Destination.PushContext,\n ) => Promise<string>; // Custom output function\n}\n\n/**\n * DestinationDemo - Interactive destination testing component\n *\n * Automatically captures destination.push() calls and displays the output.\n * The component auto-detects the destination's env from destination.examples.env.push.\n *\n * Props:\n * - destination: Destination instance with examples.env.push export\n * - event: walkerOS event to process\n * - mapping: Optional mapping rules\n * - settings: Destination-specific settings\n * - generic: If true, wraps mapping in { '*': { '*': mapping } }\n * - labelEvent: Label for event panel (default: 'Event')\n * - labelMapping: Label for mapping panel (default: 'Mapping')\n * - labelOutput: Label for output panel (default: 'Result')\n *\n * Example:\n * ```tsx\n * import destinationPlausible from '@walkeros/web-destination-plausible';\n * import { examples } from '@walkeros/web-destination-plausible';\n * import { getEvent } from '@walkeros/core';\n *\n * const destination = { ...destinationPlausible, examples };\n *\n * <DestinationDemo\n * destination={destination}\n * event={getEvent('order complete')}\n * mapping={examples.mapping.purchase}\n * settings={{ domain: 'elbwalker.com' }}\n * generic={true}\n * />\n * ```\n */\n\n// Generic capture function creator\nexport function createCaptureFn(\n fnName: string,\n onCapture: (output: string) => void,\n) {\n return (...args: unknown[]) => {\n const formattedArgs = args\n .map((arg) => {\n if (typeof arg === 'string') return `\"${arg}\"`;\n return JSON.stringify(arg, null, 2);\n })\n .join(', ');\n\n onCapture(`${fnName}(${formattedArgs});`);\n };\n}\n\nexport function DestinationDemo({\n destination,\n event: initialEvent,\n mapping: initialMapping = {},\n settings,\n generic = false,\n labelEvent = 'Event',\n labelMapping = 'Mapping',\n labelOutput = 'Result',\n fn,\n}: DestinationDemoProps) {\n const [eventInput, setEventInput] = useState(\n JSON.stringify(initialEvent, null, 2),\n );\n const [mappingInput, setMappingInput] = useState(\n typeof initialMapping === 'string'\n ? initialMapping\n : JSON.stringify(initialMapping, null, 2),\n );\n const [output, setOutput] = useState('');\n\n const executeDestination = useCallback(async () => {\n await tryCatchAsync(\n async () => {\n const eventData = JSON.parse(eventInput);\n const mappingData = JSON.parse(mappingInput);\n const event = createEvent(eventData);\n\n // Wrap mapping in generic structure if requested\n const wrappedMapping =\n generic && mappingData ? { '*': { '*': mappingData } } : mappingData;\n\n // Build config\n const config: Destination.Config = {\n settings: settings || {},\n mapping: wrappedMapping,\n };\n\n // Create minimal collector for mapping processing\n const { collector } = await startFlow({});\n\n // Process event mapping (applies mapping transformations)\n const processed = await processEventMapping(event, config, collector);\n\n // Build context for destination.push()\n const context: Destination.PushContext = {\n collector,\n config,\n data: processed.data,\n mapping: processed.mapping,\n env: destination.env || {},\n };\n\n // If custom function provided, use it\n if (fn) {\n const result = await fn(processed.event, context);\n setOutput(result);\n return;\n }\n\n // Auto-detect destination.examples.env.push (for push method)\n const destinationEnv = (destination as { examples?: { env?: { push?: unknown } } }).examples?.env?.push;\n\n // Use captureDestinationPush to automatically capture output\n const captureFn = captureDestinationPush(destination, destinationEnv);\n const result = await captureFn(processed.event, context);\n setOutput(result);\n },\n (error) => setOutput(`Error: ${error}`),\n )();\n }, [eventInput, mappingInput, destination, settings, generic, fn]);\n\n useEffect(() => {\n const timeoutId = setTimeout(executeDestination, 500);\n return () => clearTimeout(timeoutId);\n }, [executeDestination]);\n\n return (\n <Grid columns={3} rowHeight=\"synced\">\n <CodeBox\n label={labelEvent}\n code={eventInput}\n onChange={setEventInput}\n language=\"json\"\n showFormat\n autoHeight\n />\n <CodeBox\n label={labelMapping}\n code={mappingInput}\n onChange={setMappingInput}\n language=\"json\"\n showFormat\n autoHeight\n />\n <CodeBox\n label={labelOutput}\n code={output}\n disabled\n language=\"javascript\"\n autoHeight\n />\n </Grid>\n );\n}\n","import { mockEnv, Destination, WalkerOS } from '@walkeros/core';\n\n/**\n * Formats captured function calls for display\n *\n * @param calls - Array of captured calls with path and args\n * @param defaultMessage - Message to show when no calls captured\n * @returns Formatted string of function calls\n *\n * @example\n * formatCapturedCalls([\n * { path: ['window', 'gtag'], args: ['config', 'G-XXX'] }\n * ])\n * // Returns: \"gtag('config', 'G-XXX');\"\n */\nexport function formatCapturedCalls(\n calls: Array<{ path: string[]; args: unknown[] }>,\n defaultMessage = 'No function calls captured',\n): string {\n if (calls.length === 0) return defaultMessage;\n\n return calls\n .map(({ path, args }) => {\n const functionName = path[path.length - 1];\n const formattedArgs = args\n .map((arg) => {\n if (typeof arg === 'string') return `'${arg}'`;\n if (typeof arg === 'object' && arg !== null)\n return JSON.stringify(arg, null, 2);\n return String(arg);\n })\n .join(', ');\n return `${functionName}(${formattedArgs});`;\n })\n .join('\\n\\n');\n}\n\n/**\n * Creates a capture function for destination init method\n * Uses walkerOS core mockEnv to intercept function calls\n *\n * @param destination - Destination instance with init method\n * @param destinationEnv - Destination's exported env (usually examples.env.push)\n * @returns Async function that executes init and returns formatted output\n *\n * @example\n * import destinationGtag, { examples } from '@walkeros/web-destination-gtag';\n *\n * const captureFn = captureDestinationInit(destinationGtag, examples.env.push);\n *\n * // Use in DestinationInitDemo\n * <DestinationInitDemo\n * destination={destinationGtag}\n * settings={{ measurementId: 'G-XXX' }}\n * fn={captureFn}\n * />\n */\nexport function captureDestinationInit(\n destination: Destination.Instance,\n destinationEnv: unknown,\n) {\n return async (context: Destination.Context): Promise<string> => {\n if (!destination.init) {\n return 'No init method found';\n }\n\n const calls: Array<{ path: string[]; args: unknown[] }> = [];\n\n // Use walkerOS core mockEnv to intercept all function calls\n const testEnv = mockEnv(\n (destinationEnv || {}) as Record<string, unknown>,\n (path, args) => {\n calls.push({ path, args });\n },\n );\n\n await destination.init({ ...context, env: testEnv } as Destination.InitContext);\n\n return formatCapturedCalls(calls, 'Destination initialized successfully');\n };\n}\n\n/**\n * Creates a capture function for destination push method\n * Uses walkerOS core mockEnv to intercept function calls\n *\n * @param destination - Destination instance with push method\n * @param destinationEnv - Destination's exported env (usually examples.env.push)\n * @returns Async function that executes push and returns formatted output\n *\n * @example\n * import destinationGtag, { examples } from '@walkeros/web-destination-gtag';\n * import { getEvent } from '@walkeros/core';\n *\n * const captureFn = captureDestinationPush(destinationGtag, examples.env.push);\n *\n * // Use in DestinationDemo\n * <DestinationDemo\n * destination={destinationGtag}\n * event={getEvent('order complete')}\n * mapping={examples.mapping.purchase}\n * fn={captureFn}\n * />\n */\nexport function captureDestinationPush(\n destination: Destination.Instance,\n destinationEnv: unknown,\n) {\n return async (\n event: WalkerOS.Event,\n context: Destination.PushContext,\n ): Promise<string> => {\n const calls: Array<{ path: string[]; args: unknown[] }> = [];\n\n // Use walkerOS core mockEnv to intercept all function calls\n const testEnv = mockEnv(\n (destinationEnv || {}) as Record<string, unknown>,\n (path, args) => {\n calls.push({ path, args });\n },\n );\n\n // Call the real destination push with intercepted env\n await destination.push(event, { ...context, env: testEnv });\n\n return formatCapturedCalls(calls);\n };\n}\n\n/**\n * Advanced: Creates a raw capture function that returns call data\n * Use this when you need custom formatting or processing of calls\n *\n * @param destinationEnv - Destination's exported env\n * @returns Function that returns both env and getCalls function\n *\n * @example\n * const { env, getCalls } = createRawCapture(examples.env.push);\n * await destination.init({ ...context, env });\n * const calls = getCalls();\n * // Process calls as needed\n */\nexport function createRawCapture(destinationEnv: unknown) {\n const calls: Array<{ path: string[]; args: unknown[] }> = [];\n\n const testEnv = mockEnv(\n (destinationEnv || {}) as Record<string, unknown>,\n (path, args) => {\n calls.push({ path, args });\n },\n );\n\n return {\n env: testEnv,\n getCalls: () => calls,\n };\n}\n","import React, { useState, useCallback, useEffect } from 'react';\nimport type { Destination } from '@walkeros/core';\nimport { tryCatchAsync } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport { CodeBox } from '../molecules/code-box';\nimport { Grid } from '../atoms/grid';\nimport { captureDestinationInit } from '../../helpers/capture';\n\nexport interface DestinationInitDemoProps {\n destination: Destination.Instance;\n settings?: unknown;\n labelSettings?: string;\n labelOutput?: string;\n}\n\n/**\n * DestinationInitDemo - Interactive destination initialization testing component\n *\n * Automatically captures destination.init() calls and displays the output.\n * The component auto-detects the destination's env from destination.examples.env.init.\n *\n * Props:\n * - destination: Destination instance with examples.env.init export\n * - settings: Initial destination-specific settings\n * - labelSettings: Label for settings panel (default: 'Settings')\n * - labelOutput: Label for output panel (default: 'Result')\n *\n * Example:\n * ```tsx\n * import destinationGtag from '@walkeros/web-destination-gtag';\n * import { examples } from '@walkeros/web-destination-gtag';\n *\n * const destination = { ...destinationGtag, examples };\n *\n * <DestinationInitDemo\n * destination={destination}\n * settings={{ ga4: { measurementId: 'G-XXXXXXXXXX' } }}\n * />\n * ```\n */\nexport function DestinationInitDemo({\n destination,\n settings: initialSettings = {},\n labelSettings = 'Settings',\n labelOutput = 'Result',\n}: DestinationInitDemoProps) {\n const [settingsInput, setSettingsInput] = useState(\n typeof initialSettings === 'string'\n ? initialSettings\n : JSON.stringify(initialSettings, null, 2),\n );\n const [output, setOutput] = useState('');\n\n const executeInit = useCallback(async () => {\n await tryCatchAsync(\n async () => {\n const settingsData = JSON.parse(settingsInput);\n\n // Build config\n const config: Destination.Config = {\n settings: settingsData,\n };\n\n // Create minimal collector\n const { collector } = await startFlow({});\n\n // Build context for destination.init()\n const context: Destination.Context = {\n collector,\n config,\n env: destination.env || {},\n };\n\n if (!destination.init) {\n setOutput('No init method defined for this destination');\n return;\n }\n\n // Auto-detect destination.examples.env.init (for init method)\n const destinationEnv = (destination as { examples?: { env?: { init?: unknown } } }).examples?.env?.init;\n\n // Use captureDestinationInit to automatically capture output\n const captureFn = captureDestinationInit(destination, destinationEnv);\n const result = await captureFn(context);\n setOutput(result);\n },\n (error) => setOutput(`Error: ${error}`),\n )();\n }, [settingsInput, destination]);\n\n useEffect(() => {\n const timeoutId = setTimeout(executeInit, 500);\n return () => clearTimeout(timeoutId);\n }, [executeInit]);\n\n return (\n <Grid columns={2} rowHeight=\"synced\">\n <CodeBox\n label={labelSettings}\n code={settingsInput}\n onChange={setSettingsInput}\n language=\"json\"\n showFormat\n autoHeight\n />\n <CodeBox\n label={labelOutput}\n code={output}\n disabled\n language=\"javascript\"\n autoHeight\n />\n </Grid>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport type { WalkerOS } from '@walkeros/core';\nimport { Box } from '../atoms/box';\nimport { Grid } from '../atoms/grid';\nimport { Preview } from '../molecules/preview';\nimport { BrowserBox } from '../organisms/browser-box';\nimport { CodeBox } from '../molecules/code-box';\nimport { CollectorBox } from '../organisms/collector-box';\nimport {\n createGtagDestination,\n type DestinationCode,\n} from '../../helpers/destinations';\n\nexport interface PromotionPlaygroundProps {\n initialHtml?: string;\n initialCss?: string;\n initialJs?: string;\n initialMapping?: string;\n labelCode?: string;\n labelPreview?: string;\n labelEvents?: string;\n labelMapping?: string;\n labelResult?: string;\n destination?: DestinationCode;\n}\n\nconst defaultHtml = `<div\n data-elb=\"product\"\n data-elbaction=\"load:view\"\n data-elbcontext=\"stage:inspire\"\n class=\"product-card\"\n>\n <figure class=\"product-figure\">\n <div class=\"product-badge-container\">\n <div data-elb-product=\"badge:delicious\" class=\"product-badge\">delicious</div>\n </div>\n </figure>\n <div class=\"product-body\">\n <h3 data-elb-product=\"name:#innerText\" class=\"product-title\">\n Everyday Ruck Snack\n </h3>\n <div class=\"form-control\">\n <label class=\"form-label\">Taste</label>\n <select\n data-elb-product=\"taste:#value\"\n class=\"form-select\"\n >\n <option value=\"sweet\">Sweet</option>\n <option value=\"spicy\">Spicy</option>\n </select>\n </div>\n <p data-elb-product=\"price:2.50\" class=\"product-price\">\n € 2.50 <span data-elb-product=\"old_price:3.14\" class=\"product-old-price\">€ 3.14</span>\n </p>\n <div data-elbcontext=\"stage:hooked\" class=\"product-actions\">\n <button\n data-elbaction=\"click:save\"\n class=\"btn btn-secondary\"\n >\n Maybe later\n </button>\n <button\n data-elbaction=\"click:add\"\n class=\"btn btn-primary\"\n >\n Add to Cart\n </button>\n </div>\n </div>\n</div>`;\n\nconst defaultCss = `* {\n box-sizing: border-box;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n}\n\n.product-card {\n width: 100%;\n max-width: 400px;\n margin: 0 auto;\n background: #ffffff;\n border-radius: 16px;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n overflow: hidden;\n}\n\n.product-figure {\n position: relative;\n margin: 0;\n padding: 0;\n width: 100%;\n height: 160px;\n background:\n linear-gradient(135deg, rgba(243, 244, 246, 0.9) 0%, rgba(229, 231, 235, 0.9) 100%),\n repeating-linear-gradient(\n 45deg,\n #f9fafb,\n #f9fafb 10px,\n #f3f4f6 10px,\n #f3f4f6 20px\n );\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.product-figure::before {\n content: '🍟';\n font-size: 8rem;\n opacity: 0.8;\n}\n\n.product-badge-container {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n}\n\n.product-badge {\n background: #01b5e2;\n color: white;\n padding: 0.25rem 0.75rem;\n border-radius: 9999px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n}\n\n.product-body {\n padding: 1.5rem;\n}\n\n.product-title {\n font-size: 1.125rem;\n font-weight: 700;\n margin: 0 0 1rem 0;\n color: #111827;\n}\n\n.form-control {\n margin-bottom: 1rem;\n}\n\n.form-label {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n color: #6b7280;\n margin-bottom: 0.5rem;\n}\n\n.form-select {\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: 1px solid #d1d5db;\n border-radius: 8px;\n font-size: 0.875rem;\n color: #111827;\n background: white;\n cursor: pointer;\n transition: border-color 0.2s;\n}\n\n.form-select:hover {\n border-color: #9ca3af;\n}\n\n.form-select:focus {\n outline: none;\n border-color: #01b5e2;\n box-shadow: 0 0 0 3px rgba(1, 181, 226, 0.1);\n}\n\n.product-price {\n font-size: 1.25rem;\n font-weight: 700;\n color: #111827;\n margin: 0 0 1rem 0;\n}\n\n.product-old-price {\n font-size: 1rem;\n font-weight: 400;\n color: #9ca3af;\n text-decoration: line-through;\n margin-left: 0.5rem;\n}\n\n.product-actions {\n display: flex;\n justify-content: space-between;\n gap: 0.5rem;\n}\n\n.btn {\n flex: 1;\n padding: 0.75rem 1rem;\n border: none;\n border-radius: 8px;\n font-size: 0.875rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n text-align: center;\n}\n\n.btn:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n}\n\n.btn:active {\n transform: translateY(0);\n}\n\n.btn-primary {\n background: #01b5e2;\n color: white;\n}\n\n.btn-primary:hover {\n background: #0195b8;\n}\n\n.btn-secondary {\n background: #ffffff;\n color: #01b5e2;\n border: 1px solid #01b5e2;\n}\n\n.btn-secondary:hover {\n background: #01b5e2;\n color: #ffffff;\n}`;\n\nconst defaultMapping = `{\n \"product\": {\n \"view\": {\n \"name\": \"view_item\",\n \"data\": {\n \"map\": {\n \"event\": \"name\",\n \"price\": \"data.price\",\n \"stage\": \"context.stage.0\"\n }\n }\n },\n \"add\": {\n \"name\": \"add_to_cart\",\n \"data\": {\n \"map\": {\n \"event\": \"event\",\n \"price\": \"data.price\",\n \"user\": {\n \"consent\": { \"marketing\": true },\n \"key\": \"user.session\"\n },\n \"isSale\": {\n \"fn\": \"(e) => !!e.data.old_price\"\n }\n }\n }\n },\n \"save\": {\n \"data\": {\n \"map\": {\n \"event\": \"event\",\n \"data\": \"data\"\n }\n }\n }\n }\n}`;\n\n/**\n * PromotionPlayground - Full walkerOS demonstration with live code editing\n *\n * Shows the complete chain:\n * 1. Code Editor - Edit HTML/CSS/JS with walkerOS data attributes\n * 2. Preview - Live rendered output that captures real events\n * 3. Events - Real events captured from preview interactions\n * 4. Mapping - Apply transformations and see destination output\n * 5. Result - Final destination function calls\n */\nexport function PromotionPlayground({\n initialHtml = defaultHtml,\n initialCss = defaultCss,\n initialJs = '',\n initialMapping = defaultMapping,\n labelCode = 'Code',\n labelPreview = 'Preview',\n labelEvents = 'Events',\n labelMapping = 'Mapping',\n labelResult = 'Result',\n destination = createGtagDestination(),\n}: PromotionPlaygroundProps) {\n const [html, setHtml] = useState(initialHtml);\n const [css, setCss] = useState(initialCss);\n const [js, setJs] = useState(initialJs);\n const [mappingInput, setMappingInput] = useState(initialMapping);\n const [capturedEvent, setCapturedEvent] = useState<WalkerOS.Event | null>(\n null,\n );\n\n // Handle events from preview\n const handleEvent = useCallback((event: WalkerOS.Event) => {\n setCapturedEvent(event);\n }, []);\n\n const eventDisplay = capturedEvent\n ? JSON.stringify(capturedEvent, null, 2)\n : '// Click elements in the preview to see events';\n\n return (\n <Grid columns={5} rowHeight={600}>\n {/* Column 1: Code Editor with HTML/CSS/JS tabs */}\n <BrowserBox\n label={labelCode}\n html={html}\n css={css}\n js={js}\n onHtmlChange={setHtml}\n onCssChange={setCss}\n onJsChange={setJs}\n showPreview={false}\n initialTab=\"html\"\n lineNumbers={false}\n wordWrap\n />\n\n {/* Column 2: Preview */}\n <Preview\n label={labelPreview}\n html={html}\n css={css}\n onEvent={handleEvent}\n />\n\n {/* Column 3: Events */}\n <CodeBox\n label={labelEvents}\n code={eventDisplay}\n disabled\n language=\"json\"\n wordWrap\n />\n\n {/* Column 4: Mapping */}\n <CodeBox\n label={labelMapping}\n code={mappingInput}\n onChange={setMappingInput}\n language=\"json\"\n wordWrap\n />\n\n {/* Column 5: Result */}\n <CollectorBox\n event={capturedEvent ? JSON.stringify(capturedEvent) : '{}'}\n mapping={mappingInput}\n destination={destination}\n label={labelResult}\n wordWrap\n />\n </Grid>\n );\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport type { WalkerOS, Elb, Collector, Source } from '@walkeros/core';\nimport { sourceBrowser } from '@walkeros/web-source-browser';\nimport { Box } from '../atoms/box';\nimport { PreviewFooter } from '../atoms/preview-footer';\n\nexport interface PreviewProps {\n html: string;\n css?: string;\n onEvent?: (event: WalkerOS.Event) => void;\n label?: string;\n}\n\n/**\n * Preview - HTML preview wrapped in a Box with highlight buttons\n *\n * Renders HTML in an isolated iframe with highlight buttons footer.\n * When onEvent is provided, initializes walkerOS browser source in iframe.\n *\n * @example\n * // Read-only preview\n * <Preview html={html} css={css} label=\"Preview\" />\n *\n * // Interactive preview with event capture\n * <Preview html={html} css={css} onEvent={(event) => console.log(event)} label=\"Preview\" />\n */\nexport function Preview({ html, css = '', onEvent, label = 'Preview' }: PreviewProps) {\n const [highlights, setHighlights] = useState<Set<string>>(new Set());\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const updateTimeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);\n const onEventRef = useRef(onEvent);\n const sourceInstanceRef = useRef<Source.Instance | null>(null);\n\n // Keep onEventRef in sync\n useEffect(() => {\n onEventRef.current = onEvent;\n }, [onEvent]);\n\n const toggleHighlight = (type: string) => {\n setHighlights((prev) => {\n const next = new Set(prev);\n if (next.has(type)) {\n next.delete(type);\n } else {\n next.add(type);\n }\n return next;\n });\n };\n\n const autoMarkProperties = useCallback(\n (container: HTMLElement | Document) => {\n const entities = container.querySelectorAll('[data-elb]');\n entities.forEach((entity) => {\n const entityName = entity.getAttribute('data-elb');\n if (!entityName) return;\n\n const propertySelector = `[data-elb-${entityName}]`;\n entity.querySelectorAll(propertySelector).forEach((el) => {\n el.setAttribute('data-elbproperty', '');\n });\n });\n },\n [],\n );\n\n useEffect(() => {\n if (updateTimeoutRef.current) {\n clearTimeout(updateTimeoutRef.current);\n }\n\n updateTimeoutRef.current = setTimeout(() => {\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentDocument) return;\n\n const doc = iframe.contentDocument;\n const highlightClasses = Array.from(highlights)\n .map((type) => `highlight-${type}`)\n .join(' ');\n\n doc.open();\n doc.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <style>\n /* Reset */\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n padding: 1.5rem;\n background: #f9fafb;\n color: #111827;\n min-height: 100vh;\n }\n\n @media (prefers-color-scheme: dark) {\n body {\n background: #1f2937;\n color: #e5e7eb;\n }\n }\n\n /* User CSS */\n ${css}\n\n /* Highlight CSS - imported from highlight styles */\n :root {\n --highlight-globals: #4fc3f7cc;\n --highlight-context: #ffbd44cc;\n --highlight-entity: #00ca4ecc;\n --highlight-property: #ff605ccc;\n --highlight-action: #9900ffcc;\n }\n\n body.elb-highlight.highlight-entity [data-elb] {\n box-shadow: 0 0 0 2px var(--highlight-entity);\n }\n\n body.elb-highlight.highlight-context [data-elbcontext] {\n box-shadow: 0 0 0 2px var(--highlight-context);\n }\n\n body.elb-highlight.highlight-property [data-elbproperty] {\n box-shadow: 0 0 0 2px var(--highlight-property);\n }\n\n body.elb-highlight.highlight-action [data-elbaction] {\n box-shadow: 0 0 0 2px var(--highlight-action);\n }\n\n /* Combined highlights */\n body.elb-highlight.highlight-entity.highlight-action [data-elb][data-elbaction] {\n box-shadow: 0 0 0 2px var(--highlight-action), 0 0 0 4px var(--highlight-entity);\n }\n\n body.elb-highlight.highlight-entity.highlight-context [data-elb][data-elbcontext] {\n box-shadow: 0 0 0 2px var(--highlight-entity), 0 0 0 4px var(--highlight-context);\n }\n\n body.elb-highlight.highlight-action.highlight-context [data-elbaction][data-elbcontext] {\n box-shadow: 0 0 0 2px var(--highlight-action), 0 0 0 4px var(--highlight-context);\n }\n </style>\n </head>\n <body class=\"elb-highlight ${highlightClasses}\">\n ${html}\n </body>\n </html>\n `);\n doc.close();\n\n autoMarkProperties(doc);\n\n // Initialize browser source in iframe\n if (\n onEventRef.current &&\n iframe.contentWindow &&\n iframe.contentDocument\n ) {\n setTimeout(async () => {\n // Cleanup previous source instance\n if (sourceInstanceRef.current) {\n try {\n await sourceInstanceRef.current.destroy?.();\n } catch (e) {\n // Ignore cleanup errors\n }\n }\n\n try {\n if (!iframe.contentWindow || !iframe.contentDocument) return;\n\n // Create elb function that satisfies Elb.Fn interface\n const elbFn: Elb.Fn = ((...args: unknown[]) => {\n // Handle event push - first arg is the event or command\n const [first] = args;\n if (onEventRef.current && first && typeof first === 'object') {\n onEventRef.current(first as WalkerOS.Event);\n }\n return Promise.resolve({ ok: true });\n }) as Elb.Fn;\n\n // Initialize browser source directly in iframe\n // Note: contentWindow type doesn't match `Window & typeof globalThis` exactly,\n // but it has all the required properties for the browser source to work\n const sourceInstance = await sourceBrowser(\n {\n settings: {\n pageview: true,\n session: false,\n prefix: 'data-elb',\n elb: 'elb',\n elbLayer: 'elbLayer',\n },\n },\n {\n elb: elbFn,\n // Required by Source.BaseEnv but not used in preview context\n push: elbFn,\n command: (() =>\n Promise.resolve({\n ok: true,\n successful: [],\n queued: [],\n failed: [],\n })) as Collector.CommandFn,\n window: iframe.contentWindow as Window & typeof globalThis,\n document: iframe.contentDocument,\n },\n );\n\n sourceInstanceRef.current = sourceInstance;\n\n // Call walker init to trigger detection of load/visible actions\n // This is crucial for events with load: or visible: triggers to fire\n if (sourceInstance.push && iframe.contentDocument?.body) {\n await sourceInstance.push('walker init', {\n scope: iframe.contentDocument.body,\n });\n }\n } catch (error) {\n // Browser source initialization failed - silently ignore in preview context\n // Error is expected in test/iframe environments\n }\n }, 50);\n }\n }, 200);\n\n return () => {\n if (updateTimeoutRef.current) {\n clearTimeout(updateTimeoutRef.current);\n }\n\n // Cleanup source instance\n if (sourceInstanceRef.current) {\n sourceInstanceRef.current.destroy?.();\n }\n };\n }, [html, css, highlights, autoMarkProperties]);\n\n return (\n <Box\n header={label}\n footer={<PreviewFooter highlights={highlights} onToggle={toggleHighlight} />}\n >\n <div className=\"elb-preview-content\">\n <iframe\n ref={iframeRef}\n className=\"elb-preview-iframe\"\n title=\"HTML Preview\"\n />\n </div>\n </Box>\n );\n}\n","import React from 'react';\n\nexport interface PreviewFooterButton {\n type: string;\n label: string;\n highlightClass: string;\n}\n\nexport interface PreviewFooterProps {\n highlights: Set<string>;\n onToggle: (type: string) => void;\n buttons?: PreviewFooterButton[];\n}\n\nconst defaultButtons: PreviewFooterButton[] = [\n { type: 'context', label: 'Context', highlightClass: 'highlight-context' },\n { type: 'entity', label: 'Entity', highlightClass: 'highlight-entity' },\n { type: 'property', label: 'Property', highlightClass: 'highlight-property' },\n { type: 'action', label: 'Action', highlightClass: 'highlight-action' },\n];\n\n/**\n * PreviewFooter - Footer with highlight toggle buttons\n *\n * Renders a set of buttons to toggle highlighting of walkerOS data attributes.\n * Designed to be used with Box footer prop for preview components.\n *\n * @example\n * const [highlights, setHighlights] = useState<Set<string>>(new Set());\n * const handleToggle = (type: string) => {\n * setHighlights(prev => {\n * const next = new Set(prev);\n * next.has(type) ? next.delete(type) : next.add(type);\n * return next;\n * });\n * };\n *\n * <Box footer={<PreviewFooter highlights={highlights} onToggle={handleToggle} />}>\n * Preview content\n * </Box>\n */\nexport function PreviewFooter({\n highlights,\n onToggle,\n buttons = defaultButtons,\n}: PreviewFooterProps) {\n return (\n <div className=\"elb-preview-footer\">\n {buttons.map((button) => (\n <button\n key={button.type}\n className={`elb-preview-btn ${\n highlights.has(button.type) ? button.highlightClass : ''\n }`}\n onClick={() => onToggle(button.type)}\n type=\"button\"\n >\n {button.label}\n </button>\n ))}\n </div>\n );\n}\n","import React, { useState, useMemo } from 'react';\nimport { Box } from '../atoms/box';\nimport { ButtonGroup } from '../atoms/button-group';\nimport { Preview } from '../molecules/preview';\nimport { Code } from '../atoms/code';\n\nexport interface BrowserBoxProps {\n html?: string;\n css?: string;\n js?: string;\n onHtmlChange?: (value: string) => void;\n onCssChange?: (value: string) => void;\n onJsChange?: (value: string) => void;\n showPreview?: boolean;\n label?: string;\n className?: string;\n initialTab?: 'preview' | 'html' | 'css' | 'js';\n lineNumbers?: boolean;\n wordWrap?: boolean;\n}\n\n/**\n * BrowserBox - Code editor with HTML/CSS/JS toggle\n *\n * Displays code editor with button group to switch between HTML, CSS, and JavaScript.\n * Only shows tabs for content that is provided.\n *\n * @example\n * <BrowserBox\n * html={htmlCode}\n * css={cssCode}\n * onHtmlChange={setHtml}\n * onCssChange={setCss}\n * label=\"Code\"\n * />\n */\nexport function BrowserBox({\n html,\n css,\n js,\n onHtmlChange,\n onCssChange,\n onJsChange,\n showPreview = true,\n label = 'Code',\n className = '',\n initialTab,\n lineNumbers = false,\n wordWrap = false,\n}: BrowserBoxProps) {\n // Determine available tabs\n const availableTabs = useMemo(() => {\n const tabs: Array<{ label: string; value: string }> = [];\n if (showPreview && html !== undefined)\n tabs.push({ label: 'Preview', value: 'preview' });\n if (html !== undefined) tabs.push({ label: 'HTML', value: 'html' });\n if (css !== undefined) tabs.push({ label: 'CSS', value: 'css' });\n if (js !== undefined) tabs.push({ label: 'JS', value: 'js' });\n return tabs;\n }, [html, css, js, showPreview]);\n\n // Set initial active tab\n const [activeTab, setActiveTab] = useState<string>(() => {\n if (initialTab && availableTabs.some((t) => t.value === initialTab)) {\n return initialTab;\n }\n return availableTabs[0]?.value || 'preview';\n });\n\n // Get current content and language\n const { content, language, onChange } = useMemo(() => {\n switch (activeTab) {\n case 'html':\n return {\n content: html || '',\n language: 'html' as const,\n onChange: onHtmlChange,\n };\n case 'css':\n return {\n content: css || '',\n language: 'css' as const,\n onChange: onCssChange,\n };\n case 'js':\n return {\n content: js || '',\n language: 'javascript' as const,\n onChange: onJsChange,\n };\n default:\n return {\n content: '',\n language: 'text' as const,\n onChange: undefined,\n };\n }\n }, [activeTab, html, css, js, onHtmlChange, onCssChange, onJsChange]);\n\n // Build button group data\n const buttons = useMemo(\n () =>\n availableTabs.map((tab) => ({\n label: tab.label,\n value: tab.value,\n active: activeTab === tab.value,\n })),\n [availableTabs, activeTab],\n );\n\n return (\n <Box\n header={label}\n headerActions={\n availableTabs.length > 1 ? (\n <ButtonGroup buttons={buttons} onButtonClick={setActiveTab} />\n ) : null\n }\n className={className}\n >\n {activeTab === 'preview' ? (\n <Preview html={html || ''} css={css || ''} />\n ) : (\n <Code\n code={content}\n language={language}\n onChange={onChange}\n disabled={!onChange}\n lineNumbers={lineNumbers}\n wordWrap={wordWrap}\n />\n )}\n </Box>\n );\n}\n","import React from 'react';\n\nexport interface ButtonProps {\n active?: boolean;\n onClick?: () => void;\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * Button - Button component for headers and controls\n *\n * Used in button groups or standalone in headers.\n * Follows atomic design principles as a base atom.\n */\nexport function Button({\n active = false,\n onClick,\n children,\n className = '',\n}: ButtonProps) {\n return (\n <button\n className={`elb-explorer-btn ${active ? 'active' : ''} ${className}`}\n onClick={onClick}\n type=\"button\"\n >\n {children}\n </button>\n );\n}\n","import React from 'react';\nimport { Button } from './button';\n\nexport interface ButtonGroupProps {\n buttons: Array<{\n label: string;\n value: string;\n active?: boolean;\n }>;\n onButtonClick: (value: string) => void;\n className?: string;\n}\n\n/**\n * ButtonGroup - Segmented control for headers\n *\n * Displays multiple buttons in a grouped segmented control style.\n * Commonly used for tab switching (HTML/CSS/JS, etc.)\n */\nexport function ButtonGroup({\n buttons,\n onButtonClick,\n className = '',\n}: ButtonGroupProps) {\n return (\n <div className={`elb-explorer-button-group ${className}`}>\n {buttons.map((button) => (\n <Button\n key={button.value}\n active={button.active}\n onClick={() => onButtonClick(button.value)}\n >\n {button.label}\n </Button>\n ))}\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { startFlow } from '@walkeros/collector';\nimport type { DestinationCode } from '../../helpers/destinations';\nimport { CodeBox } from '../molecules/code-box';\n\nexport interface CollectorBoxProps {\n event: string;\n mapping: string;\n destination: DestinationCode;\n label?: string;\n wordWrap?: boolean;\n}\n\n/**\n * CollectorBox - Runs a collector with destination to transform events\n *\n * Takes raw event and mapping config, processes through collector pipeline,\n * and displays the formatted destination output.\n *\n * @example\n * <CollectorBox\n * event={JSON.stringify(event)}\n * mapping={mappingConfig}\n * destination={createGtagDestination()}\n * label=\"Result\"\n * />\n */\nexport function CollectorBox({\n event,\n mapping,\n destination,\n label = 'Result',\n wordWrap = false,\n}: CollectorBoxProps) {\n const [output, setOutput] = useState(\n '// Click elements in the preview to see function call',\n );\n\n useEffect(() => {\n (async () => {\n try {\n // Parse inputs\n const eventObj = JSON.parse(event);\n const mappingObj = JSON.parse(mapping);\n\n // Create collector with destination\n const { collector } = await startFlow({\n destinations: {\n demo: {\n code: destination,\n config: {\n mapping: mappingObj,\n },\n env: {\n elb: setOutput,\n },\n },\n },\n });\n\n // Push event through collector → destination\n await collector.push(eventObj);\n } catch (error) {\n if (error instanceof Error) {\n setOutput(`// Error: ${error.message}`);\n } else {\n setOutput(`// Error: ${String(error)}`);\n }\n }\n })();\n }, [event, mapping, destination]);\n\n return (\n <CodeBox\n code={output}\n language=\"javascript\"\n disabled\n label={label}\n wordWrap={wordWrap}\n />\n );\n}\n","import type { Destination, WalkerOS } from '@walkeros/core';\n\n// Demo destination type with elb function in env\nexport interface DemoEnv extends Destination.BaseEnv {\n elb: (output: string) => void;\n}\n\nexport type DestinationCode = Destination.Instance<\n Destination.Types<unknown, unknown, DemoEnv>\n>;\n\n/**\n * Creates a gtag-style destination for demo purposes.\n * Formats output as: gtag('event', 'event_name', { data })\n */\nexport function createGtagDestination(): DestinationCode {\n return {\n type: 'gtag',\n config: {},\n push(event, context) {\n const { data, mapping, env } = context;\n const name = mapping?.name || event.name;\n\n const formatted = `gtag('event', '${name}', ${JSON.stringify(data, null, 2)});`;\n env.elb(formatted);\n },\n };\n}\n\n/**\n * Creates a Facebook Pixel-style destination for demo purposes.\n * Formats output as: fbq('track', 'EventName', { data })\n */\nexport function createFbqDestination(): DestinationCode {\n return {\n type: 'fbq',\n config: {},\n push(event, context) {\n const { data, mapping, env } = context;\n const name = mapping?.name || event.name;\n\n const formatted = `fbq('track', '${name}', ${JSON.stringify(data, null, 2)});`;\n env.elb(formatted);\n },\n };\n}\n\n/**\n * Creates a Plausible-style destination for demo purposes.\n * Formats output as: plausible('event_name', { props: { data } })\n */\nexport function createPlausibleDestination(): DestinationCode {\n return {\n type: 'plausible',\n config: {},\n push(event, context) {\n const { data, mapping, env } = context;\n const name = mapping?.name || event.name;\n\n const formatted = `plausible('${name}', { props: ${JSON.stringify(data, null, 2)} });`;\n env.elb(formatted);\n },\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { WalkerOS } from '@walkeros/core';\nimport { debounce, isString, tryCatchAsync } from '@walkeros/core';\nimport { CodeBox } from '../molecules/code-box';\nimport { Grid } from '../atoms/grid';\nimport { cn } from '@/lib/utils';\n\nexport interface LiveCodeProps {\n input: unknown;\n config?: unknown;\n output?: unknown;\n options?: WalkerOS.AnyObject;\n fn?: (\n input: unknown,\n config: unknown,\n log: (...args: unknown[]) => void,\n options?: WalkerOS.AnyObject,\n ) => Promise<void>;\n fnName?: string;\n labelInput?: string;\n labelConfig?: string;\n labelOutput?: string;\n emptyText?: string;\n disableInput?: boolean;\n disableConfig?: boolean;\n showQuotes?: boolean;\n className?: string;\n}\n\nfunction formatValue(value: unknown, options: { quotes?: boolean } = {}) {\n if (value === undefined) return '';\n const str = isString(value) ? value : JSON.stringify(value, null, 2);\n return options.quotes && isString(value) ? `\"${str}\"` : str;\n}\n\nexport function LiveCode({\n input: initInput,\n config: initConfig,\n output: initOutput = '',\n options,\n fn,\n fnName,\n labelInput = 'Event',\n labelConfig = 'Config',\n labelOutput = 'Result',\n emptyText = 'No event yet.',\n disableInput = false,\n disableConfig = false,\n showQuotes = true,\n className,\n}: LiveCodeProps) {\n const [input, setInput] = useState(formatValue(initInput));\n const [config, setConfig] = useState(formatValue(initConfig));\n const [output, setOutput] = useState([formatValue(initOutput)]);\n\n const log = useCallback(\n (...args: unknown[]) => {\n const params = args\n .map((arg) => formatValue(arg, { quotes: showQuotes }))\n .join(', ');\n setOutput([fnName ? `${fnName}(${params})` : params]);\n },\n [fnName, showQuotes],\n );\n\n const updateOutput = useCallback(\n debounce(\n async (inputStr: string, configStr: string, opts: WalkerOS.AnyObject) => {\n if (!fn) return;\n setOutput([]);\n await tryCatchAsync(fn, (e) => {\n setOutput([`Error: ${String(e)}`]);\n })(inputStr, configStr, log, opts);\n },\n 500,\n true,\n ),\n [fn, log],\n );\n\n useEffect(() => {\n updateOutput(input, config, options || {});\n }, [input, config, options, updateOutput]);\n\n return (\n <Grid columns={3} className={className}>\n <CodeBox\n label={labelInput}\n code={input}\n onChange={disableInput ? undefined : setInput}\n disabled={disableInput}\n language=\"json\"\n showFormat={!disableInput}\n />\n\n {config && (\n <CodeBox\n label={labelConfig}\n code={config}\n onChange={disableConfig ? undefined : setConfig}\n disabled={disableConfig}\n language=\"json\"\n showFormat={!disableConfig}\n />\n )}\n\n <CodeBox\n label={labelOutput}\n code={output[0] || emptyText}\n disabled\n language=\"json\"\n />\n </Grid>\n );\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport { Box } from '../../atoms/box';\nimport { ButtonGroup } from '../../atoms/button-group';\nimport { CodeBox } from '../../molecules/code-box';\nimport { ConfigEditorTabs, type NavigationState } from './config-editor-tabs';\nimport type { ConfigStructureDef } from '../../../schemas/config-structures/types';\nimport type { RJSFSchema } from '@rjsf/utils';\n\n/**\n * Config Editor Box\n *\n * Wrapper component that provides Code/Visual toggle.\n * Persists navigation state when switching between views.\n *\n * @example\n * <ConfigEditorBox\n * config={destinationConfig}\n * onChange={setConfig}\n * structure={DESTINATION_CONFIG_STRUCTURE}\n * schemas={metaSchemas}\n * label=\"Meta Pixel Configuration\"\n * />\n */\nexport interface ConfigEditorBoxProps<T extends Record<string, unknown>> {\n config: T;\n onChange?: (config: T) => void;\n structure: ConfigStructureDef;\n schemas?: Record<string, RJSFSchema>;\n sections?: Record<string, boolean>;\n label?: string;\n className?: string;\n initialTab?: 'code' | 'visual';\n resizable?: boolean;\n showTree?: boolean;\n showHeader?: boolean;\n initialNavigationState?: NavigationState;\n onNavigationStateChange?: (state: NavigationState) => void;\n}\n\nexport function ConfigEditorBox<T extends Record<string, unknown>>({\n config,\n onChange,\n structure,\n schemas,\n sections,\n label = 'Configuration',\n className = '',\n initialTab = 'visual',\n resizable = false,\n showTree = true,\n showHeader = true,\n initialNavigationState,\n onNavigationStateChange,\n}: ConfigEditorBoxProps<T>) {\n const [activeTab, setActiveTab] = useState<'code' | 'visual'>(initialTab);\n\n // Persist navigation state across view switches\n const [persistedNavigationState, setPersistedNavigationState] =\n useState<NavigationState | null>(initialNavigationState || null);\n\n // Convert config to JSON string\n const configJson = useMemo(() => JSON.stringify(config, null, 2), [config]);\n\n // Build button group data\n const buttons = useMemo(\n () => [\n {\n label: 'Visual',\n value: 'visual',\n active: activeTab === 'visual',\n },\n {\n label: 'Code',\n value: 'code',\n active: activeTab === 'code',\n },\n ],\n [activeTab],\n );\n\n // Handle tab change\n const handleTabChange = (value: string) => {\n setActiveTab(value as 'code' | 'visual');\n };\n\n // Handle code changes\n const handleCodeChange = (newCode: string) => {\n if (!onChange) return;\n\n try {\n const newConfig = JSON.parse(newCode);\n onChange(newConfig);\n } catch (e) {\n // Invalid JSON - ignore (expected during editing)\n }\n };\n\n // Handle navigation state persistence\n // Memoize to prevent infinite re-render loop in useEffect dependencies\n const handleNavigationChange = useCallback(\n (state: NavigationState) => {\n setPersistedNavigationState(state);\n onNavigationStateChange?.(state);\n },\n [onNavigationStateChange],\n );\n\n return (\n <Box\n header={label}\n headerActions={\n showHeader ? (\n <ButtonGroup buttons={buttons} onButtonClick={handleTabChange} />\n ) : undefined\n }\n className={className}\n resizable={resizable}\n showHeader={showHeader}\n >\n {activeTab === 'code' ? (\n <CodeBox\n code={configJson}\n language=\"json\"\n label={label}\n disabled={!onChange}\n onChange={onChange ? handleCodeChange : undefined}\n />\n ) : (\n <ConfigEditorTabs\n config={config}\n onChange={onChange}\n structure={structure}\n schemas={schemas}\n sections={sections}\n showTree={showTree}\n initialNavigationState={persistedNavigationState || undefined}\n onNavigationStateChange={handleNavigationChange}\n />\n )}\n </Box>\n );\n}\n","import { useEffect, useState, useMemo } from 'react';\nimport type { Destination } from '@walkeros/core';\nimport {\n useMappingState,\n type UseMappingStateReturn,\n} from '../../../hooks/useMappingState';\nimport {\n useMappingNavigation,\n type NodeType,\n} from '../../../hooks/useMappingNavigation';\nimport { useTreeState } from '../../../hooks/useTreeState';\nimport { MappingNavigationHeader } from '../../molecules/mapping-navigation-header';\nimport { ConfigTreeSidebar } from '../../molecules/config-tree-sidebar';\nimport { MappingPane } from '../../molecules/mapping-pane';\nimport { ConfigOverviewPane } from '../../molecules/config-overview-pane';\nimport { ValidationOverviewPane } from '../../molecules/validation-overview-pane';\nimport { CodeBox } from '../../molecules/code-box';\nimport { getValueAtPath } from '../../../utils/mapping-path';\nimport type { ConfigStructureDef } from '../../../schemas/config-structures/types';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport { buildTree } from '../../../utils/generic-tree-builder';\nimport { detectNodeType } from '../../../utils/type-detector';\nimport { validateConfig } from '../../../utils/config-validator';\n\n/**\n * Generic Config Editor Tabs\n *\n * Core editor component that works with any config type at any depth.\n * Uses structure definitions and schemas to provide appropriate editing UI.\n *\n * Features:\n * - Generic tree navigation (config-driven)\n * - Structure-aware type detection\n * - Validation with error overview\n * - Code/Visual toggle support\n * - Works at any depth (full config or nested object)\n *\n * @example\n * // Full DestinationConfig\n * <ConfigEditorTabs\n * config={destinationConfig}\n * onChange={setConfig}\n * structure={DESTINATION_CONFIG_STRUCTURE}\n * schemas={{ settings: settingsSchema, mapping: mappingSchema }}\n * />\n *\n * @example\n * // Single Rule\n * <ConfigEditorTabs\n * config={ruleConfig}\n * onChange={setRuleConfig}\n * structure={MAPPING_RULE_STRUCTURE}\n * schemas={{ mapping: mappingSettingsSchema }}\n * />\n */\nexport interface ConfigEditorTabsProps<T extends Record<string, unknown>> {\n config: T;\n onChange?: (config: T) => void;\n structure: ConfigStructureDef;\n schemas?: Record<string, RJSFSchema>;\n sections?: Record<string, boolean>;\n showTree?: boolean;\n initialNavigationState?: NavigationState;\n onNavigationStateChange?: (state: NavigationState) => void;\n className?: string;\n}\n\nexport interface NavigationState {\n currentPath: string[];\n nodeType: NodeType;\n expandedPaths: string[][];\n}\n\nexport function ConfigEditorTabs<T extends Record<string, unknown>>({\n config,\n onChange,\n structure,\n schemas,\n sections = {},\n showTree = true,\n initialNavigationState,\n onNavigationStateChange,\n className = '',\n}: ConfigEditorTabsProps<T>) {\n const mappingState = useMappingState(config as Destination.Config, onChange as ((config: Destination.Config) => void) | undefined);\n const navigation = useMappingNavigation({\n config,\n structure,\n schemas,\n });\n const treeState = useTreeState(initialNavigationState?.expandedPaths || [[]]);\n const [codeViewActive, setCodeViewActive] = useState(false);\n\n // Build tree using unified tree builder\n const configTree = useMemo(\n () => buildTree(config, structure, schemas, sections),\n [config, structure, schemas, sections],\n );\n\n // Validate config\n const validationErrors = useMemo(\n () => validateConfig(config as Record<string, unknown>, schemas),\n [config, schemas],\n );\n\n // Get active tab\n const activeTab = navigation.openTabs.find(\n (tab) => tab.id === navigation.activeTabId,\n );\n\n // Get code for current path\n const currentCode = useMemo(() => {\n if (!activeTab || activeTab.path.length === 0) {\n return JSON.stringify(config, null, 2);\n }\n\n const value = getValueAtPath(\n config as Record<string, unknown>,\n activeTab.path,\n );\n return JSON.stringify(value, null, 2);\n }, [activeTab, config]);\n\n // Handle code changes\n const handleCodeChange = (code: string) => {\n if (!onChange) return;\n\n try {\n const parsed = JSON.parse(code);\n\n if (!activeTab || activeTab.path.length === 0) {\n onChange(parsed as T);\n } else {\n const newConfig = { ...config };\n let current: Record<string, unknown> = newConfig as Record<string, unknown>;\n\n // Navigate to parent\n for (let i = 0; i < activeTab.path.length - 1; i++) {\n current = current[activeTab.path[i]] as Record<string, unknown>;\n }\n\n // Update value\n current[activeTab.path[activeTab.path.length - 1]] = parsed;\n onChange(newConfig);\n }\n } catch (e) {\n // Invalid JSON, don't update\n }\n };\n\n // Initialize navigation history with Overview\n useEffect(() => {\n if (navigation.navigationHistory.length === 0) {\n navigation.switchToTab('');\n\n if (\n initialNavigationState &&\n initialNavigationState.currentPath.length > 0\n ) {\n navigation.openTab(\n initialNavigationState.currentPath,\n initialNavigationState.nodeType,\n );\n }\n }\n }, []);\n\n // Persist navigation state changes\n useEffect(() => {\n if (onNavigationStateChange && activeTab) {\n onNavigationStateChange({\n currentPath: activeTab.path,\n nodeType: activeTab.nodeType,\n expandedPaths: Array.from(treeState.expandedPaths).map((key) =>\n key.split('.'),\n ),\n });\n }\n }, [activeTab, treeState.expandedPaths, onNavigationStateChange]);\n\n // Auto-expand tree to show active tab path\n useEffect(() => {\n if (activeTab && activeTab.path.length > 0) {\n for (let i = 1; i <= activeTab.path.length; i++) {\n const pathToExpand = activeTab.path.slice(0, i);\n treeState.expandPath(pathToExpand);\n }\n }\n }, [activeTab?.id]);\n\n // Get NodeType for a path using structure\n const getNodeTypeForPath = (path: string[]): NodeType => {\n const value = mappingState.actions.getValue(path);\n return detectNodeType(value, path, structure, schemas);\n };\n\n return (\n <div\n className={`elb-mapping-editor-tabs elb-mapping-editor-tabs--responsive ${className}`}\n data-layout=\"responsive\"\n >\n {/* Tree Sidebar */}\n {showTree && (\n <>\n <div\n className=\"elb-mapping-editor-mobile-backdrop\"\n onClick={() => navigation.setTreeVisible(false)}\n aria-hidden=\"true\"\n />\n <ConfigTreeSidebar\n tree={configTree}\n currentPath={activeTab?.path || []}\n expandedPaths={treeState.expandedPaths}\n visible={navigation.treeVisible}\n onToggle={treeState.togglePath}\n onNavigate={(path) => {\n const nodeType = getNodeTypeForPath(path);\n navigation.openTab(path, nodeType);\n }}\n onClose={() => navigation.setTreeVisible(false)}\n className=\"elb-mapping-editor-sidebar\"\n />\n </>\n )}\n\n {/* Main Editor Area */}\n <div className=\"elb-mapping-editor-main\">\n {/* Navigation Header */}\n <MappingNavigationHeader\n breadcrumb={navigation.breadcrumb}\n paneType={codeViewActive ? undefined : activeTab?.nodeType}\n showTreeButton={showTree}\n showCodeButton={!!activeTab}\n codeViewActive={codeViewActive}\n showDeleteButton={activeTab && activeTab.path.length > 0}\n validationErrors={validationErrors.length}\n onNavigate={(path) => {\n if (path.length === 0) {\n navigation.closeAllTabs();\n } else {\n navigation.navigateToBreadcrumb(path);\n }\n }}\n onToggleTree={navigation.toggleTree}\n onToggleCode={() => setCodeViewActive(!codeViewActive)}\n onValidationClick={() => {\n navigation.openTab([], 'validationOverview' as NodeType);\n }}\n onDeleteClick={() => {\n if (activeTab) {\n const path = activeTab.path;\n mappingState.actions.deleteValue(path);\n\n if (path.length > 1) {\n // Navigate to parent\n const parentPath = path.slice(0, -1);\n const parentType = getNodeTypeForPath(parentPath);\n navigation.openTab(parentPath, parentType);\n } else {\n // Close tab\n navigation.closeTab(activeTab.id);\n }\n }\n }}\n />\n\n {/* Editor Pane */}\n <div className=\"elb-mapping-editor-content\">\n {codeViewActive ? (\n <CodeBox\n code={currentCode}\n language=\"json\"\n label=\"\"\n onChange={onChange ? handleCodeChange : undefined}\n showFormat={!!onChange}\n showHeader={false}\n />\n ) : activeTab ? (\n activeTab.nodeType === 'validationOverview' ? (\n <ValidationOverviewPane\n errors={validationErrors}\n navigation={navigation}\n config={config}\n structure={structure}\n schemas={schemas}\n />\n ) : (\n <MappingPane\n nodeType={activeTab.nodeType}\n path={activeTab.path}\n mappingState={mappingState}\n navigation={navigation}\n schemas={schemas as Record<string, RJSFSchema>}\n structure={structure}\n />\n )\n ) : (\n <ConfigOverviewPane\n config={config}\n structure={structure}\n navigation={navigation}\n schemas={schemas}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { Mapping } from '@walkeros/core';\nimport {\n getValueAtPath,\n setValueAtPath,\n deleteAtPath,\n parseRulePath,\n buildRulePath,\n} from '../utils/mapping-path';\n\n/**\n * Centralized mapping configuration state management\n *\n * This hook provides a single source of truth for the entire mapping config.\n * All CRUD operations go through this hook, making state management predictable\n * and testable.\n *\n * Features:\n * - Path-based value access and mutation\n * - Rule CRUD operations\n * - Immutable updates (no direct mutations)\n * - Change callback for external synchronization\n *\n * @example\n * const mappingState = useMappingState(initialMapping);\n *\n * // Read\n * const rule = mappingState.getValueAtPath(['product', 'view']);\n *\n * // Update\n * mappingState.setValueAtPath(['product', 'view', 'name'], 'view_item');\n *\n * // Delete\n * mappingState.deleteRule('product', 'view');\n */\nexport function useMappingState(\n initialMapping: Mapping.Config,\n onChange?: (config: Mapping.Config) => void,\n) {\n const [config, setConfig] = useState<Mapping.Config>(initialMapping);\n\n // Track if onChange callback is currently being fired to prevent loops\n const isCallingOnChange = useRef(false);\n\n /**\n * Internal state updater that also triggers onChange callback\n */\n const updateConfig = useCallback(\n (newConfig: Mapping.Config) => {\n setConfig(newConfig);\n\n // Call onChange if provided and not already in callback\n if (onChange && !isCallingOnChange.current) {\n isCallingOnChange.current = true;\n onChange(newConfig);\n isCallingOnChange.current = false;\n }\n },\n [onChange],\n );\n\n /**\n * Get value at path\n */\n const getValue = useCallback(\n (path: string[]) => {\n return getValueAtPath(config, path);\n },\n [config],\n );\n\n /**\n * Set value at path (immutable update)\n */\n const setValue = useCallback(\n (path: string[], value: unknown) => {\n const newConfig = setValueAtPath(config, path, value) as Mapping.Config;\n updateConfig(newConfig);\n },\n [config, updateConfig],\n );\n\n /**\n * Delete value at path (immutable delete)\n */\n const deleteValue = useCallback(\n (path: string[]) => {\n const newConfig = deleteAtPath(config, path) as Mapping.Config;\n updateConfig(newConfig);\n },\n [config, updateConfig],\n );\n\n /**\n * Get list of all rules in format \"entity action\"\n */\n const getRuleList = useCallback((): string[] => {\n const rules: string[] = [];\n const configRecord = config as Record<string, Record<string, unknown>>;\n\n Object.keys(config).forEach((entity) => {\n const actions = configRecord[entity] as\n | Record<string, unknown>\n | undefined;\n if (actions && typeof actions === 'object') {\n Object.keys(actions).forEach((action) => {\n rules.push(buildRulePath(entity, action));\n });\n }\n });\n\n return rules.sort();\n }, [config]);\n\n /**\n * Get rule configuration\n */\n const getRule = useCallback(\n (entity: string, action: string) => {\n return getValue([entity, action]);\n },\n [getValue],\n );\n\n /**\n * Create new rule with default configuration\n */\n const createRule = useCallback(\n (entity: string, action: string, initialConfig?: unknown) => {\n const path = [entity, action];\n\n // Check if rule already exists\n if (getValue(path)) {\n console.warn(`Rule \"${entity} ${action}\" already exists`);\n return;\n }\n\n // Default config: just the name field\n const defaultConfig = initialConfig || {\n name: `${entity}_${action}`,\n };\n\n // Create entity object if it doesn't exist\n let newConfig = config;\n const configRecord = newConfig as Record<string, Record<string, unknown>>;\n if (!configRecord[entity]) {\n newConfig = { ...newConfig, [entity]: {} };\n }\n\n // Add the rule\n newConfig = setValueAtPath(\n newConfig,\n path,\n defaultConfig,\n ) as Mapping.Config;\n updateConfig(newConfig);\n },\n [config, getValue, updateConfig],\n );\n\n /**\n * Delete rule\n */\n const deleteRule = useCallback(\n (entity: string, action: string) => {\n let newConfig = deleteAtPath(config, [entity, action]) as Mapping.Config;\n\n // Remove entity if no actions left\n const configRecord = newConfig as Record<string, Record<string, unknown>>;\n const entityActions = configRecord[entity] as\n | Record<string, unknown>\n | undefined;\n if (entityActions && Object.keys(entityActions).length === 0) {\n newConfig = deleteAtPath(newConfig, [entity]) as Mapping.Config;\n }\n\n updateConfig(newConfig);\n },\n [config, updateConfig],\n );\n\n /**\n * Update entire config (for external changes)\n */\n const replaceConfig = useCallback(\n (newConfig: Mapping.Config) => {\n updateConfig(newConfig);\n },\n [updateConfig],\n );\n\n return {\n config,\n actions: {\n getValue,\n setValue,\n deleteValue,\n getRuleList,\n getRule,\n createRule,\n deleteRule,\n replaceConfig,\n },\n };\n}\n\n/**\n * Return type of useMappingState hook\n *\n * Provides centralized mapping state management with:\n * - config: Current mapping configuration\n * - actions: CRUD operations for mapping state\n *\n * @example\n * const mappingState: UseMappingStateReturn = useMappingState(initialConfig);\n */\nexport type UseMappingStateReturn = ReturnType<typeof useMappingState>;\n\n/**\n * @deprecated Use UseMappingStateReturn instead\n * This alias is kept for backward compatibility and will be removed in the next major version.\n */\nexport type MappingState = UseMappingStateReturn;\n","/**\n * Pure utility functions for mapping path navigation\n *\n * These functions handle:\n * - Path-based value extraction from nested objects\n * - Immutable path-based value updates\n * - Breadcrumb segment generation\n * - Rule path parsing (entity action format)\n * - Path validation and normalization\n *\n * All functions are pure (no side effects, no state, no UI)\n * Designed for maximum reusability across different UI implementations\n */\n\n/**\n * Extract value from nested object using path array\n *\n * @example\n * getValueAtPath({ data: { map: { items: 'value' } } }, ['data', 'map', 'items'])\n * // Returns: 'value'\n *\n * @example\n * getValueAtPath({ data: {} }, ['data', 'missing'])\n * // Returns: undefined\n */\nexport function getValueAtPath(obj: unknown, path: string[]): unknown {\n if (!obj || typeof obj !== 'object') return undefined;\n if (path.length === 0) return obj;\n\n let current: unknown = obj;\n\n for (const key of path) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== 'object') return undefined;\n\n current = (current as Record<string, unknown>)[key];\n }\n\n return current;\n}\n\n/**\n * Deep clone that preserves all value types including function strings\n *\n * In the explorer, functions are stored as strings (e.g., fn: \"(event) => event.data\")\n * so they need to be preserved during cloning operations.\n *\n * This implementation:\n * - Handles primitives, arrays, objects\n * - Preserves function strings\n * - Handles nested structures recursively\n * - Creates new object references (true immutability)\n */\nfunction deepClone<T>(obj: T): T {\n // Handle primitives and null\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as unknown as T;\n }\n\n // Handle objects\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n\n return cloned as T;\n}\n\n/**\n * Set value in nested object at path (immutable)\n *\n * Creates a new object with the value updated at the specified path.\n * Does not mutate the original object.\n *\n * @example\n * setValueAtPath({ data: { map: {} } }, ['data', 'map', 'items'], 'new')\n * // Returns: { data: { map: { items: 'new' } } }\n */\nexport function setValueAtPath(\n obj: unknown,\n path: string[],\n value: unknown,\n): unknown {\n if (!obj || typeof obj !== 'object') {\n throw new Error('Cannot set value on non-object');\n }\n\n if (path.length === 0) return value;\n\n // Deep clone for immutability\n const cloned = deepClone(obj);\n\n let current: Record<string, unknown> = cloned as Record<string, unknown>;\n\n // Navigate to parent of target\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n\n // Create missing intermediate objects\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n\n current = current[key] as Record<string, unknown>;\n }\n\n // Set the final value\n const lastKey = path[path.length - 1];\n current[lastKey] = value;\n\n return cloned;\n}\n\n/**\n * Delete value at path (immutable)\n *\n * Creates a new object with the key removed at the specified path.\n * Does not mutate the original object.\n *\n * @example\n * deleteAtPath({ data: { map: { items: 'value' } } }, ['data', 'map', 'items'])\n * // Returns: { data: { map: {} } }\n */\nexport function deleteAtPath(obj: unknown, path: string[]): unknown {\n if (!obj || typeof obj !== 'object') {\n throw new Error('Cannot delete from non-object');\n }\n\n if (path.length === 0) return undefined;\n\n const cloned = deepClone(obj);\n let current: Record<string, unknown> = cloned as Record<string, unknown>;\n\n // Navigate to parent\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (!current[key]) return cloned; // Path doesn't exist, return unchanged\n current = current[key] as Record<string, unknown>;\n }\n\n // Delete the final key\n const lastKey = path[path.length - 1];\n delete current[lastKey];\n\n return cloned;\n}\n\n/**\n * Parse rule path into entity and action\n *\n * WalkerOS uses \"ENTITY ACTION\" format with space separator\n *\n * @example\n * parseRulePath('product view')\n * // Returns: { entity: 'product', action: 'view' }\n *\n * @example\n * parseRulePath('invalid')\n * // Returns: { entity: 'invalid', action: undefined }\n */\nexport function parseRulePath(rulePath: string): {\n entity: string;\n action: string | undefined;\n} {\n const parts = rulePath\n .trim()\n .split(' ')\n .filter((p) => p.trim());\n\n if (parts.length < 2) {\n return { entity: parts[0] || '', action: undefined };\n }\n\n const [entity, ...actionParts] = parts;\n return { entity, action: actionParts.join(' ') };\n}\n\n/**\n * Build rule path from entity and action\n *\n * @example\n * buildRulePath('product', 'view')\n * // Returns: 'product view'\n */\nexport function buildRulePath(entity: string, action: string): string {\n return `${entity} ${action}`;\n}\n\n/**\n * Breadcrumb segment for UI display\n */\nexport interface BreadcrumbSegment {\n label: string;\n path: string[];\n nodeType?: string;\n}\n\n/**\n * Build breadcrumb segments from path\n *\n * Converts a flat path array into human-readable breadcrumb segments\n *\n * @example\n * buildBreadcrumbSegments(['product', 'view', 'data', 'map', 'items'])\n * // Returns: [\n * // { label: 'Overview', path: [] },\n * // { label: 'product', path: ['product'] },\n * // { label: 'view', path: ['product', 'view'] },\n * // { label: 'data', path: ['product', 'view', 'data'] },\n * // { label: 'map', path: ['product', 'view', 'data', 'map'] },\n * // { label: 'items', path: ['product', 'view', 'data', 'map', 'items'] }\n * // ]\n */\nexport function buildBreadcrumbSegments(path: string[]): BreadcrumbSegment[] {\n const segments: BreadcrumbSegment[] = [{ label: 'Overview', path: [] }];\n\n if (path.length === 0) return segments;\n\n for (let i = 0; i < path.length; i++) {\n segments.push({\n label: path[i],\n path: path.slice(0, i + 1),\n });\n }\n\n return segments;\n}\n\n/**\n * Validate if a path is valid for a mapping rule\n *\n * @example\n * isValidRulePath(['product', 'view'])\n * // Returns: true\n *\n * @example\n * isValidRulePath(['product'])\n * // Returns: false (missing action)\n */\nexport function isValidRulePath(path: string[]): boolean {\n if (path.length < 2) return false;\n\n const [entity, action] = path;\n if (!entity || !action) return false;\n if (typeof entity !== 'string' || typeof action !== 'string') return false;\n\n return true;\n}\n\n/**\n * Get parent path\n *\n * @example\n * getParentPath(['data', 'map', 'items'])\n * // Returns: ['data', 'map']\n *\n * @example\n * getParentPath(['data'])\n * // Returns: []\n *\n * @example\n * getParentPath([])\n * // Returns: []\n */\nexport function getParentPath(path: string[]): string[] {\n if (path.length === 0) return [];\n return path.slice(0, -1);\n}\n\n/**\n * Check if path is ancestor of another path\n *\n * @example\n * isAncestorPath(['data', 'map'], ['data', 'map', 'items'])\n * // Returns: true\n *\n * @example\n * isAncestorPath(['data', 'map'], ['data', 'set'])\n * // Returns: false\n */\nexport function isAncestorPath(\n ancestorPath: string[],\n descendantPath: string[],\n): boolean {\n // Empty path cannot be ancestor (even though technically it is)\n if (ancestorPath.length === 0) return false;\n if (ancestorPath.length >= descendantPath.length) return false;\n\n for (let i = 0; i < ancestorPath.length; i++) {\n if (ancestorPath[i] !== descendantPath[i]) return false;\n }\n\n return true;\n}\n\n/**\n * Normalize path by removing empty strings and trimming\n *\n * @example\n * normalizePath([' data ', '', 'map', ' items'])\n * // Returns: ['data', 'map', 'items']\n */\nexport function normalizePath(path: string[]): string[] {\n return path\n .filter((segment) => segment && segment.trim())\n .map((s) => s.trim());\n}\n","import { useState, useCallback } from 'react';\nimport { buildBreadcrumbSegments, getParentPath, getValueAtPath } from '../utils/mapping-path';\nimport type { BreadcrumbSegment } from '../utils/mapping-path';\nimport { detectNodeType } from '../utils/type-detector';\nimport type { ConfigStructureDef } from '../schemas/config-structures/types';\nimport type { RJSFSchema } from '@rjsf/utils';\n\n/**\n * Node types for different editing contexts\n */\nexport type NodeType =\n | 'entity'\n | 'rule'\n | 'name'\n | 'batch'\n | 'policy'\n | 'consent'\n | 'settings' // Config-level settings overview\n | 'options' // Config-level options (loadScript, queue, etc.)\n | 'validationOverview' // Validation errors overview\n | 'valueConfig'\n | 'valueType'\n | 'primitive' // Schema-defined string/number primitives (no ValueConfig conversion)\n | 'map'\n | 'loop'\n | 'set'\n | 'value'\n | 'fn'\n | 'validate'\n | 'condition'\n | 'enum'\n | 'boolean'\n | 'key';\n\n/**\n * Navigation tab representing an open editing context\n */\nexport interface NavigationTab {\n id: string;\n path: string[];\n nodeType: NodeType;\n label: string;\n}\n\n/**\n * Parameters for useMappingNavigation hook\n */\nexport interface UseMappingNavigationParams {\n config: unknown;\n structure: ConfigStructureDef;\n schemas?: Record<string, RJSFSchema>;\n}\n\n/**\n * Navigation state for tab-based mapping editor\n *\n * Manages:\n * - Open tabs with their paths and types\n * - Active tab selection\n * - Breadcrumb generation\n * - Tree sidebar visibility\n * - Tab opening/closing logic\n *\n * This hook is UI-agnostic - it only manages navigation state,\n * not how tabs are rendered.\n *\n * @example\n * const navigation = useMappingNavigation({\n * config: myConfig,\n * structure: MY_STRUCTURE,\n * schemas: mySchemas,\n * });\n *\n * // Open a new tab\n * navigation.openTab(['product', 'view', 'data'], 'valueConfig');\n *\n * // Switch tabs\n * navigation.switchToTab(tabId);\n *\n * // Close current level\n * navigation.closeLevel(); // Closes current tab and goes to parent\n */\nconst MAX_HISTORY_LENGTH = 50;\n\nexport function useMappingNavigation(params: UseMappingNavigationParams) {\n const { config, structure, schemas } = params;\n const [openTabs, setOpenTabs] = useState<NavigationTab[]>([]);\n const [activeTabId, setActiveTabId] = useState<string>('');\n const [treeVisible, setTreeVisible] = useState<boolean>(true);\n const [navigationHistory, setNavigationHistory] = useState<string[]>([]);\n\n /**\n * Generate unique tab ID from path\n */\n const generateTabId = useCallback((path: string[]): string => {\n return path.join('.');\n }, []);\n\n /**\n * Generate human-readable label from path\n */\n const generateLabel = useCallback(\n (path: string[], nodeType: NodeType): string => {\n if (path.length === 0) return 'Overview';\n\n // For rules, use \"entity action\" format\n if (path.length === 2 && nodeType === 'rule') {\n return `${path[0]} ${path[1]}`;\n }\n\n // For nested properties, use last segment capitalized\n const lastSegment = path[path.length - 1];\n return lastSegment.charAt(0).toUpperCase() + lastSegment.slice(1);\n },\n [],\n );\n\n /**\n * Find tab by ID\n */\n const findTab = useCallback(\n (tabId: string): NavigationTab | undefined => {\n return openTabs.find((tab) => tab.id === tabId);\n },\n [openTabs],\n );\n\n /**\n * Check if tab exists\n */\n const hasTab = useCallback(\n (path: string[]): boolean => {\n const tabId = generateTabId(path);\n return openTabs.some((tab) => tab.id === tabId);\n },\n [openTabs, generateTabId],\n );\n\n /**\n * Open new tab or switch to existing one\n */\n const openTab = useCallback(\n (path: string[], nodeType: NodeType) => {\n const tabId = generateTabId(path);\n\n // Check if tab exists and add/update if needed\n setOpenTabs((prev) => {\n const existingTab = prev.find((t) => t.id === tabId);\n if (existingTab) {\n // Update nodeType if it differs (allows refining type detection)\n if (existingTab.nodeType !== nodeType) {\n return prev.map((t) =>\n t.id === tabId ? { ...t, nodeType } : t\n );\n }\n return prev; // No change needed\n }\n\n // Create and add new tab\n const newTab: NavigationTab = {\n id: tabId,\n path,\n nodeType,\n label: generateLabel(path, nodeType),\n };\n\n return [...prev, newTab];\n });\n\n // Add to navigation history (only if switching to different tab)\n setNavigationHistory((prev) => {\n // Don't add if it's the same as current active tab\n if (prev.length > 0 && prev[prev.length - 1] === tabId) {\n return prev;\n }\n\n // Add and limit to MAX_HISTORY_LENGTH\n const newHistory = [...prev, tabId];\n if (newHistory.length > MAX_HISTORY_LENGTH) {\n return newHistory.slice(-MAX_HISTORY_LENGTH);\n }\n return newHistory;\n });\n\n // Always set as active (separate state update)\n setActiveTabId(tabId);\n },\n [generateTabId, generateLabel],\n );\n\n /**\n * Switch to existing tab\n */\n const switchToTab = useCallback((tabId: string) => {\n // Add to navigation history when switching tabs\n setNavigationHistory((prev) => {\n // Don't add if it's the same as current active tab\n if (prev.length > 0 && prev[prev.length - 1] === tabId) {\n return prev;\n }\n\n // Add and limit to MAX_HISTORY_LENGTH\n const newHistory = [...prev, tabId];\n if (newHistory.length > MAX_HISTORY_LENGTH) {\n return newHistory.slice(-MAX_HISTORY_LENGTH);\n }\n return newHistory;\n });\n\n setActiveTabId(tabId);\n }, []);\n\n /**\n * Close specific tab\n */\n const closeTab = useCallback(\n (tabId: string) => {\n // Determine new active ID based on what's left after closing\n let newActiveId = '';\n\n setOpenTabs((prev) => {\n const newTabs = prev.filter((tab) => tab.id !== tabId);\n\n // Check if the tab being closed exists and is the last one (likely active)\n const closingTab = prev.find((tab) => tab.id === tabId);\n const isLastTab = closingTab && prev[prev.length - 1]?.id === tabId;\n\n // If closing what's likely the active tab, switch to last remaining\n if (isLastTab || tabId === activeTabId) {\n if (newTabs.length > 0) {\n newActiveId = newTabs[newTabs.length - 1].id;\n } else {\n newActiveId = '';\n }\n } else {\n // Not closing active tab, keep current active\n newActiveId = activeTabId;\n }\n\n return newTabs;\n });\n\n // Update active tab\n setActiveTabId(newActiveId);\n },\n [activeTabId],\n );\n\n /**\n * Close current tab and return to parent\n *\n * If parent tab already exists, switches to it.\n * Otherwise just closes current tab.\n */\n const closeLevel = useCallback(() => {\n if (!activeTabId) return;\n\n const currentActiveId = activeTabId;\n\n // Determine what to do with active tab ID\n let newActiveId = '';\n setOpenTabs((prevTabs) => {\n const activeTab = prevTabs.find((t) => t.id === currentActiveId);\n if (!activeTab) {\n newActiveId = currentActiveId; // Keep current\n return prevTabs;\n }\n\n const parentPath = getParentPath(activeTab.path);\n const parentId = generateTabId(parentPath);\n\n // Check if parent tab exists\n const parentTab = prevTabs.find((t) => t.id === parentId);\n\n // Filter out current tab\n const newTabs = prevTabs.filter((t) => t.id !== currentActiveId);\n\n // Determine new active ID\n if (parentTab && parentPath.length >= 2) {\n newActiveId = parentId;\n } else if (newTabs.length > 0) {\n newActiveId = newTabs[newTabs.length - 1].id;\n } else {\n newActiveId = '';\n }\n\n return newTabs;\n });\n\n // Update active tab (separate state update)\n setActiveTabId(newActiveId);\n }, [activeTabId, generateTabId]);\n\n /**\n * Close all tabs\n */\n const closeAllTabs = useCallback(() => {\n setOpenTabs([]);\n setActiveTabId('');\n }, []);\n\n /**\n * Get breadcrumb for active tab\n */\n const getBreadcrumb = useCallback((): BreadcrumbSegment[] => {\n const activeTab = findTab(activeTabId);\n if (!activeTab) {\n return [{ label: 'Overview', path: [] }];\n }\n\n return buildBreadcrumbSegments(activeTab.path);\n }, [activeTabId, findTab]);\n\n /**\n * Navigate to breadcrumb segment\n */\n const navigateToBreadcrumb = useCallback(\n (segmentPath: string[]) => {\n if (segmentPath.length === 0) {\n closeAllTabs();\n return;\n }\n\n const value = getValueAtPath(config, segmentPath);\n const nodeType = detectNodeType(value, segmentPath, structure, schemas);\n openTab(segmentPath, nodeType);\n },\n [openTab, closeAllTabs, config, structure, schemas],\n );\n\n /**\n * Go back to previous tab in navigation history\n *\n * Validates that the previous tab still exists before navigating.\n * If deleted, keeps going back until a valid tab is found.\n * If no valid history, does nothing (button will be disabled).\n */\n const goBack = useCallback(() => {\n setNavigationHistory((prevHistory) => {\n if (prevHistory.length <= 1) {\n // No history to go back to\n return prevHistory;\n }\n\n // Remove current tab from history (last item)\n let workingHistory = prevHistory.slice(0, -1);\n let foundValidTab = false;\n\n // Keep popping until we find a valid tab or run out of history\n while (workingHistory.length > 0 && !foundValidTab) {\n const previousTabId = workingHistory[workingHistory.length - 1];\n\n // Special case: empty tab ID means Overview\n if (previousTabId === '') {\n setActiveTabId(''); // This will trigger Overview pane to show\n foundValidTab = true;\n return workingHistory;\n }\n\n const previousTab = openTabs.find((t) => t.id === previousTabId);\n\n if (previousTab) {\n // Found valid tab - switch to it\n setActiveTabId(previousTabId);\n foundValidTab = true;\n return workingHistory;\n } else {\n // Tab was deleted, remove from history and try again\n workingHistory = workingHistory.slice(0, -1);\n }\n }\n\n // No valid tabs found in history - clear history\n return [];\n });\n }, [openTabs]);\n\n /**\n * Check if back navigation is available\n */\n const canGoBack = useCallback((): boolean => {\n if (navigationHistory.length <= 1) return false;\n\n // Check if there's at least one valid tab in history (excluding current)\n const historyWithoutCurrent = navigationHistory.slice(0, -1);\n return historyWithoutCurrent.some(\n (tabId) =>\n // Empty tab ID (Overview) is always valid, or tab exists in openTabs\n tabId === '' || openTabs.some((tab) => tab.id === tabId),\n );\n }, [navigationHistory, openTabs]);\n\n /**\n * Toggle tree visibility\n */\n const toggleTree = useCallback(() => {\n setTreeVisible((prev) => !prev);\n }, []);\n\n /**\n * Navigate to a path using dot notation\n *\n * Enables deep linking by parsing a string path and opening all intermediate tabs.\n *\n * @param dotPath - Path in dot notation (e.g., \"page.view.data.map.items.consent\")\n *\n * @example\n * navigation.navigateToPath('page.view.consent');\n * // Opens: page entity → view rule → consent property\n *\n * @example\n * navigation.navigateToPath('product.add.data.map.items.key');\n * // Opens all intermediate tabs leading to the key property\n */\n const navigateToPath = useCallback(\n (dotPath: string) => {\n const pathArray = dotPath.split('.').filter((s) => s.trim());\n\n if (pathArray.length < 2) {\n console.warn('Invalid path for navigation:', dotPath);\n return;\n }\n\n for (let i = 1; i <= pathArray.length; i++) {\n const subPath = pathArray.slice(0, i);\n const value = getValueAtPath(config, subPath);\n const nodeType = detectNodeType(value, subPath, structure, schemas);\n openTab(subPath, nodeType);\n }\n },\n [openTab, config, structure, schemas],\n );\n\n return {\n // State\n openTabs,\n activeTabId,\n treeVisible,\n breadcrumb: getBreadcrumb(),\n navigationHistory,\n\n // Actions\n openTab,\n switchToTab,\n closeTab,\n closeLevel,\n closeAllTabs,\n navigateToBreadcrumb,\n navigateToPath,\n toggleTree,\n setTreeVisible,\n goBack,\n\n // Queries\n findTab,\n hasTab,\n canGoBack,\n };\n}\n\n/**\n * Return type of useMappingNavigation hook\n *\n * Provides tab-based navigation state management with:\n * - State: openTabs, activeTabId, treeVisible, breadcrumb, navigationHistory\n * - Actions: openTab, closeTab, navigateToPath, goBack, etc.\n * - Queries: getActiveTab, canGoBack\n *\n * @example\n * const navigation: UseMappingNavigationReturn = useMappingNavigation();\n */\nexport type UseMappingNavigationReturn = ReturnType<\n typeof useMappingNavigation\n>;\n\n/**\n * @deprecated Use UseMappingNavigationReturn instead\n * This alias is kept for backward compatibility and will be removed in the next major version.\n */\nexport type MappingNavigation = UseMappingNavigationReturn;\n","import type { Mapping } from '@walkeros/core';\n\n/**\n * Path Context Analyzer\n *\n * Provides structural understanding of mapping paths by walking the actual\n * config and inspecting values at each level.\n *\n * This is the single source of truth for understanding what a path points to\n * in the recursive mapping structure.\n */\n\n/**\n * Structural type of a path segment\n */\nexport type SegmentStructuralType =\n | 'entity' // First level: entity name\n | 'action' // Second level: action name (points to Rule)\n | 'ruleProperty' // Property of a Rule object\n | 'valueConfigProperty' // Property of a ValueConfig object\n | 'mapKey' // Key in a map object\n | 'arrayIndex'; // Index in an array\n\n/**\n * Semantic context of what's being edited\n */\nexport type SemanticContext =\n | 'overview' // Root level (no path)\n | 'entity' // Entity level (one segment)\n | 'rule' // Rule level (entity + action)\n | 'ruleProperty' // Property of rule (rule + property name)\n | 'valueConfig' // Editing a ValueConfig object\n | 'valueConfigProperty' // Property within ValueConfig\n | 'mapValue' // Value within a map\n | 'primitive'; // Primitive value (string, number, boolean)\n\n/**\n * Information about a single segment in the path\n */\nexport interface PathSegmentInfo {\n segment: string;\n index: number;\n structuralType: SegmentStructuralType;\n value: unknown;\n parentValue: unknown;\n}\n\n/**\n * Complete analysis of a path through the mapping structure\n */\nexport interface PathAnalysis {\n segments: PathSegmentInfo[];\n finalValue: unknown;\n finalContext: SemanticContext;\n isRuleLevel: boolean;\n isValueConfigLevel: boolean;\n propertyName?: string;\n}\n\n/**\n * Type guard: Check if value is a Rule object\n */\nexport function isRule(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false;\n const obj = value as Record<string, unknown>;\n\n // Rule has specific properties that ValueConfig doesn't have\n const ruleOnlyProps = [\n 'name',\n 'batch',\n 'ignore',\n 'settings',\n 'batchFn',\n 'batched',\n ];\n const valueConfigOnlyProps = ['key', 'fn', 'loop', 'set', 'validate'];\n\n const hasRuleProps = ruleOnlyProps.some((p) => p in obj);\n const hasValueConfigProps = valueConfigOnlyProps.some((p) => p in obj);\n\n // If it has rule-specific properties and no ValueConfig-only properties, it's a Rule\n return hasRuleProps && !hasValueConfigProps;\n}\n\n/**\n * Type guard: Check if value is a ValueConfig object\n */\nexport function isValueConfig(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false;\n const obj = value as Record<string, unknown>;\n\n // ValueConfig markers - if ANY of these exist, it's a ValueConfig\n const markers = [\n 'key',\n 'value',\n 'fn',\n 'map',\n 'loop',\n 'set',\n 'consent',\n 'condition',\n 'validate',\n ];\n return markers.some((m) => m in obj);\n}\n\n/**\n * Type guard: Check if value is a Map object (plain object inside ValueConfig.map)\n */\nexport function isMapObject(value: unknown): boolean {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n\n // A map is a plain object. We differentiate it from ValueConfig by checking\n // if it has ValueConfig markers. If no markers, it's a map.\n return !isValueConfig(value) && !isRule(value);\n}\n\n/**\n * Analyze a path through the mapping configuration\n *\n * Walks through the config structure, inspecting values at each step to\n * determine the semantic type and context.\n *\n * @param path - Array of path segments (e.g., ['page', 'view', 'data', 'map', 'page_location', 'consent'])\n * @param config - The mapping configuration object\n * @returns Complete analysis of the path\n *\n * @example\n * const analysis = analyzePath(['page', 'view', 'consent'], config);\n * // analysis.isRuleLevel === true (consent at rule level)\n *\n * @example\n * const analysis = analyzePath(['page', 'view', 'data', 'map', 'items', 'consent'], config);\n * // analysis.isValueConfigLevel === true (consent at ValueConfig level)\n */\nexport function analyzePath(\n path: string[],\n config: Mapping.Config,\n): PathAnalysis {\n const segments: PathSegmentInfo[] = [];\n\n // Handle empty path (overview)\n if (path.length === 0) {\n return {\n segments: [],\n finalValue: config,\n finalContext: 'overview',\n isRuleLevel: false,\n isValueConfigLevel: false,\n };\n }\n\n let current: unknown = config;\n let parent: unknown = null;\n\n // Walk through each segment\n for (let i = 0; i < path.length; i++) {\n const segment = path[i];\n parent = current;\n\n // Validate we can navigate\n if (!current || typeof current !== 'object') {\n throw new Error(\n `Cannot navigate path at index ${i}: value is not an object`,\n );\n }\n\n const obj = current as Record<string, unknown>;\n current = obj[segment];\n\n // Determine structural type based on context\n let structuralType: SegmentStructuralType;\n\n if (i === 0) {\n // First segment is always entity\n structuralType = 'entity';\n } else if (i === 1) {\n // Second segment is always action (points to Rule)\n structuralType = 'action';\n } else {\n // For deeper levels, inspect parent to determine type\n if (isRule(parent)) {\n structuralType = 'ruleProperty';\n } else if (isValueConfig(parent)) {\n structuralType = 'valueConfigProperty';\n } else if (Array.isArray(parent)) {\n structuralType = 'arrayIndex';\n } else {\n // Must be a map object\n structuralType = 'mapKey';\n }\n }\n\n segments.push({\n segment,\n index: i,\n structuralType,\n value: current,\n parentValue: parent,\n });\n }\n\n // Determine final context and metadata\n const lastSegment = segments[segments.length - 1];\n const finalValue = lastSegment.value;\n const parentValue = lastSegment.parentValue;\n\n let finalContext: SemanticContext;\n let isRuleLevel = false;\n let isValueConfigLevel = false;\n let propertyName: string | undefined;\n\n if (path.length === 1) {\n finalContext = 'entity';\n } else if (path.length === 2) {\n finalContext = 'rule';\n } else {\n // Deep path - determine based on structural type\n switch (lastSegment.structuralType) {\n case 'ruleProperty':\n finalContext = 'ruleProperty';\n isRuleLevel = true;\n propertyName = lastSegment.segment;\n break;\n\n case 'valueConfigProperty':\n finalContext = 'valueConfigProperty';\n isValueConfigLevel = true;\n propertyName = lastSegment.segment;\n break;\n\n case 'mapKey':\n // A map key holds a Value (string or ValueConfig)\n if (typeof finalValue === 'string') {\n finalContext = 'primitive';\n } else if (isValueConfig(finalValue)) {\n finalContext = 'valueConfig';\n } else {\n finalContext = 'mapValue';\n }\n break;\n\n default:\n finalContext = 'valueConfig';\n }\n }\n\n return {\n segments,\n finalValue,\n finalContext,\n isRuleLevel,\n isValueConfigLevel,\n propertyName,\n };\n}\n\n/**\n * Get semantic description for a path\n *\n * Returns human-readable description of what's being edited at this path.\n *\n * @example\n * getPathDescription(['page', 'view', 'consent'], config)\n * // Returns: \"Rule-level consent for page view event\"\n *\n * @example\n * getPathDescription(['page', 'view', 'data', 'map', 'title', 'consent'], config)\n * // Returns: \"Property-level consent for title field\"\n */\nexport function getPathDescription(\n path: string[],\n config: Mapping.Config,\n): { title: string; description: string } {\n const analysis = analyzePath(path, config);\n\n if (analysis.propertyName === 'consent') {\n return {\n title: 'Required Consent States',\n description:\n 'Events or properties will only be processed if these consent states are granted',\n };\n }\n\n if (analysis.propertyName === 'settings') {\n return {\n title: 'Settings',\n description: 'Configure destination-specific settings for this rule',\n };\n }\n\n // Default descriptions\n return {\n title: `Editing ${analysis.propertyName || 'Value'}`,\n description: `Configure ${analysis.finalContext} at path: ${path.join(' → ')}`,\n };\n}\n","import type { ConfigStructureDef } from './types';\n\n/**\n * Structure Definition for Mapping.Rule\n *\n * Describes the shape of a single mapping rule (e.g., mapping.page.view):\n * - name: Event name override\n * - batch: Batch size\n * - settings: Rule-level settings\n * - data: Data transformations\n * - consent: Consent requirements\n * - condition: Condition function\n * - ignore: Ignore flag\n *\n * This structure enables editing individual rules with ConfigEditor.\n */\nexport const MAPPING_RULE_STRUCTURE: ConfigStructureDef = {\n type: 'object',\n title: 'Mapping Rule',\n description: 'Configuration for a single event mapping rule',\n rootNodeType: 'rule', // Overview shows rule properties\n\n properties: {\n // Event name override\n name: {\n title: 'Event Name',\n description: 'Custom event name override',\n nodeType: 'name',\n children: 'none',\n schemaPath: 'rule.name', // Points to rule-properties-schema\n },\n\n // Batch configuration\n batch: {\n title: 'Batch Size',\n description: 'Number of events to batch together',\n nodeType: 'batch',\n children: 'none',\n schemaPath: 'rule.batch', // Points to rule-properties-schema\n },\n\n // Rule-level settings\n settings: {\n title: 'Settings',\n description: 'Rule-specific settings',\n nodeType: 'settings', // Opens SettingsOverviewPane with tiles\n children: 'schema-driven', // Build from schemas.mapping\n schemaPath: 'mapping', // Use schemas.mapping for rule settings\n },\n\n // Data transformations\n data: {\n title: 'Data',\n description: 'Data transformations for this event',\n children: 'value-driven', // Detect from value (map, loop, value, etc.)\n },\n\n // Consent requirements\n consent: {\n title: 'Consent',\n description: 'Required consent states',\n nodeType: 'consent',\n children: 'none',\n },\n\n // Condition function\n condition: {\n title: 'Condition',\n description: 'Function to determine if rule should apply',\n nodeType: 'condition',\n children: 'none',\n },\n\n // Ignore flag\n ignore: {\n title: 'Ignore',\n description: 'Skip processing this event',\n nodeType: 'boolean',\n children: 'none',\n },\n\n // Policy (less common, but supported)\n policy: {\n title: 'Policy',\n description: 'Event-level policy rules',\n nodeType: 'policy',\n children: 'none',\n },\n },\n};\n","import type { NodeType } from '../hooks/useMappingNavigation';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport type {\n ConfigStructureDef,\n PropertyDef,\n} from '../schemas/config-structures/types';\nimport { isRule } from './path-analyzer';\nimport { MAPPING_RULE_STRUCTURE } from '../schemas/config-structures/mapping-rule';\n\n/**\n * Detect NodeType for a value at a given path\n *\n * Single source of truth for type detection. Uses structure + schemas.\n *\n * Detection priority:\n * 1. Structure definition (explicit nodeType for properties)\n * 2. Schema detection (enum, boolean, primitives from JSON Schema)\n * 3. Value introspection (for complex types and fallback)\n *\n * @param value - The value to inspect\n * @param path - Path array to the value\n * @param structure - Structure definition (REQUIRED for schema-driven detection)\n * @param schemas - Schemas bundle for this config\n * @returns NodeType for editing\n */\nexport function detectNodeType(\n value: unknown,\n path: string[],\n structure: ConfigStructureDef,\n schemas?: Record<string, RJSFSchema>,\n): NodeType {\n if (path.length === 0) {\n return structure.rootNodeType || 'entity';\n }\n\n let currentStructure = structure;\n let propertyDef: PropertyDef | undefined;\n let propertyDefIndex = -1;\n\n // Navigate structure to find property definition\n for (let i = 0; i < path.length; i++) {\n const segment = path[i];\n const foundDef = currentStructure.properties?.[segment];\n\n if (foundDef) {\n propertyDef = foundDef;\n propertyDefIndex = i;\n if (foundDef.structure) {\n currentStructure = foundDef.structure;\n }\n } else {\n break;\n }\n }\n\n // Handle entity-action pattern (mapping)\n if (propertyDef?.children === 'entity-action' && propertyDefIndex >= 0) {\n const depth = path.length - propertyDefIndex;\n\n if (depth === 1 || depth === 2) return 'entity';\n\n if (depth === 3 && isRule(value)) {\n return 'rule';\n }\n\n if (depth >= 4) {\n const rulePath = path.slice(propertyDefIndex + 3);\n return detectNodeType(value, rulePath, MAPPING_RULE_STRUCTURE, schemas);\n }\n }\n\n const skipExplicitNodeType =\n propertyDef?.children === 'entity-action' && path.length >= 3;\n\n const isAtPropertyDefEnd = propertyDefIndex === path.length - 1;\n\n // Priority 1: Explicit nodeType from structure (only at end of path)\n if (propertyDef?.nodeType && !skipExplicitNodeType && isAtPropertyDefEnd) {\n return propertyDef.nodeType;\n }\n\n // Priority 2: Schema detection\n const schema = propertyDef && schemas\n ? resolveSchema(path.slice(propertyDefIndex), propertyDef, schemas)\n : undefined;\n\n if (schema) {\n const primitiveType = typeof value;\n const isPrimitive =\n primitiveType === 'string' ||\n primitiveType === 'number' ||\n primitiveType === 'boolean' ||\n value === undefined ||\n value === null;\n\n if (schema.type === 'boolean' &&\n (primitiveType === 'boolean' || value === undefined || value === null)) {\n return 'boolean';\n }\n\n if (schema.enum && Array.isArray(schema.enum) && schema.enum.length > 0 && isPrimitive) {\n return 'enum';\n }\n\n if ((schema.type === 'string' || schema.type === 'number') && isPrimitive) {\n return 'primitive';\n }\n\n if (schema.type === 'array') {\n if (schema.minItems === 2 && schema.maxItems === 2) return 'loop';\n return 'set';\n }\n\n if (schema.type === 'object') return 'map';\n }\n\n // Priority 3: Value introspection\n if (value !== undefined && value !== null) {\n if (isRule(value)) return 'rule';\n\n if (typeof value === 'boolean') return 'boolean';\n\n if (typeof value === 'string' || typeof value === 'number') {\n return 'valueType';\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0 || value.length === 1) return 'set';\n\n if (value.length === 2) {\n const [first, second] = value;\n if (typeof second === 'object' && second !== null) {\n if (typeof first === 'string') return 'loop';\n if (typeof first === 'object' && first !== null && 'key' in first) {\n return 'loop';\n }\n }\n return 'set';\n }\n\n return 'set';\n }\n\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if ('fn' in obj) return 'fn';\n if ('loop' in obj) return 'loop';\n if ('map' in obj) return 'map';\n if ('set' in obj) return 'set';\n if ('condition' in obj) return 'condition';\n if ('validate' in obj) return 'validate';\n if ('value' in obj) return 'value';\n return 'map';\n }\n }\n\n // Priority 4: Schema fallback for undefined values\n if (schema) {\n if (schema.type === 'array') {\n if (schema.minItems === 2 && schema.maxItems === 2) return 'loop';\n return 'set';\n }\n if (schema.type === 'object') return 'map';\n if (schema.type === 'boolean') return 'boolean';\n if (schema.type === 'string' || schema.type === 'number') return 'primitive';\n }\n\n return 'valueType';\n}\n\n/**\n * Resolve schema for a property using its schemaPath\n */\nfunction resolveSchema(\n relativePath: string[],\n propertyDef: PropertyDef,\n schemas: Record<string, RJSFSchema>,\n): RJSFSchema | undefined {\n const schemaPath = propertyDef.schemaPath;\n if (!schemaPath) return undefined;\n\n let current = schemas[schemaPath];\n if (!current) return undefined;\n\n // For schema-driven properties, navigate nested schema\n if (propertyDef.children === 'schema-driven' && relativePath.length >= 2) {\n for (let i = 1; i < relativePath.length; i++) {\n const segment = relativePath[i];\n if (!current.properties || !(segment in current.properties)) {\n return undefined;\n }\n current = current.properties[segment] as RJSFSchema;\n }\n }\n\n return current;\n}\n\n/**\n * Get schema for a path (exported for components that need schema access)\n */\nexport function getSchemaForPath(\n value: unknown,\n path: string[],\n structure: ConfigStructureDef,\n schemas?: Record<string, RJSFSchema>,\n): RJSFSchema | undefined {\n if (!schemas || path.length === 0) return undefined;\n\n let currentStructure = structure;\n let propertyDef: PropertyDef | undefined;\n let propertyDefIndex = -1;\n\n for (let i = 0; i < path.length; i++) {\n const segment = path[i];\n const foundDef = currentStructure.properties?.[segment];\n\n if (foundDef) {\n propertyDef = foundDef;\n propertyDefIndex = i;\n if (foundDef.structure) {\n currentStructure = foundDef.structure;\n }\n } else {\n break;\n }\n }\n\n // Handle entity-action pattern recursively\n if (propertyDef?.children === 'entity-action' && propertyDefIndex >= 0) {\n const depth = path.length - propertyDefIndex;\n\n if (depth >= 4) {\n const rulePath = path.slice(propertyDefIndex + 3);\n return getSchemaForPath(value, rulePath, MAPPING_RULE_STRUCTURE, schemas);\n }\n }\n\n return propertyDef ? resolveSchema(path.slice(propertyDefIndex), propertyDef, schemas) : undefined;\n}\n\n/**\n * Detect NodeType from JSON Schema alone (without value or structure)\n *\n * Used for property suggestions where we only have the schema definition.\n * This is a lightweight detection based purely on JSON Schema properties.\n *\n * @param schema - JSON Schema for the property\n * @returns NodeType for editing\n */\nexport function detectNodeTypeFromSchema(schema: RJSFSchema): NodeType {\n // Check for boolean type\n if (schema.type === 'boolean') {\n return 'boolean';\n }\n\n // Check for enum with options\n if (schema.enum && Array.isArray(schema.enum) && schema.enum.length > 0) {\n return 'enum';\n }\n\n // Check for primitive string/number\n if (schema.type === 'string' || schema.type === 'number') {\n return 'primitive';\n }\n\n // Check for array\n if (schema.type === 'array') {\n // Loop arrays have exactly 2 items\n if (schema.minItems === 2 && schema.maxItems === 2) {\n return 'loop';\n }\n return 'set';\n }\n\n // Check for object\n if (schema.type === 'object') {\n return 'map';\n }\n\n // Default fallback\n return 'valueType';\n}\n","import { useState, useCallback } from 'react';\n\n/**\n * Tree expand/collapse state management\n *\n * Manages which paths in a tree view are expanded or collapsed.\n * This hook is UI-agnostic and can be used with any tree structure.\n *\n * @example\n * const treeState = useTreeState(['']); // Root expanded by default\n *\n * // Check if expanded\n * if (treeState.isExpanded(['product', 'view'])) { ... }\n *\n * // Toggle expansion\n * treeState.togglePath(['product', 'view']);\n *\n * // Expand specific path\n * treeState.expandPath(['product', 'view', 'data']);\n *\n * // Collapse specific path\n * treeState.collapsePath(['product']);\n */\nexport function useTreeState(initialExpanded: string[][] = [[]]) {\n const [expandedPaths, setExpandedPaths] = useState<Set<string>>(() => {\n return new Set(initialExpanded.map((path) => path.join('.')));\n });\n\n /**\n * Check if a path is expanded\n */\n const isExpanded = useCallback(\n (path: string[]): boolean => {\n const pathKey = path.join('.');\n return expandedPaths.has(pathKey);\n },\n [expandedPaths],\n );\n\n /**\n * Toggle path expansion\n */\n const togglePath = useCallback((path: string[]) => {\n const pathKey = path.join('.');\n setExpandedPaths((prev) => {\n const next = new Set(prev);\n if (next.has(pathKey)) {\n next.delete(pathKey);\n } else {\n next.add(pathKey);\n }\n return next;\n });\n }, []);\n\n /**\n * Expand specific path\n */\n const expandPath = useCallback((path: string[]) => {\n const pathKey = path.join('.');\n setExpandedPaths((prev) => {\n const next = new Set(prev);\n next.add(pathKey);\n return next;\n });\n }, []);\n\n /**\n * Collapse specific path\n */\n const collapsePath = useCallback((path: string[]) => {\n const pathKey = path.join('.');\n setExpandedPaths((prev) => {\n const next = new Set(prev);\n next.delete(pathKey);\n return next;\n });\n }, []);\n\n /**\n * Expand all paths\n */\n const expandAll = useCallback((allPaths: string[][]) => {\n setExpandedPaths(new Set(allPaths.map((path) => path.join('.'))));\n }, []);\n\n /**\n * Collapse all paths\n */\n const collapseAll = useCallback(() => {\n setExpandedPaths(new Set());\n }, []);\n\n return {\n expandedPaths,\n isExpanded,\n togglePath,\n expandPath,\n collapsePath,\n expandAll,\n collapseAll,\n };\n}\n\nexport type TreeState = ReturnType<typeof useTreeState>;\n","import type { BreadcrumbSegment } from '../../utils/mapping-path';\n\n/**\n * Clickable breadcrumb trail for navigation\n *\n * Displays a path like: Root > product view > Data > Map > items\n * Each segment is clickable to navigate to that level\n */\nexport interface MappingBreadcrumbProps {\n segments: BreadcrumbSegment[];\n onNavigate: (path: string[]) => void;\n className?: string;\n}\n\nexport function MappingBreadcrumb({\n segments,\n onNavigate,\n className = '',\n}: MappingBreadcrumbProps) {\n return (\n <nav\n className={`elb-mapping-breadcrumb ${className}`}\n aria-label=\"Breadcrumb\"\n >\n <ol className=\"elb-mapping-breadcrumb-list\">\n {segments.map((segment, index) => {\n const isLast = index === segments.length - 1;\n const isRoot = segment.nodeType === 'root';\n const isClickable = !isLast || isRoot;\n\n return (\n <li\n key={segment.path.join('.')}\n className=\"elb-mapping-breadcrumb-item\"\n >\n {isClickable ? (\n <>\n <button\n type=\"button\"\n className={`elb-mapping-breadcrumb-link ${isRoot ? 'is-root' : ''}`}\n onClick={() => onNavigate(segment.path)}\n aria-current={isLast ? 'page' : undefined}\n >\n {segment.label}\n </button>\n {!isLast && (\n <span\n className=\"elb-mapping-breadcrumb-separator\"\n aria-hidden=\"true\"\n >\n /\n </span>\n )}\n </>\n ) : (\n <span className=\"elb-mapping-breadcrumb-current\">\n {segment.label}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\n\n// Default trash icon\nconst TrashIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.5 1.5V2.5H2V4H3V13.5C3 14.3284 3.67157 15 4.5 15H11.5C12.3284 15 13 14.3284 13 13.5V4H14V2.5H9.5V1.5H6.5ZM4.5 4H11.5V13.5H4.5V4ZM6 5.5V12H7.5V5.5H6ZM8.5 5.5V12H10V5.5H8.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n/**\n * Confirm Button - Transforms to confirmation state on click\n *\n * When clicked, transforms to show \"Confirm?\" text with visual emphasis.\n * Clicking again confirms the action. Clicking outside or ESC cancels.\n *\n * By default, uses a trash icon. Can be overridden with custom icon.\n *\n * @example\n * <MappingConfirmButton\n * confirmLabel=\"Delete?\"\n * onConfirm={() => deleteItem()}\n * ariaLabel=\"Delete item\"\n * />\n */\nexport interface MappingConfirmButtonProps {\n /** Icon to show in default state (defaults to trash icon) */\n icon?: React.ReactNode;\n /** Label to show in confirmation state */\n confirmLabel?: string;\n /** Callback when action is confirmed */\n onConfirm: () => void;\n /** Accessibility label */\n ariaLabel: string;\n /** Additional CSS class */\n className?: string;\n}\n\nexport function MappingConfirmButton({\n icon = <TrashIcon />,\n confirmLabel = 'Confirm?',\n onConfirm,\n ariaLabel,\n className = '',\n}: MappingConfirmButtonProps) {\n const [isConfirming, setIsConfirming] = useState(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n // Handle click outside to cancel\n useEffect(() => {\n if (!isConfirming) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (buttonRef.current && !buttonRef.current.contains(e.target as Node)) {\n setIsConfirming(false);\n }\n };\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsConfirming(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isConfirming]);\n\n const handleClick = () => {\n if (isConfirming) {\n // Confirm action\n onConfirm();\n setIsConfirming(false);\n } else {\n // Enter confirmation state\n setIsConfirming(true);\n }\n };\n\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n className={`elb-mapping-confirm-button ${isConfirming ? 'is-confirming' : ''} ${className}`}\n onClick={handleClick}\n aria-label={isConfirming ? confirmLabel : ariaLabel}\n title={isConfirming ? confirmLabel : ariaLabel}\n >\n {isConfirming ? confirmLabel : icon}\n </button>\n );\n}\n","import { MappingBreadcrumb } from '../atoms/mapping-breadcrumb';\nimport { MappingConfirmButton } from '../atoms/mapping-confirm-button';\nimport type { BreadcrumbSegment } from '../../utils/mapping-path';\nimport type { NodeType } from '../../hooks/useMappingNavigation';\n\n/**\n * Navigation header combining breadcrumb, tree toggle, and action button\n *\n * Displayed above the tab bar to provide context and navigation controls\n */\nexport interface MappingNavigationHeaderProps {\n breadcrumb: BreadcrumbSegment[];\n paneType?: NodeType;\n showTreeButton?: boolean;\n showCodeButton?: boolean;\n codeViewActive?: boolean;\n showActionButton?: boolean;\n actionButtonLabel?: string;\n showDeleteButton?: boolean;\n validationErrors?: number;\n onNavigate: (path: string[]) => void;\n onToggleTree?: () => void;\n onToggleCode?: () => void;\n onActionClick?: () => void;\n onDeleteClick?: () => void;\n onValidationClick?: () => void;\n className?: string;\n}\n\nexport function MappingNavigationHeader({\n breadcrumb,\n paneType,\n showTreeButton = true,\n showCodeButton = false,\n codeViewActive = false,\n showActionButton = false,\n actionButtonLabel = '+ Add',\n showDeleteButton = false,\n validationErrors = 0,\n onNavigate,\n onToggleTree,\n onToggleCode,\n onActionClick,\n onDeleteClick,\n onValidationClick,\n className = '',\n}: MappingNavigationHeaderProps) {\n return (\n <div className={`elb-mapping-navigation-header ${className}`}>\n <div className=\"elb-mapping-navigation-left\">\n {showTreeButton && (\n <button\n type=\"button\"\n className=\"elb-mapping-tree-toggle-button\"\n onClick={onToggleTree}\n aria-label=\"Toggle tree view\"\n title=\"Toggle tree view\"\n >\n ≡\n </button>\n )}\n\n <MappingBreadcrumb segments={breadcrumb} onNavigate={onNavigate} />\n\n {paneType && <span className=\"elb-mapping-pane-type\">{paneType}</span>}\n\n {validationErrors > 0 && onValidationClick && (\n <button\n type=\"button\"\n className=\"elb-validation-warning-badge\"\n onClick={onValidationClick}\n aria-label={`${validationErrors} validation ${validationErrors === 1 ? 'error' : 'errors'}`}\n title={`${validationErrors} validation ${validationErrors === 1 ? 'error' : 'errors'}. Click to view.`}\n >\n <span className=\"elb-validation-warning-icon\">⚠</span>\n <span className=\"elb-validation-warning-count\">\n {validationErrors}\n </span>\n </button>\n )}\n </div>\n\n <div className=\"elb-mapping-navigation-right\">\n {showCodeButton && onToggleCode && (\n <button\n type=\"button\"\n className={`elb-mapping-code-toggle-button ${codeViewActive ? 'is-active' : ''}`}\n onClick={onToggleCode}\n aria-label={codeViewActive ? 'Show visual view' : 'Show code view'}\n title={codeViewActive ? 'Show visual view' : 'Show code view'}\n >\n <span>{codeViewActive ? 'Visual' : 'Code'}</span>\n </button>\n )}\n\n {showDeleteButton && onDeleteClick && (\n <MappingConfirmButton\n icon={\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.5 1.5V2.5H2V4H3V13.5C3 14.3284 3.67157 15 4.5 15H11.5C12.3284 15 13 14.3284 13 13.5V4H14V2.5H9.5V1.5H6.5ZM4.5 4H11.5V13.5H4.5V4ZM6 5.5V12H7.5V5.5H6ZM8.5 5.5V12H10V5.5H8.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n }\n confirmLabel=\"Delete?\"\n onConfirm={onDeleteClick}\n ariaLabel=\"Delete this item\"\n className=\"elb-mapping-delete-button\"\n />\n )}\n\n {showActionButton && onActionClick && (\n <button\n type=\"button\"\n className=\"elb-mapping-action-button\"\n onClick={onActionClick}\n aria-label={actionButtonLabel}\n title={actionButtonLabel}\n >\n {actionButtonLabel}\n </button>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport type { ConfigTreeNode } from '../../utils/generic-tree-builder';\nimport { MappingInputWithButton } from '../atoms/mapping-input-with-button';\nimport type { NodeType } from '../../hooks/useMappingNavigation';\n\n/**\n * Tree node component for config structure (recursive)\n */\ninterface ConfigTreeNodeComponentProps {\n node: ConfigTreeNode;\n expandedPaths: Set<string>;\n selectedPath: string[];\n onToggle: (path: string[]) => void;\n onSelect: (path: string[]) => void;\n onAddAction?: (entity: string, action: string) => void;\n level: number;\n}\n\nfunction ConfigTreeNodeComponent({\n node,\n expandedPaths,\n selectedPath,\n onToggle,\n onSelect,\n onAddAction,\n level,\n}: ConfigTreeNodeComponentProps) {\n const pathKey = node.path.join('.');\n const isExpanded = expandedPaths.has(pathKey);\n const isSelected =\n node.path.length > 0 && node.path.join('.') === selectedPath.join('.');\n\n // Check if this node is an ancestor of the selected path\n const isAncestor =\n node.path.length > 0 &&\n selectedPath.length > node.path.length &&\n node.path.every((segment: string, i: number) => segment === selectedPath[i]);\n\n const hasChildren = node.children && node.children.length > 0;\n const showToggle =\n (hasChildren && node.isExpandable) ||\n node.type === 'entity' ||\n (node.key === 'mapping' && node.path.length === 1);\n const showChildren = hasChildren && isExpanded;\n\n // State for adding new action (only for entities under mapping)\n const [isAddingAction, setIsAddingAction] = useState(false);\n const [newActionName, setNewActionName] = useState('');\n const [actionExists, setActionExists] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Check if this is an entity node (path like ['mapping', 'product'])\n const isEntityNode =\n node.type === 'entity' &&\n node.path.length === 2 &&\n node.path[0] === 'mapping';\n\n // Focus input when adding action\n useEffect(() => {\n if (isAddingAction && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isAddingAction]);\n\n // Check if action exists in children\n useEffect(() => {\n if (isEntityNode && newActionName) {\n const exists =\n node.children?.some((child: ConfigTreeNode) => child.label === newActionName) ?? false;\n setActionExists(exists);\n }\n }, [newActionName, node, isEntityNode]);\n\n // Handle add action button click\n const handleAddClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isExpanded) {\n onToggle(node.path);\n }\n setIsAddingAction(true);\n };\n\n // Handle action input submit\n const handleActionSubmit = () => {\n if (!newActionName.trim()) {\n setIsAddingAction(false);\n setNewActionName('');\n return;\n }\n\n if (actionExists) {\n // Navigate to existing action\n const existingChild = node.children?.find(\n (child: ConfigTreeNode) => child.label === newActionName,\n );\n if (existingChild) {\n onSelect(existingChild.path);\n }\n setIsAddingAction(false);\n setNewActionName('');\n setActionExists(false);\n } else if (onAddAction && isEntityNode) {\n // Create new action\n onAddAction(node.path[1], newActionName.trim());\n setIsAddingAction(false);\n setNewActionName('');\n }\n };\n\n // Handle action input key down\n const handleActionKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setIsAddingAction(false);\n setNewActionName('');\n setActionExists(false);\n }\n };\n\n // Handle row click\n const handleRowClick = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n const isToggleClick = target.classList.contains('elb-mapping-tree-toggle');\n const isAddButtonClick = target.classList.contains(\n 'elb-mapping-tree-add-button',\n );\n\n if (isAddButtonClick) {\n return; // Already handled by button\n }\n\n if (isToggleClick && showToggle) {\n // Clicked on toggle arrow - always toggle\n onToggle(node.path);\n } else {\n // Clicked on row - select and navigate\n onSelect(node.path);\n // Also expand if has children and not already expanded\n if (hasChildren && !isExpanded) {\n onToggle(node.path);\n }\n }\n };\n\n const displayLabel = node.label;\n\n return (\n <div\n className={`elb-mapping-tree-node elb-mapping-tree-node--level-${level}`}\n >\n <div\n className={`elb-mapping-tree-node-content ${isSelected ? 'is-selected' : ''} ${isAncestor ? 'is-ancestor' : ''} ${isEntityNode ? 'is-entity' : ''} ${!node.hasValue ? 'is-empty' : ''}`}\n onClick={handleRowClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleRowClick(e as unknown as React.MouseEvent);\n }\n }}\n >\n {/* Toggle arrow */}\n {showToggle ? (\n <span\n className={`elb-mapping-tree-toggle ${isExpanded ? 'is-expanded' : ''}`}\n >\n ›\n </span>\n ) : (\n <span className=\"elb-mapping-tree-spacer\" />\n )}\n\n {/* Label */}\n <span\n className={`elb-mapping-tree-label elb-mapping-tree-label--${node.type}`}\n >\n {displayLabel}\n </span>\n\n {/* Add button for entities under mapping */}\n {isEntityNode && onAddAction && (\n <button\n type=\"button\"\n className=\"elb-mapping-tree-add-button\"\n onClick={handleAddClick}\n aria-label=\"Add action\"\n title=\"Add action\"\n >\n +\n </button>\n )}\n </div>\n\n {showChildren && (\n <div className=\"elb-mapping-tree-children\">\n {node.children?.map((child: ConfigTreeNode) => (\n <ConfigTreeNodeComponent\n key={child.path.join('.')}\n node={child}\n expandedPaths={expandedPaths}\n selectedPath={selectedPath}\n onToggle={onToggle}\n onSelect={onSelect}\n onAddAction={onAddAction}\n level={level + 1}\n />\n ))}\n\n {/* Add action input field */}\n {isAddingAction && isEntityNode && (\n <div className=\"elb-mapping-tree-add-action\">\n <span className=\"elb-mapping-tree-spacer\" />\n <div\n ref={inputRef as React.RefObject<HTMLDivElement> | null}\n className=\"elb-mapping-tree-add-input-wrapper\"\n >\n <MappingInputWithButton\n value={newActionName}\n onChange={(val) => setNewActionName(val)}\n onSubmit={handleActionSubmit}\n onKeyDown={handleActionKeyDown}\n buttonLabel={actionExists ? 'Open' : 'Create'}\n showButton={true}\n placeholder=\"action\"\n className={`elb-mapping-tree-add-input ${actionExists ? 'is-existing' : ''}`}\n autoFocus={true}\n />\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Config Tree Sidebar - Shows full destination config structure\n *\n * Displays hierarchical structure of destination configuration:\n * - Settings\n * - Mapping (entities → actions)\n * - Data\n * - Policy\n * - Consent\n * - Options\n *\n * This is a pure presentation component - all state management\n * should be handled by the parent component.\n *\n * Features:\n * - Hierarchical tree display\n * - Expand/collapse controls\n * - Click to navigate with proper NodeType\n * - Visual indication of current path\n * - Add action buttons for entities\n *\n * @example\n * <ConfigTreeSidebar\n * tree={buildConfigTree(config, schemas, sections)}\n * currentPath={['settings']}\n * expandedPaths={expandedPathsSet}\n * visible={true}\n * onToggle={(path) => togglePath(path)}\n * onNavigate={(path) => navigate(path)}\n * />\n */\nexport interface ConfigTreeSidebarProps {\n tree: ConfigTreeNode[];\n currentPath: string[];\n expandedPaths: Set<string>;\n visible: boolean;\n onToggle: (path: string[]) => void;\n onNavigate: (path: string[]) => void;\n onAddAction?: (entity: string, action: string) => void;\n onAddEntity?: (entity: string) => void;\n onClose?: () => void;\n className?: string;\n}\n\nexport function ConfigTreeSidebar({\n tree,\n currentPath,\n expandedPaths,\n visible,\n onToggle,\n onNavigate,\n onAddAction,\n onAddEntity,\n onClose,\n className = '',\n}: ConfigTreeSidebarProps) {\n const [isAddingEntity, setIsAddingEntity] = useState(false);\n const [newEntityName, setNewEntityName] = useState('');\n const [entityExists, setEntityExists] = useState(false);\n const entityInputRef = useRef<HTMLInputElement>(null);\n\n // Focus input when adding entity\n useEffect(() => {\n if (isAddingEntity && entityInputRef.current) {\n entityInputRef.current.focus();\n }\n }, [isAddingEntity]);\n\n // Check if entity exists in mapping section\n useEffect(() => {\n if (newEntityName) {\n const mappingNode = tree.find((node: ConfigTreeNode) => node.key === 'mapping');\n const exists =\n mappingNode?.children?.some((child: ConfigTreeNode) => child.label === newEntityName) ??\n false;\n setEntityExists(exists);\n }\n }, [newEntityName, tree]);\n\n if (!visible) {\n return null;\n }\n\n const handleAddEntityClick = () => {\n setIsAddingEntity(true);\n };\n\n const handleEntityInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n setNewEntityName(e.target.value);\n };\n\n const handleEntitySubmit = () => {\n if (!newEntityName.trim()) {\n setIsAddingEntity(false);\n setNewEntityName('');\n return;\n }\n\n if (entityExists) {\n // Navigate to existing entity - find and navigate to it\n const mappingNode = tree.find((node: ConfigTreeNode) => node.key === 'mapping');\n const existingEntity = mappingNode?.children?.find(\n (child: ConfigTreeNode) => child.label === newEntityName,\n );\n if (existingEntity) {\n onNavigate(existingEntity.path);\n onToggle(existingEntity.path);\n }\n setIsAddingEntity(false);\n setNewEntityName('');\n setEntityExists(false);\n } else if (onAddEntity) {\n // Create new entity\n onAddEntity(newEntityName.trim());\n setIsAddingEntity(false);\n setNewEntityName('');\n }\n };\n\n const handleEntityKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleEntitySubmit();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setIsAddingEntity(false);\n setNewEntityName('');\n setEntityExists(false);\n }\n };\n\n const handleEntityBlur = () => {\n // Small delay to allow click events to fire, then submit\n setTimeout(() => {\n handleEntitySubmit();\n }, 150);\n };\n\n return (\n <aside\n className={`elb-mapping-tree-sidebar ${className}`}\n aria-label=\"Config structure\"\n >\n <div className=\"elb-mapping-tree-content\">\n {tree.map((node) => (\n <ConfigTreeNodeComponent\n key={node.path.join('.')}\n node={node}\n expandedPaths={expandedPaths}\n selectedPath={currentPath}\n onToggle={onToggle}\n onSelect={onNavigate}\n onAddAction={onAddAction}\n level={0}\n />\n ))}\n\n {/* Add Entity Section - sticky container */}\n <div className=\"elb-mapping-tree-add-entity-section\">\n {!isAddingEntity && onAddEntity && (\n <button\n type=\"button\"\n className=\"elb-mapping-tree-add-entity-button\"\n onClick={handleAddEntityClick}\n >\n <span>+</span> Add Entity\n </button>\n )}\n\n {isAddingEntity && (\n <div className=\"elb-mapping-tree-add-entity\">\n <input\n ref={entityInputRef}\n type=\"text\"\n className={`elb-mapping-tree-add-entity-input ${entityExists ? 'is-error' : ''}`}\n value={newEntityName}\n onChange={handleEntityInput}\n onKeyDown={handleEntityKeyDown}\n onBlur={handleEntityBlur}\n placeholder=\"entity\"\n />\n </div>\n )}\n </div>\n\n {/* Bottom padding for scrolling */}\n <div className=\"elb-mapping-tree-bottom-padding\" />\n </div>\n\n {/* Mobile close button - absolute at bottom right */}\n {onClose && (\n <button\n type=\"button\"\n className=\"elb-mapping-tree-close-button\"\n onClick={onClose}\n aria-label=\"Close tree sidebar\"\n title=\"Close sidebar\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </aside>\n );\n}\n","import React from 'react';\n\nexport interface MappingInputProps {\n value: string;\n onChange: (value: string) => void;\n onBlur?: () => void;\n onClick?: () => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n placeholder?: string;\n disabled?: boolean;\n type?: 'text' | 'number';\n title?: string;\n className?: string;\n autoFocus?: boolean;\n error?: boolean;\n}\n\n/**\n * MappingInput - Standardized input component for mapping editor\n *\n * Features:\n * - Consistent styling across all mapping panes\n * - Theme-aware colors (input background, border, focus states)\n * - Monospace font for property paths and values\n * - Hover and focus states\n * - Optional disabled state with visual feedback\n * - Optional error state with visual feedback (red border/background)\n * - Type support for text and number inputs\n *\n * Used by:\n * - Name pane (event name override)\n * - Entity pane (action name input)\n * - Batch pane (number input)\n * - ValueType pane (quick value string)\n * - Primitive pane (schema-validated inputs)\n *\n * @example\n * <MappingInput\n * value={name}\n * onChange={setName}\n * placeholder=\"e.g., page_view\"\n * error={!isValid}\n * />\n */\nexport function MappingInput({\n value,\n onChange,\n onBlur,\n onClick,\n onKeyDown,\n placeholder,\n disabled = false,\n type = 'text',\n title,\n className = '',\n autoFocus = false,\n error = false,\n}: MappingInputProps) {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n };\n\n return (\n <input\n type={type}\n className={`elb-mapping-input ${disabled ? 'is-disabled' : ''} ${error ? 'is-error' : ''} ${className}`}\n value={value}\n onChange={handleChange}\n onBlur={onBlur}\n onClick={onClick}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n title={title}\n autoFocus={autoFocus}\n />\n );\n}\n","import React from 'react';\nimport { MappingInput, type MappingInputProps } from './mapping-input';\n\nexport interface MappingInputWithButtonProps\n extends Omit<MappingInputProps, 'onKeyDown'> {\n /**\n * Handler called when submit button is clicked or Enter is pressed\n */\n onSubmit: () => void;\n\n /**\n * Label for the action button\n * Examples: \"Create\", \"Open\", \"Add\", \"Add Key\"\n */\n buttonLabel: string;\n\n /**\n * Whether to show the button\n * Typically true when input has content\n */\n showButton?: boolean;\n\n /**\n * Optional override for key down behavior\n */\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\n/**\n * MappingInputWithButton - Enhanced input with contextual action button\n *\n * Provides clear visual affordance for creation/navigation actions.\n * The button appears when the input has content and provides a\n * discoverable alternative to pressing Enter.\n *\n * Features:\n * - Inline action button with dynamic label\n * - Maintains keyboard shortcuts (Enter, Escape)\n * - Self-documenting UX (button shows what will happen)\n * - Mobile-friendly (tap target)\n *\n * Used by:\n * - Overview pane (entity creation/selection)\n * - Entity pane (action creation/selection)\n * - Map pane (key creation/selection)\n * - Consent pane (consent state creation)\n * - Tree sidebar (quick action creation)\n *\n * @example\n * <MappingInputWithButton\n * value={entityName}\n * onChange={setEntityName}\n * onSubmit={handleCreateOrOpen}\n * buttonLabel={exists ? \"Open\" : \"Create\"}\n * showButton={entityName.trim().length > 0}\n * placeholder=\"Type entity name...\"\n * />\n */\nexport function MappingInputWithButton({\n value,\n onChange,\n onSubmit,\n buttonLabel,\n showButton = false,\n onKeyDown,\n placeholder,\n disabled = false,\n type = 'text',\n title,\n className = '',\n autoFocus = false,\n onBlur,\n onClick,\n}: MappingInputWithButtonProps) {\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n // Always check for Enter first\n if (e.key === 'Enter') {\n e.preventDefault();\n onSubmit();\n return;\n }\n\n // Then delegate to custom handler if provided\n if (onKeyDown) {\n onKeyDown(e);\n }\n };\n\n const handleButtonClick = (e: React.MouseEvent) => {\n e.preventDefault(); // Prevent any form submission\n onSubmit();\n };\n\n // Determine if button should be visible\n const isButtonVisible = showButton && value.trim().length > 0;\n\n return (\n <div className=\"elb-mapping-input-with-button\">\n <MappingInput\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n onBlur={onBlur}\n onClick={onClick}\n placeholder={placeholder}\n disabled={disabled}\n type={type}\n title={title}\n className={className}\n autoFocus={autoFocus}\n />\n {isButtonVisible && (\n <button\n type=\"button\"\n className=\"elb-mapping-input-button\"\n onClick={handleButtonClick}\n disabled={disabled}\n >\n {buttonLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInputWithButton } from '../atoms/mapping-input-with-button';\n\n/**\n * Entity Pane - Shows actions for an entity\n *\n * Displays:\n * - List of existing actions for the entity\n * - Input field to create new actions\n */\nexport interface MappingEntityPaneProps {\n path: string[]; // Should be [entity]\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingEntityPane({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingEntityPaneProps) {\n const [newActionName, setNewActionName] = useState('');\n const [actionExists, setActionExists] = useState(false);\n\n const entity = path[0];\n const entityConfig = mappingState.actions.getValue([entity]) as\n | Record<string, unknown>\n | undefined;\n const actions =\n entityConfig && typeof entityConfig === 'object'\n ? Object.keys(entityConfig).sort()\n : [];\n\n // Check if action exists\n useEffect(() => {\n if (newActionName) {\n const exists = actions.includes(newActionName);\n setActionExists(exists);\n } else {\n setActionExists(false);\n }\n }, [newActionName, actions]);\n\n const handleActionInput = (value: string) => {\n setNewActionName(value);\n };\n\n const handleActionKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setNewActionName('');\n setActionExists(false);\n }\n };\n\n const handleActionSubmit = () => {\n if (!newActionName.trim()) {\n setNewActionName('');\n return;\n }\n\n if (actionExists) {\n // Navigate to existing action\n navigation.openTab([entity, newActionName], 'rule');\n setNewActionName('');\n setActionExists(false);\n } else {\n // Create new action\n mappingState.actions.createRule(entity, newActionName.trim(), {});\n navigation.openTab([entity, newActionName.trim()], 'rule');\n setNewActionName('');\n }\n };\n\n const handleActionClick = (action: string) => {\n navigation.openTab([entity, action], 'rule');\n };\n\n // Get the preview text for an action (the name value from the rule or fallback)\n const getActionPreview = (action: string): string => {\n const rule = mappingState.actions.getValue([entity, action]) as\n | Record<string, unknown>\n | undefined;\n if (rule && typeof rule.name === 'string' && rule.name) {\n return rule.name;\n }\n return `${entity} ${action}`;\n };\n\n return (\n <BaseMappingPane\n title={entity}\n description=\"Select an action or create a new one\"\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-entity-pane-body\">\n {/* New action input */}\n <div className=\"elb-mapping-entity-pane-new-action\">\n <MappingInputWithButton\n value={newActionName}\n onChange={handleActionInput}\n onSubmit={handleActionSubmit}\n onKeyDown={handleActionKeyDown}\n buttonLabel={actionExists ? 'Open' : 'Create'}\n showButton={true}\n placeholder=\"Type action name to create or select...\"\n className={actionExists ? 'is-existing' : ''}\n />\n </div>\n\n {/* Existing actions list */}\n {actions.length > 0 && (\n <div className=\"elb-mapping-tile-section\">\n <h3 className=\"elb-mapping-tile-title\">Existing Actions</h3>\n <div className=\"elb-mapping-entity-pane-action-list\">\n {actions.map((action) => {\n const preview = getActionPreview(action);\n const isLongPreview = preview.length > 20;\n return (\n <button\n key={action}\n type=\"button\"\n className=\"elb-mapping-entity-pane-action-tile\"\n onClick={() => handleActionClick(action)}\n >\n <div className=\"elb-mapping-entity-pane-action-tile-action\">\n {action}\n </div>\n <div\n className={`elb-mapping-entity-pane-action-tile-preview ${isLongPreview ? 'is-long' : ''}`}\n >\n {preview}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {actions.length === 0 && !newActionName && (\n <div className=\"elb-mapping-entity-pane-empty\">\n <p>No actions yet. Type above to create the first action.</p>\n </div>\n )}\n </div>\n </BaseMappingPane>\n );\n}\n","/**\n * Pane Header - Standardized header for pane views\n *\n * Provides consistent header layout across all pane views with:\n * - Back button (conditionally visible based on hideBackButton)\n * - Title\n * - Description\n * - Optional action button (e.g., Reset)\n */\nexport interface PaneHeaderProps {\n title: string;\n description: string;\n onBack?: () => void;\n canGoBack?: boolean;\n hideBackButton?: boolean;\n action?: {\n label: string;\n onClick: () => void;\n title?: string;\n };\n className?: string;\n}\n\nexport function PaneHeader({\n title,\n description,\n onBack,\n canGoBack = false,\n hideBackButton = false,\n action,\n className = '',\n}: PaneHeaderProps) {\n return (\n <div className={`elb-pane-header ${className}`}>\n <div className=\"elb-pane-header-content\">\n {!hideBackButton && (\n <button\n type=\"button\"\n className={`elb-pane-header-back ${!onBack || !canGoBack ? 'is-disabled' : ''}`}\n onClick={onBack && canGoBack ? onBack : undefined}\n disabled={!onBack || !canGoBack}\n aria-label=\"Go back\"\n title={onBack && canGoBack ? 'Go back' : 'No history'}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.5 15L7.5 10L12.5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n <h3 className=\"elb-pane-header-title\">\n {title}{' '}\n <span className=\"elb-pane-header-description\">{description}</span>\n </h3>\n </div>\n {action && (\n <button\n type=\"button\"\n className=\"elb-pane-header-action\"\n onClick={action.onClick}\n title={action.title}\n >\n {action.label}\n </button>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { PaneHeader } from './pane-header';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\n\nexport interface BaseMappingPaneProps {\n /**\n * Pane title - if not provided (along with description), header won't render\n */\n title?: string;\n\n /**\n * Pane description - if not provided (along with title), header won't render\n */\n description?: string;\n\n /**\n * Navigation hook for back button functionality\n * If not provided, back button will be disabled\n */\n navigation?: UseMappingNavigationReturn;\n\n /**\n * Hide the back button even if navigation is provided\n * Useful for nested panes (e.g., ValueTypePaneView inside Loop pane)\n */\n hideNavigation?: boolean;\n\n /**\n * Optional action button in header (e.g., Reset)\n */\n headerAction?: {\n label: string;\n onClick: () => void;\n title?: string;\n };\n\n /**\n * Pane content\n */\n children: React.ReactNode;\n\n /**\n * Additional CSS class names\n */\n className?: string;\n}\n\n/**\n * BaseMappingPane - Standard pane wrapper with optional sticky header\n *\n * Provides consistent structure for all mapping panes:\n * - Optional sticky header with back button\n * - Scrollable content area\n * - Proper flex layout for full-height panes\n *\n * Header visibility logic:\n * - Shows header if title OR description is provided\n * - Hides header if both title AND description are undefined\n * - Use hideNavigation={true} to show header without back button (nested panes)\n *\n * Features:\n * - Sticky header stays visible while scrolling\n * - Proper scrolling with min-height: 0 for flexbox\n * - Extra bottom padding (50vh) for comfortable scrolling\n * - DRY principle - single source of truth for pane structure\n *\n * @example\n * // Standard pane with header\n * <BaseMappingPane\n * title=\"Event Name\"\n * description=\"Override the event name\"\n * navigation={navigation}\n * >\n * <div>Content here</div>\n * </BaseMappingPane>\n *\n * @example\n * // Nested pane without header\n * <BaseMappingPane>\n * <div>Content with no header</div>\n * </BaseMappingPane>\n *\n * @example\n * // Pane with header but no navigation (e.g., section header)\n * <BaseMappingPane\n * title=\"Item Mapping\"\n * description=\"Configure transformation\"\n * hideNavigation={true}\n * >\n * <div>Nested content</div>\n * </BaseMappingPane>\n */\nexport function BaseMappingPane({\n title,\n description,\n navigation,\n hideNavigation = false,\n headerAction,\n children,\n className = '',\n}: BaseMappingPaneProps) {\n // Show header if title OR description is provided\n const showHeader = !!(title || description);\n\n return (\n <div className={`elb-mapping-pane ${className}`}>\n {showHeader && (\n <div className=\"elb-mapping-pane-header--sticky\">\n <PaneHeader\n title={title || ''}\n description={description || ''}\n onBack={navigation?.goBack}\n canGoBack={navigation?.canGoBack() ?? false}\n hideBackButton={hideNavigation}\n action={headerAction}\n />\n </div>\n )}\n <div className=\"elb-mapping-pane-content\">{children}</div>\n </div>\n );\n}\n","import React from 'react';\n\nexport interface ConfigTileStatus {\n enabled: boolean;\n text?: string;\n maxLength?: number;\n}\n\nexport interface ConfigTileProps {\n label: string;\n description?: string;\n status: ConfigTileStatus;\n onClick: () => void;\n className?: string;\n}\n\n/**\n * ConfigTile - Reusable tile component for configuration options\n *\n * Features:\n * - Status indicator (green/gray circle)\n * - Optional status text with fade effect for long values\n * - Hover states with theme colors\n * - Automatic styling based on enabled state\n *\n * Used by:\n * - Rule overview (name, data, settings, batch, ignore, etc.)\n * - ValueConfig options (key, value, fn, map, loop, etc.)\n *\n * @example\n * <ConfigTile\n * label=\"Name\"\n * description=\"Override the destination event name\"\n * status={{ enabled: true, text: \"page_view\" }}\n * onClick={() => handleEdit('name')}\n * />\n */\nexport function ConfigTile({\n label,\n description,\n status,\n onClick,\n className = '',\n}: ConfigTileProps) {\n const maxLength = status.maxLength || 20;\n const isLongText = (status.text?.length || 0) > maxLength;\n\n return (\n <button\n className={`elb-config-tile ${status.enabled ? 'is-enabled' : ''} ${className}`}\n onClick={onClick}\n type=\"button\"\n >\n <div className=\"elb-config-tile-header\">\n <div className=\"elb-config-tile-label\">{label}</div>\n <div className=\"elb-config-tile-status\">\n <div\n className={`elb-config-tile-indicator ${\n status.enabled ? 'is-enabled' : 'is-disabled'\n }`}\n />\n {status.text && (\n <div\n className={`elb-config-tile-status-text ${isLongText ? 'is-long' : ''}`}\n >\n {status.text}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"elb-config-tile-description\">{description}</div>\n </button>\n );\n}\n\n// Legacy export for backward compatibility during migration\nexport type RuleTileStatus = ConfigTileStatus;\nexport type RuleTileProps = ConfigTileProps;\nexport const RuleTile = ConfigTile;\n","import type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport type { ConfigStructureDef } from '../../schemas/config-structures/types';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { RuleTile } from '../atoms/config-tile';\nimport { detectNodeType } from '../../utils/type-detector';\n\n/**\n * Generic Config Overview Pane\n *\n * Shows all available properties from a structure definition as tiles.\n * Works at any depth with any config type (DestinationConfig, Rule, etc.).\n *\n * Features:\n * - Shows configured properties (with values)\n * - Shows available properties (not yet set)\n * - Uses structure definition for metadata (titles, descriptions)\n * - Generic - works with any ConfigStructureDef\n *\n * @example\n * // Full DestinationConfig\n * <ConfigOverviewPane\n * config={destinationConfig}\n * structure={DESTINATION_CONFIG_STRUCTURE}\n * navigation={navigation}\n * />\n *\n * @example\n * // Single Rule\n * <ConfigOverviewPane\n * config={ruleConfig}\n * structure={MAPPING_RULE_STRUCTURE}\n * navigation={navigation}\n * />\n */\nexport interface ConfigOverviewPaneProps<T extends Record<string, unknown>> {\n config: T;\n structure: ConfigStructureDef;\n navigation: UseMappingNavigationReturn;\n schemas?: Record<string, RJSFSchema>;\n className?: string;\n /** Base path to prepend when navigating (e.g., ['mapping', 'page', 'view']) */\n basePath?: string[];\n /** Root structure for detectNodeType (defaults to structure if not provided) */\n rootStructure?: ConfigStructureDef;\n}\n\ninterface PropertyInfo {\n key: string;\n title: string;\n description?: string;\n value?: unknown;\n}\n\n/**\n * Get status badge for a property value\n */\nfunction getPropertyStatus(value: unknown): {\n enabled: boolean;\n text: string;\n variant?: 'success' | 'warning' | 'danger';\n} {\n if (value === undefined || value === null) {\n return { enabled: false, text: 'Not set' };\n }\n\n if (typeof value === 'boolean') {\n return value\n ? { enabled: true, text: 'Enabled', variant: 'success' }\n : { enabled: false, text: 'Disabled' };\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return { enabled: true, text: String(value) };\n }\n\n if (typeof value === 'object') {\n if (Array.isArray(value)) {\n return { enabled: true, text: `${value.length} items` };\n }\n const keys = Object.keys(value);\n return { enabled: true, text: `${keys.length} properties` };\n }\n\n return { enabled: true, text: 'Set' };\n}\n\nexport function ConfigOverviewPane<T extends Record<string, unknown>>({\n config,\n structure,\n navigation,\n schemas,\n className = '',\n basePath = [],\n rootStructure,\n}: ConfigOverviewPaneProps<T>) {\n if (!structure.properties) {\n return (\n <BaseMappingPane\n title={structure.title || 'Configuration'}\n description={structure.description}\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-rule-section\">\n <p>No properties defined in structure.</p>\n </div>\n </BaseMappingPane>\n );\n }\n\n // Get all property keys from structure\n const propertyKeys = Object.keys(structure.properties);\n\n // Separate configured vs available\n const configuredProperties: PropertyInfo[] = [];\n const availableProperties: PropertyInfo[] = [];\n\n propertyKeys.forEach((key) => {\n const propertyDef = structure.properties![key];\n const value = config[key as keyof T];\n\n const propertyInfo: PropertyInfo = {\n key,\n title: propertyDef.title || capitalize(key),\n description: propertyDef.description,\n value,\n };\n\n if (value !== undefined) {\n configuredProperties.push(propertyInfo);\n } else {\n availableProperties.push(propertyInfo);\n }\n });\n\n const handlePropertyClick = (property: PropertyInfo) => {\n const fullPath = [...basePath, property.key];\n const detectionStructure = rootStructure || structure;\n const nodeType = detectNodeType(property.value, fullPath, detectionStructure, schemas);\n navigation.openTab(fullPath, nodeType);\n };\n\n return (\n <BaseMappingPane\n title={structure.title || 'Configuration'}\n description={structure.description}\n navigation={navigation}\n className={className}\n >\n {/* Configured Properties */}\n {configuredProperties.length > 0 && (\n <div className=\"elb-mapping-rule-section\">\n <h3 className=\"elb-mapping-rule-section-title\">Configured</h3>\n <div className=\"elb-mapping-rule-section-grid\">\n {configuredProperties.map((property) => (\n <RuleTile\n key={property.key}\n label={property.title}\n description={property.description}\n status={getPropertyStatus(property.value)}\n onClick={() => handlePropertyClick(property)}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Available Properties */}\n {availableProperties.length > 0 && (\n <div className=\"elb-mapping-rule-section\">\n <h3 className=\"elb-mapping-rule-section-title\">Available</h3>\n <div className=\"elb-mapping-rule-section-grid\">\n {availableProperties.map((property) => (\n <RuleTile\n key={property.key}\n label={property.title}\n description={property.description}\n status={{ enabled: false, text: 'Not set' }}\n onClick={() => handlePropertyClick(property)}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Empty State */}\n {configuredProperties.length === 0 &&\n availableProperties.length === 0 && (\n <div className=\"elb-mapping-rule-section\">\n <div\n style={{\n padding: '40px 20px',\n textAlign: 'center',\n color: 'var(--color-text-muted)',\n }}\n >\n <div style={{ fontSize: '48px', marginBottom: '16px' }}>📦</div>\n <div style={{ fontSize: '16px', fontWeight: 500 }}>\n No properties available\n </div>\n <div style={{ fontSize: '14px', marginTop: '8px' }}>\n This configuration has no properties defined.\n </div>\n </div>\n </div>\n )}\n </BaseMappingPane>\n );\n}\n\n/**\n * Capitalize first letter\n */\nfunction capitalize(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import { useState } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\nimport { MappingConfirmButton } from '../atoms/mapping-confirm-button';\nimport { getConfiguredProperties } from '../../utils/value-display-formatter';\n\n/**\n * Policy Overview Pane\n *\n * Shows all policy rules as a list with badges for configured properties.\n * Policy rules are pre-processing transformations that modify events before mapping.\n *\n * Can be used for:\n * - Config-level policy: path = ['policy']\n * - Event-level policy: path = ['entity', 'action', 'policy']\n *\n * Each rule:\n * - Path: The dot-notation key in the event (e.g., 'user.email', 'data.price')\n * - Value: A Value mapping (key, fn, map, loop, etc.)\n * - Badges: Show which properties are configured (fn, consent, condition, etc.)\n * - Actions: Delete\n */\nexport interface MappingPolicyOverviewPaneProps {\n path?: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingPolicyOverviewPane({\n path = ['policy'],\n mappingState,\n navigation,\n className = '',\n}: MappingPolicyOverviewPaneProps) {\n const [newPolicyPath, setNewPolicyPath] = useState('');\n const [pathExists, setPathExists] = useState(false);\n\n // Get policy from the current path\n const policyValue = mappingState.actions.getValue(path);\n const policy =\n policyValue &&\n typeof policyValue === 'object' &&\n !Array.isArray(policyValue)\n ? (policyValue as Record<string, unknown>)\n : {};\n\n // Get sorted list of policy paths\n const policyPaths = Object.keys(policy).sort();\n\n const handlePathInputChange = (value: string) => {\n setNewPolicyPath(value);\n setPathExists(policy[value] !== undefined);\n };\n\n const handlePathSubmit = () => {\n const policyPath = newPolicyPath.trim();\n if (!policyPath) {\n setNewPolicyPath('');\n return;\n }\n\n // Navigate to the policy rule (creates path in navigation)\n // Don't pre-populate value - let user configure it\n navigation.openTab([...path, policyPath], 'valueType');\n\n setNewPolicyPath('');\n setPathExists(false);\n };\n\n const handlePathKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handlePathSubmit();\n } else if (e.key === 'Escape') {\n setNewPolicyPath('');\n setPathExists(false);\n }\n };\n\n const handlePathBlur = () => {\n setTimeout(() => {\n handlePathSubmit();\n }, 150);\n };\n\n const handlePathClick = (policyPath: string) => {\n navigation.openTab([...path, policyPath], 'valueType');\n };\n\n const handleBadgeClick = (policyPath: string, property: string) => {\n // All badges navigate to the ValueType pane which shows all tiles\n // User can click the appropriate tile there\n navigation.openTab([...path, policyPath], 'valueType');\n };\n\n const handleDeleteClick = (policyPath: string) => {\n mappingState.actions.deleteValue([...path, policyPath]);\n };\n\n // Determine which properties are configured for a policy value\n return (\n <BaseMappingPane\n title=\"Policy\"\n description={\n policyPaths.length === 0\n ? 'No policy rules yet. Add rules to pre-process events before mapping.'\n : `${policyPaths.length} rule${policyPaths.length === 1 ? '' : 's'}`\n }\n navigation={navigation}\n className={className}\n >\n {/* Add new policy rule input */}\n <div className=\"elb-policy-input-section\">\n <MappingInput\n value={newPolicyPath}\n onChange={handlePathInputChange}\n onKeyDown={handlePathKeyDown}\n onBlur={handlePathBlur}\n placeholder=\"Type path to create or select (e.g., user.email)...\"\n className={pathExists ? 'is-existing' : ''}\n />\n </div>\n\n {/* Policy rules list */}\n {policyPaths.length > 0 && (\n <div className=\"elb-policy-list\">\n {policyPaths.map((path) => {\n const value = policy[path];\n const configuredProps = getConfiguredProperties(value);\n\n return (\n <div key={path} className=\"elb-policy-row\">\n {/* Path */}\n <button\n type=\"button\"\n className=\"elb-policy-row-path\"\n onClick={() => handlePathClick(path)}\n title=\"Click to edit this policy rule\"\n >\n {path}\n </button>\n\n {/* Badges */}\n <div className=\"elb-policy-row-badges\">\n {configuredProps.map(({ prop, value, isLong }) => (\n <button\n key={prop}\n type=\"button\"\n className=\"elb-policy-badge\"\n onClick={() => handleBadgeClick(path, prop)}\n title={`${prop}: ${value}`}\n >\n <span className=\"elb-policy-badge-label\">{prop}:</span>\n <span\n className={`elb-policy-badge-value ${isLong ? 'is-long' : ''}`}\n >\n {value}\n </span>\n </button>\n ))}\n </div>\n\n {/* Actions */}\n <div className=\"elb-policy-row-actions\">\n <MappingConfirmButton\n confirmLabel=\"Delete?\"\n onConfirm={() => handleDeleteClick(path)}\n ariaLabel={`Delete policy rule ${path}`}\n className=\"elb-mapping-delete-button\"\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Empty state */}\n {policyPaths.length === 0 && (\n <div className=\"elb-policy-empty\">\n <p>\n Policy rules modify events before mapping is applied. Common uses:\n </p>\n <ul>\n <li>Normalize data (e.g., lowercase emails)</li>\n <li>Enrich events (e.g., copy values, compute totals)</li>\n <li>Clean data (e.g., remove PII, format dates)</li>\n </ul>\n </div>\n )}\n </BaseMappingPane>\n );\n}\n","/**\n * Value Display Formatter\n *\n * Utilities for formatting values and extracting configured properties\n * from ValueConfig objects for display in badges and UI elements.\n */\n\nexport interface PropertyBadge {\n prop: string; // Property name (empty string for simple values)\n value: string; // Formatted value for display\n isLong: boolean; // True if value length > 20 characters\n}\n\n/**\n * Format a value for display in a badge\n *\n * @param val - The value to format\n * @returns Formatted string representation\n */\nexport function formatValueForDisplay(val: unknown): string {\n if (typeof val === 'string') return `\"${val}\"`;\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n\n if (Array.isArray(val)) {\n if (val.length === 0) return '[]';\n // For arrays, show the first item (useful for loop/set arrays)\n const firstItem = val[0];\n if (typeof firstItem === 'string') return `\"${firstItem}\"`;\n if (typeof firstItem === 'number' || typeof firstItem === 'boolean')\n return String(firstItem);\n // For complex first items, show count\n return `[${val.length}]`;\n }\n\n if (typeof val === 'object' && val !== null) {\n const keys = Object.keys(val);\n if (keys.length === 0) return '{}';\n // For objects (like map), show the keys in curly braces\n return `{ ${keys.join(', ')} }`;\n }\n\n return '';\n}\n\n/**\n * Extract configured properties from a value for display\n *\n * Handles:\n * - Simple strings: Returns without prop label\n * - ValueConfig with only key: Returns without prop label\n * - Full ValueConfig: Returns all configured properties with labels\n *\n * @param value - The value to analyze (string or ValueConfig object)\n * @returns Array of property badges for display\n */\nexport function getConfiguredProperties(value: unknown): PropertyBadge[] {\n // Simple string value - return without prop label\n if (typeof value === 'string') {\n return [\n {\n prop: '', // Empty prop means no label, just show the value\n value: `\"${value}\"`,\n isLong: value.length > 20,\n },\n ];\n }\n\n if (!value || typeof value !== 'object') return [];\n\n const props: PropertyBadge[] = [];\n const obj = value as Record<string, unknown>;\n\n // Check if this is a ValueConfig with ONLY a key property\n // In this case, display it as a simple value without the \"key:\" label\n const objKeys = Object.keys(obj);\n if (\n objKeys.length === 1 &&\n 'key' in obj &&\n obj.key &&\n typeof obj.key === 'string'\n ) {\n return [\n {\n prop: '', // No label, just show the key value\n value: `\"${obj.key}\"`,\n isLong: obj.key.length > 20,\n },\n ];\n }\n\n // Helper to add a property to the list\n const addProp = (prop: string, val: unknown) => {\n const formatted = formatValueForDisplay(val);\n props.push({\n prop,\n value: formatted,\n isLong: formatted.length > 20,\n });\n };\n\n // Check all possible ValueConfig properties in consistent order\n if ('fn' in obj && obj.fn) addProp('fn', obj.fn);\n if ('key' in obj && obj.key) addProp('key', obj.key);\n if ('value' in obj && obj.value !== undefined) addProp('value', obj.value);\n if ('map' in obj && obj.map) addProp('map', obj.map);\n if ('loop' in obj && obj.loop) addProp('loop', obj.loop);\n if ('set' in obj && obj.set) addProp('set', obj.set);\n if ('consent' in obj && obj.consent) addProp('consent', obj.consent);\n if ('condition' in obj && obj.condition) addProp('condition', obj.condition);\n if ('validate' in obj && obj.validate) addProp('validate', obj.validate);\n\n return props;\n}\n","import { MappingTypeSelector } from './mapping-type-selector';\nimport type { ValueConfigType } from '../atoms/mapping-type-button';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\n\n/**\n * ValueConfig Pane View - Pure Presentation Component\n *\n * Most complex pane - edits value transformations based on type:\n * - key: Extract value from event path (string)\n * - value: Static value (any type)\n * - map: Transform to object (opens MapPaneView)\n * - loop: Process array (opens LoopPaneView)\n * - function: Custom transformation (code editor)\n * - set: Array of static values\n *\n * Uses MappingTypeSelector to switch between types.\n *\n * @example\n * <MappingValueConfigPaneView\n * path={['product', 'view', 'data']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport interface MappingValueConfigPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingValueConfigPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingValueConfigPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const pathLabel = path[path.length - 1] || 'Value';\n\n // Determine current type\n const getCurrentType = (): ValueConfigType | null => {\n // undefined or other primitives - return null so pathLabel can determine type\n if (value === undefined || typeof value !== 'object' || value === null)\n return null;\n // Check object properties\n if ('map' in value) return 'map';\n if ('loop' in value) return 'loop';\n if ('fn' in value) return 'function';\n if ('value' in value) return 'value';\n if ('set' in value) return 'set';\n return null;\n };\n\n const currentType = getCurrentType();\n\n // Use pathLabel to determine type when value is undefined/null\n // This ensures correct editor when navigating to a specific property path\n const effectiveType = currentType || 'value';\n\n // Type change handler - converts value to new type\n const handleTypeChange = (newType: ValueConfigType) => {\n if (newType === currentType) return;\n\n switch (newType) {\n case 'value':\n mappingState.actions.setValue(path, { value: '' });\n break;\n case 'map':\n mappingState.actions.setValue(path, { map: {} });\n break;\n case 'loop':\n mappingState.actions.setValue(path, { loop: ['nested', 'this'] });\n break;\n case 'function':\n mappingState.actions.setValue(path, { fn: '(event) => event.data' });\n break;\n case 'set':\n mappingState.actions.setValue(path, { set: [] });\n break;\n }\n };\n\n // Type-specific value handlers\n const handleStaticValueChange = (newValue: string) => {\n // When the entire ValueConfig at 'path' is { value: X }, update it to { value: newValue }\n mappingState.actions.setValue(path, { value: newValue });\n };\n\n const handleFunctionChange = (newValue: string) => {\n mappingState.actions.setValue(path, { fn: newValue });\n };\n\n const handleOpenComplex = () => {\n const nodeType: 'map' | 'loop' | 'valueConfig' =\n currentType === 'map'\n ? 'map'\n : currentType === 'loop'\n ? 'loop'\n : 'valueConfig';\n navigation.openTab(path, nodeType);\n };\n\n // Render type-specific editor\n const renderEditor = () => {\n switch (effectiveType) {\n case 'value':\n const staticValue =\n typeof value === 'object' && value !== null && 'value' in value\n ? ((value as Record<string, unknown>).value as string) || ''\n : '';\n return (\n <BaseMappingPane\n title=\"Static Value\"\n description=\"Fixed value that will be used (string, number, or boolean)\"\n navigation={navigation}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n value={String(staticValue)}\n onChange={handleStaticValueChange}\n placeholder=\"USD\"\n />\n <div className=\"elb-mapping-pane-hint\">\n Use for constant values like currency codes, fixed IDs, etc.\n </div>\n </div>\n </BaseMappingPane>\n );\n\n case 'map':\n const mapObj =\n typeof value === 'object' && value !== null && 'map' in value\n ? ((value as Record<string, unknown>).map as Record<\n string,\n unknown\n >) || {}\n : {};\n const mapKeyCount = Object.keys(mapObj).length;\n return (\n <BaseMappingPane\n title=\"Map Object\"\n description=\"Transform event data into an object with multiple keys\"\n navigation={navigation}\n >\n <div className=\"elb-mapping-pane-field\">\n <div className=\"elb-mapping-value-complex\">\n <div className=\"elb-mapping-value-complex-info\">\n <span className=\"elb-mapping-pane-type-badge\">map</span>\n <span>\n {mapKeyCount} {mapKeyCount === 1 ? 'key' : 'keys'} defined\n </span>\n </div>\n <button\n type=\"button\"\n className=\"elb-mapping-pane-button elb-mapping-pane-button--primary\"\n onClick={handleOpenComplex}\n >\n Edit Map →\n </button>\n </div>\n </div>\n </BaseMappingPane>\n );\n\n case 'loop':\n const loopArr =\n typeof value === 'object' && value !== null && 'loop' in value\n ? ((value as Record<string, unknown>).loop as unknown[]) || []\n : [];\n const loopSource = (\n Array.isArray(loopArr) && loopArr.length > 0 ? loopArr[0] : 'nested'\n ) as string;\n return (\n <BaseMappingPane\n title=\"Loop Array\"\n description=\"Process an array of items from the event\"\n navigation={navigation}\n >\n <div className=\"elb-mapping-pane-field\">\n <div className=\"elb-mapping-value-complex\">\n <div className=\"elb-mapping-value-complex-info\">\n <span className=\"elb-mapping-pane-type-badge\">loop</span>\n <span>Source: {loopSource}</span>\n </div>\n <button\n type=\"button\"\n className=\"elb-mapping-pane-button elb-mapping-pane-button--primary\"\n onClick={handleOpenComplex}\n >\n Edit Loop →\n </button>\n </div>\n </div>\n </BaseMappingPane>\n );\n\n case 'function':\n const fnValue =\n typeof value === 'object' && value !== null && 'fn' in value\n ? ((value as Record<string, unknown>).fn as string) ||\n '(event) => event.data'\n : '(event) => event.data';\n return (\n <BaseMappingPane\n title=\"Custom Function\"\n description=\"JavaScript function that receives the event and returns transformed value\"\n navigation={navigation}\n >\n <div className=\"elb-mapping-pane-field\">\n <textarea\n id=\"value-function\"\n className=\"elb-mapping-pane-textarea\"\n value={String(fnValue)}\n onChange={(e) => handleFunctionChange(e.target.value)}\n placeholder=\"(event) => event.data.id\"\n rows={6}\n />\n <div className=\"elb-mapping-pane-hint\">\n Function signature: (event: WalkerOS.Event) => any\n </div>\n </div>\n </BaseMappingPane>\n );\n\n case 'set':\n const setArr =\n typeof value === 'object' && value !== null && 'set' in value\n ? ((value as Record<string, unknown>).set as unknown[]) || []\n : [];\n const setCount = Array.isArray(setArr) ? setArr.length : 0;\n return (\n <BaseMappingPane\n title=\"Static Array\"\n description=\"Array of static values\"\n navigation={navigation}\n >\n <div className=\"elb-mapping-pane-field\">\n <div className=\"elb-mapping-value-complex\">\n <div className=\"elb-mapping-value-complex-info\">\n <span className=\"elb-mapping-pane-type-badge\">set</span>\n <span>\n {setCount} {setCount === 1 ? 'item' : 'items'}\n </span>\n </div>\n <button\n type=\"button\"\n className=\"elb-mapping-pane-button elb-mapping-pane-button--primary\"\n onClick={handleOpenComplex}\n disabled\n title=\"Coming soon\"\n >\n Edit Set →\n </button>\n </div>\n </div>\n </BaseMappingPane>\n );\n\n default:\n return (\n <div className=\"elb-mapping-pane-error\">\n Unknown value type. Please select a transformation type above.\n </div>\n );\n }\n };\n\n return renderEditor();\n}\n","import { useState, useEffect } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn, NodeType } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { ConfigTile, type ConfigTileStatus } from '../atoms/config-tile';\nimport { MappingInput } from '../atoms/mapping-input';\n\nexport interface MappingValueTypePaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n\n // Optional: Override or suppress header (for nested use in loop pane)\n title?: string;\n description?: string;\n hideNavigation?: boolean;\n}\n\ninterface ValueConfigTileConfig {\n key: string;\n label: string;\n description: string;\n}\n\nconst VALUE_CONFIG_TILES: ValueConfigTileConfig[] = [\n {\n key: 'key',\n label: 'Key',\n description: 'Property path',\n },\n {\n key: 'value',\n label: 'Value',\n description: 'Static value',\n },\n {\n key: 'fn',\n label: 'Fn',\n description: 'Custom function',\n },\n {\n key: 'map',\n label: 'Map',\n description: 'Transform object',\n },\n {\n key: 'loop',\n label: 'Loop',\n description: 'Array iteration',\n },\n {\n key: 'set',\n label: 'Set',\n description: 'Multiple values',\n },\n {\n key: 'consent',\n label: 'Consent',\n description: 'Required states',\n },\n {\n key: 'validate',\n label: 'Validate',\n description: 'Check function',\n },\n];\n\n/**\n * ValueType Pane - Edit ValueType (string | ValueConfig)\n *\n * Simple logic:\n * - String mode: Quick Value input edits the string directly\n * - Object mode: Quick Value input ALWAYS edits the 'key' property\n * - Input is NEVER disabled\n * - Quick Value and Key tile are always synced\n *\n * Smart Conversions:\n * - Clicking any tile in String mode converts to { key: \"string value\" }\n * - All tiles (including Key) are clickable and open their respective editors\n * - Conversion happens automatically before opening the editor\n */\nexport function MappingValueTypePaneView({\n path,\n mappingState,\n navigation,\n className = '',\n title = 'Value Configuration',\n description = 'Configure how to extract or transform data',\n hideNavigation = false,\n}: MappingValueTypePaneViewProps) {\n const value = mappingState.actions.getValue(path);\n\n // Determine current mode\n const isString = typeof value === 'string';\n const isValueConfig = typeof value === 'object' && value !== null;\n const valueConfig = isValueConfig ? (value as Record<string, unknown>) : {};\n\n // Display value for the input\n // - If string: show the string value\n // - If object: show the key property value (or empty if no key)\n const displayValue = isString\n ? (value as string)\n : typeof valueConfig.key === 'string'\n ? valueConfig.key\n : '';\n\n const handleStringChange = (newValue: string) => {\n if (isString || value === undefined) {\n // String mode or undefined: set as string value\n mappingState.actions.setValue(path, newValue);\n } else if (isValueConfig) {\n // ValueConfig mode: update the key property using the sub-path\n // This works whether it's key-only or has multiple properties\n mappingState.actions.setValue([...path, 'key'], newValue);\n }\n };\n\n const handleTileClick = (tileKey: string) => {\n // If in string mode, convert to ValueConfig first (for all tiles)\n // This preserves the string value as the 'key' property\n if (isString && displayValue) {\n mappingState.actions.setValue(path, { key: displayValue });\n } else if (value === undefined) {\n // If value is undefined, initialize as empty object so tile properties can be set\n mappingState.actions.setValue(path, {});\n }\n\n // Determine the appropriate nodeType based on the property\n // Properties that hold primitives get dedicated editors\n // Properties that hold ValueConfig objects get the generic valueConfig editor\n let nodeType: string;\n switch (tileKey) {\n case 'key':\n nodeType = 'key'; // Key property editor\n break;\n case 'value':\n nodeType = 'value'; // Primitive value editor\n break;\n case 'fn':\n nodeType = 'fn'; // Function editor (placeholder for now)\n break;\n case 'validate':\n nodeType = 'validate'; // Validate function editor (placeholder for now)\n break;\n case 'condition':\n nodeType = 'condition'; // Condition function editor (already implemented)\n break;\n case 'consent':\n nodeType = 'consent'; // Consent editor (already implemented)\n break;\n case 'map':\n nodeType = 'map'; // Map editor (placeholder for now)\n break;\n case 'loop':\n nodeType = 'loop'; // Loop editor (placeholder for now)\n break;\n case 'set':\n nodeType = 'set'; // Set editor (placeholder for now)\n break;\n default:\n nodeType = 'valueConfig'; // Fallback to generic editor\n }\n\n navigation.openTab([...path, tileKey], nodeType as NodeType);\n };\n\n const getTileStatus = (tileKey: string): ConfigTileStatus => {\n // For 'key' tile: only enabled if we have a ValueConfig with a key property\n if (tileKey === 'key') {\n if (isString) {\n // In string mode, there is no ValueConfig and no key property\n return { enabled: false, text: 'Not set' };\n } else if (isValueConfig) {\n // In ValueConfig mode, show the key property status\n const keyValue = valueConfig.key;\n return typeof keyValue === 'string' && keyValue\n ? { enabled: true, text: keyValue }\n : { enabled: false, text: 'Not set' };\n }\n }\n\n // For all other tiles, only show status if in ValueConfig mode\n if (!isValueConfig) {\n return { enabled: false, text: 'Not set' };\n }\n\n const configValue = valueConfig[tileKey];\n\n switch (tileKey) {\n case 'key':\n // Already handled above\n return { enabled: false, text: 'Not set' };\n\n case 'value':\n if (configValue !== undefined) {\n let displayText: string;\n if (typeof configValue === 'string') {\n displayText = configValue;\n } else if (typeof configValue === 'number') {\n displayText = String(configValue);\n } else if (typeof configValue === 'boolean') {\n displayText = String(configValue);\n } else if (configValue === null) {\n displayText = 'null';\n } else if (Array.isArray(configValue)) {\n displayText = `[${configValue.length} items]`;\n } else if (typeof configValue === 'object') {\n // Show only values, not keys\n const values = Object.values(\n configValue as Record<string, unknown>,\n );\n displayText = values\n .map((v) => (typeof v === 'string' ? v : JSON.stringify(v)))\n .join(', ');\n } else {\n displayText = String(configValue);\n }\n // Truncate if too long\n const preview =\n displayText.length > 40\n ? displayText.substring(0, 40) + '...'\n : displayText;\n return { enabled: true, text: preview };\n }\n return { enabled: false, text: 'Not set' };\n\n case 'fn':\n if (typeof configValue === 'string' && configValue) {\n // Show preview of function (first 40 chars)\n const preview =\n configValue.length > 40\n ? configValue.substring(0, 40) + '...'\n : configValue;\n return { enabled: true, text: preview };\n }\n return { enabled: false, text: 'Not set' };\n\n case 'map':\n if (!configValue) return { enabled: false, text: 'Not set' };\n const mapCount = Object.keys(\n configValue as Record<string, unknown>,\n ).length;\n return mapCount > 0\n ? {\n enabled: true,\n text: `${mapCount} ${mapCount === 1 ? 'property' : 'properties'}`,\n }\n : { enabled: false, text: 'Not set' };\n\n case 'loop':\n if (Array.isArray(configValue) && configValue.length >= 1) {\n // Show the source array path\n const source = String(configValue[0] || 'nested');\n return { enabled: true, text: `Source: ${source}` };\n }\n return { enabled: false, text: 'Not set' };\n\n case 'set':\n return Array.isArray(configValue) && configValue.length > 0\n ? {\n enabled: true,\n text: `${configValue.length} ${configValue.length === 1 ? 'value' : 'values'}`,\n }\n : { enabled: false, text: 'Not set' };\n\n case 'consent':\n if (!configValue) return { enabled: false, text: 'Not set' };\n const consentCount = Object.keys(\n configValue as Record<string, unknown>,\n ).length;\n return consentCount > 0\n ? {\n enabled: true,\n text: `${consentCount} ${consentCount === 1 ? 'state' : 'states'}`,\n }\n : { enabled: false, text: 'Not set' };\n\n case 'validate':\n if (typeof configValue === 'string' && configValue) {\n // Show preview of validation function (first 40 chars)\n const preview =\n configValue.length > 40\n ? configValue.substring(0, 40) + '...'\n : configValue;\n return { enabled: true, text: preview };\n }\n return { enabled: false, text: 'Not set' };\n\n default:\n return { enabled: false, text: 'Not set' };\n }\n };\n\n // Input is ALWAYS enabled\n const inputPlaceholder = 'e.g., data.productId, user.email';\n\n const inputTitle = 'Enter a property path to extract data from the event';\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n hideNavigation={hideNavigation}\n className={className}\n >\n {/* Quick Value Section */}\n <div className=\"elb-mapping-value-type-quick-section\">\n <div className=\"elb-mapping-value-type-section-title\">\n Dynamic Value\n </div>\n <MappingInput\n value={displayValue}\n onChange={handleStringChange}\n placeholder={inputPlaceholder}\n title={inputTitle}\n />\n <div className=\"elb-mapping-value-type-hint\">\n {isString ? (\n <span>Property path to extract data from the event</span>\n ) : (\n <span className=\"is-info\">\n Editing property path - synced with Key tile\n </span>\n )}\n </div>\n </div>\n\n {/* Advanced Configuration Section */}\n <div className=\"elb-mapping-value-type-advanced-section\">\n <div className=\"elb-mapping-value-type-section-title\">\n Advanced Configuration\n </div>\n <div className=\"elb-mapping-value-type-tiles-grid\">\n {VALUE_CONFIG_TILES.map((tile) => (\n <ConfigTile\n key={tile.key}\n label={tile.label}\n description={tile.description}\n status={getTileStatus(tile.key)}\n onClick={() => handleTileClick(tile.key)}\n />\n ))}\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\n\n/**\n * Value Pane View - Pure Presentation Component\n *\n * Edits primitive values within a ValueConfig.\n * This is specifically for the 'value' property of a ValueConfig,\n * which holds primitives (string, number, boolean), NOT nested objects.\n *\n * Type: ValueConfig.value -> WalkerOS.PropertyType (string | number | boolean)\n *\n * @example\n * // Editing the 'value' property of a ValueConfig at path ['page', 'view', 'data', 'map', 'currency']\n * // Path would be: ['page', 'view', 'data', 'map', 'currency', 'value']\n * <MappingValuePaneView\n * path={['page', 'view', 'data', 'map', 'currency', 'value']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport interface MappingValuePaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingValuePaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingValuePaneViewProps) {\n const value = mappingState.actions.getValue(path);\n\n // Convert current value to string for editing\n const stringValue =\n value === null ? 'null' : value === undefined ? '' : String(value);\n\n const handleChange = (newValue: string) => {\n // Try to infer the type from the input\n if (newValue === '') {\n // Empty string -> set as empty string (not undefined)\n mappingState.actions.setValue(path, '');\n return;\n }\n\n if (newValue === 'null') {\n mappingState.actions.setValue(path, null);\n return;\n }\n\n if (newValue === 'true') {\n mappingState.actions.setValue(path, true);\n return;\n }\n\n if (newValue === 'false') {\n mappingState.actions.setValue(path, false);\n return;\n }\n\n // Try parsing as number\n const asNumber = Number(newValue);\n if (!isNaN(asNumber) && newValue.trim() !== '') {\n mappingState.actions.setValue(path, asNumber);\n return;\n }\n\n // Default to string\n mappingState.actions.setValue(path, newValue);\n };\n\n // Determine the current type for hint display\n const currentType =\n value === null ? 'null' : value === undefined ? 'undefined' : typeof value;\n\n return (\n <BaseMappingPane\n title=\"Static Value\"\n description=\"Fixed value that will be used (string, number, or boolean)\"\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n value={stringValue}\n onChange={handleChange}\n placeholder=\"USD\"\n autoFocus\n />\n <div className=\"elb-mapping-pane-hint\">\n Current type: <strong>{currentType}</strong>\n <br />\n Use for constant values like currency codes, fixed IDs, etc.\n <br />\n Examples: \"USD\" (string), 123 (number), true (boolean), null\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\n\n/**\n * Key Pane View - Pure Presentation Component\n *\n * Edits the 'key' property - a string path that extracts data from the event.\n * This is used to reference properties like data.id, user.email, globals.currency.\n *\n * @example\n * <MappingKeyPaneView\n * path={['page', 'view', 'data', 'map', 'currency', 'key']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport interface MappingKeyPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingKeyPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingKeyPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const keyValue = typeof value === 'string' ? value : '';\n\n const handleChange = (newValue: string) => {\n mappingState.actions.setValue(path, newValue);\n };\n\n return (\n <BaseMappingPane\n title=\"Property Path\"\n description=\"Path to extract from event (e.g., data.id, user.email, globals.currency)\"\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n value={keyValue}\n onChange={handleChange}\n placeholder=\"data.property\"\n autoFocus\n />\n <div className=\"elb-mapping-pane-hint\">\n Common paths: data.*, globals.*, user.*, context.*\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import { useState, useEffect, type ReactNode } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { CodeBox } from '../molecules/code-box';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { normalizeCode } from '../../utils/code-normalizer';\nimport {\n registerWalkerOSTypes,\n addFunctionContextTypes,\n type FunctionType,\n} from '../../utils/monaco-types';\nimport { registerPalenightTheme } from '../../themes/palenight';\n\n/**\n * Help Item - represents a single parameter, return value item, etc.\n */\nexport interface HelpItem {\n code: string; // The code snippet (e.g., \"value\", \"true\")\n description: string; // Human-readable description\n}\n\n/**\n * Help Example - code example with label\n */\nexport interface HelpExample {\n label: string; // Label describing the example\n code: string | ReactNode; // Example code (can contain JSX for HTML entities)\n}\n\n/**\n * Help Section - a titled section with either items or examples\n */\nexport interface HelpSection {\n title: string; // Section title (e.g., \"Parameters\", \"Return Value\")\n items?: HelpItem[]; // List items (for parameters, return values, etc.)\n examples?: HelpExample[]; // Code examples\n}\n\n/**\n * Base Props for Function Pane Component\n */\nexport interface MappingFunctionPaneBaseProps {\n title: string; // Pane title\n description: string; // Pane description\n defaultCode: string; // Default function code\n helpSections: HelpSection[]; // Array of help sections to display\n functionType: FunctionType; // Type of function (fn, condition, validate)\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\n/**\n * Mapping Function Pane Base\n *\n * Base component for function editing panes (condition, fn, validate).\n * Consolidates shared logic for state management, code editing, and help display.\n *\n * Used by:\n * - MappingConditionPaneView\n * - MappingFnPaneView\n * - MappingValidatePaneView\n */\nexport function MappingFunctionPaneBase({\n title,\n description,\n defaultCode,\n helpSections,\n functionType,\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingFunctionPaneBaseProps) {\n // Get current value from mapping state\n const value = mappingState.actions.getValue(path);\n const initialCode = typeof value === 'string' ? value : defaultCode;\n\n const [code, setCode] = useState(initialCode);\n\n // Update local state if external value changes\n useEffect(() => {\n const currentValue = mappingState.actions.getValue(path);\n const newCode =\n typeof currentValue === 'string' ? currentValue : defaultCode;\n setCode(newCode);\n }, [path, mappingState, defaultCode]);\n\n const handleCodeChange = (newCode: string) => {\n setCode(newCode);\n\n // Check if code is different from default (normalized comparison)\n const isDefault = normalizeCode(newCode) === normalizeCode(defaultCode);\n\n if (isDefault) {\n // Remove the property if it's the default\n mappingState.actions.deleteValue(path);\n } else {\n // Save the modified code\n mappingState.actions.setValue(path, newCode);\n }\n };\n\n const handleReset = () => {\n // Reset to default and remove from mapping\n setCode(defaultCode);\n mappingState.actions.deleteValue(path);\n };\n\n // Monaco editor beforeMount handler to register types\n const handleBeforeMount = (monaco: typeof import('monaco-editor')) => {\n registerPalenightTheme(monaco);\n registerWalkerOSTypes(monaco);\n addFunctionContextTypes(monaco, { type: functionType });\n };\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n headerAction={{\n label: 'Reset',\n onClick: handleReset,\n title: 'Reset to default',\n }}\n className={className}\n >\n <div className=\"elb-mapping-function-pane\">\n {/* Code Editor */}\n <div className=\"elb-mapping-function-editor\">\n <CodeBox\n code={code}\n language=\"typescript\"\n onChange={handleCodeChange}\n showHeader={false}\n label=\"\"\n beforeMount={handleBeforeMount}\n />\n </div>\n\n {/* Help Section */}\n <div className=\"elb-mapping-function-help\">\n {helpSections.map((section, sectionIndex) => (\n <div\n key={sectionIndex}\n className=\"elb-mapping-function-help-section\"\n >\n <h4 className=\"elb-mapping-function-help-title\">\n {section.title}\n </h4>\n\n {/* Render items (parameters, return values, etc.) */}\n {section.items && section.items.length > 0 && (\n <ul className=\"elb-mapping-function-help-list\">\n {section.items.map((item, itemIndex) => (\n <li key={itemIndex}>\n <code>{item.code}</code> - {item.description}\n </li>\n ))}\n </ul>\n )}\n\n {/* Render examples */}\n {section.examples && section.examples.length > 0 && (\n <div className=\"elb-mapping-function-examples\">\n {section.examples.map((example, exampleIndex) => (\n <div\n key={exampleIndex}\n className=\"elb-mapping-function-example\"\n >\n <div className=\"elb-mapping-function-example-label\">\n {example.label}\n </div>\n <code className=\"elb-mapping-function-example-code\">\n {example.code}\n </code>\n </div>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","/**\n * Normalize code for comparison\n *\n * Removes comments, normalizes whitespace, and trims\n * to detect if user actually changed the code logic.\n *\n * @param code - The code string to normalize\n * @returns Normalized code string\n */\nexport function normalizeCode(code: string): string {\n return (\n code\n // Remove single-line comments\n .replace(/\\/\\/.*$/gm, '')\n // Remove multi-line comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n // Normalize whitespace\n .replace(/\\s+/g, ' ')\n // Trim\n .trim()\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport {\n MappingFunctionPaneBase,\n type HelpSection,\n} from './mapping-function-pane-base';\n\n/**\n * Mapping Condition Pane View\n *\n * Dedicated pane for the 'condition' property - a function that determines\n * if the mapping rule should apply to an event.\n *\n * Returns true to apply the rule, false to skip it.\n */\nexport interface MappingConditionPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nconst DEFAULT_CONDITION = `(\n value: WalkerOS.DeepPartialEvent | unknown,\n mapping: Mapping.Value,\n collector: Collector.Instance | undefined\n): boolean | Promise<boolean> => {\n // Return true to apply this rule\n return true;\n}`;\n\nconst HELP_SECTIONS: HelpSection[] = [\n {\n title: 'Parameters',\n items: [\n {\n code: 'value',\n description: 'The event or current value being processed',\n },\n {\n code: 'mapping',\n description: 'The mapping configuration',\n },\n {\n code: 'collector',\n description: 'The collector instance',\n },\n ],\n },\n {\n title: 'Return Value',\n items: [\n {\n code: 'true',\n description: 'Apply this mapping rule',\n },\n {\n code: 'false',\n description: 'Skip this mapping rule',\n },\n ],\n },\n {\n title: 'Examples',\n examples: [\n {\n label: 'Only for high-value orders:',\n code: <>(value) => value.data?.total > 100</>,\n },\n {\n label: 'Only for specific user segment:',\n code: <>(value) => value.user?.segment === 'premium'</>,\n },\n {\n label: 'Only during business hours:',\n code: (\n <>\n () => new Date().getHours() >= 9 && new Date().getHours() <\n 17\n </>\n ),\n },\n ],\n },\n];\n\nexport function MappingConditionPaneView(props: MappingConditionPaneViewProps) {\n return (\n <MappingFunctionPaneBase\n title=\"Condition Function\"\n description=\"Define when this mapping rule should apply to an event\"\n defaultCode={DEFAULT_CONDITION}\n helpSections={HELP_SECTIONS}\n functionType=\"condition\"\n {...props}\n />\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport {\n MappingFunctionPaneBase,\n type HelpSection,\n} from './mapping-function-pane-base';\n\n/**\n * Mapping Fn Pane View\n *\n * Dedicated pane for the 'fn' property - a transformation function that\n * processes event data and returns a transformed value.\n *\n * Function signature: (value, mapping, options) => any\n */\nexport interface MappingFnPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nconst DEFAULT_FN = `(\n value: WalkerOS.DeepPartialEvent | unknown,\n mapping: Mapping.Value,\n options: Mapping.Options\n): WalkerOS.Property | unknown => {\n // Transform and return the value\n // Access event data: value.data, value.user, value.globals\n // Access collector: options.collector\n return value.data;\n}`;\n\nconst HELP_SECTIONS: HelpSection[] = [\n {\n title: 'Parameters',\n items: [\n {\n code: 'value',\n description: 'The event or current value being processed',\n },\n {\n code: 'mapping',\n description: 'The mapping configuration for this property',\n },\n {\n code: 'options',\n description: 'Additional options',\n },\n ],\n },\n {\n title: 'Return Value',\n items: [\n {\n code: 'any',\n description:\n 'Return the transformed value (string, number, object, array)',\n },\n {\n code: 'undefined',\n description: 'Return undefined to skip this property',\n },\n {\n code: 'Promise',\n description: 'Can be async (return Promise)',\n },\n ],\n },\n {\n title: 'Examples',\n examples: [\n {\n label: 'Extract nested property:',\n code: <>(value) => value.data?.product?.id</>,\n },\n {\n label: 'Format currency:',\n code: (\n <>\n (value) => {{'\\n'}\n {' '}const price = value.data?.price || 0;{'\\n'}\n {' '}return price.toFixed(2);{'\\n'}\n }\n </>\n ),\n },\n {\n label: 'Combine multiple fields:',\n code: (\n <>\n (value) => `${value.data?.firstName}\n ${value.data?.lastName}`\n </>\n ),\n },\n {\n label: 'Conditional transformation with consent:',\n code: (\n <>\n (value, mapping, options) => {{'\\n'}\n {' '}if (options.consent?.marketing) {{'\\n'}\n {' '}return value.user?.email;{'\\n'}\n {' '}}{'\\n'}\n {' '}return undefined;{'\\n'}\n }\n </>\n ),\n },\n {\n label: 'Use collector for context:',\n code: (\n <>\n (value, mapping, options) => {{'\\n'}\n {' '}const sessionId = options.collector?.session?.id;{'\\n'}\n {' '}return {{'\\n'}\n {' '}eventId: value.id,{'\\n'}\n {' '}sessionId: sessionId,{'\\n'}\n {' '}};{'\\n'}\n }\n </>\n ),\n },\n ],\n },\n];\n\nexport function MappingFnPaneView(props: MappingFnPaneViewProps) {\n return (\n <MappingFunctionPaneBase\n title=\"Transformation Function\"\n description=\"Transform event data before sending to destination\"\n defaultCode={DEFAULT_FN}\n helpSections={HELP_SECTIONS}\n functionType=\"fn\"\n {...props}\n />\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport {\n MappingFunctionPaneBase,\n type HelpSection,\n} from './mapping-function-pane-base';\n\n/**\n * Mapping Validate Pane View\n *\n * Dedicated pane for the 'validate' property - a validation function that\n * checks if a transformed value should be included.\n *\n * Function signature: (value?) => boolean\n * Returns true to include the value, false to exclude it.\n */\nexport interface MappingValidatePaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nconst DEFAULT_VALIDATE = `(\n value: unknown\n): boolean | Promise<boolean> => {\n // Return true to include this value\n // Return false to exclude it\n return value !== undefined && value !== null && value !== '';\n}`;\n\nconst HELP_SECTIONS: HelpSection[] = [\n {\n title: 'Parameter',\n items: [\n {\n code: 'value',\n description: 'The transformed value to validate (optional)',\n },\n ],\n },\n {\n title: 'Return Value',\n items: [\n {\n code: 'true',\n description: 'Include this value in the result',\n },\n {\n code: 'false',\n description: 'Exclude this value (skip it)',\n },\n {\n code: 'Promise',\n description: 'Can be async (return Promise)',\n },\n ],\n },\n {\n title: 'Examples',\n examples: [\n {\n label: 'Exclude empty values:',\n code: (\n <>\n (value) => value !== undefined && value !== null && value !== ''\n </>\n ),\n },\n {\n label: 'Only include valid email addresses:',\n code: (\n <>\n (value) => typeof value === 'string' &&\n /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)\n </>\n ),\n },\n {\n label: 'Only include positive numbers:',\n code: <>(value) => typeof value === 'number' && value > 0</>,\n },\n {\n label: 'Validate URL format:',\n code: (\n <>\n (value) => {{'\\n'}\n {' '}try {{'\\n'}\n {' '}new URL(value);{'\\n'}\n {' '}return true;{'\\n'}\n {' '}} catch {{'\\n'}\n {' '}return false;{'\\n'}\n {' '}}{'\\n'}\n }\n </>\n ),\n },\n {\n label: 'Exclude specific values:',\n code: (\n <>\n (value) => !['test', 'localhost', 'example.com'].includes(value)\n </>\n ),\n },\n ],\n },\n];\n\nexport function MappingValidatePaneView(props: MappingValidatePaneViewProps) {\n return (\n <MappingFunctionPaneBase\n title=\"Validation Function\"\n description=\"Validate if the transformed value should be included\"\n defaultCode={DEFAULT_VALIDATE}\n helpSections={HELP_SECTIONS}\n functionType=\"validate\"\n {...props}\n />\n );\n}\n","import type { RJSFSchema } from '@rjsf/utils';\n\n/**\n * Validation result with error message\n */\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\n/**\n * Validate a value against a JSON Schema\n *\n * Supports common validation rules:\n * - String: pattern, minLength, maxLength, enum\n * - Number: minimum, maximum, enum\n * - Type checking\n *\n * @param value - Value to validate\n * @param schema - JSON Schema to validate against\n * @returns Validation result with error message if invalid\n *\n * @example\n * const result = validateValue('123abc', {\n * type: 'string',\n * pattern: '^[0-9]+$'\n * });\n * // { valid: false, error: 'Must match pattern: ^[0-9]+$' }\n */\nexport function validateValue(\n value: unknown,\n schema?: RJSFSchema,\n): ValidationResult {\n // No schema = no validation\n if (!schema) {\n return { valid: true };\n }\n\n // Empty/null values - check if required\n if (value === undefined || value === null || value === '') {\n // If schema has a default or is not required, it's valid\n return { valid: true };\n }\n\n const schemaType = schema.type;\n\n // String validation\n if (schemaType === 'string') {\n const strValue = String(value);\n\n // Pattern validation (most important for things like pixelId)\n if (schema.pattern) {\n try {\n const regex = new RegExp(schema.pattern);\n if (!regex.test(strValue)) {\n return {\n valid: false,\n error: `Must match pattern: ${schema.pattern}`,\n };\n }\n } catch (e) {\n // Invalid regex pattern in schema - skip validation\n console.warn('Invalid regex pattern in schema:', schema.pattern);\n }\n }\n\n // Length validation\n if (schema.minLength !== undefined && strValue.length < schema.minLength) {\n return {\n valid: false,\n error: `Minimum length: ${schema.minLength} characters`,\n };\n }\n\n if (schema.maxLength !== undefined && strValue.length > schema.maxLength) {\n return {\n valid: false,\n error: `Maximum length: ${schema.maxLength} characters`,\n };\n }\n\n // Enum validation\n if (schema.enum && Array.isArray(schema.enum)) {\n if (!schema.enum.includes(strValue)) {\n return {\n valid: false,\n error: `Must be one of: ${schema.enum.join(', ')}`,\n };\n }\n }\n\n return { valid: true };\n }\n\n // Number validation\n if (schemaType === 'number' || schemaType === 'integer') {\n const numValue = typeof value === 'number' ? value : Number(value);\n\n // Type check\n if (isNaN(numValue)) {\n return {\n valid: false,\n error: 'Must be a valid number',\n };\n }\n\n // Integer check\n if (schemaType === 'integer' && !Number.isInteger(numValue)) {\n return {\n valid: false,\n error: 'Must be an integer',\n };\n }\n\n // Range validation\n if (schema.minimum !== undefined && numValue < schema.minimum) {\n return {\n valid: false,\n error: `Minimum value: ${schema.minimum}`,\n };\n }\n\n if (schema.maximum !== undefined && numValue > schema.maximum) {\n return {\n valid: false,\n error: `Maximum value: ${schema.maximum}`,\n };\n }\n\n // Enum validation\n if (schema.enum && Array.isArray(schema.enum)) {\n if (!schema.enum.includes(numValue)) {\n return {\n valid: false,\n error: `Must be one of: ${schema.enum.join(', ')}`,\n };\n }\n }\n\n return { valid: true };\n }\n\n // Boolean validation\n if (schemaType === 'boolean') {\n if (typeof value !== 'boolean') {\n return {\n valid: false,\n error: 'Must be true or false',\n };\n }\n return { valid: true };\n }\n\n // No validation for other types (array, object, etc.)\n return { valid: true };\n}\n\n/**\n * Format validation error message for display\n *\n * @param error - Error message from validation\n * @returns Formatted error message\n */\nexport function formatValidationError(error: string): string {\n return error;\n}\n","import React from 'react';\nimport type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\nimport { validateValue } from '../../utils/schema-validation';\n\nexport interface MappingNamePaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schema?: RJSFSchema;\n uiSchema?: UiSchema;\n className?: string;\n}\n\n/**\n * Name Pane - Text input with schema validation for rule name override\n *\n * The name property is a simple string that overrides the destination event name.\n * From packages/core/src/types/mapping.ts:\n * name?: string; // Use a custom event name\n *\n * Uses type=\"text\" with schema validation (minLength, maxLength, pattern)\n */\nexport function MappingNamePaneView({\n path,\n mappingState,\n navigation,\n schema,\n uiSchema,\n className = '',\n}: MappingNamePaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const nameValue = typeof value === 'string' ? value : '';\n\n const handleChange = (newValue: string) => {\n if (newValue.trim() === '') {\n // Delete if empty\n mappingState.actions.deleteValue(path);\n } else {\n mappingState.actions.setValue(path, newValue);\n }\n };\n\n // Validate current value\n const validationResult = validateValue(value, schema);\n const hasError = !validationResult.valid;\n\n // Get title and description from schema or use defaults\n const title = schema?.title || 'Event Name Override';\n const description =\n schema?.description ||\n 'Override the destination event name with a custom string';\n const placeholder =\n uiSchema?.['ui:placeholder'] ||\n 'e.g., page_view, product_click, order_complete';\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n value={nameValue}\n onChange={handleChange}\n placeholder={placeholder}\n type=\"text\"\n error={hasError}\n />\n <div className=\"elb-mapping-pane-hint\">\n {uiSchema?.['ui:help'] ||\n 'This string will be sent to the destination instead of the default entity-action name. Leave empty to use default.'}\n {hasError && validationResult.error && (\n <>\n <br />\n <span style={{ color: 'var(--color-button-danger)' }}>\n ⚠ {validationResult.error}\n </span>\n </>\n )}\n </div>\n </div>\n\n <div className=\"elb-mapping-name-examples\">\n <div className=\"elb-mapping-name-examples-title\">Common Examples:</div>\n <ul className=\"elb-mapping-name-examples-list\">\n <li>\n <code>page_view</code> - Google Analytics style\n </li>\n <li>\n <code>PageView</code> - Pascal case for tracking systems\n </li>\n <li>\n <code>view_item</code> - GA4 recommended event names\n </li>\n <li>\n <code>product.viewed</code> - Segment style with dots\n </li>\n </ul>\n </div>\n </BaseMappingPane>\n );\n}\n","import React from 'react';\nimport type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\nimport { validateValue } from '../../utils/schema-validation';\n\nexport interface MappingBatchPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schema?: RJSFSchema;\n uiSchema?: UiSchema;\n className?: string;\n}\n\n/**\n * Batch Pane - Number input with text-based validation\n *\n * The batch property is a number that specifies how many events to batch together.\n * From packages/core/src/types/mapping.ts:\n * batch?: number; // Batch size in milliseconds or event count\n *\n * Uses type=\"text\" to allow typing ANY value (including letters) for validation feedback\n */\nexport function MappingBatchPaneView({\n path,\n mappingState,\n navigation,\n schema,\n uiSchema,\n className = '',\n}: MappingBatchPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n\n // Convert to string for editing\n const stringValue =\n value === null ? 'null' : value === undefined ? '' : String(value);\n\n const handleChange = (newValue: string) => {\n // Empty string handling - delete the value\n if (newValue === '') {\n mappingState.actions.deleteValue(path);\n return;\n }\n\n // Try to coerce to number\n const asNumber = Number(newValue);\n if (!isNaN(asNumber)) {\n mappingState.actions.setValue(path, asNumber);\n } else {\n // Store as string - validation will show error\n mappingState.actions.setValue(path, newValue);\n }\n };\n\n // Validate current value\n const validationResult = validateValue(value, schema);\n const hasError = !validationResult.valid;\n\n // Get title and description from schema or use defaults\n const title = schema?.title || 'Batch Size';\n const description =\n schema?.description ||\n 'Specify the batch size in milliseconds (time-based) or event count.';\n const placeholder = uiSchema?.['ui:placeholder'] || 'e.g., 200, 1000, 5000';\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n type=\"text\"\n value={stringValue}\n onChange={handleChange}\n placeholder={placeholder}\n error={hasError}\n />\n <div className=\"elb-mapping-pane-hint\">\n {uiSchema?.['ui:help'] ||\n 'Events will be collected and sent in batches. Use time (ms) for timed batches or count for event-based batches. Leave empty to disable batching.'}\n {hasError && validationResult.error && (\n <>\n <br />\n <span style={{ color: 'var(--color-button-danger)' }}>\n ⚠ {validationResult.error}\n </span>\n </>\n )}\n </div>\n </div>\n\n <div className=\"elb-mapping-batch-examples\">\n <div className=\"elb-mapping-batch-examples-title\">\n Common Use Cases:\n </div>\n <ul className=\"elb-mapping-batch-examples-list\">\n <li>\n <code>200</code> - Send every 200ms (frequent updates)\n </li>\n <li>\n <code>1000</code> - Send every second (balanced)\n </li>\n <li>\n <code>5000</code> - Send every 5 seconds (reduced requests)\n </li>\n <li>\n <code>10</code> - Send every 10 events (event-based batching)\n </li>\n </ul>\n <div className=\"elb-mapping-batch-note\">\n <strong>Note:</strong> Batching reduces network requests by grouping\n multiple events together. Lower values = more frequent sends, higher\n values = fewer requests but longer delays.\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import { useState, useMemo } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { ConsentStateTile } from '../atoms/consent-state-tile';\nimport { scanMappingForConsentStates } from '../../utils/consent-scanner';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { getPathDescription } from '../../utils/path-analyzer';\nimport { MappingInputWithButton } from '../atoms/mapping-input-with-button';\n\n/**\n * Mapping Consent Pane View\n *\n * Dedicated pane for configuring required consent states.\n * Shows discovered consent states as toggleable tiles plus input to add new ones.\n */\nexport interface MappingConsentPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingConsentPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingConsentPaneViewProps) {\n const [newStateName, setNewStateName] = useState('');\n\n // Get current consent value at this path\n const value = mappingState.actions.getValue(path);\n const currentConsent =\n value && typeof value === 'object'\n ? (value as Record<string, boolean>)\n : {};\n\n // Scan entire mapping for all consent states\n const discoveredStates = useMemo(\n () => scanMappingForConsentStates(mappingState.config),\n [mappingState.config],\n );\n\n const handleToggleState = (stateName: string) => {\n const isCurrentlyChecked = currentConsent[stateName] === true;\n\n if (isCurrentlyChecked) {\n // Uncheck: remove from consent object\n const newConsent = { ...currentConsent };\n delete newConsent[stateName];\n\n // If empty, delete the entire consent property\n if (Object.keys(newConsent).length === 0) {\n mappingState.actions.deleteValue(path);\n } else {\n mappingState.actions.setValue(path, newConsent);\n }\n } else {\n // Check: add to consent object with value true\n const newConsent = { ...currentConsent, [stateName]: true };\n mappingState.actions.setValue(path, newConsent);\n }\n };\n\n const handleInputChange = (value: string) => {\n setNewStateName(value);\n };\n\n const handleAddNewState = () => {\n const trimmed = newStateName.trim();\n if (!trimmed) return;\n\n // Don't add if it already exists\n if (discoveredStates.includes(trimmed)) {\n setNewStateName('');\n return;\n }\n\n // Add new state as checked\n const newConsent = { ...currentConsent, [trimmed]: true };\n mappingState.actions.setValue(path, newConsent);\n\n // Clear input\n setNewStateName('');\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setNewStateName('');\n }\n };\n\n // Get context-aware title and description\n const { title, description } = useMemo(\n () => getPathDescription(path, mappingState.config),\n [path, mappingState.config],\n );\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-consent-pane\">\n {/* Consent State Tiles Grid */}\n <div className=\"elb-mapping-consent-grid\">\n {discoveredStates.map((stateName) => (\n <ConsentStateTile\n key={stateName}\n label={stateName}\n checked={currentConsent[stateName] === true}\n onClick={() => handleToggleState(stateName)}\n />\n ))}\n\n {/* Add New State Input - Always visible */}\n <MappingInputWithButton\n value={newStateName}\n onChange={handleInputChange}\n onSubmit={handleAddNewState}\n onKeyDown={handleKeyDown}\n buttonLabel=\"Add\"\n showButton={true}\n placeholder=\"Add new consent state\"\n />\n </div>\n\n {/* Help Section */}\n <div className=\"elb-mapping-consent-help\">\n <h4 className=\"elb-mapping-consent-help-title\">How it works</h4>\n <ul className=\"elb-mapping-consent-help-list\">\n <li>Checked states are required for processing</li>\n <li>Events queue until required consent is granted</li>\n <li>\n Consent states are discovered from your entire mapping\n configuration\n </li>\n </ul>\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","/**\n * Consent State Tile\n *\n * Checkbox-like tile for toggling consent state requirements.\n * Styled similar to rule tiles with active/inactive states.\n */\nexport interface ConsentStateTileProps {\n label: string;\n checked: boolean;\n onClick: () => void;\n className?: string;\n}\n\nexport function ConsentStateTile({\n label,\n checked,\n onClick,\n className = '',\n}: ConsentStateTileProps) {\n return (\n <button\n type=\"button\"\n className={`elb-consent-state-tile ${checked ? 'is-checked' : ''} ${className}`}\n onClick={onClick}\n >\n <div className=\"elb-consent-state-tile-checkbox\">\n {checked && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 3L4.5 8.5L2 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n <span className=\"elb-consent-state-tile-label\">{label}</span>\n </button>\n );\n}\n","import type { Mapping } from '@walkeros/core';\n\n/**\n * Scan entire mapping configuration for all consent state names\n *\n * Recursively traverses the mapping rules and collects unique consent state names\n * from:\n * - Top-level consent (destination-wide)\n * - Rule-level consent (rule.consent)\n * - ValueConfig-level consent (data.map.*.consent, nested structures)\n *\n * @param config - The mapping configuration to scan\n * @returns Array of unique consent state names sorted alphabetically\n *\n * @example\n * const states = scanMappingForConsentStates(config);\n * // ['analytics', 'functional', 'marketing']\n */\nexport function scanMappingForConsentStates(\n config: Mapping.Config | Mapping.Rules,\n): string[] {\n const consentStates = new Set<string>();\n\n /**\n * Recursively scan any value for consent objects\n * Handles Value, ValueType, ValueConfig, and all nested structures\n */\n function scanValue(value: unknown): void {\n // Handle null/undefined\n if (!value) return;\n\n // Handle arrays (Value can be Array<ValueType>)\n if (Array.isArray(value)) {\n value.forEach((item) => scanValue(item));\n return;\n }\n\n // Handle primitives (strings)\n if (typeof value !== 'object') return;\n\n // If this value has a consent property, collect its keys\n if ('consent' in value) {\n const consent = (value as Record<string, unknown>).consent;\n if (consent && typeof consent === 'object') {\n Object.keys(consent).forEach((state) => consentStates.add(state));\n }\n }\n\n // Recursively scan ValueConfig properties\n if ('map' in value) {\n const map = (value as Record<string, unknown>).map;\n if (map && typeof map === 'object') {\n Object.values(map).forEach((nestedValue) => scanValue(nestedValue));\n }\n }\n\n if ('loop' in value) {\n const loop = (value as Record<string, unknown>).loop;\n if (Array.isArray(loop)) {\n loop.forEach((item) => scanValue(item));\n }\n }\n\n if ('set' in value) {\n const set = (value as Record<string, unknown>).set;\n if (Array.isArray(set)) {\n set.forEach((item) => scanValue(item));\n }\n }\n\n // Scan rule properties that contain Data/Value types\n if ('data' in value) {\n const data = (value as Record<string, unknown>).data;\n scanValue(data);\n }\n\n // Scan other nested objects generically\n for (const key in value) {\n if (\n key !== 'consent' &&\n key !== 'map' &&\n key !== 'loop' &&\n key !== 'set' &&\n key !== 'data'\n ) {\n const nestedValue = (value as Record<string, unknown>)[key];\n if (nestedValue && typeof nestedValue === 'object') {\n scanValue(nestedValue);\n }\n }\n }\n }\n\n // Check if this is a full Config or just Rules\n const isFullConfig =\n 'mapping' in config ||\n 'consent' in config ||\n 'data' in config ||\n 'policy' in config;\n\n // Scan top-level consent (destination-wide) - only in full Config\n if (isFullConfig && 'consent' in config && config.consent) {\n Object.keys(config.consent).forEach((state) => consentStates.add(state));\n }\n\n // Determine where the rules are\n const rules: Mapping.Rules =\n (isFullConfig && 'mapping' in config\n ? config.mapping || {}\n : config) as Mapping.Rules;\n\n // Scan rules recursively\n Object.values(rules).forEach((entityRules) => {\n if (!entityRules) return;\n\n Object.values(entityRules).forEach((ruleOrArray) => {\n if (!ruleOrArray) return;\n\n // Handle both single rule and array of rules\n const ruleArray = Array.isArray(ruleOrArray)\n ? ruleOrArray\n : [ruleOrArray];\n\n ruleArray.forEach((rule) => {\n if (rule && typeof rule === 'object') {\n // Scan the entire rule recursively (includes rule.consent and all nested ValueConfigs)\n scanValue(rule);\n }\n });\n });\n });\n\n // Return sorted array\n return Array.from(consentStates).sort();\n}\n","import { useState } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingConfirmButton } from '../atoms/mapping-confirm-button';\nimport { getConfiguredProperties } from '../../utils/value-display-formatter';\n\nexport interface MappingSetPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\n/**\n * Set Pane View - Array of values\n *\n * Displays and manages an array of Value mappings.\n * Each value can be:\n * - Simple string (key path like 'data.id')\n * - ValueConfig object (key, fn, map, loop, etc.)\n *\n * Features:\n * - Drag-and-drop reordering\n * - Add/remove values\n * - Navigate to ValueTypePaneView for editing\n * - Show badges for configured properties\n *\n * @example\n * <MappingSetPaneView\n * path={['product', 'view', 'data', 'items', 'set']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport function MappingSetPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingSetPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const setArray = Array.isArray(value) ? value : [];\n\n // Drag-and-drop state\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\n\n // Get configured properties from a value (for badges)\n // Handlers\n const handleAdd = () => {\n const newArray = [...setArray, ''];\n const newIndex = newArray.length - 1;\n mappingState.actions.setValue(path, newArray);\n // Navigate to the new entry\n navigation.openTab([...path, newIndex.toString()], 'valueType');\n };\n\n const handleRowClick = (index: number) => {\n navigation.openTab([...path, index.toString()], 'valueType');\n };\n\n const handleDelete = (index: number) => {\n const newArray = setArray.filter((_, i) => i !== index);\n if (newArray.length === 0) {\n mappingState.actions.deleteValue(path);\n } else {\n mappingState.actions.setValue(path, newArray);\n }\n };\n\n // Drag-and-drop handlers\n const handleDragStart = (e: React.DragEvent, index: number) => {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', index.toString());\n setDraggedIndex(index);\n };\n\n const handleDragOver = (e: React.DragEvent, index: number) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (draggedIndex !== index) {\n setDragOverIndex(index);\n }\n };\n\n const handleDragLeave = () => {\n setDragOverIndex(null);\n };\n\n const handleDrop = (e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n const dragIndex = parseInt(e.dataTransfer.getData('text/plain'));\n\n if (dragIndex === dropIndex) {\n setDraggedIndex(null);\n setDragOverIndex(null);\n return;\n }\n\n // Reorder array\n const newArray = [...setArray];\n const [removed] = newArray.splice(dragIndex, 1);\n newArray.splice(dropIndex, 0, removed);\n\n mappingState.actions.setValue(path, newArray);\n setDraggedIndex(null);\n setDragOverIndex(null);\n };\n\n const handleDragEnd = () => {\n setDraggedIndex(null);\n setDragOverIndex(null);\n };\n\n return (\n <BaseMappingPane\n title=\"Set Array\"\n description=\"Array of values - each value is processed independently and all results are collected\"\n navigation={navigation}\n className={className}\n >\n {/* Add button */}\n <div className=\"elb-set-input-section\">\n <button\n type=\"button\"\n className=\"elb-set-add-button\"\n onClick={handleAdd}\n >\n + Add Value\n </button>\n </div>\n\n {/* Set entries list */}\n {setArray.length > 0 && (\n <div className=\"elb-set-list\">\n {setArray.map((val, index) => {\n const configuredProps = getConfiguredProperties(val);\n const isSimple = typeof val === 'string';\n\n return (\n <div\n key={index}\n className={`elb-set-row ${\n draggedIndex === index ? 'elb-set-row-dragging' : ''\n } ${dragOverIndex === index ? 'elb-set-row-drag-over' : ''}`}\n draggable\n onDragStart={(e) => handleDragStart(e, index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDragLeave={handleDragLeave}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n >\n {/* Drag handle */}\n <div className=\"elb-set-drag-handle\" title=\"Drag to reorder\">\n <svg\n width=\"12\"\n height=\"16\"\n viewBox=\"0 0 12 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"3\" cy=\"4\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"4\" r=\"1.5\" />\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"3\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" />\n </svg>\n </div>\n\n {/* Value display - clickable */}\n <div\n className=\"elb-set-row-value\"\n onClick={() => handleRowClick(index)}\n >\n <div className=\"elb-set-row-badges\">\n {isSimple ? (\n <span className=\"elb-policy-badge\">\n <span className=\"elb-policy-badge-value\">\n \"{val as string}\"\n </span>\n </span>\n ) : (\n configuredProps.map(({ prop, value, isLong }) => (\n <span key={prop} className=\"elb-policy-badge\">\n <span className=\"elb-policy-badge-label\">\n {prop}:\n </span>\n <span\n className={`elb-policy-badge-value ${isLong ? 'is-long' : ''}`}\n >\n {value}\n </span>\n </span>\n ))\n )}\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"elb-set-row-actions\">\n <MappingConfirmButton\n confirmLabel=\"Delete?\"\n onConfirm={() => handleDelete(index)}\n ariaLabel={`Delete value ${index + 1}`}\n className=\"elb-mapping-delete-button\"\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Empty state */}\n {setArray.length === 0 && (\n <div className=\"elb-set-empty\">\n <p>No values in this set. Click \"Add Value\" to create one.</p>\n <p className=\"elb-set-empty-hint\">\n Each value will be processed independently.\n </p>\n </div>\n )}\n </BaseMappingPane>\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\nimport { MappingValueTypePaneView } from './mapping-value-type-pane-view';\n\nexport interface MappingLoopPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\n/**\n * Loop Pane View - Array iteration with transformation\n *\n * Simple two-part interface:\n * 1. Input field for scope (array path to iterate over)\n * 2. Reused ValueTypePaneView for item mapping configuration\n *\n * Loop structure: [scope, itemMapping]\n * - scope: String path to array (e.g., 'nested') or 'this' for current value\n * - itemMapping: Value transformation applied to each array item\n *\n * @example\n * <MappingLoopPaneView\n * path={['product', 'view', 'data', 'items', 'loop']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport function MappingLoopPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingLoopPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const loopArray = Array.isArray(value) && value.length === 2 ? value : null;\n\n const [scope, itemMapping] = loopArray || ['', undefined];\n\n const handleScopeChange = (newScope: string) => {\n // Only create loop array if scope has a value\n if (!newScope || newScope.trim() === '') {\n // If scope is empty, delete the loop entirely\n mappingState.actions.deleteValue(path);\n return;\n }\n\n // Update scope (first array element) while preserving item mapping\n mappingState.actions.setValue(path, [newScope, itemMapping]);\n };\n\n // If not initialized, show setup interface\n if (!loopArray) {\n return (\n <BaseMappingPane\n title=\"Loop Array\"\n description=\"Process arrays by applying transformation to each item\"\n navigation={navigation}\n className={className}\n >\n {/* Scope Input */}\n <div className=\"elb-mapping-pane-field\">\n <label className=\"elb-mapping-pane-label\">\n Array Path <span className=\"elb-mapping-pane-required\">*</span>\n </label>\n <MappingInput\n value={typeof scope === 'string' ? scope : ''}\n onChange={handleScopeChange}\n placeholder=\"nested\"\n autoFocus\n />\n <div className=\"elb-mapping-pane-hint\">\n Path to the array in the event (e.g., \"nested\", \"data.items\") or\n \"this\" for current value\n </div>\n </div>\n\n {/* Item Mapping - Reuse ValueTypePaneView without header */}\n <div className=\"elb-loop-item-mapping-section\">\n <MappingValueTypePaneView\n path={[...path, '1']}\n mappingState={mappingState}\n navigation={navigation}\n hideNavigation={true}\n className=\"\"\n />\n </div>\n </BaseMappingPane>\n );\n }\n\n // Configured loop - show scope input + item mapping editor\n return (\n <BaseMappingPane\n title=\"Loop Array\"\n description=\"Process arrays by applying transformation to each item\"\n navigation={navigation}\n className={className}\n >\n {/* Scope Input */}\n <div className=\"elb-mapping-pane-field\">\n <label className=\"elb-mapping-pane-label\">\n Array Path <span className=\"elb-mapping-pane-required\">*</span>\n </label>\n <MappingInput\n value={typeof scope === 'string' ? scope : ''}\n onChange={handleScopeChange}\n placeholder=\"nested\"\n />\n <div className=\"elb-mapping-pane-hint\">\n Path to the array in the event (e.g., \"nested\", \"data.items\") or\n \"this\" for current value\n </div>\n </div>\n\n {/* Item Mapping - Reuse ValueTypePaneView without header */}\n <div className=\"elb-loop-item-mapping-section\">\n <MappingValueTypePaneView\n path={[...path, '1']}\n mappingState={mappingState}\n navigation={navigation}\n hideNavigation={true}\n className=\"\"\n />\n </div>\n </BaseMappingPane>\n );\n}\n","import React, { useCallback } from 'react';\nimport Form from '@rjsf/core';\nimport type {\n RJSFSchema,\n UiSchema,\n FormContextType,\n RJSFValidationError,\n} from '@rjsf/utils';\nimport { withTheme } from '@rjsf/core';\nimport validator from '@rjsf/validator-ajv8';\nimport { mappingWidgets } from './widget-registry';\nimport { mappingFields } from './field-registry';\nimport { MappingGrid } from '../atoms/mapping-grid';\nimport { FieldHeader } from '../atoms/field-header';\n\nexport interface MappingFormWrapperProps {\n schema: RJSFSchema;\n uiSchema?: UiSchema;\n formData?: unknown;\n onChange?: (data: unknown) => void;\n onSubmit?: (data: unknown) => void;\n children?: React.ReactNode;\n nested?: boolean; // When true, renders without <form> wrapper to prevent nested forms\n formContext?: FormContextType; // Context passed to all widgets (navigation, mappingState, etc.)\n}\n\n/**\n * MappingFormWrapper - RJSF Form wrapper with theme integration\n *\n * Wraps react-jsonschema-form with custom theming, templates, and widgets.\n * Integrates with the explorer's CSS variable system and provides custom\n * layouts using MappingGrid.\n *\n * Features:\n * - Custom FieldTemplate with proper label/input styling\n * - Custom ObjectFieldTemplate using MappingGrid for layout\n * - Theme integration via CSS variables\n * - Custom widget registry\n * - Form context support\n *\n * @example\n * const schema = {\n * type: 'object',\n * properties: {\n * name: { type: 'string', title: 'Name' },\n * priority: { type: 'number', title: 'Priority' }\n * }\n * };\n *\n * <MappingFormWrapper\n * schema={schema}\n * formData={data}\n * onChange={setData}\n * />\n */\n// Create themed version with our custom templates\nconst ThemedForm = withTheme({\n widgets: mappingWidgets,\n fields: mappingFields,\n templates: {\n FieldTemplate: CustomFieldTemplate,\n ObjectFieldTemplate: CustomObjectFieldTemplate,\n },\n});\n\nexport function MappingFormWrapper({\n schema,\n uiSchema,\n formData,\n onChange,\n onSubmit,\n children,\n nested = false,\n formContext,\n}: MappingFormWrapperProps) {\n // Memoize callbacks to prevent child component re-renders and infinite loops\n const handleChange = useCallback(\n (event: { formData?: unknown }) => {\n onChange?.(event.formData);\n },\n [onChange],\n );\n\n const handleSubmit = useCallback(\n (event: { formData?: unknown }) => {\n onSubmit?.(event.formData);\n },\n [onSubmit],\n );\n\n // For nested usage, render fields directly without <form> wrapper\n if (nested) {\n return (\n <div className=\"elb-rjsf-nested-wrapper\">\n <ThemedForm\n schema={schema}\n uiSchema={uiSchema}\n formData={formData}\n validator={validator}\n onChange={handleChange}\n formContext={formContext}\n tagName=\"div\"\n >\n {/* RJSF renders submit button by default - hide it */}\n <div style={{ display: 'none' }} />\n </ThemedForm>\n </div>\n );\n }\n\n // For top-level usage, render full Form component\n return (\n <div className=\"elb-rjsf-form-wrapper\">\n <Form\n schema={schema}\n uiSchema={uiSchema}\n formData={formData}\n validator={validator}\n widgets={mappingWidgets}\n fields={mappingFields}\n onChange={handleChange}\n onSubmit={handleSubmit}\n formContext={formContext}\n templates={{\n FieldTemplate: CustomFieldTemplate,\n ObjectFieldTemplate: CustomObjectFieldTemplate,\n }}\n showErrorList={false}\n liveOmit={false}\n omitExtraData={false}\n >\n {/* RJSF renders submit button by default - hide it */}\n <div style={{ display: 'none' }} />\n </Form>\n </div>\n );\n}\n\n/**\n * Custom FieldTemplate\n *\n * Provides consistent styling for all form fields:\n * - Label with proper typography\n * - Field wrapper with spacing\n * - Error display\n * - Help text support\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction CustomFieldTemplate(props: any) {\n const {\n id,\n classNames,\n label,\n help,\n required,\n description,\n errors,\n children,\n hidden,\n schema,\n uiSchema,\n } = props;\n\n if (hidden) {\n return <div className=\"elb-rjsf-field-hidden\">{children}</div>;\n }\n\n // Hide label and description if:\n // 1. Object fields (like consent) - widget handles them\n // 2. Custom fields (ui:field) - field component handles them\n // 3. mappingValue widget - renders its own header\n const hasCustomField = uiSchema?.['ui:field'];\n const isValueWidget = uiSchema?.['ui:widget'] === 'mappingValue';\n const showLabelAndDescription =\n schema.type !== 'object' && !hasCustomField && !isValueWidget;\n\n return (\n <div className={`elb-rjsf-field ${classNames || ''}`} id={id}>\n {showLabelAndDescription && (\n <FieldHeader\n title={label}\n description={description}\n required={required}\n />\n )}\n {children}\n {errors}\n {help && <div className=\"elb-rjsf-help\">{help}</div>}\n </div>\n );\n}\n\n/**\n * Custom ObjectFieldTemplate\n *\n * Uses MappingGrid for laying out object properties in a responsive grid.\n * Properties are arranged in a 2-column layout on larger screens,\n * single column on mobile.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction CustomObjectFieldTemplate(props: any) {\n const { title, description, properties, uiSchema } = props;\n\n // Get layout preference from uiSchema\n const layout = uiSchema?.['ui:layout'] || 'cols-2';\n const responsive = uiSchema?.['ui:responsive'] !== false;\n\n return (\n <fieldset className=\"elb-rjsf-object\">\n {title && <legend className=\"elb-rjsf-object-title\">{title}</legend>}\n {description && (\n <div className=\"elb-rjsf-object-description\">{description}</div>\n )}\n <MappingGrid layout={layout} responsive={responsive} gap={16}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {properties.map((element: any) => (\n <div key={element.name} className=\"elb-rjsf-object-property\">\n {element.content}\n </div>\n ))}\n </MappingGrid>\n </fieldset>\n );\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\n\n/**\n * MappingString - Custom RJSF widget for string inputs\n *\n * A styled text input widget that integrates with RJSF forms and uses\n * the explorer's CSS variable theming system. Displays validation errors\n * and supports disabled/readonly states.\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * name: {\n * 'ui:widget': 'mappingString',\n * 'ui:placeholder': 'Enter mapping name...'\n * }\n * }\n */\nexport function MappingStringWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n placeholder,\n rawErrors = [],\n required,\n } = props;\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onChange(event.target.value === '' ? undefined : event.target.value);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <input\n id={id}\n type=\"text\"\n className={`elb-rjsf-input ${hasError ? 'elb-rjsf-input-error' : ''}`}\n value={value ?? ''}\n onChange={handleChange}\n disabled={disabled || readonly}\n placeholder={placeholder}\n required={required}\n />\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\n\n/**\n * MappingNumber - Custom RJSF widget for number inputs\n *\n * A styled number input widget that integrates with RJSF forms and uses\n * the explorer's CSS variable theming system. Handles number parsing,\n * validation (min/max from schema), and displays errors.\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * priority: {\n * type: 'number',\n * minimum: 0,\n * maximum: 100\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * priority: {\n * 'ui:widget': 'mappingNumber',\n * 'ui:placeholder': 'Enter priority...'\n * }\n * }\n */\nexport function MappingNumberWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n placeholder,\n rawErrors = [],\n required,\n schema,\n } = props;\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = event.target.value;\n\n // Handle empty input\n if (inputValue === '') {\n onChange(undefined);\n return;\n }\n\n // Parse number\n const numValue = parseFloat(inputValue);\n if (!isNaN(numValue)) {\n onChange(numValue);\n }\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n // Extract min/max from schema if defined\n const min = schema.minimum;\n const max = schema.maximum;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <input\n id={id}\n type=\"number\"\n className={`elb-rjsf-input ${hasError ? 'elb-rjsf-input-error' : ''}`}\n value={value ?? ''}\n onChange={handleChange}\n disabled={disabled || readonly}\n placeholder={placeholder}\n required={required}\n min={min}\n max={max}\n step=\"any\"\n />\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\n\n/**\n * MappingBoolean - Custom RJSF widget for boolean checkbox\n *\n * A styled checkbox widget that matches the height and styling of text inputs.\n * The label is handled by FieldTemplate, so this widget only renders the\n * checkbox control itself.\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * enabled: {\n * type: 'boolean',\n * title: 'Ignore Event',\n * description: 'Skip processing this event'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * enabled: {\n * 'ui:widget': 'mappingBoolean'\n * }\n * }\n */\nexport function MappingBooleanWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onChange(event.target.checked);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <input\n id={id}\n type=\"checkbox\"\n className={`elb-rjsf-checkbox ${hasError ? 'elb-rjsf-input-error' : ''}`}\n checked={value ?? false}\n onChange={handleChange}\n disabled={disabled || readonly}\n />\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { ConsentRow } from '../molecules/mapping-consent-row';\nimport { IconButton } from './icon-button';\n\n/**\n * MappingConsentWidget - RJSF widget for consent object\n *\n * Manages consent requirements as an object: { [consentType: string]: boolean }\n * where true = granted required, false = denied required\n *\n * States:\n * - Default (no consent): Shows grey \"+ Require consent\" button\n * - With data: Shows collapsible section with consent rows\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * consent: {\n * type: 'object',\n * title: 'Consent',\n * description: 'Required consent states'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * consent: {\n * 'ui:widget': 'mappingConsent'\n * }\n * }\n */\nexport function MappingConsentWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const consentData = (value as Record<string, boolean> | undefined) || {};\n const hasConsent = Object.keys(consentData).length > 0;\n\n // Extract title and description from schema\n const title = schema?.title || 'Consent';\n const description = schema?.description;\n\n // Start expanded if we have existing consent data\n const [isExpanded, setIsExpanded] = useState(hasConsent);\n\n // Update expanded state when consent data changes (e.g., switching between mapping rules)\n useEffect(() => {\n setIsExpanded(hasConsent);\n }, [hasConsent]);\n\n const handleAddConsent = () => {\n // Add a new consent entry with empty key and true value (checked by default)\n const newConsent = { ...consentData, '': true };\n onChange(newConsent);\n if (!isExpanded) {\n setIsExpanded(true);\n }\n };\n\n const handleUpdateConsentType = (oldKey: string, newKey: string) => {\n if (oldKey === newKey) return;\n\n const newConsent = { ...consentData };\n const value = newConsent[oldKey];\n delete newConsent[oldKey];\n\n // Only add if newKey is not empty\n if (newKey.trim()) {\n newConsent[newKey] = value;\n }\n\n // If no entries left, set to undefined\n const finalConsent =\n Object.keys(newConsent).length > 0 ? newConsent : undefined;\n onChange(finalConsent);\n };\n\n const handleUpdateGranted = (key: string, granted: boolean) => {\n const newConsent = { ...consentData, [key]: granted };\n onChange(newConsent);\n };\n\n const handleRemove = (key: string) => {\n const newConsent = { ...consentData };\n delete newConsent[key];\n\n // If no entries left, set to undefined\n const finalConsent =\n Object.keys(newConsent).length > 0 ? newConsent : undefined;\n onChange(finalConsent);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n >\n {hasConsent ? (\n <div className=\"elb-consent-rows\">\n {Object.entries(consentData).map(([key, granted], index) => (\n <ConsentRow\n key={index}\n consentType={key}\n granted={granted}\n onConsentTypeChange={(newKey) =>\n handleUpdateConsentType(key, newKey)\n }\n onGrantedChange={(newGranted) =>\n handleUpdateGranted(key, newGranted)\n }\n onRemove={() => handleRemove(key)}\n />\n ))}\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddConsent}\n disabled={disabled || readonly}\n className=\"elb-consent-add-row-button\"\n >\n Add consent\n </IconButton>\n </div>\n ) : (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddConsent}\n disabled={disabled || readonly}\n className=\"elb-consent-add-button\"\n >\n Require consent\n </IconButton>\n )}\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\n\nexport interface MappingCollapsibleProps {\n title: string;\n description?: string;\n children: React.ReactNode;\n mode?: 'toggle' | 'checkbox';\n // For toggle mode\n defaultExpanded?: boolean;\n isExpanded?: boolean;\n onToggle?: (expanded: boolean) => void;\n // For checkbox mode\n checked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * MappingCollapsible - Unified collapsible component with two modes\n *\n * Modes:\n * - 'toggle' (default): Chevron icon that expands/collapses content\n * - 'checkbox': Checkbox that shows/hides content when checked\n *\n * Both modes support:\n * - Two-line label: title + optional description\n * - Controlled or uncontrolled state\n * - Theme-aware styling\n *\n * @example\n * // Toggle mode (consent widget)\n * <MappingCollapsible\n * mode=\"toggle\"\n * title=\"Consent\"\n * description=\"Required consent states\"\n * isExpanded={isExpanded}\n * onToggle={setIsExpanded}\n * >\n * <ConsentRows />\n * </MappingCollapsible>\n *\n * @example\n * // Checkbox mode (condition widget)\n * <MappingCollapsible\n * mode=\"checkbox\"\n * title=\"Condition\"\n * description=\"Conditionally apply this rule\"\n * checked={hasCondition}\n * onCheckedChange={setHasCondition}\n * >\n * <CodeEditor />\n * </MappingCollapsible>\n */\nexport function MappingCollapsible({\n title,\n description,\n children,\n mode = 'toggle',\n defaultExpanded = false,\n isExpanded: controlledExpanded,\n onToggle,\n checked = false,\n onCheckedChange,\n disabled = false,\n className = '',\n}: MappingCollapsibleProps) {\n const [uncontrolledExpanded, setUncontrolledExpanded] =\n useState(defaultExpanded);\n\n // Toggle mode state\n const isControlled = controlledExpanded !== undefined;\n const isExpanded = isControlled ? controlledExpanded : uncontrolledExpanded;\n const isOpen = mode === 'toggle' ? isExpanded : checked;\n\n const handleToggle = () => {\n if (mode === 'toggle') {\n const newExpanded = !isExpanded;\n if (!isControlled) {\n setUncontrolledExpanded(newExpanded);\n }\n onToggle?.(newExpanded);\n } else {\n // Checkbox mode\n if (!disabled) {\n onCheckedChange?.(!checked);\n }\n }\n };\n\n const handleCheckboxChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onCheckedChange?.(e.target.checked);\n };\n\n // Determine which CSS classes to use\n const containerClass =\n mode === 'checkbox' ? 'elb-checkbox-collapsible' : 'elb-collapsible';\n const headerClass =\n mode === 'checkbox'\n ? 'elb-checkbox-collapsible-header'\n : 'elb-collapsible-header';\n const labelClass =\n mode === 'checkbox'\n ? 'elb-checkbox-collapsible-label'\n : 'elb-collapsible-label';\n const titleClass =\n mode === 'checkbox' ? 'elb-checkbox-collapsible-title' : 'elb-rjsf-label';\n const descriptionClass =\n mode === 'checkbox'\n ? 'elb-checkbox-collapsible-description'\n : 'elb-collapsible-description';\n const contentClass =\n mode === 'checkbox'\n ? 'elb-checkbox-collapsible-content'\n : 'elb-collapsible-content';\n\n if (mode === 'checkbox') {\n return (\n <div className={`${containerClass} ${className}`.trim()}>\n <div className={headerClass} onClick={handleToggle}>\n <input\n type=\"checkbox\"\n className=\"elb-rjsf-checkbox elb-checkbox-collapsible-checkbox\"\n checked={checked}\n onChange={handleCheckboxChange}\n disabled={disabled}\n onClick={(e) => e.stopPropagation()} // Prevent double-toggle\n />\n <div className={labelClass}>\n <div className={titleClass}>{title}</div>\n {description && (\n <div className={descriptionClass}>{description}</div>\n )}\n </div>\n </div>\n {checked && <div className={contentClass}>{children}</div>}\n </div>\n );\n }\n\n // Toggle mode\n return (\n <div className={`${containerClass} ${className}`.trim()}>\n <button type=\"button\" className={headerClass} onClick={handleToggle}>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ flexShrink: 0 }}\n >\n {isExpanded ? (\n <polyline points=\"6 9 12 15 18 9\" />\n ) : (\n <polyline points=\"9 18 15 12 9 6\" />\n )}\n </svg>\n <div className={labelClass}>\n <span className={titleClass}>{title}</span>\n {description && (\n <span className={descriptionClass}>{description}</span>\n )}\n </div>\n </button>\n {isExpanded && <div className={contentClass}>{children}</div>}\n </div>\n );\n}\n\n// Legacy exports for backward compatibility\nexport const CollapsibleSection = MappingCollapsible;\nexport const MappingCheckboxCollapsible = (\n props: Omit<MappingCollapsibleProps, 'mode'>,\n) => <MappingCollapsible {...props} mode=\"checkbox\" />;\n","import React from 'react';\n\nexport interface IconButtonProps {\n icon:\n | 'delete'\n | 'save'\n | 'add'\n | 'edit'\n | 'check'\n | 'close'\n | 'chevronRight'\n | 'chevronDown';\n variant?: 'default' | 'primary' | 'danger';\n onClick?: () => void;\n disabled?: boolean;\n className?: string;\n title?: string;\n children?: React.ReactNode;\n}\n\n/**\n * IconButton - Reusable button component with icon and text support\n *\n * Features:\n * - Multiple icon options (delete, save, add, edit, check, close)\n * - Style variants (default, primary, danger)\n * - Optional text label (via children)\n * - Disabled state\n * - Theme-aware styling\n *\n * @example\n * <IconButton icon=\"save\" variant=\"primary\" onClick={handleSave}>Save</IconButton>\n * <IconButton icon=\"delete\" variant=\"danger\" onClick={handleDelete}>Delete</IconButton>\n */\nexport function IconButton({\n icon,\n variant = 'default',\n onClick,\n disabled = false,\n className = '',\n title,\n children,\n}: IconButtonProps) {\n const getIcon = () => {\n switch (icon) {\n case 'delete':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n );\n case 'save':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\" />\n <polyline points=\"17 21 17 13 7 13 7 21\" />\n <polyline points=\"7 3 7 8 15 8\" />\n </svg>\n );\n case 'add':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n case 'edit':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n );\n case 'check':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n case 'close':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n case 'chevronRight':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n case 'chevronDown':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n }\n };\n\n return (\n <button\n className={`elb-icon-button elb-icon-button-${variant} ${className}`}\n onClick={onClick}\n disabled={disabled}\n title={title}\n type=\"button\"\n >\n {getIcon()}\n {children && <span className=\"elb-icon-button-text\">{children}</span>}\n </button>\n );\n}\n","import React from 'react';\nimport { IconButton } from '../atoms/icon-button';\n\nexport interface ConsentRowProps {\n consentType: string;\n granted: boolean;\n onConsentTypeChange: (value: string) => void;\n onGrantedChange: (value: boolean) => void;\n onRemove: () => void;\n}\n\n/**\n * ConsentRow - Single consent requirement row\n *\n * Displays a row for configuring a consent requirement with:\n * - Input field for consent type name (e.g., \"functional\", \"marketing\")\n * - Checkbox for granted/denied state (checked = true/granted required)\n * - \"Granted\" label next to checkbox\n * - Trash button to remove the row\n *\n * Layout: [Input 200px] [Checkbox] [Label \"Granted\"] [Trash Button]\n *\n * @example\n * <ConsentRow\n * consentType=\"functional\"\n * granted={true}\n * onConsentTypeChange={setType}\n * onGrantedChange={setGranted}\n * onRemove={handleRemove}\n * />\n */\nexport function ConsentRow({\n consentType,\n granted,\n onConsentTypeChange,\n onGrantedChange,\n onRemove,\n}: ConsentRowProps) {\n return (\n <div className=\"elb-consent-row\">\n <input\n type=\"text\"\n className=\"elb-consent-input\"\n value={consentType}\n onChange={(e) => onConsentTypeChange(e.target.value)}\n placeholder=\"e.g., functional\"\n />\n <div className=\"elb-consent-checkbox-wrapper\">\n <input\n type=\"checkbox\"\n className=\"elb-rjsf-checkbox\"\n checked={granted}\n onChange={(e) => onGrantedChange(e.target.checked)}\n />\n <span className=\"elb-consent-label\">Required</span>\n </div>\n <IconButton\n icon=\"delete\"\n variant=\"danger\"\n onClick={onRemove}\n title=\"Remove consent requirement\"\n />\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { CodeBox } from '../molecules/code-box';\nimport { FieldHeader } from './field-header';\nimport { Toggle } from './toggle';\n\n/**\n * MappingValueWidget - Widget for static PropertyType values\n *\n * Supports:\n * - String: text input\n * - Number: number input\n * - Boolean: checkbox\n * - Object: JSON editor (CodeBox)\n *\n * Features:\n * - Custom header with type selector positioned right\n * - Smart type detection based on current value\n * - Title and description rendered in widget (not by FieldTemplate)\n */\nexport function MappingValueWidget(props: WidgetProps) {\n const { value, onChange, disabled, readonly, schema, label, options } = props;\n\n // Extract title and description from schema or props\n // When using oneOf, RJSF may not pass description through schema\n const title = schema?.title || label || 'Value';\n const description = schema?.description || 'Static value to return';\n\n // Get emptyValue from options if specified\n const emptyValue = options?.emptyValue;\n\n // Determine type from actual value, default to none if undefined\n const getCurrentType = ():\n | 'none'\n | 'string'\n | 'number'\n | 'boolean'\n | 'object' => {\n // If value matches emptyValue, treat as string (to preserve empty strings)\n if (emptyValue !== undefined && value === emptyValue) {\n return 'string';\n }\n\n // Explicit undefined/null check - default to none for empty values\n if (value === undefined || value === null) return 'none';\n\n const valueType = typeof value;\n\n // Check for object type (but not arrays)\n if (valueType === 'object' && !Array.isArray(value)) return 'object';\n\n // Check for primitive types - including 0, false, and empty string\n if (valueType === 'number' || valueType === 'boolean') return valueType;\n if (valueType === 'string') return 'string';\n\n // Default fallback\n return 'none';\n };\n\n const [selectedType, setSelectedType] = useState<\n 'none' | 'string' | 'number' | 'boolean' | 'object'\n >(getCurrentType);\n\n // Track if user manually selected a type (to prevent auto-switching)\n const userSelectedTypeRef = React.useRef(false);\n\n // Track previous value to detect external changes (not user typing)\n const prevValueRef = React.useRef(value);\n\n // Sync selectedType only when value changes externally (e.g., loading new rule)\n useEffect(() => {\n // Detect if this is an external change by checking if value type changed\n const prevType = typeof prevValueRef.current;\n const currentType = typeof value;\n\n // Check if this is a major type change (switching rules)\n const isMajorTypeChange =\n prevType !== currentType ||\n (value === undefined && prevValueRef.current !== undefined) ||\n (value !== undefined && prevValueRef.current === undefined);\n\n if (isMajorTypeChange) {\n // Reset the user selection flag when loading new rule\n userSelectedTypeRef.current = false;\n const detectedType = getCurrentType();\n setSelectedType(detectedType);\n } else if (userSelectedTypeRef.current) {\n // User manually selected a type, keep it even if value changes\n // This allows empty string to stay as 'string' type\n }\n\n prevValueRef.current = value;\n }, [value]);\n\n const handleTypeChange = (\n newType: 'none' | 'string' | 'number' | 'boolean' | 'object',\n ) => {\n // Mark that user manually selected a type\n userSelectedTypeRef.current = true;\n setSelectedType(newType);\n\n // Set default value for new type\n switch (newType) {\n case 'none':\n onChange(undefined);\n break;\n case 'string':\n onChange('');\n break;\n case 'number':\n onChange(0);\n break;\n case 'boolean':\n onChange(false);\n break;\n case 'object':\n onChange({});\n break;\n }\n };\n\n const handleStringChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n // Always pass the string value, even if empty\n // Use emptyValue if specified and value is empty, otherwise use the actual value\n const stringValue = e.target.value;\n const valueToSend =\n stringValue === '' && emptyValue !== undefined ? emptyValue : stringValue;\n onChange(valueToSend);\n };\n\n const handleNumberChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const num = parseFloat(e.target.value);\n onChange(isNaN(num) ? 0 : num);\n };\n\n const handleBooleanChange = (checked: boolean) => {\n onChange(checked);\n };\n\n const handleObjectChange = (code: string) => {\n try {\n const parsed = JSON.parse(code);\n onChange(parsed);\n } catch {\n // Keep existing value if invalid JSON\n }\n };\n\n return (\n <div className=\"elb-rjsf-widget\">\n {/* Reusable header with type selector */}\n <FieldHeader\n title={title}\n description={description}\n action={\n <select\n className=\"elb-value-widget-type-select\"\n value={selectedType}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(e) => handleTypeChange(e.target.value as any)}\n disabled={disabled || readonly}\n >\n <option value=\"none\">None</option>\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"object\">Object</option>\n </select>\n }\n />\n\n {/* Input based on selected type */}\n {selectedType === 'string' && (\n <input\n type=\"text\"\n value={(value as string) || ''}\n onChange={handleStringChange}\n disabled={disabled}\n readOnly={readonly}\n className=\"elb-auto-select-input\"\n placeholder=\"Enter string value\"\n />\n )}\n\n {selectedType === 'number' && (\n <input\n type=\"number\"\n value={typeof value === 'number' ? value : 0}\n onChange={handleNumberChange}\n disabled={disabled}\n readOnly={readonly}\n className=\"elb-auto-select-input\"\n placeholder=\"Enter number value\"\n />\n )}\n\n {selectedType === 'boolean' && (\n <Toggle\n checked={!Boolean(value)}\n onChange={(checked) => handleBooleanChange(!checked)}\n disabled={disabled || readonly}\n label={value ? 'true' : 'false'}\n />\n )}\n\n {selectedType === 'object' && (\n <CodeBox\n code={JSON.stringify(value || {}, null, 2)}\n onChange={handleObjectChange}\n language=\"json\"\n height={120}\n // @ts-expect-error - Old Phase 1 component, readOnly prop type mismatch to be fixed in Phase 5\n readOnly={readonly}\n />\n )}\n </div>\n );\n}\n","import React from 'react';\n\nexport interface FieldHeaderProps {\n title: string;\n description?: string;\n required?: boolean;\n action?: React.ReactNode;\n}\n\n/**\n * FieldHeader - Reusable header component for form fields\n *\n * Provides consistent label + description layout used throughout RJSF forms.\n * Optionally supports an action element (like a selector) positioned on the right.\n *\n * Features:\n * - Standard label with optional required indicator\n * - Optional description with consistent styling\n * - Optional action element aligned to the right\n * - Uses same structure as FieldTemplate for consistency\n *\n * @example\n * // Simple label + description\n * <FieldHeader\n * title=\"Name\"\n * description=\"Enter your full name\"\n * />\n *\n * @example\n * // With action element (type selector)\n * <FieldHeader\n * title=\"Value\"\n * description=\"Static value to return\"\n * action={\n * <select value={type} onChange={handleChange}>\n * <option value=\"string\">String</option>\n * <option value=\"number\">Number</option>\n * </select>\n * }\n * />\n */\nexport function FieldHeader({\n title,\n description,\n required,\n action,\n}: FieldHeaderProps) {\n // If there's an action, use flexbox layout; otherwise use standard block layout\n if (action) {\n return (\n <div className=\"elb-field-header-with-action\">\n <div>\n <label className=\"elb-rjsf-label\">\n {title}\n {required && <span className=\"elb-rjsf-required\"> *</span>}\n </label>\n {description && (\n <div className=\"elb-rjsf-description\">{description}</div>\n )}\n </div>\n {action}\n </div>\n );\n }\n\n // Standard layout without action\n return (\n <>\n <label className=\"elb-rjsf-label\">\n {title}\n {required && <span className=\"elb-rjsf-required\"> *</span>}\n </label>\n {description && <div className=\"elb-rjsf-description\">{description}</div>}\n </>\n );\n}\n","import React from 'react';\n\nexport interface ToggleProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n label?: string;\n id?: string;\n}\n\nexport function Toggle({\n checked,\n onChange,\n disabled = false,\n label,\n id,\n}: ToggleProps) {\n const toggleId = id || `toggle-${Math.random().toString(36).substr(2, 9)}`;\n\n return (\n <div className=\"elb-toggle-container\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n id={toggleId}\n className={`elb-toggle ${checked ? 'elb-toggle-checked' : ''} ${\n disabled ? 'elb-toggle-disabled' : ''\n }`}\n onClick={() => !disabled && onChange(!checked)}\n disabled={disabled}\n >\n <span className=\"elb-toggle-slider\" />\n </button>\n {label && (\n <label htmlFor={toggleId} className=\"elb-toggle-label\">\n {label}\n </label>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { WidgetProps, RJSFSchema } from '@rjsf/utils';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type {\n UseMappingNavigationReturn,\n NodeType,\n} from '../../hooks/useMappingNavigation';\nimport { MappingInputWithButton } from './mapping-input-with-button';\nimport { MappingConfirmButton } from './mapping-confirm-button';\nimport { getConfiguredProperties } from '../../utils/value-display-formatter';\nimport { PropertySuggestions } from '../molecules/property-suggestions';\n\n/**\n * Form context interface for object explorer widget\n */\nexport interface ObjectExplorerFormContext {\n navigation: UseMappingNavigationReturn;\n mappingState: UseMappingStateReturn;\n path: string[];\n}\n\n/**\n * Configuration options from uiSchema\n */\nexport interface ObjectExplorerOptions {\n allowAdd?: boolean; // Allow adding new keys (default: true)\n allowRename?: boolean; // Allow renaming keys (default: true)\n allowDelete?: boolean; // Allow deleting keys (default: true)\n showBadges?: boolean; // Show property badges (default: true)\n childNodeType?: NodeType; // Node type for child navigation (default: 'valueType')\n emptyMessage?: string; // Empty state message\n placeholder?: string; // Input placeholder text\n propertySuggestionsSchema?: RJSFSchema; // Schema for property suggestions\n}\n\n/**\n * MappingObjectExplorerWidget - Generic RJSF widget for object key-value exploration\n *\n * Replicates the exact behavior of MappingMapPaneView but is schema-driven.\n * Can be reused for map transformations, settings navigation, and any nested object exploration.\n *\n * Features (identical to original map pane):\n * - List object keys sorted alphabetically\n * - Add new key with input + button\n * - Rename key inline with edit icon\n * - Delete key with confirm button\n * - Show badges for configured properties\n * - Navigate to child editor on click\n * - Navigate to specific property on badge click\n *\n * Configuration via uiSchema:\n * ```typescript\n * {\n * 'ui:widget': 'objectExplorer',\n * 'ui:options': {\n * allowAdd: true,\n * allowRename: true,\n * allowDelete: true,\n * showBadges: true,\n * childNodeType: 'valueType',\n * emptyMessage: 'No keys yet...',\n * placeholder: 'Type key name...'\n * }\n * }\n * ```\n *\n * Requires formContext with navigation, mappingState, and path.\n */\nexport function MappingObjectExplorerWidget(props: WidgetProps) {\n const { value, onChange, options, formContext } = props;\n\n // Extract context\n const { navigation, mappingState, path } = (formContext ||\n {}) as ObjectExplorerFormContext;\n\n // Extract options with defaults\n const config: Required<\n Omit<ObjectExplorerOptions, 'propertySuggestionsSchema'>\n > & { propertySuggestionsSchema?: RJSFSchema } = {\n allowAdd: options?.allowAdd !== false,\n allowRename: options?.allowRename !== false,\n allowDelete: options?.allowDelete !== false,\n showBadges: options?.showBadges !== false,\n childNodeType: (options?.childNodeType as NodeType) || 'valueType',\n emptyMessage:\n (typeof options?.emptyMessage === 'string' ? options?.emptyMessage : undefined) || 'No keys yet. Add keys to transform event data.',\n placeholder:\n (typeof options?.placeholder === 'string' ? options?.placeholder : undefined) ||\n 'Type key name to create or select (e.g., currency)...',\n propertySuggestionsSchema: options?.propertySuggestionsSchema as\n | RJSFSchema\n | undefined,\n };\n\n // State for add/rename operations\n const [newKey, setNewKey] = useState('');\n const [keyExists, setKeyExists] = useState(false);\n const [renamingKey, setRenamingKey] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState('');\n\n // Get map object from value\n const map =\n value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n\n // Get sorted list of map keys\n const mapKeys = Object.keys(map).sort();\n\n // Add key handlers\n const handleKeyInputChange = (newValue: string) => {\n setNewKey(newValue);\n setKeyExists(map[newValue] !== undefined);\n };\n\n const handleKeySubmit = () => {\n const key = newKey.trim();\n if (!key) {\n setNewKey('');\n return;\n }\n\n // Initialize with empty string if new\n if (!keyExists) {\n const newMap = { ...map, [key]: '' };\n onChange(newMap);\n }\n\n // Navigate to the key editor\n if (navigation) {\n navigation.openTab([...path, key], config.childNodeType);\n }\n\n setNewKey('');\n setKeyExists(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setNewKey('');\n setKeyExists(false);\n }\n };\n\n // Key click handler - navigate to child editor\n const handleKeyClick = (key: string) => {\n if (navigation) {\n navigation.openTab([...path, key], config.childNodeType);\n }\n };\n\n // Badge click handler - navigate to specific property\n const handleBadgeClick = (key: string, prop: string) => {\n if (!navigation) return;\n\n // If prop is empty (simple string value), go to child overview\n if (!prop) {\n navigation.openTab([...path, key], config.childNodeType);\n return;\n }\n\n // Map each property to its corresponding node type and path\n const propToNodeType: Record<string, string> = {\n fn: 'fn',\n key: 'key',\n value: 'value',\n map: 'map',\n loop: 'loop',\n set: 'set',\n consent: 'consent',\n condition: 'condition',\n validate: 'validate',\n };\n\n const nodeType = propToNodeType[prop] || config.childNodeType;\n const targetPath = [...path, key, prop];\n\n navigation.openTab(targetPath, nodeType as NodeType);\n };\n\n // Delete key handler\n const handleDeleteClick = (key: string) => {\n const newMap = { ...map };\n delete newMap[key];\n onChange(newMap);\n };\n\n // Rename handlers\n const handleRenameClick = (key: string) => {\n setRenamingKey(key);\n setRenameValue(key);\n };\n\n const handleRenameChange = (newValue: string) => {\n setRenameValue(newValue);\n };\n\n const handleRenameSubmit = (oldKey: string) => {\n const newKeyTrimmed = renameValue.trim();\n\n // Cancel if empty or unchanged\n if (!newKeyTrimmed || newKeyTrimmed === oldKey) {\n setRenamingKey(null);\n setRenameValue('');\n return;\n }\n\n // Cancel if key already exists\n if (map[newKeyTrimmed] !== undefined) {\n setRenamingKey(null);\n setRenameValue('');\n return;\n }\n\n // Rename: copy value to new key, delete old key\n const oldValue = map[oldKey];\n const newMap = { ...map };\n delete newMap[oldKey];\n newMap[newKeyTrimmed] = oldValue;\n\n onChange(newMap);\n setRenamingKey(null);\n setRenameValue('');\n };\n\n const handleRenameCancel = () => {\n setRenamingKey(null);\n setRenameValue('');\n };\n\n const handleRenameKeyDown = (e: React.KeyboardEvent, oldKey: string) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n handleRenameCancel();\n }\n };\n\n const handleRenameBlur = () => {\n // Cancel edit on blur (clicking outside)\n // Use setTimeout to allow button click to register first\n setTimeout(() => {\n handleRenameCancel();\n }, 150);\n };\n\n // Property suggestion selection handler\n const handlePropertySelect = (propertyName: string, nodeType: NodeType) => {\n // Initialize with empty string if new\n if (map[propertyName] === undefined) {\n const newMap = { ...map, [propertyName]: '' };\n onChange(newMap);\n }\n\n // Navigate to the property editor using the schema-detected NodeType\n if (navigation) {\n navigation.openTab([...path, propertyName], nodeType);\n }\n };\n\n return (\n <div className=\"elb-object-explorer\">\n {/* Add new key input */}\n {config.allowAdd && (\n <div className=\"elb-policy-input-section\">\n <MappingInputWithButton\n value={newKey}\n onChange={handleKeyInputChange}\n onSubmit={handleKeySubmit}\n onKeyDown={handleKeyDown}\n buttonLabel={keyExists ? 'Open' : 'Add Key'}\n showButton={true}\n placeholder={config.placeholder}\n className={keyExists ? 'is-existing' : ''}\n />\n </div>\n )}\n\n {/* Property suggestions from schema */}\n {config.allowAdd &&\n config.propertySuggestionsSchema &&\n typeof config.propertySuggestionsSchema === 'object' &&\n 'properties' in config.propertySuggestionsSchema && (\n <PropertySuggestions\n schema={config.propertySuggestionsSchema}\n existingKeys={mapKeys}\n currentValue={map}\n onSelect={handlePropertySelect}\n />\n )}\n\n {/* Map keys list */}\n {mapKeys.length > 0 && (\n <div className=\"elb-policy-list\">\n {mapKeys.map((key) => {\n const keyValue = map[key];\n const configuredProps = config.showBadges\n ? getConfiguredProperties(keyValue)\n : [];\n\n const isRenaming = renamingKey === key;\n\n return (\n <div\n key={key}\n className=\"elb-policy-row\"\n onClick={() => !isRenaming && handleKeyClick(key)}\n style={{ cursor: isRenaming ? 'default' : 'pointer' }}\n >\n {/* First column: Key + Edit icon */}\n {isRenaming ? (\n <div className=\"elb-policy-row-path-rename\">\n <MappingInputWithButton\n value={renameValue}\n onChange={handleRenameChange}\n onSubmit={() => handleRenameSubmit(key)}\n onKeyDown={(e) => handleRenameKeyDown(e, key)}\n onBlur={handleRenameBlur}\n buttonLabel=\"Save\"\n showButton={true}\n autoFocus\n className=\"\"\n />\n </div>\n ) : (\n <div className=\"elb-policy-row-path-with-edit\">\n <span className=\"elb-policy-row-path\">{key}</span>\n {config.allowRename && (\n <button\n type=\"button\"\n className=\"elb-mapping-edit-button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRenameClick(key);\n }}\n title=\"Rename key\"\n aria-label={`Rename key ${key}`}\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.5 1.5L12.5 3.5L4.5 11.5H2.5V9.5L10.5 1.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 3L11 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Second column: Badges */}\n {config.showBadges && (\n <div className=\"elb-policy-row-badges\">\n {configuredProps.map(({ prop, value, isLong }, index) => (\n <button\n key={prop || index}\n type=\"button\"\n className=\"elb-policy-badge\"\n onClick={(e) => {\n e.stopPropagation();\n handleBadgeClick(key, prop);\n }}\n title={\n prop\n ? `Click to edit ${prop}`\n : 'Click to edit value configuration'\n }\n >\n {prop && (\n <span className=\"elb-policy-badge-label\">\n {prop}:\n </span>\n )}\n <span\n className={`elb-policy-badge-value ${isLong ? 'is-long' : ''}`}\n >\n {value}\n </span>\n </button>\n ))}\n </div>\n )}\n\n {/* Third column: Actions */}\n {config.allowDelete && (\n <div className=\"elb-policy-row-actions\">\n <MappingConfirmButton\n confirmLabel=\"Delete?\"\n onConfirm={() => handleDeleteClick(key)}\n ariaLabel={`Delete key ${key}`}\n className=\"elb-mapping-delete-button\"\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Empty state */}\n {mapKeys.length === 0 && (\n <div className=\"elb-policy-empty\">\n <p>{config.emptyMessage}</p>\n <ul>\n <li>Each key becomes a property in the output</li>\n <li>Values can be simple strings or complex transformations</li>\n <li>Example: currency → \"USD\", item_id → \"data.id\"</li>\n </ul>\n </div>\n )}\n </div>\n );\n}\n","import type { RJSFSchema } from '@rjsf/utils';\nimport type { NodeType } from '../../hooks/useMappingNavigation';\nimport { RuleTile, type RuleTileStatus } from '../atoms/config-tile';\nimport { detectNodeTypeFromSchema } from '../../utils/type-detector';\n\n/**\n * Property Suggestions Component\n *\n * Shows configured properties first (as tiles with values), then available suggestions in a grid.\n * Uses schema to determine the correct NodeType for each property.\n */\nexport interface PropertySuggestionsProps {\n schema?: RJSFSchema;\n existingKeys?: string[];\n currentValue?: Record<string, unknown>;\n onSelect: (propertyName: string, nodeType: NodeType) => void;\n className?: string;\n}\n\ninterface PropertyInfo {\n name: string;\n title: string;\n description?: string;\n nodeType: NodeType;\n}\n\nfunction getPropertyStatus(value: unknown, title: string): RuleTileStatus {\n if (value === undefined || value === null || value === '') {\n return { enabled: false, text: 'Not set' };\n }\n\n // Simple value display\n if (typeof value === 'string') {\n return { enabled: true, text: value };\n }\n if (typeof value === 'number') {\n return { enabled: true, text: String(value) };\n }\n if (typeof value === 'boolean') {\n return { enabled: true, text: value ? 'true' : 'false' };\n }\n if (Array.isArray(value)) {\n return { enabled: true, text: `${value.length} items` };\n }\n if (typeof value === 'object') {\n const keys = Object.keys(value);\n return { enabled: true, text: `${keys.length} properties` };\n }\n\n return { enabled: true, text: 'Configured' };\n}\n\nexport function PropertySuggestions({\n schema,\n existingKeys = [],\n currentValue = {},\n onSelect,\n className = '',\n}: PropertySuggestionsProps) {\n if (!schema || !schema.properties) {\n return null;\n }\n\n // Separate configured and available properties\n const configuredProperties: PropertyInfo[] = [];\n const availableProperties: PropertyInfo[] = [];\n\n Object.entries(schema.properties).forEach(([name, propSchema]) => {\n const propSchemaObj = propSchema as RJSFSchema;\n\n // Detect the correct NodeType from the property's schema\n const nodeType = detectNodeTypeFromSchema(propSchemaObj);\n\n const propertyInfo: PropertyInfo = {\n name,\n title: propSchemaObj.title || name,\n description: propSchemaObj.description,\n nodeType,\n };\n\n if (existingKeys.includes(name)) {\n configuredProperties.push(propertyInfo);\n } else {\n availableProperties.push(propertyInfo);\n }\n });\n\n // Sort both lists alphabetically\n configuredProperties.sort((a, b) => a.title.localeCompare(b.title));\n availableProperties.sort((a, b) => a.title.localeCompare(b.title));\n\n return (\n <div className={`elb-property-suggestions ${className}`}>\n {/* Configured properties - shown as tiles with values */}\n {configuredProperties.length > 0 && (\n <div className=\"elb-property-suggestions-section\">\n <div className=\"elb-property-suggestions-grid\">\n {configuredProperties.map((prop) => (\n <RuleTile\n key={prop.name}\n label={prop.title}\n description={prop.description || ''}\n status={getPropertyStatus(currentValue[prop.name], prop.title)}\n onClick={() => onSelect(prop.name, prop.nodeType)}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Available properties - shown as simple tiles */}\n {availableProperties.length > 0 && (\n <div className=\"elb-property-suggestions-section\">\n {configuredProperties.length > 0 && (\n <div className=\"elb-property-suggestions-divider\">\n <span>Available Properties</span>\n </div>\n )}\n <div className=\"elb-property-suggestions-grid\">\n {availableProperties.map((prop) => (\n <RuleTile\n key={prop.name}\n label={prop.title}\n description={prop.description || ''}\n status={{ enabled: false, text: 'Not set' }}\n onClick={() => onSelect(prop.name, prop.nodeType)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type { RegistryWidgetsType } from '@rjsf/utils';\nimport { MappingStringWidget } from '../atoms/mapping-string';\nimport { MappingNumberWidget } from '../atoms/mapping-number';\nimport { MappingBooleanWidget } from '../atoms/mapping-boolean';\nimport { MappingConsentWidget } from '../atoms/mapping-consent';\nimport { MappingValueWidget } from '../atoms/mapping-value';\nimport { MappingObjectExplorerWidget } from '../atoms/mapping-object-explorer';\n\n/**\n * Widget Registry for RJSF Mapping Forms\n *\n * Central registry of all custom mapping widgets used in react-jsonschema-form.\n * Widgets are registered here and referenced in uiSchema via 'ui:widget' property.\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * name: {\n * 'ui:widget': 'mappingString'\n * }\n * }\n *\n * @example\n * // In Form component:\n * <Form\n * schema={schema}\n * widgets={mappingWidgets}\n * ...\n * />\n *\n * To add a new widget:\n * 1. Create the widget component in src/components/atoms/mapping-*.tsx\n * 2. Import it here\n * 3. Add to the mappingWidgets object with a descriptive key\n * 4. Reference it in uiSchema using the key\n */\n\n/**\n * Mapping Widgets Registry\n *\n * Available widgets:\n * - mappingString: Text input for string values\n * - mappingNumber: Number input with min/max validation\n * - mappingBoolean: Checkbox for boolean values\n * - mappingConsent: Collapsible consent requirements editor\n * - mappingValue: Multi-type static value editor (string/number/boolean/object)\n * - objectExplorer: Generic object key-value explorer with add/rename/delete/navigate\n */\nexport const mappingWidgets: RegistryWidgetsType = {\n mappingString: MappingStringWidget,\n mappingNumber: MappingNumberWidget,\n mappingBoolean: MappingBooleanWidget,\n mappingConsent: MappingConsentWidget,\n mappingValue: MappingValueWidget,\n objectExplorer: MappingObjectExplorerWidget,\n};\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingConsentWidget } from './mapping-consent';\n\n/**\n * MappingConsentField - RJSF custom field for consent object\n *\n * This is a field wrapper (not a widget) because RJSF requires custom fields\n * for object types, not widgets. Widgets are only used for primitive types.\n *\n * The field wraps our MappingConsentWidget and provides the necessary\n * interface that RJSF expects for custom fields.\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * consent: {\n * 'ui:field': 'mappingConsent'\n * }\n * }\n */\nexport function MappingConsentField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n // Convert FieldProps to WidgetProps format\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - Old Phase 1 component, RJSF WidgetProps type mismatch to be fixed in Phase 5\n return <MappingConsentWidget {...widgetProps} />;\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { CodeBox } from '../molecules/code-box';\n\n/**\n * Default condition function template\n * Provides a starting point for users with parameter hints\n */\nconst DEFAULT_CONDITION = `(value, mapping, collector) => {\n // Return true to apply this mapping rule\n // value: The event data\n // mapping: The mapping configuration\n // collector: The collector instance\n return true;\n}`;\n\n/**\n * MappingConditionWidget - RJSF widget for condition functions\n *\n * Manages condition functions as strings for mapping rules.\n * A condition determines whether a mapping rule should be applied.\n *\n * States:\n * - Unchecked (default): No condition, value is undefined\n * - Checked: Shows code editor with function template\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * condition: {\n * type: 'string',\n * title: 'Use condition',\n * description: 'Conditionally apply this mapping rule'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * condition: {\n * 'ui:widget': 'mappingCondition'\n * }\n * }\n */\nexport function MappingConditionWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const conditionCode = (value as string | undefined) || '';\n const hasCondition = Boolean(conditionCode);\n\n // Extract title and description from schema\n const title = schema?.title || 'Use condition';\n const description = schema?.description;\n\n const handleCheckboxChange = (checked: boolean) => {\n if (checked) {\n // Enable condition - set to default template\n onChange(DEFAULT_CONDITION);\n } else {\n // Disable condition - set to undefined\n onChange(undefined);\n }\n };\n\n const handleCodeChange = (code: string) => {\n // Update the condition code\n onChange(code || undefined);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"checkbox\"\n title={title}\n description={description}\n checked={hasCondition}\n onCheckedChange={handleCheckboxChange}\n disabled={disabled || readonly}\n >\n <CodeBox\n code={conditionCode}\n onChange={handleCodeChange}\n language=\"javascript\"\n label=\"Condition\"\n lineNumbers\n folding={false}\n disabled={disabled || readonly}\n />\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingConditionWidget } from './mapping-condition';\n\n/**\n * MappingConditionField - RJSF custom field for condition strings\n *\n * This is a field wrapper (not a widget) because RJSF requires custom fields\n * for complex types. The field wraps our MappingConditionWidget and provides\n * the necessary interface that RJSF expects for custom fields.\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * condition: {\n * 'ui:field': 'mappingCondition'\n * }\n * }\n */\nexport function MappingConditionField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n // Convert FieldProps to WidgetProps format\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - Old Phase 1 component, RJSF WidgetProps type mismatch to be fixed in Phase 5\n return <MappingConditionWidget {...widgetProps} />;\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { CodeBox } from '../molecules/code-box';\n\n/**\n * Default fn function template\n * Provides a starting point for users with parameter hints\n */\nconst DEFAULT_FN = `(value, mapping, options) => {\n // Transform the value\n // value: Input value from event or previous transformation\n // mapping: The current mapping configuration\n // options: { consent, collector, props }\n return value;\n}`;\n\n/**\n * MappingFnWidget - RJSF widget for custom transformation functions\n *\n * Manages fn (transformation) functions as strings for ValueConfig.\n * A fn function transforms values from one format to another.\n *\n * States:\n * - Unchecked (default): No transformation, value is undefined\n * - Checked: Shows code editor with function template\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * fn: {\n * type: 'string',\n * title: 'Function',\n * description: 'Custom transformation function'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * fn: {\n * 'ui:field': 'mappingFn'\n * }\n * }\n */\nexport function MappingFnWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const fnCode = (value as string | undefined) || '';\n const hasFn = Boolean(fnCode);\n\n // Extract title and description from schema\n const title = schema?.title || 'Function';\n const description = schema?.description;\n\n const handleCheckboxChange = (checked: boolean) => {\n if (checked) {\n // Enable fn - set to default template\n onChange(DEFAULT_FN);\n } else {\n // Disable fn - set to undefined\n onChange(undefined);\n }\n };\n\n const handleCodeChange = (code: string) => {\n // Update the fn code\n onChange(code || undefined);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"checkbox\"\n title={title}\n description={description}\n checked={hasFn}\n onCheckedChange={handleCheckboxChange}\n disabled={disabled || readonly}\n >\n <CodeBox\n code={fnCode}\n onChange={handleCodeChange}\n language=\"javascript\"\n showHeader={false}\n lineNumbers\n folding={false}\n disabled={disabled || readonly}\n />\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingFnWidget } from './mapping-fn';\n\n/**\n * MappingFnField - RJSF field wrapper for fn (transformation function)\n *\n * Bridges RJSF FieldProps to our custom MappingFnWidget.\n * Required because RJSF uses fields (not widgets) for complex types.\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * mappingFn: MappingFnField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * fn: {\n * 'ui:field': 'mappingFn'\n * }\n * };\n */\nexport function MappingFnField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - Old Phase 1 component, RJSF WidgetProps type mismatch to be fixed in Phase 5\n return <MappingFnWidget {...widgetProps} />;\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { FieldHeader } from './field-header';\n\n/**\n * MappingKeyWidget - RJSF widget for key property\n *\n * Manages the key property of ValueConfig - a string path to extract\n * values from events (e.g., 'data.id', 'user.email', 'globals.currency').\n *\n * Features:\n * - Simple text input for path entry\n * - Helpful examples and common path patterns\n * - Clean, focused interface for single property editing\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * key: {\n * type: 'string',\n * title: 'Key',\n * description: 'Extract value from event path'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * key: {\n * 'ui:widget': 'mappingKey'\n * }\n * }\n */\nexport function MappingKeyWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n placeholder,\n } = props;\n\n const keyValue = (value as string | undefined) || '';\n\n // Extract title and description from schema\n const title = schema?.title || 'Key';\n const description = schema?.description || 'Extract value from event path';\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n onChange(newValue || undefined);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <FieldHeader title={title} description={description} />\n\n <input\n id={id}\n type=\"text\"\n value={keyValue}\n onChange={handleChange}\n disabled={disabled}\n readOnly={readonly}\n className=\"elb-auto-select-input\"\n placeholder={placeholder || 'e.g., data.id, user.email'}\n />\n\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingKeyWidget } from './mapping-key';\n\n/**\n * MappingKeyField - RJSF field wrapper for key property\n *\n * Bridges RJSF FieldProps to our custom MappingKeyWidget.\n * Required because RJSF uses fields (not widgets) for custom field rendering.\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * mappingKey: MappingKeyField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * key: {\n * 'ui:field': 'mappingKey'\n * }\n * };\n */\nexport function MappingKeyField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n placeholder: uiSchema?.['ui:placeholder'] as string | undefined,\n };\n\n // @ts-expect-error - RJSF WidgetProps type mismatch, will be fixed in Phase 5\n return <MappingKeyWidget {...widgetProps} />;\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { CodeBox } from '../molecules/code-box';\n\n/**\n * Default validate function template\n * Provides a starting point for users with parameter hints\n */\nconst DEFAULT_VALIDATE = `(value) => {\n // Return true if value is valid\n // value: The result from key/fn/map/etc\n return value !== undefined;\n}`;\n\n/**\n * MappingValidateWidget - RJSF widget for validate functions\n *\n * Manages validate functions as strings for ValueConfig.\n * A validate function checks if the mapped value is valid.\n *\n * States:\n * - Unchecked (default): No validation, value is undefined\n * - Checked: Shows code editor with function template\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * validate: {\n * type: 'string',\n * title: 'Validate',\n * description: 'Validate the result'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * validate: {\n * 'ui:field': 'mappingValidate'\n * }\n * }\n */\nexport function MappingValidateWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const validateCode = (value as string | undefined) || '';\n const hasValidate = Boolean(validateCode);\n\n // Extract title and description from schema\n const title = schema?.title || 'Validate';\n const description = schema?.description;\n\n const handleCheckboxChange = (checked: boolean) => {\n if (checked) {\n // Enable validate - set to default template\n onChange(DEFAULT_VALIDATE);\n } else {\n // Disable validate - set to undefined\n onChange(undefined);\n }\n };\n\n const handleCodeChange = (code: string) => {\n // Update the validate code\n onChange(code || undefined);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"checkbox\"\n title={title}\n description={description}\n checked={hasValidate}\n onCheckedChange={handleCheckboxChange}\n disabled={disabled || readonly}\n >\n <CodeBox\n code={validateCode}\n onChange={handleCodeChange}\n language=\"javascript\"\n showHeader={false}\n lineNumbers\n folding={false}\n disabled={disabled || readonly}\n />\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingValidateWidget } from './mapping-validate';\n\n/**\n * MappingValidateField - RJSF field wrapper for validate\n *\n * Bridges RJSF FieldProps to our custom MappingValidateWidget.\n * Required because RJSF uses fields (not widgets) for complex types.\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * mappingValidate: MappingValidateField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * validate: {\n * 'ui:field': 'mappingValidate'\n * }\n * };\n */\nexport function MappingValidateField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - Old Phase 1 component, RJSF WidgetProps type mismatch to be fixed in Phase 5\n return <MappingValidateWidget {...widgetProps} />;\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport {\n valueConfigSchema,\n valueConfigUiSchema,\n} from '../../schemas/value-config-schema';\nimport { IconButton } from './icon-button';\nimport { cleanFormData } from '../../utils/clean-form-data';\n\n/**\n * MappingDataWidget - RJSF widget for data transformation\n *\n * Manages ValueConfig as an object for data transformation.\n * Contains a nested RJSF form for ValueConfig properties.\n *\n * States:\n * - Default (no data): Shows collapsed toggle with \"Add data transformation\" button\n * - With data: Shows toggle collapsible section with ValueConfig form\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * data: {\n * type: 'object',\n * title: 'Data',\n * description: 'Transform event data'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * data: {\n * 'ui:field': 'mappingData'\n * }\n * }\n */\nexport function MappingDataWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const dataConfig = (value as Record<string, unknown> | undefined) || {};\n const hasData = Object.keys(dataConfig).length > 0;\n\n // Extract title and description from schema\n const title = schema?.title || 'Data';\n const description = schema?.description;\n\n // Track if user wants to show the form (either has data or clicked add button)\n const [showForm, setShowForm] = useState(hasData);\n\n // Start expanded if we have existing data or form is shown\n const [isExpanded, setIsExpanded] = useState(hasData);\n\n // Track previous value to avoid redundant updates\n const prevValueRef = useRef<unknown>(value);\n\n // Update state when value changes externally (e.g., switching between mapping rules)\n useEffect(() => {\n const newHasData =\n value && typeof value === 'object' && Object.keys(value).length > 0;\n setShowForm(!!newHasData);\n setIsExpanded(!!newHasData);\n }, [value]);\n\n const handleAddData = () => {\n // Show the form without initializing data\n setShowForm(true);\n setIsExpanded(true);\n };\n\n const handleFormChange = useCallback(\n (formData: unknown) => {\n const newData = cleanFormData(formData as Record<string, unknown>);\n\n // If all fields are empty, set to undefined\n const finalData = Object.keys(newData).length > 0 ? newData : undefined;\n\n // Only call onChange if data actually changed\n if (prevValueRef.current !== finalData) {\n prevValueRef.current = finalData;\n onChange(finalData);\n }\n },\n [onChange],\n );\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <div className=\"elb-data-widget-wrapper\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n >\n {showForm ? (\n <div className=\"elb-data-widget-form\">\n <MappingFormWrapper\n schema={valueConfigSchema}\n uiSchema={valueConfigUiSchema}\n formData={hasData ? dataConfig : undefined}\n onChange={handleFormChange}\n nested={true}\n />\n </div>\n ) : (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddData}\n disabled={disabled || readonly}\n className=\"elb-data-add-button\"\n >\n Add data transformation\n </IconButton>\n )}\n </MappingCollapsible>\n </div>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import type { RJSFSchema, UiSchema } from '@rjsf/utils';\n\n/**\n * JSON Schema for Mapping.ValueConfig\n *\n * Based on packages/core/src/types/mapping.ts\n *\n * Implemented fields:\n * - key: String path to extract value from event (e.g., 'data.id', 'user.email')\n * - value: Static value (string, number, boolean, or JSON object)\n * - fn: Custom transformation function\n * - validate: Function to validate the result\n * - condition: Conditionally apply this mapping\n * - consent: Required consent to return value\n * - map: Object transformation\n * - set: Array of values\n * - loop: Array processing with transformation\n */\nexport const valueConfigSchema: RJSFSchema = {\n type: 'object',\n properties: {\n key: {\n type: 'string',\n title: 'Key',\n description: 'Extract value from event path (e.g., data.id, user.email)',\n },\n value: {\n type: ['string', 'number', 'boolean', 'object'],\n title: 'Value',\n description: 'Static value to return',\n default: '',\n },\n fn: {\n type: 'string',\n title: 'Function',\n description: 'Custom transformation function',\n },\n validate: {\n type: 'string',\n title: 'Validate',\n description: 'Validate the result',\n },\n condition: {\n type: 'string',\n title: 'Condition',\n description: 'Conditionally apply this mapping',\n },\n consent: {\n type: 'object',\n title: 'Consent',\n description: 'Required consent to return value',\n additionalProperties: {\n type: 'boolean',\n },\n },\n map: {\n type: 'object',\n title: 'Map',\n description: 'Transform object properties',\n additionalProperties: true,\n },\n set: {\n type: 'array',\n title: 'Set',\n description: 'Array of static values',\n items: {\n oneOf: [{ type: 'string' }, { type: 'object' }],\n },\n },\n loop: {\n type: 'array',\n title: 'Loop',\n description: 'Process arrays by applying transformation to each item',\n minItems: 2,\n maxItems: 2,\n items: [\n {\n type: 'string',\n title: 'Source',\n description: 'Path to array or \"this\"',\n },\n {\n type: 'object',\n title: 'Transform',\n description: 'Mapping for each item',\n },\n ],\n },\n },\n};\n\n/**\n * Nested ValueConfig Schema (excludes loop to prevent infinite recursion)\n *\n * Used within loop field transform section to prevent recursive rendering.\n * Contains all ValueConfig fields except 'loop' itself.\n */\nexport const valueConfigNestedSchema: RJSFSchema = {\n type: 'object',\n properties: {\n key: {\n type: 'string',\n title: 'Key',\n description: 'Extract value from event path (e.g., data.id, user.email)',\n },\n value: {\n type: ['string', 'number', 'boolean', 'object'],\n title: 'Value',\n description: 'Static value to return',\n default: '',\n },\n fn: {\n type: 'string',\n title: 'Function',\n description: 'Custom transformation function',\n },\n validate: {\n type: 'string',\n title: 'Validate',\n description: 'Validate the result',\n },\n condition: {\n type: 'string',\n title: 'Condition',\n description: 'Conditionally apply this mapping',\n },\n consent: {\n type: 'object',\n title: 'Consent',\n description: 'Required consent to return value',\n additionalProperties: {\n type: 'boolean',\n },\n },\n map: {\n type: 'object',\n title: 'Map',\n description: 'Transform object properties',\n additionalProperties: true,\n },\n set: {\n type: 'array',\n title: 'Set',\n description: 'Array of static values',\n items: {\n oneOf: [{ type: 'string' }, { type: 'object' }],\n },\n },\n // NOTE: 'loop' is intentionally excluded to prevent infinite recursion\n },\n};\n\n/**\n * UI Schema for Mapping.ValueConfig\n *\n * Customizes widget usage and layout for ValueConfig fields\n */\nexport const valueConfigUiSchema: UiSchema = {\n key: {\n 'ui:field': 'mappingKey',\n 'ui:placeholder': 'e.g., data.id, user.email',\n },\n value: {\n 'ui:widget': 'mappingValue',\n 'ui:emptyValue': '',\n 'ui:options': {\n emptyValue: '',\n },\n },\n fn: {\n 'ui:field': 'mappingFn',\n },\n validate: {\n 'ui:field': 'mappingValidate',\n },\n condition: {\n 'ui:field': 'mappingCondition',\n },\n consent: {\n 'ui:field': 'mappingConsent',\n },\n map: {\n 'ui:field': 'mappingMap',\n },\n set: {\n 'ui:field': 'mappingSet',\n },\n loop: {\n 'ui:field': 'mappingLoop',\n },\n 'ui:layout': '1fr',\n 'ui:responsive': true,\n};\n\n/**\n * Nested UI Schema (matches nested schema, excludes loop)\n */\nexport const valueConfigNestedUiSchema: UiSchema = {\n key: {\n 'ui:field': 'mappingKey',\n 'ui:placeholder': 'e.g., data.id, user.email',\n },\n value: {\n 'ui:widget': 'mappingValue',\n 'ui:emptyValue': '',\n 'ui:options': {\n emptyValue: '',\n },\n },\n fn: {\n 'ui:field': 'mappingFn',\n },\n validate: {\n 'ui:field': 'mappingValidate',\n },\n condition: {\n 'ui:field': 'mappingCondition',\n },\n consent: {\n 'ui:field': 'mappingConsent',\n },\n map: {\n 'ui:field': 'mappingMap',\n },\n set: {\n 'ui:field': 'mappingSet',\n },\n // NOTE: 'loop' is intentionally excluded to prevent infinite recursion\n 'ui:layout': '1fr',\n 'ui:responsive': true,\n};\n","/**\n * Clean form data by removing undefined, empty values, and invalid structures\n *\n * This utility ensures that RJSF auto-initialized empty values don't pollute\n * the mapping configuration. It handles:\n * - undefined values\n * - empty strings (except for 'value' field which allows '')\n * - empty arrays (set: [], etc.)\n * - empty objects (map: {}, consent: {}, etc.)\n * - invalid loop tuples ([null, {}], ['', {}], etc.)\n *\n * Used at multiple levels:\n * - Mapping rule level (mapping-editor.tsx)\n * - ValueConfig level (mapping-data.tsx)\n * - Nested ValueConfig levels (mapping-map-entry.tsx, mapping-set-entry.tsx)\n */\nexport function cleanFormData(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const cleaned: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n // Skip undefined values\n if (value === undefined) continue;\n\n // Skip empty strings (except 'value' field which allows empty string as valid)\n if (value === '' && key !== 'value') continue;\n\n // Skip empty arrays (set: [], or any other empty array)\n if (Array.isArray(value) && value.length === 0) continue;\n\n // Skip invalid loop arrays: [null, {}], ['', {}], or any loop without valid source and transform\n if (key === 'loop' && Array.isArray(value) && value.length === 2) {\n const source = value[0];\n const transform = value[1];\n\n const hasValidSource =\n typeof source === 'string' && source.trim().length > 0;\n const hasValidTransform =\n transform &&\n typeof transform === 'object' &&\n !Array.isArray(transform) &&\n Object.keys(transform).length > 0;\n\n // Only keep loop if both source and transform are valid\n if (!hasValidSource || !hasValidTransform) {\n continue;\n }\n }\n\n // Skip empty objects (map: {}, consent: {}, or any other empty object)\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.keys(value).length === 0\n ) {\n continue;\n }\n\n // Keep all other values\n cleaned[key] = value;\n }\n\n return cleaned;\n}\n\n/**\n * Clean mapping rule data (top-level mapping rules)\n *\n * Extends cleanFormData with additional mapping-specific rules:\n * - Skip false boolean values for 'ignore' field\n * - Skip zero or undefined for 'batch' field\n */\nexport function cleanMappingRuleData(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const cleaned = cleanFormData(data);\n const ruleCleaned: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(cleaned)) {\n // Skip false boolean values for ignore field\n if (key === 'ignore' && value === false) continue;\n\n // Skip zero or undefined for batch\n if (key === 'batch' && (!value || value === 0)) continue;\n\n ruleCleaned[key] = value;\n }\n\n return ruleCleaned;\n}\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingDataWidget } from './mapping-data';\n\n/**\n * MappingDataField - RJSF field wrapper for data transformation\n *\n * Bridges RJSF FieldProps to our custom MappingDataWidget.\n * Required because RJSF uses fields (not widgets) for complex object types.\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * mappingData: MappingDataField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * data: {\n * 'ui:field': 'mappingData'\n * }\n * };\n */\nexport function MappingDataField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - Old Phase 1 component, RJSF WidgetProps type mismatch to be fixed in Phase 5\n return <MappingDataWidget {...widgetProps} />;\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport { IconButton } from './icon-button';\nimport { cleanFormData } from '../../utils/clean-form-data';\n\n/**\n * MappingSettingsWidget - RJSF widget for destination-specific settings\n *\n * Manages settings as an object for destination-specific configuration.\n * Contains a nested RJSF form for settings properties when schema is provided.\n *\n * States:\n * - Default (no settings): Shows collapsed toggle with \"Add settings\" button\n * - With schema: Shows toggle collapsible section with schema-based form\n * - Without schema: Shows toggle collapsible section with JSON editor fallback\n *\n * The widget receives destination schemas via uiSchema['ui:options']:\n * - schema: RJSF schema for the settings object\n * - uiSchema: UI customization for settings fields\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * settings: {\n * type: 'object',\n * title: 'Settings',\n * description: 'Destination-specific configuration'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema (with destination schema):\n * const uiSchema = {\n * settings: {\n * 'ui:field': 'mappingSettings',\n * 'ui:options': {\n * schema: metaSchema.mappingSchema,\n * uiSchema: metaSchema.mappingUiSchema\n * }\n * }\n * }\n */\nexport function MappingSettingsWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n uiSchema,\n } = props;\n\n const settingsConfig = (value as Record<string, unknown> | undefined) || {};\n const hasSettings = Object.keys(settingsConfig).length > 0;\n\n // Extract title and description from schema\n const title = schema?.title || 'Settings';\n const description =\n schema?.description || 'Destination-specific configuration overrides';\n\n // Extract destination schemas from uiSchema options\n const destinationSchema = uiSchema?.['ui:options']?.schema as\n | RJSFSchema\n | undefined;\n const destinationUiSchema = uiSchema?.['ui:options']?.uiSchema as\n | UiSchema\n | undefined;\n\n // Determine if we have a schema to work with\n const hasSchema =\n destinationSchema &&\n destinationSchema.properties &&\n Object.keys(destinationSchema.properties).length > 0;\n\n // Track if user wants to show the form (either has settings or clicked add button)\n const [showForm, setShowForm] = useState(hasSettings);\n\n // Start expanded if we have existing settings or form is shown\n const [isExpanded, setIsExpanded] = useState(hasSettings);\n\n // Track previous value to avoid redundant updates\n const prevValueRef = useRef<unknown>(value);\n\n // Update state when value changes externally (e.g., switching between mapping rules)\n useEffect(() => {\n const newHasSettings =\n value && typeof value === 'object' && Object.keys(value).length > 0;\n setShowForm(!!newHasSettings);\n setIsExpanded(!!newHasSettings);\n }, [value]);\n\n const handleAddSettings = () => {\n // Show the form without initializing settings\n setShowForm(true);\n setIsExpanded(true);\n };\n\n const handleFormChange = useCallback(\n (formData: unknown) => {\n const newSettings = cleanFormData(formData as Record<string, unknown>);\n\n // If all fields are empty, set to undefined\n const finalSettings =\n Object.keys(newSettings).length > 0 ? newSettings : undefined;\n\n // Only call onChange if settings actually changed\n if (prevValueRef.current !== finalSettings) {\n prevValueRef.current = finalSettings;\n onChange(finalSettings);\n }\n },\n [onChange],\n );\n\n const handleClear = () => {\n onChange(undefined);\n setShowForm(false);\n setIsExpanded(false);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n // Mode 1: No settings yet - show add button\n if (!showForm) {\n return (\n <div className=\"elb-rjsf-widget\">\n <div className=\"elb-settings-widget-wrapper\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n className={hasError ? 'elb-field-error' : ''}\n >\n <div className=\"elb-settings-widget-add\">\n <p className=\"elb-settings-widget-hint\">\n {hasSchema\n ? 'Configure destination-specific options for this event'\n : 'Add settings object (schema not available)'}\n </p>\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddSettings}\n disabled={disabled || readonly}\n >\n Add Settings\n </IconButton>\n </div>\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, i) => (\n <span key={i}>{error}</span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n }\n\n // Mode 2: Has settings - show form with schema or fallback\n return (\n <div className=\"elb-rjsf-widget\">\n <div className=\"elb-settings-widget-wrapper\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n className={hasError ? 'elb-field-error' : ''}\n >\n <div className=\"elb-settings-widget-content\">\n {hasSchema ? (\n // Schema-aware mode: Use destination schema\n <div className=\"elb-settings-widget-form\">\n <MappingFormWrapper\n schema={destinationSchema}\n uiSchema={destinationUiSchema}\n formData={value || {}}\n onChange={handleFormChange}\n />\n </div>\n ) : (\n // Fallback mode: Show message + JSON representation\n <div className=\"elb-settings-widget-fallback\">\n <p className=\"elb-settings-widget-hint\">\n This destination doesn't provide a visual settings editor.\n Settings are stored as a JSON object.\n </p>\n <pre className=\"elb-settings-widget-json\">\n {JSON.stringify(value, null, 2)}\n </pre>\n <p className=\"elb-settings-widget-hint text-muted\">\n Edit via Code view or update the mapping configuration\n directly.\n </p>\n </div>\n )}\n\n <div className=\"elb-settings-widget-actions\">\n <IconButton\n icon=\"delete\"\n variant=\"danger\"\n onClick={handleClear}\n disabled={disabled || readonly}\n >\n Clear Settings\n </IconButton>\n </div>\n </div>\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, i) => (\n <span key={i}>{error}</span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default MappingSettingsWidget;\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingSettingsWidget } from './mapping-settings';\n\n/**\n * MappingSettingsField - RJSF field wrapper for destination-specific settings\n *\n * Bridges RJSF FieldProps to our custom MappingSettingsWidget.\n * Required because RJSF uses fields (not widgets) for complex object types.\n *\n * Follows the same pattern as:\n * - MappingDataField → MappingDataWidget\n * - MappingConsentField → MappingConsentWidget\n * - MappingConditionField → MappingConditionWidget\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * mappingSettings: MappingSettingsField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * settings: {\n * 'ui:field': 'mappingSettings',\n * 'ui:options': {\n * schema: destinationSchema.mappingSchema,\n * uiSchema: destinationSchema.mappingUiSchema\n * }\n * }\n * };\n */\nexport function MappingSettingsField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - WidgetProps type mismatch, consistent with other mapping fields\n return <MappingSettingsWidget {...widgetProps} />;\n}\n\nexport default MappingSettingsField;\n","import type { FieldProps } from '@rjsf/utils';\nimport { MappingObjectExplorerWidget } from './mapping-object-explorer';\n\n/**\n * MappingObjectExplorerField - RJSF field wrapper for object exploration\n *\n * Bridges RJSF FieldProps to our custom MappingObjectExplorerWidget.\n * Required because RJSF uses fields (not widgets) for object types.\n *\n * This is the proper RJSF pattern for custom object rendering.\n * Objects in RJSF are handled by Fields, primitives by Widgets.\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * objectExplorer: MappingObjectExplorerField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * 'ui:field': 'objectExplorer',\n * 'ui:options': {\n * allowAdd: true,\n * allowRename: true,\n * showBadges: true,\n * }\n * };\n */\nexport function MappingObjectExplorerField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n formContext,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n options: uiSchema?.['ui:options'] || {},\n formContext,\n disabled: disabled || false,\n readonly: readonly || false,\n label: schema.title || '',\n rawErrors: [],\n };\n\n // @ts-expect-error - WidgetProps type mismatch, consistent with other mapping fields\n return <MappingObjectExplorerWidget {...widgetProps} />;\n}\n\nexport default MappingObjectExplorerField;\n","import React, { useState, useEffect, useRef } from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingMapEntry, MapEntry } from '../atoms/mapping-map-entry';\nimport { MappingCollapsible } from '../atoms/mapping-collapsible';\nimport { IconButton } from '../atoms/icon-button';\n\n/**\n * MappingMapField - Custom field for object transformation mapping\n *\n * Manages a map of key-value pairs where values can be:\n * - Simple strings (key paths like 'data.id')\n * - Advanced ValueConfig objects (with key, value, condition, etc.)\n *\n * Features:\n * - Add/remove entries\n * - Edit key names\n * - Switch between simple and advanced value modes\n * - Warnings for empty/duplicate keys\n * - Recursive support (maps can contain maps)\n *\n * @example\n * // In schema:\n * map: {\n * type: 'object',\n * title: 'Map',\n * description: 'Transform object properties',\n * additionalProperties: true,\n * }\n *\n * // In uiSchema:\n * map: {\n * 'ui:field': 'mappingMap',\n * }\n */\nexport function MappingMapField(props: FieldProps) {\n const { formData, onChange, schema, uiSchema, disabled, readonly } = props;\n\n // Convert object to array for editing\n const objectToEntries = (\n obj: Record<string, unknown> | undefined,\n ): MapEntry[] => {\n if (!obj || typeof obj !== 'object') return [];\n return Object.entries(obj).map(([key, value]) => ({\n key,\n value: value as string | Record<string, unknown>,\n }));\n };\n\n // Convert array back to object\n const entriesToObject = (\n entries: MapEntry[],\n ): Record<string, unknown> | undefined => {\n // Filter out entries with empty keys\n const validEntries = entries.filter(\n (entry) => entry.key && entry.key.trim(),\n );\n\n if (validEntries.length === 0) return undefined;\n\n const result: Record<string, unknown> = {};\n validEntries.forEach((entry) => {\n result[entry.key] = entry.value;\n });\n return result;\n };\n\n const [entries, setEntries] = useState<MapEntry[]>(() =>\n objectToEntries(formData),\n );\n\n const hasEntries = entries.length > 0;\n\n // Start expanded if we have existing data\n const [isExpanded, setIsExpanded] = useState(hasEntries);\n\n // Track previous formData to avoid redundant updates\n const prevFormDataRef = useRef<unknown>(formData);\n\n // Sync external changes to internal state\n useEffect(() => {\n // Only sync if formData actually changed from external source\n if (prevFormDataRef.current === formData) {\n return;\n }\n prevFormDataRef.current = formData;\n\n setEntries(objectToEntries(formData));\n }, [formData]);\n\n // Update expanded state when data changes (e.g., switching between mapping rules)\n useEffect(() => {\n setIsExpanded(hasEntries);\n }, [hasEntries]);\n\n // Track duplicate keys for warnings\n const duplicateKeys = new Set<string>();\n const keyCounts = new Map<string, number>();\n entries.forEach((entry) => {\n if (entry.key) {\n const count = (keyCounts.get(entry.key) || 0) + 1;\n keyCounts.set(entry.key, count);\n if (count > 1) {\n duplicateKeys.add(entry.key);\n }\n }\n });\n\n const handleEntriesChange = (newEntries: MapEntry[]) => {\n setEntries(newEntries);\n const obj = entriesToObject(newEntries);\n\n // Update ref before calling onChange to prevent sync loop\n prevFormDataRef.current = obj;\n onChange(obj);\n };\n\n const handleEntryChange = (index: number, newEntry: MapEntry) => {\n const newEntries = [...entries];\n newEntries[index] = newEntry;\n handleEntriesChange(newEntries);\n };\n\n const handleEntryRemove = (index: number) => {\n const newEntries = entries.filter((_, i) => i !== index);\n handleEntriesChange(newEntries);\n };\n\n const handleAddEntry = () => {\n const newEntry: MapEntry = {\n key: '',\n value: '',\n tempId: `temp-${Date.now()}-${Math.random()}`,\n };\n handleEntriesChange([...entries, newEntry]);\n if (!isExpanded) {\n setIsExpanded(true);\n }\n };\n\n const title = schema?.title || 'Map';\n const description = schema?.description || 'Transform object properties';\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n >\n {hasEntries ? (\n <div className=\"elb-mapping-map-content\">\n <div className=\"elb-mapping-map-entries\">\n {entries.map((entry, index) => (\n <MappingMapEntry\n key={entry.tempId || `entry-${index}`}\n entry={entry}\n onChange={(newEntry) => handleEntryChange(index, newEntry)}\n onRemove={() => handleEntryRemove(index)}\n hasEmptyKey={!entry.key || !entry.key.trim()}\n hasDuplicateKey={\n entry.key ? duplicateKeys.has(entry.key) : false\n }\n />\n ))}\n </div>\n {!disabled && !readonly && (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddEntry}\n className=\"elb-mapping-map-add-row-button\"\n >\n Add key\n </IconButton>\n )}\n </div>\n ) : (\n !disabled &&\n !readonly && (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddEntry}\n className=\"elb-mapping-map-add-button\"\n >\n Add key-value pair\n </IconButton>\n )\n )}\n </MappingCollapsible>\n </div>\n );\n}\n","import React from 'react';\nimport { IconButton } from './icon-button';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport {\n valueConfigSchema,\n valueConfigUiSchema,\n} from '../../schemas/value-config-schema';\nimport { cleanFormData } from '../../utils/clean-form-data';\n\nexport interface MapEntry {\n key: string;\n value: string | Record<string, unknown>;\n tempId?: string;\n}\n\nexport interface MappingMapEntryProps {\n entry: MapEntry;\n onChange: (entry: MapEntry) => void;\n onRemove: () => void;\n hasEmptyKey?: boolean;\n hasDuplicateKey?: boolean;\n}\n\n/**\n * MappingMapEntry - Single key-value entry in a map\n *\n * Features:\n * - Key input with validation warnings\n * - Type selector (Simple/Advanced)\n * - Simple mode: String input for key paths\n * - Advanced mode: Full ValueConfig form\n * - Delete button\n *\n * @example\n * <MappingMapEntry\n * entry={{ key: 'item_id', value: 'data.id' }}\n * onChange={handleChange}\n * onRemove={handleRemove}\n * />\n */\nexport function MappingMapEntry({\n entry,\n onChange,\n onRemove,\n hasEmptyKey = false,\n hasDuplicateKey = false,\n}: MappingMapEntryProps) {\n const valueType = typeof entry.value === 'string' ? 'simple' : 'advanced';\n\n const handleKeyChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ ...entry, key: e.target.value });\n };\n\n const handleTypeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newType = e.target.value as 'simple' | 'advanced';\n\n if (newType === valueType) return;\n\n if (newType === 'advanced') {\n // Convert simple string to ValueConfig\n const stringValue = entry.value as string;\n onChange({\n ...entry,\n value: stringValue ? { key: stringValue } : {},\n });\n } else {\n // Convert ValueConfig to simple string\n const config = entry.value as Record<string, unknown>;\n const extractedValue =\n (config.key as string) ||\n (typeof config.value === 'string' ? (config.value as string) : '') ||\n '';\n onChange({\n ...entry,\n value: extractedValue,\n });\n }\n };\n\n const handleSimpleValueChange = (value: string) => {\n onChange({ ...entry, value });\n };\n\n const handleAdvancedValueChange = (data: unknown) => {\n // Clean the nested ValueConfig data to remove empty values\n const cleaned = cleanFormData(data as Record<string, unknown>);\n const finalValue = Object.keys(cleaned).length > 0 ? cleaned : {};\n onChange({ ...entry, value: finalValue });\n };\n\n const keyClassName = `elb-mapping-map-key ${\n hasEmptyKey ? 'elb-mapping-map-key-empty' : ''\n } ${hasDuplicateKey ? 'elb-mapping-map-key-duplicate' : ''}`;\n\n return (\n <div\n className={`elb-mapping-map-entry ${\n valueType === 'advanced' ? 'elb-mapping-map-entry-advanced' : ''\n }`}\n >\n {/* Key input */}\n <input\n type=\"text\"\n className={keyClassName}\n value={entry.key}\n onChange={handleKeyChange}\n placeholder=\"Key name\"\n title={\n hasEmptyKey\n ? 'Key cannot be empty'\n : hasDuplicateKey\n ? 'Duplicate key'\n : undefined\n }\n />\n\n {/* Type selector */}\n <select\n className=\"elb-mapping-map-type-select\"\n value={valueType}\n onChange={handleTypeChange}\n >\n <option value=\"simple\">Simple</option>\n <option value=\"advanced\">Advanced</option>\n </select>\n\n {/* Value editor - conditional */}\n {valueType === 'simple' ? (\n <input\n type=\"text\"\n className=\"elb-mapping-map-value-simple\"\n value={entry.value as string}\n onChange={(e) => handleSimpleValueChange(e.target.value)}\n placeholder=\"Key path (e.g., data.id)\"\n />\n ) : (\n <div className=\"elb-mapping-map-value-advanced\">\n <MappingFormWrapper\n schema={valueConfigSchema}\n uiSchema={valueConfigUiSchema}\n formData={entry.value as Record<string, unknown>}\n onChange={handleAdvancedValueChange}\n nested={true}\n />\n </div>\n )}\n\n {/* Delete button */}\n <div className=\"elb-mapping-map-delete-wrapper\">\n <IconButton\n icon=\"delete\"\n variant=\"danger\"\n onClick={onRemove}\n title=\"Remove entry\"\n />\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingSetEntry, SetEntry } from '../atoms/mapping-set-entry';\nimport { MappingCollapsible } from '../atoms/mapping-collapsible';\nimport { IconButton } from '../atoms/icon-button';\n\n/**\n * MappingSetField - Custom field for array of values\n *\n * Manages an array of values where each value can be:\n * - Simple strings (key paths like 'data.id')\n * - Advanced ValueConfig objects (with key, value, condition, etc.)\n *\n * Features:\n * - Add/remove entries\n * - Switch between simple and advanced value modes\n * - Recursive support (values can contain sets)\n *\n * @example\n * // In schema:\n * set: {\n * type: 'array',\n * title: 'Set',\n * description: 'Array of static values',\n * items: {\n * oneOf: [\n * { type: 'string' },\n * { type: 'object' }\n * ]\n * }\n * }\n *\n * // In uiSchema:\n * set: {\n * 'ui:field': 'mappingSet',\n * }\n */\nexport function MappingSetField(props: FieldProps) {\n const { formData, onChange, schema, disabled, readonly } = props;\n\n // Convert array to entries with temp IDs for React keys\n const arrayToEntries = (\n arr: Array<string | Record<string, unknown>> | undefined,\n ): SetEntry[] => {\n if (!arr || !Array.isArray(arr)) return [];\n return arr.map((value) => ({\n value,\n tempId: `set-${Date.now()}-${Math.random()}`,\n }));\n };\n\n // Convert entries back to array\n const entriesToArray = (\n entries: SetEntry[],\n ): Array<string | Record<string, unknown>> | undefined => {\n if (entries.length === 0) return undefined;\n return entries.map((entry) => entry.value);\n };\n\n const [entries, setEntries] = useState<SetEntry[]>(() =>\n arrayToEntries(formData),\n );\n\n const hasEntries = entries.length > 0;\n\n // Start expanded if we have existing data\n const [isExpanded, setIsExpanded] = useState(hasEntries);\n\n // Track previous formData to avoid redundant updates\n const prevFormDataRef = useRef<unknown>(formData);\n\n // Sync external changes to internal state, preserving tempIds\n useEffect(() => {\n // Only sync if formData actually changed from external source\n if (prevFormDataRef.current === formData) {\n return;\n }\n prevFormDataRef.current = formData;\n\n if (!formData || !Array.isArray(formData)) {\n if (entries.length > 0) {\n setEntries([]);\n }\n return;\n }\n\n // Preserve existing tempIds when values match\n const newEntries = formData.map((value, index) => {\n const existingEntry = entries[index];\n if (\n existingEntry &&\n JSON.stringify(existingEntry.value) === JSON.stringify(value)\n ) {\n return existingEntry; // Preserve tempId\n }\n return {\n value,\n tempId: `set-${Date.now()}-${Math.random()}-${index}`,\n };\n });\n\n setEntries(newEntries);\n }, [formData]);\n\n // Update expanded state when data changes (e.g., switching between mapping rules)\n useEffect(() => {\n setIsExpanded(hasEntries);\n }, [hasEntries]);\n\n const handleEntriesChange = (newEntries: SetEntry[]) => {\n setEntries(newEntries);\n const arr = entriesToArray(newEntries);\n\n // Update ref before calling onChange to prevent sync loop\n prevFormDataRef.current = arr;\n onChange(arr);\n };\n\n const handleEntryChange = (index: number, newEntry: SetEntry) => {\n const newEntries = [...entries];\n newEntries[index] = newEntry;\n handleEntriesChange(newEntries);\n };\n\n const handleEntryRemove = (index: number) => {\n const newEntries = entries.filter((_, i) => i !== index);\n handleEntriesChange(newEntries);\n };\n\n const handleAddEntry = () => {\n const newEntry: SetEntry = {\n value: '',\n tempId: `set-${Date.now()}-${Math.random()}`,\n };\n handleEntriesChange([...entries, newEntry]);\n if (!isExpanded) {\n setIsExpanded(true);\n }\n };\n\n // Drag and drop state\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\n\n const handleDragStart = (e: React.DragEvent, index: number) => {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', index.toString());\n setDraggedIndex(index);\n };\n\n const handleDragOver = (e: React.DragEvent, index: number) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (draggedIndex !== index) {\n setDragOverIndex(index);\n }\n };\n\n const handleDragLeave = () => {\n setDragOverIndex(null);\n };\n\n const handleDrop = (e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n const dragIndex = parseInt(e.dataTransfer.getData('text/plain'));\n\n if (dragIndex === dropIndex) {\n setDraggedIndex(null);\n setDragOverIndex(null);\n return;\n }\n\n // Reorder array\n const newEntries = [...entries];\n const [removed] = newEntries.splice(dragIndex, 1);\n newEntries.splice(dropIndex, 0, removed);\n\n handleEntriesChange(newEntries);\n setDraggedIndex(null);\n setDragOverIndex(null);\n };\n\n const handleDragEnd = () => {\n setDraggedIndex(null);\n setDragOverIndex(null);\n };\n\n const title = schema?.title || 'Set';\n const description = schema?.description || 'Array of static values';\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n >\n {hasEntries ? (\n <div className=\"elb-mapping-set-content\">\n <div className=\"elb-mapping-set-entries\">\n {entries.map((entry, index) => (\n <div\n key={entry.tempId}\n draggable={!disabled && !readonly}\n onDragStart={(e) => handleDragStart(e, index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDragLeave={handleDragLeave}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n >\n <MappingSetEntry\n entry={entry}\n onChange={(newEntry) => handleEntryChange(index, newEntry)}\n onRemove={() => handleEntryRemove(index)}\n index={index}\n isDragging={draggedIndex === index}\n isDragOver={dragOverIndex === index}\n />\n </div>\n ))}\n </div>\n {!disabled && !readonly && (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddEntry}\n className=\"elb-mapping-set-add-row-button\"\n >\n Add value\n </IconButton>\n )}\n </div>\n ) : (\n !disabled &&\n !readonly && (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddEntry}\n className=\"elb-mapping-set-add-button\"\n >\n Add value\n </IconButton>\n )\n )}\n </MappingCollapsible>\n </div>\n );\n}\n","import React from 'react';\nimport { IconButton } from './icon-button';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport {\n valueConfigSchema,\n valueConfigUiSchema,\n} from '../../schemas/value-config-schema';\nimport { cleanFormData } from '../../utils/clean-form-data';\n\nexport interface SetEntry {\n value: string | Record<string, unknown>;\n tempId: string;\n}\n\nexport interface MappingSetEntryProps {\n entry: SetEntry;\n onChange: (entry: SetEntry) => void;\n onRemove: () => void;\n index: number;\n isDragging?: boolean;\n isDragOver?: boolean;\n}\n\n/**\n * MappingSetEntry - Single value entry in a set array\n *\n * Features:\n * - Type selector (Simple/Advanced)\n * - Simple mode: String input for key paths\n * - Advanced mode: Full ValueConfig form\n * - Delete button\n *\n * @example\n * <MappingSetEntry\n * entry={{ value: 'data.id', tempId: '123' }}\n * onChange={handleChange}\n * onRemove={handleRemove}\n * index={0}\n * />\n */\nexport function MappingSetEntry({\n entry,\n onChange,\n onRemove,\n index,\n isDragging = false,\n isDragOver = false,\n}: MappingSetEntryProps) {\n const valueType = typeof entry.value === 'string' ? 'simple' : 'advanced';\n\n const handleTypeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newType = e.target.value as 'simple' | 'advanced';\n\n if (newType === valueType) return;\n\n if (newType === 'advanced') {\n // Convert simple string to ValueConfig\n const stringValue = entry.value as string;\n onChange({\n ...entry,\n value: stringValue ? { key: stringValue } : {},\n });\n } else {\n // Convert ValueConfig to simple string\n const config = entry.value as Record<string, unknown>;\n let extractedValue = '';\n\n // Priority: key > value > empty string\n if (config.key && typeof config.key === 'string') {\n extractedValue = config.key;\n } else if (\n config.value !== undefined &&\n typeof config.value === 'string'\n ) {\n extractedValue = config.value;\n }\n\n onChange({\n ...entry,\n value: extractedValue,\n });\n }\n };\n\n const handleSimpleValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ ...entry, value: e.target.value });\n };\n\n const handleAdvancedValueChange = (data: unknown) => {\n // Clean the nested ValueConfig data to remove empty values\n const cleaned = cleanFormData(data as Record<string, unknown>);\n const finalValue = Object.keys(cleaned).length > 0 ? cleaned : {};\n onChange({ ...entry, value: finalValue });\n };\n\n return (\n <div\n className={`elb-mapping-set-entry ${\n valueType === 'advanced' ? 'elb-mapping-set-entry-advanced' : ''\n } ${isDragging ? 'elb-mapping-set-entry-dragging' : ''} ${\n isDragOver ? 'elb-mapping-set-entry-drag-over' : ''\n }`}\n >\n {/* Drag handle */}\n <div className=\"elb-mapping-set-drag-handle\" title=\"Drag to reorder\">\n <svg\n width=\"12\"\n height=\"16\"\n viewBox=\"0 0 12 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"3\" cy=\"4\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"4\" r=\"1.5\" />\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"3\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" />\n </svg>\n </div>\n\n {/* Type selector */}\n <select\n className=\"elb-mapping-set-type-select\"\n value={valueType}\n onChange={handleTypeChange}\n aria-label={`Value ${index + 1} type`}\n >\n <option value=\"simple\">Simple</option>\n <option value=\"advanced\">Advanced</option>\n </select>\n\n {/* Value editor - conditional */}\n {valueType === 'simple' ? (\n <input\n type=\"text\"\n className=\"elb-mapping-set-value-simple\"\n value={entry.value as string}\n onChange={handleSimpleValueChange}\n placeholder=\"Key path or value (e.g., data.id)\"\n aria-label={`Value ${index + 1}`}\n />\n ) : (\n <div className=\"elb-mapping-set-value-advanced\">\n <MappingFormWrapper\n schema={valueConfigSchema}\n uiSchema={valueConfigUiSchema}\n formData={entry.value as Record<string, unknown>}\n onChange={handleAdvancedValueChange}\n nested={true}\n />\n </div>\n )}\n\n {/* Delete button */}\n <div className=\"elb-mapping-set-delete-wrapper\">\n <IconButton\n icon=\"delete\"\n variant=\"danger\"\n onClick={onRemove}\n title={`Remove value ${index + 1}`}\n />\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingCollapsible } from '../atoms/mapping-collapsible';\nimport { IconButton } from '../atoms/icon-button';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport {\n valueConfigNestedSchema,\n valueConfigNestedUiSchema,\n} from '../../schemas/value-config-schema';\n\n/**\n * MappingLoopField - Custom field for array processing with loop transformation\n *\n * Manages a loop tuple: [source, transform]\n * - source: String path to array ('nested', 'data.items') or 'this' for current value\n * - transform: ValueConfig to apply to each item in the array\n *\n * Features:\n * - Collapsible toggle interface\n * - Source path input with placeholder hints\n * - Recursive ValueConfig form for item transformation\n * - Empty state with add button\n *\n * @example\n * // In schema:\n * loop: {\n * type: 'array',\n * title: 'Loop',\n * description: 'Process arrays by applying transformation to each item',\n * items: [\n * { type: 'string' }, // source\n * { type: 'object' } // transform\n * ],\n * minItems: 2,\n * maxItems: 2\n * }\n *\n * // In uiSchema:\n * loop: {\n * 'ui:field': 'mappingLoop',\n * }\n *\n * @example\n * // Usage:\n * {\n * loop: [\n * 'nested', // Process items in event.nested array\n * { map: { item_id: 'data.id', item_name: 'data.name' } }\n * ]\n * }\n */\nexport function MappingLoopField(props: FieldProps) {\n const { formData, onChange, schema, disabled, readonly } = props;\n\n // Parse loop tuple [source, transform] - pure function, no state\n const parseFormData = (\n data: unknown,\n ): [string, Record<string, unknown> | undefined] => {\n if (Array.isArray(data) && data.length === 2) {\n const source = (data[0] as string) || '';\n const transform = (data[1] as Record<string, unknown>) || undefined;\n return [source, transform];\n }\n return ['', undefined];\n };\n\n // Validate loop data and return undefined if invalid/empty\n const validateLoop = (\n sourceValue: string,\n transformValue: Record<string, unknown> | undefined,\n ): [string, Record<string, unknown>] | undefined => {\n // Source must be a non-empty string\n const hasValidSource =\n typeof sourceValue === 'string' && sourceValue.trim().length > 0;\n\n // Transform must be a non-empty object with at least one property\n const hasValidTransform =\n transformValue &&\n typeof transformValue === 'object' &&\n Object.keys(transformValue).length > 0;\n\n // Only return loop if both source and transform are valid\n if (hasValidSource && hasValidTransform) {\n return [sourceValue, transformValue];\n }\n\n return undefined;\n };\n\n // Internal state to manage loop data\n const [source, setSource] = useState<string>(\n () => parseFormData(formData)[0],\n );\n const [transform, setTransform] = useState<\n Record<string, unknown> | undefined\n >(() => parseFormData(formData)[1]);\n\n // UI state - start collapsed\n const [isExpanded, setIsExpanded] = useState(false);\n\n // Track previous formData to avoid redundant updates\n const prevFormDataRef = useRef<unknown>(formData);\n\n // Sync external changes to internal state\n useEffect(() => {\n // Only sync if formData actually changed from external source\n if (prevFormDataRef.current === formData) {\n return;\n }\n prevFormDataRef.current = formData;\n\n if (!formData) {\n if (source !== '' || transform !== undefined) {\n setSource('');\n setTransform(undefined);\n }\n return;\n }\n\n const [newSource, newTransform] = parseFormData(formData);\n\n // Only update if data actually changed (prevent infinite loops)\n if (\n newSource !== source ||\n JSON.stringify(newTransform) !== JSON.stringify(transform)\n ) {\n setSource(newSource);\n setTransform(newTransform);\n }\n }, [formData]);\n\n const handleSourceChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newSource = e.target.value;\n setSource(newSource);\n\n // If source becomes empty, clear transform and send undefined\n if (!newSource || newSource.trim().length === 0) {\n setTransform(undefined);\n prevFormDataRef.current = undefined;\n onChange(undefined);\n return;\n }\n\n // Validate and send current state\n const validLoop = validateLoop(newSource, transform);\n\n // Update ref before calling onChange to prevent sync loop\n prevFormDataRef.current = validLoop;\n onChange(validLoop);\n };\n\n const handleTransformChange = (newTransform: unknown) => {\n const newTransformObj = newTransform as Record<string, unknown> | undefined;\n setTransform(newTransformObj);\n\n // Validate and update formData\n const validLoop = validateLoop(source, newTransformObj);\n\n // Update ref before calling onChange to prevent sync loop\n prevFormDataRef.current = validLoop;\n onChange(validLoop);\n };\n\n const title = schema?.title || 'Loop';\n const description =\n schema?.description ||\n 'Process arrays by applying transformation to each item';\n\n // Check if source has a value\n const hasSource = source && source.trim().length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n >\n <div className=\"elb-mapping-loop-content\">\n {/* Source input - always visible */}\n <div className=\"elb-mapping-loop-source\">\n <label className=\"elb-mapping-loop-label\">Source array path</label>\n <input\n type=\"text\"\n className=\"elb-mapping-loop-source-input\"\n value={source}\n onChange={handleSourceChange}\n placeholder=\"e.g., nested, data.items, or 'this'\"\n disabled={disabled || readonly}\n />\n <div className=\"elb-mapping-loop-hint\">\n Path to array in event, or 'this' for current value\n </div>\n </div>\n\n {/* Transform section - only visible when source is valid */}\n {hasSource && (\n <div className=\"elb-mapping-loop-transform\">\n <div className=\"elb-mapping-loop-transform-header\">\n <label className=\"elb-mapping-loop-label\">\n Transform each item\n </label>\n <div className=\"elb-mapping-loop-hint\">\n Mapping applied to each array item\n </div>\n </div>\n <div className=\"elb-mapping-loop-transform-form\">\n <MappingFormWrapper\n schema={valueConfigNestedSchema}\n uiSchema={valueConfigNestedUiSchema}\n formData={transform}\n onChange={handleTransformChange}\n nested={true}\n />\n </div>\n </div>\n )}\n </div>\n </MappingCollapsible>\n </div>\n );\n}\n","import type { RegistryFieldsType } from '@rjsf/utils';\nimport { MappingConsentField } from '../atoms/mapping-consent-field';\nimport { MappingConditionField } from '../atoms/mapping-condition-field';\nimport { MappingFnField } from '../atoms/mapping-fn-field';\nimport { MappingKeyField } from '../atoms/mapping-key-field';\nimport { MappingValidateField } from '../atoms/mapping-validate-field';\nimport { MappingDataField } from '../atoms/mapping-data-field';\nimport { MappingSettingsField } from '../atoms/mapping-settings-field';\nimport { MappingObjectExplorerField } from '../atoms/mapping-object-explorer-field';\nimport { MappingMapField } from '../molecules/mapping-map-field';\nimport { MappingSetField } from '../molecules/mapping-set-field';\nimport { MappingLoopField } from '../molecules/mapping-loop-field';\n\n/**\n * Field Registry for RJSF Mapping Forms\n *\n * Central registry of all custom fields used in react-jsonschema-form.\n * Fields are used for complex types (like objects) while widgets are for primitives.\n * Fields are referenced in uiSchema via 'ui:field' property.\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * consent: {\n * 'ui:field': 'mappingConsent'\n * }\n * }\n *\n * @example\n * // In Form component:\n * <Form\n * schema={schema}\n * fields={mappingFields}\n * ...\n * />\n */\n\n/**\n * Mapping Fields Registry\n *\n * Available fields:\n * - mappingConsent: Collapsible consent requirements editor for object types\n * - mappingCondition: Checkbox-collapsible condition function editor for string types\n * - mappingFn: Checkbox-collapsible custom transformation function editor for string types\n * - mappingKey: Simple text input for event path extraction (e.g., 'data.id', 'user.email')\n * - mappingValidate: Checkbox-collapsible validate function editor for string types\n * - mappingData: Toggle-collapsible data transformation editor for object types\n * - mappingSettings: Destination-specific settings editor (schema-aware or JSON fallback)\n * - objectExplorer: Generic object key-value explorer with add/rename/delete/navigate\n * - mappingMap: Key-value pair editor for object transformation mapping\n * - mappingSet: Array of values editor for static value arrays\n * - mappingLoop: Array processing with transformation editor for loop tuples\n */\nexport const mappingFields: RegistryFieldsType = {\n mappingConsent: MappingConsentField,\n mappingCondition: MappingConditionField,\n mappingFn: MappingFnField,\n mappingKey: MappingKeyField,\n mappingValidate: MappingValidateField,\n mappingData: MappingDataField,\n mappingSettings: MappingSettingsField,\n objectExplorer: MappingObjectExplorerField,\n mappingMap: MappingMapField,\n mappingSet: MappingSetField,\n mappingLoop: MappingLoopField,\n};\n","import React from 'react';\n\nexport interface MappingGridProps {\n children: React.ReactNode;\n layout?: 'row' | 'cols-2' | string;\n gap?: number | string;\n responsive?: boolean;\n className?: string;\n}\n\n/**\n * MappingGrid - Enhanced grid layout component for form fields\n *\n * Provides flexible grid layouts for mapping form components with responsive\n * support. Designed for form field arrangements like [Label, Input] pairs,\n * [AutoSelect, Button] combinations, and multi-column layouts.\n *\n * @example\n * // Two column layout\n * <MappingGrid layout=\"cols-2\">\n * <label>Name</label>\n * <input />\n * </MappingGrid>\n *\n * @example\n * // Single row with auto-fit columns\n * <MappingGrid layout=\"row\">\n * <AutoSelect />\n * <IconButton />\n * </MappingGrid>\n *\n * @example\n * // Custom grid template\n * <MappingGrid layout=\"1fr 2fr\">\n * <label>Field</label>\n * <input />\n * </MappingGrid>\n *\n * @example\n * // Responsive: 1 col on mobile, 2 cols on tablet+\n * <MappingGrid layout=\"cols-2\" responsive>\n * <field1 />\n * <field2 />\n * </MappingGrid>\n */\nexport function MappingGrid({\n children,\n layout = 'row',\n gap = 12,\n responsive = true,\n className = '',\n}: MappingGridProps) {\n // Convert layout shortcuts to CSS classes\n const getLayoutClass = () => {\n switch (layout) {\n case 'row':\n return 'elb-mapping-grid-row';\n case 'cols-2':\n return 'elb-mapping-grid-cols-2';\n default:\n // For custom grid-template-columns, use inline style as fallback\n return '';\n }\n };\n\n // Convert gap to CSS class\n const getGapClass = () => {\n const gapNum = typeof gap === 'number' ? gap : parseInt(gap, 10);\n if ([8, 12, 16, 20].includes(gapNum)) {\n return `elb-mapping-grid-gap-${gapNum}`;\n }\n return ''; // Fallback to inline style for custom gaps\n };\n\n const layoutClass = getLayoutClass();\n const gapClass = getGapClass();\n const responsiveClass = responsive ? 'elb-mapping-grid-responsive' : '';\n\n // Build class list\n const classes = [\n 'elb-mapping-grid',\n layoutClass,\n gapClass,\n responsiveClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Only use inline styles for custom layouts/gaps not covered by CSS classes\n const needsCustomLayout = !layoutClass && layout !== 'row';\n const needsCustomGap = !gapClass;\n\n const inlineStyle: React.CSSProperties = {};\n if (needsCustomLayout) {\n inlineStyle.gridTemplateColumns = layout;\n }\n if (needsCustomGap) {\n inlineStyle.gap = typeof gap === 'number' ? `${gap}px` : gap;\n }\n\n return (\n <div\n className={classes}\n style={Object.keys(inlineStyle).length > 0 ? inlineStyle : undefined}\n >\n {children}\n </div>\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport type { DestinationSchemas } from '../../types/schemas';\n\n/**\n * Navigate through a JSON Schema following a path\n * Used for finding nested schema properties\n */\nfunction navigateSchemaByPath(\n path: string[],\n schema: RJSFSchema,\n): RJSFSchema | undefined {\n let current = schema;\n\n // Find the settings index to start navigation from there\n const settingsIndex = path.indexOf('settings');\n if (settingsIndex === -1) return undefined;\n\n // Navigate from after 'settings' to before 'map'\n // For ['entity', 'action', 'settings', 'track', 'map'], navigate through 'track'\n const startIndex = settingsIndex + 1;\n const endIndex = path[path.length - 1] === 'map' ? path.length - 1 : path.length;\n\n for (let i = startIndex; i < endIndex; i++) {\n const segment = path[i];\n if (!current.properties || !(segment in current.properties)) {\n return undefined;\n }\n current = current.properties[segment] as RJSFSchema;\n }\n\n return current;\n}\n\n/**\n * Map Pane View (RJSF) - Schema-driven version of map pane\n *\n * Drop-in replacement for MappingMapPaneView using RJSF objectExplorer widget.\n * Provides identical functionality but is schema-driven instead of hardcoded.\n *\n * Features (identical to original):\n * - Add new key-value pairs\n * - View configured properties as badges\n * - Navigate to individual key editors (ValueType pane)\n * - Delete keys\n * - Rename keys inline\n *\n * Schema-driven features:\n * - When schemas.data provided: Shows property suggestions from destination data schema\n * - When schemas.mapping provided: Shows property suggestions for settings paths\n * - Displays property descriptions and types as hints\n * - Automatically opens correct editors (enum, boolean, map, etc.) based on schema\n *\n * Path-based schema selection:\n * - data.map paths → uses schemas.data\n * - settings.map paths → uses schemas.mapping (navigates to nested properties)\n *\n * @example\n * // Data mapping with schema\n * <MappingMapPaneViewRJSF\n * path={['product', 'view', 'data', 'map']}\n * mappingState={mappingState}\n * navigation={navigation}\n * schemas={{ data: dataSchema }}\n * />\n *\n * @example\n * // Settings mapping with schema\n * <MappingMapPaneViewRJSF\n * path={['product', 'view', 'settings', 'map']}\n * mappingState={mappingState}\n * navigation={navigation}\n * schemas={{ mapping: mappingSchema }}\n * />\n */\nexport interface MappingMapPaneViewRJSFProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schemas?: DestinationSchemas;\n className?: string;\n}\n\nexport function MappingMapPaneViewRJSF({\n path,\n mappingState,\n navigation,\n schemas,\n className = '',\n}: MappingMapPaneViewRJSFProps) {\n // Determine the actual map path\n // If path points to a ValueConfig container (value has 'map' property),\n // we need to append 'map' to get to the actual map contents\n const value = mappingState.actions.getValue(path);\n const isValueConfigContainer =\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n 'map' in value;\n\n // Actual path to the map object\n const mapPath = isValueConfigContainer ? [...path, 'map'] : path;\n\n // Get current map value\n const mapValue = mappingState.actions.getValue(mapPath);\n const map =\n mapValue && typeof mapValue === 'object' && !Array.isArray(mapValue)\n ? (mapValue as Record<string, unknown>)\n : {};\n\n const mapKeys = Object.keys(map);\n\n // Determine the last element of the path for detection logic\n const lastElement = path[path.length - 1];\n\n // Check if this is a data path to use dataSchema\n // Only for: ['entity', 'action', 'data'] or ['entity', 'action', 'data', 'map']\n const dataIndex = path.indexOf('data');\n const isDataPath =\n dataIndex !== -1 &&\n ((lastElement === 'data' && dataIndex === path.length - 1) ||\n (lastElement === 'map' && dataIndex === path.length - 2));\n\n // Check if this is a settings path to use mappingSchema\n // Handles: ['entity', 'action', 'settings'], ['entity', 'action', 'settings', 'map']\n // and nested: ['entity', 'action', 'settings', 'track'] or ['entity', 'action', 'settings', 'track', 'map']\n const settingsIndex = path.indexOf('settings');\n const isSettingsPath =\n settingsIndex !== -1 &&\n (lastElement === 'settings' ||\n (lastElement === 'map' && settingsIndex < path.length - 1));\n\n // Determine which schema to use for property suggestions\n let propertySuggestionsSchema: RJSFSchema | undefined;\n\n if (isDataPath) {\n // For data paths, use the dataSchema directly\n propertySuggestionsSchema = schemas?.data;\n } else if (isSettingsPath && schemas?.mapping) {\n // For settings paths, navigate to the appropriate schema\n\n // Case 1: ['entity', 'action', 'settings'] - direct settings object\n // Use the full mappingSchema to show track, trackCustom, etc.\n if (lastElement === 'settings' && settingsIndex === path.length - 1) {\n propertySuggestionsSchema = schemas.mapping;\n }\n // Case 2: ['entity', 'action', 'settings', 'map'] - explicit map under settings\n // Use the full mappingSchema\n else if (lastElement === 'map' && settingsIndex === path.length - 2) {\n propertySuggestionsSchema = schemas.mapping;\n }\n // Case 3: ['entity', 'action', 'settings', 'track', 'map'] - nested property under settings\n // Navigate to the nested schema\n else if (lastElement === 'map' && settingsIndex < path.length - 2) {\n const navigatedSchema = navigateSchemaByPath(path, schemas.mapping);\n propertySuggestionsSchema = navigatedSchema || undefined;\n }\n }\n\n // Schema for map - allows arbitrary keys\n const schema: RJSFSchema = {\n type: 'object',\n title: 'Map',\n additionalProperties: true, // Dynamic keys allowed\n };\n\n // UI Schema configures the objectExplorer field\n const uiSchema: UiSchema = {\n 'ui:field': 'objectExplorer', // Use field for objects, not widget\n 'ui:options': {\n allowAdd: true,\n allowRename: true,\n allowDelete: true,\n showBadges: true,\n childNodeType: 'valueType',\n emptyMessage: 'No keys yet. Add keys to transform event data.',\n placeholder: 'Type key name to create or select (e.g., currency)...',\n propertySuggestionsSchema, // Pass data schema for property suggestions\n },\n };\n\n // Form context - provides navigation and state to widget\n // Use mapPath so child navigation works correctly\n const formContext = {\n navigation,\n mappingState,\n path: mapPath,\n };\n\n // Handle changes from widget\n const handleChange = (newValue: unknown) => {\n if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {\n mappingState.actions.setValue(mapPath, newValue);\n } else if (\n newValue === null ||\n newValue === undefined ||\n (typeof newValue === 'object' && Object.keys(newValue).length === 0)\n ) {\n // Handle empty object or deletion\n mappingState.actions.deleteValue(mapPath);\n }\n };\n\n return (\n <BaseMappingPane\n title=\"Map\"\n description={\n mapKeys.length === 0\n ? 'No keys yet. Add keys to transform event data.'\n : `${mapKeys.length} ${mapKeys.length === 1 ? 'key' : 'keys'}`\n }\n navigation={navigation}\n className={className}\n >\n <MappingFormWrapper\n schema={schema}\n uiSchema={uiSchema}\n formData={map}\n onChange={handleChange}\n formContext={formContext}\n />\n </BaseMappingPane>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\n\nexport interface MappingEnumSelectProps {\n value: string | number;\n onChange: (value: string | number) => void;\n options: Array<string | number>;\n placeholder?: string;\n type?: 'string' | 'number';\n autoFocus?: boolean;\n}\n\n/**\n * MappingEnumSelect - Autocomplete dropdown for enum fields\n *\n * Unified autocomplete/dropdown hybrid:\n * - Click or focus to show all options\n * - Type to filter options (autocomplete)\n * - Accept custom values (not in enum)\n * - Keyboard navigation (ArrowUp, ArrowDown, Enter, Escape)\n * - Click-outside to close\n * - Monospace font consistent with other mapping inputs\n *\n * @example\n * <MappingEnumSelect\n * value=\"PageView\"\n * onChange={setValue}\n * options={['PageView', 'Purchase', 'AddToCart']}\n * />\n */\nexport function MappingEnumSelect({\n value,\n onChange,\n options,\n placeholder = 'Type or select...',\n type = 'string',\n autoFocus = false,\n}: MappingEnumSelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n const [inputValue, setInputValue] = useState(String(value || ''));\n const [hasTyped, setHasTyped] = useState(false);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Update input value when prop changes externally\n useEffect(() => {\n setInputValue(String(value || ''));\n setHasTyped(false);\n }, [value]);\n\n // Reset highlighted index when dropdown opens or filter changes\n useEffect(() => {\n if (isOpen) {\n setHighlightedIndex(0);\n }\n }, [isOpen]);\n\n // Click outside to close\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n // Commit the typed value on blur\n if (hasTyped && inputValue.trim() !== '') {\n onChange(type === 'number' ? Number(inputValue) : inputValue);\n }\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () =>\n document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen, hasTyped, inputValue, onChange, type]);\n\n // Scroll highlighted option into view\n useEffect(() => {\n if (\n isOpen &&\n dropdownRef.current &&\n dropdownRef.current.children[highlightedIndex]\n ) {\n const highlighted = dropdownRef.current.children[\n highlightedIndex\n ] as HTMLElement;\n if (highlighted) {\n highlighted.scrollIntoView({ block: 'nearest' });\n }\n }\n }, [highlightedIndex, isOpen]);\n\n // Filter options based on input\n const filteredOptions =\n hasTyped && inputValue.trim() !== ''\n ? options.filter((option) =>\n String(option)\n .toLowerCase()\n .includes(inputValue.toLowerCase().trim()),\n )\n : options;\n\n const handleInputFocus = () => {\n setIsOpen(true);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n setHasTyped(true);\n setIsOpen(true);\n setHighlightedIndex(0);\n };\n\n const handleOptionClick = (option: string | number) => {\n setInputValue(String(option));\n onChange(option);\n setIsOpen(false);\n setHasTyped(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else if (filteredOptions.length > 0) {\n setHighlightedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev,\n );\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (isOpen && filteredOptions.length > 0) {\n setHighlightedIndex((prev) => (prev > 0 ? prev - 1 : prev));\n }\n break;\n\n case 'Enter':\n e.preventDefault();\n if (\n isOpen &&\n filteredOptions.length > 0 &&\n filteredOptions[highlightedIndex] !== undefined\n ) {\n handleOptionClick(filteredOptions[highlightedIndex]);\n } else {\n // Accept custom value\n const trimmedValue = inputValue.trim();\n if (trimmedValue !== '') {\n onChange(type === 'number' ? Number(trimmedValue) : trimmedValue);\n setIsOpen(false);\n setHasTyped(false);\n }\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n setIsOpen(false);\n // Revert to original value\n setInputValue(String(value || ''));\n setHasTyped(false);\n break;\n\n case 'Tab':\n // Accept current typed value or highlighted option\n if (hasTyped && inputValue.trim() !== '') {\n onChange(type === 'number' ? Number(inputValue) : inputValue);\n }\n setIsOpen(false);\n break;\n }\n };\n\n return (\n <div className=\"elb-mapping-enum-select\" ref={containerRef}>\n <input\n ref={inputRef}\n type=\"text\"\n className={`elb-mapping-enum-select-input ${isOpen ? 'is-open' : ''}`}\n value={inputValue}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoFocus={autoFocus}\n />\n\n {isOpen && (\n <div\n className={`elb-mapping-enum-select-dropdown ${\n filteredOptions.length > 5 ? 'scrollable' : ''\n }`}\n ref={dropdownRef}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <div\n key={String(option)}\n className={`elb-mapping-enum-select-option ${\n index === highlightedIndex ? 'is-highlighted' : ''\n } ${String(option) === String(value) ? 'is-selected' : ''}`}\n onClick={() => handleOptionClick(option)}\n onMouseEnter={() => setHighlightedIndex(index)}\n >\n {String(option)}\n </div>\n ))\n ) : (\n <div className=\"elb-mapping-enum-select-empty\">\n No matching options. Press Enter to use custom value.\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { RJSFSchema } from '@rjsf/utils';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport type { DestinationSchemas } from '../../types/schemas';\nimport type { ConfigStructureDef } from '../../schemas/config-structures/types';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingEnumSelect } from '../atoms/mapping-enum-select';\nimport { getSchemaForPath } from '../../utils/type-detector';\n\n/**\n * Enum Pane View - Pure Presentation Component\n *\n * Edits enum fields with predefined options from JSON Schema.\n * Uses schema.enum to populate dropdown options and schema.type to determine\n * if freeform text input should be allowed.\n *\n * Features:\n * - Dropdown selection from schema-defined enum values\n * - Optional freeform text input for 'string' type enums\n * - Keyboard navigation\n * - Schema-driven: extracts enum values from destination schemas\n *\n * @example\n * // Path: ['order', 'complete', 'settings', 'track']\n * // Schema: { type: 'string', enum: ['PageView', 'Purchase', 'AddToCart'] }\n * <MappingEnumPaneView\n * path={['order', 'complete', 'settings', 'track']}\n * mappingState={mappingState}\n * navigation={navigation}\n * schemas={{\n * mapping: metaPixelMappingSchema,\n * mappingUi: metaPixelMappingUiSchema\n * }}\n * />\n */\nexport interface MappingEnumPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schemas?: DestinationSchemas;\n structure?: ConfigStructureDef;\n className?: string;\n}\n\nexport function MappingEnumPaneView({\n path,\n mappingState,\n navigation,\n schemas,\n structure,\n className = '',\n}: MappingEnumPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const currentValue =\n typeof value === 'string' || typeof value === 'number' ? value : '';\n\n // Get schema for this path using structure-aware detection\n const schema = structure && schemas\n ? getSchemaForPath(value, path, structure, schemas as Record<string, RJSFSchema>)\n : null;\n\n const enumOptions = (schema?.enum as Array<string | number>) || [];\n const enumType = schema?.type === 'number' ? 'number' : 'string';\n\n const handleChange = (newValue: string | number) => {\n if (\n newValue === '' ||\n (typeof newValue === 'string' && newValue.trim() === '')\n ) {\n // Delete if empty\n mappingState.actions.deleteValue(path);\n } else {\n mappingState.actions.setValue(path, newValue);\n }\n };\n\n // Get field name from path (last segment)\n const fieldName = path[path.length - 1];\n\n return (\n <BaseMappingPane\n title={`Enum: ${fieldName}`}\n description=\"Select from dropdown or type custom value\"\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingEnumSelect\n value={currentValue}\n onChange={handleChange}\n options={enumOptions}\n placeholder={\n enumOptions.length > 0\n ? `Type or select ${fieldName}...`\n : 'Type custom value...'\n }\n type={enumType}\n autoFocus\n />\n <div className=\"elb-mapping-pane-hint\">\n {enumOptions.length > 0\n ? `${enumOptions.length} predefined ${enumOptions.length === 1 ? 'option' : 'options'} available. Type to filter or enter custom value.`\n : 'No predefined options. Enter custom value.'}\n </div>\n </div>\n\n {enumOptions.length > 0 && (\n <div className=\"elb-mapping-enum-examples\">\n <div className=\"elb-mapping-enum-examples-title\">\n Available Options:\n </div>\n <ul className=\"elb-mapping-enum-examples-list\">\n {enumOptions.slice(0, 10).map((option) => (\n <li key={String(option)}>\n <code>{String(option)}</code>\n </li>\n ))}\n {enumOptions.length > 10 && (\n <li className=\"elb-mapping-enum-examples-more\">\n ... and {enumOptions.length - 10} more\n </li>\n )}\n </ul>\n </div>\n )}\n </BaseMappingPane>\n );\n}\n","import React from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { Toggle } from '../atoms/toggle';\n\nexport interface MappingBooleanPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\n/**\n * Boolean Pane - Toggle switch for boolean settings\n *\n * Provides a simple on/off toggle for boolean fields in mapping configuration.\n * Uses animated toggle component for visual feedback.\n *\n * Used for settings like:\n * - enabled/disabled flags\n * - feature toggles\n * - binary configuration options\n *\n * @example\n * // Schema definition\n * enabled: { type: 'boolean', description: 'Enable tracking' }\n *\n * // Renders as toggle with label\n * <Toggle checked={true} onChange={...} label=\"Enabled\" />\n */\nexport function MappingBooleanPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingBooleanPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const booleanValue = typeof value === 'boolean' ? value : false;\n\n const handleChange = (newValue: boolean) => {\n mappingState.actions.setValue(path, newValue);\n };\n\n const fieldName = path[path.length - 1];\n const displayName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);\n\n return (\n <BaseMappingPane\n title={`Boolean: ${displayName}`}\n description=\"Toggle to enable or disable\"\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <div className=\"elb-mapping-boolean-toggle-wrapper\">\n <Toggle\n checked={booleanValue}\n onChange={handleChange}\n label={booleanValue ? 'Enabled' : 'Disabled'}\n />\n </div>\n <div className=\"elb-mapping-pane-hint\">\n {booleanValue\n ? 'This setting is currently enabled'\n : 'This setting is currently disabled'}\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\nimport { validateValue } from '../../utils/schema-validation';\n\n/**\n * Primitive Pane View - Schema-validated text input for primitive values\n *\n * Uses type=\"text\" with schema validation to allow typing ANY value:\n * - String fields (with pattern, minLength, maxLength validation)\n * - Number fields (with min, max validation)\n * - Schema-based hints and placeholders\n * - Real-time validation with error highlighting\n * - Allows typing invalid values to show validation errors\n *\n * Examples:\n * - settings.pixelId: string with pattern validation (can type \"abc123\", shows error)\n * - settings.timeout: number with min/max (can type \"abc\", shows error)\n * - settings.apiKey: string with minLength\n *\n * Key: Always uses type=\"text\" input, never type=\"number\" to allow typing anything\n */\nexport interface MappingPrimitivePaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schema?: RJSFSchema;\n uiSchema?: UiSchema;\n className?: string;\n}\n\nexport function MappingPrimitivePaneView({\n path,\n mappingState,\n navigation,\n schema,\n uiSchema,\n className = '',\n}: MappingPrimitivePaneViewProps) {\n const value = mappingState.actions.getValue(path);\n\n // Convert to string for editing\n const stringValue =\n value === null ? 'null' : value === undefined ? '' : String(value);\n\n // Determine field type from schema\n const fieldType = schema?.type || 'string';\n const isNumber = fieldType === 'number' || fieldType === 'integer';\n\n const handleChange = (newValue: string) => {\n // Empty string handling\n if (newValue === '') {\n mappingState.actions.setValue(path, '');\n return;\n }\n\n // Number type coercion\n if (isNumber) {\n const asNumber = Number(newValue);\n if (!isNaN(asNumber)) {\n mappingState.actions.setValue(path, asNumber);\n return;\n }\n }\n\n // Default to string (validation will show error if wrong type)\n mappingState.actions.setValue(path, newValue);\n };\n\n // Get field info from schema\n const title = schema?.title || path[path.length - 1];\n const description =\n schema?.description ||\n `${isNumber ? 'Number' : 'Text'} field${schema?.pattern ? ' with validation' : ''}`;\n\n const placeholder =\n uiSchema?.['ui:placeholder'] ||\n (schema?.examples && Array.isArray(schema.examples) && typeof schema.examples[0] === 'string'\n ? schema.examples[0]\n : undefined) ||\n undefined;\n\n // Validate current value\n const validationResult = validateValue(value, schema);\n const hasError = !validationResult.valid;\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n value={stringValue}\n onChange={handleChange}\n placeholder={placeholder}\n type=\"text\"\n autoFocus\n error={hasError}\n />\n <div className=\"elb-mapping-pane-hint\">\n Current type: <strong>{typeof value}</strong>\n {uiSchema?.['ui:help'] && (\n <>\n <br />\n {uiSchema['ui:help']}\n </>\n )}\n {hasError && validationResult.error && (\n <>\n <br />\n <span style={{ color: 'var(--color-button-danger)' }}>\n ⚠ {validationResult.error}\n </span>\n </>\n )}\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import React from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport { RuleTile, type RuleTileStatus } from '../atoms/config-tile';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport type { NodeType } from '../../hooks/useMappingNavigation';\n\n/**\n * Settings Overview Pane - Shows config-level settings as tiles\n *\n * Similar to RuleOverview but for config.settings instead of mapping rules.\n * Shows destination-specific settings like pixelId, measurementId, etc.\n *\n * Features:\n * - Displays configured settings as tiles with values\n * - Shows available settings from schema (if provided)\n * - Click tile to navigate to detailed editor\n * - Schema-driven type detection for correct editor pane\n *\n * @example\n * <SettingsOverviewPane\n * path={['settings']}\n * mappingState={configState}\n * navigation={navigation}\n * schema={settingsSchema}\n * />\n */\nexport interface SettingsOverviewPaneProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schema?: RJSFSchema;\n className?: string;\n}\n\nfunction getSettingStatus(value: unknown): RuleTileStatus {\n if (value === undefined || value === null) {\n return { enabled: false, text: 'Not set' };\n }\n\n // Display value preview\n if (typeof value === 'string') {\n return { enabled: true, text: value };\n }\n if (typeof value === 'number') {\n return { enabled: true, text: String(value) };\n }\n if (typeof value === 'boolean') {\n return { enabled: true, text: value ? 'Enabled' : 'Disabled' };\n }\n if (Array.isArray(value)) {\n return { enabled: true, text: `${value.length} items` };\n }\n if (typeof value === 'object') {\n const keys = Object.keys(value);\n return { enabled: true, text: `${keys.length} properties` };\n }\n\n return { enabled: true, text: 'Configured' };\n}\n\nexport function SettingsOverviewPane({\n path,\n mappingState,\n navigation,\n schema,\n className = '',\n}: SettingsOverviewPaneProps) {\n const settings = mappingState.actions.getValue(path) as\n | Record<string, unknown>\n | undefined;\n\n\n // Gather all setting keys (from value + schema)\n const configuredKeys = settings ? Object.keys(settings) : [];\n const schemaKeys = schema?.properties ? Object.keys(schema.properties) : [];\n const allKeys = Array.from(\n new Set([...configuredKeys, ...schemaKeys]),\n ).sort();\n\n // Separate configured vs available\n const configuredSettings: Array<{\n key: string;\n title: string;\n description?: string;\n nodeType: NodeType;\n value: unknown;\n }> = [];\n\n const availableSettings: Array<{\n key: string;\n title: string;\n description?: string;\n nodeType: NodeType;\n }> = [];\n\n allKeys.forEach((key) => {\n const propSchema = schema?.properties?.[key] as RJSFSchema | undefined;\n const title =\n propSchema?.title || key.charAt(0).toUpperCase() + key.slice(1);\n const description = propSchema?.description;\n\n let nodeType: NodeType = 'valueConfig';\n if (propSchema) {\n if (propSchema.enum && Array.isArray(propSchema.enum) && propSchema.enum.length > 0) {\n nodeType = 'enum';\n } else if (propSchema.type === 'boolean') {\n nodeType = 'boolean';\n } else if (propSchema.type === 'object') {\n nodeType = 'map';\n } else if (propSchema.type === 'array') {\n nodeType = propSchema.minItems === 2 && propSchema.maxItems === 2 ? 'loop' : 'set';\n } else if (propSchema.type === 'string' || propSchema.type === 'number') {\n nodeType = 'primitive';\n }\n }\n\n const currentValue = mappingState.actions.getValue([...path, key]);\n const hasValue = currentValue !== undefined;\n\n if (hasValue) {\n configuredSettings.push({\n key,\n title,\n description,\n nodeType,\n value: currentValue,\n });\n } else {\n availableSettings.push({\n key,\n title,\n description,\n nodeType,\n });\n }\n });\n\n const handleSettingClick = (key: string, nodeType: NodeType) => {\n navigation.openTab([...path, key], nodeType);\n };\n\n return (\n <BaseMappingPane\n title=\"Settings\"\n description={\n configuredSettings.length === 0\n ? 'No settings configured. Click a tile to add settings.'\n : `${configuredSettings.length} ${configuredSettings.length === 1 ? 'setting' : 'settings'} configured`\n }\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-rule-section-grid\">\n {/* Configured settings */}\n {configuredSettings.map((setting) => (\n <RuleTile\n key={setting.key}\n label={setting.title}\n description={setting.description || ''}\n status={getSettingStatus(setting.value)}\n onClick={() => handleSettingClick(setting.key, setting.nodeType)}\n />\n ))}\n </div>\n\n {/* Available settings (from schema) */}\n {availableSettings.length > 0 && (\n <div className=\"elb-mapping-rule-section\">\n <h3 className=\"elb-mapping-rule-section-title\">Available Settings</h3>\n <p className=\"elb-mapping-rule-section-description\">\n Click to configure additional destination settings\n </p>\n <div className=\"elb-mapping-rule-section-grid\">\n {availableSettings.map((setting) => (\n <RuleTile\n key={setting.key}\n label={setting.title}\n description={setting.description || ''}\n status={{ enabled: false, text: 'Not set' }}\n onClick={() =>\n handleSettingClick(setting.key, setting.nodeType)\n }\n />\n ))}\n </div>\n </div>\n )}\n </BaseMappingPane>\n );\n}\n","import type { RJSFSchema, UiSchema } from '@rjsf/utils';\n\n/**\n * Universal schema for standard Mapping.Rule properties\n *\n * These are the built-in properties available on every mapping rule,\n * regardless of destination. Defined in @walkeros/core/types/mapping.ts\n *\n * Properties:\n * - name: string - Override destination event name\n * - batch: number - Batch size in milliseconds or event count\n * - ignore: boolean - Skip processing this event\n * - condition: function - When to apply this rule\n * - consent: object - Required consent states\n * - policy: object - Event-level policy rules\n * - data: ValueType - Event data transformation\n * - settings: object - Destination-specific rule settings (schema comes from destination)\n */\n\n/**\n * Schema for 'name' property\n */\nexport const namePropertySchema: RJSFSchema = {\n type: 'string',\n title: 'Event Name Override',\n description: 'Override the destination event name with a custom string',\n minLength: 1,\n maxLength: 100,\n examples: ['page_view', 'PageView', 'view_item', 'product.viewed'],\n};\n\nexport const namePropertyUiSchema: UiSchema = {\n 'ui:placeholder': 'e.g., page_view, PageView, view_item',\n 'ui:help':\n 'This string will be sent to the destination instead of the default entity-action name',\n};\n\n/**\n * Schema for 'batch' property\n */\nexport const batchPropertySchema: RJSFSchema = {\n type: 'number',\n title: 'Batch Size',\n description: 'Batch size in milliseconds (time-based) or event count',\n minimum: 1,\n maximum: 60000,\n examples: [200, 1000, 5000],\n};\n\nexport const batchPropertyUiSchema: UiSchema = {\n 'ui:placeholder': 'e.g., 200, 1000, 5000',\n 'ui:help':\n 'Events will be collected and sent in batches. Use time (ms) for timed batches or count for event-based batches',\n};\n\n/**\n * Get schema for a standard rule property\n *\n * @param propertyName - Name of the rule property (e.g., 'name', 'batch')\n * @returns JSON Schema for the property, or undefined if not found\n */\nexport function getRulePropertySchema(\n propertyName: string,\n): RJSFSchema | undefined {\n switch (propertyName) {\n case 'name':\n return namePropertySchema;\n case 'batch':\n return batchPropertySchema;\n default:\n return undefined;\n }\n}\n\n/**\n * Get UI schema for a standard rule property\n *\n * @param propertyName - Name of the rule property (e.g., 'name', 'batch')\n * @returns UI Schema for the property, or undefined if not found\n */\nexport function getRulePropertyUiSchema(\n propertyName: string,\n): UiSchema | undefined {\n switch (propertyName) {\n case 'name':\n return namePropertyUiSchema;\n case 'batch':\n return batchPropertyUiSchema;\n default:\n return undefined;\n }\n}\n","import { MappingEntityPane } from './mapping-entity-pane';\nimport { ConfigOverviewPane } from './config-overview-pane';\nimport { MappingPolicyOverviewPane } from './mapping-policy-overview-pane';\nimport { MappingValueConfigPaneView } from './mapping-value-config-pane-view';\nimport { MappingValueTypePaneView } from './mapping-value-type-pane-view';\nimport { MappingValuePaneView } from './mapping-value-pane-view';\nimport { MappingKeyPaneView } from './mapping-key-pane-view';\nimport { MappingConditionPaneView } from './mapping-condition-pane-view';\nimport { MappingFnPaneView } from './mapping-fn-pane-view';\nimport { MappingValidatePaneView } from './mapping-validate-pane-view';\nimport { MappingNamePaneView } from './mapping-name-pane-view';\nimport { MappingBatchPaneView } from './mapping-batch-pane-view';\nimport { MappingConsentPaneView } from './mapping-consent-pane-view';\nimport { MappingSetPaneView } from './mapping-set-pane-view';\nimport { MappingLoopPaneView } from './mapping-loop-pane-view';\nimport { MappingMapPaneViewRJSF } from './mapping-map-pane-view-rjsf';\nimport { MappingEnumPaneView } from './mapping-enum-pane-view';\nimport { MappingBooleanPaneView } from './mapping-boolean-pane-view';\nimport { MappingPrimitivePaneView } from './mapping-primitive-pane-view';\nimport { SettingsOverviewPane } from './settings-overview-pane';\nimport type { NodeType } from '../../hooks/useMappingNavigation';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport type { DestinationSchemas } from '../../types/schemas';\nimport type { ConfigStructureDef } from '../../schemas/config-structures/types';\nimport type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport { getSchemaForPath as getSchemaForPathFromDetector } from '../../utils/type-detector';\nimport {\n getRulePropertyUiSchema,\n} from '../../schemas/rule-properties-schema';\nimport { MAPPING_RULE_STRUCTURE } from '../../schemas/config-structures/mapping-rule';\n\n/**\n * Get JSON Schema for a given path using structure-aware detection\n *\n * FULLY DYNAMIC: No hardcoded path checks. Uses structure definitions to route\n * to the correct schema based on PropertyDef.schemaPath.\n *\n * Structure MUST be provided by the caller (ConfigEditorTabs) to avoid ambiguity.\n *\n * @param path - Path array\n * @param mappingState - Mapping state for value access\n * @param schemas - Destination schemas bundle\n * @param structure - Structure definition (REQUIRED - no auto-detection)\n * @returns JSON Schema or undefined\n */\nfunction getSchemaForPath(\n path: string[],\n mappingState: UseMappingStateReturn,\n schemas?: DestinationSchemas,\n structure?: ConfigStructureDef,\n): RJSFSchema | undefined {\n if (!schemas || !structure) return undefined;\n\n const value = mappingState.actions.getValue(path);\n return getSchemaForPathFromDetector(value, path, structure, schemas as Record<string, RJSFSchema>);\n}\n\n/**\n * Get UI Schema for a given path\n *\n * NOTE: UI Schemas are simple key-based lookups, not nested like JSON Schema.\n * We just need to identify the property key and check the appropriate UI schema dict.\n */\nfunction getUiSchemaForPath(\n path: string[],\n schemas?: DestinationSchemas,\n): UiSchema | undefined {\n if (!schemas || path.length === 0) return undefined;\n\n const propertyKey = path[path.length - 1];\n\n // Try settings UI schema\n if (schemas.settingsUi?.[propertyKey]) {\n return schemas.settingsUi[propertyKey];\n }\n\n // Try mapping UI schema\n if (schemas.mappingUi?.[propertyKey]) {\n return schemas.mappingUi[propertyKey];\n }\n\n // Try rule property UI schema\n return getRulePropertyUiSchema(propertyKey);\n}\n\n/**\n * Mapping Pane Router - Pure Presentation Component\n *\n * Routes to the appropriate pane component based on node type.\n * This is a simple router that delegates to specialized pane views.\n *\n * Supported node types:\n * - 'entity' → MappingEntityPane - Shows list of actions\n * - 'rule' → ConfigOverviewPane - Shows rule properties grid (schema-driven)\n * - 'policy' → MappingPolicyOverviewPane - Shows list of policy rules with badges\n * - 'name' → MappingNamePaneView - Simple string input for event name override\n * - 'batch' → MappingBatchPaneView - Number input for batch size configuration\n * - 'consent' → MappingConsentPaneView - Consent state tiles with discovery\n * - 'valueConfig' → MappingValueConfigPaneView - Full ValueConfig editor\n * - 'valueType' → MappingValueTypePaneView - String or ValueConfig editor (replaces old property/type-grid)\n * - 'enum' → MappingEnumPaneView - Dropdown selector for schema-defined enum fields\n * - 'boolean' → MappingBooleanPaneView - Toggle switch for boolean settings\n * - 'key' → MappingKeyPaneView - Focused key property editor\n * - 'condition' → MappingConditionPaneView - Condition function editor\n * - 'value' → MappingValuePaneView - Primitive value editor (string, number, boolean)\n * - 'fn' → MappingFnPaneView - Transformation function editor\n * - 'validate' → MappingValidatePaneView - Validation function editor\n * - 'set' → MappingSetPaneView - Array of values with drag-and-drop\n * - 'loop' → MappingLoopPaneView - Loop transformation editor\n * - 'map' → MappingMapPaneView - Map object editor (key-value pairs)\n *\n * @example\n * <MappingPane\n * nodeType=\"rule\"\n * path={['product', 'view']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport interface MappingPaneProps {\n nodeType: NodeType;\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n /** Destination schemas for type-aware settings editing */\n schemas?: DestinationSchemas;\n /** Structure definition for schema-aware detection */\n structure?: ConfigStructureDef;\n}\n\nexport function MappingPane({\n nodeType,\n path,\n mappingState,\n navigation,\n className = '',\n schemas,\n structure,\n}: MappingPaneProps) {\n // Handle type selection from grid\n const handleSelectType = (type: string) => {\n // Navigate to the selected type\n navigation.openTab([...path, type], type as NodeType);\n };\n\n // Route to appropriate pane based on node type\n\n switch (nodeType) {\n case 'entity':\n // MappingEntityPane has its own .elb-mapping-entity-pane structure\n return (\n <MappingEntityPane\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'rule':\n const ruleValue = mappingState.actions.getValue(path);\n const ruleStructure = MAPPING_RULE_STRUCTURE;\n return (\n <ConfigOverviewPane\n config={ruleValue as Record<string, unknown>}\n structure={ruleStructure}\n navigation={navigation}\n schemas={schemas as Record<string, RJSFSchema>}\n className={className}\n basePath={path}\n rootStructure={structure}\n />\n );\n\n case 'name':\n // MappingNamePaneView uses standard .elb-mapping-pane structure\n return (\n <MappingNamePaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schema={getSchemaForPath(path, mappingState, schemas, structure)}\n uiSchema={getUiSchemaForPath(path, schemas)}\n className={className}\n />\n );\n\n case 'batch':\n // MappingBatchPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingBatchPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schema={getSchemaForPath(path, mappingState, schemas, structure)}\n uiSchema={getUiSchemaForPath(path, schemas)}\n className={className}\n />\n );\n\n case 'consent':\n // MappingConsentPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingConsentPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'policy':\n // MappingPolicyOverviewPane shows list of policy rules\n return (\n <MappingPolicyOverviewPane\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'condition':\n // MappingConditionPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingConditionPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'value':\n // MappingValuePaneView uses standard .elb-mapping-pane structure\n return (\n <MappingValuePaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'key':\n // MappingKeyPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingKeyPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'fn':\n // MappingFnPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingFnPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'validate':\n // MappingValidatePaneView uses standard .elb-mapping-pane structure\n return (\n <MappingValidatePaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'valueType':\n // MappingValueTypePaneView for string | ValueConfig\n return (\n <MappingValueTypePaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'enum':\n // MappingEnumPaneView for schema-defined enum fields\n return (\n <MappingEnumPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schemas={schemas}\n structure={structure}\n className={className}\n />\n );\n\n case 'boolean':\n // MappingBooleanPaneView for boolean toggle fields\n return (\n <MappingBooleanPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n case 'primitive':\n // MappingPrimitivePaneView for schema-defined string/number primitives\n return (\n <MappingPrimitivePaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schema={getSchemaForPath(path, mappingState, schemas, structure)}\n uiSchema={getUiSchemaForPath(path, schemas)}\n className={className}\n />\n );\n\n case 'set':\n // MappingSetPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingSetPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'loop':\n // MappingLoopPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingLoopPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'map':\n return (\n <MappingMapPaneViewRJSF\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schemas={schemas}\n className={className}\n />\n );\n\n case 'settings':\n // SettingsOverviewPane shows settings as tiles\n // Schema selection based on PATH context:\n // - If path is ['settings'], use schemas.settings (config-level Settings<T>)\n // - If path contains 'mapping' (e.g., ['mapping','page','view','settings']), use schemas.mapping (rule-level Mapping<T>)\n let settingsSchemaPath: 'settings' | 'mapping' = 'settings';\n\n if (path.length > 1 && path.includes('mapping')) {\n // Rule-level settings (inside mapping entity-action pattern)\n settingsSchemaPath = 'mapping';\n }\n\n const settingsSchema = schemas?.[settingsSchemaPath] as RJSFSchema | undefined;\n\n return (\n <SettingsOverviewPane\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schema={settingsSchema}\n className={className}\n />\n );\n\n // All other cases use the standard pane wrapper with scrolling content\n case 'valueConfig':\n default: {\n let content: React.ReactNode;\n\n if (nodeType === 'valueConfig') {\n content = (\n <MappingValueConfigPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className=\"\"\n />\n );\n } else {\n content = (\n <div className=\"elb-mapping-pane-error\">\n Unknown node type: {nodeType}\n </div>\n );\n }\n\n // Standard pane structure with scrollable content for all remaining types\n return (\n <div className={`elb-mapping-pane ${className}`}>\n <div className=\"elb-mapping-pane-content\">{content}</div>\n </div>\n );\n }\n }\n}\n","import type { RJSFSchema } from '@rjsf/utils';\nimport type { DestinationSchemas } from '../types/schemas';\n\nexport interface ValidationError {\n path: string[];\n error: string;\n value: unknown;\n schema?: RJSFSchema;\n}\n\nexport function validateConfig(\n _config: Record<string, unknown>,\n _schemas?: DestinationSchemas,\n): ValidationError[] {\n return [];\n}\n\nexport function formatPath(path: string[]): string {\n return path.join('.');\n}\n\nexport function groupErrorsBySection(_errors: ValidationError[]): Record<string, ValidationError[]> {\n return {};\n}\n","import type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport type { ValidationError } from '../../utils/config-validator';\nimport { formatPath, groupErrorsBySection } from '../../utils/config-validator';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { detectNodeType } from '../../utils/type-detector';\nimport type { ConfigStructureDef } from '../../schemas/config-structures/types';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport { getValueAtPath } from '../../utils/mapping-path';\n\n/**\n * Validation Overview Pane - Shows all validation errors in the config\n *\n * Displays a list of all fields that have validation errors, grouped by section.\n * Each error shows the path, current value, and error message.\n * Clicking an error navigates to that field for editing.\n *\n * @example\n * <ValidationOverviewPane\n * errors={validationErrors}\n * navigation={navigation}\n * />\n */\nexport interface ValidationOverviewPaneProps {\n errors: ValidationError[];\n navigation: UseMappingNavigationReturn;\n config: unknown;\n structure: ConfigStructureDef;\n schemas?: Record<string, RJSFSchema>;\n className?: string;\n}\n\n/**\n * Format value for display (truncate if too long)\n */\nfunction formatValue(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n\n const str = typeof value === 'string' ? value : JSON.stringify(value);\n const maxLength = 50;\n\n if (str.length > maxLength) {\n return str.substring(0, maxLength) + '...';\n }\n\n return str;\n}\n\n/**\n * Get a nice section title from section key\n */\nfunction getSectionTitle(section: string): string {\n const titles: Record<string, string> = {\n settings: 'Settings',\n mapping: 'Mapping Rules',\n policy: 'Policy',\n consent: 'Consent',\n data: 'Data',\n };\n\n return titles[section] || section.charAt(0).toUpperCase() + section.slice(1);\n}\n\nexport function ValidationOverviewPane({\n errors,\n navigation,\n config,\n structure,\n schemas,\n className = '',\n}: ValidationOverviewPaneProps) {\n const groupedErrors = groupErrorsBySection(errors);\n const sections = Object.keys(groupedErrors).sort();\n\n const handleErrorClick = (error: ValidationError) => {\n const value = getValueAtPath(config as Record<string, unknown>, error.path);\n const nodeType = detectNodeType(value, error.path, structure, schemas);\n navigation.openTab(error.path, nodeType);\n };\n\n return (\n <BaseMappingPane\n title=\"Validation Errors\"\n description={\n errors.length === 0\n ? 'No validation errors found. All fields are valid.'\n : `${errors.length} validation ${errors.length === 1 ? 'error' : 'errors'} found in your configuration.`\n }\n navigation={navigation}\n className={className}\n >\n {errors.length === 0 ? (\n <div className=\"elb-mapping-rule-section\">\n <div\n style={{\n padding: '40px 20px',\n textAlign: 'center',\n color: 'var(--color-text-muted)',\n }}\n >\n <div style={{ fontSize: '48px', marginBottom: '16px' }}>✓</div>\n <div style={{ fontSize: '16px', fontWeight: 500 }}>\n All fields are valid\n </div>\n <div style={{ fontSize: '14px', marginTop: '8px' }}>\n Your configuration has no validation errors.\n </div>\n </div>\n </div>\n ) : (\n sections.map((section) => (\n <div key={section} className=\"elb-mapping-rule-section\">\n <h3 className=\"elb-mapping-rule-section-title\">\n {getSectionTitle(section)}\n </h3>\n <div className=\"elb-validation-errors-list\">\n {groupedErrors[section].map((error, index) => (\n <div\n key={`${formatPath(error.path)}-${index}`}\n className=\"elb-validation-error-item\"\n onClick={() => handleErrorClick(error)}\n >\n <div className=\"elb-validation-error-icon\">⚠</div>\n <div className=\"elb-validation-error-content\">\n <div className=\"elb-validation-error-path\">\n {formatPath(error.path)}\n </div>\n <div className=\"elb-validation-error-message\">\n {error.error}\n </div>\n <div className=\"elb-validation-error-value\">\n Current value: <code>{formatValue(error.value)}</code>\n </div>\n </div>\n <div className=\"elb-validation-error-action\">→</div>\n </div>\n ))}\n </div>\n </div>\n ))\n )}\n </BaseMappingPane>\n );\n}\n","import type { NodeType } from '../hooks/useMappingNavigation';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport type {\n ConfigStructureDef,\n PropertyDef,\n} from '../schemas/config-structures/types';\nimport { MAPPING_RULE_STRUCTURE } from '../schemas/config-structures/mapping-rule';\nimport { detectNodeType } from './type-detector';\n\n/**\n * Tree node structure for config navigation\n */\nexport interface ConfigTreeNode {\n key: string;\n label: string;\n path: string[];\n type: NodeType;\n children?: ConfigTreeNode[];\n hasValue: boolean;\n isExpandable?: boolean;\n}\n\n/**\n * Capitalize first letter of a string\n */\nfunction capitalize(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\n/**\n * Build tree structure from config using structure definition\n *\n * CONFIG-DRIVEN: Tree reflects actual config values, not schema possibilities.\n * STRUCTURE-AWARE: Uses PropertyDef for metadata (titles, nodeTypes, children strategy).\n *\n * @param config - Actual configuration object\n * @param structure - Structure definition describing config shape\n * @param schemas - Optional JSON Schemas for type hints and labels\n * @param sections - Optional visibility filter (e.g., { verbose: false })\n * @returns Array of root-level tree nodes\n *\n * @example\n * const tree = buildTree(\n * destinationConfig,\n * DESTINATION_CONFIG_STRUCTURE,\n * metaPixelSchemas,\n * { verbose: false }\n * );\n */\nexport function buildTree<T extends Record<string, unknown>>(\n config: T,\n structure: ConfigStructureDef,\n schemas?: Record<string, RJSFSchema>,\n sections?: Record<string, boolean>,\n): ConfigTreeNode[] {\n const nodes: ConfigTreeNode[] = [];\n\n if (!structure.properties) {\n return nodes;\n }\n\n // Iterate actual config keys (config-driven, not schema-driven)\n const configKeys = Object.keys(config).filter(\n (key) => config[key] !== undefined,\n );\n\n for (const key of configKeys) {\n // Check section visibility\n if (sections?.[key] === false) {\n continue;\n }\n\n const propertyDef = structure.properties[key];\n const value = config[key];\n\n const nodeType = detectNodeType(value, [key], structure, schemas);\n\n // Build node\n const node: ConfigTreeNode = {\n key,\n label: propertyDef?.title || capitalize(key),\n path: [key],\n type: nodeType,\n hasValue: true,\n };\n\n // Build children based on children strategy\n if (propertyDef?.children === 'entity-action') {\n // Special: mapping.{entity}.{action} pattern\n node.children = buildEntityActionChildren(\n value as Record<string, Record<string, unknown>>,\n [key],\n schemas,\n );\n node.isExpandable = node.children.length > 0;\n } else if (propertyDef?.children === 'schema-driven') {\n // Build from JSON Schema properties\n const propSchema = schemas?.[propertyDef.schemaPath || key];\n node.children = buildSchemaChildren(\n value as Record<string, unknown>,\n [key],\n propSchema,\n schemas,\n structure,\n );\n node.isExpandable = node.children.length > 0;\n } else if (propertyDef?.children === 'value-driven') {\n // Detect children from value structure\n node.children = buildValueChildren(value, [key], schemas, structure);\n node.isExpandable = node.children.length > 0;\n } else {\n // No children (leaf node)\n node.isExpandable = false;\n }\n\n nodes.push(node);\n }\n\n return nodes;\n}\n\n/**\n * Build children nodes for entity-action pattern\n *\n * Handles the special mapping.{entity}.{action} hierarchy:\n * - First level: entities (page, product, order)\n * - Second level: actions (view, add, complete)\n * - Third level: rule properties (name, batch, settings, data, etc.)\n *\n * Uses MAPPING_RULE_STRUCTURE to properly handle rule properties with schema awareness.\n *\n * @param mapping - Mapping object (entity → action → rule)\n * @param basePath - Base path (e.g., ['mapping'])\n * @param schemas - Schemas dict for rule-level settings\n * @returns Array of entity nodes with action children\n */\nfunction buildEntityActionChildren(\n mapping: Record<string, Record<string, unknown>>,\n basePath: string[],\n schemas?: Record<string, RJSFSchema>,\n): ConfigTreeNode[] {\n const children: ConfigTreeNode[] = [];\n\n Object.keys(mapping).forEach((entity) => {\n const actions = mapping[entity];\n const actionNodes: ConfigTreeNode[] = [];\n\n if (actions && typeof actions === 'object') {\n Object.keys(actions).forEach((action) => {\n const ruleValue = actions[action];\n const rulePath = [...basePath, entity, action];\n\n // Build rule children using MAPPING_RULE_STRUCTURE for proper schema handling\n const ruleChildren = buildValueChildren(\n ruleValue,\n rulePath,\n schemas,\n MAPPING_RULE_STRUCTURE,\n );\n\n actionNodes.push({\n key: action,\n label: capitalize(action),\n path: rulePath,\n type: 'rule',\n hasValue: true,\n children: ruleChildren,\n isExpandable: ruleChildren.length > 0,\n });\n });\n }\n\n children.push({\n key: entity,\n label: capitalize(entity),\n path: [...basePath, entity],\n type: 'entity',\n hasValue: true,\n children: actionNodes,\n isExpandable: actionNodes.length > 0,\n });\n });\n\n return children;\n}\n\n/**\n * Build children from JSON Schema properties\n *\n * Used for settings and other schema-defined objects.\n * Only shows properties that actually exist in config.\n *\n * @param obj - Object with properties\n * @param basePath - Base path\n * @param schema - JSON Schema for this object\n * @param schemas - Full schemas dict for nested navigation\n * @param structure - Optional structure for additional metadata\n * @returns Array of child nodes\n */\nfunction buildSchemaChildren(\n obj: Record<string, unknown>,\n basePath: string[],\n schema?: RJSFSchema,\n schemas?: Record<string, RJSFSchema>,\n structure?: ConfigStructureDef,\n): ConfigTreeNode[] {\n const children: ConfigTreeNode[] = [];\n\n // Only build from actual config values (config-driven)\n Object.keys(obj)\n .filter((key) => obj[key] !== undefined)\n .forEach((key) => {\n const value = obj[key];\n const childPath = [...basePath, key];\n const propSchema = schema?.properties?.[key] as RJSFSchema | undefined;\n\n // Get property definition from structure if available\n const propertyDef = structure?.properties?.[key];\n\n // Determine children - check if nested object has schema\n let valueChildren: ConfigTreeNode[];\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n propSchema?.properties\n ) {\n // This is a schema-defined nested object, recurse with schema\n valueChildren = buildSchemaChildren(\n value as Record<string, unknown>,\n childPath,\n propSchema,\n schemas,\n structure,\n );\n } else {\n // Use value-driven for non-schema objects (pass structure!)\n valueChildren = buildValueChildren(\n value,\n childPath,\n schemas,\n structure,\n );\n }\n\n children.push({\n key,\n label: propertyDef?.title || propSchema?.title || capitalize(key),\n path: childPath,\n type: structure ? detectNodeType(value, childPath, structure, schemas) : 'valueConfig',\n hasValue: true,\n children: valueChildren,\n isExpandable: valueChildren.length > 0,\n });\n });\n\n return children;\n}\n\n/**\n * Build children from value structure\n *\n * Used for data, policy, and other value-driven properties.\n * Detects structure from actual value, but uses schema when available.\n *\n * @param value - Value to inspect\n * @param basePath - Base path\n * @param schemas - Optional schemas dict for schema-aware navigation\n * @param structure - Optional structure definition for property metadata\n * @returns Array of child nodes\n */\nfunction buildValueChildren(\n value: unknown,\n basePath: string[],\n schemas?: Record<string, RJSFSchema>,\n structure?: ConfigStructureDef,\n): ConfigTreeNode[] {\n // For objects: show properties and recurse\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n return Object.keys(obj).map((key) => {\n const childValue = obj[key];\n const childPath = [...basePath, key];\n\n // Check if this property is defined in structure (for rule properties)\n const propertyDef = structure?.properties?.[key];\n\n // Determine if this should use schema-driven children\n let childChildren: ConfigTreeNode[];\n if (propertyDef?.children === 'schema-driven') {\n // Use schema-driven building for nested settings\n const schemaPath = propertyDef.schemaPath || key;\n const propSchema = schemas?.[schemaPath];\n childChildren = buildSchemaChildren(\n childValue as Record<string, unknown>,\n childPath,\n propSchema,\n schemas,\n structure,\n );\n } else {\n // Continue with value-driven recursion\n childChildren = buildValueChildren(\n childValue,\n childPath,\n schemas,\n structure,\n );\n }\n\n const label = propertyDef?.title || capitalize(key);\n\n return {\n key,\n label,\n path: childPath,\n type: structure ? detectNodeType(childValue, childPath, structure, schemas) : 'valueConfig',\n hasValue: true,\n children: childChildren,\n isExpandable: childChildren.length > 0,\n };\n });\n }\n\n // Arrays, primitives: no children\n return [];\n}\n\n","import {\n ConfigEditorBox,\n type ConfigEditorBoxProps,\n} from './config-editor-box';\n\n/**\n * ConfigEditor - Generic Visual Configuration Editor\n *\n * A fully generic configuration editor that works at ANY depth with ANY config type.\n * Uses structure definitions and schemas to provide appropriate editing UI.\n *\n * Key Features:\n * - Works at any depth (full config or nested object)\n * - Structure-driven (no hardcoded assumptions)\n * - Schema-aware (validation, type hints, metadata)\n * - Code/Visual toggle\n * - Tree navigation\n * - Validation with error overview\n * - TypeScript generic for type safety\n *\n * @example\n * // Full DestinationConfig\n * <ConfigEditor\n * config={destinationConfig}\n * onChange={setConfig}\n * structure={DESTINATION_CONFIG_STRUCTURE}\n * schemas={metaSchemas}\n * label=\"Meta Pixel Configuration\"\n * />\n *\n * @example\n * // Single Rule (deep nested)\n * <ConfigEditor\n * config={pageViewRule}\n * onChange={setRule}\n * structure={MAPPING_RULE_STRUCTURE}\n * schemas={{ mapping: mappingSchema }}\n * label=\"Page View Rule\"\n * showTree={false}\n * />\n *\n * @example\n * // Read-only (no onChange)\n * <ConfigEditor\n * config={destinationConfig}\n * structure={DESTINATION_CONFIG_STRUCTURE}\n * initialTab=\"code\"\n * />\n */\nexport function ConfigEditor<T extends Record<string, unknown>>(\n props: ConfigEditorBoxProps<T>,\n) {\n return <ConfigEditorBox {...props} />;\n}\n","import { CodeBox, type CodeBoxProps } from './code-box';\n\nexport type CodeSnippetProps = Omit<CodeBoxProps, 'label' | 'showHeader'>;\n\n/**\n * CodeSnippet - Prominent code display for snippets\n *\n * Wraps CodeBox with larger font size and generous padding.\n * Use this for showcasing code examples, one-liners, or small code blocks\n * where you want the code to be more visually prominent than in a standard editor.\n *\n * Always renders without a header. Use CodeBox if you need a header.\n *\n * Default behavior:\n * - Read-only (disabled=true)\n * - Copy button enabled (showCopy=true)\n * - Auto-height with sensible bounds (min: 20px, max: 600px)\n *\n * Reuses all CodeBox functionality:\n * - Monaco Editor with syntax highlighting\n * - Grid height management and auto-height modes\n * - Copy button\n * - Theme integration\n *\n * @example\n * // Minimal usage - just code and language\n * <CodeSnippet\n * code=\"import { elb } from '@walkeros/core';\"\n * language=\"javascript\"\n * />\n *\n * @example\n * // Override defaults if needed\n * <CodeSnippet\n * code={editableCode}\n * language=\"javascript\"\n * disabled={false}\n * showCopy={false}\n * autoHeight={{ min: 100, max: 800 }}\n * />\n */\nexport function CodeSnippet(props: CodeSnippetProps) {\n const {\n className,\n disabled = true,\n showCopy = true,\n autoHeight = { min: 20, max: 600 },\n fontSize = 15,\n ...rest\n } = props;\n const snippetClassName = `elb-code-snippet ${className || ''}`.trim();\n\n return (\n <CodeBox\n {...rest}\n className={snippetClassName}\n showHeader={false}\n disabled={disabled}\n showCopy={showCopy}\n autoHeight={autoHeight}\n fontSize={fontSize}\n />\n );\n}\n","import React, { useState } from 'react';\nimport type { RJSFSchema } from '@rjsf/utils';\n\nexport interface PropertyTableProps {\n schema: RJSFSchema;\n className?: string;\n}\n\ninterface Property {\n name: string;\n type: string;\n description: string;\n default?: string;\n required?: boolean;\n example?: string;\n}\n\ninterface PropertyModalProps {\n property: Property | null;\n isOpen: boolean;\n onClose: () => void;\n}\n\nfunction schemaToProperties(schema: RJSFSchema): Property[] {\n const properties: Property[] = [];\n const required = (schema.required as string[]) || [];\n\n if (!schema.properties) {\n return properties;\n }\n\n for (const [name, prop] of Object.entries(schema.properties)) {\n const property = prop as Record<string, unknown>;\n\n let type = (property.type as string) || 'any';\n\n if (property.enum) {\n type = (property.enum as unknown[])\n .map((v: unknown) => `'${v}'`)\n .join(' | ');\n }\n\n if (type === 'array' && property.items) {\n const items = property.items as Record<string, unknown>;\n if (items.enum) {\n type = `Array<${(items.enum as unknown[]).map((v: unknown) => `'${v}'`).join(' | ')}>`;\n } else {\n type = `Array<${(items.type as string) || 'any'}>`;\n }\n }\n\n if (type === 'object' && property.additionalProperties) {\n const addProps = property.additionalProperties as Record<string, unknown>;\n const valueType = (addProps.type as string) || 'any';\n type = `Record<string, ${valueType}>`;\n }\n\n if (property.anyOf || property.oneOf) {\n const variants = (property.anyOf || property.oneOf) as Array<\n Record<string, unknown>\n >;\n type = variants.map((v) => (v.type as string) || 'any').join(' | ');\n }\n\n let description = (property.description as string) || '';\n let example: string | undefined;\n\n const exampleMatch = description.match(/\\(like\\s+(.+?)\\)$/);\n if (exampleMatch) {\n example = exampleMatch[1];\n description = description.replace(/\\s*\\(like\\s+.+?\\)$/, '');\n }\n\n if (type === 'any' && description.toLowerCase().includes('function')) {\n type = 'function';\n }\n\n properties.push({\n name,\n type,\n description,\n required: required.includes(name),\n default:\n property.default !== undefined ? String(property.default) : undefined,\n example,\n });\n }\n\n return properties;\n}\n\nfunction PropertyModal({ property, isOpen, onClose }: PropertyModalProps) {\n if (!isOpen || !property) return null;\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n return (\n <div className=\"elb-property-table__modal-backdrop\" onClick={handleBackdropClick}>\n <div className=\"elb-property-table__modal-content\">\n <div className=\"elb-property-table__modal-header\">\n <h3 className=\"elb-property-table__modal-title\">\n <code className=\"elb-property-table__modal-property-name\">\n {property.name}\n </code>\n {property.required && (\n <span className=\"elb-property-table__required-icon\">*</span>\n )}\n </h3>\n <button\n className=\"elb-property-table__close-button\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n <div className=\"elb-property-table__modal-body\">\n <div className=\"elb-property-table__modal-row\">\n <span className=\"elb-property-table__modal-label\">Type:</span>\n <code className=\"elb-property-table__modal-type elb-property-table__modal-type--wrap\">\n {property.type}\n </code>\n </div>\n {property.description && (\n <div className=\"elb-property-table__modal-row\">\n <span className=\"elb-property-table__modal-label\">Description:</span>\n <p className=\"elb-property-table__modal-description\">\n {property.description}\n </p>\n </div>\n )}\n {property.default && (\n <div className=\"elb-property-table__modal-row\">\n <span className=\"elb-property-table__modal-label\">Default:</span>\n <code className=\"elb-property-table__modal-default\">\n {property.default}\n </code>\n </div>\n )}\n {property.example && (\n <div className=\"elb-property-table__modal-row\">\n <span className=\"elb-property-table__modal-label\">Example:</span>\n <code className=\"elb-property-table__modal-example\">\n {property.example}\n </code>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport function PropertyTable({ schema, className }: PropertyTableProps) {\n const [selectedProperty, setSelectedProperty] = useState<Property | null>(\n null,\n );\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const properties = schemaToProperties(schema);\n\n const hasRequiredProperties = properties.some(\n (property) => property.required,\n );\n\n const TYPE_MAX_LENGTH = 30;\n\n const isTruncated = (type: string) => type.length > TYPE_MAX_LENGTH;\n\n const truncateType = (type: string) => {\n if (type.length <= TYPE_MAX_LENGTH) return type;\n return type.slice(0, TYPE_MAX_LENGTH);\n };\n\n const openModal = (property: Property) => {\n setSelectedProperty(property);\n setIsModalOpen(true);\n };\n\n const closeModal = () => {\n setIsModalOpen(false);\n setSelectedProperty(null);\n };\n\n return (\n <div className={`elb-explorer ${className || ''}`}>\n <div className=\"elb-property-table__container\">\n <table className=\"elb-property-table\">\n <thead>\n <tr>\n <th>Property</th>\n <th>Type</th>\n <th>Description</th>\n <th>More</th>\n </tr>\n </thead>\n <tbody>\n {properties.map((property: Property, index: number) => (\n <tr key={index}>\n <td className=\"elb-property-table__property-cell\" data-label=\"Property\">\n <code className=\"elb-property-table__property-name\">\n {property.name}\n {property.required && (\n <span className=\"elb-property-table__required-icon\">\n *\n </span>\n )}\n </code>\n </td>\n <td className=\"elb-property-table__type-cell\" data-label=\"Type\">\n {isTruncated(property.type) ? (\n <button\n className=\"elb-property-table__type-button\"\n onClick={() => openModal(property)}\n aria-label={`View full type for ${property.name}`}\n >\n <code className=\"elb-property-table__property-type elb-property-table__property-type--truncated\">\n {truncateType(property.type)}\n </code>\n </button>\n ) : (\n <code className=\"elb-property-table__property-type\">\n {property.type}\n </code>\n )}\n </td>\n <td className=\"elb-property-table__description\" data-label=\"Description\">\n {property.description}\n </td>\n <td className=\"elb-property-table__action-cell\" data-label=\"More\">\n <button\n className=\"elb-property-table__more-button\"\n onClick={() => openModal(property)}\n aria-label={`More info about ${property.name}`}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {hasRequiredProperties && (\n <div className=\"elb-property-table__required-notice\">\n <span className=\"elb-property-table__required-icon\">*</span> Required\n fields\n </div>\n )}\n <PropertyModal\n property={selectedProperty}\n isOpen={isModalOpen}\n onClose={closeModal}\n />\n </div>\n );\n}\n","import type { ConfigStructureDef } from './types';\n\n/**\n * Structure Definition for Destination.Config\n *\n * Describes the shape of a full destination configuration:\n * - settings: Destination-specific settings\n * - mapping: Event mapping rules (entity → action hierarchy)\n * - data: Global data transformations\n * - policy: Processing policy rules\n * - consent: Consent requirements\n * - id, loadScript, queue, verbose: Config options\n *\n * This structure works with DestinationBox and ConfigEditor.\n */\nexport const DESTINATION_CONFIG_STRUCTURE: ConfigStructureDef = {\n type: 'object',\n title: 'Destination Configuration',\n description:\n 'Complete destination configuration with settings, mapping, data, policy, and options',\n rootNodeType: 'entity', // Overview shows tiles\n\n properties: {\n // Config-level settings\n settings: {\n title: 'Settings',\n description: 'Destination-specific configuration',\n nodeType: 'settings', // Shows SettingsOverviewPane\n children: 'schema-driven', // Build from schemas.settings\n schemaPath: 'settings',\n },\n\n // Event mapping rules\n mapping: {\n title: 'Mapping',\n description: 'Event-specific mapping rules',\n nodeType: 'entity', // Shows entity list\n children: 'entity-action', // Special: mapping.{entity}.{action} pattern\n },\n\n // Global data transformations\n data: {\n title: 'Data',\n description: 'Global data transformations',\n children: 'value-driven', // Detect from value (map, loop, etc.)\n schemaPath: 'data',\n },\n\n // Processing policy\n policy: {\n title: 'Policy',\n description: 'Processing policy rules',\n nodeType: 'policy',\n children: 'none',\n },\n\n // Consent requirements\n consent: {\n title: 'Consent',\n description: 'Consent requirements',\n nodeType: 'consent',\n children: 'none',\n },\n\n // Config options\n id: {\n title: 'ID',\n description: 'Destination identifier',\n nodeType: 'primitive',\n children: 'none',\n schemaPath: 'id',\n },\n\n loadScript: {\n title: 'Load Script',\n description: 'Automatically load destination script',\n nodeType: 'boolean',\n children: 'none',\n schemaPath: 'loadScript',\n },\n\n queue: {\n title: 'Queue',\n description: 'Enable event queuing',\n nodeType: 'boolean',\n children: 'none',\n schemaPath: 'queue',\n },\n\n verbose: {\n title: 'Verbose',\n description: 'Enable verbose logging',\n nodeType: 'boolean',\n children: 'none',\n schemaPath: 'verbose',\n },\n },\n\n patterns: {\n 'entity-action': true, // mapping property uses this pattern\n },\n};\n\n/**\n * Helper function to get the NodeType for a root-level property\n * @param key - The property key (e.g., 'settings', 'mapping', 'data')\n * @returns The NodeType if defined in the structure, undefined otherwise\n */\nexport function getRootPropertyNodeType(key: string): string | undefined {\n const property = DESTINATION_CONFIG_STRUCTURE.properties?.[key];\n return property?.nodeType;\n}\n\n/**\n * Alias for backward compatibility\n * @deprecated Use DESTINATION_CONFIG_STRUCTURE instead\n */\nexport const destinationConfigStructureSchema = DESTINATION_CONFIG_STRUCTURE;\n","import React from 'react';\n\nexport interface FooterProps {\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * Footer - Footer atom component for boxes\n *\n * Provides a fixed-height footer area at the bottom of a box.\n * Pairs with Header component for consistent box structure.\n *\n * @example\n * <Box header=\"Preview\">\n * <Preview ... />\n * <Footer>\n * <ButtonGroup buttons={...} />\n * </Footer>\n * </Box>\n */\nexport function Footer({ children, className = '' }: FooterProps) {\n return <div className={`elb-explorer-footer ${className}`}>{children}</div>;\n}\n","import React from 'react';\n\n/**\n * Hint item definition\n */\nexport interface HintItem {\n code: string;\n description: string;\n}\n\n/**\n * PanelHints - Reusable hints component for panel views\n *\n * Displays a clean, modern hints box with code examples and descriptions.\n * Used across all property panel views for consistency.\n *\n * Features:\n * - Minimal design with subtle background\n * - Code-first presentation\n * - Clean typography\n * - Theme-aware styling\n *\n * @example\n * <PanelHints\n * title=\"Common patterns\"\n * hints={[\n * { code: 'data.id', description: 'Product identifier' },\n * { code: 'user.email', description: 'User email address' }\n * ]}\n * />\n */\nexport interface PanelHintsProps {\n title?: string;\n hints: HintItem[];\n className?: string;\n}\n\nexport function PanelHints({\n title = 'Common patterns',\n hints,\n className = '',\n}: PanelHintsProps) {\n return (\n <div className={`elb-panel-hints ${className}`}>\n {title && <div className=\"elb-panel-hints-title\">{title}</div>}\n <ul className=\"elb-panel-hints-list\">\n {hints.map((hint, index) => (\n <li key={index} className=\"elb-panel-hints-item\">\n <code className=\"elb-panel-hints-code\">{hint.code}</code>\n <span className=\"elb-panel-hints-desc\">{hint.description}</span>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","/**\n * @import {MDXComponents} from 'mdx/types.js'\n * @import {Component, ReactElement, ReactNode} from 'react'\n */\n\n/**\n * @callback MergeComponents\n * Custom merge function.\n * @param {Readonly<MDXComponents>} currentComponents\n * Current components from the context.\n * @returns {MDXComponents}\n * Additional components.\n *\n * @typedef Props\n * Configuration for `MDXProvider`.\n * @property {ReactNode | null | undefined} [children]\n * Children (optional).\n * @property {Readonly<MDXComponents> | MergeComponents | null | undefined} [components]\n * Additional components to use or a function that creates them (optional).\n * @property {boolean | null | undefined} [disableParentContext=false]\n * Turn off outer component context (default: `false`).\n */\n\nimport React from 'react'\n\n/** @type {Readonly<MDXComponents>} */\nconst emptyComponents = {}\n\nconst MDXContext = React.createContext(emptyComponents)\n\n/**\n * Get current components from the MDX Context.\n *\n * @param {Readonly<MDXComponents> | MergeComponents | null | undefined} [components]\n * Additional components to use or a function that creates them (optional).\n * @returns {MDXComponents}\n * Current components.\n */\nexport function useMDXComponents(components) {\n const contextComponents = React.useContext(MDXContext)\n\n // Memoize to avoid unnecessary top-level context changes\n return React.useMemo(\n function () {\n // Custom merge via a function prop\n if (typeof components === 'function') {\n return components(contextComponents)\n }\n\n return {...contextComponents, ...components}\n },\n [contextComponents, components]\n )\n}\n\n/**\n * Provider for MDX context.\n *\n * @param {Readonly<Props>} properties\n * Properties.\n * @returns {ReactElement}\n * Element.\n * @satisfies {Component}\n */\nexport function MDXProvider(properties) {\n /** @type {Readonly<MDXComponents>} */\n let allComponents\n\n if (properties.disableParentContext) {\n allComponents =\n typeof properties.components === 'function'\n ? properties.components(emptyComponents)\n : properties.components || emptyComponents\n } else {\n allComponents = useMDXComponents(properties.components)\n }\n\n return React.createElement(\n MDXContext.Provider,\n {value: allComponents},\n properties.children\n )\n}\n","import React, { type FC, type PropsWithChildren, Children } from 'react';\nimport { CodeBox } from '../molecules/code-box';\n\ninterface MDXCodeProps {\n className?: string;\n}\n\n/**\n * MDXCode - Code component for MDX files\n *\n * Automatically detects and renders inline vs block code:\n * - Inline code: `example` → <code className=\"elb-code-inline\">\n * - Block code: ```language\\ncode\\n``` → Uses CodeBox with Monaco editor\n *\n * Language detection:\n * - Extracts language from className (e.g., \"language-typescript\")\n * - Maps common MDX language names to Monaco language IDs\n *\n * Block code features (via CodeBox):\n * - Full Monaco editor with syntax highlighting\n * - Theme-aware (Palenight dark, VS Light)\n * - Copy to clipboard button\n * - Auto-height to fit content\n * - Read-only mode\n *\n * @example\n * // In MDX files (no import needed with MDXProvider):\n * Inline `code` example\n *\n * ```typescript\n * const block = \"code\";\n * ```\n */\nexport const MDXCode: FC<PropsWithChildren<MDXCodeProps>> = ({\n className,\n children,\n}) => {\n // Detect if this is block code based on:\n // 1. Has className (markdown sets \"language-*\" for code blocks)\n // 2. Content contains newlines\n const childrenArray = Children.toArray(children);\n const hasClassName = typeof className === 'string';\n\n // Check if content has newlines (block code)\n const hasNewlines = childrenArray.some((child) => {\n if (typeof child === 'string') {\n return child.match(/[\\n\\r]/g);\n }\n return false;\n });\n\n // Inline code: no className or no newlines\n if (!hasClassName || !hasNewlines) {\n return <code className=\"elb-code-inline\">{children}</code>;\n }\n\n // Block code: extract language from className\n // Format: \"language-typescript\" → \"typescript\"\n const mdxLanguage = className.replace(/^language-/, '');\n\n // Map MDX language names to Monaco language IDs\n const languageMap: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n jsx: 'javascript',\n tsx: 'typescript',\n bash: 'shell',\n sh: 'shell',\n yml: 'yaml',\n md: 'markdown',\n };\n\n const monacoLanguage = languageMap[mdxLanguage] || mdxLanguage;\n\n // Extract code string from children\n const code = childrenArray\n .map((child) => (typeof child === 'string' ? child : ''))\n .join('')\n .trim();\n\n return (\n <CodeBox\n code={code}\n language={monacoLanguage}\n disabled\n showCopy\n showHeader={false}\n autoHeight={{ min: 100, max: 600 }}\n />\n );\n};\n","import React, { type FC, type PropsWithChildren } from 'react';\nimport { MDXProvider as BaseMDXProvider } from '@mdx-js/react';\nimport { MDXCode } from '../components/atoms/mdx-code';\nimport { CodeBox } from '../components/molecules/code-box';\nimport { PropertyTable } from '../components/molecules/property-table';\nimport { DestinationInitDemo } from '../components/demos/DestinationInitDemo';\nimport { DestinationDemo } from '../components/demos/DestinationDemo';\n\n/**\n * MDXProvider - Makes components available in MDX files without explicit imports\n *\n * This provider wraps MDX content and injects React components for HTML elements.\n * Components are automatically used when rendering markdown/MDX content.\n *\n * Key features:\n * - No imports needed in MDX files\n * - Consistent styling across all documentation\n * - Theme-aware (respects data-theme attribute)\n * - Automatic inline vs block code detection\n *\n * Available components (no import needed):\n * - CodeBox: Monaco editor for code display (also auto-used for ```code blocks)\n * - PropertyTable: Display schema-based property documentation\n * - DestinationInitDemo: Interactive demo for destination initialization\n * - DestinationDemo: Interactive demo for destination event processing\n *\n * @example\n * // Wrap your app\n * <MDXProvider>\n * <App />\n * </MDXProvider>\n *\n * @example\n * // Then in any .mdx file, no imports needed:\n * # Documentation\n *\n * Inline `code` and markdown blocks:\n * ```typescript\n * const example = \"Hello\";\n * ```\n *\n * Or use components directly:\n * <CodeBox code=\"const x = 1;\" language=\"javascript\" />\n * <PropertyTable schema={mySchema} />\n */\nexport const MDXProvider: FC<PropsWithChildren> = ({ children }) => {\n const components = {\n // Markdown element mappings\n code: MDXCode, // Auto-handles ```code blocks\n\n // Explorer components (no import needed in MDX)\n CodeBox,\n PropertyTable,\n DestinationInitDemo,\n DestinationDemo,\n };\n\n return <BaseMDXProvider components={components}>{children}</BaseMDXProvider>;\n};\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import {\n AnyClassGroupIds,\n AnyConfig,\n AnyThemeGroupIds,\n ClassGroup,\n ClassValidator,\n Config,\n ThemeGetter,\n ThemeObject,\n} from './types'\n\nexport interface ClassPartObject {\n nextPart: Map<string, ClassPartObject>\n validators: ClassValidatorObject[]\n classGroupId?: AnyClassGroupIds\n}\n\ninterface ClassValidatorObject {\n classGroupId: AnyClassGroupIds\n validator: ClassValidator\n}\n\nconst CLASS_PART_SEPARATOR = '-'\n\nexport const createClassGroupUtils = (config: AnyConfig) => {\n const classMap = createClassMap(config)\n const { conflictingClassGroups, conflictingClassGroupModifiers } = config\n\n const getClassGroupId = (className: string) => {\n const classParts = className.split(CLASS_PART_SEPARATOR)\n\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift()\n }\n\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className)\n }\n\n const getConflictingClassGroupIds = (\n classGroupId: AnyClassGroupIds,\n hasPostfixModifier: boolean,\n ) => {\n const conflicts = conflictingClassGroups[classGroupId] || []\n\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]!]\n }\n\n return conflicts\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nconst getGroupRecursive = (\n classParts: string[],\n classPartObject: ClassPartObject,\n): AnyClassGroupIds | undefined => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[0]!\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart)\n const classGroupFromNextClassPart = nextClassPartObject\n ? getGroupRecursive(classParts.slice(1), nextClassPartObject)\n : undefined\n\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart\n }\n\n if (classPartObject.validators.length === 0) {\n return undefined\n }\n\n const classRest = classParts.join(CLASS_PART_SEPARATOR)\n\n return classPartObject.validators.find(({ validator }) => validator(classRest))?.classGroupId\n}\n\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/\n\nconst getGroupIdForArbitraryProperty = (className: string) => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)![1]\n const property = arbitraryPropertyClassName?.substring(\n 0,\n arbitraryPropertyClassName.indexOf(':'),\n )\n\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property\n }\n }\n}\n\n/**\n * Exported for testing only\n */\nexport const createClassMap = (config: Config<AnyClassGroupIds, AnyThemeGroupIds>) => {\n const { theme, prefix } = config\n const classMap: ClassPartObject = {\n nextPart: new Map<string, ClassPartObject>(),\n validators: [],\n }\n\n const prefixedClassGroupEntries = getPrefixedClassGroupEntries(\n Object.entries(config.classGroups),\n prefix,\n )\n\n prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme)\n })\n\n return classMap\n}\n\nconst processClassesRecursively = (\n classGroup: ClassGroup<AnyThemeGroupIds>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n classGroup.forEach((classDefinition) => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n return\n }\n\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(\n classDefinition(theme),\n classPartObject,\n classGroupId,\n theme,\n )\n return\n }\n\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId,\n })\n\n return\n }\n\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(\n classGroup,\n getPart(classPartObject, key),\n classGroupId,\n theme,\n )\n })\n })\n}\n\nconst getPart = (classPartObject: ClassPartObject, path: string) => {\n let currentClassPartObject = classPartObject\n\n path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: [],\n })\n }\n\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart)!\n })\n\n return currentClassPartObject\n}\n\nconst isThemeGetter = (func: ClassValidator | ThemeGetter): func is ThemeGetter =>\n (func as ThemeGetter).isThemeGetter\n\nconst getPrefixedClassGroupEntries = (\n classGroupEntries: Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]>,\n prefix: string | undefined,\n): Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]> => {\n if (!prefix) {\n return classGroupEntries\n }\n\n return classGroupEntries.map(([classGroupId, classGroup]) => {\n const prefixedClassGroup = classGroup.map((classDefinition) => {\n if (typeof classDefinition === 'string') {\n return prefix + classDefinition\n }\n\n if (typeof classDefinition === 'object') {\n return Object.fromEntries(\n Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]),\n )\n }\n\n return classDefinition\n })\n\n return [classGroupId, prefixedClassGroup]\n })\n}\n","// Export is needed because TypeScript complains about an error otherwise:\n// Error: …/tailwind-merge/src/config-utils.ts(8,17): semantic error TS4058: Return type of exported function has or is using name 'LruCache' from external module \"…/tailwind-merge/src/lru-cache\" but cannot be named.\nexport interface LruCache<Key, Value> {\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nexport const createLruCache = <Key, Value>(maxCacheSize: number): LruCache<Key, Value> => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {},\n }\n }\n\n let cacheSize = 0\n let cache = new Map<Key, Value>()\n let previousCache = new Map<Key, Value>()\n\n const update = (key: Key, value: Value) => {\n cache.set(key, value)\n cacheSize++\n\n if (cacheSize > maxCacheSize) {\n cacheSize = 0\n previousCache = cache\n cache = new Map()\n }\n }\n\n return {\n get(key) {\n let value = cache.get(key)\n\n if (value !== undefined) {\n return value\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value)\n return value\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value)\n } else {\n update(key, value)\n }\n },\n }\n}\n","import { AnyConfig } from './types'\n\nexport const IMPORTANT_MODIFIER = '!'\n\nexport const createParseClassName = (config: AnyConfig) => {\n const { separator, experimentalParseClassName } = config\n const isSeparatorSingleCharacter = separator.length === 1\n const firstSeparatorCharacter = separator[0]\n const separatorLength = separator.length\n\n // parseClassName inspired by https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n const parseClassName = (className: string) => {\n const modifiers = []\n\n let bracketDepth = 0\n let modifierStart = 0\n let postfixModifierPosition: number | undefined\n\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index]\n\n if (bracketDepth === 0) {\n if (\n currentCharacter === firstSeparatorCharacter &&\n (isSeparatorSingleCharacter ||\n className.slice(index, index + separatorLength) === separator)\n ) {\n modifiers.push(className.slice(modifierStart, index))\n modifierStart = index + separatorLength\n continue\n }\n\n if (currentCharacter === '/') {\n postfixModifierPosition = index\n continue\n }\n }\n\n if (currentCharacter === '[') {\n bracketDepth++\n } else if (currentCharacter === ']') {\n bracketDepth--\n }\n }\n\n const baseClassNameWithImportantModifier =\n modifiers.length === 0 ? className : className.substring(modifierStart)\n const hasImportantModifier =\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)\n const baseClassName = hasImportantModifier\n ? baseClassNameWithImportantModifier.substring(1)\n : baseClassNameWithImportantModifier\n\n const maybePostfixModifierPosition =\n postfixModifierPosition && postfixModifierPosition > modifierStart\n ? postfixModifierPosition - modifierStart\n : undefined\n\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n }\n }\n\n if (experimentalParseClassName) {\n return (className: string) => experimentalParseClassName({ className, parseClassName })\n }\n\n return parseClassName\n}\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nexport const sortModifiers = (modifiers: string[]) => {\n if (modifiers.length <= 1) {\n return modifiers\n }\n\n const sortedModifiers: string[] = []\n let unsortedModifiers: string[] = []\n\n modifiers.forEach((modifier) => {\n const isArbitraryVariant = modifier[0] === '['\n\n if (isArbitraryVariant) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier)\n unsortedModifiers = []\n } else {\n unsortedModifiers.push(modifier)\n }\n })\n\n sortedModifiers.push(...unsortedModifiers.sort())\n\n return sortedModifiers\n}\n","import { createClassGroupUtils } from './class-group-utils'\nimport { createLruCache } from './lru-cache'\nimport { createParseClassName } from './parse-class-name'\nimport { AnyConfig } from './types'\n\nexport type ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createConfigUtils = (config: AnyConfig) => ({\n cache: createLruCache<string, string>(config.cacheSize),\n parseClassName: createParseClassName(config),\n ...createClassGroupUtils(config),\n})\n","import { ConfigUtils } from './config-utils'\nimport { IMPORTANT_MODIFIER, sortModifiers } from './parse-class-name'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\n\nexport const mergeClassList = (classList: string, configUtils: ConfigUtils) => {\n const { parseClassName, getClassGroupId, getConflictingClassGroupIds } = configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict: string[] = []\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)\n\n let result = ''\n\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index]!\n\n const { modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition } =\n parseClassName(originalClassName)\n\n let hasPostfixModifier = Boolean(maybePostfixModifierPosition)\n let classGroupId = getClassGroupId(\n hasPostfixModifier\n ? baseClassName.substring(0, maybePostfixModifierPosition)\n : baseClassName,\n )\n\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n classGroupId = getClassGroupId(baseClassName)\n\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n hasPostfixModifier = false\n }\n\n const variantModifier = sortModifiers(modifiers).join(':')\n\n const modifierId = hasImportantModifier\n ? variantModifier + IMPORTANT_MODIFIER\n : variantModifier\n\n const classId = modifierId + classGroupId\n\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue\n }\n\n classGroupsInConflict.push(classId)\n\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i]!\n classGroupsInConflict.push(modifierId + group)\n }\n\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n }\n\n return result\n}\n","/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false\ntype ClassNameArray = ClassNameValue[]\n\nexport function twJoin(...classLists: ClassNameValue[]): string\nexport function twJoin() {\n let index = 0\n let argument: ClassNameValue\n let resolvedValue: string\n let string = ''\n\n while (index < arguments.length) {\n if ((argument = arguments[index++])) {\n if ((resolvedValue = toValue(argument))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n return string\n}\n\nconst toValue = (mix: ClassNameArray | string) => {\n if (typeof mix === 'string') {\n return mix\n }\n\n let resolvedValue: string\n let string = ''\n\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((resolvedValue = toValue(mix[k] as ClassNameArray | string))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n\n return string\n}\n","import { createConfigUtils } from './config-utils'\nimport { mergeClassList } from './merge-classlist'\nimport { ClassNameValue, twJoin } from './tw-join'\nimport { AnyConfig } from './types'\n\ntype CreateConfigFirst = () => AnyConfig\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\ntype TailwindMerge = (...classLists: ClassNameValue[]) => string\ntype ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport function createTailwindMerge(\n createConfigFirst: CreateConfigFirst,\n ...createConfigRest: CreateConfigSubsequent[]\n): TailwindMerge {\n let configUtils: ConfigUtils\n let cacheGet: ConfigUtils['cache']['get']\n let cacheSet: ConfigUtils['cache']['set']\n let functionToCall = initTailwindMerge\n\n function initTailwindMerge(classList: string) {\n const config = createConfigRest.reduce(\n (previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig),\n createConfigFirst() as AnyConfig,\n )\n\n configUtils = createConfigUtils(config)\n cacheGet = configUtils.cache.get\n cacheSet = configUtils.cache.set\n functionToCall = tailwindMerge\n\n return tailwindMerge(classList)\n }\n\n function tailwindMerge(classList: string) {\n const cachedResult = cacheGet(classList)\n\n if (cachedResult) {\n return cachedResult\n }\n\n const result = mergeClassList(classList, configUtils)\n cacheSet(classList, result)\n\n return result\n }\n\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments as any))\n }\n}\n","import { DefaultThemeGroupIds, NoInfer, ThemeGetter, ThemeObject } from './types'\n\nexport const fromTheme = <\n AdditionalThemeGroupIds extends string = never,\n DefaultThemeGroupIdsInner extends string = DefaultThemeGroupIds,\n>(key: NoInfer<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>): ThemeGetter => {\n const themeGetter = (theme: ThemeObject<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>) =>\n theme[key] || []\n\n themeGetter.isThemeGetter = true as const\n\n return themeGetter\n}\n","const arbitraryValueRegex = /^\\[(?:([a-z-]+):)?(.+)\\]$/i\nconst fractionRegex = /^\\d+\\/\\d+$/\nconst stringLengths = new Set(['px', 'full', 'screen'])\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/\nconst lengthUnitRegex =\n /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch))\\(.+\\)$/\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/\nconst imageRegex =\n /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/\n\nexport const isLength = (value: string) =>\n isNumber(value) || stringLengths.has(value) || fractionRegex.test(value)\n\nexport const isArbitraryLength = (value: string) =>\n getIsArbitraryValue(value, 'length', isLengthOnly)\n\nexport const isNumber = (value: string) => Boolean(value) && !Number.isNaN(Number(value))\n\nexport const isArbitraryNumber = (value: string) => getIsArbitraryValue(value, 'number', isNumber)\n\nexport const isInteger = (value: string) => Boolean(value) && Number.isInteger(Number(value))\n\nexport const isPercent = (value: string) => value.endsWith('%') && isNumber(value.slice(0, -1))\n\nexport const isArbitraryValue = (value: string) => arbitraryValueRegex.test(value)\n\nexport const isTshirtSize = (value: string) => tshirtUnitRegex.test(value)\n\nconst sizeLabels = new Set(['length', 'size', 'percentage'])\n\nexport const isArbitrarySize = (value: string) => getIsArbitraryValue(value, sizeLabels, isNever)\n\nexport const isArbitraryPosition = (value: string) =>\n getIsArbitraryValue(value, 'position', isNever)\n\nconst imageLabels = new Set(['image', 'url'])\n\nexport const isArbitraryImage = (value: string) => getIsArbitraryValue(value, imageLabels, isImage)\n\nexport const isArbitraryShadow = (value: string) => getIsArbitraryValue(value, '', isShadow)\n\nexport const isAny = () => true\n\nconst getIsArbitraryValue = (\n value: string,\n label: string | Set<string>,\n testValue: (value: string) => boolean,\n) => {\n const result = arbitraryValueRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return typeof label === 'string' ? result[1] === label : label.has(result[1])\n }\n\n return testValue(result[2]!)\n }\n\n return false\n}\n\nconst isLengthOnly = (value: string) =>\n // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n // For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\n lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)\n\nconst isNever = () => false\n\nconst isShadow = (value: string) => shadowRegex.test(value)\n\nconst isImage = (value: string) => imageRegex.test(value)\n","import { fromTheme } from './from-theme'\nimport { Config, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\nimport {\n isAny,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isInteger,\n isLength,\n isNumber,\n isPercent,\n isTshirtSize,\n} from './validators'\n\nexport const getDefaultConfig = () => {\n const colors = fromTheme('colors')\n const spacing = fromTheme('spacing')\n const blur = fromTheme('blur')\n const brightness = fromTheme('brightness')\n const borderColor = fromTheme('borderColor')\n const borderRadius = fromTheme('borderRadius')\n const borderSpacing = fromTheme('borderSpacing')\n const borderWidth = fromTheme('borderWidth')\n const contrast = fromTheme('contrast')\n const grayscale = fromTheme('grayscale')\n const hueRotate = fromTheme('hueRotate')\n const invert = fromTheme('invert')\n const gap = fromTheme('gap')\n const gradientColorStops = fromTheme('gradientColorStops')\n const gradientColorStopPositions = fromTheme('gradientColorStopPositions')\n const inset = fromTheme('inset')\n const margin = fromTheme('margin')\n const opacity = fromTheme('opacity')\n const padding = fromTheme('padding')\n const saturate = fromTheme('saturate')\n const scale = fromTheme('scale')\n const sepia = fromTheme('sepia')\n const skew = fromTheme('skew')\n const space = fromTheme('space')\n const translate = fromTheme('translate')\n\n const getOverscroll = () => ['auto', 'contain', 'none'] as const\n const getOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'] as const\n const getSpacingWithAutoAndArbitrary = () => ['auto', isArbitraryValue, spacing] as const\n const getSpacingWithArbitrary = () => [isArbitraryValue, spacing] as const\n const getLengthWithEmptyAndArbitrary = () => ['', isLength, isArbitraryLength] as const\n const getNumberWithAutoAndArbitrary = () => ['auto', isNumber, isArbitraryValue] as const\n const getPositions = () =>\n [\n 'bottom',\n 'center',\n 'left',\n 'left-bottom',\n 'left-top',\n 'right',\n 'right-bottom',\n 'right-top',\n 'top',\n ] as const\n const getLineStyles = () => ['solid', 'dashed', 'dotted', 'double', 'none'] as const\n const getBlendModes = () =>\n [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ] as const\n const getAlign = () =>\n ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch'] as const\n const getZeroAndEmpty = () => ['', '0', isArbitraryValue] as const\n const getBreaks = () =>\n ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'] as const\n const getNumberAndArbitrary = () => [isNumber, isArbitraryValue]\n\n return {\n cacheSize: 500,\n separator: ':',\n theme: {\n colors: [isAny],\n spacing: [isLength, isArbitraryLength],\n blur: ['none', '', isTshirtSize, isArbitraryValue],\n brightness: getNumberAndArbitrary(),\n borderColor: [colors],\n borderRadius: ['none', '', 'full', isTshirtSize, isArbitraryValue],\n borderSpacing: getSpacingWithArbitrary(),\n borderWidth: getLengthWithEmptyAndArbitrary(),\n contrast: getNumberAndArbitrary(),\n grayscale: getZeroAndEmpty(),\n hueRotate: getNumberAndArbitrary(),\n invert: getZeroAndEmpty(),\n gap: getSpacingWithArbitrary(),\n gradientColorStops: [colors],\n gradientColorStopPositions: [isPercent, isArbitraryLength],\n inset: getSpacingWithAutoAndArbitrary(),\n margin: getSpacingWithAutoAndArbitrary(),\n opacity: getNumberAndArbitrary(),\n padding: getSpacingWithArbitrary(),\n saturate: getNumberAndArbitrary(),\n scale: getNumberAndArbitrary(),\n sepia: getZeroAndEmpty(),\n skew: getNumberAndArbitrary(),\n space: getSpacingWithArbitrary(),\n translate: getSpacingWithArbitrary(),\n },\n classGroups: {\n // Layout\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{ aspect: ['auto', 'square', 'video', isArbitraryValue] }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{ columns: [isTshirtSize] }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{ 'break-after': getBreaks() }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{ 'break-before': getBreaks() }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{ 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column'] }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{ 'box-decoration': ['slice', 'clone'] }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{ box: ['border', 'content'] }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: [\n 'block',\n 'inline-block',\n 'inline',\n 'flex',\n 'inline-flex',\n 'table',\n 'inline-table',\n 'table-caption',\n 'table-cell',\n 'table-column',\n 'table-column-group',\n 'table-footer-group',\n 'table-header-group',\n 'table-row-group',\n 'table-row',\n 'flow-root',\n 'grid',\n 'inline-grid',\n 'contents',\n 'list-item',\n 'hidden',\n ],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{ float: ['right', 'left', 'none', 'start', 'end'] }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{ clear: ['left', 'right', 'both', 'none', 'start', 'end'] }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{ object: ['contain', 'cover', 'fill', 'none', 'scale-down'] }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{ object: [...getPositions(), isArbitraryValue] }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{ overflow: getOverflow() }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{ 'overflow-x': getOverflow() }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{ 'overflow-y': getOverflow() }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{ overscroll: getOverscroll() }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{ 'overscroll-x': getOverscroll() }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{ 'overscroll-y': getOverscroll() }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{ inset: [inset] }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{ 'inset-x': [inset] }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{ 'inset-y': [inset] }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{ start: [inset] }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{ end: [inset] }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{ top: [inset] }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{ right: [inset] }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{ bottom: [inset] }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{ left: [inset] }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{ z: ['auto', isInteger, isArbitraryValue] }],\n // Flexbox and Grid\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{ basis: getSpacingWithAutoAndArbitrary() }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{ flex: ['row', 'row-reverse', 'col', 'col-reverse'] }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{ flex: ['wrap', 'wrap-reverse', 'nowrap'] }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{ flex: ['1', 'auto', 'initial', 'none', isArbitraryValue] }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{ grow: getZeroAndEmpty() }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{ shrink: getZeroAndEmpty() }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{ order: ['first', 'last', 'none', isInteger, isArbitraryValue] }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{ 'grid-cols': [isAny] }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [\n {\n col: [\n 'auto',\n { span: ['full', isInteger, isArbitraryValue] },\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{ 'col-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{ 'col-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{ 'grid-rows': [isAny] }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [\n { row: ['auto', { span: [isInteger, isArbitraryValue] }, isArbitraryValue] },\n ],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{ 'row-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{ 'row-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{ 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense'] }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{ 'auto-cols': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{ 'auto-rows': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{ gap: [gap] }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{ 'gap-x': [gap] }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{ 'gap-y': [gap] }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{ justify: ['normal', ...getAlign()] }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{ 'justify-items': ['start', 'end', 'center', 'stretch'] }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{ 'justify-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{ content: ['normal', ...getAlign(), 'baseline'] }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{ items: ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{ self: ['auto', 'start', 'end', 'center', 'stretch', 'baseline'] }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{ 'place-content': [...getAlign(), 'baseline'] }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{ 'place-items': ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{ 'place-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{ p: [padding] }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{ px: [padding] }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{ py: [padding] }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{ ps: [padding] }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{ pe: [padding] }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{ pt: [padding] }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{ pr: [padding] }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{ pb: [padding] }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{ pl: [padding] }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{ m: [margin] }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{ mx: [margin] }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{ my: [margin] }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{ ms: [margin] }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{ me: [margin] }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{ mt: [margin] }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{ mr: [margin] }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{ mb: [margin] }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{ ml: [margin] }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x': [{ 'space-x': [space] }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y': [{ 'space-y': [space] }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y-reverse': ['space-y-reverse'],\n // Sizing\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [\n {\n w: [\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svw',\n 'lvw',\n 'dvw',\n isArbitraryValue,\n spacing,\n ],\n },\n ],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{ 'min-w': [isArbitraryValue, spacing, 'min', 'max', 'fit'] }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [\n {\n 'max-w': [\n isArbitraryValue,\n spacing,\n 'none',\n 'full',\n 'min',\n 'max',\n 'fit',\n 'prose',\n { screen: [isTshirtSize] },\n isTshirtSize,\n ],\n },\n ],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [\n {\n h: [\n isArbitraryValue,\n spacing,\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svh',\n 'lvh',\n 'dvh',\n ],\n },\n ],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [\n { 'min-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [\n { 'max-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Size\n * @see https://tailwindcss.com/docs/size\n */\n size: [{ size: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit'] }],\n // Typography\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{ text: ['base', isTshirtSize, isArbitraryLength] }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [\n {\n font: [\n 'thin',\n 'extralight',\n 'light',\n 'normal',\n 'medium',\n 'semibold',\n 'bold',\n 'extrabold',\n 'black',\n isArbitraryNumber,\n ],\n },\n ],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{ font: [isAny] }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [\n {\n tracking: [\n 'tighter',\n 'tight',\n 'normal',\n 'wide',\n 'wider',\n 'widest',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{ 'line-clamp': ['none', isNumber, isArbitraryNumber] }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [\n {\n leading: [\n 'none',\n 'tight',\n 'snug',\n 'normal',\n 'relaxed',\n 'loose',\n isLength,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{ 'list-image': ['none', isArbitraryValue] }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{ list: ['none', 'disc', 'decimal', isArbitraryValue] }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{ list: ['inside', 'outside'] }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{ placeholder: [colors] }],\n /**\n * Placeholder Opacity\n * @see https://tailwindcss.com/docs/placeholder-opacity\n */\n 'placeholder-opacity': [{ 'placeholder-opacity': [opacity] }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{ text: ['left', 'center', 'right', 'justify', 'start', 'end'] }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{ text: [colors] }],\n /**\n * Text Opacity\n * @see https://tailwindcss.com/docs/text-opacity\n */\n 'text-opacity': [{ 'text-opacity': [opacity] }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{ decoration: [...getLineStyles(), 'wavy'] }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [\n { decoration: ['auto', 'from-font', isLength, isArbitraryLength] },\n ],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{ 'underline-offset': ['auto', isLength, isArbitraryValue] }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{ decoration: [colors] }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{ text: ['wrap', 'nowrap', 'balance', 'pretty'] }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{ indent: getSpacingWithArbitrary() }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [\n {\n align: [\n 'baseline',\n 'top',\n 'middle',\n 'bottom',\n 'text-top',\n 'text-bottom',\n 'sub',\n 'super',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [\n { whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces'] },\n ],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{ break: ['normal', 'words', 'all', 'keep'] }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{ hyphens: ['none', 'manual', 'auto'] }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{ content: ['none', isArbitraryValue] }],\n // Backgrounds\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{ bg: ['fixed', 'local', 'scroll'] }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{ 'bg-clip': ['border', 'padding', 'content', 'text'] }],\n /**\n * Background Opacity\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/background-opacity\n */\n 'bg-opacity': [{ 'bg-opacity': [opacity] }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{ 'bg-origin': ['border', 'padding', 'content'] }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{ bg: [...getPositions(), isArbitraryPosition] }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{ bg: ['no-repeat', { repeat: ['', 'x', 'y', 'round', 'space'] }] }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{ bg: ['auto', 'cover', 'contain', isArbitrarySize] }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [\n {\n bg: [\n 'none',\n { 'gradient-to': ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl'] },\n isArbitraryImage,\n ],\n },\n ],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{ bg: [colors] }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{ from: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{ via: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{ to: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{ from: [gradientColorStops] }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{ via: [gradientColorStops] }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{ to: [gradientColorStops] }],\n // Borders\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{ rounded: [borderRadius] }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{ 'rounded-s': [borderRadius] }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{ 'rounded-e': [borderRadius] }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{ 'rounded-t': [borderRadius] }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{ 'rounded-r': [borderRadius] }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{ 'rounded-b': [borderRadius] }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{ 'rounded-l': [borderRadius] }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{ 'rounded-ss': [borderRadius] }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{ 'rounded-se': [borderRadius] }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{ 'rounded-ee': [borderRadius] }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{ 'rounded-es': [borderRadius] }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{ 'rounded-tl': [borderRadius] }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{ 'rounded-tr': [borderRadius] }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{ 'rounded-br': [borderRadius] }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{ 'rounded-bl': [borderRadius] }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{ border: [borderWidth] }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{ 'border-x': [borderWidth] }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{ 'border-y': [borderWidth] }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{ 'border-s': [borderWidth] }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{ 'border-e': [borderWidth] }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{ 'border-t': [borderWidth] }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{ 'border-r': [borderWidth] }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{ 'border-b': [borderWidth] }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{ 'border-l': [borderWidth] }],\n /**\n * Border Opacity\n * @see https://tailwindcss.com/docs/border-opacity\n */\n 'border-opacity': [{ 'border-opacity': [opacity] }],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{ border: [...getLineStyles(), 'hidden'] }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x': [{ 'divide-x': [borderWidth] }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y': [{ 'divide-y': [borderWidth] }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Divide Opacity\n * @see https://tailwindcss.com/docs/divide-opacity\n */\n 'divide-opacity': [{ 'divide-opacity': [opacity] }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/divide-style\n */\n 'divide-style': [{ divide: getLineStyles() }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{ border: [borderColor] }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{ 'border-x': [borderColor] }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{ 'border-y': [borderColor] }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{ 'border-s': [borderColor] }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{ 'border-e': [borderColor] }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{ 'border-t': [borderColor] }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{ 'border-r': [borderColor] }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{ 'border-b': [borderColor] }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{ 'border-l': [borderColor] }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{ divide: [borderColor] }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{ outline: ['', ...getLineStyles()] }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{ 'outline-offset': [isLength, isArbitraryValue] }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{ outline: [isLength, isArbitraryLength] }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{ outline: [colors] }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w': [{ ring: getLengthWithEmptyAndArbitrary() }],\n /**\n * Ring Width Inset\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/ring-color\n */\n 'ring-color': [{ ring: [colors] }],\n /**\n * Ring Opacity\n * @see https://tailwindcss.com/docs/ring-opacity\n */\n 'ring-opacity': [{ 'ring-opacity': [opacity] }],\n /**\n * Ring Offset Width\n * @see https://tailwindcss.com/docs/ring-offset-width\n */\n 'ring-offset-w': [{ 'ring-offset': [isLength, isArbitraryLength] }],\n /**\n * Ring Offset Color\n * @see https://tailwindcss.com/docs/ring-offset-color\n */\n 'ring-offset-color': [{ 'ring-offset': [colors] }],\n // Effects\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{ shadow: ['', 'inner', 'none', isTshirtSize, isArbitraryShadow] }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow-color\n */\n 'shadow-color': [{ shadow: [isAny] }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{ opacity: [opacity] }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{ 'mix-blend': [...getBlendModes(), 'plus-lighter', 'plus-darker'] }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{ 'bg-blend': getBlendModes() }],\n // Filters\n /**\n * Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{ filter: ['', 'none'] }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{ blur: [blur] }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{ brightness: [brightness] }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{ contrast: [contrast] }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{ 'drop-shadow': ['', 'none', isTshirtSize, isArbitraryValue] }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{ grayscale: [grayscale] }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{ 'hue-rotate': [hueRotate] }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{ invert: [invert] }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{ saturate: [saturate] }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{ sepia: [sepia] }],\n /**\n * Backdrop Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{ 'backdrop-filter': ['', 'none'] }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{ 'backdrop-blur': [blur] }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{ 'backdrop-brightness': [brightness] }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{ 'backdrop-contrast': [contrast] }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{ 'backdrop-grayscale': [grayscale] }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{ 'backdrop-hue-rotate': [hueRotate] }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{ 'backdrop-invert': [invert] }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{ 'backdrop-opacity': [opacity] }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{ 'backdrop-saturate': [saturate] }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{ 'backdrop-sepia': [sepia] }],\n // Tables\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{ border: ['collapse', 'separate'] }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{ 'border-spacing': [borderSpacing] }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{ 'border-spacing-x': [borderSpacing] }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{ 'border-spacing-y': [borderSpacing] }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{ table: ['auto', 'fixed'] }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{ caption: ['top', 'bottom'] }],\n // Transitions and Animation\n /**\n * Tranisition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [\n {\n transition: [\n 'none',\n 'all',\n '',\n 'colors',\n 'opacity',\n 'shadow',\n 'transform',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{ duration: getNumberAndArbitrary() }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{ ease: ['linear', 'in', 'out', 'in-out', isArbitraryValue] }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{ delay: getNumberAndArbitrary() }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{ animate: ['none', 'spin', 'ping', 'pulse', 'bounce', isArbitraryValue] }],\n // Transforms\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{ transform: ['', 'gpu', 'none'] }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{ scale: [scale] }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{ 'scale-x': [scale] }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{ 'scale-y': [scale] }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{ rotate: [isInteger, isArbitraryValue] }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{ 'translate-x': [translate] }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{ 'translate-y': [translate] }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{ 'skew-x': [skew] }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{ 'skew-y': [skew] }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [\n {\n origin: [\n 'center',\n 'top',\n 'top-right',\n 'right',\n 'bottom-right',\n 'bottom',\n 'bottom-left',\n 'left',\n 'top-left',\n isArbitraryValue,\n ],\n },\n ],\n // Interactivity\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{ accent: ['auto', colors] }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{ appearance: ['none', 'auto'] }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [\n {\n cursor: [\n 'auto',\n 'default',\n 'pointer',\n 'wait',\n 'text',\n 'move',\n 'help',\n 'not-allowed',\n 'none',\n 'context-menu',\n 'progress',\n 'cell',\n 'crosshair',\n 'vertical-text',\n 'alias',\n 'copy',\n 'no-drop',\n 'grab',\n 'grabbing',\n 'all-scroll',\n 'col-resize',\n 'row-resize',\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n 'ew-resize',\n 'ns-resize',\n 'nesw-resize',\n 'nwse-resize',\n 'zoom-in',\n 'zoom-out',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{ caret: [colors] }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{ 'pointer-events': ['none', 'auto'] }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{ resize: ['none', 'y', 'x', ''] }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{ scroll: ['auto', 'smooth'] }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{ 'scroll-m': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{ 'scroll-mx': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{ 'scroll-my': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{ 'scroll-ms': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{ 'scroll-me': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{ 'scroll-mt': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{ 'scroll-mr': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{ 'scroll-mb': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{ 'scroll-ml': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{ 'scroll-p': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{ 'scroll-px': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{ 'scroll-py': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{ 'scroll-ps': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{ 'scroll-pe': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{ 'scroll-pt': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{ 'scroll-pr': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{ 'scroll-pb': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{ 'scroll-pl': getSpacingWithArbitrary() }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{ snap: ['start', 'end', 'center', 'align-none'] }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{ snap: ['normal', 'always'] }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{ snap: ['none', 'x', 'y', 'both'] }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{ snap: ['mandatory', 'proximity'] }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [\n {\n touch: ['auto', 'none', 'manipulation'],\n },\n ],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [\n {\n 'touch-pan': ['x', 'left', 'right'],\n },\n ],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [\n {\n 'touch-pan': ['y', 'up', 'down'],\n },\n ],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{ select: ['none', 'text', 'all', 'auto'] }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [\n { 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryValue] },\n ],\n // SVG\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{ fill: [colors, 'none'] }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{ stroke: [isLength, isArbitraryLength, isArbitraryNumber] }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{ stroke: [colors, 'none'] }],\n // Accessibility\n /**\n * Screen Readers\n * @see https://tailwindcss.com/docs/screen-readers\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{ 'forced-color-adjust': ['auto', 'none'] }],\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': [\n 'fvn-ordinal',\n 'fvn-slashed-zero',\n 'fvn-figure',\n 'fvn-spacing',\n 'fvn-fraction',\n ],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: [\n 'rounded-s',\n 'rounded-e',\n 'rounded-t',\n 'rounded-r',\n 'rounded-b',\n 'rounded-l',\n 'rounded-ss',\n 'rounded-se',\n 'rounded-ee',\n 'rounded-es',\n 'rounded-tl',\n 'rounded-tr',\n 'rounded-br',\n 'rounded-bl',\n ],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': [\n 'border-w-s',\n 'border-w-e',\n 'border-w-t',\n 'border-w-r',\n 'border-w-b',\n 'border-w-l',\n ],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': [\n 'border-color-s',\n 'border-color-e',\n 'border-color-t',\n 'border-color-r',\n 'border-color-b',\n 'border-color-l',\n ],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n 'scroll-m': [\n 'scroll-mx',\n 'scroll-my',\n 'scroll-ms',\n 'scroll-me',\n 'scroll-mt',\n 'scroll-mr',\n 'scroll-mb',\n 'scroll-ml',\n ],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': [\n 'scroll-px',\n 'scroll-py',\n 'scroll-ps',\n 'scroll-pe',\n 'scroll-pt',\n 'scroll-pr',\n 'scroll-pb',\n 'scroll-pl',\n ],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch'],\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading'],\n },\n } as const satisfies Config<DefaultClassGroupIds, DefaultThemeGroupIds>\n}\n","import { AnyConfig, ConfigExtension } from './types'\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nexport const mergeConfigs = <ClassGroupIds extends string, ThemeGroupIds extends string = never>(\n baseConfig: AnyConfig,\n {\n cacheSize,\n prefix,\n separator,\n experimentalParseClassName,\n extend = {},\n override = {},\n }: ConfigExtension<ClassGroupIds, ThemeGroupIds>,\n) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize)\n overrideProperty(baseConfig, 'prefix', prefix)\n overrideProperty(baseConfig, 'separator', separator)\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName)\n\n for (const configKey in override) {\n overrideConfigProperties(\n baseConfig[configKey as keyof typeof override],\n override[configKey as keyof typeof override],\n )\n }\n\n for (const key in extend) {\n mergeConfigProperties(\n baseConfig[key as keyof typeof extend],\n extend[key as keyof typeof extend],\n )\n }\n\n return baseConfig\n}\n\nconst overrideProperty = <T extends object, K extends keyof T>(\n baseObject: T,\n overrideKey: K,\n overrideValue: T[K] | undefined,\n) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue\n }\n}\n\nconst overrideConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n overrideObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key])\n }\n }\n}\n\nconst mergeConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n mergeObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n const mergeValue = mergeObject[key]\n\n if (mergeValue !== undefined) {\n baseObject[key] = (baseObject[key] || []).concat(mergeValue)\n }\n }\n }\n}\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\nimport { mergeConfigs } from './merge-configs'\nimport { AnyConfig, ConfigExtension, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\n\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\n\nexport const extendTailwindMerge = <\n AdditionalClassGroupIds extends string = never,\n AdditionalThemeGroupIds extends string = never,\n>(\n configExtension:\n | ConfigExtension<\n DefaultClassGroupIds | AdditionalClassGroupIds,\n DefaultThemeGroupIds | AdditionalThemeGroupIds\n >\n | CreateConfigSubsequent,\n ...createConfig: CreateConfigSubsequent[]\n) =>\n typeof configExtension === 'function'\n ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig)\n : createTailwindMerge(\n () => mergeConfigs(getDefaultConfig(), configExtension),\n ...createConfig,\n )\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\n\nexport const twMerge = createTailwindMerge(getDefaultConfig)\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Utility function to merge class names with Tailwind CSS classes\n * Uses clsx for conditional classes and tailwind-merge to handle conflicts\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":"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AAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6CpB,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqKnB,IAAM,iBAAiB;AAAA;AAAA;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":["useState","useCallback","useEffect","useState","jsx","jsxs","useEffect","useState","useRef","useCallback","useRef","jsx","useState","useRef","useCallback","useEffect","handleChange","loadPackageTypes","jsx","jsxs","useState","useRef","useState","useEffect","useCallback","jsx","jsxs","useRef","useState","useCallback","useEffect","jsx","jsxs","useState","useCallback","useEffect","useState","useCallback","useEffect","jsx","jsxs","useState","useCallback","useEffect","useState","useCallback","useEffect","createEvent","jsx","jsxs","useState","useCallback","createEvent","result","useEffect","useState","useCallback","useEffect","tryCatchAsync","startFlow","jsx","jsxs","useState","useCallback","tryCatchAsync","startFlow","useEffect","useState","useCallback","useState","useEffect","useRef","useCallback","jsx","jsx","useState","useRef","useEffect","useCallback","useState","useMemo","jsx","jsx","jsx","useMemo","useState","useState","useEffect","startFlow","jsx","useState","useEffect","startFlow","jsx","jsxs","useState","useCallback","useState","useEffect","useCallback","tryCatchAsync","jsx","jsxs","useState","useCallback","tryCatchAsync","useEffect","useState","useMemo","useCallback","useEffect","useState","useMemo","useState","useCallback","useRef","useState","useRef","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","Fragment","jsx","jsxs","useState","useEffect","useRef","jsx","jsx","jsxs","useState","useRef","useEffect","jsx","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useState","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","path","value","jsx","jsxs","jsx","jsxs","isString","isValueConfig","jsx","jsxs","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","Fragment","jsx","Fragment","jsx","jsxs","HELP_SECTIONS","Fragment","jsx","jsxs","HELP_SECTIONS","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useState","useMemo","jsx","jsxs","jsx","jsxs","useState","useMemo","value","useState","jsx","jsxs","useState","value","jsx","jsxs","useCallback","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","value","React","useState","useEffect","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","React","useEffect","useState","jsx","jsxs","getPropertyStatus","jsx","jsxs","useState","value","jsx","jsx","jsxs","DEFAULT_CONDITION","jsx","jsx","jsxs","DEFAULT_FN","jsx","jsx","jsxs","jsx","jsx","jsxs","DEFAULT_VALIDATE","jsx","useState","useEffect","useRef","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","useState","useEffect","useRef","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsx","useState","useEffect","useRef","jsx","jsxs","jsx","jsxs","entries","useState","useRef","useEffect","useState","useEffect","useRef","jsx","jsxs","jsx","jsxs","entries","useState","useRef","useEffect","useState","useEffect","useRef","jsx","jsxs","source","transform","useState","useRef","useEffect","jsx","jsx","jsxs","useCallback","jsx","useState","useRef","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","isNumber","jsx","jsxs","jsx","jsxs","getSchemaForPath","jsx","jsxs","formatValue","capitalize","Fragment","jsx","jsxs","useState","useMemo","useEffect","jsx","useState","useMemo","useCallback","jsx","jsx","useState","jsx","jsxs","jsx","jsx","jsxs","React","jsx","jsx","MDXProvider","CLASS_PART_SEPARATOR","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getClassGroupId","className","classParts","split","length","shift","getGroupRecursive","getGroupIdForArbitraryProperty","getConflictingClassGroupIds","classGroupId","hasPostfixModifier","conflicts","classPartObject","currentClassPart","nextClassPartObject","nextPart","get","classGroupFromNextClassPart","slice","undefined","validators","classRest","join","find","validator","arbitraryPropertyRegex","test","arbitraryPropertyClassName","exec","property","substring","indexOf","theme","prefix","Map","prefixedClassGroupEntries","getPrefixedClassGroupEntries","Object","entries","classGroups","forEach","classGroup","processClassesRecursively","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","push","key","path","currentClassPartObject","pathPart","has","set","func","classGroupEntries","map","prefixedClassGroup","fromEntries","value","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","createParseClassName","separator","experimentalParseClassName","isSeparatorSingleCharacter","firstSeparatorCharacter","separatorLength","parseClassName","modifiers","bracketDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","hasImportantModifier","startsWith","baseClassName","maybePostfixModifierPosition","sortModifiers","sortedModifiers","unsortedModifiers","modifier","isArbitraryVariant","sort","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","classGroupsInConflict","classNames","trim","result","originalClassName","Boolean","variantModifier","modifierId","classId","includes","conflictGroups","i","group","twJoin","argument","resolvedValue","string","arguments","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","reduce","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","callTailwindMerge","apply","fromTheme","themeGetter","arbitraryValueRegex","fractionRegex","stringLengths","Set","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isLength","isNumber","isArbitraryLength","getIsArbitraryValue","isLengthOnly","Number","isNaN","isArbitraryNumber","isInteger","isPercent","endsWith","isArbitraryValue","isTshirtSize","sizeLabels","isArbitrarySize","isNever","isArbitraryPosition","imageLabels","isArbitraryImage","isImage","isArbitraryShadow","isShadow","isAny","label","testValue","getDefaultConfig","colors","fromTheme","spacing","blur","brightness","borderColor","borderRadius","borderSpacing","borderWidth","contrast","grayscale","hueRotate","invert","gap","gradientColorStops","gradientColorStopPositions","inset","margin","opacity","padding","saturate","scale","sepia","skew","space","translate","getOverscroll","getOverflow","getSpacingWithAutoAndArbitrary","isArbitraryValue","getSpacingWithArbitrary","getLengthWithEmptyAndArbitrary","isLength","isArbitraryLength","getNumberWithAutoAndArbitrary","isNumber","getPositions","getLineStyles","getBlendModes","getAlign","getZeroAndEmpty","getBreaks","getNumberAndArbitrary","cacheSize","separator","theme","isAny","isTshirtSize","isPercent","classGroups","aspect","container","columns","box","display","float","clear","isolation","object","overflow","overscroll","position","start","end","top","right","bottom","left","visibility","z","isInteger","basis","flex","grow","shrink","order","col","span","row","justify","content","items","self","p","px","py","ps","pe","pt","pr","pb","pl","m","mx","my","ms","me","mt","mr","mb","ml","w","screen","h","size","text","font","isArbitraryNumber","tracking","leading","list","placeholder","decoration","indent","align","whitespace","break","hyphens","bg","isArbitraryPosition","repeat","isArbitrarySize","isArbitraryImage","from","via","to","rounded","border","divide","outline","ring","shadow","isArbitraryShadow","filter","table","caption","transition","duration","ease","delay","animate","transform","rotate","origin","accent","appearance","cursor","caret","resize","scroll","snap","touch","select","fill","stroke","sr","conflictingClassGroups","conflictingClassGroupModifiers","twMerge","createTailwindMerge","getDefaultConfig"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/demos/MappingDemo.tsx","../src/components/molecules/code-box.tsx","../src/components/atoms/header.tsx","../src/components/atoms/box.tsx","../src/components/atoms/code.tsx","../src/themes/palenight.ts","../src/themes/lighthouse.ts","../src/themes/index.ts","../src/utils/monaco-decorators.ts","../src/utils/monaco-formatters.ts","../src/hooks/useMonacoHeight.ts","../src/contexts/GridHeightContext.tsx","../src/components/atoms/grid.tsx","../src/components/demos/MappingCode.tsx","../src/components/demos/DestinationDemo.tsx","../src/helpers/capture.ts","../src/components/demos/DestinationInitDemo.tsx","../src/components/demos/PromotionPlayground.tsx","../src/components/molecules/preview.tsx","../src/components/atoms/preview-footer.tsx","../src/components/organisms/browser-box.tsx","../src/components/atoms/button.tsx","../src/components/atoms/button-group.tsx","../src/components/organisms/collector-box.tsx","../src/helpers/destinations.ts","../src/components/organisms/live-code.tsx","../src/components/organisms/config-editor/config-editor-box.tsx","../src/components/organisms/config-editor/config-editor-tabs.tsx","../src/hooks/useMappingState.ts","../src/utils/mapping-path.ts","../src/hooks/useMappingNavigation.ts","../src/utils/path-analyzer.ts","../src/schemas/config-structures/mapping-rule.ts","../src/utils/type-detector.ts","../src/hooks/useTreeState.ts","../src/components/atoms/mapping-breadcrumb.tsx","../src/components/atoms/mapping-confirm-button.tsx","../src/components/molecules/mapping-navigation-header.tsx","../src/components/molecules/config-tree-sidebar.tsx","../src/components/atoms/mapping-input.tsx","../src/components/atoms/mapping-input-with-button.tsx","../src/components/molecules/mapping-entity-pane.tsx","../src/components/atoms/pane-header.tsx","../src/components/atoms/base-mapping-pane.tsx","../src/components/atoms/config-tile.tsx","../src/components/molecules/config-overview-pane.tsx","../src/components/molecules/mapping-policy-overview-pane.tsx","../src/utils/value-display-formatter.ts","../src/components/molecules/mapping-value-config-pane-view.tsx","../src/components/molecules/mapping-value-type-pane-view.tsx","../src/components/molecules/mapping-value-pane-view.tsx","../src/components/molecules/mapping-key-pane-view.tsx","../src/components/molecules/mapping-function-pane-base.tsx","../src/utils/code-normalizer.ts","../src/components/molecules/mapping-condition-pane-view.tsx","../src/components/molecules/mapping-fn-pane-view.tsx","../src/components/molecules/mapping-validate-pane-view.tsx","../src/utils/schema-validation.ts","../src/components/molecules/mapping-name-pane-view.tsx","../src/components/molecules/mapping-batch-pane-view.tsx","../src/components/molecules/mapping-consent-pane-view.tsx","../src/components/atoms/consent-state-tile.tsx","../src/utils/consent-scanner.ts","../src/components/molecules/mapping-set-pane-view.tsx","../src/components/molecules/mapping-loop-pane-view.tsx","../src/components/forms/mapping-form-wrapper.tsx","../src/components/atoms/mapping-string.tsx","../src/components/atoms/mapping-number.tsx","../src/components/atoms/mapping-boolean.tsx","../src/components/atoms/mapping-consent.tsx","../src/components/atoms/mapping-collapsible.tsx","../src/components/atoms/icon-button.tsx","../src/components/molecules/mapping-consent-row.tsx","../src/components/atoms/mapping-value.tsx","../src/components/atoms/field-header.tsx","../src/components/atoms/toggle.tsx","../src/components/atoms/mapping-object-explorer.tsx","../src/components/molecules/property-suggestions.tsx","../src/components/forms/widget-registry.ts","../src/components/atoms/mapping-consent-field.tsx","../src/components/atoms/mapping-condition.tsx","../src/components/atoms/mapping-condition-field.tsx","../src/components/atoms/mapping-fn.tsx","../src/components/atoms/mapping-fn-field.tsx","../src/components/atoms/mapping-key.tsx","../src/components/atoms/mapping-key-field.tsx","../src/components/atoms/mapping-validate.tsx","../src/components/atoms/mapping-validate-field.tsx","../src/components/atoms/mapping-data.tsx","../src/schemas/value-config-schema.ts","../src/utils/clean-form-data.ts","../src/components/atoms/mapping-data-field.tsx","../src/components/atoms/mapping-settings.tsx","../src/components/atoms/mapping-settings-field.tsx","../src/components/atoms/mapping-object-explorer-field.tsx","../src/components/molecules/mapping-map-field.tsx","../src/components/atoms/mapping-map-entry.tsx","../src/components/molecules/mapping-set-field.tsx","../src/components/atoms/mapping-set-entry.tsx","../src/components/molecules/mapping-loop-field.tsx","../src/components/forms/field-registry.ts","../src/components/atoms/mapping-grid.tsx","../src/components/molecules/mapping-map-pane-view-rjsf.tsx","../src/components/atoms/mapping-enum-select.tsx","../src/components/molecules/mapping-enum-pane-view.tsx","../src/components/molecules/mapping-boolean-pane-view.tsx","../src/components/molecules/mapping-primitive-pane-view.tsx","../src/components/molecules/settings-overview-pane.tsx","../src/schemas/rule-properties-schema.ts","../src/components/molecules/mapping-pane.tsx","../src/utils/config-validator.ts","../src/components/molecules/validation-overview-pane.tsx","../src/utils/generic-tree-builder.ts","../src/components/organisms/config-editor/config-editor.tsx","../src/components/molecules/code-snippet.tsx","../src/utils/format-code.ts","../src/components/molecules/property-table.tsx","../src/schemas/config-structures/destination-config.ts","../src/components/atoms/footer.tsx","../src/components/atoms/panel-hints.tsx","../../node_modules/@mdx-js/react/lib/index.js","../src/components/atoms/mdx-code.tsx","../src/providers/MDXProvider.tsx","../../node_modules/clsx/dist/clsx.mjs","../../node_modules/tailwind-merge/src/lib/class-group-utils.ts","../../node_modules/tailwind-merge/src/lib/lru-cache.ts","../../node_modules/tailwind-merge/src/lib/parse-class-name.ts","../../node_modules/tailwind-merge/src/lib/config-utils.ts","../../node_modules/tailwind-merge/src/lib/merge-classlist.ts","../../node_modules/tailwind-merge/src/lib/tw-join.ts","../../node_modules/tailwind-merge/src/lib/create-tailwind-merge.ts","../../node_modules/tailwind-merge/src/lib/from-theme.ts","../../node_modules/tailwind-merge/src/lib/validators.ts","../../node_modules/tailwind-merge/src/lib/default-config.ts","../../node_modules/tailwind-merge/src/lib/merge-configs.ts","../../node_modules/tailwind-merge/src/lib/extend-tailwind-merge.ts","../../node_modules/tailwind-merge/src/lib/tw-merge.ts","../src/lib/utils.ts"],"sourcesContent":["import React, { useState, useCallback, useEffect } from 'react';\nimport { CodeBox } from '../molecules/code-box';\nimport { Grid } from '../atoms/grid';\n\n// NOTE: Monaco Editor configuration (workers, etc.) must be handled by the consuming application.\n// See apps/explorer/demo/main.tsx for an example with Vite\n\nexport interface MappingDemoProps {\n input?: string;\n config?: string;\n labelInput?: string;\n labelConfig?: string;\n labelOutput?: string;\n fn?: (input: string, config: string) => Promise<string>;\n}\n\n/**\n * MappingDemo - Interactive dual-editor component with Monaco Editor\n *\n * A generic component with two editable JSON editors and one output display.\n * Requires a transformation function to process input+config into output.\n *\n * Props:\n * - input: Initial JSON string for left editor (default: '{}')\n * - config: Initial JSON string for middle editor (default: '{}')\n * - labelInput: Label for input editor (default: \"Input\")\n * - labelConfig: Label for config editor (default: \"Config\")\n * - labelOutput: Label for output editor (default: \"Output\")\n * - fn: Transformation function (input, config) => Promise<string> (required for output)\n *\n * Example:\n * ```tsx\n * <MappingDemo\n * input='{ \"name\": \"example\" }'\n * config='{ \"transform\": \"uppercase\" }'\n * labelInput=\"Data\"\n * labelConfig=\"Rules\"\n * labelOutput=\"Result\"\n * fn={async (input, config) => {\n * const data = JSON.parse(input);\n * const rules = JSON.parse(config);\n * // Your transformation logic\n * return JSON.stringify(result, null, 2);\n * }}\n * />\n * ```\n */\n\nexport function MappingDemo({\n input: initialInput = '{}',\n config: initialConfig = '{}',\n labelInput = 'Input',\n labelConfig = 'Config',\n labelOutput = 'Output',\n fn,\n}: MappingDemoProps = {}) {\n const [input, setInput] = useState(initialInput);\n const [config, setConfig] = useState(initialConfig);\n const [output, setOutput] = useState('');\n\n const updateOutput = useCallback(async () => {\n try {\n if (fn) {\n // Use custom function if provided\n const result = await fn(input, config);\n setOutput(result);\n } else {\n // Default behavior: just show the parsed JSON\n setOutput('No transformation function provided');\n }\n } catch (error) {\n setOutput(\n `Error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }, [input, config, fn]);\n\n useEffect(() => {\n const timeoutId = setTimeout(updateOutput, 500);\n return () => clearTimeout(timeoutId);\n }, [updateOutput]);\n\n return (\n <Grid columns={3} rowHeight=\"synced\">\n <CodeBox\n label={labelInput}\n code={input}\n onChange={setInput}\n language=\"json\"\n showFormat\n autoHeight\n />\n <CodeBox\n label={labelConfig}\n code={config}\n onChange={setConfig}\n language=\"json\"\n showFormat\n autoHeight\n />\n <CodeBox\n label={labelOutput}\n code={output}\n disabled\n language=\"json\"\n autoHeight\n />\n </Grid>\n );\n}\n","import React, { useState } from 'react';\nimport { Box } from '../atoms/box';\nimport { Code, type CodeProps } from '../atoms/code';\nimport { useGridHeight } from '../../contexts/GridHeightContext';\n\nexport interface CodeBoxProps extends CodeProps {\n label?: string;\n showCopy?: boolean;\n showFormat?: boolean;\n showHeader?: boolean;\n height?: string | number;\n}\n\n/**\n * CodeBox - Monaco editor wrapped in a Box with header and actions\n *\n * Molecule that combines Box + Code atom + toolbar actions.\n * Use this when you need an editor with header, copy, and format buttons.\n * Use Code atom directly when you need an editor without Box wrapper.\n *\n * Height Behavior:\n *\n * Three height modes:\n * 1. Grid context: Equal row heights (250-450px), fills available space\n * 2. Explicit height prop: Fixed height (e.g., height={600} or height=\"50vh\")\n * 3. Auto-height prop: Dynamically sizes to content (min-max boundaries)\n *\n * @example\n * // Grid context - use default (no autoHeight) for equal row heights\n * <Grid columns={3}>\n * <CodeBox code={event} label=\"Event\" showCopy />\n * <CodeBox code={mapping} label=\"Mapping\" showFormat />\n * <CodeBox code={output} label=\"Output\" disabled />\n * </Grid>\n *\n * @example\n * // Standalone with auto-height - fits content, no blank space\n * <CodeBox\n * code={setupCode}\n * label=\"Setup\"\n * autoHeight={{ min: 100, max: 600 }}\n * disabled\n * />\n *\n * @example\n * // Explicit height override\n * <CodeBox\n * code={largeConfig}\n * label=\"Configuration\"\n * height={600}\n * showFormat\n * />\n */\nexport function CodeBox({\n code,\n language = 'javascript',\n label = 'Code',\n onChange,\n disabled = false,\n showCopy = false,\n showFormat = false,\n showHeader = true,\n height,\n className,\n autoHeight,\n ...codeProps\n}: CodeBoxProps) {\n const [copied, setCopied] = useState(false);\n const gridContext = useGridHeight();\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n };\n\n const handleFormat = () => {\n if (!onChange || disabled || language !== 'json') return;\n\n try {\n const parsed = JSON.parse(code);\n const formatted = JSON.stringify(parsed, null, 2);\n onChange(formatted);\n } catch (e) {\n // Invalid JSON, do nothing\n }\n };\n\n // Build header actions\n const actions = (\n <>\n {showFormat && !disabled && language === 'json' && (\n <button\n className=\"elb-explorer-btn\"\n onClick={handleFormat}\n title=\"Format JSON\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n </button>\n )}\n {showCopy && (\n <button\n className=\"elb-explorer-btn\"\n onClick={handleCopy}\n title={copied ? 'Copied!' : 'Copy to clipboard'}\n >\n {copied ? (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n ) : (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n )}\n </button>\n )}\n </>\n );\n\n const boxStyle: React.CSSProperties = {};\n if (height !== undefined) {\n boxStyle.height = typeof height === 'number' ? `${height}px` : height;\n } else if (gridContext?.syncedHeight) {\n boxStyle.height = `${gridContext.syncedHeight}px`;\n }\n\n const useContentHeight = !!autoHeight || !!gridContext?.enabled;\n const boxClassName = `${className || ''} ${useContentHeight ? 'elb-box--auto-height' : ''}`.trim();\n\n return (\n <Box\n header={label}\n headerActions={actions}\n className={boxClassName}\n style={boxStyle}\n showHeader={showHeader}\n >\n <Code\n code={code}\n language={language}\n onChange={onChange}\n disabled={disabled}\n autoHeight={autoHeight}\n {...codeProps}\n />\n </Box>\n );\n}\n","import React from 'react';\n\nexport interface HeaderProps {\n label: string;\n children?: React.ReactNode;\n}\n\nexport function Header({ label, children }: HeaderProps) {\n return (\n <div className=\"elb-explorer-header\">\n <span className=\"elb-explorer-label\">{label}</span>\n {children}\n </div>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Header } from './header';\n\nexport interface BoxProps {\n header: string;\n headerActions?: React.ReactNode;\n footer?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n minHeight?: number | string;\n maxHeight?: number | string;\n tiny?: boolean;\n resizable?: boolean;\n showHeader?: boolean; // Hide header (default: true)\n}\n\n/**\n * Box - Container atom component\n *\n * Provides a consistent box container with header and content area.\n * Used across all explorer components for consistent styling.\n *\n * Height behavior:\n * - Default: minHeight 100px, grows as needed\n * - tiny prop: sets minHeight to 100px explicitly\n * - Custom minHeight/maxHeight: override defaults\n * - In Grid: fills row height (equal heights per row)\n *\n * @example\n * <Box header=\"Preview\">\n * <Preview html={html} css={css} />\n * </Box>\n *\n * @example\n * <Box header=\"Code\" minHeight={200} maxHeight={600}>\n * <CodeBox ... />\n * </Box>\n */\nexport function Box({\n header,\n headerActions,\n footer,\n children,\n className = '',\n style,\n minHeight,\n maxHeight,\n tiny = false,\n resizable = false,\n showHeader = true,\n}: BoxProps) {\n const boxStyle: React.CSSProperties = { ...style };\n\n if (tiny) {\n boxStyle.height = 'auto';\n boxStyle.minHeight =\n minHeight !== undefined\n ? typeof minHeight === 'number'\n ? `${minHeight}px`\n : minHeight\n : '100px';\n } else if (minHeight !== undefined) {\n boxStyle.minHeight =\n typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n }\n\n if (maxHeight !== undefined) {\n boxStyle.maxHeight =\n typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n }\n\n if (resizable) {\n boxStyle.resize = 'vertical';\n boxStyle.overflow = 'auto';\n }\n\n return (\n <div className={`elb-explorer elb-explorer-box ${className}`} style={boxStyle}>\n {showHeader && <Header label={header}>{headerActions}</Header>}\n <div className=\"elb-explorer-content\">{children}</div>\n {footer && <div className=\"elb-explorer-footer\">{footer}</div>}\n </div>\n );\n}\n","import React, {\n type ComponentType,\n useEffect,\n useState,\n useRef,\n useCallback,\n} from 'react';\nimport { Editor, loader } from '@monaco-editor/react';\nimport type { editor } from 'monaco-editor';\nimport { registerAllThemes } from '../../themes';\nimport { registerWalkerOSTypes } from '../../utils/monaco-types';\nimport {\n applyDataElbDecorations,\n registerDataElbStyles,\n} from '../../utils/monaco-decorators';\nimport { registerFormatters } from '../../utils/monaco-formatters';\nimport { useMonacoHeight } from '../../hooks/useMonacoHeight';\nimport { useGridHeight } from '../../contexts/GridHeightContext';\n\n// Monaco Editor configuration\n// NOTE: MonacoEnvironment.getWorker and loader.config() should be configured\n// by the consuming application. See examples in the explorer app's main.tsx\nimport * as monaco from 'monaco-editor';\n\nexport interface CodeProps {\n code: string;\n language?: string;\n onChange?: (code: string) => void;\n disabled?: boolean;\n lineNumbers?: boolean;\n folding?: boolean;\n wordWrap?: boolean;\n className?: string;\n beforeMount?: (monaco: typeof import('monaco-editor')) => void;\n onMount?: (editor: editor.IStandaloneCodeEditor) => void;\n autoHeight?: boolean | { min?: number; max?: number };\n fontSize?: number;\n packages?: string[];\n}\n\n/**\n * Code - Pure Monaco editor atom\n *\n * Height Management:\n * Two modes controlled by `autoHeight` prop:\n *\n * 1. Default (autoHeight=false): height=\"100%\" - fills parent container\n * - Uses flex: 1 + min-height: 0 for proper flex overflow containment\n * - Monaco set to height=\"100%\" to fill container\n * - automaticLayout: true + ResizeObserver for reliable resize detection\n * - Use in Grid (equal heights) and Flex contexts (fill parent)\n *\n * 2. Auto-height (autoHeight=true): Dynamically sizes to content\n * - Uses Monaco's getContentHeight() API for accurate content measurement\n * - Respects min/max boundaries (default: 100-600px)\n * - Updates automatically when content changes\n * - Use in standalone contexts (docs) to eliminate blank space\n *\n * @example\n * // Grid context - use default height=\"100%\" for equal row heights\n * <Grid columns={3}>\n * <CodeBox code={event} />\n * <CodeBox code={mapping} />\n * </Grid>\n *\n * @example\n * // Standalone context - use autoHeight to fit content\n * <CodeBox\n * code={shortExample}\n * autoHeight={{ min: 100, max: 600 }}\n * />\n */\nexport function Code({\n code,\n language = 'javascript',\n onChange,\n disabled = false,\n lineNumbers = false,\n folding = false,\n wordWrap = false,\n className,\n beforeMount,\n onMount,\n autoHeight,\n fontSize = 13,\n packages,\n}: CodeProps) {\n const [monacoTheme, setMonacoTheme] = useState('vs-light');\n const decorationsCleanupRef = useRef<(() => void) | null>(null);\n const monacoRef = useRef<typeof import('monaco-editor') | null>(null);\n const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const gridContext = useGridHeight();\n const boxIdRef = useRef<number | null>(null);\n\n if (gridContext?.enabled && boxIdRef.current === null) {\n boxIdRef.current = gridContext.getBoxId();\n }\n\n const handleHeightChange = useCallback(\n (height: number) => {\n if (gridContext?.enabled && boxIdRef.current !== null) {\n gridContext.registerBox(boxIdRef.current, height);\n }\n },\n [gridContext],\n );\n\n useEffect(() => {\n return () => {\n if (gridContext?.enabled && boxIdRef.current !== null) {\n gridContext.unregisterBox(boxIdRef.current);\n }\n };\n }, [gridContext]);\n\n const heightConfig = typeof autoHeight === 'object' ? autoHeight : {};\n const [calculatedHeight, registerEditor] = useMonacoHeight({\n enabled: !!autoHeight || !!gridContext?.enabled,\n minHeight: heightConfig.min ?? (gridContext?.enabled ? 1 : 20),\n maxHeight: heightConfig.max ?? 600,\n defaultHeight: gridContext?.enabled ? 250 : 400,\n onHeightChange: handleHeightChange,\n });\n\n // Register data-elb styles on mount\n useEffect(() => {\n registerDataElbStyles();\n }, []);\n\n // Helper: Find data-theme attribute from closest ancestor or document\n const getDataTheme = useCallback((): string | null => {\n // Check container ref first (closest to Monaco)\n if (containerRef.current) {\n const closest = containerRef.current.closest('[data-theme]');\n if (closest) {\n return closest.getAttribute('data-theme');\n }\n }\n\n // Fall back to document root\n return document.documentElement.getAttribute('data-theme');\n }, []);\n\n // Theme detection\n useEffect(() => {\n const checkTheme = () => {\n const dataTheme = getDataTheme();\n const isDark =\n dataTheme === 'dark' ||\n (dataTheme === null &&\n window.matchMedia('(prefers-color-scheme: dark)').matches);\n const newTheme = isDark ? 'elbTheme-dark' : 'elbTheme-light';\n\n setMonacoTheme(newTheme);\n };\n\n checkTheme();\n\n const observer = new MutationObserver(() => {\n checkTheme();\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => {\n checkTheme();\n };\n mediaQuery.addEventListener('change', handleChange);\n\n return () => {\n observer.disconnect();\n mediaQuery.removeEventListener('change', handleChange);\n };\n }, [getDataTheme]);\n\n // ResizeObserver for container size changes\n // Complements automaticLayout: true for more reliable detection\n // Handles cases where Grid constraints change or parent container resizes\n useEffect(() => {\n const editor = editorRef.current;\n const container = containerRef.current;\n\n if (!editor || !container) return;\n\n const resizeObserver = new ResizeObserver(() => {\n // Debounce layout calls to prevent excessive updates\n requestAnimationFrame(() => {\n editor.layout();\n });\n });\n\n resizeObserver.observe(container);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n const handleChange = (value: string | undefined) => {\n if (onChange && value !== undefined) {\n onChange(value);\n }\n };\n\n const handleBeforeMount = async (monaco: typeof import('monaco-editor')) => {\n monacoRef.current = monaco;\n\n if (beforeMount) {\n beforeMount(monaco);\n return;\n }\n\n registerAllThemes(monaco);\n registerFormatters(monaco);\n\n if (packages && packages.length > 0) {\n registerWalkerOSTypes(monaco);\n\n const { loadPackageTypes } = await import('../../utils/monaco-types');\n for (const pkg of packages) {\n if (pkg !== '@walkeros/core') {\n await loadPackageTypes(monaco, { package: pkg }).catch((err) => {\n console.warn(`Failed to load types for ${pkg}:`, err);\n });\n }\n }\n }\n\n const dataTheme = getDataTheme();\n const isDark =\n dataTheme === 'dark' ||\n (dataTheme === null &&\n window.matchMedia('(prefers-color-scheme: dark)').matches);\n const themeName = isDark ? 'elbTheme-dark' : 'elbTheme-light';\n\n monaco.editor.setTheme(themeName);\n };\n\n const MonacoEditor = Editor as ComponentType<{\n height: string;\n language: string;\n value: string;\n onChange: (value: string | undefined) => void;\n beforeMount?: (monaco: typeof import('monaco-editor')) => void;\n onMount?: (editor: editor.IStandaloneCodeEditor) => void;\n theme: string;\n options: Record<string, unknown>;\n }>;\n\n const handleEditorMount = (monacoEditor: editor.IStandaloneCodeEditor) => {\n editorRef.current = monacoEditor;\n\n // Register with height hook if auto-height or grid context is enabled\n if (autoHeight || gridContext?.enabled) {\n registerEditor(monacoEditor);\n }\n\n // Apply data-elb decorations for HTML\n if (language === 'html' && monacoRef.current) {\n decorationsCleanupRef.current = applyDataElbDecorations(\n monacoEditor,\n monacoRef.current,\n );\n }\n\n // Initial layout call after mount\n requestAnimationFrame(() => {\n monacoEditor.layout();\n });\n\n if (onMount) {\n onMount(monacoEditor);\n }\n };\n\n // Cleanup\n useEffect(() => {\n return () => {\n if (decorationsCleanupRef.current) {\n decorationsCleanupRef.current();\n }\n };\n }, []);\n\n // Choose height strategy: auto-calculated or fill parent\n // Note: When grid context is enabled with synced mode, CodeBox applies\n // syncedHeight to the Box container. Monaco should use calculatedHeight\n // (content-only) here, not syncedHeight (which includes header + border).\n const monacoHeight =\n autoHeight || gridContext?.enabled ? `${calculatedHeight}px` : '100%';\n\n // Add modifier class when using auto-height or synced height\n const useContentHeight = !!autoHeight || !!gridContext?.enabled;\n const codeClassName =\n `elb-code ${useContentHeight ? 'elb-code--auto-height' : ''} ${className || ''}`.trim();\n\n return (\n <div className={codeClassName} ref={containerRef}>\n <MonacoEditor\n height={monacoHeight}\n language={language}\n value={code}\n onChange={handleChange}\n beforeMount={handleBeforeMount}\n onMount={handleEditorMount}\n theme={monacoTheme}\n options={{\n readOnly: disabled || !onChange,\n minimap: { enabled: false },\n fontSize: fontSize,\n lineHeight: Math.round(fontSize * 1.5),\n padding: 0,\n lineNumbers: lineNumbers ? 'on' : 'off',\n lineNumbersMinChars: 0,\n glyphMargin: false,\n folding: folding,\n lineDecorationsWidth: 0,\n scrollBeyondLastLine: false,\n automaticLayout: true,\n tabSize: 2,\n wordWrap: wordWrap ? 'on' : 'off',\n fixedOverflowWidgets: true,\n overviewRulerLanes: 0,\n renderLineHighlight: 'none',\n 'bracketPairColorization.enabled': false,\n guides: {\n bracketPairs: false,\n bracketPairsHorizontal: false,\n highlightActiveBracketPair: false,\n indentation: false, // Disable indentation guide lines\n },\n scrollbar: {\n vertical: 'auto',\n horizontal: 'auto',\n alwaysConsumeMouseWheel: false,\n },\n // Cursor and selection behavior\n cursorBlinking: 'blink', // Make cursor blink visibly\n cursorStyle: 'line', // Use line cursor (most visible)\n cursorWidth: 2, // Make cursor 2px wide for better visibility\n cursorSmoothCaretAnimation: 'off', // Disable smooth cursor animation\n selectionHighlight: false, // Disable auto-highlighting of selected text occurrences\n occurrencesHighlight: 'off', // Disable highlighting matching words\n selectOnLineNumbers: false, // Don't select line when clicking line numbers\n wordBasedSuggestions: 'off', // Reduce auto-completion interference\n quickSuggestions: false, // Disable quick suggestions popup\n }}\n />\n </div>\n );\n}\n","/**\n * Palenight Theme for Monaco Editor\n *\n * Dark theme for walkerOS Explorer matching Prism's palenight theme.\n * Aligned with website documentation syntax highlighting for consistency.\n *\n * Token Color Mappings (Matching Prism Palenight):\n * - comment: #697098 - gray, italic\n * - string/inserted: #c3e88d - green\n * - number: #f78c6c - orange\n * - builtin/char/constant/function: #82aaff - blue\n * - punctuation/delimiter: #c792ea - purple\n * - variable: #bfc7d5 - light gray\n * - class-name: #ffcb6b - yellow/gold\n * - attr-name: #c3e88d - green (matching string color)\n * - tag/deleted: #ff5572 - red/pink\n * - operator: #89ddff - cyan\n * - boolean: #ff5874 - red\n * - keyword: #c084fc - bright purple, italic\n * - doctype: #c084fc - purple, italic\n * - namespace: #b2ccd6 - blue-gray\n * - url: #dddddd - white\n */\n\nimport type { editor } from 'monaco-editor';\n\nexport const palenightTheme: editor.IStandaloneThemeData = {\n base: 'vs-dark',\n inherit: true,\n rules: [\n // Comments\n { token: 'comment', foreground: '697098', fontStyle: 'italic' },\n { token: 'comment.block', foreground: '697098', fontStyle: 'italic' },\n { token: 'comment.line', foreground: '697098', fontStyle: 'italic' },\n\n // Strings - green matching Prism palenight\n { token: 'string', foreground: 'c3e88d' },\n { token: 'string.quoted', foreground: 'c3e88d' },\n { token: 'string.template', foreground: 'c3e88d' },\n { token: 'string.regexp', foreground: '89ddff' },\n\n // Language-specific strings (Monaco uses these exact token names)\n { token: 'string.value.json', foreground: 'c3e88d' },\n { token: 'string.json', foreground: 'c3e88d' },\n { token: 'string.html', foreground: 'c3e88d' },\n { token: 'string.css', foreground: 'c3e88d' },\n { token: 'string.js', foreground: 'c3e88d' },\n { token: 'string.ts', foreground: 'c3e88d' },\n\n // Numbers\n { token: 'number', foreground: 'f78c6c' },\n { token: 'number.hex', foreground: 'f78c6c' },\n { token: 'number.binary', foreground: 'f78c6c' },\n { token: 'number.octal', foreground: 'f78c6c' },\n { token: 'number.float', foreground: 'f78c6c' },\n\n // Keywords - brighter purple/magenta\n { token: 'keyword', foreground: 'c084fc', fontStyle: 'italic' },\n { token: 'keyword.control', foreground: 'c084fc', fontStyle: 'italic' },\n { token: 'keyword.operator', foreground: '89ddff' },\n { token: 'keyword.other', foreground: 'c084fc' },\n\n // Operators - cyan matching Prism palenight\n { token: 'operator', foreground: '89ddff' },\n { token: 'operators', foreground: '89ddff' },\n\n // Functions\n { token: 'function', foreground: '82aaff' },\n { token: 'identifier.function', foreground: '82aaff' },\n { token: 'support.function', foreground: '82aaff' },\n { token: 'entity.name.function', foreground: '82aaff' },\n\n // Types & Classes\n { token: 'type', foreground: 'ffcb6b' },\n { token: 'type.identifier', foreground: 'ffcb6b' },\n { token: 'entity.name.type', foreground: 'ffcb6b' },\n { token: 'entity.name.class', foreground: 'ffcb6b' },\n { token: 'support.type', foreground: 'ffcb6b' },\n { token: 'support.class', foreground: 'ffcb6b' },\n\n // Variables\n { token: 'variable', foreground: 'bfc7d5' },\n { token: 'variable.name', foreground: 'bfc7d5' },\n { token: 'variable.parameter', foreground: 'bfc7d5' },\n\n // Constants & Built-ins\n { token: 'constant', foreground: '82aaff' },\n { token: 'constant.language', foreground: 'ff5874' },\n { token: 'constant.numeric', foreground: 'f78c6c' },\n { token: 'constant.character', foreground: '82aaff' },\n { token: 'support.constant', foreground: '82aaff' },\n\n // Booleans\n { token: 'constant.language.boolean', foreground: 'ff5874' },\n { token: 'keyword.constant.boolean', foreground: 'ff5874' },\n\n // Delimiters & Punctuation - purple matching Prism palenight\n { token: 'delimiter', foreground: 'c792ea' },\n { token: 'delimiter.bracket', foreground: 'c792ea' },\n { token: 'delimiter.parenthesis', foreground: 'c792ea' },\n { token: 'delimiter.square', foreground: 'c792ea' },\n { token: 'punctuation', foreground: 'c792ea' },\n\n // Tags (HTML/XML/JSX)\n { token: 'tag', foreground: 'ff5572' },\n { token: 'meta.tag', foreground: 'ff5572' },\n { token: 'entity.name.tag', foreground: 'ff5572' },\n\n // Tag Attributes (using string color for consistency with how Prism treats attributes)\n { token: 'attribute.name', foreground: 'c3e88d' },\n { token: 'entity.other.attribute-name', foreground: 'c3e88d' },\n\n // Namespaces\n { token: 'namespace', foreground: 'b2ccd6' },\n { token: 'entity.name.namespace', foreground: 'b2ccd6' },\n\n // URLs\n { token: 'markup.underline.link', foreground: 'dddddd' },\n\n // Doctype\n {\n token: 'meta.tag.sgml.doctype',\n foreground: 'c084fc',\n fontStyle: 'italic',\n },\n\n // JSON Keys - Monaco creates special tokens for JSON keys\n // Use light gray for property names (distinct from string values)\n { token: 'support.type.property-name', foreground: 'bfc7d5' },\n { token: 'support.type.property-name.json', foreground: 'bfc7d5' },\n { token: 'string.key.json', foreground: 'bfc7d5' },\n\n // Markdown\n { token: 'markup.bold', fontStyle: 'bold' },\n { token: 'markup.italic', fontStyle: 'italic' },\n { token: 'markup.heading', foreground: 'c084fc', fontStyle: 'bold' },\n\n // Language-Specific: JavaScript/TypeScript\n { token: 'variable.parameter.ts', foreground: 'bfc7d5' },\n { token: 'variable.parameter.js', foreground: 'bfc7d5' },\n { token: 'support.type.primitive.ts', foreground: 'ffcb6b' },\n { token: 'support.type.primitive.js', foreground: 'ffcb6b' },\n { token: 'entity.name.type.ts', foreground: 'ffcb6b' },\n { token: 'entity.name.type.js', foreground: 'ffcb6b' },\n { token: 'meta.type.annotation.ts', foreground: 'ffcb6b' },\n { token: 'keyword.operator.type.ts', foreground: '89ddff' },\n\n // Language-Specific: HTML\n { token: 'entity.name.tag.html', foreground: 'bfc7d5' },\n { token: 'tag.html', foreground: 'bfc7d5' },\n { token: 'entity.other.attribute-name.html', foreground: 'bfc7d5' },\n { token: 'attribute.name.html', foreground: 'bfc7d5' },\n { token: 'attribute.value.html', foreground: 'c3e88d' },\n { token: 'delimiter.html', foreground: 'c792ea' },\n { token: 'comment.html', foreground: '697098', fontStyle: 'italic' },\n { token: 'meta.tag.html', foreground: 'c792ea' },\n { token: 'punctuation.definition.tag.html', foreground: 'c792ea' },\n\n // Language-Specific: CSS\n { token: 'entity.name.tag.css', foreground: 'ff5572' },\n { token: 'entity.other.attribute-name.class.css', foreground: 'ffcb6b' },\n { token: 'entity.other.attribute-name.id.css', foreground: '82aaff' },\n { token: 'support.type.property-name.css', foreground: 'c084fc' },\n { token: 'support.constant.property-value.css', foreground: 'f78c6c' },\n { token: 'keyword.other.unit.css', foreground: 'f78c6c' },\n\n // Errors & Warnings\n { token: 'invalid', foreground: 'ff5572' },\n { token: 'invalid.illegal', foreground: 'ff5572' },\n { token: 'invalid.deprecated', foreground: 'f78c6c' },\n ],\n colors: {\n // Editor Background - transparent, let box handle background\n // Falls back to CSS var(--bg-input) in _code.scss\n 'editor.background': '#00000000', // Transparent\n 'editor.foreground': '#bfc7d5',\n\n // Editor Lines - transparent to inherit box background\n 'editor.lineHighlightBackground': '#00000000', // Transparent\n 'editorLineNumber.foreground': '#676E95',\n 'editorLineNumber.activeForeground': '#c084fc',\n\n // Editor Cursor & Selection\n 'editorCursor.foreground': '#c084fc', // Purple cursor for dark theme\n 'editor.selectionBackground': '#00000000',\n 'editor.inactiveSelectionBackground': '#00000000',\n 'editor.selectionHighlightBackground': '#00000000',\n\n // Editor Gutter - transparent to inherit box background\n 'editorGutter.background': '#00000000', // Transparent\n 'editorGutter.modifiedBackground': '#82aaff',\n 'editorGutter.addedBackground': '#c3e88d',\n 'editorGutter.deletedBackground': '#ff5572',\n\n // Editor Widgets\n 'editorWidget.background': '#1e1e2e',\n 'editorWidget.border': '#676E95',\n 'editorSuggestWidget.background': '#1e1e2e',\n 'editorSuggestWidget.border': '#676E95',\n 'editorSuggestWidget.selectedBackground': '#717CB440',\n\n // Sticky Scroll - CRITICAL: Must have solid background to prevent transparency when scrolling\n 'editorStickyScroll.background': '#1e1e2e',\n 'editorStickyScroll.border': '#676E95',\n\n // Hover Widgets - Tooltips and hover information\n 'editorHoverWidget.background': '#1e1e2e',\n 'editorHoverWidget.border': '#676E95',\n 'editorHoverWidget.statusBarBackground': '#676E95',\n\n // Inline Hints - Type hints, parameter hints, inline suggestions\n 'editorInlineHint.background': '#292d3e',\n 'editorInlineHint.foreground': '#676E95',\n\n // Code Lens - Reference counts, test indicators\n 'editorCodeLens.foreground': '#697098',\n\n // Ghost Text - Autocomplete suggestions shown inline\n 'editorGhostText.foreground': '#676E9540',\n\n // Editor Whitespace & Indentation\n 'editorWhitespace.foreground': '#676E9540',\n 'editorIndentGuide.background': '#676E9520',\n 'editorIndentGuide.activeBackground': '#676E95',\n\n // Scrollbar\n 'scrollbarSlider.background': '#676E9530',\n 'scrollbarSlider.hoverBackground': '#676E9550',\n 'scrollbarSlider.activeBackground': '#676E9570',\n\n // Bracket Matching\n 'editorBracketMatch.background': '#676E9540',\n 'editorBracketMatch.border': '#676E95',\n\n // Find/Replace\n 'editor.findMatchBackground': '#717CB440',\n 'editor.findMatchHighlightBackground': '#676E9530',\n 'editor.findRangeHighlightBackground': '#676E9520',\n\n // Minimap\n 'minimap.background': '#292d3e',\n 'minimap.selectionHighlight': '#717CB440',\n 'minimap.findMatchHighlight': '#717CB440',\n\n // Overview Ruler\n 'editorOverviewRuler.border': '#676E9520',\n 'editorOverviewRuler.modifiedForeground': '#82aaff',\n 'editorOverviewRuler.addedForeground': '#c3e88d',\n 'editorOverviewRuler.deletedForeground': '#ff5572',\n\n // Peek View\n 'peekView.border': '#676E95',\n 'peekViewEditor.background': '#1e1e2e',\n 'peekViewResult.background': '#1e1e2e',\n 'peekViewTitle.background': '#1e1e2e',\n\n // Diff Editor\n 'diffEditor.insertedTextBackground': '#c3e88d20',\n 'diffEditor.removedTextBackground': '#ff557220',\n },\n};\n\n/**\n * Register the palenight theme with Monaco Editor\n * Call this function before creating any editor instances\n */\nexport function registerPalenightTheme(monaco: typeof import('monaco-editor')) {\n monaco.editor.defineTheme('elbTheme-dark', palenightTheme);\n}\n","/**\n * Lighthouse Theme for Monaco Editor\n *\n * Custom light theme for walkerOS Explorer, designed to complement the Palenight dark theme.\n * Based on VS Code Light+ with adjustments for optimal readability and brand consistency.\n *\n * Color Palette Strategy:\n * - Comments: Muted green (#6A737D) for subtle annotations\n * - Strings: Dark green (#22863A) for clear text distinction\n * - Numbers: Brick red (#D73A49) for numeric emphasis\n * - Functions: Deep blue (#005CC5) for callable identification\n * - Keywords: Purple (#6F42C1) maintaining syntax hierarchy\n * - Variables: Near black (#24292E) for primary code elements\n * - Types/Classes: Dark gold (#B08800) for type definitions\n * - Tags: Red (#D73A49) for HTML/JSX elements\n * - Operators: Teal (#0086B3) for logical operations\n * - Booleans: Red (#D73A49) for literal values\n */\n\nimport type { editor } from 'monaco-editor';\n\nexport const lighthouseTheme: editor.IStandaloneThemeData = {\n base: 'vs',\n inherit: true,\n rules: [\n // Comments\n { token: 'comment', foreground: '6A737D', fontStyle: 'italic' },\n { token: 'comment.block', foreground: '6A737D', fontStyle: 'italic' },\n { token: 'comment.line', foreground: '6A737D', fontStyle: 'italic' },\n\n // Strings - dark green for good contrast on white\n { token: 'string', foreground: '22863A' },\n { token: 'string.quoted', foreground: '22863A' },\n { token: 'string.template', foreground: '22863A' },\n { token: 'string.regexp', foreground: '032F62' },\n\n // Language-specific strings (Monaco uses these exact token names)\n { token: 'string.value.json', foreground: '22863A' },\n { token: 'string.json', foreground: '22863A' },\n { token: 'string.html', foreground: '22863A' },\n { token: 'string.css', foreground: '22863A' },\n { token: 'string.js', foreground: '22863A' },\n { token: 'string.ts', foreground: '22863A' },\n\n // Numbers - dark red/burgundy for contrast\n { token: 'number', foreground: 'D73A49' },\n { token: 'number.hex', foreground: 'D73A49' },\n { token: 'number.binary', foreground: 'D73A49' },\n { token: 'number.octal', foreground: 'D73A49' },\n { token: 'number.float', foreground: 'D73A49' },\n\n // Keywords - dark purple for contrast\n { token: 'keyword', foreground: '6F42C1', fontStyle: 'italic' },\n { token: 'keyword.control', foreground: '6F42C1', fontStyle: 'italic' },\n { token: 'keyword.operator', foreground: '0086B3' },\n { token: 'keyword.other', foreground: '6F42C1' },\n\n // Operators - cyan (brand color)\n { token: 'operator', foreground: '01b5e2' },\n { token: 'operators', foreground: '01b5e2' },\n\n // Functions\n { token: 'function', foreground: '005CC5' },\n { token: 'identifier.function', foreground: '005CC5' },\n { token: 'support.function', foreground: '005CC5' },\n { token: 'entity.name.function', foreground: '005CC5' },\n\n // Types & Classes\n { token: 'type', foreground: 'B08800' },\n { token: 'type.identifier', foreground: 'B08800' },\n { token: 'entity.name.type', foreground: 'B08800' },\n { token: 'entity.name.class', foreground: 'B08800' },\n { token: 'support.type', foreground: 'B08800' },\n { token: 'support.class', foreground: 'B08800' },\n\n // Variables\n { token: 'variable', foreground: '24292E' },\n { token: 'variable.name', foreground: '24292E' },\n { token: 'variable.parameter', foreground: '24292E' },\n\n // Constants & Built-ins\n { token: 'constant', foreground: '005CC5' },\n { token: 'constant.language', foreground: 'ef4444' },\n { token: 'constant.numeric', foreground: 'fb923c' },\n { token: 'constant.character', foreground: '005CC5' },\n { token: 'support.constant', foreground: '005CC5' },\n\n // Booleans - red/pink accent (matching screenshot)\n { token: 'constant.language.boolean', foreground: 'ef4444' },\n { token: 'keyword.constant.boolean', foreground: 'ef4444' },\n\n // Delimiters & Punctuation\n { token: 'delimiter', foreground: '24292E' },\n { token: 'delimiter.bracket', foreground: '24292E' },\n { token: 'delimiter.parenthesis', foreground: '24292E' },\n { token: 'delimiter.square', foreground: '24292E' },\n { token: 'punctuation', foreground: '24292E' },\n\n // Tags (HTML/XML/JSX)\n { token: 'tag', foreground: 'D73A49' },\n { token: 'meta.tag', foreground: 'D73A49' },\n { token: 'entity.name.tag', foreground: 'D73A49' },\n\n // Tag Attributes (using string color for consistency with Prism)\n { token: 'attribute.name', foreground: '22863A' },\n { token: 'entity.other.attribute-name', foreground: '22863A' },\n\n // Namespaces\n { token: 'namespace', foreground: '6F42C1' },\n { token: 'entity.name.namespace', foreground: '6F42C1' },\n\n // URLs\n { token: 'markup.underline.link', foreground: '005CC5' },\n\n // Doctype\n {\n token: 'meta.tag.sgml.doctype',\n foreground: '6A737D',\n fontStyle: 'italic',\n },\n\n // JSON Keys - Force string color for consistency with Prism behavior\n { token: 'support.type.property-name', foreground: '22863A' },\n { token: 'support.type.property-name.json', foreground: '22863A' },\n { token: 'string.key.json', foreground: '22863A' },\n\n // Markdown\n { token: 'markup.bold', fontStyle: 'bold' },\n { token: 'markup.italic', fontStyle: 'italic' },\n { token: 'markup.heading', foreground: '6F42C1', fontStyle: 'bold' },\n\n // Language-Specific: JavaScript/TypeScript\n { token: 'variable.parameter.ts', foreground: '24292E' },\n { token: 'variable.parameter.js', foreground: '24292E' },\n { token: 'support.type.primitive.ts', foreground: 'B08800' },\n { token: 'support.type.primitive.js', foreground: 'B08800' },\n { token: 'entity.name.type.ts', foreground: 'B08800' },\n { token: 'entity.name.type.js', foreground: 'B08800' },\n { token: 'meta.type.annotation.ts', foreground: 'B08800' },\n { token: 'keyword.operator.type.ts', foreground: '0086B3' },\n\n // Language-Specific: HTML\n { token: 'entity.name.tag.html', foreground: '24292E' },\n { token: 'tag.html', foreground: '24292E' },\n { token: 'entity.other.attribute-name.html', foreground: '24292E' },\n { token: 'attribute.name.html', foreground: '24292E' },\n { token: 'attribute.value.html', foreground: '22863A' },\n { token: 'delimiter.html', foreground: '24292E' },\n { token: 'comment.html', foreground: '6A737D', fontStyle: 'italic' },\n { token: 'meta.tag.html', foreground: '24292E' },\n { token: 'punctuation.definition.tag.html', foreground: '24292E' },\n\n // Language-Specific: CSS\n { token: 'entity.name.tag.css', foreground: 'D73A49' },\n { token: 'entity.other.attribute-name.class.css', foreground: 'B08800' },\n { token: 'entity.other.attribute-name.id.css', foreground: '005CC5' },\n { token: 'support.type.property-name.css', foreground: '6F42C1' },\n { token: 'support.constant.property-value.css', foreground: 'D73A49' },\n { token: 'keyword.other.unit.css', foreground: 'D73A49' },\n\n // Errors & Warnings\n { token: 'invalid', foreground: 'CB2431' },\n { token: 'invalid.illegal', foreground: 'CB2431' },\n { token: 'invalid.deprecated', foreground: 'D73A49' },\n ],\n colors: {\n // Editor Background - transparent, let box handle background\n 'editor.background': '#00000000', // Transparent\n 'editor.foreground': '#24292E',\n\n // Editor Lines - transparent to inherit box background\n 'editor.lineHighlightBackground': '#00000000', // Transparent\n 'editorLineNumber.foreground': '#1B1F2380',\n 'editorLineNumber.activeForeground': '#6F42C1',\n\n // Editor Cursor & Selection\n 'editorCursor.foreground': '#6F42C1', // Purple cursor for light theme\n 'editor.selectionBackground': '#00000000',\n 'editor.inactiveSelectionBackground': '#00000000',\n 'editor.selectionHighlightBackground': '#00000000',\n\n // Editor Gutter - transparent to inherit box background\n 'editorGutter.background': '#00000000', // Transparent\n 'editorGutter.modifiedBackground': '#005CC5',\n 'editorGutter.addedBackground': '#28A745',\n 'editorGutter.deletedBackground': '#D73A49',\n\n // Editor Widgets\n 'editorWidget.background': '#F6F8FA',\n 'editorWidget.border': '#E1E4E8',\n 'editorSuggestWidget.background': '#F6F8FA',\n 'editorSuggestWidget.border': '#E1E4E8',\n 'editorSuggestWidget.selectedBackground': '#0366D625',\n\n // Sticky Scroll - CRITICAL: Must have solid background to prevent transparency when scrolling\n 'editorStickyScroll.background': '#F6F8FA',\n 'editorStickyScroll.border': '#E1E4E8',\n\n // Hover Widgets - Tooltips and hover information\n 'editorHoverWidget.background': '#F6F8FA',\n 'editorHoverWidget.border': '#E1E4E8',\n 'editorHoverWidget.statusBarBackground': '#E1E4E8',\n\n // Inline Hints - Type hints, parameter hints, inline suggestions\n 'editorInlineHint.background': '#F6F8FA',\n 'editorInlineHint.foreground': '#6A737D',\n\n // Code Lens - Reference counts, test indicators\n 'editorCodeLens.foreground': '#6A737D',\n\n // Ghost Text - Autocomplete suggestions shown inline\n 'editorGhostText.foreground': '#1B1F2350',\n\n // Editor Whitespace & Indentation\n 'editorWhitespace.foreground': '#1B1F2340',\n 'editorIndentGuide.background': '#E1E4E820',\n 'editorIndentGuide.activeBackground': '#E1E4E8',\n\n // Scrollbar\n 'scrollbarSlider.background': '#1B1F2330',\n 'scrollbarSlider.hoverBackground': '#1B1F2350',\n 'scrollbarSlider.activeBackground': '#1B1F2370',\n\n // Bracket Matching\n 'editorBracketMatch.background': '#34D05840',\n 'editorBracketMatch.border': '#34D058',\n\n // Find/Replace\n 'editor.findMatchBackground': '#FFDF5D40',\n 'editor.findMatchHighlightBackground': '#FFDF5D30',\n 'editor.findRangeHighlightBackground': '#0366D620',\n\n // Minimap\n 'minimap.background': '#FAFBFC',\n 'minimap.selectionHighlight': '#0366D625',\n 'minimap.findMatchHighlight': '#FFDF5D40',\n\n // Overview Ruler\n 'editorOverviewRuler.border': '#E1E4E820',\n 'editorOverviewRuler.modifiedForeground': '#005CC5',\n 'editorOverviewRuler.addedForeground': '#28A745',\n 'editorOverviewRuler.deletedForeground': '#D73A49',\n\n // Peek View\n 'peekView.border': '#0366D6',\n 'peekViewEditor.background': '#F6F8FA',\n 'peekViewResult.background': '#FAFBFC',\n 'peekViewTitle.background': '#F6F8FA',\n\n // Diff Editor\n 'diffEditor.insertedTextBackground': '#28A74520',\n 'diffEditor.removedTextBackground': '#D73A4920',\n },\n};\n\n/**\n * Register the lighthouse theme with Monaco Editor\n * Call this function before creating any editor instances\n */\nexport function registerLighthouseTheme(\n monaco: typeof import('monaco-editor'),\n) {\n monaco.editor.defineTheme('elbTheme-light', lighthouseTheme);\n}\n","/**\n * Monaco Editor Themes for walkerOS Explorer\n *\n * Custom Monaco themes that integrate seamlessly with the CSS-based theme system.\n * Theme switching is handled via CSS `data-theme` attribute on document root.\n */\n\n// Import registration functions for use in registerAllThemes\nimport { registerPalenightTheme } from './palenight';\nimport { registerLighthouseTheme } from './lighthouse';\n\n// Monaco Editor themes\nexport { palenightTheme, registerPalenightTheme } from './palenight';\nexport { lighthouseTheme, registerLighthouseTheme } from './lighthouse';\n\n// Theme types (for documentation and TypeScript support)\nexport type { ExplorerTheme } from './types';\n\n/**\n * Register all Monaco themes\n * Convenience function for registering both themes at once\n *\n * @example\n * ```typescript\n * import { registerAllThemes } from '@walkeros/explorer';\n * import * as monaco from 'monaco-editor';\n *\n * registerAllThemes(monaco);\n * ```\n */\nexport function registerAllThemes(monaco: typeof import('monaco-editor')): void {\n registerPalenightTheme(monaco);\n registerLighthouseTheme(monaco);\n}\n","import type { editor } from 'monaco-editor';\n\n/**\n * Regular expressions to match walkerOS data attributes\n */\nconst DATA_ELB_PATTERNS = [\n /\\bdata-elb(?!-)\\b/g, // data-elb (not followed by hyphen)\n /\\bdata-elbaction\\b/g, // data-elbaction\n /\\bdata-elbglobals\\b/g, // data-elbglobals\n /\\bdata-elbcontext\\b/g, // data-elbcontext\n /\\bdata-elb-[\\w-]+\\b/g, // data-elb-* (property attributes)\n];\n\n/**\n * Apply decorations to highlight walkerOS data attributes in Monaco editor\n *\n * This function scans the editor content for data-elb* attributes and\n * applies color highlighting to match the website's Prism.js styling.\n *\n * @param editor - Monaco editor instance\n * @param monaco - Monaco module\n */\nexport function applyDataElbDecorations(\n monacoEditor: editor.IStandaloneCodeEditor,\n monaco: typeof import('monaco-editor'),\n): () => void {\n const decorationIds: string[] = [];\n\n const updateDecorations = () => {\n const model = monacoEditor.getModel();\n if (!model) return;\n\n const content = model.getValue();\n const decorations: editor.IModelDeltaDecoration[] = [];\n\n // Find all matches for each pattern\n DATA_ELB_PATTERNS.forEach((pattern) => {\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(content)) !== null) {\n const startPos = model.getPositionAt(match.index);\n const endPos = model.getPositionAt(match.index + match[0].length);\n\n decorations.push({\n range: new monaco.Range(\n startPos.lineNumber,\n startPos.column,\n endPos.lineNumber,\n endPos.column,\n ),\n options: {\n inlineClassName: 'elb-data-attribute',\n inlineClassNameAffectsLetterSpacing: true,\n },\n });\n }\n });\n\n // Apply decorations\n const newDecorationIds = monacoEditor.deltaDecorations(\n decorationIds,\n decorations,\n );\n decorationIds.length = 0;\n decorationIds.push(...newDecorationIds);\n };\n\n // Initial decoration\n updateDecorations();\n\n // Update decorations on content change\n const disposable = monacoEditor.onDidChangeModelContent(() => {\n updateDecorations();\n });\n\n // Return cleanup function\n return () => {\n disposable.dispose();\n monacoEditor.deltaDecorations(decorationIds, []);\n };\n}\n\n/**\n * Register CSS styles for data-elb attribute decorations\n * Call this once during app initialization\n */\nexport function registerDataElbStyles() {\n if (typeof document === 'undefined') return;\n\n const styleId = 'elb-monaco-data-attribute-styles';\n if (document.getElementById(styleId)) return;\n\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `\n .monaco-editor .elb-data-attribute {\n color: var(--color-highlight-primary, #01b5e2) !important;\n }\n `;\n document.head.appendChild(style);\n}\n","import * as prettier from 'prettier/standalone';\nimport prettierBabel from 'prettier/plugins/babel';\nimport prettierEstree from 'prettier/plugins/estree';\nimport prettierTypescript from 'prettier/plugins/typescript';\nimport prettierHtml from 'prettier/plugins/html';\nimport type * as monaco from 'monaco-editor';\n\n/**\n * Register Monaco Editor formatting providers for various languages\n *\n * Uses Prettier for professional-grade code formatting.\n * Registered once when Monaco is initialized.\n *\n * Supported languages:\n * - JavaScript (parser: babel)\n * - TypeScript (parser: typescript)\n * - JSON (native JSON.stringify)\n * - HTML (parser: html)\n * - CSS (parser: css)\n */\nexport function registerFormatters(monacoInstance: typeof monaco): void {\n // JavaScript formatter\n monacoInstance.languages.registerDocumentFormattingEditProvider(\n 'javascript',\n {\n async provideDocumentFormattingEdits(model, options) {\n try {\n const text = model.getValue();\n const formatted = await prettier.format(text, {\n parser: 'babel',\n plugins: [prettierBabel, prettierEstree],\n tabWidth: options.tabSize,\n useTabs: !options.insertSpaces,\n semi: true,\n singleQuote: true,\n trailingComma: 'all',\n });\n return [\n {\n range: model.getFullModelRange(),\n text: formatted,\n },\n ];\n } catch (error) {\n return [];\n }\n },\n },\n );\n\n // TypeScript formatter\n monacoInstance.languages.registerDocumentFormattingEditProvider(\n 'typescript',\n {\n async provideDocumentFormattingEdits(model, options) {\n try {\n const text = model.getValue();\n const formatted = await prettier.format(text, {\n parser: 'typescript',\n plugins: [prettierTypescript, prettierEstree],\n tabWidth: options.tabSize,\n useTabs: !options.insertSpaces,\n semi: true,\n singleQuote: true,\n trailingComma: 'all',\n });\n return [\n {\n range: model.getFullModelRange(),\n text: formatted,\n },\n ];\n } catch (error) {\n return [];\n }\n },\n },\n );\n\n // JSON formatter (use native JSON.stringify for simplicity)\n monacoInstance.languages.registerDocumentFormattingEditProvider('json', {\n async provideDocumentFormattingEdits(model, options) {\n try {\n const text = model.getValue();\n const parsed = JSON.parse(text);\n const formatted = JSON.stringify(parsed, null, options.tabSize);\n return [\n {\n range: model.getFullModelRange(),\n text: formatted,\n },\n ];\n } catch (error) {\n return [];\n }\n },\n });\n\n // HTML formatter\n monacoInstance.languages.registerDocumentFormattingEditProvider('html', {\n async provideDocumentFormattingEdits(model, options) {\n try {\n const text = model.getValue();\n const formatted = await prettier.format(text, {\n parser: 'html',\n plugins: [prettierHtml],\n tabWidth: options.tabSize,\n useTabs: !options.insertSpaces,\n htmlWhitespaceSensitivity: 'css',\n });\n return [\n {\n range: model.getFullModelRange(),\n text: formatted,\n },\n ];\n } catch (error) {\n return [];\n }\n },\n });\n\n // CSS formatter\n monacoInstance.languages.registerDocumentFormattingEditProvider('css', {\n async provideDocumentFormattingEdits(model, options) {\n try {\n const text = model.getValue();\n const formatted = await prettier.format(text, {\n parser: 'css',\n plugins: [prettierHtml], // CSS parser is in html plugin\n tabWidth: options.tabSize,\n useTabs: !options.insertSpaces,\n });\n return [\n {\n range: model.getFullModelRange(),\n text: formatted,\n },\n ];\n } catch (error) {\n return [];\n }\n },\n });\n}\n","import { useEffect, useState, useRef, useCallback } from 'react';\nimport type { editor } from 'monaco-editor';\n\nexport interface UseMonacoHeightOptions {\n enabled?: boolean;\n minHeight?: number;\n maxHeight?: number;\n defaultHeight?: number;\n onHeightChange?: (height: number) => void;\n}\n\n/**\n * Hook to automatically calculate Monaco Editor height based on content\n *\n * @param enabled - Whether to enable auto-height calculation\n * @param minHeight - Minimum height in pixels (default: 100)\n * @param maxHeight - Maximum height in pixels (default: 800)\n * @param defaultHeight - Default height when not auto-sizing (default: 400)\n *\n * @returns [height, setEditor] - Current height and function to register editor instance\n *\n * @example\n * const [height, setEditor] = useMonacoHeight({ enabled: autoHeight });\n *\n * <Editor\n * height={height}\n * onMount={(editor) => setEditor(editor)}\n * />\n */\nexport function useMonacoHeight({\n enabled = false,\n minHeight = 100,\n maxHeight = 800,\n defaultHeight = 400,\n onHeightChange,\n}: UseMonacoHeightOptions = {}): [\n number,\n (editor: editor.IStandaloneCodeEditor | null) => void,\n] {\n const [height, setHeight] = useState<number>(\n enabled ? minHeight : defaultHeight,\n );\n const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);\n const previousHeightRef = useRef<number>(\n enabled ? minHeight : defaultHeight,\n );\n const updateTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n const updateHeight = useCallback(() => {\n if (!enabled || !editorRef.current) return;\n\n try {\n const monacoContentHeight = editorRef.current.getContentHeight();\n const boundedMonacoHeight = Math.max(\n minHeight,\n Math.min(maxHeight, monacoContentHeight),\n );\n\n if (boundedMonacoHeight === previousHeightRef.current) {\n return;\n }\n\n previousHeightRef.current = boundedMonacoHeight;\n setHeight(boundedMonacoHeight);\n\n if (onHeightChange) {\n const HEADER_HEIGHT = 36;\n const BORDER = 2;\n const totalBoxHeight = boundedMonacoHeight + HEADER_HEIGHT + BORDER;\n onHeightChange(totalBoxHeight);\n }\n\n // Note: We don't call editor.layout() here because Monaco's\n // automaticLayout option handles layout updates automatically.\n // Calling layout() here would create a feedback loop with\n // onDidContentSizeChange, causing height to grow indefinitely.\n } catch (error) {\n // Silently fail - editor might not be fully initialized\n }\n }, [enabled, minHeight, maxHeight, onHeightChange]);\n\n const setEditor = useCallback(\n (editor: editor.IStandaloneCodeEditor | null) => {\n // Clean up previous timeout if it exists\n if (updateTimeoutRef.current) {\n clearTimeout(updateTimeoutRef.current);\n updateTimeoutRef.current = null;\n }\n\n editorRef.current = editor;\n\n if (!enabled || !editor) {\n setHeight(defaultHeight);\n previousHeightRef.current = defaultHeight;\n return;\n }\n\n // Trigger initial height calculation\n setTimeout(() => updateHeight(), 50);\n\n // Listen for content changes with debouncing\n const disposable = editor.onDidContentSizeChange(() => {\n // Clear any pending update\n if (updateTimeoutRef.current) {\n clearTimeout(updateTimeoutRef.current);\n }\n\n // Debounce updates to prevent rapid-fire recalculations\n updateTimeoutRef.current = setTimeout(() => {\n updateHeight();\n updateTimeoutRef.current = null;\n }, 150);\n });\n\n // Store disposable for cleanup\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (editor as any).__heightDisposable = disposable;\n },\n [enabled, defaultHeight, updateHeight],\n );\n\n return [height, setEditor];\n}\n","import { createContext, useContext, useRef } from 'react';\n\nexport interface GridHeightContextValue {\n registerBox: (id: number, height: number) => void;\n unregisterBox: (id: number) => void;\n getBoxId: () => number;\n syncedHeight: number | null;\n enabled: boolean;\n}\n\nexport const GridHeightContext = createContext<GridHeightContextValue | null>(\n null,\n);\n\nexport function useGridHeight(): GridHeightContextValue | null {\n return useContext(GridHeightContext);\n}\n\nlet nextBoxId = 0;\nexport function useBoxId(): number {\n const idRef = useRef<number | null>(null);\n if (idRef.current === null) {\n idRef.current = nextBoxId++;\n }\n return idRef.current;\n}\n","import React, { useRef, useState, useEffect, useCallback, useMemo } from 'react';\nimport {\n GridHeightContext,\n type GridHeightContextValue,\n} from '../../contexts/GridHeightContext';\n\nexport interface GridProps {\n children: React.ReactNode;\n columns?: number;\n minBoxWidth?: number | string;\n gap?: number | string;\n rowHeight?: 'auto' | 'equal' | 'synced' | number;\n maxRowHeight?: number | string | 'none';\n showScrollButtons?: boolean;\n className?: string;\n}\n\n/**\n * Grid - Horizontal scrolling layout component for arranging boxes\n *\n * Provides consistent grid layout for box components with horizontal\n * scrolling when content exceeds available space. Boxes maintain minimum\n * width and never wrap to new rows.\n *\n * @example\n * // 5 boxes with default 350px minimum width\n * <Grid columns={5}>\n * <CodeBox ... />\n * <CodeBox ... />\n * <CodeBox ... />\n * <CodeBox ... />\n * <CodeBox ... />\n * </Grid>\n *\n * @example\n * // Custom minimum box width\n * <Grid columns={3} minBoxWidth={400}>\n * <BrowserBox ... />\n * <CodeBox ... />\n * <CodeBox ... />\n * </Grid>\n *\n * @example\n * // Custom row height\n * <Grid columns={2} rowHeight={300}>\n * <CodeBox ... />\n * <CodeBox ... />\n * </Grid>\n *\n * @example\n * // Auto row height (no minimum)\n * <Grid columns={3} rowHeight=\"auto\">\n * <CodeBox ... />\n * </Grid>\n *\n * @example\n * // Unlimited row height (no max constraint)\n * <Grid columns={2} maxRowHeight=\"none\">\n * <PropertyTable ... />\n * <CodeBox ... />\n * </Grid>\n *\n * @example\n * // Custom max row height\n * <Grid columns={2} maxRowHeight={800}>\n * <PropertyTable ... />\n * <CodeBox ... />\n * </Grid>\n */\nexport function Grid({\n children,\n columns,\n minBoxWidth,\n gap,\n rowHeight = 'equal',\n maxRowHeight,\n showScrollButtons = true,\n className = '',\n}: GridProps) {\n const gridRef = useRef<HTMLDivElement>(null);\n const [canScrollLeft, setCanScrollLeft] = useState(false);\n const [canScrollRight, setCanScrollRight] = useState(false);\n\n const [boxHeights, setBoxHeights] = useState<Map<number, number>>(new Map());\n const boxIdCounter = useRef(0);\n\n const getBoxId = useCallback(() => boxIdCounter.current++, []);\n\n const registerBox = useCallback((id: number, height: number) => {\n setBoxHeights((prev) => {\n const next = new Map(prev);\n next.set(id, height);\n return next;\n });\n }, []);\n\n const unregisterBox = useCallback((id: number) => {\n setBoxHeights((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const syncedHeight = useMemo(() => {\n if (rowHeight !== 'synced' || boxHeights.size === 0) return null;\n return Math.min(600, Math.max(...Array.from(boxHeights.values())));\n }, [boxHeights, rowHeight]);\n\n const contextValue: GridHeightContextValue = useMemo(\n () => ({\n registerBox,\n unregisterBox,\n getBoxId,\n syncedHeight,\n enabled: rowHeight === 'synced',\n }),\n [registerBox, unregisterBox, getBoxId, syncedHeight, rowHeight],\n );\n\n const classNames = ['elb-explorer-grid'];\n const gridStyle: React.CSSProperties = {};\n\n // Row height modifiers\n if (rowHeight === 'auto') {\n classNames.push('elb-explorer-grid--row-auto');\n } else if (rowHeight === 'equal') {\n classNames.push('elb-explorer-grid--row-equal');\n } else if (rowHeight === 'synced') {\n classNames.push('elb-explorer-grid--row-synced');\n } else if (typeof rowHeight === 'number') {\n // Apply custom row height via CSS variable\n (gridStyle as Record<string, string>)['--grid-row-min-height'] = `${rowHeight}px`;\n (gridStyle as Record<string, string>)['--grid-row-max-height'] = `${rowHeight}px`;\n }\n\n // Add custom className\n if (className) {\n classNames.push(className);\n }\n\n // Apply custom gap if provided\n if (gap !== undefined) {\n gridStyle.gap = typeof gap === 'number' ? `${gap}px` : gap;\n }\n\n // Apply custom minimum box width if provided\n if (minBoxWidth !== undefined) {\n (gridStyle as Record<string, string>)['--grid-min-box-width'] =\n typeof minBoxWidth === 'number' ? `${minBoxWidth}px` : minBoxWidth;\n }\n\n if (maxRowHeight !== undefined) {\n // Warn about dangerous configuration that can cause infinite growth\n if (\n maxRowHeight === 'none' &&\n rowHeight !== 'auto' &&\n rowHeight !== 'synced'\n ) {\n console.warn(\n 'Grid: maxRowHeight=\"none\" without rowHeight=\"auto\" or \"synced\" can cause infinite growth loops. ' +\n 'This occurs when boxes try to fill the grid row (height: 100%) while the grid tries to fit box content. ' +\n 'Consider using rowHeight=\"synced\" or setting a specific maxRowHeight value (e.g., 800).',\n );\n }\n\n (gridStyle as Record<string, string>)['--grid-row-max-height'] =\n maxRowHeight === 'none'\n ? 'none'\n : typeof maxRowHeight === 'number'\n ? `${maxRowHeight}px`\n : maxRowHeight;\n }\n\n // Check scroll state\n const updateScrollState = useCallback(() => {\n const el = gridRef.current;\n if (!el) return;\n\n const hasOverflow = el.scrollWidth > el.clientWidth;\n const isAtStart = el.scrollLeft <= 1;\n const isAtEnd = el.scrollLeft + el.clientWidth >= el.scrollWidth - 1;\n\n setCanScrollLeft(hasOverflow && !isAtStart);\n setCanScrollRight(hasOverflow && !isAtEnd);\n }, []);\n\n // Scroll handlers\n const scrollLeft = () => {\n if (!gridRef.current) return;\n const scrollAmount = gridRef.current.clientWidth * 0.8;\n gridRef.current.scrollBy({ left: -scrollAmount, behavior: 'smooth' });\n };\n\n const scrollRight = () => {\n if (!gridRef.current) return;\n const scrollAmount = gridRef.current.clientWidth * 0.8;\n gridRef.current.scrollBy({ left: scrollAmount, behavior: 'smooth' });\n };\n\n // Update scroll state on mount, scroll, and resize\n useEffect(() => {\n const el = gridRef.current;\n if (!el || !showScrollButtons) return;\n\n updateScrollState();\n\n el.addEventListener('scroll', updateScrollState);\n window.addEventListener('resize', updateScrollState);\n\n return () => {\n el.removeEventListener('scroll', updateScrollState);\n window.removeEventListener('resize', updateScrollState);\n };\n }, [updateScrollState, showScrollButtons]);\n\n return (\n <GridHeightContext.Provider value={contextValue}>\n <div className=\"elb-explorer elb-explorer-grid-wrapper\">\n {showScrollButtons && canScrollLeft && (\n <button\n className=\"elb-explorer-grid-scroll-button elb-explorer-grid-scroll-button--left\"\n onClick={scrollLeft}\n aria-label=\"Scroll left\"\n type=\"button\"\n >\n ‹\n </button>\n )}\n\n <div ref={gridRef} className={classNames.join(' ')} style={gridStyle}>\n {children}\n </div>\n\n {showScrollButtons && canScrollRight && (\n <button\n className=\"elb-explorer-grid-scroll-button elb-explorer-grid-scroll-button--right\"\n onClick={scrollRight}\n aria-label=\"Scroll right\"\n type=\"button\"\n >\n ›\n </button>\n )}\n </div>\n </GridHeightContext.Provider>\n );\n}\n","import React, { useState, useCallback, useEffect } from 'react';\nimport { getMappingEvent, getMappingValue, createEvent } from '@walkeros/core';\nimport type { Mapping, WalkerOS } from '@walkeros/core';\nimport { CodeBox } from '../molecules/code-box';\nimport { Grid } from '../atoms/grid';\n\nexport interface MappingCodeProps {\n input: string;\n config?: string;\n labelInput?: string;\n labelOutput?: string;\n}\n\n/**\n * MappingCode - Specialized component for walkerOS mapping demonstrations\n *\n * Similar to LiveCode but specifically for mapping transformations.\n * Shows input code and output result side-by-side with built-in mapping logic.\n *\n * Props:\n * - input: Code string to execute (can use await getMappingEvent, getMappingValue)\n * - config: Optional mapping configuration JSON\n * - labelInput: Label for input editor (default: \"Configuration\")\n * - labelOutput: Label for output display (default: \"Result\")\n *\n * Example:\n * ```tsx\n * <MappingCode\n * input={`await getMappingEvent(\n * { name: 'product view' },\n * {\n * product: {\n * view: { name: 'product_viewed' }\n * }\n * }\n * );`}\n * />\n * ```\n */\n\nexport function MappingCode({\n input: initialInput,\n config,\n labelInput = 'Configuration',\n labelOutput = 'Result',\n}: MappingCodeProps) {\n const [input, setInput] = useState(initialInput);\n const [output, setOutput] = useState('');\n\n const executeCode = useCallback(async () => {\n try {\n // Wrap input in async function and execute\n const asyncFunction = new Function(\n 'getMappingEvent',\n 'getMappingValue',\n 'createEvent',\n `return (async () => {\n return ${input}\n })();`,\n );\n\n const result = await asyncFunction(\n getMappingEvent,\n getMappingValue,\n createEvent,\n );\n\n setOutput(JSON.stringify(result, null, 2));\n } catch (error) {\n setOutput(\n `Error: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }, [input, config]);\n\n useEffect(() => {\n const timeoutId = setTimeout(executeCode, 500);\n return () => clearTimeout(timeoutId);\n }, [executeCode]);\n\n return (\n <Grid columns={2}>\n <CodeBox\n label={labelInput}\n code={input}\n onChange={setInput}\n language=\"javascript\"\n />\n <CodeBox label={labelOutput} code={output} disabled language=\"json\" />\n </Grid>\n );\n}\n","import React, { useState, useCallback, useEffect } from 'react';\nimport type { WalkerOS, Mapping, Destination } from '@walkeros/core';\nimport {\n createEvent,\n tryCatchAsync,\n processEventMapping,\n} from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport { CodeBox } from '../molecules/code-box';\nimport { Grid } from '../atoms/grid';\nimport { captureDestinationPush } from '../../helpers/capture';\n\nexport interface DestinationDemoProps {\n destination: Destination.Instance;\n event: WalkerOS.PartialEvent;\n mapping?: Mapping.Rule | string;\n settings?: unknown;\n generic?: boolean; // When true, wraps mapping in '*': { '*': mapping }\n labelEvent?: string;\n labelMapping?: string;\n labelOutput?: string;\n fn?: (\n event: WalkerOS.Event,\n context: Destination.PushContext,\n ) => Promise<string>; // Custom output function\n}\n\n/**\n * DestinationDemo - Interactive destination testing component\n *\n * Automatically captures destination.push() calls and displays the output.\n * The component auto-detects the destination's env from destination.examples.env.push.\n *\n * Props:\n * - destination: Destination instance with examples.env.push export\n * - event: walkerOS event to process\n * - mapping: Optional mapping rules\n * - settings: Destination-specific settings\n * - generic: If true, wraps mapping in { '*': { '*': mapping } }\n * - labelEvent: Label for event panel (default: 'Event')\n * - labelMapping: Label for mapping panel (default: 'Mapping')\n * - labelOutput: Label for output panel (default: 'Result')\n *\n * Example:\n * ```tsx\n * import destinationPlausible from '@walkeros/web-destination-plausible';\n * import { examples } from '@walkeros/web-destination-plausible';\n * import { getEvent } from '@walkeros/core';\n *\n * const destination = { ...destinationPlausible, examples };\n *\n * <DestinationDemo\n * destination={destination}\n * event={getEvent('order complete')}\n * mapping={examples.mapping.purchase}\n * settings={{ domain: 'elbwalker.com' }}\n * generic={true}\n * />\n * ```\n */\n\n// Generic capture function creator\nexport function createCaptureFn(\n fnName: string,\n onCapture: (output: string) => void,\n) {\n return (...args: unknown[]) => {\n const formattedArgs = args\n .map((arg) => {\n if (typeof arg === 'string') return `\"${arg}\"`;\n return JSON.stringify(arg, null, 2);\n })\n .join(', ');\n\n onCapture(`${fnName}(${formattedArgs});`);\n };\n}\n\nexport function DestinationDemo({\n destination,\n event: initialEvent,\n mapping: initialMapping = {},\n settings,\n generic = false,\n labelEvent = 'Event',\n labelMapping = 'Mapping',\n labelOutput = 'Result',\n fn,\n}: DestinationDemoProps) {\n const [eventInput, setEventInput] = useState(\n JSON.stringify(initialEvent, null, 2),\n );\n const [mappingInput, setMappingInput] = useState(\n typeof initialMapping === 'string'\n ? initialMapping\n : JSON.stringify(initialMapping, null, 2),\n );\n const [output, setOutput] = useState('');\n\n const executeDestination = useCallback(async () => {\n await tryCatchAsync(\n async () => {\n const eventData = JSON.parse(eventInput);\n const mappingData = JSON.parse(mappingInput);\n const event = createEvent(eventData);\n\n // Wrap mapping in generic structure if requested\n const wrappedMapping =\n generic && mappingData ? { '*': { '*': mappingData } } : mappingData;\n\n // Build config\n const config: Destination.Config = {\n settings: settings || {},\n mapping: wrappedMapping,\n };\n\n // Create minimal collector for mapping processing\n const { collector } = await startFlow({});\n\n // Process event mapping (applies mapping transformations)\n const processed = await processEventMapping(event, config, collector);\n\n // Build context for destination.push()\n const context: Destination.PushContext = {\n collector,\n config,\n data: processed.data,\n mapping: processed.mapping,\n env: destination.env || {},\n };\n\n // If custom function provided, use it\n if (fn) {\n const result = await fn(processed.event, context);\n setOutput(result);\n return;\n }\n\n // Auto-detect destination.examples.env.push (for push method)\n const destinationEnv = (destination as { examples?: { env?: { push?: unknown } } }).examples?.env?.push;\n\n // Use captureDestinationPush to automatically capture output\n const captureFn = captureDestinationPush(destination, destinationEnv);\n const result = await captureFn(processed.event, context);\n setOutput(result);\n },\n (error) => setOutput(`Error: ${error}`),\n )();\n }, [eventInput, mappingInput, destination, settings, generic, fn]);\n\n useEffect(() => {\n const timeoutId = setTimeout(executeDestination, 500);\n return () => clearTimeout(timeoutId);\n }, [executeDestination]);\n\n return (\n <Grid columns={3} rowHeight=\"synced\">\n <CodeBox\n label={labelEvent}\n code={eventInput}\n onChange={setEventInput}\n language=\"json\"\n showFormat\n autoHeight\n />\n <CodeBox\n label={labelMapping}\n code={mappingInput}\n onChange={setMappingInput}\n language=\"json\"\n showFormat\n autoHeight\n />\n <CodeBox\n label={labelOutput}\n code={output}\n disabled\n language=\"javascript\"\n autoHeight\n />\n </Grid>\n );\n}\n","import { mockEnv, Destination, WalkerOS } from '@walkeros/core';\n\n/**\n * Formats captured function calls for display\n *\n * @param calls - Array of captured calls with path and args\n * @param defaultMessage - Message to show when no calls captured\n * @returns Formatted string of function calls\n *\n * @example\n * formatCapturedCalls([\n * { path: ['window', 'gtag'], args: ['config', 'G-XXX'] }\n * ])\n * // Returns: \"gtag('config', 'G-XXX');\"\n */\nexport function formatCapturedCalls(\n calls: Array<{ path: string[]; args: unknown[] }>,\n defaultMessage = 'No function calls captured',\n): string {\n if (calls.length === 0) return defaultMessage;\n\n return calls\n .map(({ path, args }) => {\n const functionName = path[path.length - 1];\n const formattedArgs = args\n .map((arg) => {\n if (typeof arg === 'string') return `'${arg}'`;\n if (typeof arg === 'object' && arg !== null)\n return JSON.stringify(arg, null, 2);\n return String(arg);\n })\n .join(', ');\n return `${functionName}(${formattedArgs});`;\n })\n .join('\\n\\n');\n}\n\n/**\n * Creates a capture function for destination init method\n * Uses walkerOS core mockEnv to intercept function calls\n *\n * @param destination - Destination instance with init method\n * @param destinationEnv - Destination's exported env (usually examples.env.push)\n * @returns Async function that executes init and returns formatted output\n *\n * @example\n * import destinationGtag, { examples } from '@walkeros/web-destination-gtag';\n *\n * const captureFn = captureDestinationInit(destinationGtag, examples.env.push);\n *\n * // Use in DestinationInitDemo\n * <DestinationInitDemo\n * destination={destinationGtag}\n * settings={{ measurementId: 'G-XXX' }}\n * fn={captureFn}\n * />\n */\nexport function captureDestinationInit(\n destination: Destination.Instance,\n destinationEnv: unknown,\n) {\n return async (context: Destination.Context): Promise<string> => {\n if (!destination.init) {\n return 'No init method found';\n }\n\n const calls: Array<{ path: string[]; args: unknown[] }> = [];\n\n // Use walkerOS core mockEnv to intercept all function calls\n const testEnv = mockEnv(\n (destinationEnv || {}) as Record<string, unknown>,\n (path, args) => {\n calls.push({ path, args });\n },\n );\n\n await destination.init({ ...context, env: testEnv } as Destination.InitContext);\n\n return formatCapturedCalls(calls, 'Destination initialized successfully');\n };\n}\n\n/**\n * Creates a capture function for destination push method\n * Uses walkerOS core mockEnv to intercept function calls\n *\n * @param destination - Destination instance with push method\n * @param destinationEnv - Destination's exported env (usually examples.env.push)\n * @returns Async function that executes push and returns formatted output\n *\n * @example\n * import destinationGtag, { examples } from '@walkeros/web-destination-gtag';\n * import { getEvent } from '@walkeros/core';\n *\n * const captureFn = captureDestinationPush(destinationGtag, examples.env.push);\n *\n * // Use in DestinationDemo\n * <DestinationDemo\n * destination={destinationGtag}\n * event={getEvent('order complete')}\n * mapping={examples.mapping.purchase}\n * fn={captureFn}\n * />\n */\nexport function captureDestinationPush(\n destination: Destination.Instance,\n destinationEnv: unknown,\n) {\n return async (\n event: WalkerOS.Event,\n context: Destination.PushContext,\n ): Promise<string> => {\n const calls: Array<{ path: string[]; args: unknown[] }> = [];\n\n // Use walkerOS core mockEnv to intercept all function calls\n const testEnv = mockEnv(\n (destinationEnv || {}) as Record<string, unknown>,\n (path, args) => {\n calls.push({ path, args });\n },\n );\n\n // Call the real destination push with intercepted env\n await destination.push(event, { ...context, env: testEnv });\n\n return formatCapturedCalls(calls);\n };\n}\n\n/**\n * Advanced: Creates a raw capture function that returns call data\n * Use this when you need custom formatting or processing of calls\n *\n * @param destinationEnv - Destination's exported env\n * @returns Function that returns both env and getCalls function\n *\n * @example\n * const { env, getCalls } = createRawCapture(examples.env.push);\n * await destination.init({ ...context, env });\n * const calls = getCalls();\n * // Process calls as needed\n */\nexport function createRawCapture(destinationEnv: unknown) {\n const calls: Array<{ path: string[]; args: unknown[] }> = [];\n\n const testEnv = mockEnv(\n (destinationEnv || {}) as Record<string, unknown>,\n (path, args) => {\n calls.push({ path, args });\n },\n );\n\n return {\n env: testEnv,\n getCalls: () => calls,\n };\n}\n","import React, { useState, useCallback, useEffect } from 'react';\nimport type { Destination } from '@walkeros/core';\nimport { tryCatchAsync } from '@walkeros/core';\nimport { startFlow } from '@walkeros/collector';\nimport { CodeBox } from '../molecules/code-box';\nimport { Grid } from '../atoms/grid';\nimport { captureDestinationInit } from '../../helpers/capture';\n\nexport interface DestinationInitDemoProps {\n destination: Destination.Instance;\n settings?: unknown;\n labelSettings?: string;\n labelOutput?: string;\n}\n\n/**\n * DestinationInitDemo - Interactive destination initialization testing component\n *\n * Automatically captures destination.init() calls and displays the output.\n * The component auto-detects the destination's env from destination.examples.env.init.\n *\n * Props:\n * - destination: Destination instance with examples.env.init export\n * - settings: Initial destination-specific settings\n * - labelSettings: Label for settings panel (default: 'Settings')\n * - labelOutput: Label for output panel (default: 'Result')\n *\n * Example:\n * ```tsx\n * import destinationGtag from '@walkeros/web-destination-gtag';\n * import { examples } from '@walkeros/web-destination-gtag';\n *\n * const destination = { ...destinationGtag, examples };\n *\n * <DestinationInitDemo\n * destination={destination}\n * settings={{ ga4: { measurementId: 'G-XXXXXXXXXX' } }}\n * />\n * ```\n */\nexport function DestinationInitDemo({\n destination,\n settings: initialSettings = {},\n labelSettings = 'Settings',\n labelOutput = 'Result',\n}: DestinationInitDemoProps) {\n const [settingsInput, setSettingsInput] = useState(\n typeof initialSettings === 'string'\n ? initialSettings\n : JSON.stringify(initialSettings, null, 2),\n );\n const [output, setOutput] = useState('');\n\n const executeInit = useCallback(async () => {\n await tryCatchAsync(\n async () => {\n const settingsData = JSON.parse(settingsInput);\n\n // Build config\n const config: Destination.Config = {\n settings: settingsData,\n };\n\n // Create minimal collector\n const { collector } = await startFlow({});\n\n // Build context for destination.init()\n const context: Destination.Context = {\n collector,\n config,\n env: destination.env || {},\n };\n\n if (!destination.init) {\n setOutput('No init method defined for this destination');\n return;\n }\n\n // Auto-detect destination.examples.env.init (for init method)\n const destinationEnv = (destination as { examples?: { env?: { init?: unknown } } }).examples?.env?.init;\n\n // Use captureDestinationInit to automatically capture output\n const captureFn = captureDestinationInit(destination, destinationEnv);\n const result = await captureFn(context);\n setOutput(result);\n },\n (error) => setOutput(`Error: ${error}`),\n )();\n }, [settingsInput, destination]);\n\n useEffect(() => {\n const timeoutId = setTimeout(executeInit, 500);\n return () => clearTimeout(timeoutId);\n }, [executeInit]);\n\n return (\n <Grid columns={2} rowHeight=\"synced\">\n <CodeBox\n label={labelSettings}\n code={settingsInput}\n onChange={setSettingsInput}\n language=\"json\"\n showFormat\n autoHeight\n />\n <CodeBox\n label={labelOutput}\n code={output}\n disabled\n language=\"javascript\"\n autoHeight\n />\n </Grid>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport type { WalkerOS } from '@walkeros/core';\nimport { Box } from '../atoms/box';\nimport { Grid } from '../atoms/grid';\nimport { Preview } from '../molecules/preview';\nimport { BrowserBox } from '../organisms/browser-box';\nimport { CodeBox } from '../molecules/code-box';\nimport { CollectorBox } from '../organisms/collector-box';\nimport {\n createGtagDestination,\n type DestinationCode,\n} from '../../helpers/destinations';\n\nexport interface PromotionPlaygroundProps {\n initialHtml?: string;\n initialCss?: string;\n initialJs?: string;\n initialMapping?: string;\n labelCode?: string;\n labelPreview?: string;\n labelEvents?: string;\n labelMapping?: string;\n labelResult?: string;\n destination?: DestinationCode;\n}\n\nconst defaultHtml = `<div\n data-elb=\"product\"\n data-elbaction=\"load:view\"\n data-elbcontext=\"stage:inspire\"\n class=\"product-card\"\n>\n <figure class=\"product-figure\">\n <div class=\"product-badge-container\">\n <div data-elb-product=\"badge:delicious\" class=\"product-badge\">delicious</div>\n </div>\n </figure>\n <div class=\"product-body\">\n <h3 data-elb-product=\"name:#innerText\" class=\"product-title\">\n Everyday Ruck Snack\n </h3>\n <div class=\"form-control\">\n <label class=\"form-label\">Taste</label>\n <select\n data-elb-product=\"taste:#value\"\n class=\"form-select\"\n >\n <option value=\"sweet\">Sweet</option>\n <option value=\"spicy\">Spicy</option>\n </select>\n </div>\n <p data-elb-product=\"price:2.50\" class=\"product-price\">\n € 2.50 <span data-elb-product=\"old_price:3.14\" class=\"product-old-price\">€ 3.14</span>\n </p>\n <div data-elbcontext=\"stage:hooked\" class=\"product-actions\">\n <button\n data-elbaction=\"click:save\"\n class=\"btn btn-secondary\"\n >\n Maybe later\n </button>\n <button\n data-elbaction=\"click:add\"\n class=\"btn btn-primary\"\n >\n Add to Cart\n </button>\n </div>\n </div>\n</div>`;\n\nconst defaultCss = `* {\n box-sizing: border-box;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n}\n\n.product-card {\n width: 100%;\n max-width: 400px;\n margin: 0 auto;\n background: #ffffff;\n border-radius: 16px;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n overflow: hidden;\n}\n\n.product-figure {\n position: relative;\n margin: 0;\n padding: 0;\n width: 100%;\n height: 160px;\n background:\n linear-gradient(135deg, rgba(243, 244, 246, 0.9) 0%, rgba(229, 231, 235, 0.9) 100%),\n repeating-linear-gradient(\n 45deg,\n #f9fafb,\n #f9fafb 10px,\n #f3f4f6 10px,\n #f3f4f6 20px\n );\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.product-figure::before {\n content: '🍟';\n font-size: 8rem;\n opacity: 0.8;\n}\n\n.product-badge-container {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n}\n\n.product-badge {\n background: #01b5e2;\n color: white;\n padding: 0.25rem 0.75rem;\n border-radius: 9999px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n}\n\n.product-body {\n padding: 1.5rem;\n}\n\n.product-title {\n font-size: 1.125rem;\n font-weight: 700;\n margin: 0 0 1rem 0;\n color: #111827;\n}\n\n.form-control {\n margin-bottom: 1rem;\n}\n\n.form-label {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n color: #6b7280;\n margin-bottom: 0.5rem;\n}\n\n.form-select {\n width: 100%;\n padding: 0.5rem 0.75rem;\n border: 1px solid #d1d5db;\n border-radius: 8px;\n font-size: 0.875rem;\n color: #111827;\n background: white;\n cursor: pointer;\n transition: border-color 0.2s;\n}\n\n.form-select:hover {\n border-color: #9ca3af;\n}\n\n.form-select:focus {\n outline: none;\n border-color: #01b5e2;\n box-shadow: 0 0 0 3px rgba(1, 181, 226, 0.1);\n}\n\n.product-price {\n font-size: 1.25rem;\n font-weight: 700;\n color: #111827;\n margin: 0 0 1rem 0;\n}\n\n.product-old-price {\n font-size: 1rem;\n font-weight: 400;\n color: #9ca3af;\n text-decoration: line-through;\n margin-left: 0.5rem;\n}\n\n.product-actions {\n display: flex;\n justify-content: space-between;\n gap: 0.5rem;\n}\n\n.btn {\n flex: 1;\n padding: 0.75rem 1rem;\n border: none;\n border-radius: 8px;\n font-size: 0.875rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n text-align: center;\n}\n\n.btn:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n}\n\n.btn:active {\n transform: translateY(0);\n}\n\n.btn-primary {\n background: #01b5e2;\n color: white;\n}\n\n.btn-primary:hover {\n background: #0195b8;\n}\n\n.btn-secondary {\n background: #ffffff;\n color: #01b5e2;\n border: 1px solid #01b5e2;\n}\n\n.btn-secondary:hover {\n background: #01b5e2;\n color: #ffffff;\n}`;\n\nconst defaultMapping = `{\n \"product\": {\n \"view\": {\n \"name\": \"view_item\",\n \"data\": {\n \"map\": {\n \"event\": \"name\",\n \"price\": \"data.price\",\n \"stage\": \"context.stage.0\"\n }\n }\n },\n \"add\": {\n \"name\": \"add_to_cart\",\n \"data\": {\n \"map\": {\n \"event\": \"event\",\n \"price\": \"data.price\",\n \"user\": {\n \"consent\": { \"marketing\": true },\n \"key\": \"user.session\"\n },\n \"isSale\": {\n \"fn\": \"(e) => !!e.data.old_price\"\n }\n }\n }\n },\n \"save\": {\n \"data\": {\n \"map\": {\n \"event\": \"event\",\n \"data\": \"data\"\n }\n }\n }\n }\n}`;\n\n/**\n * PromotionPlayground - Full walkerOS demonstration with live code editing\n *\n * Shows the complete chain:\n * 1. Code Editor - Edit HTML/CSS/JS with walkerOS data attributes\n * 2. Preview - Live rendered output that captures real events\n * 3. Events - Real events captured from preview interactions\n * 4. Mapping - Apply transformations and see destination output\n * 5. Result - Final destination function calls\n */\nexport function PromotionPlayground({\n initialHtml = defaultHtml,\n initialCss = defaultCss,\n initialJs = '',\n initialMapping = defaultMapping,\n labelCode = 'Code',\n labelPreview = 'Preview',\n labelEvents = 'Events',\n labelMapping = 'Mapping',\n labelResult = 'Result',\n destination = createGtagDestination(),\n}: PromotionPlaygroundProps) {\n const [html, setHtml] = useState(initialHtml);\n const [css, setCss] = useState(initialCss);\n const [js, setJs] = useState(initialJs);\n const [mappingInput, setMappingInput] = useState(initialMapping);\n const [capturedEvent, setCapturedEvent] = useState<WalkerOS.Event | null>(\n null,\n );\n const [eventInput, setEventInput] = useState<string>(\n '// Click elements in the preview to see events',\n );\n\n // Handle events from preview\n const handleEvent = useCallback((event: WalkerOS.Event) => {\n setCapturedEvent(event);\n setEventInput(JSON.stringify(event, null, 2));\n }, []);\n\n const eventDisplay = eventInput;\n\n return (\n <Grid columns={5} rowHeight={600}>\n {/* Column 1: Code Editor with HTML/CSS/JS tabs */}\n <BrowserBox\n label={labelCode}\n html={html}\n css={css}\n js={js}\n onHtmlChange={setHtml}\n onCssChange={setCss}\n onJsChange={setJs}\n showPreview={false}\n initialTab=\"html\"\n lineNumbers={false}\n wordWrap\n />\n\n {/* Column 2: Preview */}\n <Preview\n label={labelPreview}\n html={html}\n css={css}\n onEvent={handleEvent}\n />\n\n {/* Column 3: Events */}\n <CodeBox\n label={labelEvents}\n code={eventDisplay}\n onChange={setEventInput}\n language=\"json\"\n wordWrap\n />\n\n {/* Column 4: Mapping */}\n <CodeBox\n label={labelMapping}\n code={mappingInput}\n onChange={setMappingInput}\n language=\"json\"\n wordWrap\n />\n\n {/* Column 5: Result */}\n <CollectorBox\n event={eventInput}\n mapping={mappingInput}\n destination={destination}\n label={labelResult}\n wordWrap\n />\n </Grid>\n );\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport type { WalkerOS, Elb, Collector, Source } from '@walkeros/core';\nimport { sourceBrowser } from '@walkeros/web-source-browser';\nimport { Box } from '../atoms/box';\nimport { PreviewFooter } from '../atoms/preview-footer';\n\nexport interface PreviewProps {\n html: string;\n css?: string;\n onEvent?: (event: WalkerOS.Event) => void;\n label?: string;\n}\n\n/**\n * Preview - HTML preview wrapped in a Box with highlight buttons\n *\n * Renders HTML in an isolated iframe with highlight buttons footer.\n * When onEvent is provided, initializes walkerOS browser source in iframe.\n *\n * @example\n * // Read-only preview\n * <Preview html={html} css={css} label=\"Preview\" />\n *\n * // Interactive preview with event capture\n * <Preview html={html} css={css} onEvent={(event) => console.log(event)} label=\"Preview\" />\n */\nexport function Preview({ html, css = '', onEvent, label = 'Preview' }: PreviewProps) {\n const [highlights, setHighlights] = useState<Set<string>>(new Set());\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const updateTimeoutRef = useRef<NodeJS.Timeout | undefined>(undefined);\n const onEventRef = useRef(onEvent);\n const sourceInstanceRef = useRef<Source.Instance | null>(null);\n\n // Keep onEventRef in sync\n useEffect(() => {\n onEventRef.current = onEvent;\n }, [onEvent]);\n\n const toggleHighlight = (type: string) => {\n setHighlights((prev) => {\n const next = new Set(prev);\n if (next.has(type)) {\n next.delete(type);\n } else {\n next.add(type);\n }\n return next;\n });\n };\n\n const autoMarkProperties = useCallback(\n (container: HTMLElement | Document) => {\n const entities = container.querySelectorAll('[data-elb]');\n entities.forEach((entity) => {\n const entityName = entity.getAttribute('data-elb');\n if (!entityName) return;\n\n const propertySelector = `[data-elb-${entityName}]`;\n entity.querySelectorAll(propertySelector).forEach((el) => {\n el.setAttribute('data-elbproperty', '');\n });\n });\n },\n [],\n );\n\n useEffect(() => {\n if (updateTimeoutRef.current) {\n clearTimeout(updateTimeoutRef.current);\n }\n\n updateTimeoutRef.current = setTimeout(() => {\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentDocument) return;\n\n const doc = iframe.contentDocument;\n const highlightClasses = Array.from(highlights)\n .map((type) => `highlight-${type}`)\n .join(' ');\n\n doc.open();\n doc.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <style>\n /* Reset */\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n padding: 1.5rem;\n background: #f9fafb;\n color: #111827;\n min-height: 100vh;\n }\n\n @media (prefers-color-scheme: dark) {\n body {\n background: #1f2937;\n color: #e5e7eb;\n }\n }\n\n /* User CSS */\n ${css}\n\n /* Highlight CSS - imported from highlight styles */\n :root {\n --highlight-globals: #4fc3f7cc;\n --highlight-context: #ffbd44cc;\n --highlight-entity: #00ca4ecc;\n --highlight-property: #ff605ccc;\n --highlight-action: #9900ffcc;\n }\n\n body.elb-highlight.highlight-entity [data-elb] {\n box-shadow: 0 0 0 2px var(--highlight-entity);\n }\n\n body.elb-highlight.highlight-context [data-elbcontext] {\n box-shadow: 0 0 0 2px var(--highlight-context);\n }\n\n body.elb-highlight.highlight-property [data-elbproperty] {\n box-shadow: 0 0 0 2px var(--highlight-property);\n }\n\n body.elb-highlight.highlight-action [data-elbaction] {\n box-shadow: 0 0 0 2px var(--highlight-action);\n }\n\n /* Combined highlights */\n body.elb-highlight.highlight-entity.highlight-action [data-elb][data-elbaction] {\n box-shadow: 0 0 0 2px var(--highlight-action), 0 0 0 4px var(--highlight-entity);\n }\n\n body.elb-highlight.highlight-entity.highlight-context [data-elb][data-elbcontext] {\n box-shadow: 0 0 0 2px var(--highlight-entity), 0 0 0 4px var(--highlight-context);\n }\n\n body.elb-highlight.highlight-action.highlight-context [data-elbaction][data-elbcontext] {\n box-shadow: 0 0 0 2px var(--highlight-action), 0 0 0 4px var(--highlight-context);\n }\n </style>\n </head>\n <body class=\"elb-highlight ${highlightClasses}\">\n ${html}\n </body>\n </html>\n `);\n doc.close();\n\n autoMarkProperties(doc);\n\n // Initialize browser source in iframe\n if (\n onEventRef.current &&\n iframe.contentWindow &&\n iframe.contentDocument\n ) {\n setTimeout(async () => {\n // Cleanup previous source instance\n if (sourceInstanceRef.current) {\n try {\n await sourceInstanceRef.current.destroy?.();\n } catch (e) {\n // Ignore cleanup errors\n }\n }\n\n try {\n if (!iframe.contentWindow || !iframe.contentDocument) return;\n\n // Create elb function that satisfies Elb.Fn interface\n const elbFn: Elb.Fn = ((...args: unknown[]) => {\n // Handle event push - first arg is the event or command\n const [first] = args;\n if (onEventRef.current && first && typeof first === 'object') {\n onEventRef.current(first as WalkerOS.Event);\n }\n return Promise.resolve({ ok: true });\n }) as Elb.Fn;\n\n // Initialize browser source directly in iframe\n // Note: contentWindow type doesn't match `Window & typeof globalThis` exactly,\n // but it has all the required properties for the browser source to work\n const sourceInstance = await sourceBrowser(\n {\n settings: {\n pageview: true,\n session: false,\n prefix: 'data-elb',\n elb: 'elb',\n elbLayer: 'elbLayer',\n },\n },\n {\n elb: elbFn,\n // Required by Source.BaseEnv but not used in preview context\n push: elbFn,\n command: (() =>\n Promise.resolve({\n ok: true,\n successful: [],\n queued: [],\n failed: [],\n })) as Collector.CommandFn,\n window: iframe.contentWindow as Window & typeof globalThis,\n document: iframe.contentDocument,\n },\n );\n\n sourceInstanceRef.current = sourceInstance;\n\n // Call walker init to trigger detection of load/visible actions\n // This is crucial for events with load: or visible: triggers to fire\n if (sourceInstance.push && iframe.contentDocument?.body) {\n await sourceInstance.push('walker init', {\n scope: iframe.contentDocument.body,\n });\n }\n } catch (error) {\n // Browser source initialization failed - silently ignore in preview context\n // Error is expected in test/iframe environments\n }\n }, 50);\n }\n }, 200);\n\n return () => {\n if (updateTimeoutRef.current) {\n clearTimeout(updateTimeoutRef.current);\n }\n\n // Cleanup source instance\n if (sourceInstanceRef.current) {\n sourceInstanceRef.current.destroy?.();\n }\n };\n }, [html, css, highlights, autoMarkProperties]);\n\n return (\n <Box\n header={label}\n footer={<PreviewFooter highlights={highlights} onToggle={toggleHighlight} />}\n >\n <div className=\"elb-preview-content\">\n <iframe\n ref={iframeRef}\n className=\"elb-preview-iframe\"\n title=\"HTML Preview\"\n />\n </div>\n </Box>\n );\n}\n","import React from 'react';\n\nexport interface PreviewFooterButton {\n type: string;\n label: string;\n highlightClass: string;\n}\n\nexport interface PreviewFooterProps {\n highlights: Set<string>;\n onToggle: (type: string) => void;\n buttons?: PreviewFooterButton[];\n}\n\nconst defaultButtons: PreviewFooterButton[] = [\n { type: 'context', label: 'Context', highlightClass: 'highlight-context' },\n { type: 'entity', label: 'Entity', highlightClass: 'highlight-entity' },\n { type: 'property', label: 'Property', highlightClass: 'highlight-property' },\n { type: 'action', label: 'Action', highlightClass: 'highlight-action' },\n];\n\n/**\n * PreviewFooter - Footer with highlight toggle buttons\n *\n * Renders a set of buttons to toggle highlighting of walkerOS data attributes.\n * Designed to be used with Box footer prop for preview components.\n *\n * @example\n * const [highlights, setHighlights] = useState<Set<string>>(new Set());\n * const handleToggle = (type: string) => {\n * setHighlights(prev => {\n * const next = new Set(prev);\n * next.has(type) ? next.delete(type) : next.add(type);\n * return next;\n * });\n * };\n *\n * <Box footer={<PreviewFooter highlights={highlights} onToggle={handleToggle} />}>\n * Preview content\n * </Box>\n */\nexport function PreviewFooter({\n highlights,\n onToggle,\n buttons = defaultButtons,\n}: PreviewFooterProps) {\n return (\n <div className=\"elb-preview-footer\">\n {buttons.map((button) => (\n <button\n key={button.type}\n className={`elb-preview-btn ${\n highlights.has(button.type) ? button.highlightClass : ''\n }`}\n onClick={() => onToggle(button.type)}\n type=\"button\"\n >\n {button.label}\n </button>\n ))}\n </div>\n );\n}\n","import React, { useState, useMemo } from 'react';\nimport { Box } from '../atoms/box';\nimport { ButtonGroup } from '../atoms/button-group';\nimport { Preview } from '../molecules/preview';\nimport { Code } from '../atoms/code';\n\nexport interface BrowserBoxProps {\n html?: string;\n css?: string;\n js?: string;\n onHtmlChange?: (value: string) => void;\n onCssChange?: (value: string) => void;\n onJsChange?: (value: string) => void;\n showPreview?: boolean;\n label?: string;\n className?: string;\n initialTab?: 'preview' | 'html' | 'css' | 'js';\n lineNumbers?: boolean;\n wordWrap?: boolean;\n}\n\n/**\n * BrowserBox - Code editor with HTML/CSS/JS toggle\n *\n * Displays code editor with button group to switch between HTML, CSS, and JavaScript.\n * Only shows tabs for content that is provided.\n *\n * @example\n * <BrowserBox\n * html={htmlCode}\n * css={cssCode}\n * onHtmlChange={setHtml}\n * onCssChange={setCss}\n * label=\"Code\"\n * />\n */\nexport function BrowserBox({\n html,\n css,\n js,\n onHtmlChange,\n onCssChange,\n onJsChange,\n showPreview = true,\n label = 'Code',\n className = '',\n initialTab,\n lineNumbers = false,\n wordWrap = false,\n}: BrowserBoxProps) {\n // Determine available tabs\n const availableTabs = useMemo(() => {\n const tabs: Array<{ label: string; value: string }> = [];\n if (showPreview && html !== undefined)\n tabs.push({ label: 'Preview', value: 'preview' });\n if (html !== undefined) tabs.push({ label: 'HTML', value: 'html' });\n if (css !== undefined) tabs.push({ label: 'CSS', value: 'css' });\n if (js !== undefined) tabs.push({ label: 'JS', value: 'js' });\n return tabs;\n }, [html, css, js, showPreview]);\n\n // Set initial active tab\n const [activeTab, setActiveTab] = useState<string>(() => {\n if (initialTab && availableTabs.some((t) => t.value === initialTab)) {\n return initialTab;\n }\n return availableTabs[0]?.value || 'preview';\n });\n\n // Get current content and language\n const { content, language, onChange } = useMemo(() => {\n switch (activeTab) {\n case 'html':\n return {\n content: html || '',\n language: 'html' as const,\n onChange: onHtmlChange,\n };\n case 'css':\n return {\n content: css || '',\n language: 'css' as const,\n onChange: onCssChange,\n };\n case 'js':\n return {\n content: js || '',\n language: 'javascript' as const,\n onChange: onJsChange,\n };\n default:\n return {\n content: '',\n language: 'text' as const,\n onChange: undefined,\n };\n }\n }, [activeTab, html, css, js, onHtmlChange, onCssChange, onJsChange]);\n\n // Build button group data\n const buttons = useMemo(\n () =>\n availableTabs.map((tab) => ({\n label: tab.label,\n value: tab.value,\n active: activeTab === tab.value,\n })),\n [availableTabs, activeTab],\n );\n\n return (\n <Box\n header={label}\n headerActions={\n availableTabs.length > 1 ? (\n <ButtonGroup buttons={buttons} onButtonClick={setActiveTab} />\n ) : null\n }\n className={className}\n >\n {activeTab === 'preview' ? (\n <Preview html={html || ''} css={css || ''} />\n ) : (\n <Code\n code={content}\n language={language}\n onChange={onChange}\n disabled={!onChange}\n lineNumbers={lineNumbers}\n wordWrap={wordWrap}\n />\n )}\n </Box>\n );\n}\n","import React from 'react';\n\nexport interface ButtonProps {\n active?: boolean;\n onClick?: () => void;\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * Button - Button component for headers and controls\n *\n * Used in button groups or standalone in headers.\n * Follows atomic design principles as a base atom.\n */\nexport function Button({\n active = false,\n onClick,\n children,\n className = '',\n}: ButtonProps) {\n return (\n <button\n className={`elb-explorer-btn ${active ? 'active' : ''} ${className}`}\n onClick={onClick}\n type=\"button\"\n >\n {children}\n </button>\n );\n}\n","import React from 'react';\nimport { Button } from './button';\n\nexport interface ButtonGroupProps {\n buttons: Array<{\n label: string;\n value: string;\n active?: boolean;\n }>;\n onButtonClick: (value: string) => void;\n className?: string;\n}\n\n/**\n * ButtonGroup - Segmented control for headers\n *\n * Displays multiple buttons in a grouped segmented control style.\n * Commonly used for tab switching (HTML/CSS/JS, etc.)\n */\nexport function ButtonGroup({\n buttons,\n onButtonClick,\n className = '',\n}: ButtonGroupProps) {\n return (\n <div className={`elb-explorer-button-group ${className}`}>\n {buttons.map((button) => (\n <Button\n key={button.value}\n active={button.active}\n onClick={() => onButtonClick(button.value)}\n >\n {button.label}\n </Button>\n ))}\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport { startFlow } from '@walkeros/collector';\nimport type { DestinationCode } from '../../helpers/destinations';\nimport { CodeBox } from '../molecules/code-box';\n\nexport interface CollectorBoxProps {\n event: string;\n mapping: string;\n destination: DestinationCode;\n label?: string;\n wordWrap?: boolean;\n}\n\n/**\n * CollectorBox - Runs a collector with destination to transform events\n *\n * Takes raw event and mapping config, processes through collector pipeline,\n * and displays the formatted destination output.\n *\n * @example\n * <CollectorBox\n * event={JSON.stringify(event)}\n * mapping={mappingConfig}\n * destination={createGtagDestination()}\n * label=\"Result\"\n * />\n */\nexport function CollectorBox({\n event,\n mapping,\n destination,\n label = 'Result',\n wordWrap = false,\n}: CollectorBoxProps) {\n const [output, setOutput] = useState(\n '// Click elements in the preview to see function call',\n );\n\n useEffect(() => {\n (async () => {\n try {\n // Parse inputs\n const eventObj = JSON.parse(event);\n const mappingObj = JSON.parse(mapping);\n\n // Create collector with destination\n const { collector } = await startFlow({\n destinations: {\n demo: {\n code: destination,\n config: {\n mapping: mappingObj,\n },\n env: {\n elb: setOutput,\n },\n },\n },\n });\n\n // Push event through collector → destination\n await collector.push(eventObj);\n } catch (error) {\n if (error instanceof Error) {\n setOutput(`// Error: ${error.message}`);\n } else {\n setOutput(`// Error: ${String(error)}`);\n }\n }\n })();\n }, [event, mapping, destination]);\n\n return (\n <CodeBox\n code={output}\n language=\"javascript\"\n disabled\n label={label}\n wordWrap={wordWrap}\n />\n );\n}\n","import type { Destination, WalkerOS } from '@walkeros/core';\n\n// Demo destination type with elb function in env\nexport interface DemoEnv extends Destination.BaseEnv {\n elb: (output: string) => void;\n}\n\nexport type DestinationCode = Destination.Instance<\n Destination.Types<unknown, unknown, DemoEnv>\n>;\n\n/**\n * Creates a gtag-style destination for demo purposes.\n * Formats output as: gtag('event', 'event_name', { data })\n */\nexport function createGtagDestination(): DestinationCode {\n return {\n type: 'gtag',\n config: {},\n push(event, context) {\n const { data, mapping, env } = context;\n const name = mapping?.name || event.name;\n\n const formatted = `gtag('event', '${name}', ${JSON.stringify(data, null, 2)});`;\n env.elb(formatted);\n },\n };\n}\n\n/**\n * Creates a Facebook Pixel-style destination for demo purposes.\n * Formats output as: fbq('track', 'EventName', { data })\n */\nexport function createFbqDestination(): DestinationCode {\n return {\n type: 'fbq',\n config: {},\n push(event, context) {\n const { data, mapping, env } = context;\n const name = mapping?.name || event.name;\n\n const formatted = `fbq('track', '${name}', ${JSON.stringify(data, null, 2)});`;\n env.elb(formatted);\n },\n };\n}\n\n/**\n * Creates a Plausible-style destination for demo purposes.\n * Formats output as: plausible('event_name', { props: { data } })\n */\nexport function createPlausibleDestination(): DestinationCode {\n return {\n type: 'plausible',\n config: {},\n push(event, context) {\n const { data, mapping, env } = context;\n const name = mapping?.name || event.name;\n\n const formatted = `plausible('${name}', { props: ${JSON.stringify(data, null, 2)} });`;\n env.elb(formatted);\n },\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { WalkerOS } from '@walkeros/core';\nimport { debounce, isString, tryCatchAsync } from '@walkeros/core';\nimport { CodeBox } from '../molecules/code-box';\nimport { Grid } from '../atoms/grid';\nimport { cn } from '@/lib/utils';\n\nexport interface LiveCodeProps {\n input: unknown;\n config?: unknown;\n output?: unknown;\n options?: WalkerOS.AnyObject;\n fn?: (\n input: unknown,\n config: unknown,\n log: (...args: unknown[]) => void,\n options?: WalkerOS.AnyObject,\n ) => Promise<void>;\n fnName?: string;\n labelInput?: string;\n labelConfig?: string;\n labelOutput?: string;\n emptyText?: string;\n disableInput?: boolean;\n disableConfig?: boolean;\n showQuotes?: boolean;\n className?: string;\n}\n\nfunction formatValue(value: unknown, options: { quotes?: boolean } = {}) {\n if (value === undefined) return '';\n const str = isString(value) ? value : JSON.stringify(value, null, 2);\n return options.quotes && isString(value) ? `\"${str}\"` : str;\n}\n\nexport function LiveCode({\n input: initInput,\n config: initConfig,\n output: initOutput = '',\n options,\n fn,\n fnName,\n labelInput = 'Event',\n labelConfig = 'Config',\n labelOutput = 'Result',\n emptyText = 'No event yet.',\n disableInput = false,\n disableConfig = false,\n showQuotes = true,\n className,\n}: LiveCodeProps) {\n const [input, setInput] = useState(formatValue(initInput));\n const [config, setConfig] = useState(formatValue(initConfig));\n const [output, setOutput] = useState([formatValue(initOutput)]);\n\n const log = useCallback(\n (...args: unknown[]) => {\n const params = args\n .map((arg) => formatValue(arg, { quotes: showQuotes }))\n .join(', ');\n setOutput([fnName ? `${fnName}(${params})` : params]);\n },\n [fnName, showQuotes],\n );\n\n const updateOutput = useCallback(\n debounce(\n async (inputStr: string, configStr: string, opts: WalkerOS.AnyObject) => {\n if (!fn) return;\n setOutput([]);\n await tryCatchAsync(fn, (e) => {\n setOutput([`Error: ${String(e)}`]);\n })(inputStr, configStr, log, opts);\n },\n 500,\n true,\n ),\n [fn, log],\n );\n\n useEffect(() => {\n updateOutput(input, config, options || {});\n }, [input, config, options, updateOutput]);\n\n return (\n <Grid columns={3} className={className}>\n <CodeBox\n label={labelInput}\n code={input}\n onChange={disableInput ? undefined : setInput}\n disabled={disableInput}\n language=\"json\"\n showFormat={!disableInput}\n />\n\n {config && (\n <CodeBox\n label={labelConfig}\n code={config}\n onChange={disableConfig ? undefined : setConfig}\n disabled={disableConfig}\n language=\"json\"\n showFormat={!disableConfig}\n />\n )}\n\n <CodeBox\n label={labelOutput}\n code={output[0] || emptyText}\n disabled\n language=\"json\"\n />\n </Grid>\n );\n}\n","import { useState, useMemo, useCallback } from 'react';\nimport { Box } from '../../atoms/box';\nimport { ButtonGroup } from '../../atoms/button-group';\nimport { CodeBox } from '../../molecules/code-box';\nimport { ConfigEditorTabs, type NavigationState } from './config-editor-tabs';\nimport type { ConfigStructureDef } from '../../../schemas/config-structures/types';\nimport type { RJSFSchema } from '@rjsf/utils';\n\n/**\n * Config Editor Box\n *\n * Wrapper component that provides Code/Visual toggle.\n * Persists navigation state when switching between views.\n *\n * @example\n * <ConfigEditorBox\n * config={destinationConfig}\n * onChange={setConfig}\n * structure={DESTINATION_CONFIG_STRUCTURE}\n * schemas={metaSchemas}\n * label=\"Meta Pixel Configuration\"\n * />\n */\nexport interface ConfigEditorBoxProps<T extends Record<string, unknown>> {\n config: T;\n onChange?: (config: T) => void;\n structure: ConfigStructureDef;\n schemas?: Record<string, RJSFSchema>;\n sections?: Record<string, boolean>;\n label?: string;\n className?: string;\n initialTab?: 'code' | 'visual';\n resizable?: boolean;\n showTree?: boolean;\n showHeader?: boolean;\n initialNavigationState?: NavigationState;\n onNavigationStateChange?: (state: NavigationState) => void;\n}\n\nexport function ConfigEditorBox<T extends Record<string, unknown>>({\n config,\n onChange,\n structure,\n schemas,\n sections,\n label = 'Configuration',\n className = '',\n initialTab = 'visual',\n resizable = false,\n showTree = true,\n showHeader = true,\n initialNavigationState,\n onNavigationStateChange,\n}: ConfigEditorBoxProps<T>) {\n const [activeTab, setActiveTab] = useState<'code' | 'visual'>(initialTab);\n\n // Persist navigation state across view switches\n const [persistedNavigationState, setPersistedNavigationState] =\n useState<NavigationState | null>(initialNavigationState || null);\n\n // Convert config to JSON string\n const configJson = useMemo(() => JSON.stringify(config, null, 2), [config]);\n\n // Build button group data\n const buttons = useMemo(\n () => [\n {\n label: 'Visual',\n value: 'visual',\n active: activeTab === 'visual',\n },\n {\n label: 'Code',\n value: 'code',\n active: activeTab === 'code',\n },\n ],\n [activeTab],\n );\n\n // Handle tab change\n const handleTabChange = (value: string) => {\n setActiveTab(value as 'code' | 'visual');\n };\n\n // Handle code changes\n const handleCodeChange = (newCode: string) => {\n if (!onChange) return;\n\n try {\n const newConfig = JSON.parse(newCode);\n onChange(newConfig);\n } catch (e) {\n // Invalid JSON - ignore (expected during editing)\n }\n };\n\n // Handle navigation state persistence\n // Memoize to prevent infinite re-render loop in useEffect dependencies\n const handleNavigationChange = useCallback(\n (state: NavigationState) => {\n setPersistedNavigationState(state);\n onNavigationStateChange?.(state);\n },\n [onNavigationStateChange],\n );\n\n return (\n <Box\n header={label}\n headerActions={\n showHeader ? (\n <ButtonGroup buttons={buttons} onButtonClick={handleTabChange} />\n ) : undefined\n }\n className={className}\n resizable={resizable}\n showHeader={showHeader}\n >\n {activeTab === 'code' ? (\n <CodeBox\n code={configJson}\n language=\"json\"\n label={label}\n disabled={!onChange}\n onChange={onChange ? handleCodeChange : undefined}\n />\n ) : (\n <ConfigEditorTabs\n config={config}\n onChange={onChange}\n structure={structure}\n schemas={schemas}\n sections={sections}\n showTree={showTree}\n initialNavigationState={persistedNavigationState || undefined}\n onNavigationStateChange={handleNavigationChange}\n />\n )}\n </Box>\n );\n}\n","import { useEffect, useState, useMemo } from 'react';\nimport type { Destination } from '@walkeros/core';\nimport {\n useMappingState,\n type UseMappingStateReturn,\n} from '../../../hooks/useMappingState';\nimport {\n useMappingNavigation,\n type NodeType,\n} from '../../../hooks/useMappingNavigation';\nimport { useTreeState } from '../../../hooks/useTreeState';\nimport { MappingNavigationHeader } from '../../molecules/mapping-navigation-header';\nimport { ConfigTreeSidebar } from '../../molecules/config-tree-sidebar';\nimport { MappingPane } from '../../molecules/mapping-pane';\nimport { ConfigOverviewPane } from '../../molecules/config-overview-pane';\nimport { ValidationOverviewPane } from '../../molecules/validation-overview-pane';\nimport { CodeBox } from '../../molecules/code-box';\nimport { getValueAtPath } from '../../../utils/mapping-path';\nimport type { ConfigStructureDef } from '../../../schemas/config-structures/types';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport { buildTree } from '../../../utils/generic-tree-builder';\nimport { detectNodeType } from '../../../utils/type-detector';\nimport { validateConfig } from '../../../utils/config-validator';\n\n/**\n * Generic Config Editor Tabs\n *\n * Core editor component that works with any config type at any depth.\n * Uses structure definitions and schemas to provide appropriate editing UI.\n *\n * Features:\n * - Generic tree navigation (config-driven)\n * - Structure-aware type detection\n * - Validation with error overview\n * - Code/Visual toggle support\n * - Works at any depth (full config or nested object)\n *\n * @example\n * // Full DestinationConfig\n * <ConfigEditorTabs\n * config={destinationConfig}\n * onChange={setConfig}\n * structure={DESTINATION_CONFIG_STRUCTURE}\n * schemas={{ settings: settingsSchema, mapping: mappingSchema }}\n * />\n *\n * @example\n * // Single Rule\n * <ConfigEditorTabs\n * config={ruleConfig}\n * onChange={setRuleConfig}\n * structure={MAPPING_RULE_STRUCTURE}\n * schemas={{ mapping: mappingSettingsSchema }}\n * />\n */\nexport interface ConfigEditorTabsProps<T extends Record<string, unknown>> {\n config: T;\n onChange?: (config: T) => void;\n structure: ConfigStructureDef;\n schemas?: Record<string, RJSFSchema>;\n sections?: Record<string, boolean>;\n showTree?: boolean;\n initialNavigationState?: NavigationState;\n onNavigationStateChange?: (state: NavigationState) => void;\n className?: string;\n}\n\nexport interface NavigationState {\n currentPath: string[];\n nodeType: NodeType;\n expandedPaths: string[][];\n}\n\nexport function ConfigEditorTabs<T extends Record<string, unknown>>({\n config,\n onChange,\n structure,\n schemas,\n sections = {},\n showTree = true,\n initialNavigationState,\n onNavigationStateChange,\n className = '',\n}: ConfigEditorTabsProps<T>) {\n const mappingState = useMappingState(config as Destination.Config, onChange as ((config: Destination.Config) => void) | undefined);\n const navigation = useMappingNavigation({\n config,\n structure,\n schemas,\n });\n const treeState = useTreeState(initialNavigationState?.expandedPaths || [[]]);\n const [codeViewActive, setCodeViewActive] = useState(false);\n\n // Build tree using unified tree builder\n const configTree = useMemo(\n () => buildTree(config, structure, schemas, sections),\n [config, structure, schemas, sections],\n );\n\n // Validate config\n const validationErrors = useMemo(\n () => validateConfig(config as Record<string, unknown>, schemas),\n [config, schemas],\n );\n\n // Get active tab\n const activeTab = navigation.openTabs.find(\n (tab) => tab.id === navigation.activeTabId,\n );\n\n // Get code for current path\n const currentCode = useMemo(() => {\n if (!activeTab || activeTab.path.length === 0) {\n return JSON.stringify(config, null, 2);\n }\n\n const value = getValueAtPath(\n config as Record<string, unknown>,\n activeTab.path,\n );\n return JSON.stringify(value, null, 2);\n }, [activeTab, config]);\n\n // Handle code changes\n const handleCodeChange = (code: string) => {\n if (!onChange) return;\n\n try {\n const parsed = JSON.parse(code);\n\n if (!activeTab || activeTab.path.length === 0) {\n onChange(parsed as T);\n } else {\n const newConfig = { ...config };\n let current: Record<string, unknown> = newConfig as Record<string, unknown>;\n\n // Navigate to parent\n for (let i = 0; i < activeTab.path.length - 1; i++) {\n current = current[activeTab.path[i]] as Record<string, unknown>;\n }\n\n // Update value\n current[activeTab.path[activeTab.path.length - 1]] = parsed;\n onChange(newConfig);\n }\n } catch (e) {\n // Invalid JSON, don't update\n }\n };\n\n // Initialize navigation history with Overview\n useEffect(() => {\n if (navigation.navigationHistory.length === 0) {\n navigation.switchToTab('');\n\n if (\n initialNavigationState &&\n initialNavigationState.currentPath.length > 0\n ) {\n navigation.openTab(\n initialNavigationState.currentPath,\n initialNavigationState.nodeType,\n );\n }\n }\n }, []);\n\n // Persist navigation state changes\n useEffect(() => {\n if (onNavigationStateChange && activeTab) {\n onNavigationStateChange({\n currentPath: activeTab.path,\n nodeType: activeTab.nodeType,\n expandedPaths: Array.from(treeState.expandedPaths).map((key) =>\n key.split('.'),\n ),\n });\n }\n }, [activeTab, treeState.expandedPaths, onNavigationStateChange]);\n\n // Auto-expand tree to show active tab path\n useEffect(() => {\n if (activeTab && activeTab.path.length > 0) {\n for (let i = 1; i <= activeTab.path.length; i++) {\n const pathToExpand = activeTab.path.slice(0, i);\n treeState.expandPath(pathToExpand);\n }\n }\n }, [activeTab?.id]);\n\n // Get NodeType for a path using structure\n const getNodeTypeForPath = (path: string[]): NodeType => {\n const value = mappingState.actions.getValue(path);\n return detectNodeType(value, path, structure, schemas);\n };\n\n return (\n <div\n className={`elb-mapping-editor-tabs elb-mapping-editor-tabs--responsive ${className}`}\n data-layout=\"responsive\"\n >\n {/* Tree Sidebar */}\n {showTree && (\n <>\n <div\n className=\"elb-mapping-editor-mobile-backdrop\"\n onClick={() => navigation.setTreeVisible(false)}\n aria-hidden=\"true\"\n />\n <ConfigTreeSidebar\n tree={configTree}\n currentPath={activeTab?.path || []}\n expandedPaths={treeState.expandedPaths}\n visible={navigation.treeVisible}\n onToggle={treeState.togglePath}\n onNavigate={(path) => {\n const nodeType = getNodeTypeForPath(path);\n navigation.openTab(path, nodeType);\n }}\n onClose={() => navigation.setTreeVisible(false)}\n className=\"elb-mapping-editor-sidebar\"\n />\n </>\n )}\n\n {/* Main Editor Area */}\n <div className=\"elb-mapping-editor-main\">\n {/* Navigation Header */}\n <MappingNavigationHeader\n breadcrumb={navigation.breadcrumb}\n paneType={codeViewActive ? undefined : activeTab?.nodeType}\n showTreeButton={showTree}\n showCodeButton={!!activeTab}\n codeViewActive={codeViewActive}\n showDeleteButton={activeTab && activeTab.path.length > 0}\n validationErrors={validationErrors.length}\n onNavigate={(path) => {\n if (path.length === 0) {\n navigation.closeAllTabs();\n } else {\n navigation.navigateToBreadcrumb(path);\n }\n }}\n onToggleTree={navigation.toggleTree}\n onToggleCode={() => setCodeViewActive(!codeViewActive)}\n onValidationClick={() => {\n navigation.openTab([], 'validationOverview' as NodeType);\n }}\n onDeleteClick={() => {\n if (activeTab) {\n const path = activeTab.path;\n mappingState.actions.deleteValue(path);\n\n if (path.length > 1) {\n // Navigate to parent\n const parentPath = path.slice(0, -1);\n const parentType = getNodeTypeForPath(parentPath);\n navigation.openTab(parentPath, parentType);\n } else {\n // Close tab\n navigation.closeTab(activeTab.id);\n }\n }\n }}\n />\n\n {/* Editor Pane */}\n <div className=\"elb-mapping-editor-content\">\n {codeViewActive ? (\n <CodeBox\n code={currentCode}\n language=\"json\"\n label=\"\"\n onChange={onChange ? handleCodeChange : undefined}\n showFormat={!!onChange}\n showHeader={false}\n />\n ) : activeTab ? (\n activeTab.nodeType === 'validationOverview' ? (\n <ValidationOverviewPane\n errors={validationErrors}\n navigation={navigation}\n config={config}\n structure={structure}\n schemas={schemas}\n />\n ) : (\n <MappingPane\n nodeType={activeTab.nodeType}\n path={activeTab.path}\n mappingState={mappingState}\n navigation={navigation}\n schemas={schemas as Record<string, RJSFSchema>}\n structure={structure}\n />\n )\n ) : (\n <ConfigOverviewPane\n config={config}\n structure={structure}\n navigation={navigation}\n schemas={schemas}\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useRef } from 'react';\nimport type { Mapping } from '@walkeros/core';\nimport {\n getValueAtPath,\n setValueAtPath,\n deleteAtPath,\n parseRulePath,\n buildRulePath,\n} from '../utils/mapping-path';\n\n/**\n * Centralized mapping configuration state management\n *\n * This hook provides a single source of truth for the entire mapping config.\n * All CRUD operations go through this hook, making state management predictable\n * and testable.\n *\n * Features:\n * - Path-based value access and mutation\n * - Rule CRUD operations\n * - Immutable updates (no direct mutations)\n * - Change callback for external synchronization\n *\n * @example\n * const mappingState = useMappingState(initialMapping);\n *\n * // Read\n * const rule = mappingState.getValueAtPath(['product', 'view']);\n *\n * // Update\n * mappingState.setValueAtPath(['product', 'view', 'name'], 'view_item');\n *\n * // Delete\n * mappingState.deleteRule('product', 'view');\n */\nexport function useMappingState(\n initialMapping: Mapping.Config,\n onChange?: (config: Mapping.Config) => void,\n) {\n const [config, setConfig] = useState<Mapping.Config>(initialMapping);\n\n // Track if onChange callback is currently being fired to prevent loops\n const isCallingOnChange = useRef(false);\n\n /**\n * Internal state updater that also triggers onChange callback\n */\n const updateConfig = useCallback(\n (newConfig: Mapping.Config) => {\n setConfig(newConfig);\n\n // Call onChange if provided and not already in callback\n if (onChange && !isCallingOnChange.current) {\n isCallingOnChange.current = true;\n onChange(newConfig);\n isCallingOnChange.current = false;\n }\n },\n [onChange],\n );\n\n /**\n * Get value at path\n */\n const getValue = useCallback(\n (path: string[]) => {\n return getValueAtPath(config, path);\n },\n [config],\n );\n\n /**\n * Set value at path (immutable update)\n */\n const setValue = useCallback(\n (path: string[], value: unknown) => {\n const newConfig = setValueAtPath(config, path, value) as Mapping.Config;\n updateConfig(newConfig);\n },\n [config, updateConfig],\n );\n\n /**\n * Delete value at path (immutable delete)\n */\n const deleteValue = useCallback(\n (path: string[]) => {\n const newConfig = deleteAtPath(config, path) as Mapping.Config;\n updateConfig(newConfig);\n },\n [config, updateConfig],\n );\n\n /**\n * Get list of all rules in format \"entity action\"\n */\n const getRuleList = useCallback((): string[] => {\n const rules: string[] = [];\n const configRecord = config as Record<string, Record<string, unknown>>;\n\n Object.keys(config).forEach((entity) => {\n const actions = configRecord[entity] as\n | Record<string, unknown>\n | undefined;\n if (actions && typeof actions === 'object') {\n Object.keys(actions).forEach((action) => {\n rules.push(buildRulePath(entity, action));\n });\n }\n });\n\n return rules.sort();\n }, [config]);\n\n /**\n * Get rule configuration\n */\n const getRule = useCallback(\n (entity: string, action: string) => {\n return getValue([entity, action]);\n },\n [getValue],\n );\n\n /**\n * Create new rule with default configuration\n */\n const createRule = useCallback(\n (entity: string, action: string, initialConfig?: unknown) => {\n const path = [entity, action];\n\n // Check if rule already exists\n if (getValue(path)) {\n console.warn(`Rule \"${entity} ${action}\" already exists`);\n return;\n }\n\n // Default config: just the name field\n const defaultConfig = initialConfig || {\n name: `${entity}_${action}`,\n };\n\n // Create entity object if it doesn't exist\n let newConfig = config;\n const configRecord = newConfig as Record<string, Record<string, unknown>>;\n if (!configRecord[entity]) {\n newConfig = { ...newConfig, [entity]: {} };\n }\n\n // Add the rule\n newConfig = setValueAtPath(\n newConfig,\n path,\n defaultConfig,\n ) as Mapping.Config;\n updateConfig(newConfig);\n },\n [config, getValue, updateConfig],\n );\n\n /**\n * Delete rule\n */\n const deleteRule = useCallback(\n (entity: string, action: string) => {\n let newConfig = deleteAtPath(config, [entity, action]) as Mapping.Config;\n\n // Remove entity if no actions left\n const configRecord = newConfig as Record<string, Record<string, unknown>>;\n const entityActions = configRecord[entity] as\n | Record<string, unknown>\n | undefined;\n if (entityActions && Object.keys(entityActions).length === 0) {\n newConfig = deleteAtPath(newConfig, [entity]) as Mapping.Config;\n }\n\n updateConfig(newConfig);\n },\n [config, updateConfig],\n );\n\n /**\n * Update entire config (for external changes)\n */\n const replaceConfig = useCallback(\n (newConfig: Mapping.Config) => {\n updateConfig(newConfig);\n },\n [updateConfig],\n );\n\n return {\n config,\n actions: {\n getValue,\n setValue,\n deleteValue,\n getRuleList,\n getRule,\n createRule,\n deleteRule,\n replaceConfig,\n },\n };\n}\n\n/**\n * Return type of useMappingState hook\n *\n * Provides centralized mapping state management with:\n * - config: Current mapping configuration\n * - actions: CRUD operations for mapping state\n *\n * @example\n * const mappingState: UseMappingStateReturn = useMappingState(initialConfig);\n */\nexport type UseMappingStateReturn = ReturnType<typeof useMappingState>;\n\n/**\n * @deprecated Use UseMappingStateReturn instead\n * This alias is kept for backward compatibility and will be removed in the next major version.\n */\nexport type MappingState = UseMappingStateReturn;\n","/**\n * Pure utility functions for mapping path navigation\n *\n * These functions handle:\n * - Path-based value extraction from nested objects\n * - Immutable path-based value updates\n * - Breadcrumb segment generation\n * - Rule path parsing (entity action format)\n * - Path validation and normalization\n *\n * All functions are pure (no side effects, no state, no UI)\n * Designed for maximum reusability across different UI implementations\n */\n\n/**\n * Extract value from nested object using path array\n *\n * @example\n * getValueAtPath({ data: { map: { items: 'value' } } }, ['data', 'map', 'items'])\n * // Returns: 'value'\n *\n * @example\n * getValueAtPath({ data: {} }, ['data', 'missing'])\n * // Returns: undefined\n */\nexport function getValueAtPath(obj: unknown, path: string[]): unknown {\n if (!obj || typeof obj !== 'object') return undefined;\n if (path.length === 0) return obj;\n\n let current: unknown = obj;\n\n for (const key of path) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== 'object') return undefined;\n\n current = (current as Record<string, unknown>)[key];\n }\n\n return current;\n}\n\n/**\n * Deep clone that preserves all value types including function strings\n *\n * In the explorer, functions are stored as strings (e.g., fn: \"(event) => event.data\")\n * so they need to be preserved during cloning operations.\n *\n * This implementation:\n * - Handles primitives, arrays, objects\n * - Preserves function strings\n * - Handles nested structures recursively\n * - Creates new object references (true immutability)\n */\nfunction deepClone<T>(obj: T): T {\n // Handle primitives and null\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map((item) => deepClone(item)) as unknown as T;\n }\n\n // Handle objects\n const cloned: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n }\n\n return cloned as T;\n}\n\n/**\n * Set value in nested object at path (immutable)\n *\n * Creates a new object with the value updated at the specified path.\n * Does not mutate the original object.\n *\n * @example\n * setValueAtPath({ data: { map: {} } }, ['data', 'map', 'items'], 'new')\n * // Returns: { data: { map: { items: 'new' } } }\n */\nexport function setValueAtPath(\n obj: unknown,\n path: string[],\n value: unknown,\n): unknown {\n if (!obj || typeof obj !== 'object') {\n throw new Error('Cannot set value on non-object');\n }\n\n if (path.length === 0) return value;\n\n // Deep clone for immutability\n const cloned = deepClone(obj);\n\n let current: Record<string, unknown> = cloned as Record<string, unknown>;\n\n // Navigate to parent of target\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n\n // Create missing intermediate objects\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n\n current = current[key] as Record<string, unknown>;\n }\n\n // Set the final value\n const lastKey = path[path.length - 1];\n current[lastKey] = value;\n\n return cloned;\n}\n\n/**\n * Delete value at path (immutable)\n *\n * Creates a new object with the key removed at the specified path.\n * Does not mutate the original object.\n *\n * @example\n * deleteAtPath({ data: { map: { items: 'value' } } }, ['data', 'map', 'items'])\n * // Returns: { data: { map: {} } }\n */\nexport function deleteAtPath(obj: unknown, path: string[]): unknown {\n if (!obj || typeof obj !== 'object') {\n throw new Error('Cannot delete from non-object');\n }\n\n if (path.length === 0) return undefined;\n\n const cloned = deepClone(obj);\n let current: Record<string, unknown> = cloned as Record<string, unknown>;\n\n // Navigate to parent\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (!current[key]) return cloned; // Path doesn't exist, return unchanged\n current = current[key] as Record<string, unknown>;\n }\n\n // Delete the final key\n const lastKey = path[path.length - 1];\n delete current[lastKey];\n\n return cloned;\n}\n\n/**\n * Parse rule path into entity and action\n *\n * WalkerOS uses \"ENTITY ACTION\" format with space separator\n *\n * @example\n * parseRulePath('product view')\n * // Returns: { entity: 'product', action: 'view' }\n *\n * @example\n * parseRulePath('invalid')\n * // Returns: { entity: 'invalid', action: undefined }\n */\nexport function parseRulePath(rulePath: string): {\n entity: string;\n action: string | undefined;\n} {\n const parts = rulePath\n .trim()\n .split(' ')\n .filter((p) => p.trim());\n\n if (parts.length < 2) {\n return { entity: parts[0] || '', action: undefined };\n }\n\n const [entity, ...actionParts] = parts;\n return { entity, action: actionParts.join(' ') };\n}\n\n/**\n * Build rule path from entity and action\n *\n * @example\n * buildRulePath('product', 'view')\n * // Returns: 'product view'\n */\nexport function buildRulePath(entity: string, action: string): string {\n return `${entity} ${action}`;\n}\n\n/**\n * Breadcrumb segment for UI display\n */\nexport interface BreadcrumbSegment {\n label: string;\n path: string[];\n nodeType?: string;\n}\n\n/**\n * Build breadcrumb segments from path\n *\n * Converts a flat path array into human-readable breadcrumb segments\n *\n * @example\n * buildBreadcrumbSegments(['product', 'view', 'data', 'map', 'items'])\n * // Returns: [\n * // { label: 'Overview', path: [] },\n * // { label: 'product', path: ['product'] },\n * // { label: 'view', path: ['product', 'view'] },\n * // { label: 'data', path: ['product', 'view', 'data'] },\n * // { label: 'map', path: ['product', 'view', 'data', 'map'] },\n * // { label: 'items', path: ['product', 'view', 'data', 'map', 'items'] }\n * // ]\n */\nexport function buildBreadcrumbSegments(path: string[]): BreadcrumbSegment[] {\n const segments: BreadcrumbSegment[] = [{ label: 'Overview', path: [] }];\n\n if (path.length === 0) return segments;\n\n for (let i = 0; i < path.length; i++) {\n segments.push({\n label: path[i],\n path: path.slice(0, i + 1),\n });\n }\n\n return segments;\n}\n\n/**\n * Validate if a path is valid for a mapping rule\n *\n * @example\n * isValidRulePath(['product', 'view'])\n * // Returns: true\n *\n * @example\n * isValidRulePath(['product'])\n * // Returns: false (missing action)\n */\nexport function isValidRulePath(path: string[]): boolean {\n if (path.length < 2) return false;\n\n const [entity, action] = path;\n if (!entity || !action) return false;\n if (typeof entity !== 'string' || typeof action !== 'string') return false;\n\n return true;\n}\n\n/**\n * Get parent path\n *\n * @example\n * getParentPath(['data', 'map', 'items'])\n * // Returns: ['data', 'map']\n *\n * @example\n * getParentPath(['data'])\n * // Returns: []\n *\n * @example\n * getParentPath([])\n * // Returns: []\n */\nexport function getParentPath(path: string[]): string[] {\n if (path.length === 0) return [];\n return path.slice(0, -1);\n}\n\n/**\n * Check if path is ancestor of another path\n *\n * @example\n * isAncestorPath(['data', 'map'], ['data', 'map', 'items'])\n * // Returns: true\n *\n * @example\n * isAncestorPath(['data', 'map'], ['data', 'set'])\n * // Returns: false\n */\nexport function isAncestorPath(\n ancestorPath: string[],\n descendantPath: string[],\n): boolean {\n // Empty path cannot be ancestor (even though technically it is)\n if (ancestorPath.length === 0) return false;\n if (ancestorPath.length >= descendantPath.length) return false;\n\n for (let i = 0; i < ancestorPath.length; i++) {\n if (ancestorPath[i] !== descendantPath[i]) return false;\n }\n\n return true;\n}\n\n/**\n * Normalize path by removing empty strings and trimming\n *\n * @example\n * normalizePath([' data ', '', 'map', ' items'])\n * // Returns: ['data', 'map', 'items']\n */\nexport function normalizePath(path: string[]): string[] {\n return path\n .filter((segment) => segment && segment.trim())\n .map((s) => s.trim());\n}\n","import { useState, useCallback } from 'react';\nimport { buildBreadcrumbSegments, getParentPath, getValueAtPath } from '../utils/mapping-path';\nimport type { BreadcrumbSegment } from '../utils/mapping-path';\nimport { detectNodeType } from '../utils/type-detector';\nimport type { ConfigStructureDef } from '../schemas/config-structures/types';\nimport type { RJSFSchema } from '@rjsf/utils';\n\n/**\n * Node types for different editing contexts\n */\nexport type NodeType =\n | 'entity'\n | 'rule'\n | 'name'\n | 'batch'\n | 'policy'\n | 'consent'\n | 'settings' // Config-level settings overview\n | 'options' // Config-level options (loadScript, queue, etc.)\n | 'validationOverview' // Validation errors overview\n | 'valueConfig'\n | 'valueType'\n | 'primitive' // Schema-defined string/number primitives (no ValueConfig conversion)\n | 'map'\n | 'loop'\n | 'set'\n | 'value'\n | 'fn'\n | 'validate'\n | 'condition'\n | 'enum'\n | 'boolean'\n | 'key';\n\n/**\n * Navigation tab representing an open editing context\n */\nexport interface NavigationTab {\n id: string;\n path: string[];\n nodeType: NodeType;\n label: string;\n}\n\n/**\n * Parameters for useMappingNavigation hook\n */\nexport interface UseMappingNavigationParams {\n config: unknown;\n structure: ConfigStructureDef;\n schemas?: Record<string, RJSFSchema>;\n}\n\n/**\n * Navigation state for tab-based mapping editor\n *\n * Manages:\n * - Open tabs with their paths and types\n * - Active tab selection\n * - Breadcrumb generation\n * - Tree sidebar visibility\n * - Tab opening/closing logic\n *\n * This hook is UI-agnostic - it only manages navigation state,\n * not how tabs are rendered.\n *\n * @example\n * const navigation = useMappingNavigation({\n * config: myConfig,\n * structure: MY_STRUCTURE,\n * schemas: mySchemas,\n * });\n *\n * // Open a new tab\n * navigation.openTab(['product', 'view', 'data'], 'valueConfig');\n *\n * // Switch tabs\n * navigation.switchToTab(tabId);\n *\n * // Close current level\n * navigation.closeLevel(); // Closes current tab and goes to parent\n */\nconst MAX_HISTORY_LENGTH = 50;\n\nexport function useMappingNavigation(params: UseMappingNavigationParams) {\n const { config, structure, schemas } = params;\n const [openTabs, setOpenTabs] = useState<NavigationTab[]>([]);\n const [activeTabId, setActiveTabId] = useState<string>('');\n const [treeVisible, setTreeVisible] = useState<boolean>(true);\n const [navigationHistory, setNavigationHistory] = useState<string[]>([]);\n\n /**\n * Generate unique tab ID from path\n */\n const generateTabId = useCallback((path: string[]): string => {\n return path.join('.');\n }, []);\n\n /**\n * Generate human-readable label from path\n */\n const generateLabel = useCallback(\n (path: string[], nodeType: NodeType): string => {\n if (path.length === 0) return 'Overview';\n\n // For rules, use \"entity action\" format\n if (path.length === 2 && nodeType === 'rule') {\n return `${path[0]} ${path[1]}`;\n }\n\n // For nested properties, use last segment capitalized\n const lastSegment = path[path.length - 1];\n return lastSegment.charAt(0).toUpperCase() + lastSegment.slice(1);\n },\n [],\n );\n\n /**\n * Find tab by ID\n */\n const findTab = useCallback(\n (tabId: string): NavigationTab | undefined => {\n return openTabs.find((tab) => tab.id === tabId);\n },\n [openTabs],\n );\n\n /**\n * Check if tab exists\n */\n const hasTab = useCallback(\n (path: string[]): boolean => {\n const tabId = generateTabId(path);\n return openTabs.some((tab) => tab.id === tabId);\n },\n [openTabs, generateTabId],\n );\n\n /**\n * Open new tab or switch to existing one\n */\n const openTab = useCallback(\n (path: string[], nodeType: NodeType) => {\n const tabId = generateTabId(path);\n\n // Check if tab exists and add/update if needed\n setOpenTabs((prev) => {\n const existingTab = prev.find((t) => t.id === tabId);\n if (existingTab) {\n // Update nodeType if it differs (allows refining type detection)\n if (existingTab.nodeType !== nodeType) {\n return prev.map((t) =>\n t.id === tabId ? { ...t, nodeType } : t\n );\n }\n return prev; // No change needed\n }\n\n // Create and add new tab\n const newTab: NavigationTab = {\n id: tabId,\n path,\n nodeType,\n label: generateLabel(path, nodeType),\n };\n\n return [...prev, newTab];\n });\n\n // Add to navigation history (only if switching to different tab)\n setNavigationHistory((prev) => {\n // Don't add if it's the same as current active tab\n if (prev.length > 0 && prev[prev.length - 1] === tabId) {\n return prev;\n }\n\n // Add and limit to MAX_HISTORY_LENGTH\n const newHistory = [...prev, tabId];\n if (newHistory.length > MAX_HISTORY_LENGTH) {\n return newHistory.slice(-MAX_HISTORY_LENGTH);\n }\n return newHistory;\n });\n\n // Always set as active (separate state update)\n setActiveTabId(tabId);\n },\n [generateTabId, generateLabel],\n );\n\n /**\n * Switch to existing tab\n */\n const switchToTab = useCallback((tabId: string) => {\n // Add to navigation history when switching tabs\n setNavigationHistory((prev) => {\n // Don't add if it's the same as current active tab\n if (prev.length > 0 && prev[prev.length - 1] === tabId) {\n return prev;\n }\n\n // Add and limit to MAX_HISTORY_LENGTH\n const newHistory = [...prev, tabId];\n if (newHistory.length > MAX_HISTORY_LENGTH) {\n return newHistory.slice(-MAX_HISTORY_LENGTH);\n }\n return newHistory;\n });\n\n setActiveTabId(tabId);\n }, []);\n\n /**\n * Close specific tab\n */\n const closeTab = useCallback(\n (tabId: string) => {\n // Determine new active ID based on what's left after closing\n let newActiveId = '';\n\n setOpenTabs((prev) => {\n const newTabs = prev.filter((tab) => tab.id !== tabId);\n\n // Check if the tab being closed exists and is the last one (likely active)\n const closingTab = prev.find((tab) => tab.id === tabId);\n const isLastTab = closingTab && prev[prev.length - 1]?.id === tabId;\n\n // If closing what's likely the active tab, switch to last remaining\n if (isLastTab || tabId === activeTabId) {\n if (newTabs.length > 0) {\n newActiveId = newTabs[newTabs.length - 1].id;\n } else {\n newActiveId = '';\n }\n } else {\n // Not closing active tab, keep current active\n newActiveId = activeTabId;\n }\n\n return newTabs;\n });\n\n // Update active tab\n setActiveTabId(newActiveId);\n },\n [activeTabId],\n );\n\n /**\n * Close current tab and return to parent\n *\n * If parent tab already exists, switches to it.\n * Otherwise just closes current tab.\n */\n const closeLevel = useCallback(() => {\n if (!activeTabId) return;\n\n const currentActiveId = activeTabId;\n\n // Determine what to do with active tab ID\n let newActiveId = '';\n setOpenTabs((prevTabs) => {\n const activeTab = prevTabs.find((t) => t.id === currentActiveId);\n if (!activeTab) {\n newActiveId = currentActiveId; // Keep current\n return prevTabs;\n }\n\n const parentPath = getParentPath(activeTab.path);\n const parentId = generateTabId(parentPath);\n\n // Check if parent tab exists\n const parentTab = prevTabs.find((t) => t.id === parentId);\n\n // Filter out current tab\n const newTabs = prevTabs.filter((t) => t.id !== currentActiveId);\n\n // Determine new active ID\n if (parentTab && parentPath.length >= 2) {\n newActiveId = parentId;\n } else if (newTabs.length > 0) {\n newActiveId = newTabs[newTabs.length - 1].id;\n } else {\n newActiveId = '';\n }\n\n return newTabs;\n });\n\n // Update active tab (separate state update)\n setActiveTabId(newActiveId);\n }, [activeTabId, generateTabId]);\n\n /**\n * Close all tabs\n */\n const closeAllTabs = useCallback(() => {\n setOpenTabs([]);\n setActiveTabId('');\n }, []);\n\n /**\n * Get breadcrumb for active tab\n */\n const getBreadcrumb = useCallback((): BreadcrumbSegment[] => {\n const activeTab = findTab(activeTabId);\n if (!activeTab) {\n return [{ label: 'Overview', path: [] }];\n }\n\n return buildBreadcrumbSegments(activeTab.path);\n }, [activeTabId, findTab]);\n\n /**\n * Navigate to breadcrumb segment\n */\n const navigateToBreadcrumb = useCallback(\n (segmentPath: string[]) => {\n if (segmentPath.length === 0) {\n closeAllTabs();\n return;\n }\n\n const value = getValueAtPath(config, segmentPath);\n const nodeType = detectNodeType(value, segmentPath, structure, schemas);\n openTab(segmentPath, nodeType);\n },\n [openTab, closeAllTabs, config, structure, schemas],\n );\n\n /**\n * Go back to previous tab in navigation history\n *\n * Validates that the previous tab still exists before navigating.\n * If deleted, keeps going back until a valid tab is found.\n * If no valid history, does nothing (button will be disabled).\n */\n const goBack = useCallback(() => {\n setNavigationHistory((prevHistory) => {\n if (prevHistory.length <= 1) {\n // No history to go back to\n return prevHistory;\n }\n\n // Remove current tab from history (last item)\n let workingHistory = prevHistory.slice(0, -1);\n let foundValidTab = false;\n\n // Keep popping until we find a valid tab or run out of history\n while (workingHistory.length > 0 && !foundValidTab) {\n const previousTabId = workingHistory[workingHistory.length - 1];\n\n // Special case: empty tab ID means Overview\n if (previousTabId === '') {\n setActiveTabId(''); // This will trigger Overview pane to show\n foundValidTab = true;\n return workingHistory;\n }\n\n const previousTab = openTabs.find((t) => t.id === previousTabId);\n\n if (previousTab) {\n // Found valid tab - switch to it\n setActiveTabId(previousTabId);\n foundValidTab = true;\n return workingHistory;\n } else {\n // Tab was deleted, remove from history and try again\n workingHistory = workingHistory.slice(0, -1);\n }\n }\n\n // No valid tabs found in history - clear history\n return [];\n });\n }, [openTabs]);\n\n /**\n * Check if back navigation is available\n */\n const canGoBack = useCallback((): boolean => {\n if (navigationHistory.length <= 1) return false;\n\n // Check if there's at least one valid tab in history (excluding current)\n const historyWithoutCurrent = navigationHistory.slice(0, -1);\n return historyWithoutCurrent.some(\n (tabId) =>\n // Empty tab ID (Overview) is always valid, or tab exists in openTabs\n tabId === '' || openTabs.some((tab) => tab.id === tabId),\n );\n }, [navigationHistory, openTabs]);\n\n /**\n * Toggle tree visibility\n */\n const toggleTree = useCallback(() => {\n setTreeVisible((prev) => !prev);\n }, []);\n\n /**\n * Navigate to a path using dot notation\n *\n * Enables deep linking by parsing a string path and opening all intermediate tabs.\n *\n * @param dotPath - Path in dot notation (e.g., \"page.view.data.map.items.consent\")\n *\n * @example\n * navigation.navigateToPath('page.view.consent');\n * // Opens: page entity → view rule → consent property\n *\n * @example\n * navigation.navigateToPath('product.add.data.map.items.key');\n * // Opens all intermediate tabs leading to the key property\n */\n const navigateToPath = useCallback(\n (dotPath: string) => {\n const pathArray = dotPath.split('.').filter((s) => s.trim());\n\n if (pathArray.length < 2) {\n console.warn('Invalid path for navigation:', dotPath);\n return;\n }\n\n for (let i = 1; i <= pathArray.length; i++) {\n const subPath = pathArray.slice(0, i);\n const value = getValueAtPath(config, subPath);\n const nodeType = detectNodeType(value, subPath, structure, schemas);\n openTab(subPath, nodeType);\n }\n },\n [openTab, config, structure, schemas],\n );\n\n return {\n // State\n openTabs,\n activeTabId,\n treeVisible,\n breadcrumb: getBreadcrumb(),\n navigationHistory,\n\n // Actions\n openTab,\n switchToTab,\n closeTab,\n closeLevel,\n closeAllTabs,\n navigateToBreadcrumb,\n navigateToPath,\n toggleTree,\n setTreeVisible,\n goBack,\n\n // Queries\n findTab,\n hasTab,\n canGoBack,\n };\n}\n\n/**\n * Return type of useMappingNavigation hook\n *\n * Provides tab-based navigation state management with:\n * - State: openTabs, activeTabId, treeVisible, breadcrumb, navigationHistory\n * - Actions: openTab, closeTab, navigateToPath, goBack, etc.\n * - Queries: getActiveTab, canGoBack\n *\n * @example\n * const navigation: UseMappingNavigationReturn = useMappingNavigation();\n */\nexport type UseMappingNavigationReturn = ReturnType<\n typeof useMappingNavigation\n>;\n\n/**\n * @deprecated Use UseMappingNavigationReturn instead\n * This alias is kept for backward compatibility and will be removed in the next major version.\n */\nexport type MappingNavigation = UseMappingNavigationReturn;\n","import type { Mapping } from '@walkeros/core';\n\n/**\n * Path Context Analyzer\n *\n * Provides structural understanding of mapping paths by walking the actual\n * config and inspecting values at each level.\n *\n * This is the single source of truth for understanding what a path points to\n * in the recursive mapping structure.\n */\n\n/**\n * Structural type of a path segment\n */\nexport type SegmentStructuralType =\n | 'entity' // First level: entity name\n | 'action' // Second level: action name (points to Rule)\n | 'ruleProperty' // Property of a Rule object\n | 'valueConfigProperty' // Property of a ValueConfig object\n | 'mapKey' // Key in a map object\n | 'arrayIndex'; // Index in an array\n\n/**\n * Semantic context of what's being edited\n */\nexport type SemanticContext =\n | 'overview' // Root level (no path)\n | 'entity' // Entity level (one segment)\n | 'rule' // Rule level (entity + action)\n | 'ruleProperty' // Property of rule (rule + property name)\n | 'valueConfig' // Editing a ValueConfig object\n | 'valueConfigProperty' // Property within ValueConfig\n | 'mapValue' // Value within a map\n | 'primitive'; // Primitive value (string, number, boolean)\n\n/**\n * Information about a single segment in the path\n */\nexport interface PathSegmentInfo {\n segment: string;\n index: number;\n structuralType: SegmentStructuralType;\n value: unknown;\n parentValue: unknown;\n}\n\n/**\n * Complete analysis of a path through the mapping structure\n */\nexport interface PathAnalysis {\n segments: PathSegmentInfo[];\n finalValue: unknown;\n finalContext: SemanticContext;\n isRuleLevel: boolean;\n isValueConfigLevel: boolean;\n propertyName?: string;\n}\n\n/**\n * Type guard: Check if value is a Rule object\n */\nexport function isRule(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false;\n const obj = value as Record<string, unknown>;\n\n // Rule has specific properties that ValueConfig doesn't have\n const ruleOnlyProps = [\n 'name',\n 'batch',\n 'ignore',\n 'settings',\n 'batchFn',\n 'batched',\n ];\n const valueConfigOnlyProps = ['key', 'fn', 'loop', 'set', 'validate'];\n\n const hasRuleProps = ruleOnlyProps.some((p) => p in obj);\n const hasValueConfigProps = valueConfigOnlyProps.some((p) => p in obj);\n\n // If it has rule-specific properties and no ValueConfig-only properties, it's a Rule\n return hasRuleProps && !hasValueConfigProps;\n}\n\n/**\n * Type guard: Check if value is a ValueConfig object\n */\nexport function isValueConfig(value: unknown): boolean {\n if (!value || typeof value !== 'object') return false;\n const obj = value as Record<string, unknown>;\n\n // ValueConfig markers - if ANY of these exist, it's a ValueConfig\n const markers = [\n 'key',\n 'value',\n 'fn',\n 'map',\n 'loop',\n 'set',\n 'consent',\n 'condition',\n 'validate',\n ];\n return markers.some((m) => m in obj);\n}\n\n/**\n * Type guard: Check if value is a Map object (plain object inside ValueConfig.map)\n */\nexport function isMapObject(value: unknown): boolean {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n\n // A map is a plain object. We differentiate it from ValueConfig by checking\n // if it has ValueConfig markers. If no markers, it's a map.\n return !isValueConfig(value) && !isRule(value);\n}\n\n/**\n * Analyze a path through the mapping configuration\n *\n * Walks through the config structure, inspecting values at each step to\n * determine the semantic type and context.\n *\n * @param path - Array of path segments (e.g., ['page', 'view', 'data', 'map', 'page_location', 'consent'])\n * @param config - The mapping configuration object\n * @returns Complete analysis of the path\n *\n * @example\n * const analysis = analyzePath(['page', 'view', 'consent'], config);\n * // analysis.isRuleLevel === true (consent at rule level)\n *\n * @example\n * const analysis = analyzePath(['page', 'view', 'data', 'map', 'items', 'consent'], config);\n * // analysis.isValueConfigLevel === true (consent at ValueConfig level)\n */\nexport function analyzePath(\n path: string[],\n config: Mapping.Config,\n): PathAnalysis {\n const segments: PathSegmentInfo[] = [];\n\n // Handle empty path (overview)\n if (path.length === 0) {\n return {\n segments: [],\n finalValue: config,\n finalContext: 'overview',\n isRuleLevel: false,\n isValueConfigLevel: false,\n };\n }\n\n let current: unknown = config;\n let parent: unknown = null;\n\n // Walk through each segment\n for (let i = 0; i < path.length; i++) {\n const segment = path[i];\n parent = current;\n\n // Validate we can navigate\n if (!current || typeof current !== 'object') {\n throw new Error(\n `Cannot navigate path at index ${i}: value is not an object`,\n );\n }\n\n const obj = current as Record<string, unknown>;\n current = obj[segment];\n\n // Determine structural type based on context\n let structuralType: SegmentStructuralType;\n\n if (i === 0) {\n // First segment is always entity\n structuralType = 'entity';\n } else if (i === 1) {\n // Second segment is always action (points to Rule)\n structuralType = 'action';\n } else {\n // For deeper levels, inspect parent to determine type\n if (isRule(parent)) {\n structuralType = 'ruleProperty';\n } else if (isValueConfig(parent)) {\n structuralType = 'valueConfigProperty';\n } else if (Array.isArray(parent)) {\n structuralType = 'arrayIndex';\n } else {\n // Must be a map object\n structuralType = 'mapKey';\n }\n }\n\n segments.push({\n segment,\n index: i,\n structuralType,\n value: current,\n parentValue: parent,\n });\n }\n\n // Determine final context and metadata\n const lastSegment = segments[segments.length - 1];\n const finalValue = lastSegment.value;\n const parentValue = lastSegment.parentValue;\n\n let finalContext: SemanticContext;\n let isRuleLevel = false;\n let isValueConfigLevel = false;\n let propertyName: string | undefined;\n\n if (path.length === 1) {\n finalContext = 'entity';\n } else if (path.length === 2) {\n finalContext = 'rule';\n } else {\n // Deep path - determine based on structural type\n switch (lastSegment.structuralType) {\n case 'ruleProperty':\n finalContext = 'ruleProperty';\n isRuleLevel = true;\n propertyName = lastSegment.segment;\n break;\n\n case 'valueConfigProperty':\n finalContext = 'valueConfigProperty';\n isValueConfigLevel = true;\n propertyName = lastSegment.segment;\n break;\n\n case 'mapKey':\n // A map key holds a Value (string or ValueConfig)\n if (typeof finalValue === 'string') {\n finalContext = 'primitive';\n } else if (isValueConfig(finalValue)) {\n finalContext = 'valueConfig';\n } else {\n finalContext = 'mapValue';\n }\n break;\n\n default:\n finalContext = 'valueConfig';\n }\n }\n\n return {\n segments,\n finalValue,\n finalContext,\n isRuleLevel,\n isValueConfigLevel,\n propertyName,\n };\n}\n\n/**\n * Get semantic description for a path\n *\n * Returns human-readable description of what's being edited at this path.\n *\n * @example\n * getPathDescription(['page', 'view', 'consent'], config)\n * // Returns: \"Rule-level consent for page view event\"\n *\n * @example\n * getPathDescription(['page', 'view', 'data', 'map', 'title', 'consent'], config)\n * // Returns: \"Property-level consent for title field\"\n */\nexport function getPathDescription(\n path: string[],\n config: Mapping.Config,\n): { title: string; description: string } {\n const analysis = analyzePath(path, config);\n\n if (analysis.propertyName === 'consent') {\n return {\n title: 'Required Consent States',\n description:\n 'Events or properties will only be processed if these consent states are granted',\n };\n }\n\n if (analysis.propertyName === 'settings') {\n return {\n title: 'Settings',\n description: 'Configure destination-specific settings for this rule',\n };\n }\n\n // Default descriptions\n return {\n title: `Editing ${analysis.propertyName || 'Value'}`,\n description: `Configure ${analysis.finalContext} at path: ${path.join(' → ')}`,\n };\n}\n","import type { ConfigStructureDef } from './types';\n\n/**\n * Structure Definition for Mapping.Rule\n *\n * Describes the shape of a single mapping rule (e.g., mapping.page.view):\n * - name: Event name override\n * - batch: Batch size\n * - settings: Rule-level settings\n * - data: Data transformations\n * - consent: Consent requirements\n * - condition: Condition function\n * - ignore: Ignore flag\n *\n * This structure enables editing individual rules with ConfigEditor.\n */\nexport const MAPPING_RULE_STRUCTURE: ConfigStructureDef = {\n type: 'object',\n title: 'Mapping Rule',\n description: 'Configuration for a single event mapping rule',\n rootNodeType: 'rule', // Overview shows rule properties\n\n properties: {\n // Event name override\n name: {\n title: 'Event Name',\n description: 'Custom event name override',\n nodeType: 'name',\n children: 'none',\n schemaPath: 'rule.name', // Points to rule-properties-schema\n },\n\n // Batch configuration\n batch: {\n title: 'Batch Size',\n description: 'Number of events to batch together',\n nodeType: 'batch',\n children: 'none',\n schemaPath: 'rule.batch', // Points to rule-properties-schema\n },\n\n // Rule-level settings\n settings: {\n title: 'Settings',\n description: 'Rule-specific settings',\n nodeType: 'settings', // Opens SettingsOverviewPane with tiles\n children: 'schema-driven', // Build from schemas.mapping\n schemaPath: 'mapping', // Use schemas.mapping for rule settings\n },\n\n // Data transformations\n data: {\n title: 'Data',\n description: 'Data transformations for this event',\n children: 'value-driven', // Detect from value (map, loop, value, etc.)\n },\n\n // Consent requirements\n consent: {\n title: 'Consent',\n description: 'Required consent states',\n nodeType: 'consent',\n children: 'none',\n },\n\n // Condition function\n condition: {\n title: 'Condition',\n description: 'Function to determine if rule should apply',\n nodeType: 'condition',\n children: 'none',\n },\n\n // Ignore flag\n ignore: {\n title: 'Ignore',\n description: 'Skip processing this event',\n nodeType: 'boolean',\n children: 'none',\n },\n\n // Policy (less common, but supported)\n policy: {\n title: 'Policy',\n description: 'Event-level policy rules',\n nodeType: 'policy',\n children: 'none',\n },\n },\n};\n","import type { NodeType } from '../hooks/useMappingNavigation';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport type {\n ConfigStructureDef,\n PropertyDef,\n} from '../schemas/config-structures/types';\nimport { isRule } from './path-analyzer';\nimport { MAPPING_RULE_STRUCTURE } from '../schemas/config-structures/mapping-rule';\n\n/**\n * Detect NodeType for a value at a given path\n *\n * Single source of truth for type detection. Uses structure + schemas.\n *\n * Detection priority:\n * 1. Structure definition (explicit nodeType for properties)\n * 2. Schema detection (enum, boolean, primitives from JSON Schema)\n * 3. Value introspection (for complex types and fallback)\n *\n * @param value - The value to inspect\n * @param path - Path array to the value\n * @param structure - Structure definition (REQUIRED for schema-driven detection)\n * @param schemas - Schemas bundle for this config\n * @returns NodeType for editing\n */\nexport function detectNodeType(\n value: unknown,\n path: string[],\n structure: ConfigStructureDef,\n schemas?: Record<string, RJSFSchema>,\n): NodeType {\n if (path.length === 0) {\n return structure.rootNodeType || 'entity';\n }\n\n let currentStructure = structure;\n let propertyDef: PropertyDef | undefined;\n let propertyDefIndex = -1;\n\n // Navigate structure to find property definition\n for (let i = 0; i < path.length; i++) {\n const segment = path[i];\n const foundDef = currentStructure.properties?.[segment];\n\n if (foundDef) {\n propertyDef = foundDef;\n propertyDefIndex = i;\n if (foundDef.structure) {\n currentStructure = foundDef.structure;\n }\n } else {\n break;\n }\n }\n\n // Handle entity-action pattern (mapping)\n if (propertyDef?.children === 'entity-action' && propertyDefIndex >= 0) {\n const depth = path.length - propertyDefIndex;\n\n if (depth === 1 || depth === 2) return 'entity';\n\n if (depth === 3 && isRule(value)) {\n return 'rule';\n }\n\n if (depth >= 4) {\n const rulePath = path.slice(propertyDefIndex + 3);\n return detectNodeType(value, rulePath, MAPPING_RULE_STRUCTURE, schemas);\n }\n }\n\n const skipExplicitNodeType =\n propertyDef?.children === 'entity-action' && path.length >= 3;\n\n const isAtPropertyDefEnd = propertyDefIndex === path.length - 1;\n\n // Priority 1: Explicit nodeType from structure (only at end of path)\n if (propertyDef?.nodeType && !skipExplicitNodeType && isAtPropertyDefEnd) {\n return propertyDef.nodeType;\n }\n\n // Priority 2: Schema detection\n const schema = propertyDef && schemas\n ? resolveSchema(path.slice(propertyDefIndex), propertyDef, schemas)\n : undefined;\n\n if (schema) {\n const primitiveType = typeof value;\n const isPrimitive =\n primitiveType === 'string' ||\n primitiveType === 'number' ||\n primitiveType === 'boolean' ||\n value === undefined ||\n value === null;\n\n if (schema.type === 'boolean' &&\n (primitiveType === 'boolean' || value === undefined || value === null)) {\n return 'boolean';\n }\n\n if (schema.enum && Array.isArray(schema.enum) && schema.enum.length > 0 && isPrimitive) {\n return 'enum';\n }\n\n if ((schema.type === 'string' || schema.type === 'number') && isPrimitive) {\n return 'primitive';\n }\n\n if (schema.type === 'array') {\n if (schema.minItems === 2 && schema.maxItems === 2) return 'loop';\n return 'set';\n }\n\n if (schema.type === 'object') return 'map';\n }\n\n // Priority 3: Value introspection\n if (value !== undefined && value !== null) {\n if (isRule(value)) return 'rule';\n\n if (typeof value === 'boolean') return 'boolean';\n\n if (typeof value === 'string' || typeof value === 'number') {\n return 'valueType';\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0 || value.length === 1) return 'set';\n\n if (value.length === 2) {\n const [first, second] = value;\n if (typeof second === 'object' && second !== null) {\n if (typeof first === 'string') return 'loop';\n if (typeof first === 'object' && first !== null && 'key' in first) {\n return 'loop';\n }\n }\n return 'set';\n }\n\n return 'set';\n }\n\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if ('fn' in obj) return 'fn';\n if ('loop' in obj) return 'loop';\n if ('map' in obj) return 'map';\n if ('set' in obj) return 'set';\n if ('condition' in obj) return 'condition';\n if ('validate' in obj) return 'validate';\n if ('value' in obj) return 'value';\n return 'map';\n }\n }\n\n // Priority 4: Schema fallback for undefined values\n if (schema) {\n if (schema.type === 'array') {\n if (schema.minItems === 2 && schema.maxItems === 2) return 'loop';\n return 'set';\n }\n if (schema.type === 'object') return 'map';\n if (schema.type === 'boolean') return 'boolean';\n if (schema.type === 'string' || schema.type === 'number') return 'primitive';\n }\n\n return 'valueType';\n}\n\n/**\n * Resolve schema for a property using its schemaPath\n */\nfunction resolveSchema(\n relativePath: string[],\n propertyDef: PropertyDef,\n schemas: Record<string, RJSFSchema>,\n): RJSFSchema | undefined {\n const schemaPath = propertyDef.schemaPath;\n if (!schemaPath) return undefined;\n\n let current = schemas[schemaPath];\n if (!current) return undefined;\n\n // For schema-driven properties, navigate nested schema\n if (propertyDef.children === 'schema-driven' && relativePath.length >= 2) {\n for (let i = 1; i < relativePath.length; i++) {\n const segment = relativePath[i];\n if (!current.properties || !(segment in current.properties)) {\n return undefined;\n }\n current = current.properties[segment] as RJSFSchema;\n }\n }\n\n return current;\n}\n\n/**\n * Get schema for a path (exported for components that need schema access)\n */\nexport function getSchemaForPath(\n value: unknown,\n path: string[],\n structure: ConfigStructureDef,\n schemas?: Record<string, RJSFSchema>,\n): RJSFSchema | undefined {\n if (!schemas || path.length === 0) return undefined;\n\n let currentStructure = structure;\n let propertyDef: PropertyDef | undefined;\n let propertyDefIndex = -1;\n\n for (let i = 0; i < path.length; i++) {\n const segment = path[i];\n const foundDef = currentStructure.properties?.[segment];\n\n if (foundDef) {\n propertyDef = foundDef;\n propertyDefIndex = i;\n if (foundDef.structure) {\n currentStructure = foundDef.structure;\n }\n } else {\n break;\n }\n }\n\n // Handle entity-action pattern recursively\n if (propertyDef?.children === 'entity-action' && propertyDefIndex >= 0) {\n const depth = path.length - propertyDefIndex;\n\n if (depth >= 4) {\n const rulePath = path.slice(propertyDefIndex + 3);\n return getSchemaForPath(value, rulePath, MAPPING_RULE_STRUCTURE, schemas);\n }\n }\n\n return propertyDef ? resolveSchema(path.slice(propertyDefIndex), propertyDef, schemas) : undefined;\n}\n\n/**\n * Detect NodeType from JSON Schema alone (without value or structure)\n *\n * Used for property suggestions where we only have the schema definition.\n * This is a lightweight detection based purely on JSON Schema properties.\n *\n * @param schema - JSON Schema for the property\n * @returns NodeType for editing\n */\nexport function detectNodeTypeFromSchema(schema: RJSFSchema): NodeType {\n // Check for boolean type\n if (schema.type === 'boolean') {\n return 'boolean';\n }\n\n // Check for enum with options\n if (schema.enum && Array.isArray(schema.enum) && schema.enum.length > 0) {\n return 'enum';\n }\n\n // Check for primitive string/number\n if (schema.type === 'string' || schema.type === 'number') {\n return 'primitive';\n }\n\n // Check for array\n if (schema.type === 'array') {\n // Loop arrays have exactly 2 items\n if (schema.minItems === 2 && schema.maxItems === 2) {\n return 'loop';\n }\n return 'set';\n }\n\n // Check for object\n if (schema.type === 'object') {\n return 'map';\n }\n\n // Default fallback\n return 'valueType';\n}\n","import { useState, useCallback } from 'react';\n\n/**\n * Tree expand/collapse state management\n *\n * Manages which paths in a tree view are expanded or collapsed.\n * This hook is UI-agnostic and can be used with any tree structure.\n *\n * @example\n * const treeState = useTreeState(['']); // Root expanded by default\n *\n * // Check if expanded\n * if (treeState.isExpanded(['product', 'view'])) { ... }\n *\n * // Toggle expansion\n * treeState.togglePath(['product', 'view']);\n *\n * // Expand specific path\n * treeState.expandPath(['product', 'view', 'data']);\n *\n * // Collapse specific path\n * treeState.collapsePath(['product']);\n */\nexport function useTreeState(initialExpanded: string[][] = [[]]) {\n const [expandedPaths, setExpandedPaths] = useState<Set<string>>(() => {\n return new Set(initialExpanded.map((path) => path.join('.')));\n });\n\n /**\n * Check if a path is expanded\n */\n const isExpanded = useCallback(\n (path: string[]): boolean => {\n const pathKey = path.join('.');\n return expandedPaths.has(pathKey);\n },\n [expandedPaths],\n );\n\n /**\n * Toggle path expansion\n */\n const togglePath = useCallback((path: string[]) => {\n const pathKey = path.join('.');\n setExpandedPaths((prev) => {\n const next = new Set(prev);\n if (next.has(pathKey)) {\n next.delete(pathKey);\n } else {\n next.add(pathKey);\n }\n return next;\n });\n }, []);\n\n /**\n * Expand specific path\n */\n const expandPath = useCallback((path: string[]) => {\n const pathKey = path.join('.');\n setExpandedPaths((prev) => {\n const next = new Set(prev);\n next.add(pathKey);\n return next;\n });\n }, []);\n\n /**\n * Collapse specific path\n */\n const collapsePath = useCallback((path: string[]) => {\n const pathKey = path.join('.');\n setExpandedPaths((prev) => {\n const next = new Set(prev);\n next.delete(pathKey);\n return next;\n });\n }, []);\n\n /**\n * Expand all paths\n */\n const expandAll = useCallback((allPaths: string[][]) => {\n setExpandedPaths(new Set(allPaths.map((path) => path.join('.'))));\n }, []);\n\n /**\n * Collapse all paths\n */\n const collapseAll = useCallback(() => {\n setExpandedPaths(new Set());\n }, []);\n\n return {\n expandedPaths,\n isExpanded,\n togglePath,\n expandPath,\n collapsePath,\n expandAll,\n collapseAll,\n };\n}\n\nexport type TreeState = ReturnType<typeof useTreeState>;\n","import type { BreadcrumbSegment } from '../../utils/mapping-path';\n\n/**\n * Clickable breadcrumb trail for navigation\n *\n * Displays a path like: Root > product view > Data > Map > items\n * Each segment is clickable to navigate to that level\n */\nexport interface MappingBreadcrumbProps {\n segments: BreadcrumbSegment[];\n onNavigate: (path: string[]) => void;\n className?: string;\n}\n\nexport function MappingBreadcrumb({\n segments,\n onNavigate,\n className = '',\n}: MappingBreadcrumbProps) {\n return (\n <nav\n className={`elb-mapping-breadcrumb ${className}`}\n aria-label=\"Breadcrumb\"\n >\n <ol className=\"elb-mapping-breadcrumb-list\">\n {segments.map((segment, index) => {\n const isLast = index === segments.length - 1;\n const isRoot = segment.nodeType === 'root';\n const isClickable = !isLast || isRoot;\n\n return (\n <li\n key={segment.path.join('.')}\n className=\"elb-mapping-breadcrumb-item\"\n >\n {isClickable ? (\n <>\n <button\n type=\"button\"\n className={`elb-mapping-breadcrumb-link ${isRoot ? 'is-root' : ''}`}\n onClick={() => onNavigate(segment.path)}\n aria-current={isLast ? 'page' : undefined}\n >\n {segment.label}\n </button>\n {!isLast && (\n <span\n className=\"elb-mapping-breadcrumb-separator\"\n aria-hidden=\"true\"\n >\n /\n </span>\n )}\n </>\n ) : (\n <span className=\"elb-mapping-breadcrumb-current\">\n {segment.label}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\n\n// Default trash icon\nconst TrashIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.5 1.5V2.5H2V4H3V13.5C3 14.3284 3.67157 15 4.5 15H11.5C12.3284 15 13 14.3284 13 13.5V4H14V2.5H9.5V1.5H6.5ZM4.5 4H11.5V13.5H4.5V4ZM6 5.5V12H7.5V5.5H6ZM8.5 5.5V12H10V5.5H8.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n/**\n * Confirm Button - Transforms to confirmation state on click\n *\n * When clicked, transforms to show \"Confirm?\" text with visual emphasis.\n * Clicking again confirms the action. Clicking outside or ESC cancels.\n *\n * By default, uses a trash icon. Can be overridden with custom icon.\n *\n * @example\n * <MappingConfirmButton\n * confirmLabel=\"Delete?\"\n * onConfirm={() => deleteItem()}\n * ariaLabel=\"Delete item\"\n * />\n */\nexport interface MappingConfirmButtonProps {\n /** Icon to show in default state (defaults to trash icon) */\n icon?: React.ReactNode;\n /** Label to show in confirmation state */\n confirmLabel?: string;\n /** Callback when action is confirmed */\n onConfirm: () => void;\n /** Accessibility label */\n ariaLabel: string;\n /** Additional CSS class */\n className?: string;\n}\n\nexport function MappingConfirmButton({\n icon = <TrashIcon />,\n confirmLabel = 'Confirm?',\n onConfirm,\n ariaLabel,\n className = '',\n}: MappingConfirmButtonProps) {\n const [isConfirming, setIsConfirming] = useState(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n\n // Handle click outside to cancel\n useEffect(() => {\n if (!isConfirming) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (buttonRef.current && !buttonRef.current.contains(e.target as Node)) {\n setIsConfirming(false);\n }\n };\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsConfirming(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [isConfirming]);\n\n const handleClick = () => {\n if (isConfirming) {\n // Confirm action\n onConfirm();\n setIsConfirming(false);\n } else {\n // Enter confirmation state\n setIsConfirming(true);\n }\n };\n\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n className={`elb-mapping-confirm-button ${isConfirming ? 'is-confirming' : ''} ${className}`}\n onClick={handleClick}\n aria-label={isConfirming ? confirmLabel : ariaLabel}\n title={isConfirming ? confirmLabel : ariaLabel}\n >\n {isConfirming ? confirmLabel : icon}\n </button>\n );\n}\n","import { MappingBreadcrumb } from '../atoms/mapping-breadcrumb';\nimport { MappingConfirmButton } from '../atoms/mapping-confirm-button';\nimport type { BreadcrumbSegment } from '../../utils/mapping-path';\nimport type { NodeType } from '../../hooks/useMappingNavigation';\n\n/**\n * Navigation header combining breadcrumb, tree toggle, and action button\n *\n * Displayed above the tab bar to provide context and navigation controls\n */\nexport interface MappingNavigationHeaderProps {\n breadcrumb: BreadcrumbSegment[];\n paneType?: NodeType;\n showTreeButton?: boolean;\n showCodeButton?: boolean;\n codeViewActive?: boolean;\n showActionButton?: boolean;\n actionButtonLabel?: string;\n showDeleteButton?: boolean;\n validationErrors?: number;\n onNavigate: (path: string[]) => void;\n onToggleTree?: () => void;\n onToggleCode?: () => void;\n onActionClick?: () => void;\n onDeleteClick?: () => void;\n onValidationClick?: () => void;\n className?: string;\n}\n\nexport function MappingNavigationHeader({\n breadcrumb,\n paneType,\n showTreeButton = true,\n showCodeButton = false,\n codeViewActive = false,\n showActionButton = false,\n actionButtonLabel = '+ Add',\n showDeleteButton = false,\n validationErrors = 0,\n onNavigate,\n onToggleTree,\n onToggleCode,\n onActionClick,\n onDeleteClick,\n onValidationClick,\n className = '',\n}: MappingNavigationHeaderProps) {\n return (\n <div className={`elb-mapping-navigation-header ${className}`}>\n <div className=\"elb-mapping-navigation-left\">\n {showTreeButton && (\n <button\n type=\"button\"\n className=\"elb-mapping-tree-toggle-button\"\n onClick={onToggleTree}\n aria-label=\"Toggle tree view\"\n title=\"Toggle tree view\"\n >\n ≡\n </button>\n )}\n\n <MappingBreadcrumb segments={breadcrumb} onNavigate={onNavigate} />\n\n {paneType && <span className=\"elb-mapping-pane-type\">{paneType}</span>}\n\n {validationErrors > 0 && onValidationClick && (\n <button\n type=\"button\"\n className=\"elb-validation-warning-badge\"\n onClick={onValidationClick}\n aria-label={`${validationErrors} validation ${validationErrors === 1 ? 'error' : 'errors'}`}\n title={`${validationErrors} validation ${validationErrors === 1 ? 'error' : 'errors'}. Click to view.`}\n >\n <span className=\"elb-validation-warning-icon\">⚠</span>\n <span className=\"elb-validation-warning-count\">\n {validationErrors}\n </span>\n </button>\n )}\n </div>\n\n <div className=\"elb-mapping-navigation-right\">\n {showCodeButton && onToggleCode && (\n <button\n type=\"button\"\n className={`elb-mapping-code-toggle-button ${codeViewActive ? 'is-active' : ''}`}\n onClick={onToggleCode}\n aria-label={codeViewActive ? 'Show visual view' : 'Show code view'}\n title={codeViewActive ? 'Show visual view' : 'Show code view'}\n >\n <span>{codeViewActive ? 'Visual' : 'Code'}</span>\n </button>\n )}\n\n {showDeleteButton && onDeleteClick && (\n <MappingConfirmButton\n icon={\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.5 1.5V2.5H2V4H3V13.5C3 14.3284 3.67157 15 4.5 15H11.5C12.3284 15 13 14.3284 13 13.5V4H14V2.5H9.5V1.5H6.5ZM4.5 4H11.5V13.5H4.5V4ZM6 5.5V12H7.5V5.5H6ZM8.5 5.5V12H10V5.5H8.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n }\n confirmLabel=\"Delete?\"\n onConfirm={onDeleteClick}\n ariaLabel=\"Delete this item\"\n className=\"elb-mapping-delete-button\"\n />\n )}\n\n {showActionButton && onActionClick && (\n <button\n type=\"button\"\n className=\"elb-mapping-action-button\"\n onClick={onActionClick}\n aria-label={actionButtonLabel}\n title={actionButtonLabel}\n >\n {actionButtonLabel}\n </button>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport type { ConfigTreeNode } from '../../utils/generic-tree-builder';\nimport { MappingInputWithButton } from '../atoms/mapping-input-with-button';\nimport type { NodeType } from '../../hooks/useMappingNavigation';\n\n/**\n * Tree node component for config structure (recursive)\n */\ninterface ConfigTreeNodeComponentProps {\n node: ConfigTreeNode;\n expandedPaths: Set<string>;\n selectedPath: string[];\n onToggle: (path: string[]) => void;\n onSelect: (path: string[]) => void;\n onAddAction?: (entity: string, action: string) => void;\n level: number;\n}\n\nfunction ConfigTreeNodeComponent({\n node,\n expandedPaths,\n selectedPath,\n onToggle,\n onSelect,\n onAddAction,\n level,\n}: ConfigTreeNodeComponentProps) {\n const pathKey = node.path.join('.');\n const isExpanded = expandedPaths.has(pathKey);\n const isSelected =\n node.path.length > 0 && node.path.join('.') === selectedPath.join('.');\n\n // Check if this node is an ancestor of the selected path\n const isAncestor =\n node.path.length > 0 &&\n selectedPath.length > node.path.length &&\n node.path.every((segment: string, i: number) => segment === selectedPath[i]);\n\n const hasChildren = node.children && node.children.length > 0;\n const showToggle =\n (hasChildren && node.isExpandable) ||\n node.type === 'entity' ||\n (node.key === 'mapping' && node.path.length === 1);\n const showChildren = hasChildren && isExpanded;\n\n // State for adding new action (only for entities under mapping)\n const [isAddingAction, setIsAddingAction] = useState(false);\n const [newActionName, setNewActionName] = useState('');\n const [actionExists, setActionExists] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Check if this is an entity node (path like ['mapping', 'product'])\n const isEntityNode =\n node.type === 'entity' &&\n node.path.length === 2 &&\n node.path[0] === 'mapping';\n\n // Focus input when adding action\n useEffect(() => {\n if (isAddingAction && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isAddingAction]);\n\n // Check if action exists in children\n useEffect(() => {\n if (isEntityNode && newActionName) {\n const exists =\n node.children?.some((child: ConfigTreeNode) => child.label === newActionName) ?? false;\n setActionExists(exists);\n }\n }, [newActionName, node, isEntityNode]);\n\n // Handle add action button click\n const handleAddClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!isExpanded) {\n onToggle(node.path);\n }\n setIsAddingAction(true);\n };\n\n // Handle action input submit\n const handleActionSubmit = () => {\n if (!newActionName.trim()) {\n setIsAddingAction(false);\n setNewActionName('');\n return;\n }\n\n if (actionExists) {\n // Navigate to existing action\n const existingChild = node.children?.find(\n (child: ConfigTreeNode) => child.label === newActionName,\n );\n if (existingChild) {\n onSelect(existingChild.path);\n }\n setIsAddingAction(false);\n setNewActionName('');\n setActionExists(false);\n } else if (onAddAction && isEntityNode) {\n // Create new action\n onAddAction(node.path[1], newActionName.trim());\n setIsAddingAction(false);\n setNewActionName('');\n }\n };\n\n // Handle action input key down\n const handleActionKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setIsAddingAction(false);\n setNewActionName('');\n setActionExists(false);\n }\n };\n\n // Handle row click\n const handleRowClick = (e: React.MouseEvent) => {\n const target = e.target as HTMLElement;\n const isToggleClick = target.classList.contains('elb-mapping-tree-toggle');\n const isAddButtonClick = target.classList.contains(\n 'elb-mapping-tree-add-button',\n );\n\n if (isAddButtonClick) {\n return; // Already handled by button\n }\n\n if (isToggleClick && showToggle) {\n // Clicked on toggle arrow - always toggle\n onToggle(node.path);\n } else {\n // Clicked on row - select and navigate\n onSelect(node.path);\n // Also expand if has children and not already expanded\n if (hasChildren && !isExpanded) {\n onToggle(node.path);\n }\n }\n };\n\n const displayLabel = node.label;\n\n return (\n <div\n className={`elb-mapping-tree-node elb-mapping-tree-node--level-${level}`}\n >\n <div\n className={`elb-mapping-tree-node-content ${isSelected ? 'is-selected' : ''} ${isAncestor ? 'is-ancestor' : ''} ${isEntityNode ? 'is-entity' : ''} ${!node.hasValue ? 'is-empty' : ''}`}\n onClick={handleRowClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleRowClick(e as unknown as React.MouseEvent);\n }\n }}\n >\n {/* Toggle arrow */}\n {showToggle ? (\n <span\n className={`elb-mapping-tree-toggle ${isExpanded ? 'is-expanded' : ''}`}\n >\n ›\n </span>\n ) : (\n <span className=\"elb-mapping-tree-spacer\" />\n )}\n\n {/* Label */}\n <span\n className={`elb-mapping-tree-label elb-mapping-tree-label--${node.type}`}\n >\n {displayLabel}\n </span>\n\n {/* Add button for entities under mapping */}\n {isEntityNode && onAddAction && (\n <button\n type=\"button\"\n className=\"elb-mapping-tree-add-button\"\n onClick={handleAddClick}\n aria-label=\"Add action\"\n title=\"Add action\"\n >\n +\n </button>\n )}\n </div>\n\n {showChildren && (\n <div className=\"elb-mapping-tree-children\">\n {node.children?.map((child: ConfigTreeNode) => (\n <ConfigTreeNodeComponent\n key={child.path.join('.')}\n node={child}\n expandedPaths={expandedPaths}\n selectedPath={selectedPath}\n onToggle={onToggle}\n onSelect={onSelect}\n onAddAction={onAddAction}\n level={level + 1}\n />\n ))}\n\n {/* Add action input field */}\n {isAddingAction && isEntityNode && (\n <div className=\"elb-mapping-tree-add-action\">\n <span className=\"elb-mapping-tree-spacer\" />\n <div\n ref={inputRef as React.RefObject<HTMLDivElement> | null}\n className=\"elb-mapping-tree-add-input-wrapper\"\n >\n <MappingInputWithButton\n value={newActionName}\n onChange={(val) => setNewActionName(val)}\n onSubmit={handleActionSubmit}\n onKeyDown={handleActionKeyDown}\n buttonLabel={actionExists ? 'Open' : 'Create'}\n showButton={true}\n placeholder=\"action\"\n className={`elb-mapping-tree-add-input ${actionExists ? 'is-existing' : ''}`}\n autoFocus={true}\n />\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Config Tree Sidebar - Shows full destination config structure\n *\n * Displays hierarchical structure of destination configuration:\n * - Settings\n * - Mapping (entities → actions)\n * - Data\n * - Policy\n * - Consent\n * - Options\n *\n * This is a pure presentation component - all state management\n * should be handled by the parent component.\n *\n * Features:\n * - Hierarchical tree display\n * - Expand/collapse controls\n * - Click to navigate with proper NodeType\n * - Visual indication of current path\n * - Add action buttons for entities\n *\n * @example\n * <ConfigTreeSidebar\n * tree={buildConfigTree(config, schemas, sections)}\n * currentPath={['settings']}\n * expandedPaths={expandedPathsSet}\n * visible={true}\n * onToggle={(path) => togglePath(path)}\n * onNavigate={(path) => navigate(path)}\n * />\n */\nexport interface ConfigTreeSidebarProps {\n tree: ConfigTreeNode[];\n currentPath: string[];\n expandedPaths: Set<string>;\n visible: boolean;\n onToggle: (path: string[]) => void;\n onNavigate: (path: string[]) => void;\n onAddAction?: (entity: string, action: string) => void;\n onAddEntity?: (entity: string) => void;\n onClose?: () => void;\n className?: string;\n}\n\nexport function ConfigTreeSidebar({\n tree,\n currentPath,\n expandedPaths,\n visible,\n onToggle,\n onNavigate,\n onAddAction,\n onAddEntity,\n onClose,\n className = '',\n}: ConfigTreeSidebarProps) {\n const [isAddingEntity, setIsAddingEntity] = useState(false);\n const [newEntityName, setNewEntityName] = useState('');\n const [entityExists, setEntityExists] = useState(false);\n const entityInputRef = useRef<HTMLInputElement>(null);\n\n // Focus input when adding entity\n useEffect(() => {\n if (isAddingEntity && entityInputRef.current) {\n entityInputRef.current.focus();\n }\n }, [isAddingEntity]);\n\n // Check if entity exists in mapping section\n useEffect(() => {\n if (newEntityName) {\n const mappingNode = tree.find((node: ConfigTreeNode) => node.key === 'mapping');\n const exists =\n mappingNode?.children?.some((child: ConfigTreeNode) => child.label === newEntityName) ??\n false;\n setEntityExists(exists);\n }\n }, [newEntityName, tree]);\n\n if (!visible) {\n return null;\n }\n\n const handleAddEntityClick = () => {\n setIsAddingEntity(true);\n };\n\n const handleEntityInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n setNewEntityName(e.target.value);\n };\n\n const handleEntitySubmit = () => {\n if (!newEntityName.trim()) {\n setIsAddingEntity(false);\n setNewEntityName('');\n return;\n }\n\n if (entityExists) {\n // Navigate to existing entity - find and navigate to it\n const mappingNode = tree.find((node: ConfigTreeNode) => node.key === 'mapping');\n const existingEntity = mappingNode?.children?.find(\n (child: ConfigTreeNode) => child.label === newEntityName,\n );\n if (existingEntity) {\n onNavigate(existingEntity.path);\n onToggle(existingEntity.path);\n }\n setIsAddingEntity(false);\n setNewEntityName('');\n setEntityExists(false);\n } else if (onAddEntity) {\n // Create new entity\n onAddEntity(newEntityName.trim());\n setIsAddingEntity(false);\n setNewEntityName('');\n }\n };\n\n const handleEntityKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleEntitySubmit();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setIsAddingEntity(false);\n setNewEntityName('');\n setEntityExists(false);\n }\n };\n\n const handleEntityBlur = () => {\n // Small delay to allow click events to fire, then submit\n setTimeout(() => {\n handleEntitySubmit();\n }, 150);\n };\n\n return (\n <aside\n className={`elb-mapping-tree-sidebar ${className}`}\n aria-label=\"Config structure\"\n >\n <div className=\"elb-mapping-tree-content\">\n {tree.map((node) => (\n <ConfigTreeNodeComponent\n key={node.path.join('.')}\n node={node}\n expandedPaths={expandedPaths}\n selectedPath={currentPath}\n onToggle={onToggle}\n onSelect={onNavigate}\n onAddAction={onAddAction}\n level={0}\n />\n ))}\n\n {/* Add Entity Section - sticky container */}\n <div className=\"elb-mapping-tree-add-entity-section\">\n {!isAddingEntity && onAddEntity && (\n <button\n type=\"button\"\n className=\"elb-mapping-tree-add-entity-button\"\n onClick={handleAddEntityClick}\n >\n <span>+</span> Add Entity\n </button>\n )}\n\n {isAddingEntity && (\n <div className=\"elb-mapping-tree-add-entity\">\n <input\n ref={entityInputRef}\n type=\"text\"\n className={`elb-mapping-tree-add-entity-input ${entityExists ? 'is-error' : ''}`}\n value={newEntityName}\n onChange={handleEntityInput}\n onKeyDown={handleEntityKeyDown}\n onBlur={handleEntityBlur}\n placeholder=\"entity\"\n />\n </div>\n )}\n </div>\n\n {/* Bottom padding for scrolling */}\n <div className=\"elb-mapping-tree-bottom-padding\" />\n </div>\n\n {/* Mobile close button - absolute at bottom right */}\n {onClose && (\n <button\n type=\"button\"\n className=\"elb-mapping-tree-close-button\"\n onClick={onClose}\n aria-label=\"Close tree sidebar\"\n title=\"Close sidebar\"\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </aside>\n );\n}\n","import React from 'react';\n\nexport interface MappingInputProps {\n value: string;\n onChange: (value: string) => void;\n onBlur?: () => void;\n onClick?: () => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n placeholder?: string;\n disabled?: boolean;\n type?: 'text' | 'number';\n title?: string;\n className?: string;\n autoFocus?: boolean;\n error?: boolean;\n}\n\n/**\n * MappingInput - Standardized input component for mapping editor\n *\n * Features:\n * - Consistent styling across all mapping panes\n * - Theme-aware colors (input background, border, focus states)\n * - Monospace font for property paths and values\n * - Hover and focus states\n * - Optional disabled state with visual feedback\n * - Optional error state with visual feedback (red border/background)\n * - Type support for text and number inputs\n *\n * Used by:\n * - Name pane (event name override)\n * - Entity pane (action name input)\n * - Batch pane (number input)\n * - ValueType pane (quick value string)\n * - Primitive pane (schema-validated inputs)\n *\n * @example\n * <MappingInput\n * value={name}\n * onChange={setName}\n * placeholder=\"e.g., page_view\"\n * error={!isValid}\n * />\n */\nexport function MappingInput({\n value,\n onChange,\n onBlur,\n onClick,\n onKeyDown,\n placeholder,\n disabled = false,\n type = 'text',\n title,\n className = '',\n autoFocus = false,\n error = false,\n}: MappingInputProps) {\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n };\n\n return (\n <input\n type={type}\n className={`elb-mapping-input ${disabled ? 'is-disabled' : ''} ${error ? 'is-error' : ''} ${className}`}\n value={value}\n onChange={handleChange}\n onBlur={onBlur}\n onClick={onClick}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n title={title}\n autoFocus={autoFocus}\n />\n );\n}\n","import React from 'react';\nimport { MappingInput, type MappingInputProps } from './mapping-input';\n\nexport interface MappingInputWithButtonProps\n extends Omit<MappingInputProps, 'onKeyDown'> {\n /**\n * Handler called when submit button is clicked or Enter is pressed\n */\n onSubmit: () => void;\n\n /**\n * Label for the action button\n * Examples: \"Create\", \"Open\", \"Add\", \"Add Key\"\n */\n buttonLabel: string;\n\n /**\n * Whether to show the button\n * Typically true when input has content\n */\n showButton?: boolean;\n\n /**\n * Optional override for key down behavior\n */\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\n/**\n * MappingInputWithButton - Enhanced input with contextual action button\n *\n * Provides clear visual affordance for creation/navigation actions.\n * The button appears when the input has content and provides a\n * discoverable alternative to pressing Enter.\n *\n * Features:\n * - Inline action button with dynamic label\n * - Maintains keyboard shortcuts (Enter, Escape)\n * - Self-documenting UX (button shows what will happen)\n * - Mobile-friendly (tap target)\n *\n * Used by:\n * - Overview pane (entity creation/selection)\n * - Entity pane (action creation/selection)\n * - Map pane (key creation/selection)\n * - Consent pane (consent state creation)\n * - Tree sidebar (quick action creation)\n *\n * @example\n * <MappingInputWithButton\n * value={entityName}\n * onChange={setEntityName}\n * onSubmit={handleCreateOrOpen}\n * buttonLabel={exists ? \"Open\" : \"Create\"}\n * showButton={entityName.trim().length > 0}\n * placeholder=\"Type entity name...\"\n * />\n */\nexport function MappingInputWithButton({\n value,\n onChange,\n onSubmit,\n buttonLabel,\n showButton = false,\n onKeyDown,\n placeholder,\n disabled = false,\n type = 'text',\n title,\n className = '',\n autoFocus = false,\n onBlur,\n onClick,\n}: MappingInputWithButtonProps) {\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n // Always check for Enter first\n if (e.key === 'Enter') {\n e.preventDefault();\n onSubmit();\n return;\n }\n\n // Then delegate to custom handler if provided\n if (onKeyDown) {\n onKeyDown(e);\n }\n };\n\n const handleButtonClick = (e: React.MouseEvent) => {\n e.preventDefault(); // Prevent any form submission\n onSubmit();\n };\n\n // Determine if button should be visible\n const isButtonVisible = showButton && value.trim().length > 0;\n\n return (\n <div className=\"elb-mapping-input-with-button\">\n <MappingInput\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n onBlur={onBlur}\n onClick={onClick}\n placeholder={placeholder}\n disabled={disabled}\n type={type}\n title={title}\n className={className}\n autoFocus={autoFocus}\n />\n {isButtonVisible && (\n <button\n type=\"button\"\n className=\"elb-mapping-input-button\"\n onClick={handleButtonClick}\n disabled={disabled}\n >\n {buttonLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInputWithButton } from '../atoms/mapping-input-with-button';\n\n/**\n * Entity Pane - Shows actions for an entity\n *\n * Displays:\n * - List of existing actions for the entity\n * - Input field to create new actions\n */\nexport interface MappingEntityPaneProps {\n path: string[]; // Should be [entity]\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingEntityPane({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingEntityPaneProps) {\n const [newActionName, setNewActionName] = useState('');\n const [actionExists, setActionExists] = useState(false);\n\n const entity = path[0];\n const entityConfig = mappingState.actions.getValue([entity]) as\n | Record<string, unknown>\n | undefined;\n const actions =\n entityConfig && typeof entityConfig === 'object'\n ? Object.keys(entityConfig).sort()\n : [];\n\n // Check if action exists\n useEffect(() => {\n if (newActionName) {\n const exists = actions.includes(newActionName);\n setActionExists(exists);\n } else {\n setActionExists(false);\n }\n }, [newActionName, actions]);\n\n const handleActionInput = (value: string) => {\n setNewActionName(value);\n };\n\n const handleActionKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setNewActionName('');\n setActionExists(false);\n }\n };\n\n const handleActionSubmit = () => {\n if (!newActionName.trim()) {\n setNewActionName('');\n return;\n }\n\n if (actionExists) {\n // Navigate to existing action\n navigation.openTab([entity, newActionName], 'rule');\n setNewActionName('');\n setActionExists(false);\n } else {\n // Create new action\n mappingState.actions.createRule(entity, newActionName.trim(), {});\n navigation.openTab([entity, newActionName.trim()], 'rule');\n setNewActionName('');\n }\n };\n\n const handleActionClick = (action: string) => {\n navigation.openTab([entity, action], 'rule');\n };\n\n // Get the preview text for an action (the name value from the rule or fallback)\n const getActionPreview = (action: string): string => {\n const rule = mappingState.actions.getValue([entity, action]) as\n | Record<string, unknown>\n | undefined;\n if (rule && typeof rule.name === 'string' && rule.name) {\n return rule.name;\n }\n return `${entity} ${action}`;\n };\n\n return (\n <BaseMappingPane\n title={entity}\n description=\"Select an action or create a new one\"\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-entity-pane-body\">\n {/* New action input */}\n <div className=\"elb-mapping-entity-pane-new-action\">\n <MappingInputWithButton\n value={newActionName}\n onChange={handleActionInput}\n onSubmit={handleActionSubmit}\n onKeyDown={handleActionKeyDown}\n buttonLabel={actionExists ? 'Open' : 'Create'}\n showButton={true}\n placeholder=\"Type action name to create or select...\"\n className={actionExists ? 'is-existing' : ''}\n />\n </div>\n\n {/* Existing actions list */}\n {actions.length > 0 && (\n <div className=\"elb-mapping-tile-section\">\n <h3 className=\"elb-mapping-tile-title\">Existing Actions</h3>\n <div className=\"elb-mapping-entity-pane-action-list\">\n {actions.map((action) => {\n const preview = getActionPreview(action);\n const isLongPreview = preview.length > 20;\n return (\n <button\n key={action}\n type=\"button\"\n className=\"elb-mapping-entity-pane-action-tile\"\n onClick={() => handleActionClick(action)}\n >\n <div className=\"elb-mapping-entity-pane-action-tile-action\">\n {action}\n </div>\n <div\n className={`elb-mapping-entity-pane-action-tile-preview ${isLongPreview ? 'is-long' : ''}`}\n >\n {preview}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {actions.length === 0 && !newActionName && (\n <div className=\"elb-mapping-entity-pane-empty\">\n <p>No actions yet. Type above to create the first action.</p>\n </div>\n )}\n </div>\n </BaseMappingPane>\n );\n}\n","/**\n * Pane Header - Standardized header for pane views\n *\n * Provides consistent header layout across all pane views with:\n * - Back button (conditionally visible based on hideBackButton)\n * - Title\n * - Description\n * - Optional action button (e.g., Reset)\n */\nexport interface PaneHeaderProps {\n title: string;\n description: string;\n onBack?: () => void;\n canGoBack?: boolean;\n hideBackButton?: boolean;\n action?: {\n label: string;\n onClick: () => void;\n title?: string;\n };\n className?: string;\n}\n\nexport function PaneHeader({\n title,\n description,\n onBack,\n canGoBack = false,\n hideBackButton = false,\n action,\n className = '',\n}: PaneHeaderProps) {\n return (\n <div className={`elb-pane-header ${className}`}>\n <div className=\"elb-pane-header-content\">\n {!hideBackButton && (\n <button\n type=\"button\"\n className={`elb-pane-header-back ${!onBack || !canGoBack ? 'is-disabled' : ''}`}\n onClick={onBack && canGoBack ? onBack : undefined}\n disabled={!onBack || !canGoBack}\n aria-label=\"Go back\"\n title={onBack && canGoBack ? 'Go back' : 'No history'}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12.5 15L7.5 10L12.5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n <h3 className=\"elb-pane-header-title\">\n {title}{' '}\n <span className=\"elb-pane-header-description\">{description}</span>\n </h3>\n </div>\n {action && (\n <button\n type=\"button\"\n className=\"elb-pane-header-action\"\n onClick={action.onClick}\n title={action.title}\n >\n {action.label}\n </button>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { PaneHeader } from './pane-header';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\n\nexport interface BaseMappingPaneProps {\n /**\n * Pane title - if not provided (along with description), header won't render\n */\n title?: string;\n\n /**\n * Pane description - if not provided (along with title), header won't render\n */\n description?: string;\n\n /**\n * Navigation hook for back button functionality\n * If not provided, back button will be disabled\n */\n navigation?: UseMappingNavigationReturn;\n\n /**\n * Hide the back button even if navigation is provided\n * Useful for nested panes (e.g., ValueTypePaneView inside Loop pane)\n */\n hideNavigation?: boolean;\n\n /**\n * Optional action button in header (e.g., Reset)\n */\n headerAction?: {\n label: string;\n onClick: () => void;\n title?: string;\n };\n\n /**\n * Pane content\n */\n children: React.ReactNode;\n\n /**\n * Additional CSS class names\n */\n className?: string;\n}\n\n/**\n * BaseMappingPane - Standard pane wrapper with optional sticky header\n *\n * Provides consistent structure for all mapping panes:\n * - Optional sticky header with back button\n * - Scrollable content area\n * - Proper flex layout for full-height panes\n *\n * Header visibility logic:\n * - Shows header if title OR description is provided\n * - Hides header if both title AND description are undefined\n * - Use hideNavigation={true} to show header without back button (nested panes)\n *\n * Features:\n * - Sticky header stays visible while scrolling\n * - Proper scrolling with min-height: 0 for flexbox\n * - Extra bottom padding (50vh) for comfortable scrolling\n * - DRY principle - single source of truth for pane structure\n *\n * @example\n * // Standard pane with header\n * <BaseMappingPane\n * title=\"Event Name\"\n * description=\"Override the event name\"\n * navigation={navigation}\n * >\n * <div>Content here</div>\n * </BaseMappingPane>\n *\n * @example\n * // Nested pane without header\n * <BaseMappingPane>\n * <div>Content with no header</div>\n * </BaseMappingPane>\n *\n * @example\n * // Pane with header but no navigation (e.g., section header)\n * <BaseMappingPane\n * title=\"Item Mapping\"\n * description=\"Configure transformation\"\n * hideNavigation={true}\n * >\n * <div>Nested content</div>\n * </BaseMappingPane>\n */\nexport function BaseMappingPane({\n title,\n description,\n navigation,\n hideNavigation = false,\n headerAction,\n children,\n className = '',\n}: BaseMappingPaneProps) {\n // Show header if title OR description is provided\n const showHeader = !!(title || description);\n\n return (\n <div className={`elb-mapping-pane ${className}`}>\n {showHeader && (\n <div className=\"elb-mapping-pane-header--sticky\">\n <PaneHeader\n title={title || ''}\n description={description || ''}\n onBack={navigation?.goBack}\n canGoBack={navigation?.canGoBack() ?? false}\n hideBackButton={hideNavigation}\n action={headerAction}\n />\n </div>\n )}\n <div className=\"elb-mapping-pane-content\">{children}</div>\n </div>\n );\n}\n","import React from 'react';\n\nexport interface ConfigTileStatus {\n enabled: boolean;\n text?: string;\n maxLength?: number;\n}\n\nexport interface ConfigTileProps {\n label: string;\n description?: string;\n status: ConfigTileStatus;\n onClick: () => void;\n className?: string;\n}\n\n/**\n * ConfigTile - Reusable tile component for configuration options\n *\n * Features:\n * - Status indicator (green/gray circle)\n * - Optional status text with fade effect for long values\n * - Hover states with theme colors\n * - Automatic styling based on enabled state\n *\n * Used by:\n * - Rule overview (name, data, settings, batch, ignore, etc.)\n * - ValueConfig options (key, value, fn, map, loop, etc.)\n *\n * @example\n * <ConfigTile\n * label=\"Name\"\n * description=\"Override the destination event name\"\n * status={{ enabled: true, text: \"page_view\" }}\n * onClick={() => handleEdit('name')}\n * />\n */\nexport function ConfigTile({\n label,\n description,\n status,\n onClick,\n className = '',\n}: ConfigTileProps) {\n const maxLength = status.maxLength || 20;\n const isLongText = (status.text?.length || 0) > maxLength;\n\n return (\n <button\n className={`elb-config-tile ${status.enabled ? 'is-enabled' : ''} ${className}`}\n onClick={onClick}\n type=\"button\"\n >\n <div className=\"elb-config-tile-header\">\n <div className=\"elb-config-tile-label\">{label}</div>\n <div className=\"elb-config-tile-status\">\n <div\n className={`elb-config-tile-indicator ${\n status.enabled ? 'is-enabled' : 'is-disabled'\n }`}\n />\n {status.text && (\n <div\n className={`elb-config-tile-status-text ${isLongText ? 'is-long' : ''}`}\n >\n {status.text}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"elb-config-tile-description\">{description}</div>\n </button>\n );\n}\n\n// Legacy export for backward compatibility during migration\nexport type RuleTileStatus = ConfigTileStatus;\nexport type RuleTileProps = ConfigTileProps;\nexport const RuleTile = ConfigTile;\n","import type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport type { ConfigStructureDef } from '../../schemas/config-structures/types';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { RuleTile } from '../atoms/config-tile';\nimport { detectNodeType } from '../../utils/type-detector';\n\n/**\n * Generic Config Overview Pane\n *\n * Shows all available properties from a structure definition as tiles.\n * Works at any depth with any config type (DestinationConfig, Rule, etc.).\n *\n * Features:\n * - Shows configured properties (with values)\n * - Shows available properties (not yet set)\n * - Uses structure definition for metadata (titles, descriptions)\n * - Generic - works with any ConfigStructureDef\n *\n * @example\n * // Full DestinationConfig\n * <ConfigOverviewPane\n * config={destinationConfig}\n * structure={DESTINATION_CONFIG_STRUCTURE}\n * navigation={navigation}\n * />\n *\n * @example\n * // Single Rule\n * <ConfigOverviewPane\n * config={ruleConfig}\n * structure={MAPPING_RULE_STRUCTURE}\n * navigation={navigation}\n * />\n */\nexport interface ConfigOverviewPaneProps<T extends Record<string, unknown>> {\n config: T;\n structure: ConfigStructureDef;\n navigation: UseMappingNavigationReturn;\n schemas?: Record<string, RJSFSchema>;\n className?: string;\n /** Base path to prepend when navigating (e.g., ['mapping', 'page', 'view']) */\n basePath?: string[];\n /** Root structure for detectNodeType (defaults to structure if not provided) */\n rootStructure?: ConfigStructureDef;\n}\n\ninterface PropertyInfo {\n key: string;\n title: string;\n description?: string;\n value?: unknown;\n}\n\n/**\n * Get status badge for a property value\n */\nfunction getPropertyStatus(value: unknown): {\n enabled: boolean;\n text: string;\n variant?: 'success' | 'warning' | 'danger';\n} {\n if (value === undefined || value === null) {\n return { enabled: false, text: 'Not set' };\n }\n\n if (typeof value === 'boolean') {\n return value\n ? { enabled: true, text: 'Enabled', variant: 'success' }\n : { enabled: false, text: 'Disabled' };\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return { enabled: true, text: String(value) };\n }\n\n if (typeof value === 'object') {\n if (Array.isArray(value)) {\n return { enabled: true, text: `${value.length} items` };\n }\n const keys = Object.keys(value);\n return { enabled: true, text: `${keys.length} properties` };\n }\n\n return { enabled: true, text: 'Set' };\n}\n\nexport function ConfigOverviewPane<T extends Record<string, unknown>>({\n config,\n structure,\n navigation,\n schemas,\n className = '',\n basePath = [],\n rootStructure,\n}: ConfigOverviewPaneProps<T>) {\n if (!structure.properties) {\n return (\n <BaseMappingPane\n title={structure.title || 'Configuration'}\n description={structure.description}\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-rule-section\">\n <p>No properties defined in structure.</p>\n </div>\n </BaseMappingPane>\n );\n }\n\n // Get all property keys from structure\n const propertyKeys = Object.keys(structure.properties);\n\n // Separate configured vs available\n const configuredProperties: PropertyInfo[] = [];\n const availableProperties: PropertyInfo[] = [];\n\n propertyKeys.forEach((key) => {\n const propertyDef = structure.properties![key];\n const value = config[key as keyof T];\n\n const propertyInfo: PropertyInfo = {\n key,\n title: propertyDef.title || capitalize(key),\n description: propertyDef.description,\n value,\n };\n\n if (value !== undefined) {\n configuredProperties.push(propertyInfo);\n } else {\n availableProperties.push(propertyInfo);\n }\n });\n\n const handlePropertyClick = (property: PropertyInfo) => {\n const fullPath = [...basePath, property.key];\n const detectionStructure = rootStructure || structure;\n const nodeType = detectNodeType(property.value, fullPath, detectionStructure, schemas);\n navigation.openTab(fullPath, nodeType);\n };\n\n return (\n <BaseMappingPane\n title={structure.title || 'Configuration'}\n description={structure.description}\n navigation={navigation}\n className={className}\n >\n {/* Configured Properties */}\n {configuredProperties.length > 0 && (\n <div className=\"elb-mapping-rule-section\">\n <h3 className=\"elb-mapping-rule-section-title\">Configured</h3>\n <div className=\"elb-mapping-rule-section-grid\">\n {configuredProperties.map((property) => (\n <RuleTile\n key={property.key}\n label={property.title}\n description={property.description}\n status={getPropertyStatus(property.value)}\n onClick={() => handlePropertyClick(property)}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Available Properties */}\n {availableProperties.length > 0 && (\n <div className=\"elb-mapping-rule-section\">\n <h3 className=\"elb-mapping-rule-section-title\">Available</h3>\n <div className=\"elb-mapping-rule-section-grid\">\n {availableProperties.map((property) => (\n <RuleTile\n key={property.key}\n label={property.title}\n description={property.description}\n status={{ enabled: false, text: 'Not set' }}\n onClick={() => handlePropertyClick(property)}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Empty State */}\n {configuredProperties.length === 0 &&\n availableProperties.length === 0 && (\n <div className=\"elb-mapping-rule-section\">\n <div\n style={{\n padding: '40px 20px',\n textAlign: 'center',\n color: 'var(--color-text-muted)',\n }}\n >\n <div style={{ fontSize: '48px', marginBottom: '16px' }}>📦</div>\n <div style={{ fontSize: '16px', fontWeight: 500 }}>\n No properties available\n </div>\n <div style={{ fontSize: '14px', marginTop: '8px' }}>\n This configuration has no properties defined.\n </div>\n </div>\n </div>\n )}\n </BaseMappingPane>\n );\n}\n\n/**\n * Capitalize first letter\n */\nfunction capitalize(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import { useState } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\nimport { MappingConfirmButton } from '../atoms/mapping-confirm-button';\nimport { getConfiguredProperties } from '../../utils/value-display-formatter';\n\n/**\n * Policy Overview Pane\n *\n * Shows all policy rules as a list with badges for configured properties.\n * Policy rules are pre-processing transformations that modify events before mapping.\n *\n * Can be used for:\n * - Config-level policy: path = ['policy']\n * - Event-level policy: path = ['entity', 'action', 'policy']\n *\n * Each rule:\n * - Path: The dot-notation key in the event (e.g., 'user.email', 'data.price')\n * - Value: A Value mapping (key, fn, map, loop, etc.)\n * - Badges: Show which properties are configured (fn, consent, condition, etc.)\n * - Actions: Delete\n */\nexport interface MappingPolicyOverviewPaneProps {\n path?: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingPolicyOverviewPane({\n path = ['policy'],\n mappingState,\n navigation,\n className = '',\n}: MappingPolicyOverviewPaneProps) {\n const [newPolicyPath, setNewPolicyPath] = useState('');\n const [pathExists, setPathExists] = useState(false);\n\n // Get policy from the current path\n const policyValue = mappingState.actions.getValue(path);\n const policy =\n policyValue &&\n typeof policyValue === 'object' &&\n !Array.isArray(policyValue)\n ? (policyValue as Record<string, unknown>)\n : {};\n\n // Get sorted list of policy paths\n const policyPaths = Object.keys(policy).sort();\n\n const handlePathInputChange = (value: string) => {\n setNewPolicyPath(value);\n setPathExists(policy[value] !== undefined);\n };\n\n const handlePathSubmit = () => {\n const policyPath = newPolicyPath.trim();\n if (!policyPath) {\n setNewPolicyPath('');\n return;\n }\n\n // Navigate to the policy rule (creates path in navigation)\n // Don't pre-populate value - let user configure it\n navigation.openTab([...path, policyPath], 'valueType');\n\n setNewPolicyPath('');\n setPathExists(false);\n };\n\n const handlePathKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handlePathSubmit();\n } else if (e.key === 'Escape') {\n setNewPolicyPath('');\n setPathExists(false);\n }\n };\n\n const handlePathBlur = () => {\n setTimeout(() => {\n handlePathSubmit();\n }, 150);\n };\n\n const handlePathClick = (policyPath: string) => {\n navigation.openTab([...path, policyPath], 'valueType');\n };\n\n const handleBadgeClick = (policyPath: string, property: string) => {\n // All badges navigate to the ValueType pane which shows all tiles\n // User can click the appropriate tile there\n navigation.openTab([...path, policyPath], 'valueType');\n };\n\n const handleDeleteClick = (policyPath: string) => {\n mappingState.actions.deleteValue([...path, policyPath]);\n };\n\n // Determine which properties are configured for a policy value\n return (\n <BaseMappingPane\n title=\"Policy\"\n description={\n policyPaths.length === 0\n ? 'No policy rules yet. Add rules to pre-process events before mapping.'\n : `${policyPaths.length} rule${policyPaths.length === 1 ? '' : 's'}`\n }\n navigation={navigation}\n className={className}\n >\n {/* Add new policy rule input */}\n <div className=\"elb-policy-input-section\">\n <MappingInput\n value={newPolicyPath}\n onChange={handlePathInputChange}\n onKeyDown={handlePathKeyDown}\n onBlur={handlePathBlur}\n placeholder=\"Type path to create or select (e.g., user.email)...\"\n className={pathExists ? 'is-existing' : ''}\n />\n </div>\n\n {/* Policy rules list */}\n {policyPaths.length > 0 && (\n <div className=\"elb-policy-list\">\n {policyPaths.map((path) => {\n const value = policy[path];\n const configuredProps = getConfiguredProperties(value);\n\n return (\n <div key={path} className=\"elb-policy-row\">\n {/* Path */}\n <button\n type=\"button\"\n className=\"elb-policy-row-path\"\n onClick={() => handlePathClick(path)}\n title=\"Click to edit this policy rule\"\n >\n {path}\n </button>\n\n {/* Badges */}\n <div className=\"elb-policy-row-badges\">\n {configuredProps.map(({ prop, value, isLong }) => (\n <button\n key={prop}\n type=\"button\"\n className=\"elb-policy-badge\"\n onClick={() => handleBadgeClick(path, prop)}\n title={`${prop}: ${value}`}\n >\n <span className=\"elb-policy-badge-label\">{prop}:</span>\n <span\n className={`elb-policy-badge-value ${isLong ? 'is-long' : ''}`}\n >\n {value}\n </span>\n </button>\n ))}\n </div>\n\n {/* Actions */}\n <div className=\"elb-policy-row-actions\">\n <MappingConfirmButton\n confirmLabel=\"Delete?\"\n onConfirm={() => handleDeleteClick(path)}\n ariaLabel={`Delete policy rule ${path}`}\n className=\"elb-mapping-delete-button\"\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Empty state */}\n {policyPaths.length === 0 && (\n <div className=\"elb-policy-empty\">\n <p>\n Policy rules modify events before mapping is applied. Common uses:\n </p>\n <ul>\n <li>Normalize data (e.g., lowercase emails)</li>\n <li>Enrich events (e.g., copy values, compute totals)</li>\n <li>Clean data (e.g., remove PII, format dates)</li>\n </ul>\n </div>\n )}\n </BaseMappingPane>\n );\n}\n","/**\n * Value Display Formatter\n *\n * Utilities for formatting values and extracting configured properties\n * from ValueConfig objects for display in badges and UI elements.\n */\n\nexport interface PropertyBadge {\n prop: string; // Property name (empty string for simple values)\n value: string; // Formatted value for display\n isLong: boolean; // True if value length > 20 characters\n}\n\n/**\n * Format a value for display in a badge\n *\n * @param val - The value to format\n * @returns Formatted string representation\n */\nexport function formatValueForDisplay(val: unknown): string {\n if (typeof val === 'string') return `\"${val}\"`;\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n\n if (Array.isArray(val)) {\n if (val.length === 0) return '[]';\n // For arrays, show the first item (useful for loop/set arrays)\n const firstItem = val[0];\n if (typeof firstItem === 'string') return `\"${firstItem}\"`;\n if (typeof firstItem === 'number' || typeof firstItem === 'boolean')\n return String(firstItem);\n // For complex first items, show count\n return `[${val.length}]`;\n }\n\n if (typeof val === 'object' && val !== null) {\n const keys = Object.keys(val);\n if (keys.length === 0) return '{}';\n // For objects (like map), show the keys in curly braces\n return `{ ${keys.join(', ')} }`;\n }\n\n return '';\n}\n\n/**\n * Extract configured properties from a value for display\n *\n * Handles:\n * - Simple strings: Returns without prop label\n * - ValueConfig with only key: Returns without prop label\n * - Full ValueConfig: Returns all configured properties with labels\n *\n * @param value - The value to analyze (string or ValueConfig object)\n * @returns Array of property badges for display\n */\nexport function getConfiguredProperties(value: unknown): PropertyBadge[] {\n // Simple string value - return without prop label\n if (typeof value === 'string') {\n return [\n {\n prop: '', // Empty prop means no label, just show the value\n value: `\"${value}\"`,\n isLong: value.length > 20,\n },\n ];\n }\n\n if (!value || typeof value !== 'object') return [];\n\n const props: PropertyBadge[] = [];\n const obj = value as Record<string, unknown>;\n\n // Check if this is a ValueConfig with ONLY a key property\n // In this case, display it as a simple value without the \"key:\" label\n const objKeys = Object.keys(obj);\n if (\n objKeys.length === 1 &&\n 'key' in obj &&\n obj.key &&\n typeof obj.key === 'string'\n ) {\n return [\n {\n prop: '', // No label, just show the key value\n value: `\"${obj.key}\"`,\n isLong: obj.key.length > 20,\n },\n ];\n }\n\n // Helper to add a property to the list\n const addProp = (prop: string, val: unknown) => {\n const formatted = formatValueForDisplay(val);\n props.push({\n prop,\n value: formatted,\n isLong: formatted.length > 20,\n });\n };\n\n // Check all possible ValueConfig properties in consistent order\n if ('fn' in obj && obj.fn) addProp('fn', obj.fn);\n if ('key' in obj && obj.key) addProp('key', obj.key);\n if ('value' in obj && obj.value !== undefined) addProp('value', obj.value);\n if ('map' in obj && obj.map) addProp('map', obj.map);\n if ('loop' in obj && obj.loop) addProp('loop', obj.loop);\n if ('set' in obj && obj.set) addProp('set', obj.set);\n if ('consent' in obj && obj.consent) addProp('consent', obj.consent);\n if ('condition' in obj && obj.condition) addProp('condition', obj.condition);\n if ('validate' in obj && obj.validate) addProp('validate', obj.validate);\n\n return props;\n}\n","import { MappingTypeSelector } from './mapping-type-selector';\nimport type { ValueConfigType } from '../atoms/mapping-type-button';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\n\n/**\n * ValueConfig Pane View - Pure Presentation Component\n *\n * Most complex pane - edits value transformations based on type:\n * - key: Extract value from event path (string)\n * - value: Static value (any type)\n * - map: Transform to object (opens MapPaneView)\n * - loop: Process array (opens LoopPaneView)\n * - function: Custom transformation (code editor)\n * - set: Array of static values\n *\n * Uses MappingTypeSelector to switch between types.\n *\n * @example\n * <MappingValueConfigPaneView\n * path={['product', 'view', 'data']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport interface MappingValueConfigPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingValueConfigPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingValueConfigPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const pathLabel = path[path.length - 1] || 'Value';\n\n // Determine current type\n const getCurrentType = (): ValueConfigType | null => {\n // undefined or other primitives - return null so pathLabel can determine type\n if (value === undefined || typeof value !== 'object' || value === null)\n return null;\n // Check object properties\n if ('map' in value) return 'map';\n if ('loop' in value) return 'loop';\n if ('fn' in value) return 'function';\n if ('value' in value) return 'value';\n if ('set' in value) return 'set';\n return null;\n };\n\n const currentType = getCurrentType();\n\n // Use pathLabel to determine type when value is undefined/null\n // This ensures correct editor when navigating to a specific property path\n const effectiveType = currentType || 'value';\n\n // Type change handler - converts value to new type\n const handleTypeChange = (newType: ValueConfigType) => {\n if (newType === currentType) return;\n\n switch (newType) {\n case 'value':\n mappingState.actions.setValue(path, { value: '' });\n break;\n case 'map':\n mappingState.actions.setValue(path, { map: {} });\n break;\n case 'loop':\n mappingState.actions.setValue(path, { loop: ['nested', 'this'] });\n break;\n case 'function':\n mappingState.actions.setValue(path, { fn: '(event) => event.data' });\n break;\n case 'set':\n mappingState.actions.setValue(path, { set: [] });\n break;\n }\n };\n\n // Type-specific value handlers\n const handleStaticValueChange = (newValue: string) => {\n // When the entire ValueConfig at 'path' is { value: X }, update it to { value: newValue }\n mappingState.actions.setValue(path, { value: newValue });\n };\n\n const handleFunctionChange = (newValue: string) => {\n mappingState.actions.setValue(path, { fn: newValue });\n };\n\n const handleOpenComplex = () => {\n const nodeType: 'map' | 'loop' | 'valueConfig' =\n currentType === 'map'\n ? 'map'\n : currentType === 'loop'\n ? 'loop'\n : 'valueConfig';\n navigation.openTab(path, nodeType);\n };\n\n // Render type-specific editor\n const renderEditor = () => {\n switch (effectiveType) {\n case 'value':\n const staticValue =\n typeof value === 'object' && value !== null && 'value' in value\n ? ((value as Record<string, unknown>).value as string) || ''\n : '';\n return (\n <BaseMappingPane\n title=\"Static Value\"\n description=\"Fixed value that will be used (string, number, or boolean)\"\n navigation={navigation}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n value={String(staticValue)}\n onChange={handleStaticValueChange}\n placeholder=\"USD\"\n />\n <div className=\"elb-mapping-pane-hint\">\n Use for constant values like currency codes, fixed IDs, etc.\n </div>\n </div>\n </BaseMappingPane>\n );\n\n case 'map':\n const mapObj =\n typeof value === 'object' && value !== null && 'map' in value\n ? ((value as Record<string, unknown>).map as Record<\n string,\n unknown\n >) || {}\n : {};\n const mapKeyCount = Object.keys(mapObj).length;\n return (\n <BaseMappingPane\n title=\"Map Object\"\n description=\"Transform event data into an object with multiple keys\"\n navigation={navigation}\n >\n <div className=\"elb-mapping-pane-field\">\n <div className=\"elb-mapping-value-complex\">\n <div className=\"elb-mapping-value-complex-info\">\n <span className=\"elb-mapping-pane-type-badge\">map</span>\n <span>\n {mapKeyCount} {mapKeyCount === 1 ? 'key' : 'keys'} defined\n </span>\n </div>\n <button\n type=\"button\"\n className=\"elb-mapping-pane-button elb-mapping-pane-button--primary\"\n onClick={handleOpenComplex}\n >\n Edit Map →\n </button>\n </div>\n </div>\n </BaseMappingPane>\n );\n\n case 'loop':\n const loopArr =\n typeof value === 'object' && value !== null && 'loop' in value\n ? ((value as Record<string, unknown>).loop as unknown[]) || []\n : [];\n const loopSource = (\n Array.isArray(loopArr) && loopArr.length > 0 ? loopArr[0] : 'nested'\n ) as string;\n return (\n <BaseMappingPane\n title=\"Loop Array\"\n description=\"Process an array of items from the event\"\n navigation={navigation}\n >\n <div className=\"elb-mapping-pane-field\">\n <div className=\"elb-mapping-value-complex\">\n <div className=\"elb-mapping-value-complex-info\">\n <span className=\"elb-mapping-pane-type-badge\">loop</span>\n <span>Source: {loopSource}</span>\n </div>\n <button\n type=\"button\"\n className=\"elb-mapping-pane-button elb-mapping-pane-button--primary\"\n onClick={handleOpenComplex}\n >\n Edit Loop →\n </button>\n </div>\n </div>\n </BaseMappingPane>\n );\n\n case 'function':\n const fnValue =\n typeof value === 'object' && value !== null && 'fn' in value\n ? ((value as Record<string, unknown>).fn as string) ||\n '(event) => event.data'\n : '(event) => event.data';\n return (\n <BaseMappingPane\n title=\"Custom Function\"\n description=\"JavaScript function that receives the event and returns transformed value\"\n navigation={navigation}\n >\n <div className=\"elb-mapping-pane-field\">\n <textarea\n id=\"value-function\"\n className=\"elb-mapping-pane-textarea\"\n value={String(fnValue)}\n onChange={(e) => handleFunctionChange(e.target.value)}\n placeholder=\"(event) => event.data.id\"\n rows={6}\n />\n <div className=\"elb-mapping-pane-hint\">\n Function signature: (event: WalkerOS.Event) => any\n </div>\n </div>\n </BaseMappingPane>\n );\n\n case 'set':\n const setArr =\n typeof value === 'object' && value !== null && 'set' in value\n ? ((value as Record<string, unknown>).set as unknown[]) || []\n : [];\n const setCount = Array.isArray(setArr) ? setArr.length : 0;\n return (\n <BaseMappingPane\n title=\"Static Array\"\n description=\"Array of static values\"\n navigation={navigation}\n >\n <div className=\"elb-mapping-pane-field\">\n <div className=\"elb-mapping-value-complex\">\n <div className=\"elb-mapping-value-complex-info\">\n <span className=\"elb-mapping-pane-type-badge\">set</span>\n <span>\n {setCount} {setCount === 1 ? 'item' : 'items'}\n </span>\n </div>\n <button\n type=\"button\"\n className=\"elb-mapping-pane-button elb-mapping-pane-button--primary\"\n onClick={handleOpenComplex}\n disabled\n title=\"Coming soon\"\n >\n Edit Set →\n </button>\n </div>\n </div>\n </BaseMappingPane>\n );\n\n default:\n return (\n <div className=\"elb-mapping-pane-error\">\n Unknown value type. Please select a transformation type above.\n </div>\n );\n }\n };\n\n return renderEditor();\n}\n","import { useState, useEffect } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn, NodeType } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { ConfigTile, type ConfigTileStatus } from '../atoms/config-tile';\nimport { MappingInput } from '../atoms/mapping-input';\n\nexport interface MappingValueTypePaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n\n // Optional: Override or suppress header (for nested use in loop pane)\n title?: string;\n description?: string;\n hideNavigation?: boolean;\n}\n\ninterface ValueConfigTileConfig {\n key: string;\n label: string;\n description: string;\n}\n\nconst VALUE_CONFIG_TILES: ValueConfigTileConfig[] = [\n {\n key: 'key',\n label: 'Key',\n description: 'Property path',\n },\n {\n key: 'value',\n label: 'Value',\n description: 'Static value',\n },\n {\n key: 'fn',\n label: 'Fn',\n description: 'Custom function',\n },\n {\n key: 'map',\n label: 'Map',\n description: 'Transform object',\n },\n {\n key: 'loop',\n label: 'Loop',\n description: 'Array iteration',\n },\n {\n key: 'set',\n label: 'Set',\n description: 'Multiple values',\n },\n {\n key: 'consent',\n label: 'Consent',\n description: 'Required states',\n },\n {\n key: 'validate',\n label: 'Validate',\n description: 'Check function',\n },\n];\n\n/**\n * ValueType Pane - Edit ValueType (string | ValueConfig)\n *\n * Simple logic:\n * - String mode: Quick Value input edits the string directly\n * - Object mode: Quick Value input ALWAYS edits the 'key' property\n * - Input is NEVER disabled\n * - Quick Value and Key tile are always synced\n *\n * Smart Conversions:\n * - Clicking any tile in String mode converts to { key: \"string value\" }\n * - All tiles (including Key) are clickable and open their respective editors\n * - Conversion happens automatically before opening the editor\n */\nexport function MappingValueTypePaneView({\n path,\n mappingState,\n navigation,\n className = '',\n title = 'Value Configuration',\n description = 'Configure how to extract or transform data',\n hideNavigation = false,\n}: MappingValueTypePaneViewProps) {\n const value = mappingState.actions.getValue(path);\n\n // Determine current mode\n const isString = typeof value === 'string';\n const isValueConfig = typeof value === 'object' && value !== null;\n const valueConfig = isValueConfig ? (value as Record<string, unknown>) : {};\n\n // Display value for the input\n // - If string: show the string value\n // - If object: show the key property value (or empty if no key)\n const displayValue = isString\n ? (value as string)\n : typeof valueConfig.key === 'string'\n ? valueConfig.key\n : '';\n\n const handleStringChange = (newValue: string) => {\n if (isString || value === undefined) {\n // String mode or undefined: set as string value\n mappingState.actions.setValue(path, newValue);\n } else if (isValueConfig) {\n // ValueConfig mode: update the key property using the sub-path\n // This works whether it's key-only or has multiple properties\n mappingState.actions.setValue([...path, 'key'], newValue);\n }\n };\n\n const handleTileClick = (tileKey: string) => {\n // If in string mode, convert to ValueConfig first (for all tiles)\n // This preserves the string value as the 'key' property\n if (isString && displayValue) {\n mappingState.actions.setValue(path, { key: displayValue });\n } else if (value === undefined) {\n // If value is undefined, initialize as empty object so tile properties can be set\n mappingState.actions.setValue(path, {});\n }\n\n // Determine the appropriate nodeType based on the property\n // Properties that hold primitives get dedicated editors\n // Properties that hold ValueConfig objects get the generic valueConfig editor\n let nodeType: string;\n switch (tileKey) {\n case 'key':\n nodeType = 'key'; // Key property editor\n break;\n case 'value':\n nodeType = 'value'; // Primitive value editor\n break;\n case 'fn':\n nodeType = 'fn'; // Function editor (placeholder for now)\n break;\n case 'validate':\n nodeType = 'validate'; // Validate function editor (placeholder for now)\n break;\n case 'condition':\n nodeType = 'condition'; // Condition function editor (already implemented)\n break;\n case 'consent':\n nodeType = 'consent'; // Consent editor (already implemented)\n break;\n case 'map':\n nodeType = 'map'; // Map editor (placeholder for now)\n break;\n case 'loop':\n nodeType = 'loop'; // Loop editor (placeholder for now)\n break;\n case 'set':\n nodeType = 'set'; // Set editor (placeholder for now)\n break;\n default:\n nodeType = 'valueConfig'; // Fallback to generic editor\n }\n\n navigation.openTab([...path, tileKey], nodeType as NodeType);\n };\n\n const getTileStatus = (tileKey: string): ConfigTileStatus => {\n // For 'key' tile: only enabled if we have a ValueConfig with a key property\n if (tileKey === 'key') {\n if (isString) {\n // In string mode, there is no ValueConfig and no key property\n return { enabled: false, text: 'Not set' };\n } else if (isValueConfig) {\n // In ValueConfig mode, show the key property status\n const keyValue = valueConfig.key;\n return typeof keyValue === 'string' && keyValue\n ? { enabled: true, text: keyValue }\n : { enabled: false, text: 'Not set' };\n }\n }\n\n // For all other tiles, only show status if in ValueConfig mode\n if (!isValueConfig) {\n return { enabled: false, text: 'Not set' };\n }\n\n const configValue = valueConfig[tileKey];\n\n switch (tileKey) {\n case 'key':\n // Already handled above\n return { enabled: false, text: 'Not set' };\n\n case 'value':\n if (configValue !== undefined) {\n let displayText: string;\n if (typeof configValue === 'string') {\n displayText = configValue;\n } else if (typeof configValue === 'number') {\n displayText = String(configValue);\n } else if (typeof configValue === 'boolean') {\n displayText = String(configValue);\n } else if (configValue === null) {\n displayText = 'null';\n } else if (Array.isArray(configValue)) {\n displayText = `[${configValue.length} items]`;\n } else if (typeof configValue === 'object') {\n // Show only values, not keys\n const values = Object.values(\n configValue as Record<string, unknown>,\n );\n displayText = values\n .map((v) => (typeof v === 'string' ? v : JSON.stringify(v)))\n .join(', ');\n } else {\n displayText = String(configValue);\n }\n // Truncate if too long\n const preview =\n displayText.length > 40\n ? displayText.substring(0, 40) + '...'\n : displayText;\n return { enabled: true, text: preview };\n }\n return { enabled: false, text: 'Not set' };\n\n case 'fn':\n if (typeof configValue === 'string' && configValue) {\n // Show preview of function (first 40 chars)\n const preview =\n configValue.length > 40\n ? configValue.substring(0, 40) + '...'\n : configValue;\n return { enabled: true, text: preview };\n }\n return { enabled: false, text: 'Not set' };\n\n case 'map':\n if (!configValue) return { enabled: false, text: 'Not set' };\n const mapCount = Object.keys(\n configValue as Record<string, unknown>,\n ).length;\n return mapCount > 0\n ? {\n enabled: true,\n text: `${mapCount} ${mapCount === 1 ? 'property' : 'properties'}`,\n }\n : { enabled: false, text: 'Not set' };\n\n case 'loop':\n if (Array.isArray(configValue) && configValue.length >= 1) {\n // Show the source array path\n const source = String(configValue[0] || 'nested');\n return { enabled: true, text: `Source: ${source}` };\n }\n return { enabled: false, text: 'Not set' };\n\n case 'set':\n return Array.isArray(configValue) && configValue.length > 0\n ? {\n enabled: true,\n text: `${configValue.length} ${configValue.length === 1 ? 'value' : 'values'}`,\n }\n : { enabled: false, text: 'Not set' };\n\n case 'consent':\n if (!configValue) return { enabled: false, text: 'Not set' };\n const consentCount = Object.keys(\n configValue as Record<string, unknown>,\n ).length;\n return consentCount > 0\n ? {\n enabled: true,\n text: `${consentCount} ${consentCount === 1 ? 'state' : 'states'}`,\n }\n : { enabled: false, text: 'Not set' };\n\n case 'validate':\n if (typeof configValue === 'string' && configValue) {\n // Show preview of validation function (first 40 chars)\n const preview =\n configValue.length > 40\n ? configValue.substring(0, 40) + '...'\n : configValue;\n return { enabled: true, text: preview };\n }\n return { enabled: false, text: 'Not set' };\n\n default:\n return { enabled: false, text: 'Not set' };\n }\n };\n\n // Input is ALWAYS enabled\n const inputPlaceholder = 'e.g., data.productId, user.email';\n\n const inputTitle = 'Enter a property path to extract data from the event';\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n hideNavigation={hideNavigation}\n className={className}\n >\n {/* Quick Value Section */}\n <div className=\"elb-mapping-value-type-quick-section\">\n <div className=\"elb-mapping-value-type-section-title\">\n Dynamic Value\n </div>\n <MappingInput\n value={displayValue}\n onChange={handleStringChange}\n placeholder={inputPlaceholder}\n title={inputTitle}\n />\n <div className=\"elb-mapping-value-type-hint\">\n {isString ? (\n <span>Property path to extract data from the event</span>\n ) : (\n <span className=\"is-info\">\n Editing property path - synced with Key tile\n </span>\n )}\n </div>\n </div>\n\n {/* Advanced Configuration Section */}\n <div className=\"elb-mapping-value-type-advanced-section\">\n <div className=\"elb-mapping-value-type-section-title\">\n Advanced Configuration\n </div>\n <div className=\"elb-mapping-value-type-tiles-grid\">\n {VALUE_CONFIG_TILES.map((tile) => (\n <ConfigTile\n key={tile.key}\n label={tile.label}\n description={tile.description}\n status={getTileStatus(tile.key)}\n onClick={() => handleTileClick(tile.key)}\n />\n ))}\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\n\n/**\n * Value Pane View - Pure Presentation Component\n *\n * Edits primitive values within a ValueConfig.\n * This is specifically for the 'value' property of a ValueConfig,\n * which holds primitives (string, number, boolean), NOT nested objects.\n *\n * Type: ValueConfig.value -> WalkerOS.PropertyType (string | number | boolean)\n *\n * @example\n * // Editing the 'value' property of a ValueConfig at path ['page', 'view', 'data', 'map', 'currency']\n * // Path would be: ['page', 'view', 'data', 'map', 'currency', 'value']\n * <MappingValuePaneView\n * path={['page', 'view', 'data', 'map', 'currency', 'value']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport interface MappingValuePaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingValuePaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingValuePaneViewProps) {\n const value = mappingState.actions.getValue(path);\n\n // Convert current value to string for editing\n const stringValue =\n value === null ? 'null' : value === undefined ? '' : String(value);\n\n const handleChange = (newValue: string) => {\n // Try to infer the type from the input\n if (newValue === '') {\n // Empty string -> set as empty string (not undefined)\n mappingState.actions.setValue(path, '');\n return;\n }\n\n if (newValue === 'null') {\n mappingState.actions.setValue(path, null);\n return;\n }\n\n if (newValue === 'true') {\n mappingState.actions.setValue(path, true);\n return;\n }\n\n if (newValue === 'false') {\n mappingState.actions.setValue(path, false);\n return;\n }\n\n // Try parsing as number\n const asNumber = Number(newValue);\n if (!isNaN(asNumber) && newValue.trim() !== '') {\n mappingState.actions.setValue(path, asNumber);\n return;\n }\n\n // Default to string\n mappingState.actions.setValue(path, newValue);\n };\n\n // Determine the current type for hint display\n const currentType =\n value === null ? 'null' : value === undefined ? 'undefined' : typeof value;\n\n return (\n <BaseMappingPane\n title=\"Static Value\"\n description=\"Fixed value that will be used (string, number, or boolean)\"\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n value={stringValue}\n onChange={handleChange}\n placeholder=\"USD\"\n autoFocus\n />\n <div className=\"elb-mapping-pane-hint\">\n Current type: <strong>{currentType}</strong>\n <br />\n Use for constant values like currency codes, fixed IDs, etc.\n <br />\n Examples: \"USD\" (string), 123 (number), true (boolean), null\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\n\n/**\n * Key Pane View - Pure Presentation Component\n *\n * Edits the 'key' property - a string path that extracts data from the event.\n * This is used to reference properties like data.id, user.email, globals.currency.\n *\n * @example\n * <MappingKeyPaneView\n * path={['page', 'view', 'data', 'map', 'currency', 'key']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport interface MappingKeyPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingKeyPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingKeyPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const keyValue = typeof value === 'string' ? value : '';\n\n const handleChange = (newValue: string) => {\n mappingState.actions.setValue(path, newValue);\n };\n\n return (\n <BaseMappingPane\n title=\"Property Path\"\n description=\"Path to extract from event (e.g., data.id, user.email, globals.currency)\"\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n value={keyValue}\n onChange={handleChange}\n placeholder=\"data.property\"\n autoFocus\n />\n <div className=\"elb-mapping-pane-hint\">\n Common paths: data.*, globals.*, user.*, context.*\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import { useState, useEffect, type ReactNode } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { CodeBox } from '../molecules/code-box';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { normalizeCode } from '../../utils/code-normalizer';\nimport {\n registerWalkerOSTypes,\n addFunctionContextTypes,\n type FunctionType,\n} from '../../utils/monaco-types';\nimport { registerPalenightTheme } from '../../themes/palenight';\n\n/**\n * Help Item - represents a single parameter, return value item, etc.\n */\nexport interface HelpItem {\n code: string; // The code snippet (e.g., \"value\", \"true\")\n description: string; // Human-readable description\n}\n\n/**\n * Help Example - code example with label\n */\nexport interface HelpExample {\n label: string; // Label describing the example\n code: string | ReactNode; // Example code (can contain JSX for HTML entities)\n}\n\n/**\n * Help Section - a titled section with either items or examples\n */\nexport interface HelpSection {\n title: string; // Section title (e.g., \"Parameters\", \"Return Value\")\n items?: HelpItem[]; // List items (for parameters, return values, etc.)\n examples?: HelpExample[]; // Code examples\n}\n\n/**\n * Base Props for Function Pane Component\n */\nexport interface MappingFunctionPaneBaseProps {\n title: string; // Pane title\n description: string; // Pane description\n defaultCode: string; // Default function code\n helpSections: HelpSection[]; // Array of help sections to display\n functionType: FunctionType; // Type of function (fn, condition, validate)\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\n/**\n * Mapping Function Pane Base\n *\n * Base component for function editing panes (condition, fn, validate).\n * Consolidates shared logic for state management, code editing, and help display.\n *\n * Used by:\n * - MappingConditionPaneView\n * - MappingFnPaneView\n * - MappingValidatePaneView\n */\nexport function MappingFunctionPaneBase({\n title,\n description,\n defaultCode,\n helpSections,\n functionType,\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingFunctionPaneBaseProps) {\n // Get current value from mapping state\n const value = mappingState.actions.getValue(path);\n const initialCode = typeof value === 'string' ? value : defaultCode;\n\n const [code, setCode] = useState(initialCode);\n\n // Update local state if external value changes\n useEffect(() => {\n const currentValue = mappingState.actions.getValue(path);\n const newCode =\n typeof currentValue === 'string' ? currentValue : defaultCode;\n setCode(newCode);\n }, [path, mappingState, defaultCode]);\n\n const handleCodeChange = (newCode: string) => {\n setCode(newCode);\n\n // Check if code is different from default (normalized comparison)\n const isDefault = normalizeCode(newCode) === normalizeCode(defaultCode);\n\n if (isDefault) {\n // Remove the property if it's the default\n mappingState.actions.deleteValue(path);\n } else {\n // Save the modified code\n mappingState.actions.setValue(path, newCode);\n }\n };\n\n const handleReset = () => {\n // Reset to default and remove from mapping\n setCode(defaultCode);\n mappingState.actions.deleteValue(path);\n };\n\n // Monaco editor beforeMount handler to register types\n const handleBeforeMount = (monaco: typeof import('monaco-editor')) => {\n registerPalenightTheme(monaco);\n registerWalkerOSTypes(monaco);\n addFunctionContextTypes(monaco, { type: functionType });\n };\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n headerAction={{\n label: 'Reset',\n onClick: handleReset,\n title: 'Reset to default',\n }}\n className={className}\n >\n <div className=\"elb-mapping-function-pane\">\n {/* Code Editor */}\n <div className=\"elb-mapping-function-editor\">\n <CodeBox\n code={code}\n language=\"typescript\"\n onChange={handleCodeChange}\n showHeader={false}\n label=\"\"\n beforeMount={handleBeforeMount}\n />\n </div>\n\n {/* Help Section */}\n <div className=\"elb-mapping-function-help\">\n {helpSections.map((section, sectionIndex) => (\n <div\n key={sectionIndex}\n className=\"elb-mapping-function-help-section\"\n >\n <h4 className=\"elb-mapping-function-help-title\">\n {section.title}\n </h4>\n\n {/* Render items (parameters, return values, etc.) */}\n {section.items && section.items.length > 0 && (\n <ul className=\"elb-mapping-function-help-list\">\n {section.items.map((item, itemIndex) => (\n <li key={itemIndex}>\n <code>{item.code}</code> - {item.description}\n </li>\n ))}\n </ul>\n )}\n\n {/* Render examples */}\n {section.examples && section.examples.length > 0 && (\n <div className=\"elb-mapping-function-examples\">\n {section.examples.map((example, exampleIndex) => (\n <div\n key={exampleIndex}\n className=\"elb-mapping-function-example\"\n >\n <div className=\"elb-mapping-function-example-label\">\n {example.label}\n </div>\n <code className=\"elb-mapping-function-example-code\">\n {example.code}\n </code>\n </div>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","/**\n * Normalize code for comparison\n *\n * Removes comments, normalizes whitespace, and trims\n * to detect if user actually changed the code logic.\n *\n * @param code - The code string to normalize\n * @returns Normalized code string\n */\nexport function normalizeCode(code: string): string {\n return (\n code\n // Remove single-line comments\n .replace(/\\/\\/.*$/gm, '')\n // Remove multi-line comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n // Normalize whitespace\n .replace(/\\s+/g, ' ')\n // Trim\n .trim()\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport {\n MappingFunctionPaneBase,\n type HelpSection,\n} from './mapping-function-pane-base';\n\n/**\n * Mapping Condition Pane View\n *\n * Dedicated pane for the 'condition' property - a function that determines\n * if the mapping rule should apply to an event.\n *\n * Returns true to apply the rule, false to skip it.\n */\nexport interface MappingConditionPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nconst DEFAULT_CONDITION = `(\n value: WalkerOS.DeepPartialEvent | unknown,\n mapping: Mapping.Value,\n collector: Collector.Instance | undefined\n): boolean | Promise<boolean> => {\n // Return true to apply this rule\n return true;\n}`;\n\nconst HELP_SECTIONS: HelpSection[] = [\n {\n title: 'Parameters',\n items: [\n {\n code: 'value',\n description: 'The event or current value being processed',\n },\n {\n code: 'mapping',\n description: 'The mapping configuration',\n },\n {\n code: 'collector',\n description: 'The collector instance',\n },\n ],\n },\n {\n title: 'Return Value',\n items: [\n {\n code: 'true',\n description: 'Apply this mapping rule',\n },\n {\n code: 'false',\n description: 'Skip this mapping rule',\n },\n ],\n },\n {\n title: 'Examples',\n examples: [\n {\n label: 'Only for high-value orders:',\n code: <>(value) => value.data?.total > 100</>,\n },\n {\n label: 'Only for specific user segment:',\n code: <>(value) => value.user?.segment === 'premium'</>,\n },\n {\n label: 'Only during business hours:',\n code: (\n <>\n () => new Date().getHours() >= 9 && new Date().getHours() <\n 17\n </>\n ),\n },\n ],\n },\n];\n\nexport function MappingConditionPaneView(props: MappingConditionPaneViewProps) {\n return (\n <MappingFunctionPaneBase\n title=\"Condition Function\"\n description=\"Define when this mapping rule should apply to an event\"\n defaultCode={DEFAULT_CONDITION}\n helpSections={HELP_SECTIONS}\n functionType=\"condition\"\n {...props}\n />\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport {\n MappingFunctionPaneBase,\n type HelpSection,\n} from './mapping-function-pane-base';\n\n/**\n * Mapping Fn Pane View\n *\n * Dedicated pane for the 'fn' property - a transformation function that\n * processes event data and returns a transformed value.\n *\n * Function signature: (value, mapping, options) => any\n */\nexport interface MappingFnPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nconst DEFAULT_FN = `(\n value: WalkerOS.DeepPartialEvent | unknown,\n mapping: Mapping.Value,\n options: Mapping.Options\n): WalkerOS.Property | unknown => {\n // Transform and return the value\n // Access event data: value.data, value.user, value.globals\n // Access collector: options.collector\n return value.data;\n}`;\n\nconst HELP_SECTIONS: HelpSection[] = [\n {\n title: 'Parameters',\n items: [\n {\n code: 'value',\n description: 'The event or current value being processed',\n },\n {\n code: 'mapping',\n description: 'The mapping configuration for this property',\n },\n {\n code: 'options',\n description: 'Additional options',\n },\n ],\n },\n {\n title: 'Return Value',\n items: [\n {\n code: 'any',\n description:\n 'Return the transformed value (string, number, object, array)',\n },\n {\n code: 'undefined',\n description: 'Return undefined to skip this property',\n },\n {\n code: 'Promise',\n description: 'Can be async (return Promise)',\n },\n ],\n },\n {\n title: 'Examples',\n examples: [\n {\n label: 'Extract nested property:',\n code: <>(value) => value.data?.product?.id</>,\n },\n {\n label: 'Format currency:',\n code: (\n <>\n (value) => {{'\\n'}\n {' '}const price = value.data?.price || 0;{'\\n'}\n {' '}return price.toFixed(2);{'\\n'}\n }\n </>\n ),\n },\n {\n label: 'Combine multiple fields:',\n code: (\n <>\n (value) => `${value.data?.firstName}\n ${value.data?.lastName}`\n </>\n ),\n },\n {\n label: 'Conditional transformation with consent:',\n code: (\n <>\n (value, mapping, options) => {{'\\n'}\n {' '}if (options.consent?.marketing) {{'\\n'}\n {' '}return value.user?.email;{'\\n'}\n {' '}}{'\\n'}\n {' '}return undefined;{'\\n'}\n }\n </>\n ),\n },\n {\n label: 'Use collector for context:',\n code: (\n <>\n (value, mapping, options) => {{'\\n'}\n {' '}const sessionId = options.collector?.session?.id;{'\\n'}\n {' '}return {{'\\n'}\n {' '}eventId: value.id,{'\\n'}\n {' '}sessionId: sessionId,{'\\n'}\n {' '}};{'\\n'}\n }\n </>\n ),\n },\n ],\n },\n];\n\nexport function MappingFnPaneView(props: MappingFnPaneViewProps) {\n return (\n <MappingFunctionPaneBase\n title=\"Transformation Function\"\n description=\"Transform event data before sending to destination\"\n defaultCode={DEFAULT_FN}\n helpSections={HELP_SECTIONS}\n functionType=\"fn\"\n {...props}\n />\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport {\n MappingFunctionPaneBase,\n type HelpSection,\n} from './mapping-function-pane-base';\n\n/**\n * Mapping Validate Pane View\n *\n * Dedicated pane for the 'validate' property - a validation function that\n * checks if a transformed value should be included.\n *\n * Function signature: (value?) => boolean\n * Returns true to include the value, false to exclude it.\n */\nexport interface MappingValidatePaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nconst DEFAULT_VALIDATE = `(\n value: unknown\n): boolean | Promise<boolean> => {\n // Return true to include this value\n // Return false to exclude it\n return value !== undefined && value !== null && value !== '';\n}`;\n\nconst HELP_SECTIONS: HelpSection[] = [\n {\n title: 'Parameter',\n items: [\n {\n code: 'value',\n description: 'The transformed value to validate (optional)',\n },\n ],\n },\n {\n title: 'Return Value',\n items: [\n {\n code: 'true',\n description: 'Include this value in the result',\n },\n {\n code: 'false',\n description: 'Exclude this value (skip it)',\n },\n {\n code: 'Promise',\n description: 'Can be async (return Promise)',\n },\n ],\n },\n {\n title: 'Examples',\n examples: [\n {\n label: 'Exclude empty values:',\n code: (\n <>\n (value) => value !== undefined && value !== null && value !== ''\n </>\n ),\n },\n {\n label: 'Only include valid email addresses:',\n code: (\n <>\n (value) => typeof value === 'string' &&\n /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)\n </>\n ),\n },\n {\n label: 'Only include positive numbers:',\n code: <>(value) => typeof value === 'number' && value > 0</>,\n },\n {\n label: 'Validate URL format:',\n code: (\n <>\n (value) => {{'\\n'}\n {' '}try {{'\\n'}\n {' '}new URL(value);{'\\n'}\n {' '}return true;{'\\n'}\n {' '}} catch {{'\\n'}\n {' '}return false;{'\\n'}\n {' '}}{'\\n'}\n }\n </>\n ),\n },\n {\n label: 'Exclude specific values:',\n code: (\n <>\n (value) => !['test', 'localhost', 'example.com'].includes(value)\n </>\n ),\n },\n ],\n },\n];\n\nexport function MappingValidatePaneView(props: MappingValidatePaneViewProps) {\n return (\n <MappingFunctionPaneBase\n title=\"Validation Function\"\n description=\"Validate if the transformed value should be included\"\n defaultCode={DEFAULT_VALIDATE}\n helpSections={HELP_SECTIONS}\n functionType=\"validate\"\n {...props}\n />\n );\n}\n","import type { RJSFSchema } from '@rjsf/utils';\n\n/**\n * Validation result with error message\n */\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\n/**\n * Validate a value against a JSON Schema\n *\n * Supports common validation rules:\n * - String: pattern, minLength, maxLength, enum\n * - Number: minimum, maximum, enum\n * - Type checking\n *\n * @param value - Value to validate\n * @param schema - JSON Schema to validate against\n * @returns Validation result with error message if invalid\n *\n * @example\n * const result = validateValue('123abc', {\n * type: 'string',\n * pattern: '^[0-9]+$'\n * });\n * // { valid: false, error: 'Must match pattern: ^[0-9]+$' }\n */\nexport function validateValue(\n value: unknown,\n schema?: RJSFSchema,\n): ValidationResult {\n // No schema = no validation\n if (!schema) {\n return { valid: true };\n }\n\n // Empty/null values - check if required\n if (value === undefined || value === null || value === '') {\n // If schema has a default or is not required, it's valid\n return { valid: true };\n }\n\n const schemaType = schema.type;\n\n // String validation\n if (schemaType === 'string') {\n const strValue = String(value);\n\n // Pattern validation (most important for things like pixelId)\n if (schema.pattern) {\n try {\n const regex = new RegExp(schema.pattern);\n if (!regex.test(strValue)) {\n return {\n valid: false,\n error: `Must match pattern: ${schema.pattern}`,\n };\n }\n } catch (e) {\n // Invalid regex pattern in schema - skip validation\n console.warn('Invalid regex pattern in schema:', schema.pattern);\n }\n }\n\n // Length validation\n if (schema.minLength !== undefined && strValue.length < schema.minLength) {\n return {\n valid: false,\n error: `Minimum length: ${schema.minLength} characters`,\n };\n }\n\n if (schema.maxLength !== undefined && strValue.length > schema.maxLength) {\n return {\n valid: false,\n error: `Maximum length: ${schema.maxLength} characters`,\n };\n }\n\n // Enum validation\n if (schema.enum && Array.isArray(schema.enum)) {\n if (!schema.enum.includes(strValue)) {\n return {\n valid: false,\n error: `Must be one of: ${schema.enum.join(', ')}`,\n };\n }\n }\n\n return { valid: true };\n }\n\n // Number validation\n if (schemaType === 'number' || schemaType === 'integer') {\n const numValue = typeof value === 'number' ? value : Number(value);\n\n // Type check\n if (isNaN(numValue)) {\n return {\n valid: false,\n error: 'Must be a valid number',\n };\n }\n\n // Integer check\n if (schemaType === 'integer' && !Number.isInteger(numValue)) {\n return {\n valid: false,\n error: 'Must be an integer',\n };\n }\n\n // Range validation\n if (schema.minimum !== undefined && numValue < schema.minimum) {\n return {\n valid: false,\n error: `Minimum value: ${schema.minimum}`,\n };\n }\n\n if (schema.maximum !== undefined && numValue > schema.maximum) {\n return {\n valid: false,\n error: `Maximum value: ${schema.maximum}`,\n };\n }\n\n // Enum validation\n if (schema.enum && Array.isArray(schema.enum)) {\n if (!schema.enum.includes(numValue)) {\n return {\n valid: false,\n error: `Must be one of: ${schema.enum.join(', ')}`,\n };\n }\n }\n\n return { valid: true };\n }\n\n // Boolean validation\n if (schemaType === 'boolean') {\n if (typeof value !== 'boolean') {\n return {\n valid: false,\n error: 'Must be true or false',\n };\n }\n return { valid: true };\n }\n\n // No validation for other types (array, object, etc.)\n return { valid: true };\n}\n\n/**\n * Format validation error message for display\n *\n * @param error - Error message from validation\n * @returns Formatted error message\n */\nexport function formatValidationError(error: string): string {\n return error;\n}\n","import React from 'react';\nimport type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\nimport { validateValue } from '../../utils/schema-validation';\n\nexport interface MappingNamePaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schema?: RJSFSchema;\n uiSchema?: UiSchema;\n className?: string;\n}\n\n/**\n * Name Pane - Text input with schema validation for rule name override\n *\n * The name property is a simple string that overrides the destination event name.\n * From packages/core/src/types/mapping.ts:\n * name?: string; // Use a custom event name\n *\n * Uses type=\"text\" with schema validation (minLength, maxLength, pattern)\n */\nexport function MappingNamePaneView({\n path,\n mappingState,\n navigation,\n schema,\n uiSchema,\n className = '',\n}: MappingNamePaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const nameValue = typeof value === 'string' ? value : '';\n\n const handleChange = (newValue: string) => {\n if (newValue.trim() === '') {\n // Delete if empty\n mappingState.actions.deleteValue(path);\n } else {\n mappingState.actions.setValue(path, newValue);\n }\n };\n\n // Validate current value\n const validationResult = validateValue(value, schema);\n const hasError = !validationResult.valid;\n\n // Get title and description from schema or use defaults\n const title = schema?.title || 'Event Name Override';\n const description =\n schema?.description ||\n 'Override the destination event name with a custom string';\n const placeholder =\n uiSchema?.['ui:placeholder'] ||\n 'e.g., page_view, product_click, order_complete';\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n value={nameValue}\n onChange={handleChange}\n placeholder={placeholder}\n type=\"text\"\n error={hasError}\n />\n <div className=\"elb-mapping-pane-hint\">\n {uiSchema?.['ui:help'] ||\n 'This string will be sent to the destination instead of the default entity-action name. Leave empty to use default.'}\n {hasError && validationResult.error && (\n <>\n <br />\n <span style={{ color: 'var(--color-button-danger)' }}>\n ⚠ {validationResult.error}\n </span>\n </>\n )}\n </div>\n </div>\n\n <div className=\"elb-mapping-name-examples\">\n <div className=\"elb-mapping-name-examples-title\">Common Examples:</div>\n <ul className=\"elb-mapping-name-examples-list\">\n <li>\n <code>page_view</code> - Google Analytics style\n </li>\n <li>\n <code>PageView</code> - Pascal case for tracking systems\n </li>\n <li>\n <code>view_item</code> - GA4 recommended event names\n </li>\n <li>\n <code>product.viewed</code> - Segment style with dots\n </li>\n </ul>\n </div>\n </BaseMappingPane>\n );\n}\n","import React from 'react';\nimport type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\nimport { validateValue } from '../../utils/schema-validation';\n\nexport interface MappingBatchPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schema?: RJSFSchema;\n uiSchema?: UiSchema;\n className?: string;\n}\n\n/**\n * Batch Pane - Number input with text-based validation\n *\n * The batch property is a number that specifies how many events to batch together.\n * From packages/core/src/types/mapping.ts:\n * batch?: number; // Batch size in milliseconds or event count\n *\n * Uses type=\"text\" to allow typing ANY value (including letters) for validation feedback\n */\nexport function MappingBatchPaneView({\n path,\n mappingState,\n navigation,\n schema,\n uiSchema,\n className = '',\n}: MappingBatchPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n\n // Convert to string for editing\n const stringValue =\n value === null ? 'null' : value === undefined ? '' : String(value);\n\n const handleChange = (newValue: string) => {\n // Empty string handling - delete the value\n if (newValue === '') {\n mappingState.actions.deleteValue(path);\n return;\n }\n\n // Try to coerce to number\n const asNumber = Number(newValue);\n if (!isNaN(asNumber)) {\n mappingState.actions.setValue(path, asNumber);\n } else {\n // Store as string - validation will show error\n mappingState.actions.setValue(path, newValue);\n }\n };\n\n // Validate current value\n const validationResult = validateValue(value, schema);\n const hasError = !validationResult.valid;\n\n // Get title and description from schema or use defaults\n const title = schema?.title || 'Batch Size';\n const description =\n schema?.description ||\n 'Specify the batch size in milliseconds (time-based) or event count.';\n const placeholder = uiSchema?.['ui:placeholder'] || 'e.g., 200, 1000, 5000';\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n type=\"text\"\n value={stringValue}\n onChange={handleChange}\n placeholder={placeholder}\n error={hasError}\n />\n <div className=\"elb-mapping-pane-hint\">\n {uiSchema?.['ui:help'] ||\n 'Events will be collected and sent in batches. Use time (ms) for timed batches or count for event-based batches. Leave empty to disable batching.'}\n {hasError && validationResult.error && (\n <>\n <br />\n <span style={{ color: 'var(--color-button-danger)' }}>\n ⚠ {validationResult.error}\n </span>\n </>\n )}\n </div>\n </div>\n\n <div className=\"elb-mapping-batch-examples\">\n <div className=\"elb-mapping-batch-examples-title\">\n Common Use Cases:\n </div>\n <ul className=\"elb-mapping-batch-examples-list\">\n <li>\n <code>200</code> - Send every 200ms (frequent updates)\n </li>\n <li>\n <code>1000</code> - Send every second (balanced)\n </li>\n <li>\n <code>5000</code> - Send every 5 seconds (reduced requests)\n </li>\n <li>\n <code>10</code> - Send every 10 events (event-based batching)\n </li>\n </ul>\n <div className=\"elb-mapping-batch-note\">\n <strong>Note:</strong> Batching reduces network requests by grouping\n multiple events together. Lower values = more frequent sends, higher\n values = fewer requests but longer delays.\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import { useState, useMemo } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { ConsentStateTile } from '../atoms/consent-state-tile';\nimport { scanMappingForConsentStates } from '../../utils/consent-scanner';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { getPathDescription } from '../../utils/path-analyzer';\nimport { MappingInputWithButton } from '../atoms/mapping-input-with-button';\n\n/**\n * Mapping Consent Pane View\n *\n * Dedicated pane for configuring required consent states.\n * Shows discovered consent states as toggleable tiles plus input to add new ones.\n */\nexport interface MappingConsentPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\nexport function MappingConsentPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingConsentPaneViewProps) {\n const [newStateName, setNewStateName] = useState('');\n\n // Get current consent value at this path\n const value = mappingState.actions.getValue(path);\n const currentConsent =\n value && typeof value === 'object'\n ? (value as Record<string, boolean>)\n : {};\n\n // Scan entire mapping for all consent states\n const discoveredStates = useMemo(\n () => scanMappingForConsentStates(mappingState.config),\n [mappingState.config],\n );\n\n const handleToggleState = (stateName: string) => {\n const isCurrentlyChecked = currentConsent[stateName] === true;\n\n if (isCurrentlyChecked) {\n // Uncheck: remove from consent object\n const newConsent = { ...currentConsent };\n delete newConsent[stateName];\n\n // If empty, delete the entire consent property\n if (Object.keys(newConsent).length === 0) {\n mappingState.actions.deleteValue(path);\n } else {\n mappingState.actions.setValue(path, newConsent);\n }\n } else {\n // Check: add to consent object with value true\n const newConsent = { ...currentConsent, [stateName]: true };\n mappingState.actions.setValue(path, newConsent);\n }\n };\n\n const handleInputChange = (value: string) => {\n setNewStateName(value);\n };\n\n const handleAddNewState = () => {\n const trimmed = newStateName.trim();\n if (!trimmed) return;\n\n // Don't add if it already exists\n if (discoveredStates.includes(trimmed)) {\n setNewStateName('');\n return;\n }\n\n // Add new state as checked\n const newConsent = { ...currentConsent, [trimmed]: true };\n mappingState.actions.setValue(path, newConsent);\n\n // Clear input\n setNewStateName('');\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setNewStateName('');\n }\n };\n\n // Get context-aware title and description\n const { title, description } = useMemo(\n () => getPathDescription(path, mappingState.config),\n [path, mappingState.config],\n );\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-consent-pane\">\n {/* Consent State Tiles Grid */}\n <div className=\"elb-mapping-consent-grid\">\n {discoveredStates.map((stateName) => (\n <ConsentStateTile\n key={stateName}\n label={stateName}\n checked={currentConsent[stateName] === true}\n onClick={() => handleToggleState(stateName)}\n />\n ))}\n\n {/* Add New State Input - Always visible */}\n <MappingInputWithButton\n value={newStateName}\n onChange={handleInputChange}\n onSubmit={handleAddNewState}\n onKeyDown={handleKeyDown}\n buttonLabel=\"Add\"\n showButton={true}\n placeholder=\"Add new consent state\"\n />\n </div>\n\n {/* Help Section */}\n <div className=\"elb-mapping-consent-help\">\n <h4 className=\"elb-mapping-consent-help-title\">How it works</h4>\n <ul className=\"elb-mapping-consent-help-list\">\n <li>Checked states are required for processing</li>\n <li>Events queue until required consent is granted</li>\n <li>\n Consent states are discovered from your entire mapping\n configuration\n </li>\n </ul>\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","/**\n * Consent State Tile\n *\n * Checkbox-like tile for toggling consent state requirements.\n * Styled similar to rule tiles with active/inactive states.\n */\nexport interface ConsentStateTileProps {\n label: string;\n checked: boolean;\n onClick: () => void;\n className?: string;\n}\n\nexport function ConsentStateTile({\n label,\n checked,\n onClick,\n className = '',\n}: ConsentStateTileProps) {\n return (\n <button\n type=\"button\"\n className={`elb-consent-state-tile ${checked ? 'is-checked' : ''} ${className}`}\n onClick={onClick}\n >\n <div className=\"elb-consent-state-tile-checkbox\">\n {checked && (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 3L4.5 8.5L2 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n <span className=\"elb-consent-state-tile-label\">{label}</span>\n </button>\n );\n}\n","import type { Mapping } from '@walkeros/core';\n\n/**\n * Scan entire mapping configuration for all consent state names\n *\n * Recursively traverses the mapping rules and collects unique consent state names\n * from:\n * - Top-level consent (destination-wide)\n * - Rule-level consent (rule.consent)\n * - ValueConfig-level consent (data.map.*.consent, nested structures)\n *\n * @param config - The mapping configuration to scan\n * @returns Array of unique consent state names sorted alphabetically\n *\n * @example\n * const states = scanMappingForConsentStates(config);\n * // ['analytics', 'functional', 'marketing']\n */\nexport function scanMappingForConsentStates(\n config: Mapping.Config | Mapping.Rules,\n): string[] {\n const consentStates = new Set<string>();\n\n /**\n * Recursively scan any value for consent objects\n * Handles Value, ValueType, ValueConfig, and all nested structures\n */\n function scanValue(value: unknown): void {\n // Handle null/undefined\n if (!value) return;\n\n // Handle arrays (Value can be Array<ValueType>)\n if (Array.isArray(value)) {\n value.forEach((item) => scanValue(item));\n return;\n }\n\n // Handle primitives (strings)\n if (typeof value !== 'object') return;\n\n // If this value has a consent property, collect its keys\n if ('consent' in value) {\n const consent = (value as Record<string, unknown>).consent;\n if (consent && typeof consent === 'object') {\n Object.keys(consent).forEach((state) => consentStates.add(state));\n }\n }\n\n // Recursively scan ValueConfig properties\n if ('map' in value) {\n const map = (value as Record<string, unknown>).map;\n if (map && typeof map === 'object') {\n Object.values(map).forEach((nestedValue) => scanValue(nestedValue));\n }\n }\n\n if ('loop' in value) {\n const loop = (value as Record<string, unknown>).loop;\n if (Array.isArray(loop)) {\n loop.forEach((item) => scanValue(item));\n }\n }\n\n if ('set' in value) {\n const set = (value as Record<string, unknown>).set;\n if (Array.isArray(set)) {\n set.forEach((item) => scanValue(item));\n }\n }\n\n // Scan rule properties that contain Data/Value types\n if ('data' in value) {\n const data = (value as Record<string, unknown>).data;\n scanValue(data);\n }\n\n // Scan other nested objects generically\n for (const key in value) {\n if (\n key !== 'consent' &&\n key !== 'map' &&\n key !== 'loop' &&\n key !== 'set' &&\n key !== 'data'\n ) {\n const nestedValue = (value as Record<string, unknown>)[key];\n if (nestedValue && typeof nestedValue === 'object') {\n scanValue(nestedValue);\n }\n }\n }\n }\n\n // Check if this is a full Config or just Rules\n const isFullConfig =\n 'mapping' in config ||\n 'consent' in config ||\n 'data' in config ||\n 'policy' in config;\n\n // Scan top-level consent (destination-wide) - only in full Config\n if (isFullConfig && 'consent' in config && config.consent) {\n Object.keys(config.consent).forEach((state) => consentStates.add(state));\n }\n\n // Determine where the rules are\n const rules: Mapping.Rules =\n (isFullConfig && 'mapping' in config\n ? config.mapping || {}\n : config) as Mapping.Rules;\n\n // Scan rules recursively\n Object.values(rules).forEach((entityRules) => {\n if (!entityRules) return;\n\n Object.values(entityRules).forEach((ruleOrArray) => {\n if (!ruleOrArray) return;\n\n // Handle both single rule and array of rules\n const ruleArray = Array.isArray(ruleOrArray)\n ? ruleOrArray\n : [ruleOrArray];\n\n ruleArray.forEach((rule) => {\n if (rule && typeof rule === 'object') {\n // Scan the entire rule recursively (includes rule.consent and all nested ValueConfigs)\n scanValue(rule);\n }\n });\n });\n });\n\n // Return sorted array\n return Array.from(consentStates).sort();\n}\n","import { useState } from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingConfirmButton } from '../atoms/mapping-confirm-button';\nimport { getConfiguredProperties } from '../../utils/value-display-formatter';\n\nexport interface MappingSetPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\n/**\n * Set Pane View - Array of values\n *\n * Displays and manages an array of Value mappings.\n * Each value can be:\n * - Simple string (key path like 'data.id')\n * - ValueConfig object (key, fn, map, loop, etc.)\n *\n * Features:\n * - Drag-and-drop reordering\n * - Add/remove values\n * - Navigate to ValueTypePaneView for editing\n * - Show badges for configured properties\n *\n * @example\n * <MappingSetPaneView\n * path={['product', 'view', 'data', 'items', 'set']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport function MappingSetPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingSetPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const setArray = Array.isArray(value) ? value : [];\n\n // Drag-and-drop state\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\n\n // Get configured properties from a value (for badges)\n // Handlers\n const handleAdd = () => {\n const newArray = [...setArray, ''];\n const newIndex = newArray.length - 1;\n mappingState.actions.setValue(path, newArray);\n // Navigate to the new entry\n navigation.openTab([...path, newIndex.toString()], 'valueType');\n };\n\n const handleRowClick = (index: number) => {\n navigation.openTab([...path, index.toString()], 'valueType');\n };\n\n const handleDelete = (index: number) => {\n const newArray = setArray.filter((_, i) => i !== index);\n if (newArray.length === 0) {\n mappingState.actions.deleteValue(path);\n } else {\n mappingState.actions.setValue(path, newArray);\n }\n };\n\n // Drag-and-drop handlers\n const handleDragStart = (e: React.DragEvent, index: number) => {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', index.toString());\n setDraggedIndex(index);\n };\n\n const handleDragOver = (e: React.DragEvent, index: number) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (draggedIndex !== index) {\n setDragOverIndex(index);\n }\n };\n\n const handleDragLeave = () => {\n setDragOverIndex(null);\n };\n\n const handleDrop = (e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n const dragIndex = parseInt(e.dataTransfer.getData('text/plain'));\n\n if (dragIndex === dropIndex) {\n setDraggedIndex(null);\n setDragOverIndex(null);\n return;\n }\n\n // Reorder array\n const newArray = [...setArray];\n const [removed] = newArray.splice(dragIndex, 1);\n newArray.splice(dropIndex, 0, removed);\n\n mappingState.actions.setValue(path, newArray);\n setDraggedIndex(null);\n setDragOverIndex(null);\n };\n\n const handleDragEnd = () => {\n setDraggedIndex(null);\n setDragOverIndex(null);\n };\n\n return (\n <BaseMappingPane\n title=\"Set Array\"\n description=\"Array of values - each value is processed independently and all results are collected\"\n navigation={navigation}\n className={className}\n >\n {/* Add button */}\n <div className=\"elb-set-input-section\">\n <button\n type=\"button\"\n className=\"elb-set-add-button\"\n onClick={handleAdd}\n >\n + Add Value\n </button>\n </div>\n\n {/* Set entries list */}\n {setArray.length > 0 && (\n <div className=\"elb-set-list\">\n {setArray.map((val, index) => {\n const configuredProps = getConfiguredProperties(val);\n const isSimple = typeof val === 'string';\n\n return (\n <div\n key={index}\n className={`elb-set-row ${\n draggedIndex === index ? 'elb-set-row-dragging' : ''\n } ${dragOverIndex === index ? 'elb-set-row-drag-over' : ''}`}\n draggable\n onDragStart={(e) => handleDragStart(e, index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDragLeave={handleDragLeave}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n >\n {/* Drag handle */}\n <div className=\"elb-set-drag-handle\" title=\"Drag to reorder\">\n <svg\n width=\"12\"\n height=\"16\"\n viewBox=\"0 0 12 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"3\" cy=\"4\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"4\" r=\"1.5\" />\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"3\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" />\n </svg>\n </div>\n\n {/* Value display - clickable */}\n <div\n className=\"elb-set-row-value\"\n onClick={() => handleRowClick(index)}\n >\n <div className=\"elb-set-row-badges\">\n {isSimple ? (\n <span className=\"elb-policy-badge\">\n <span className=\"elb-policy-badge-value\">\n \"{val as string}\"\n </span>\n </span>\n ) : (\n configuredProps.map(({ prop, value, isLong }) => (\n <span key={prop} className=\"elb-policy-badge\">\n <span className=\"elb-policy-badge-label\">\n {prop}:\n </span>\n <span\n className={`elb-policy-badge-value ${isLong ? 'is-long' : ''}`}\n >\n {value}\n </span>\n </span>\n ))\n )}\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"elb-set-row-actions\">\n <MappingConfirmButton\n confirmLabel=\"Delete?\"\n onConfirm={() => handleDelete(index)}\n ariaLabel={`Delete value ${index + 1}`}\n className=\"elb-mapping-delete-button\"\n />\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {/* Empty state */}\n {setArray.length === 0 && (\n <div className=\"elb-set-empty\">\n <p>No values in this set. Click \"Add Value\" to create one.</p>\n <p className=\"elb-set-empty-hint\">\n Each value will be processed independently.\n </p>\n </div>\n )}\n </BaseMappingPane>\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\nimport { MappingValueTypePaneView } from './mapping-value-type-pane-view';\n\nexport interface MappingLoopPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\n/**\n * Loop Pane View - Array iteration with transformation\n *\n * Simple two-part interface:\n * 1. Input field for scope (array path to iterate over)\n * 2. Reused ValueTypePaneView for item mapping configuration\n *\n * Loop structure: [scope, itemMapping]\n * - scope: String path to array (e.g., 'nested') or 'this' for current value\n * - itemMapping: Value transformation applied to each array item\n *\n * @example\n * <MappingLoopPaneView\n * path={['product', 'view', 'data', 'items', 'loop']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport function MappingLoopPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingLoopPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const loopArray = Array.isArray(value) && value.length === 2 ? value : null;\n\n const [scope, itemMapping] = loopArray || ['', undefined];\n\n const handleScopeChange = (newScope: string) => {\n // Only create loop array if scope has a value\n if (!newScope || newScope.trim() === '') {\n // If scope is empty, delete the loop entirely\n mappingState.actions.deleteValue(path);\n return;\n }\n\n // Update scope (first array element) while preserving item mapping\n mappingState.actions.setValue(path, [newScope, itemMapping]);\n };\n\n // If not initialized, show setup interface\n if (!loopArray) {\n return (\n <BaseMappingPane\n title=\"Loop Array\"\n description=\"Process arrays by applying transformation to each item\"\n navigation={navigation}\n className={className}\n >\n {/* Scope Input */}\n <div className=\"elb-mapping-pane-field\">\n <label className=\"elb-mapping-pane-label\">\n Array Path <span className=\"elb-mapping-pane-required\">*</span>\n </label>\n <MappingInput\n value={typeof scope === 'string' ? scope : ''}\n onChange={handleScopeChange}\n placeholder=\"nested\"\n autoFocus\n />\n <div className=\"elb-mapping-pane-hint\">\n Path to the array in the event (e.g., \"nested\", \"data.items\") or\n \"this\" for current value\n </div>\n </div>\n\n {/* Item Mapping - Reuse ValueTypePaneView without header */}\n <div className=\"elb-loop-item-mapping-section\">\n <MappingValueTypePaneView\n path={[...path, '1']}\n mappingState={mappingState}\n navigation={navigation}\n hideNavigation={true}\n className=\"\"\n />\n </div>\n </BaseMappingPane>\n );\n }\n\n // Configured loop - show scope input + item mapping editor\n return (\n <BaseMappingPane\n title=\"Loop Array\"\n description=\"Process arrays by applying transformation to each item\"\n navigation={navigation}\n className={className}\n >\n {/* Scope Input */}\n <div className=\"elb-mapping-pane-field\">\n <label className=\"elb-mapping-pane-label\">\n Array Path <span className=\"elb-mapping-pane-required\">*</span>\n </label>\n <MappingInput\n value={typeof scope === 'string' ? scope : ''}\n onChange={handleScopeChange}\n placeholder=\"nested\"\n />\n <div className=\"elb-mapping-pane-hint\">\n Path to the array in the event (e.g., \"nested\", \"data.items\") or\n \"this\" for current value\n </div>\n </div>\n\n {/* Item Mapping - Reuse ValueTypePaneView without header */}\n <div className=\"elb-loop-item-mapping-section\">\n <MappingValueTypePaneView\n path={[...path, '1']}\n mappingState={mappingState}\n navigation={navigation}\n hideNavigation={true}\n className=\"\"\n />\n </div>\n </BaseMappingPane>\n );\n}\n","import React, { useCallback } from 'react';\nimport Form from '@rjsf/core';\nimport type {\n RJSFSchema,\n UiSchema,\n FormContextType,\n RJSFValidationError,\n} from '@rjsf/utils';\nimport { withTheme } from '@rjsf/core';\nimport validator from '@rjsf/validator-ajv8';\nimport { mappingWidgets } from './widget-registry';\nimport { mappingFields } from './field-registry';\nimport { MappingGrid } from '../atoms/mapping-grid';\nimport { FieldHeader } from '../atoms/field-header';\n\nexport interface MappingFormWrapperProps {\n schema: RJSFSchema;\n uiSchema?: UiSchema;\n formData?: unknown;\n onChange?: (data: unknown) => void;\n onSubmit?: (data: unknown) => void;\n children?: React.ReactNode;\n nested?: boolean; // When true, renders without <form> wrapper to prevent nested forms\n formContext?: FormContextType; // Context passed to all widgets (navigation, mappingState, etc.)\n}\n\n/**\n * MappingFormWrapper - RJSF Form wrapper with theme integration\n *\n * Wraps react-jsonschema-form with custom theming, templates, and widgets.\n * Integrates with the explorer's CSS variable system and provides custom\n * layouts using MappingGrid.\n *\n * Features:\n * - Custom FieldTemplate with proper label/input styling\n * - Custom ObjectFieldTemplate using MappingGrid for layout\n * - Theme integration via CSS variables\n * - Custom widget registry\n * - Form context support\n *\n * @example\n * const schema = {\n * type: 'object',\n * properties: {\n * name: { type: 'string', title: 'Name' },\n * priority: { type: 'number', title: 'Priority' }\n * }\n * };\n *\n * <MappingFormWrapper\n * schema={schema}\n * formData={data}\n * onChange={setData}\n * />\n */\n// Create themed version with our custom templates\nconst ThemedForm = withTheme({\n widgets: mappingWidgets,\n fields: mappingFields,\n templates: {\n FieldTemplate: CustomFieldTemplate,\n ObjectFieldTemplate: CustomObjectFieldTemplate,\n },\n});\n\nexport function MappingFormWrapper({\n schema,\n uiSchema,\n formData,\n onChange,\n onSubmit,\n children,\n nested = false,\n formContext,\n}: MappingFormWrapperProps) {\n // Memoize callbacks to prevent child component re-renders and infinite loops\n const handleChange = useCallback(\n (event: { formData?: unknown }) => {\n onChange?.(event.formData);\n },\n [onChange],\n );\n\n const handleSubmit = useCallback(\n (event: { formData?: unknown }) => {\n onSubmit?.(event.formData);\n },\n [onSubmit],\n );\n\n // For nested usage, render fields directly without <form> wrapper\n if (nested) {\n return (\n <div className=\"elb-rjsf-nested-wrapper\">\n <ThemedForm\n schema={schema}\n uiSchema={uiSchema}\n formData={formData}\n validator={validator}\n onChange={handleChange}\n formContext={formContext}\n tagName=\"div\"\n >\n {/* RJSF renders submit button by default - hide it */}\n <div style={{ display: 'none' }} />\n </ThemedForm>\n </div>\n );\n }\n\n // For top-level usage, render full Form component\n return (\n <div className=\"elb-rjsf-form-wrapper\">\n <Form\n schema={schema}\n uiSchema={uiSchema}\n formData={formData}\n validator={validator}\n widgets={mappingWidgets}\n fields={mappingFields}\n onChange={handleChange}\n onSubmit={handleSubmit}\n formContext={formContext}\n templates={{\n FieldTemplate: CustomFieldTemplate,\n ObjectFieldTemplate: CustomObjectFieldTemplate,\n }}\n showErrorList={false}\n liveOmit={false}\n omitExtraData={false}\n >\n {/* RJSF renders submit button by default - hide it */}\n <div style={{ display: 'none' }} />\n </Form>\n </div>\n );\n}\n\n/**\n * Custom FieldTemplate\n *\n * Provides consistent styling for all form fields:\n * - Label with proper typography\n * - Field wrapper with spacing\n * - Error display\n * - Help text support\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction CustomFieldTemplate(props: any) {\n const {\n id,\n classNames,\n label,\n help,\n required,\n description,\n errors,\n children,\n hidden,\n schema,\n uiSchema,\n } = props;\n\n if (hidden) {\n return <div className=\"elb-rjsf-field-hidden\">{children}</div>;\n }\n\n // Hide label and description if:\n // 1. Object fields (like consent) - widget handles them\n // 2. Custom fields (ui:field) - field component handles them\n // 3. mappingValue widget - renders its own header\n const hasCustomField = uiSchema?.['ui:field'];\n const isValueWidget = uiSchema?.['ui:widget'] === 'mappingValue';\n const showLabelAndDescription =\n schema.type !== 'object' && !hasCustomField && !isValueWidget;\n\n return (\n <div className={`elb-rjsf-field ${classNames || ''}`} id={id}>\n {showLabelAndDescription && (\n <FieldHeader\n title={label}\n description={description}\n required={required}\n />\n )}\n {children}\n {errors}\n {help && <div className=\"elb-rjsf-help\">{help}</div>}\n </div>\n );\n}\n\n/**\n * Custom ObjectFieldTemplate\n *\n * Uses MappingGrid for laying out object properties in a responsive grid.\n * Properties are arranged in a 2-column layout on larger screens,\n * single column on mobile.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction CustomObjectFieldTemplate(props: any) {\n const { title, description, properties, uiSchema } = props;\n\n // Get layout preference from uiSchema\n const layout = uiSchema?.['ui:layout'] || 'cols-2';\n const responsive = uiSchema?.['ui:responsive'] !== false;\n\n return (\n <fieldset className=\"elb-rjsf-object\">\n {title && <legend className=\"elb-rjsf-object-title\">{title}</legend>}\n {description && (\n <div className=\"elb-rjsf-object-description\">{description}</div>\n )}\n <MappingGrid layout={layout} responsive={responsive} gap={16}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n {properties.map((element: any) => (\n <div key={element.name} className=\"elb-rjsf-object-property\">\n {element.content}\n </div>\n ))}\n </MappingGrid>\n </fieldset>\n );\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\n\n/**\n * MappingString - Custom RJSF widget for string inputs\n *\n * A styled text input widget that integrates with RJSF forms and uses\n * the explorer's CSS variable theming system. Displays validation errors\n * and supports disabled/readonly states.\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * name: {\n * 'ui:widget': 'mappingString',\n * 'ui:placeholder': 'Enter mapping name...'\n * }\n * }\n */\nexport function MappingStringWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n placeholder,\n rawErrors = [],\n required,\n } = props;\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onChange(event.target.value === '' ? undefined : event.target.value);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <input\n id={id}\n type=\"text\"\n className={`elb-rjsf-input ${hasError ? 'elb-rjsf-input-error' : ''}`}\n value={value ?? ''}\n onChange={handleChange}\n disabled={disabled || readonly}\n placeholder={placeholder}\n required={required}\n />\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\n\n/**\n * MappingNumber - Custom RJSF widget for number inputs\n *\n * A styled number input widget that integrates with RJSF forms and uses\n * the explorer's CSS variable theming system. Handles number parsing,\n * validation (min/max from schema), and displays errors.\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * priority: {\n * type: 'number',\n * minimum: 0,\n * maximum: 100\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * priority: {\n * 'ui:widget': 'mappingNumber',\n * 'ui:placeholder': 'Enter priority...'\n * }\n * }\n */\nexport function MappingNumberWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n placeholder,\n rawErrors = [],\n required,\n schema,\n } = props;\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = event.target.value;\n\n // Handle empty input\n if (inputValue === '') {\n onChange(undefined);\n return;\n }\n\n // Parse number\n const numValue = parseFloat(inputValue);\n if (!isNaN(numValue)) {\n onChange(numValue);\n }\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n // Extract min/max from schema if defined\n const min = schema.minimum;\n const max = schema.maximum;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <input\n id={id}\n type=\"number\"\n className={`elb-rjsf-input ${hasError ? 'elb-rjsf-input-error' : ''}`}\n value={value ?? ''}\n onChange={handleChange}\n disabled={disabled || readonly}\n placeholder={placeholder}\n required={required}\n min={min}\n max={max}\n step=\"any\"\n />\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\n\n/**\n * MappingBoolean - Custom RJSF widget for boolean checkbox\n *\n * A styled checkbox widget that matches the height and styling of text inputs.\n * The label is handled by FieldTemplate, so this widget only renders the\n * checkbox control itself.\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * enabled: {\n * type: 'boolean',\n * title: 'Ignore Event',\n * description: 'Skip processing this event'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * enabled: {\n * 'ui:widget': 'mappingBoolean'\n * }\n * }\n */\nexport function MappingBooleanWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n onChange(event.target.checked);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <input\n id={id}\n type=\"checkbox\"\n className={`elb-rjsf-checkbox ${hasError ? 'elb-rjsf-input-error' : ''}`}\n checked={value ?? false}\n onChange={handleChange}\n disabled={disabled || readonly}\n />\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { ConsentRow } from '../molecules/mapping-consent-row';\nimport { IconButton } from './icon-button';\n\n/**\n * MappingConsentWidget - RJSF widget for consent object\n *\n * Manages consent requirements as an object: { [consentType: string]: boolean }\n * where true = granted required, false = denied required\n *\n * States:\n * - Default (no consent): Shows grey \"+ Require consent\" button\n * - With data: Shows collapsible section with consent rows\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * consent: {\n * type: 'object',\n * title: 'Consent',\n * description: 'Required consent states'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * consent: {\n * 'ui:widget': 'mappingConsent'\n * }\n * }\n */\nexport function MappingConsentWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const consentData = (value as Record<string, boolean> | undefined) || {};\n const hasConsent = Object.keys(consentData).length > 0;\n\n // Extract title and description from schema\n const title = schema?.title || 'Consent';\n const description = schema?.description;\n\n // Start expanded if we have existing consent data\n const [isExpanded, setIsExpanded] = useState(hasConsent);\n\n // Update expanded state when consent data changes (e.g., switching between mapping rules)\n useEffect(() => {\n setIsExpanded(hasConsent);\n }, [hasConsent]);\n\n const handleAddConsent = () => {\n // Add a new consent entry with empty key and true value (checked by default)\n const newConsent = { ...consentData, '': true };\n onChange(newConsent);\n if (!isExpanded) {\n setIsExpanded(true);\n }\n };\n\n const handleUpdateConsentType = (oldKey: string, newKey: string) => {\n if (oldKey === newKey) return;\n\n const newConsent = { ...consentData };\n const value = newConsent[oldKey];\n delete newConsent[oldKey];\n\n // Only add if newKey is not empty\n if (newKey.trim()) {\n newConsent[newKey] = value;\n }\n\n // If no entries left, set to undefined\n const finalConsent =\n Object.keys(newConsent).length > 0 ? newConsent : undefined;\n onChange(finalConsent);\n };\n\n const handleUpdateGranted = (key: string, granted: boolean) => {\n const newConsent = { ...consentData, [key]: granted };\n onChange(newConsent);\n };\n\n const handleRemove = (key: string) => {\n const newConsent = { ...consentData };\n delete newConsent[key];\n\n // If no entries left, set to undefined\n const finalConsent =\n Object.keys(newConsent).length > 0 ? newConsent : undefined;\n onChange(finalConsent);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n >\n {hasConsent ? (\n <div className=\"elb-consent-rows\">\n {Object.entries(consentData).map(([key, granted], index) => (\n <ConsentRow\n key={index}\n consentType={key}\n granted={granted}\n onConsentTypeChange={(newKey) =>\n handleUpdateConsentType(key, newKey)\n }\n onGrantedChange={(newGranted) =>\n handleUpdateGranted(key, newGranted)\n }\n onRemove={() => handleRemove(key)}\n />\n ))}\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddConsent}\n disabled={disabled || readonly}\n className=\"elb-consent-add-row-button\"\n >\n Add consent\n </IconButton>\n </div>\n ) : (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddConsent}\n disabled={disabled || readonly}\n className=\"elb-consent-add-button\"\n >\n Require consent\n </IconButton>\n )}\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React, { useState } from 'react';\n\nexport interface MappingCollapsibleProps {\n title: string;\n description?: string;\n children: React.ReactNode;\n mode?: 'toggle' | 'checkbox';\n // For toggle mode\n defaultExpanded?: boolean;\n isExpanded?: boolean;\n onToggle?: (expanded: boolean) => void;\n // For checkbox mode\n checked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * MappingCollapsible - Unified collapsible component with two modes\n *\n * Modes:\n * - 'toggle' (default): Chevron icon that expands/collapses content\n * - 'checkbox': Checkbox that shows/hides content when checked\n *\n * Both modes support:\n * - Two-line label: title + optional description\n * - Controlled or uncontrolled state\n * - Theme-aware styling\n *\n * @example\n * // Toggle mode (consent widget)\n * <MappingCollapsible\n * mode=\"toggle\"\n * title=\"Consent\"\n * description=\"Required consent states\"\n * isExpanded={isExpanded}\n * onToggle={setIsExpanded}\n * >\n * <ConsentRows />\n * </MappingCollapsible>\n *\n * @example\n * // Checkbox mode (condition widget)\n * <MappingCollapsible\n * mode=\"checkbox\"\n * title=\"Condition\"\n * description=\"Conditionally apply this rule\"\n * checked={hasCondition}\n * onCheckedChange={setHasCondition}\n * >\n * <CodeEditor />\n * </MappingCollapsible>\n */\nexport function MappingCollapsible({\n title,\n description,\n children,\n mode = 'toggle',\n defaultExpanded = false,\n isExpanded: controlledExpanded,\n onToggle,\n checked = false,\n onCheckedChange,\n disabled = false,\n className = '',\n}: MappingCollapsibleProps) {\n const [uncontrolledExpanded, setUncontrolledExpanded] =\n useState(defaultExpanded);\n\n // Toggle mode state\n const isControlled = controlledExpanded !== undefined;\n const isExpanded = isControlled ? controlledExpanded : uncontrolledExpanded;\n const isOpen = mode === 'toggle' ? isExpanded : checked;\n\n const handleToggle = () => {\n if (mode === 'toggle') {\n const newExpanded = !isExpanded;\n if (!isControlled) {\n setUncontrolledExpanded(newExpanded);\n }\n onToggle?.(newExpanded);\n } else {\n // Checkbox mode\n if (!disabled) {\n onCheckedChange?.(!checked);\n }\n }\n };\n\n const handleCheckboxChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onCheckedChange?.(e.target.checked);\n };\n\n // Determine which CSS classes to use\n const containerClass =\n mode === 'checkbox' ? 'elb-checkbox-collapsible' : 'elb-collapsible';\n const headerClass =\n mode === 'checkbox'\n ? 'elb-checkbox-collapsible-header'\n : 'elb-collapsible-header';\n const labelClass =\n mode === 'checkbox'\n ? 'elb-checkbox-collapsible-label'\n : 'elb-collapsible-label';\n const titleClass =\n mode === 'checkbox' ? 'elb-checkbox-collapsible-title' : 'elb-rjsf-label';\n const descriptionClass =\n mode === 'checkbox'\n ? 'elb-checkbox-collapsible-description'\n : 'elb-collapsible-description';\n const contentClass =\n mode === 'checkbox'\n ? 'elb-checkbox-collapsible-content'\n : 'elb-collapsible-content';\n\n if (mode === 'checkbox') {\n return (\n <div className={`${containerClass} ${className}`.trim()}>\n <div className={headerClass} onClick={handleToggle}>\n <input\n type=\"checkbox\"\n className=\"elb-rjsf-checkbox elb-checkbox-collapsible-checkbox\"\n checked={checked}\n onChange={handleCheckboxChange}\n disabled={disabled}\n onClick={(e) => e.stopPropagation()} // Prevent double-toggle\n />\n <div className={labelClass}>\n <div className={titleClass}>{title}</div>\n {description && (\n <div className={descriptionClass}>{description}</div>\n )}\n </div>\n </div>\n {checked && <div className={contentClass}>{children}</div>}\n </div>\n );\n }\n\n // Toggle mode\n return (\n <div className={`${containerClass} ${className}`.trim()}>\n <button type=\"button\" className={headerClass} onClick={handleToggle}>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ flexShrink: 0 }}\n >\n {isExpanded ? (\n <polyline points=\"6 9 12 15 18 9\" />\n ) : (\n <polyline points=\"9 18 15 12 9 6\" />\n )}\n </svg>\n <div className={labelClass}>\n <span className={titleClass}>{title}</span>\n {description && (\n <span className={descriptionClass}>{description}</span>\n )}\n </div>\n </button>\n {isExpanded && <div className={contentClass}>{children}</div>}\n </div>\n );\n}\n\n// Legacy exports for backward compatibility\nexport const CollapsibleSection = MappingCollapsible;\nexport const MappingCheckboxCollapsible = (\n props: Omit<MappingCollapsibleProps, 'mode'>,\n) => <MappingCollapsible {...props} mode=\"checkbox\" />;\n","import React from 'react';\n\nexport interface IconButtonProps {\n icon:\n | 'delete'\n | 'save'\n | 'add'\n | 'edit'\n | 'check'\n | 'close'\n | 'chevronRight'\n | 'chevronDown';\n variant?: 'default' | 'primary' | 'danger';\n onClick?: () => void;\n disabled?: boolean;\n className?: string;\n title?: string;\n children?: React.ReactNode;\n}\n\n/**\n * IconButton - Reusable button component with icon and text support\n *\n * Features:\n * - Multiple icon options (delete, save, add, edit, check, close)\n * - Style variants (default, primary, danger)\n * - Optional text label (via children)\n * - Disabled state\n * - Theme-aware styling\n *\n * @example\n * <IconButton icon=\"save\" variant=\"primary\" onClick={handleSave}>Save</IconButton>\n * <IconButton icon=\"delete\" variant=\"danger\" onClick={handleDelete}>Delete</IconButton>\n */\nexport function IconButton({\n icon,\n variant = 'default',\n onClick,\n disabled = false,\n className = '',\n title,\n children,\n}: IconButtonProps) {\n const getIcon = () => {\n switch (icon) {\n case 'delete':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n );\n case 'save':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\" />\n <polyline points=\"17 21 17 13 7 13 7 21\" />\n <polyline points=\"7 3 7 8 15 8\" />\n </svg>\n );\n case 'add':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n case 'edit':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n );\n case 'check':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n case 'close':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n case 'chevronRight':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n );\n case 'chevronDown':\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n }\n };\n\n return (\n <button\n className={`elb-icon-button elb-icon-button-${variant} ${className}`}\n onClick={onClick}\n disabled={disabled}\n title={title}\n type=\"button\"\n >\n {getIcon()}\n {children && <span className=\"elb-icon-button-text\">{children}</span>}\n </button>\n );\n}\n","import React from 'react';\nimport { IconButton } from '../atoms/icon-button';\n\nexport interface ConsentRowProps {\n consentType: string;\n granted: boolean;\n onConsentTypeChange: (value: string) => void;\n onGrantedChange: (value: boolean) => void;\n onRemove: () => void;\n}\n\n/**\n * ConsentRow - Single consent requirement row\n *\n * Displays a row for configuring a consent requirement with:\n * - Input field for consent type name (e.g., \"functional\", \"marketing\")\n * - Checkbox for granted/denied state (checked = true/granted required)\n * - \"Granted\" label next to checkbox\n * - Trash button to remove the row\n *\n * Layout: [Input 200px] [Checkbox] [Label \"Granted\"] [Trash Button]\n *\n * @example\n * <ConsentRow\n * consentType=\"functional\"\n * granted={true}\n * onConsentTypeChange={setType}\n * onGrantedChange={setGranted}\n * onRemove={handleRemove}\n * />\n */\nexport function ConsentRow({\n consentType,\n granted,\n onConsentTypeChange,\n onGrantedChange,\n onRemove,\n}: ConsentRowProps) {\n return (\n <div className=\"elb-consent-row\">\n <input\n type=\"text\"\n className=\"elb-consent-input\"\n value={consentType}\n onChange={(e) => onConsentTypeChange(e.target.value)}\n placeholder=\"e.g., functional\"\n />\n <div className=\"elb-consent-checkbox-wrapper\">\n <input\n type=\"checkbox\"\n className=\"elb-rjsf-checkbox\"\n checked={granted}\n onChange={(e) => onGrantedChange(e.target.checked)}\n />\n <span className=\"elb-consent-label\">Required</span>\n </div>\n <IconButton\n icon=\"delete\"\n variant=\"danger\"\n onClick={onRemove}\n title=\"Remove consent requirement\"\n />\n </div>\n );\n}\n","import React, { useState, useEffect } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { CodeBox } from '../molecules/code-box';\nimport { FieldHeader } from './field-header';\nimport { Toggle } from './toggle';\n\n/**\n * MappingValueWidget - Widget for static PropertyType values\n *\n * Supports:\n * - String: text input\n * - Number: number input\n * - Boolean: checkbox\n * - Object: JSON editor (CodeBox)\n *\n * Features:\n * - Custom header with type selector positioned right\n * - Smart type detection based on current value\n * - Title and description rendered in widget (not by FieldTemplate)\n */\nexport function MappingValueWidget(props: WidgetProps) {\n const { value, onChange, disabled, readonly, schema, label, options } = props;\n\n // Extract title and description from schema or props\n // When using oneOf, RJSF may not pass description through schema\n const title = schema?.title || label || 'Value';\n const description = schema?.description || 'Static value to return';\n\n // Get emptyValue from options if specified\n const emptyValue = options?.emptyValue;\n\n // Determine type from actual value, default to none if undefined\n const getCurrentType = ():\n | 'none'\n | 'string'\n | 'number'\n | 'boolean'\n | 'object' => {\n // If value matches emptyValue, treat as string (to preserve empty strings)\n if (emptyValue !== undefined && value === emptyValue) {\n return 'string';\n }\n\n // Explicit undefined/null check - default to none for empty values\n if (value === undefined || value === null) return 'none';\n\n const valueType = typeof value;\n\n // Check for object type (but not arrays)\n if (valueType === 'object' && !Array.isArray(value)) return 'object';\n\n // Check for primitive types - including 0, false, and empty string\n if (valueType === 'number' || valueType === 'boolean') return valueType;\n if (valueType === 'string') return 'string';\n\n // Default fallback\n return 'none';\n };\n\n const [selectedType, setSelectedType] = useState<\n 'none' | 'string' | 'number' | 'boolean' | 'object'\n >(getCurrentType);\n\n // Track if user manually selected a type (to prevent auto-switching)\n const userSelectedTypeRef = React.useRef(false);\n\n // Track previous value to detect external changes (not user typing)\n const prevValueRef = React.useRef(value);\n\n // Sync selectedType only when value changes externally (e.g., loading new rule)\n useEffect(() => {\n // Detect if this is an external change by checking if value type changed\n const prevType = typeof prevValueRef.current;\n const currentType = typeof value;\n\n // Check if this is a major type change (switching rules)\n const isMajorTypeChange =\n prevType !== currentType ||\n (value === undefined && prevValueRef.current !== undefined) ||\n (value !== undefined && prevValueRef.current === undefined);\n\n if (isMajorTypeChange) {\n // Reset the user selection flag when loading new rule\n userSelectedTypeRef.current = false;\n const detectedType = getCurrentType();\n setSelectedType(detectedType);\n } else if (userSelectedTypeRef.current) {\n // User manually selected a type, keep it even if value changes\n // This allows empty string to stay as 'string' type\n }\n\n prevValueRef.current = value;\n }, [value]);\n\n const handleTypeChange = (\n newType: 'none' | 'string' | 'number' | 'boolean' | 'object',\n ) => {\n // Mark that user manually selected a type\n userSelectedTypeRef.current = true;\n setSelectedType(newType);\n\n // Set default value for new type\n switch (newType) {\n case 'none':\n onChange(undefined);\n break;\n case 'string':\n onChange('');\n break;\n case 'number':\n onChange(0);\n break;\n case 'boolean':\n onChange(false);\n break;\n case 'object':\n onChange({});\n break;\n }\n };\n\n const handleStringChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n // Always pass the string value, even if empty\n // Use emptyValue if specified and value is empty, otherwise use the actual value\n const stringValue = e.target.value;\n const valueToSend =\n stringValue === '' && emptyValue !== undefined ? emptyValue : stringValue;\n onChange(valueToSend);\n };\n\n const handleNumberChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const num = parseFloat(e.target.value);\n onChange(isNaN(num) ? 0 : num);\n };\n\n const handleBooleanChange = (checked: boolean) => {\n onChange(checked);\n };\n\n const handleObjectChange = (code: string) => {\n try {\n const parsed = JSON.parse(code);\n onChange(parsed);\n } catch {\n // Keep existing value if invalid JSON\n }\n };\n\n return (\n <div className=\"elb-rjsf-widget\">\n {/* Reusable header with type selector */}\n <FieldHeader\n title={title}\n description={description}\n action={\n <select\n className=\"elb-value-widget-type-select\"\n value={selectedType}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(e) => handleTypeChange(e.target.value as any)}\n disabled={disabled || readonly}\n >\n <option value=\"none\">None</option>\n <option value=\"string\">String</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"object\">Object</option>\n </select>\n }\n />\n\n {/* Input based on selected type */}\n {selectedType === 'string' && (\n <input\n type=\"text\"\n value={(value as string) || ''}\n onChange={handleStringChange}\n disabled={disabled}\n readOnly={readonly}\n className=\"elb-auto-select-input\"\n placeholder=\"Enter string value\"\n />\n )}\n\n {selectedType === 'number' && (\n <input\n type=\"number\"\n value={typeof value === 'number' ? value : 0}\n onChange={handleNumberChange}\n disabled={disabled}\n readOnly={readonly}\n className=\"elb-auto-select-input\"\n placeholder=\"Enter number value\"\n />\n )}\n\n {selectedType === 'boolean' && (\n <Toggle\n checked={!Boolean(value)}\n onChange={(checked) => handleBooleanChange(!checked)}\n disabled={disabled || readonly}\n label={value ? 'true' : 'false'}\n />\n )}\n\n {selectedType === 'object' && (\n <CodeBox\n code={JSON.stringify(value || {}, null, 2)}\n onChange={handleObjectChange}\n language=\"json\"\n height={120}\n // @ts-expect-error - Old Phase 1 component, readOnly prop type mismatch to be fixed in Phase 5\n readOnly={readonly}\n />\n )}\n </div>\n );\n}\n","import React from 'react';\n\nexport interface FieldHeaderProps {\n title: string;\n description?: string;\n required?: boolean;\n action?: React.ReactNode;\n}\n\n/**\n * FieldHeader - Reusable header component for form fields\n *\n * Provides consistent label + description layout used throughout RJSF forms.\n * Optionally supports an action element (like a selector) positioned on the right.\n *\n * Features:\n * - Standard label with optional required indicator\n * - Optional description with consistent styling\n * - Optional action element aligned to the right\n * - Uses same structure as FieldTemplate for consistency\n *\n * @example\n * // Simple label + description\n * <FieldHeader\n * title=\"Name\"\n * description=\"Enter your full name\"\n * />\n *\n * @example\n * // With action element (type selector)\n * <FieldHeader\n * title=\"Value\"\n * description=\"Static value to return\"\n * action={\n * <select value={type} onChange={handleChange}>\n * <option value=\"string\">String</option>\n * <option value=\"number\">Number</option>\n * </select>\n * }\n * />\n */\nexport function FieldHeader({\n title,\n description,\n required,\n action,\n}: FieldHeaderProps) {\n // If there's an action, use flexbox layout; otherwise use standard block layout\n if (action) {\n return (\n <div className=\"elb-field-header-with-action\">\n <div>\n <label className=\"elb-rjsf-label\">\n {title}\n {required && <span className=\"elb-rjsf-required\"> *</span>}\n </label>\n {description && (\n <div className=\"elb-rjsf-description\">{description}</div>\n )}\n </div>\n {action}\n </div>\n );\n }\n\n // Standard layout without action\n return (\n <>\n <label className=\"elb-rjsf-label\">\n {title}\n {required && <span className=\"elb-rjsf-required\"> *</span>}\n </label>\n {description && <div className=\"elb-rjsf-description\">{description}</div>}\n </>\n );\n}\n","import React from 'react';\n\nexport interface ToggleProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n label?: string;\n id?: string;\n}\n\nexport function Toggle({\n checked,\n onChange,\n disabled = false,\n label,\n id,\n}: ToggleProps) {\n const toggleId = id || `toggle-${Math.random().toString(36).substr(2, 9)}`;\n\n return (\n <div className=\"elb-toggle-container\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n id={toggleId}\n className={`elb-toggle ${checked ? 'elb-toggle-checked' : ''} ${\n disabled ? 'elb-toggle-disabled' : ''\n }`}\n onClick={() => !disabled && onChange(!checked)}\n disabled={disabled}\n >\n <span className=\"elb-toggle-slider\" />\n </button>\n {label && (\n <label htmlFor={toggleId} className=\"elb-toggle-label\">\n {label}\n </label>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\nimport type { WidgetProps, RJSFSchema } from '@rjsf/utils';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type {\n UseMappingNavigationReturn,\n NodeType,\n} from '../../hooks/useMappingNavigation';\nimport { MappingInputWithButton } from './mapping-input-with-button';\nimport { MappingConfirmButton } from './mapping-confirm-button';\nimport { getConfiguredProperties } from '../../utils/value-display-formatter';\nimport { PropertySuggestions } from '../molecules/property-suggestions';\n\n/**\n * Form context interface for object explorer widget\n */\nexport interface ObjectExplorerFormContext {\n navigation: UseMappingNavigationReturn;\n mappingState: UseMappingStateReturn;\n path: string[];\n}\n\n/**\n * Configuration options from uiSchema\n */\nexport interface ObjectExplorerOptions {\n allowAdd?: boolean; // Allow adding new keys (default: true)\n allowRename?: boolean; // Allow renaming keys (default: true)\n allowDelete?: boolean; // Allow deleting keys (default: true)\n showBadges?: boolean; // Show property badges (default: true)\n childNodeType?: NodeType; // Node type for child navigation (default: 'valueType')\n emptyMessage?: string; // Empty state message\n placeholder?: string; // Input placeholder text\n propertySuggestionsSchema?: RJSFSchema; // Schema for property suggestions\n}\n\n/**\n * MappingObjectExplorerWidget - Generic RJSF widget for object key-value exploration\n *\n * Replicates the exact behavior of MappingMapPaneView but is schema-driven.\n * Can be reused for map transformations, settings navigation, and any nested object exploration.\n *\n * Features (identical to original map pane):\n * - List object keys sorted alphabetically\n * - Add new key with input + button\n * - Rename key inline with edit icon\n * - Delete key with confirm button\n * - Show badges for configured properties\n * - Navigate to child editor on click\n * - Navigate to specific property on badge click\n *\n * Configuration via uiSchema:\n * ```typescript\n * {\n * 'ui:widget': 'objectExplorer',\n * 'ui:options': {\n * allowAdd: true,\n * allowRename: true,\n * allowDelete: true,\n * showBadges: true,\n * childNodeType: 'valueType',\n * emptyMessage: 'No keys yet...',\n * placeholder: 'Type key name...'\n * }\n * }\n * ```\n *\n * Requires formContext with navigation, mappingState, and path.\n */\nexport function MappingObjectExplorerWidget(props: WidgetProps) {\n const { value, onChange, options, formContext } = props;\n\n // Extract context\n const { navigation, mappingState, path } = (formContext ||\n {}) as ObjectExplorerFormContext;\n\n // Extract options with defaults\n const config: Required<\n Omit<ObjectExplorerOptions, 'propertySuggestionsSchema'>\n > & { propertySuggestionsSchema?: RJSFSchema } = {\n allowAdd: options?.allowAdd !== false,\n allowRename: options?.allowRename !== false,\n allowDelete: options?.allowDelete !== false,\n showBadges: options?.showBadges !== false,\n childNodeType: (options?.childNodeType as NodeType) || 'valueType',\n emptyMessage:\n (typeof options?.emptyMessage === 'string' ? options?.emptyMessage : undefined) || 'No keys yet. Add keys to transform event data.',\n placeholder:\n (typeof options?.placeholder === 'string' ? options?.placeholder : undefined) ||\n 'Type key name to create or select (e.g., currency)...',\n propertySuggestionsSchema: options?.propertySuggestionsSchema as\n | RJSFSchema\n | undefined,\n };\n\n // State for add/rename operations\n const [newKey, setNewKey] = useState('');\n const [keyExists, setKeyExists] = useState(false);\n const [renamingKey, setRenamingKey] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState('');\n\n // Get map object from value\n const map =\n value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n\n // Get sorted list of map keys\n const mapKeys = Object.keys(map).sort();\n\n // Add key handlers\n const handleKeyInputChange = (newValue: string) => {\n setNewKey(newValue);\n setKeyExists(map[newValue] !== undefined);\n };\n\n const handleKeySubmit = () => {\n const key = newKey.trim();\n if (!key) {\n setNewKey('');\n return;\n }\n\n // Initialize with empty string if new\n if (!keyExists) {\n const newMap = { ...map, [key]: '' };\n onChange(newMap);\n }\n\n // Navigate to the key editor\n if (navigation) {\n navigation.openTab([...path, key], config.childNodeType);\n }\n\n setNewKey('');\n setKeyExists(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setNewKey('');\n setKeyExists(false);\n }\n };\n\n // Key click handler - navigate to child editor\n const handleKeyClick = (key: string) => {\n if (navigation) {\n navigation.openTab([...path, key], config.childNodeType);\n }\n };\n\n // Badge click handler - navigate to specific property\n const handleBadgeClick = (key: string, prop: string) => {\n if (!navigation) return;\n\n // If prop is empty (simple string value), go to child overview\n if (!prop) {\n navigation.openTab([...path, key], config.childNodeType);\n return;\n }\n\n // Map each property to its corresponding node type and path\n const propToNodeType: Record<string, string> = {\n fn: 'fn',\n key: 'key',\n value: 'value',\n map: 'map',\n loop: 'loop',\n set: 'set',\n consent: 'consent',\n condition: 'condition',\n validate: 'validate',\n };\n\n const nodeType = propToNodeType[prop] || config.childNodeType;\n const targetPath = [...path, key, prop];\n\n navigation.openTab(targetPath, nodeType as NodeType);\n };\n\n // Delete key handler\n const handleDeleteClick = (key: string) => {\n const newMap = { ...map };\n delete newMap[key];\n onChange(newMap);\n };\n\n // Rename handlers\n const handleRenameClick = (key: string) => {\n setRenamingKey(key);\n setRenameValue(key);\n };\n\n const handleRenameChange = (newValue: string) => {\n setRenameValue(newValue);\n };\n\n const handleRenameSubmit = (oldKey: string) => {\n const newKeyTrimmed = renameValue.trim();\n\n // Cancel if empty or unchanged\n if (!newKeyTrimmed || newKeyTrimmed === oldKey) {\n setRenamingKey(null);\n setRenameValue('');\n return;\n }\n\n // Cancel if key already exists\n if (map[newKeyTrimmed] !== undefined) {\n setRenamingKey(null);\n setRenameValue('');\n return;\n }\n\n // Rename: copy value to new key, delete old key\n const oldValue = map[oldKey];\n const newMap = { ...map };\n delete newMap[oldKey];\n newMap[newKeyTrimmed] = oldValue;\n\n onChange(newMap);\n setRenamingKey(null);\n setRenameValue('');\n };\n\n const handleRenameCancel = () => {\n setRenamingKey(null);\n setRenameValue('');\n };\n\n const handleRenameKeyDown = (e: React.KeyboardEvent, oldKey: string) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n handleRenameCancel();\n }\n };\n\n const handleRenameBlur = () => {\n // Cancel edit on blur (clicking outside)\n // Use setTimeout to allow button click to register first\n setTimeout(() => {\n handleRenameCancel();\n }, 150);\n };\n\n // Property suggestion selection handler\n const handlePropertySelect = (propertyName: string, nodeType: NodeType) => {\n // Initialize with empty string if new\n if (map[propertyName] === undefined) {\n const newMap = { ...map, [propertyName]: '' };\n onChange(newMap);\n }\n\n // Navigate to the property editor using the schema-detected NodeType\n if (navigation) {\n navigation.openTab([...path, propertyName], nodeType);\n }\n };\n\n return (\n <div className=\"elb-object-explorer\">\n {/* Add new key input */}\n {config.allowAdd && (\n <div className=\"elb-policy-input-section\">\n <MappingInputWithButton\n value={newKey}\n onChange={handleKeyInputChange}\n onSubmit={handleKeySubmit}\n onKeyDown={handleKeyDown}\n buttonLabel={keyExists ? 'Open' : 'Add Key'}\n showButton={true}\n placeholder={config.placeholder}\n className={keyExists ? 'is-existing' : ''}\n />\n </div>\n )}\n\n {/* Property suggestions from schema */}\n {config.allowAdd &&\n config.propertySuggestionsSchema &&\n typeof config.propertySuggestionsSchema === 'object' &&\n 'properties' in config.propertySuggestionsSchema && (\n <PropertySuggestions\n schema={config.propertySuggestionsSchema}\n existingKeys={mapKeys}\n currentValue={map}\n onSelect={handlePropertySelect}\n />\n )}\n\n {/* Map keys list */}\n {mapKeys.length > 0 && (\n <div className=\"elb-policy-list\">\n {mapKeys.map((key) => {\n const keyValue = map[key];\n const configuredProps = config.showBadges\n ? getConfiguredProperties(keyValue)\n : [];\n\n const isRenaming = renamingKey === key;\n\n return (\n <div\n key={key}\n className=\"elb-policy-row\"\n onClick={() => !isRenaming && handleKeyClick(key)}\n style={{ cursor: isRenaming ? 'default' : 'pointer' }}\n >\n {/* First column: Key + Edit icon */}\n {isRenaming ? (\n <div className=\"elb-policy-row-path-rename\">\n <MappingInputWithButton\n value={renameValue}\n onChange={handleRenameChange}\n onSubmit={() => handleRenameSubmit(key)}\n onKeyDown={(e) => handleRenameKeyDown(e, key)}\n onBlur={handleRenameBlur}\n buttonLabel=\"Save\"\n showButton={true}\n autoFocus\n className=\"\"\n />\n </div>\n ) : (\n <div className=\"elb-policy-row-path-with-edit\">\n <span className=\"elb-policy-row-path\">{key}</span>\n {config.allowRename && (\n <button\n type=\"button\"\n className=\"elb-mapping-edit-button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRenameClick(key);\n }}\n title=\"Rename key\"\n aria-label={`Rename key ${key}`}\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.5 1.5L12.5 3.5L4.5 11.5H2.5V9.5L10.5 1.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 3L11 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n )}\n\n {/* Second column: Badges */}\n {config.showBadges && (\n <div className=\"elb-policy-row-badges\">\n {configuredProps.map(({ prop, value, isLong }, index) => (\n <button\n key={prop || index}\n type=\"button\"\n className=\"elb-policy-badge\"\n onClick={(e) => {\n e.stopPropagation();\n handleBadgeClick(key, prop);\n }}\n title={\n prop\n ? `Click to edit ${prop}`\n : 'Click to edit value configuration'\n }\n >\n {prop && (\n <span className=\"elb-policy-badge-label\">\n {prop}:\n </span>\n )}\n <span\n className={`elb-policy-badge-value ${isLong ? 'is-long' : ''}`}\n >\n {value}\n </span>\n </button>\n ))}\n </div>\n )}\n\n {/* Third column: Actions */}\n {config.allowDelete && (\n <div className=\"elb-policy-row-actions\">\n <MappingConfirmButton\n confirmLabel=\"Delete?\"\n onConfirm={() => handleDeleteClick(key)}\n ariaLabel={`Delete key ${key}`}\n className=\"elb-mapping-delete-button\"\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n\n {/* Empty state */}\n {mapKeys.length === 0 && (\n <div className=\"elb-policy-empty\">\n <p>{config.emptyMessage}</p>\n <ul>\n <li>Each key becomes a property in the output</li>\n <li>Values can be simple strings or complex transformations</li>\n <li>Example: currency → \"USD\", item_id → \"data.id\"</li>\n </ul>\n </div>\n )}\n </div>\n );\n}\n","import type { RJSFSchema } from '@rjsf/utils';\nimport type { NodeType } from '../../hooks/useMappingNavigation';\nimport { RuleTile, type RuleTileStatus } from '../atoms/config-tile';\nimport { detectNodeTypeFromSchema } from '../../utils/type-detector';\n\n/**\n * Property Suggestions Component\n *\n * Shows configured properties first (as tiles with values), then available suggestions in a grid.\n * Uses schema to determine the correct NodeType for each property.\n */\nexport interface PropertySuggestionsProps {\n schema?: RJSFSchema;\n existingKeys?: string[];\n currentValue?: Record<string, unknown>;\n onSelect: (propertyName: string, nodeType: NodeType) => void;\n className?: string;\n}\n\ninterface PropertyInfo {\n name: string;\n title: string;\n description?: string;\n nodeType: NodeType;\n}\n\nfunction getPropertyStatus(value: unknown, title: string): RuleTileStatus {\n if (value === undefined || value === null || value === '') {\n return { enabled: false, text: 'Not set' };\n }\n\n // Simple value display\n if (typeof value === 'string') {\n return { enabled: true, text: value };\n }\n if (typeof value === 'number') {\n return { enabled: true, text: String(value) };\n }\n if (typeof value === 'boolean') {\n return { enabled: true, text: value ? 'true' : 'false' };\n }\n if (Array.isArray(value)) {\n return { enabled: true, text: `${value.length} items` };\n }\n if (typeof value === 'object') {\n const keys = Object.keys(value);\n return { enabled: true, text: `${keys.length} properties` };\n }\n\n return { enabled: true, text: 'Configured' };\n}\n\nexport function PropertySuggestions({\n schema,\n existingKeys = [],\n currentValue = {},\n onSelect,\n className = '',\n}: PropertySuggestionsProps) {\n if (!schema || !schema.properties) {\n return null;\n }\n\n // Separate configured and available properties\n const configuredProperties: PropertyInfo[] = [];\n const availableProperties: PropertyInfo[] = [];\n\n Object.entries(schema.properties).forEach(([name, propSchema]) => {\n const propSchemaObj = propSchema as RJSFSchema;\n\n // Detect the correct NodeType from the property's schema\n const nodeType = detectNodeTypeFromSchema(propSchemaObj);\n\n const propertyInfo: PropertyInfo = {\n name,\n title: propSchemaObj.title || name,\n description: propSchemaObj.description,\n nodeType,\n };\n\n if (existingKeys.includes(name)) {\n configuredProperties.push(propertyInfo);\n } else {\n availableProperties.push(propertyInfo);\n }\n });\n\n // Sort both lists alphabetically\n configuredProperties.sort((a, b) => a.title.localeCompare(b.title));\n availableProperties.sort((a, b) => a.title.localeCompare(b.title));\n\n return (\n <div className={`elb-property-suggestions ${className}`}>\n {/* Configured properties - shown as tiles with values */}\n {configuredProperties.length > 0 && (\n <div className=\"elb-property-suggestions-section\">\n <div className=\"elb-property-suggestions-grid\">\n {configuredProperties.map((prop) => (\n <RuleTile\n key={prop.name}\n label={prop.title}\n description={prop.description || ''}\n status={getPropertyStatus(currentValue[prop.name], prop.title)}\n onClick={() => onSelect(prop.name, prop.nodeType)}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Available properties - shown as simple tiles */}\n {availableProperties.length > 0 && (\n <div className=\"elb-property-suggestions-section\">\n {configuredProperties.length > 0 && (\n <div className=\"elb-property-suggestions-divider\">\n <span>Available Properties</span>\n </div>\n )}\n <div className=\"elb-property-suggestions-grid\">\n {availableProperties.map((prop) => (\n <RuleTile\n key={prop.name}\n label={prop.title}\n description={prop.description || ''}\n status={{ enabled: false, text: 'Not set' }}\n onClick={() => onSelect(prop.name, prop.nodeType)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type { RegistryWidgetsType } from '@rjsf/utils';\nimport { MappingStringWidget } from '../atoms/mapping-string';\nimport { MappingNumberWidget } from '../atoms/mapping-number';\nimport { MappingBooleanWidget } from '../atoms/mapping-boolean';\nimport { MappingConsentWidget } from '../atoms/mapping-consent';\nimport { MappingValueWidget } from '../atoms/mapping-value';\nimport { MappingObjectExplorerWidget } from '../atoms/mapping-object-explorer';\n\n/**\n * Widget Registry for RJSF Mapping Forms\n *\n * Central registry of all custom mapping widgets used in react-jsonschema-form.\n * Widgets are registered here and referenced in uiSchema via 'ui:widget' property.\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * name: {\n * 'ui:widget': 'mappingString'\n * }\n * }\n *\n * @example\n * // In Form component:\n * <Form\n * schema={schema}\n * widgets={mappingWidgets}\n * ...\n * />\n *\n * To add a new widget:\n * 1. Create the widget component in src/components/atoms/mapping-*.tsx\n * 2. Import it here\n * 3. Add to the mappingWidgets object with a descriptive key\n * 4. Reference it in uiSchema using the key\n */\n\n/**\n * Mapping Widgets Registry\n *\n * Available widgets:\n * - mappingString: Text input for string values\n * - mappingNumber: Number input with min/max validation\n * - mappingBoolean: Checkbox for boolean values\n * - mappingConsent: Collapsible consent requirements editor\n * - mappingValue: Multi-type static value editor (string/number/boolean/object)\n * - objectExplorer: Generic object key-value explorer with add/rename/delete/navigate\n */\nexport const mappingWidgets: RegistryWidgetsType = {\n mappingString: MappingStringWidget,\n mappingNumber: MappingNumberWidget,\n mappingBoolean: MappingBooleanWidget,\n mappingConsent: MappingConsentWidget,\n mappingValue: MappingValueWidget,\n objectExplorer: MappingObjectExplorerWidget,\n};\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingConsentWidget } from './mapping-consent';\n\n/**\n * MappingConsentField - RJSF custom field for consent object\n *\n * This is a field wrapper (not a widget) because RJSF requires custom fields\n * for object types, not widgets. Widgets are only used for primitive types.\n *\n * The field wraps our MappingConsentWidget and provides the necessary\n * interface that RJSF expects for custom fields.\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * consent: {\n * 'ui:field': 'mappingConsent'\n * }\n * }\n */\nexport function MappingConsentField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n // Convert FieldProps to WidgetProps format\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - Old Phase 1 component, RJSF WidgetProps type mismatch to be fixed in Phase 5\n return <MappingConsentWidget {...widgetProps} />;\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { CodeBox } from '../molecules/code-box';\n\n/**\n * Default condition function template\n * Provides a starting point for users with parameter hints\n */\nconst DEFAULT_CONDITION = `(value, mapping, collector) => {\n // Return true to apply this mapping rule\n // value: The event data\n // mapping: The mapping configuration\n // collector: The collector instance\n return true;\n}`;\n\n/**\n * MappingConditionWidget - RJSF widget for condition functions\n *\n * Manages condition functions as strings for mapping rules.\n * A condition determines whether a mapping rule should be applied.\n *\n * States:\n * - Unchecked (default): No condition, value is undefined\n * - Checked: Shows code editor with function template\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * condition: {\n * type: 'string',\n * title: 'Use condition',\n * description: 'Conditionally apply this mapping rule'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * condition: {\n * 'ui:widget': 'mappingCondition'\n * }\n * }\n */\nexport function MappingConditionWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const conditionCode = (value as string | undefined) || '';\n const hasCondition = Boolean(conditionCode);\n\n // Extract title and description from schema\n const title = schema?.title || 'Use condition';\n const description = schema?.description;\n\n const handleCheckboxChange = (checked: boolean) => {\n if (checked) {\n // Enable condition - set to default template\n onChange(DEFAULT_CONDITION);\n } else {\n // Disable condition - set to undefined\n onChange(undefined);\n }\n };\n\n const handleCodeChange = (code: string) => {\n // Update the condition code\n onChange(code || undefined);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"checkbox\"\n title={title}\n description={description}\n checked={hasCondition}\n onCheckedChange={handleCheckboxChange}\n disabled={disabled || readonly}\n >\n <CodeBox\n code={conditionCode}\n onChange={handleCodeChange}\n language=\"javascript\"\n label=\"Condition\"\n lineNumbers\n folding={false}\n disabled={disabled || readonly}\n />\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingConditionWidget } from './mapping-condition';\n\n/**\n * MappingConditionField - RJSF custom field for condition strings\n *\n * This is a field wrapper (not a widget) because RJSF requires custom fields\n * for complex types. The field wraps our MappingConditionWidget and provides\n * the necessary interface that RJSF expects for custom fields.\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * condition: {\n * 'ui:field': 'mappingCondition'\n * }\n * }\n */\nexport function MappingConditionField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n // Convert FieldProps to WidgetProps format\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - Old Phase 1 component, RJSF WidgetProps type mismatch to be fixed in Phase 5\n return <MappingConditionWidget {...widgetProps} />;\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { CodeBox } from '../molecules/code-box';\n\n/**\n * Default fn function template\n * Provides a starting point for users with parameter hints\n */\nconst DEFAULT_FN = `(value, mapping, options) => {\n // Transform the value\n // value: Input value from event or previous transformation\n // mapping: The current mapping configuration\n // options: { consent, collector, props }\n return value;\n}`;\n\n/**\n * MappingFnWidget - RJSF widget for custom transformation functions\n *\n * Manages fn (transformation) functions as strings for ValueConfig.\n * A fn function transforms values from one format to another.\n *\n * States:\n * - Unchecked (default): No transformation, value is undefined\n * - Checked: Shows code editor with function template\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * fn: {\n * type: 'string',\n * title: 'Function',\n * description: 'Custom transformation function'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * fn: {\n * 'ui:field': 'mappingFn'\n * }\n * }\n */\nexport function MappingFnWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const fnCode = (value as string | undefined) || '';\n const hasFn = Boolean(fnCode);\n\n // Extract title and description from schema\n const title = schema?.title || 'Function';\n const description = schema?.description;\n\n const handleCheckboxChange = (checked: boolean) => {\n if (checked) {\n // Enable fn - set to default template\n onChange(DEFAULT_FN);\n } else {\n // Disable fn - set to undefined\n onChange(undefined);\n }\n };\n\n const handleCodeChange = (code: string) => {\n // Update the fn code\n onChange(code || undefined);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"checkbox\"\n title={title}\n description={description}\n checked={hasFn}\n onCheckedChange={handleCheckboxChange}\n disabled={disabled || readonly}\n >\n <CodeBox\n code={fnCode}\n onChange={handleCodeChange}\n language=\"javascript\"\n showHeader={false}\n lineNumbers\n folding={false}\n disabled={disabled || readonly}\n />\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingFnWidget } from './mapping-fn';\n\n/**\n * MappingFnField - RJSF field wrapper for fn (transformation function)\n *\n * Bridges RJSF FieldProps to our custom MappingFnWidget.\n * Required because RJSF uses fields (not widgets) for complex types.\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * mappingFn: MappingFnField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * fn: {\n * 'ui:field': 'mappingFn'\n * }\n * };\n */\nexport function MappingFnField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - Old Phase 1 component, RJSF WidgetProps type mismatch to be fixed in Phase 5\n return <MappingFnWidget {...widgetProps} />;\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { FieldHeader } from './field-header';\n\n/**\n * MappingKeyWidget - RJSF widget for key property\n *\n * Manages the key property of ValueConfig - a string path to extract\n * values from events (e.g., 'data.id', 'user.email', 'globals.currency').\n *\n * Features:\n * - Simple text input for path entry\n * - Helpful examples and common path patterns\n * - Clean, focused interface for single property editing\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * key: {\n * type: 'string',\n * title: 'Key',\n * description: 'Extract value from event path'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * key: {\n * 'ui:widget': 'mappingKey'\n * }\n * }\n */\nexport function MappingKeyWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n placeholder,\n } = props;\n\n const keyValue = (value as string | undefined) || '';\n\n // Extract title and description from schema\n const title = schema?.title || 'Key';\n const description = schema?.description || 'Extract value from event path';\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n onChange(newValue || undefined);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <FieldHeader title={title} description={description} />\n\n <input\n id={id}\n type=\"text\"\n value={keyValue}\n onChange={handleChange}\n disabled={disabled}\n readOnly={readonly}\n className=\"elb-auto-select-input\"\n placeholder={placeholder || 'e.g., data.id, user.email'}\n />\n\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingKeyWidget } from './mapping-key';\n\n/**\n * MappingKeyField - RJSF field wrapper for key property\n *\n * Bridges RJSF FieldProps to our custom MappingKeyWidget.\n * Required because RJSF uses fields (not widgets) for custom field rendering.\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * mappingKey: MappingKeyField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * key: {\n * 'ui:field': 'mappingKey'\n * }\n * };\n */\nexport function MappingKeyField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n placeholder: uiSchema?.['ui:placeholder'] as string | undefined,\n };\n\n // @ts-expect-error - RJSF WidgetProps type mismatch, will be fixed in Phase 5\n return <MappingKeyWidget {...widgetProps} />;\n}\n","import React from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { CodeBox } from '../molecules/code-box';\n\n/**\n * Default validate function template\n * Provides a starting point for users with parameter hints\n */\nconst DEFAULT_VALIDATE = `(value) => {\n // Return true if value is valid\n // value: The result from key/fn/map/etc\n return value !== undefined;\n}`;\n\n/**\n * MappingValidateWidget - RJSF widget for validate functions\n *\n * Manages validate functions as strings for ValueConfig.\n * A validate function checks if the mapped value is valid.\n *\n * States:\n * - Unchecked (default): No validation, value is undefined\n * - Checked: Shows code editor with function template\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * validate: {\n * type: 'string',\n * title: 'Validate',\n * description: 'Validate the result'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * validate: {\n * 'ui:field': 'mappingValidate'\n * }\n * }\n */\nexport function MappingValidateWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const validateCode = (value as string | undefined) || '';\n const hasValidate = Boolean(validateCode);\n\n // Extract title and description from schema\n const title = schema?.title || 'Validate';\n const description = schema?.description;\n\n const handleCheckboxChange = (checked: boolean) => {\n if (checked) {\n // Enable validate - set to default template\n onChange(DEFAULT_VALIDATE);\n } else {\n // Disable validate - set to undefined\n onChange(undefined);\n }\n };\n\n const handleCodeChange = (code: string) => {\n // Update the validate code\n onChange(code || undefined);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"checkbox\"\n title={title}\n description={description}\n checked={hasValidate}\n onCheckedChange={handleCheckboxChange}\n disabled={disabled || readonly}\n >\n <CodeBox\n code={validateCode}\n onChange={handleCodeChange}\n language=\"javascript\"\n showHeader={false}\n lineNumbers\n folding={false}\n disabled={disabled || readonly}\n />\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingValidateWidget } from './mapping-validate';\n\n/**\n * MappingValidateField - RJSF field wrapper for validate\n *\n * Bridges RJSF FieldProps to our custom MappingValidateWidget.\n * Required because RJSF uses fields (not widgets) for complex types.\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * mappingValidate: MappingValidateField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * validate: {\n * 'ui:field': 'mappingValidate'\n * }\n * };\n */\nexport function MappingValidateField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - Old Phase 1 component, RJSF WidgetProps type mismatch to be fixed in Phase 5\n return <MappingValidateWidget {...widgetProps} />;\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport {\n valueConfigSchema,\n valueConfigUiSchema,\n} from '../../schemas/value-config-schema';\nimport { IconButton } from './icon-button';\nimport { cleanFormData } from '../../utils/clean-form-data';\n\n/**\n * MappingDataWidget - RJSF widget for data transformation\n *\n * Manages ValueConfig as an object for data transformation.\n * Contains a nested RJSF form for ValueConfig properties.\n *\n * States:\n * - Default (no data): Shows collapsed toggle with \"Add data transformation\" button\n * - With data: Shows toggle collapsible section with ValueConfig form\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * data: {\n * type: 'object',\n * title: 'Data',\n * description: 'Transform event data'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * data: {\n * 'ui:field': 'mappingData'\n * }\n * }\n */\nexport function MappingDataWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n } = props;\n\n const dataConfig = (value as Record<string, unknown> | undefined) || {};\n const hasData = Object.keys(dataConfig).length > 0;\n\n // Extract title and description from schema\n const title = schema?.title || 'Data';\n const description = schema?.description;\n\n // Track if user wants to show the form (either has data or clicked add button)\n const [showForm, setShowForm] = useState(hasData);\n\n // Start expanded if we have existing data or form is shown\n const [isExpanded, setIsExpanded] = useState(hasData);\n\n // Track previous value to avoid redundant updates\n const prevValueRef = useRef<unknown>(value);\n\n // Update state when value changes externally (e.g., switching between mapping rules)\n useEffect(() => {\n const newHasData =\n value && typeof value === 'object' && Object.keys(value).length > 0;\n setShowForm(!!newHasData);\n setIsExpanded(!!newHasData);\n }, [value]);\n\n const handleAddData = () => {\n // Show the form without initializing data\n setShowForm(true);\n setIsExpanded(true);\n };\n\n const handleFormChange = useCallback(\n (formData: unknown) => {\n const newData = cleanFormData(formData as Record<string, unknown>);\n\n // If all fields are empty, set to undefined\n const finalData = Object.keys(newData).length > 0 ? newData : undefined;\n\n // Only call onChange if data actually changed\n if (prevValueRef.current !== finalData) {\n prevValueRef.current = finalData;\n onChange(finalData);\n }\n },\n [onChange],\n );\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <div className=\"elb-data-widget-wrapper\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n >\n {showForm ? (\n <div className=\"elb-data-widget-form\">\n <MappingFormWrapper\n schema={valueConfigSchema}\n uiSchema={valueConfigUiSchema}\n formData={hasData ? dataConfig : undefined}\n onChange={handleFormChange}\n nested={true}\n />\n </div>\n ) : (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddData}\n disabled={disabled || readonly}\n className=\"elb-data-add-button\"\n >\n Add data transformation\n </IconButton>\n )}\n </MappingCollapsible>\n </div>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, index) => (\n <div key={index}>{error}</div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import type { RJSFSchema, UiSchema } from '@rjsf/utils';\n\n/**\n * JSON Schema for Mapping.ValueConfig\n *\n * Based on packages/core/src/types/mapping.ts\n *\n * Implemented fields:\n * - key: String path to extract value from event (e.g., 'data.id', 'user.email')\n * - value: Static value (string, number, boolean, or JSON object)\n * - fn: Custom transformation function\n * - validate: Function to validate the result\n * - condition: Conditionally apply this mapping\n * - consent: Required consent to return value\n * - map: Object transformation\n * - set: Array of values\n * - loop: Array processing with transformation\n */\nexport const valueConfigSchema: RJSFSchema = {\n type: 'object',\n properties: {\n key: {\n type: 'string',\n title: 'Key',\n description: 'Extract value from event path (e.g., data.id, user.email)',\n },\n value: {\n type: ['string', 'number', 'boolean', 'object'],\n title: 'Value',\n description: 'Static value to return',\n default: '',\n },\n fn: {\n type: 'string',\n title: 'Function',\n description: 'Custom transformation function',\n },\n validate: {\n type: 'string',\n title: 'Validate',\n description: 'Validate the result',\n },\n condition: {\n type: 'string',\n title: 'Condition',\n description: 'Conditionally apply this mapping',\n },\n consent: {\n type: 'object',\n title: 'Consent',\n description: 'Required consent to return value',\n additionalProperties: {\n type: 'boolean',\n },\n },\n map: {\n type: 'object',\n title: 'Map',\n description: 'Transform object properties',\n additionalProperties: true,\n },\n set: {\n type: 'array',\n title: 'Set',\n description: 'Array of static values',\n items: {\n oneOf: [{ type: 'string' }, { type: 'object' }],\n },\n },\n loop: {\n type: 'array',\n title: 'Loop',\n description: 'Process arrays by applying transformation to each item',\n minItems: 2,\n maxItems: 2,\n items: [\n {\n type: 'string',\n title: 'Source',\n description: 'Path to array or \"this\"',\n },\n {\n type: 'object',\n title: 'Transform',\n description: 'Mapping for each item',\n },\n ],\n },\n },\n};\n\n/**\n * Nested ValueConfig Schema (excludes loop to prevent infinite recursion)\n *\n * Used within loop field transform section to prevent recursive rendering.\n * Contains all ValueConfig fields except 'loop' itself.\n */\nexport const valueConfigNestedSchema: RJSFSchema = {\n type: 'object',\n properties: {\n key: {\n type: 'string',\n title: 'Key',\n description: 'Extract value from event path (e.g., data.id, user.email)',\n },\n value: {\n type: ['string', 'number', 'boolean', 'object'],\n title: 'Value',\n description: 'Static value to return',\n default: '',\n },\n fn: {\n type: 'string',\n title: 'Function',\n description: 'Custom transformation function',\n },\n validate: {\n type: 'string',\n title: 'Validate',\n description: 'Validate the result',\n },\n condition: {\n type: 'string',\n title: 'Condition',\n description: 'Conditionally apply this mapping',\n },\n consent: {\n type: 'object',\n title: 'Consent',\n description: 'Required consent to return value',\n additionalProperties: {\n type: 'boolean',\n },\n },\n map: {\n type: 'object',\n title: 'Map',\n description: 'Transform object properties',\n additionalProperties: true,\n },\n set: {\n type: 'array',\n title: 'Set',\n description: 'Array of static values',\n items: {\n oneOf: [{ type: 'string' }, { type: 'object' }],\n },\n },\n // NOTE: 'loop' is intentionally excluded to prevent infinite recursion\n },\n};\n\n/**\n * UI Schema for Mapping.ValueConfig\n *\n * Customizes widget usage and layout for ValueConfig fields\n */\nexport const valueConfigUiSchema: UiSchema = {\n key: {\n 'ui:field': 'mappingKey',\n 'ui:placeholder': 'e.g., data.id, user.email',\n },\n value: {\n 'ui:widget': 'mappingValue',\n 'ui:emptyValue': '',\n 'ui:options': {\n emptyValue: '',\n },\n },\n fn: {\n 'ui:field': 'mappingFn',\n },\n validate: {\n 'ui:field': 'mappingValidate',\n },\n condition: {\n 'ui:field': 'mappingCondition',\n },\n consent: {\n 'ui:field': 'mappingConsent',\n },\n map: {\n 'ui:field': 'mappingMap',\n },\n set: {\n 'ui:field': 'mappingSet',\n },\n loop: {\n 'ui:field': 'mappingLoop',\n },\n 'ui:layout': '1fr',\n 'ui:responsive': true,\n};\n\n/**\n * Nested UI Schema (matches nested schema, excludes loop)\n */\nexport const valueConfigNestedUiSchema: UiSchema = {\n key: {\n 'ui:field': 'mappingKey',\n 'ui:placeholder': 'e.g., data.id, user.email',\n },\n value: {\n 'ui:widget': 'mappingValue',\n 'ui:emptyValue': '',\n 'ui:options': {\n emptyValue: '',\n },\n },\n fn: {\n 'ui:field': 'mappingFn',\n },\n validate: {\n 'ui:field': 'mappingValidate',\n },\n condition: {\n 'ui:field': 'mappingCondition',\n },\n consent: {\n 'ui:field': 'mappingConsent',\n },\n map: {\n 'ui:field': 'mappingMap',\n },\n set: {\n 'ui:field': 'mappingSet',\n },\n // NOTE: 'loop' is intentionally excluded to prevent infinite recursion\n 'ui:layout': '1fr',\n 'ui:responsive': true,\n};\n","/**\n * Clean form data by removing undefined, empty values, and invalid structures\n *\n * This utility ensures that RJSF auto-initialized empty values don't pollute\n * the mapping configuration. It handles:\n * - undefined values\n * - empty strings (except for 'value' field which allows '')\n * - empty arrays (set: [], etc.)\n * - empty objects (map: {}, consent: {}, etc.)\n * - invalid loop tuples ([null, {}], ['', {}], etc.)\n *\n * Used at multiple levels:\n * - Mapping rule level (mapping-editor.tsx)\n * - ValueConfig level (mapping-data.tsx)\n * - Nested ValueConfig levels (mapping-map-entry.tsx, mapping-set-entry.tsx)\n */\nexport function cleanFormData(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const cleaned: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n // Skip undefined values\n if (value === undefined) continue;\n\n // Skip empty strings (except 'value' field which allows empty string as valid)\n if (value === '' && key !== 'value') continue;\n\n // Skip empty arrays (set: [], or any other empty array)\n if (Array.isArray(value) && value.length === 0) continue;\n\n // Skip invalid loop arrays: [null, {}], ['', {}], or any loop without valid source and transform\n if (key === 'loop' && Array.isArray(value) && value.length === 2) {\n const source = value[0];\n const transform = value[1];\n\n const hasValidSource =\n typeof source === 'string' && source.trim().length > 0;\n const hasValidTransform =\n transform &&\n typeof transform === 'object' &&\n !Array.isArray(transform) &&\n Object.keys(transform).length > 0;\n\n // Only keep loop if both source and transform are valid\n if (!hasValidSource || !hasValidTransform) {\n continue;\n }\n }\n\n // Skip empty objects (map: {}, consent: {}, or any other empty object)\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.keys(value).length === 0\n ) {\n continue;\n }\n\n // Keep all other values\n cleaned[key] = value;\n }\n\n return cleaned;\n}\n\n/**\n * Clean mapping rule data (top-level mapping rules)\n *\n * Extends cleanFormData with additional mapping-specific rules:\n * - Skip false boolean values for 'ignore' field\n * - Skip zero or undefined for 'batch' field\n */\nexport function cleanMappingRuleData(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const cleaned = cleanFormData(data);\n const ruleCleaned: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(cleaned)) {\n // Skip false boolean values for ignore field\n if (key === 'ignore' && value === false) continue;\n\n // Skip zero or undefined for batch\n if (key === 'batch' && (!value || value === 0)) continue;\n\n ruleCleaned[key] = value;\n }\n\n return ruleCleaned;\n}\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingDataWidget } from './mapping-data';\n\n/**\n * MappingDataField - RJSF field wrapper for data transformation\n *\n * Bridges RJSF FieldProps to our custom MappingDataWidget.\n * Required because RJSF uses fields (not widgets) for complex object types.\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * mappingData: MappingDataField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * data: {\n * 'ui:field': 'mappingData'\n * }\n * };\n */\nexport function MappingDataField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - Old Phase 1 component, RJSF WidgetProps type mismatch to be fixed in Phase 5\n return <MappingDataWidget {...widgetProps} />;\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport type { WidgetProps } from '@rjsf/utils';\nimport type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport { MappingCollapsible } from './mapping-collapsible';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport { IconButton } from './icon-button';\nimport { cleanFormData } from '../../utils/clean-form-data';\n\n/**\n * MappingSettingsWidget - RJSF widget for destination-specific settings\n *\n * Manages settings as an object for destination-specific configuration.\n * Contains a nested RJSF form for settings properties when schema is provided.\n *\n * States:\n * - Default (no settings): Shows collapsed toggle with \"Add settings\" button\n * - With schema: Shows toggle collapsible section with schema-based form\n * - Without schema: Shows toggle collapsible section with JSON editor fallback\n *\n * The widget receives destination schemas via uiSchema['ui:options']:\n * - schema: RJSF schema for the settings object\n * - uiSchema: UI customization for settings fields\n *\n * @example\n * // In schema:\n * const schema = {\n * type: 'object',\n * properties: {\n * settings: {\n * type: 'object',\n * title: 'Settings',\n * description: 'Destination-specific configuration'\n * }\n * }\n * }\n *\n * @example\n * // In uiSchema (with destination schema):\n * const uiSchema = {\n * settings: {\n * 'ui:field': 'mappingSettings',\n * 'ui:options': {\n * schema: metaSchema.mappingSchema,\n * uiSchema: metaSchema.mappingUiSchema\n * }\n * }\n * }\n */\nexport function MappingSettingsWidget(props: WidgetProps) {\n const {\n id,\n value,\n onChange,\n disabled,\n readonly,\n rawErrors = [],\n schema,\n uiSchema,\n } = props;\n\n const settingsConfig = (value as Record<string, unknown> | undefined) || {};\n const hasSettings = Object.keys(settingsConfig).length > 0;\n\n // Extract title and description from schema\n const title = schema?.title || 'Settings';\n const description =\n schema?.description || 'Destination-specific configuration overrides';\n\n // Extract destination schemas from uiSchema options\n const destinationSchema = uiSchema?.['ui:options']?.schema as\n | RJSFSchema\n | undefined;\n const destinationUiSchema = uiSchema?.['ui:options']?.uiSchema as\n | UiSchema\n | undefined;\n\n // Determine if we have a schema to work with\n const hasSchema =\n destinationSchema &&\n destinationSchema.properties &&\n Object.keys(destinationSchema.properties).length > 0;\n\n // Track if user wants to show the form (either has settings or clicked add button)\n const [showForm, setShowForm] = useState(hasSettings);\n\n // Start expanded if we have existing settings or form is shown\n const [isExpanded, setIsExpanded] = useState(hasSettings);\n\n // Track previous value to avoid redundant updates\n const prevValueRef = useRef<unknown>(value);\n\n // Update state when value changes externally (e.g., switching between mapping rules)\n useEffect(() => {\n const newHasSettings =\n value && typeof value === 'object' && Object.keys(value).length > 0;\n setShowForm(!!newHasSettings);\n setIsExpanded(!!newHasSettings);\n }, [value]);\n\n const handleAddSettings = () => {\n // Show the form without initializing settings\n setShowForm(true);\n setIsExpanded(true);\n };\n\n const handleFormChange = useCallback(\n (formData: unknown) => {\n const newSettings = cleanFormData(formData as Record<string, unknown>);\n\n // If all fields are empty, set to undefined\n const finalSettings =\n Object.keys(newSettings).length > 0 ? newSettings : undefined;\n\n // Only call onChange if settings actually changed\n if (prevValueRef.current !== finalSettings) {\n prevValueRef.current = finalSettings;\n onChange(finalSettings);\n }\n },\n [onChange],\n );\n\n const handleClear = () => {\n onChange(undefined);\n setShowForm(false);\n setIsExpanded(false);\n };\n\n const hasError = rawErrors && rawErrors.length > 0;\n\n // Mode 1: No settings yet - show add button\n if (!showForm) {\n return (\n <div className=\"elb-rjsf-widget\">\n <div className=\"elb-settings-widget-wrapper\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n className={hasError ? 'elb-field-error' : ''}\n >\n <div className=\"elb-settings-widget-add\">\n <p className=\"elb-settings-widget-hint\">\n {hasSchema\n ? 'Configure destination-specific options for this event'\n : 'Add settings object (schema not available)'}\n </p>\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddSettings}\n disabled={disabled || readonly}\n >\n Add Settings\n </IconButton>\n </div>\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, i) => (\n <span key={i}>{error}</span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n }\n\n // Mode 2: Has settings - show form with schema or fallback\n return (\n <div className=\"elb-rjsf-widget\">\n <div className=\"elb-settings-widget-wrapper\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n className={hasError ? 'elb-field-error' : ''}\n >\n <div className=\"elb-settings-widget-content\">\n {hasSchema ? (\n // Schema-aware mode: Use destination schema\n <div className=\"elb-settings-widget-form\">\n <MappingFormWrapper\n schema={destinationSchema}\n uiSchema={destinationUiSchema}\n formData={value || {}}\n onChange={handleFormChange}\n />\n </div>\n ) : (\n // Fallback mode: Show message + JSON representation\n <div className=\"elb-settings-widget-fallback\">\n <p className=\"elb-settings-widget-hint\">\n This destination doesn't provide a visual settings editor.\n Settings are stored as a JSON object.\n </p>\n <pre className=\"elb-settings-widget-json\">\n {JSON.stringify(value, null, 2)}\n </pre>\n <p className=\"elb-settings-widget-hint text-muted\">\n Edit via Code view or update the mapping configuration\n directly.\n </p>\n </div>\n )}\n\n <div className=\"elb-settings-widget-actions\">\n <IconButton\n icon=\"delete\"\n variant=\"danger\"\n onClick={handleClear}\n disabled={disabled || readonly}\n >\n Clear Settings\n </IconButton>\n </div>\n </div>\n </MappingCollapsible>\n {hasError && (\n <div className=\"elb-rjsf-error\">\n {rawErrors.map((error, i) => (\n <span key={i}>{error}</span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default MappingSettingsWidget;\n","import React from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingSettingsWidget } from './mapping-settings';\n\n/**\n * MappingSettingsField - RJSF field wrapper for destination-specific settings\n *\n * Bridges RJSF FieldProps to our custom MappingSettingsWidget.\n * Required because RJSF uses fields (not widgets) for complex object types.\n *\n * Follows the same pattern as:\n * - MappingDataField → MappingDataWidget\n * - MappingConsentField → MappingConsentWidget\n * - MappingConditionField → MappingConditionWidget\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * mappingSettings: MappingSettingsField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * settings: {\n * 'ui:field': 'mappingSettings',\n * 'ui:options': {\n * schema: destinationSchema.mappingSchema,\n * uiSchema: destinationSchema.mappingUiSchema\n * }\n * }\n * };\n */\nexport function MappingSettingsField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n rawErrors,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n rawErrors: rawErrors || [],\n disabled: disabled || false,\n readonly: readonly || false,\n };\n\n // @ts-expect-error - WidgetProps type mismatch, consistent with other mapping fields\n return <MappingSettingsWidget {...widgetProps} />;\n}\n\nexport default MappingSettingsField;\n","import type { FieldProps } from '@rjsf/utils';\nimport { MappingObjectExplorerWidget } from './mapping-object-explorer';\n\n/**\n * MappingObjectExplorerField - RJSF field wrapper for object exploration\n *\n * Bridges RJSF FieldProps to our custom MappingObjectExplorerWidget.\n * Required because RJSF uses fields (not widgets) for object types.\n *\n * This is the proper RJSF pattern for custom object rendering.\n * Objects in RJSF are handled by Fields, primitives by Widgets.\n *\n * @example\n * // Register in field registry:\n * export const mappingFields: RegistryFieldsType = {\n * objectExplorer: MappingObjectExplorerField,\n * };\n *\n * @example\n * // Use in uiSchema:\n * const uiSchema = {\n * 'ui:field': 'objectExplorer',\n * 'ui:options': {\n * allowAdd: true,\n * allowRename: true,\n * showBadges: true,\n * }\n * };\n */\nexport function MappingObjectExplorerField(props: FieldProps) {\n const {\n formData,\n onChange,\n schema,\n uiSchema,\n idSchema,\n formContext,\n disabled,\n readonly,\n } = props;\n\n const widgetProps = {\n id: idSchema.$id,\n value: formData,\n onChange,\n schema,\n uiSchema,\n options: uiSchema?.['ui:options'] || {},\n formContext,\n disabled: disabled || false,\n readonly: readonly || false,\n label: schema.title || '',\n rawErrors: [],\n };\n\n // @ts-expect-error - WidgetProps type mismatch, consistent with other mapping fields\n return <MappingObjectExplorerWidget {...widgetProps} />;\n}\n\nexport default MappingObjectExplorerField;\n","import React, { useState, useEffect, useRef } from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingMapEntry, MapEntry } from '../atoms/mapping-map-entry';\nimport { MappingCollapsible } from '../atoms/mapping-collapsible';\nimport { IconButton } from '../atoms/icon-button';\n\n/**\n * MappingMapField - Custom field for object transformation mapping\n *\n * Manages a map of key-value pairs where values can be:\n * - Simple strings (key paths like 'data.id')\n * - Advanced ValueConfig objects (with key, value, condition, etc.)\n *\n * Features:\n * - Add/remove entries\n * - Edit key names\n * - Switch between simple and advanced value modes\n * - Warnings for empty/duplicate keys\n * - Recursive support (maps can contain maps)\n *\n * @example\n * // In schema:\n * map: {\n * type: 'object',\n * title: 'Map',\n * description: 'Transform object properties',\n * additionalProperties: true,\n * }\n *\n * // In uiSchema:\n * map: {\n * 'ui:field': 'mappingMap',\n * }\n */\nexport function MappingMapField(props: FieldProps) {\n const { formData, onChange, schema, uiSchema, disabled, readonly } = props;\n\n // Convert object to array for editing\n const objectToEntries = (\n obj: Record<string, unknown> | undefined,\n ): MapEntry[] => {\n if (!obj || typeof obj !== 'object') return [];\n return Object.entries(obj).map(([key, value]) => ({\n key,\n value: value as string | Record<string, unknown>,\n }));\n };\n\n // Convert array back to object\n const entriesToObject = (\n entries: MapEntry[],\n ): Record<string, unknown> | undefined => {\n // Filter out entries with empty keys\n const validEntries = entries.filter(\n (entry) => entry.key && entry.key.trim(),\n );\n\n if (validEntries.length === 0) return undefined;\n\n const result: Record<string, unknown> = {};\n validEntries.forEach((entry) => {\n result[entry.key] = entry.value;\n });\n return result;\n };\n\n const [entries, setEntries] = useState<MapEntry[]>(() =>\n objectToEntries(formData),\n );\n\n const hasEntries = entries.length > 0;\n\n // Start expanded if we have existing data\n const [isExpanded, setIsExpanded] = useState(hasEntries);\n\n // Track previous formData to avoid redundant updates\n const prevFormDataRef = useRef<unknown>(formData);\n\n // Sync external changes to internal state\n useEffect(() => {\n // Only sync if formData actually changed from external source\n if (prevFormDataRef.current === formData) {\n return;\n }\n prevFormDataRef.current = formData;\n\n setEntries(objectToEntries(formData));\n }, [formData]);\n\n // Update expanded state when data changes (e.g., switching between mapping rules)\n useEffect(() => {\n setIsExpanded(hasEntries);\n }, [hasEntries]);\n\n // Track duplicate keys for warnings\n const duplicateKeys = new Set<string>();\n const keyCounts = new Map<string, number>();\n entries.forEach((entry) => {\n if (entry.key) {\n const count = (keyCounts.get(entry.key) || 0) + 1;\n keyCounts.set(entry.key, count);\n if (count > 1) {\n duplicateKeys.add(entry.key);\n }\n }\n });\n\n const handleEntriesChange = (newEntries: MapEntry[]) => {\n setEntries(newEntries);\n const obj = entriesToObject(newEntries);\n\n // Update ref before calling onChange to prevent sync loop\n prevFormDataRef.current = obj;\n onChange(obj);\n };\n\n const handleEntryChange = (index: number, newEntry: MapEntry) => {\n const newEntries = [...entries];\n newEntries[index] = newEntry;\n handleEntriesChange(newEntries);\n };\n\n const handleEntryRemove = (index: number) => {\n const newEntries = entries.filter((_, i) => i !== index);\n handleEntriesChange(newEntries);\n };\n\n const handleAddEntry = () => {\n const newEntry: MapEntry = {\n key: '',\n value: '',\n tempId: `temp-${Date.now()}-${Math.random()}`,\n };\n handleEntriesChange([...entries, newEntry]);\n if (!isExpanded) {\n setIsExpanded(true);\n }\n };\n\n const title = schema?.title || 'Map';\n const description = schema?.description || 'Transform object properties';\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n >\n {hasEntries ? (\n <div className=\"elb-mapping-map-content\">\n <div className=\"elb-mapping-map-entries\">\n {entries.map((entry, index) => (\n <MappingMapEntry\n key={entry.tempId || `entry-${index}`}\n entry={entry}\n onChange={(newEntry) => handleEntryChange(index, newEntry)}\n onRemove={() => handleEntryRemove(index)}\n hasEmptyKey={!entry.key || !entry.key.trim()}\n hasDuplicateKey={\n entry.key ? duplicateKeys.has(entry.key) : false\n }\n />\n ))}\n </div>\n {!disabled && !readonly && (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddEntry}\n className=\"elb-mapping-map-add-row-button\"\n >\n Add key\n </IconButton>\n )}\n </div>\n ) : (\n !disabled &&\n !readonly && (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddEntry}\n className=\"elb-mapping-map-add-button\"\n >\n Add key-value pair\n </IconButton>\n )\n )}\n </MappingCollapsible>\n </div>\n );\n}\n","import React from 'react';\nimport { IconButton } from './icon-button';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport {\n valueConfigSchema,\n valueConfigUiSchema,\n} from '../../schemas/value-config-schema';\nimport { cleanFormData } from '../../utils/clean-form-data';\n\nexport interface MapEntry {\n key: string;\n value: string | Record<string, unknown>;\n tempId?: string;\n}\n\nexport interface MappingMapEntryProps {\n entry: MapEntry;\n onChange: (entry: MapEntry) => void;\n onRemove: () => void;\n hasEmptyKey?: boolean;\n hasDuplicateKey?: boolean;\n}\n\n/**\n * MappingMapEntry - Single key-value entry in a map\n *\n * Features:\n * - Key input with validation warnings\n * - Type selector (Simple/Advanced)\n * - Simple mode: String input for key paths\n * - Advanced mode: Full ValueConfig form\n * - Delete button\n *\n * @example\n * <MappingMapEntry\n * entry={{ key: 'item_id', value: 'data.id' }}\n * onChange={handleChange}\n * onRemove={handleRemove}\n * />\n */\nexport function MappingMapEntry({\n entry,\n onChange,\n onRemove,\n hasEmptyKey = false,\n hasDuplicateKey = false,\n}: MappingMapEntryProps) {\n const valueType = typeof entry.value === 'string' ? 'simple' : 'advanced';\n\n const handleKeyChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ ...entry, key: e.target.value });\n };\n\n const handleTypeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newType = e.target.value as 'simple' | 'advanced';\n\n if (newType === valueType) return;\n\n if (newType === 'advanced') {\n // Convert simple string to ValueConfig\n const stringValue = entry.value as string;\n onChange({\n ...entry,\n value: stringValue ? { key: stringValue } : {},\n });\n } else {\n // Convert ValueConfig to simple string\n const config = entry.value as Record<string, unknown>;\n const extractedValue =\n (config.key as string) ||\n (typeof config.value === 'string' ? (config.value as string) : '') ||\n '';\n onChange({\n ...entry,\n value: extractedValue,\n });\n }\n };\n\n const handleSimpleValueChange = (value: string) => {\n onChange({ ...entry, value });\n };\n\n const handleAdvancedValueChange = (data: unknown) => {\n // Clean the nested ValueConfig data to remove empty values\n const cleaned = cleanFormData(data as Record<string, unknown>);\n const finalValue = Object.keys(cleaned).length > 0 ? cleaned : {};\n onChange({ ...entry, value: finalValue });\n };\n\n const keyClassName = `elb-mapping-map-key ${\n hasEmptyKey ? 'elb-mapping-map-key-empty' : ''\n } ${hasDuplicateKey ? 'elb-mapping-map-key-duplicate' : ''}`;\n\n return (\n <div\n className={`elb-mapping-map-entry ${\n valueType === 'advanced' ? 'elb-mapping-map-entry-advanced' : ''\n }`}\n >\n {/* Key input */}\n <input\n type=\"text\"\n className={keyClassName}\n value={entry.key}\n onChange={handleKeyChange}\n placeholder=\"Key name\"\n title={\n hasEmptyKey\n ? 'Key cannot be empty'\n : hasDuplicateKey\n ? 'Duplicate key'\n : undefined\n }\n />\n\n {/* Type selector */}\n <select\n className=\"elb-mapping-map-type-select\"\n value={valueType}\n onChange={handleTypeChange}\n >\n <option value=\"simple\">Simple</option>\n <option value=\"advanced\">Advanced</option>\n </select>\n\n {/* Value editor - conditional */}\n {valueType === 'simple' ? (\n <input\n type=\"text\"\n className=\"elb-mapping-map-value-simple\"\n value={entry.value as string}\n onChange={(e) => handleSimpleValueChange(e.target.value)}\n placeholder=\"Key path (e.g., data.id)\"\n />\n ) : (\n <div className=\"elb-mapping-map-value-advanced\">\n <MappingFormWrapper\n schema={valueConfigSchema}\n uiSchema={valueConfigUiSchema}\n formData={entry.value as Record<string, unknown>}\n onChange={handleAdvancedValueChange}\n nested={true}\n />\n </div>\n )}\n\n {/* Delete button */}\n <div className=\"elb-mapping-map-delete-wrapper\">\n <IconButton\n icon=\"delete\"\n variant=\"danger\"\n onClick={onRemove}\n title=\"Remove entry\"\n />\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingSetEntry, SetEntry } from '../atoms/mapping-set-entry';\nimport { MappingCollapsible } from '../atoms/mapping-collapsible';\nimport { IconButton } from '../atoms/icon-button';\n\n/**\n * MappingSetField - Custom field for array of values\n *\n * Manages an array of values where each value can be:\n * - Simple strings (key paths like 'data.id')\n * - Advanced ValueConfig objects (with key, value, condition, etc.)\n *\n * Features:\n * - Add/remove entries\n * - Switch between simple and advanced value modes\n * - Recursive support (values can contain sets)\n *\n * @example\n * // In schema:\n * set: {\n * type: 'array',\n * title: 'Set',\n * description: 'Array of static values',\n * items: {\n * oneOf: [\n * { type: 'string' },\n * { type: 'object' }\n * ]\n * }\n * }\n *\n * // In uiSchema:\n * set: {\n * 'ui:field': 'mappingSet',\n * }\n */\nexport function MappingSetField(props: FieldProps) {\n const { formData, onChange, schema, disabled, readonly } = props;\n\n // Convert array to entries with temp IDs for React keys\n const arrayToEntries = (\n arr: Array<string | Record<string, unknown>> | undefined,\n ): SetEntry[] => {\n if (!arr || !Array.isArray(arr)) return [];\n return arr.map((value) => ({\n value,\n tempId: `set-${Date.now()}-${Math.random()}`,\n }));\n };\n\n // Convert entries back to array\n const entriesToArray = (\n entries: SetEntry[],\n ): Array<string | Record<string, unknown>> | undefined => {\n if (entries.length === 0) return undefined;\n return entries.map((entry) => entry.value);\n };\n\n const [entries, setEntries] = useState<SetEntry[]>(() =>\n arrayToEntries(formData),\n );\n\n const hasEntries = entries.length > 0;\n\n // Start expanded if we have existing data\n const [isExpanded, setIsExpanded] = useState(hasEntries);\n\n // Track previous formData to avoid redundant updates\n const prevFormDataRef = useRef<unknown>(formData);\n\n // Sync external changes to internal state, preserving tempIds\n useEffect(() => {\n // Only sync if formData actually changed from external source\n if (prevFormDataRef.current === formData) {\n return;\n }\n prevFormDataRef.current = formData;\n\n if (!formData || !Array.isArray(formData)) {\n if (entries.length > 0) {\n setEntries([]);\n }\n return;\n }\n\n // Preserve existing tempIds when values match\n const newEntries = formData.map((value, index) => {\n const existingEntry = entries[index];\n if (\n existingEntry &&\n JSON.stringify(existingEntry.value) === JSON.stringify(value)\n ) {\n return existingEntry; // Preserve tempId\n }\n return {\n value,\n tempId: `set-${Date.now()}-${Math.random()}-${index}`,\n };\n });\n\n setEntries(newEntries);\n }, [formData]);\n\n // Update expanded state when data changes (e.g., switching between mapping rules)\n useEffect(() => {\n setIsExpanded(hasEntries);\n }, [hasEntries]);\n\n const handleEntriesChange = (newEntries: SetEntry[]) => {\n setEntries(newEntries);\n const arr = entriesToArray(newEntries);\n\n // Update ref before calling onChange to prevent sync loop\n prevFormDataRef.current = arr;\n onChange(arr);\n };\n\n const handleEntryChange = (index: number, newEntry: SetEntry) => {\n const newEntries = [...entries];\n newEntries[index] = newEntry;\n handleEntriesChange(newEntries);\n };\n\n const handleEntryRemove = (index: number) => {\n const newEntries = entries.filter((_, i) => i !== index);\n handleEntriesChange(newEntries);\n };\n\n const handleAddEntry = () => {\n const newEntry: SetEntry = {\n value: '',\n tempId: `set-${Date.now()}-${Math.random()}`,\n };\n handleEntriesChange([...entries, newEntry]);\n if (!isExpanded) {\n setIsExpanded(true);\n }\n };\n\n // Drag and drop state\n const [draggedIndex, setDraggedIndex] = useState<number | null>(null);\n const [dragOverIndex, setDragOverIndex] = useState<number | null>(null);\n\n const handleDragStart = (e: React.DragEvent, index: number) => {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', index.toString());\n setDraggedIndex(index);\n };\n\n const handleDragOver = (e: React.DragEvent, index: number) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n if (draggedIndex !== index) {\n setDragOverIndex(index);\n }\n };\n\n const handleDragLeave = () => {\n setDragOverIndex(null);\n };\n\n const handleDrop = (e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n const dragIndex = parseInt(e.dataTransfer.getData('text/plain'));\n\n if (dragIndex === dropIndex) {\n setDraggedIndex(null);\n setDragOverIndex(null);\n return;\n }\n\n // Reorder array\n const newEntries = [...entries];\n const [removed] = newEntries.splice(dragIndex, 1);\n newEntries.splice(dropIndex, 0, removed);\n\n handleEntriesChange(newEntries);\n setDraggedIndex(null);\n setDragOverIndex(null);\n };\n\n const handleDragEnd = () => {\n setDraggedIndex(null);\n setDragOverIndex(null);\n };\n\n const title = schema?.title || 'Set';\n const description = schema?.description || 'Array of static values';\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n >\n {hasEntries ? (\n <div className=\"elb-mapping-set-content\">\n <div className=\"elb-mapping-set-entries\">\n {entries.map((entry, index) => (\n <div\n key={entry.tempId}\n draggable={!disabled && !readonly}\n onDragStart={(e) => handleDragStart(e, index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDragLeave={handleDragLeave}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n >\n <MappingSetEntry\n entry={entry}\n onChange={(newEntry) => handleEntryChange(index, newEntry)}\n onRemove={() => handleEntryRemove(index)}\n index={index}\n isDragging={draggedIndex === index}\n isDragOver={dragOverIndex === index}\n />\n </div>\n ))}\n </div>\n {!disabled && !readonly && (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddEntry}\n className=\"elb-mapping-set-add-row-button\"\n >\n Add value\n </IconButton>\n )}\n </div>\n ) : (\n !disabled &&\n !readonly && (\n <IconButton\n icon=\"add\"\n variant=\"default\"\n onClick={handleAddEntry}\n className=\"elb-mapping-set-add-button\"\n >\n Add value\n </IconButton>\n )\n )}\n </MappingCollapsible>\n </div>\n );\n}\n","import React from 'react';\nimport { IconButton } from './icon-button';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport {\n valueConfigSchema,\n valueConfigUiSchema,\n} from '../../schemas/value-config-schema';\nimport { cleanFormData } from '../../utils/clean-form-data';\n\nexport interface SetEntry {\n value: string | Record<string, unknown>;\n tempId: string;\n}\n\nexport interface MappingSetEntryProps {\n entry: SetEntry;\n onChange: (entry: SetEntry) => void;\n onRemove: () => void;\n index: number;\n isDragging?: boolean;\n isDragOver?: boolean;\n}\n\n/**\n * MappingSetEntry - Single value entry in a set array\n *\n * Features:\n * - Type selector (Simple/Advanced)\n * - Simple mode: String input for key paths\n * - Advanced mode: Full ValueConfig form\n * - Delete button\n *\n * @example\n * <MappingSetEntry\n * entry={{ value: 'data.id', tempId: '123' }}\n * onChange={handleChange}\n * onRemove={handleRemove}\n * index={0}\n * />\n */\nexport function MappingSetEntry({\n entry,\n onChange,\n onRemove,\n index,\n isDragging = false,\n isDragOver = false,\n}: MappingSetEntryProps) {\n const valueType = typeof entry.value === 'string' ? 'simple' : 'advanced';\n\n const handleTypeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newType = e.target.value as 'simple' | 'advanced';\n\n if (newType === valueType) return;\n\n if (newType === 'advanced') {\n // Convert simple string to ValueConfig\n const stringValue = entry.value as string;\n onChange({\n ...entry,\n value: stringValue ? { key: stringValue } : {},\n });\n } else {\n // Convert ValueConfig to simple string\n const config = entry.value as Record<string, unknown>;\n let extractedValue = '';\n\n // Priority: key > value > empty string\n if (config.key && typeof config.key === 'string') {\n extractedValue = config.key;\n } else if (\n config.value !== undefined &&\n typeof config.value === 'string'\n ) {\n extractedValue = config.value;\n }\n\n onChange({\n ...entry,\n value: extractedValue,\n });\n }\n };\n\n const handleSimpleValueChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ ...entry, value: e.target.value });\n };\n\n const handleAdvancedValueChange = (data: unknown) => {\n // Clean the nested ValueConfig data to remove empty values\n const cleaned = cleanFormData(data as Record<string, unknown>);\n const finalValue = Object.keys(cleaned).length > 0 ? cleaned : {};\n onChange({ ...entry, value: finalValue });\n };\n\n return (\n <div\n className={`elb-mapping-set-entry ${\n valueType === 'advanced' ? 'elb-mapping-set-entry-advanced' : ''\n } ${isDragging ? 'elb-mapping-set-entry-dragging' : ''} ${\n isDragOver ? 'elb-mapping-set-entry-drag-over' : ''\n }`}\n >\n {/* Drag handle */}\n <div className=\"elb-mapping-set-drag-handle\" title=\"Drag to reorder\">\n <svg\n width=\"12\"\n height=\"16\"\n viewBox=\"0 0 12 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"3\" cy=\"4\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"4\" r=\"1.5\" />\n <circle cx=\"3\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"3\" cy=\"12\" r=\"1.5\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" />\n </svg>\n </div>\n\n {/* Type selector */}\n <select\n className=\"elb-mapping-set-type-select\"\n value={valueType}\n onChange={handleTypeChange}\n aria-label={`Value ${index + 1} type`}\n >\n <option value=\"simple\">Simple</option>\n <option value=\"advanced\">Advanced</option>\n </select>\n\n {/* Value editor - conditional */}\n {valueType === 'simple' ? (\n <input\n type=\"text\"\n className=\"elb-mapping-set-value-simple\"\n value={entry.value as string}\n onChange={handleSimpleValueChange}\n placeholder=\"Key path or value (e.g., data.id)\"\n aria-label={`Value ${index + 1}`}\n />\n ) : (\n <div className=\"elb-mapping-set-value-advanced\">\n <MappingFormWrapper\n schema={valueConfigSchema}\n uiSchema={valueConfigUiSchema}\n formData={entry.value as Record<string, unknown>}\n onChange={handleAdvancedValueChange}\n nested={true}\n />\n </div>\n )}\n\n {/* Delete button */}\n <div className=\"elb-mapping-set-delete-wrapper\">\n <IconButton\n icon=\"delete\"\n variant=\"danger\"\n onClick={onRemove}\n title={`Remove value ${index + 1}`}\n />\n </div>\n </div>\n );\n}\n","import React, { useState, useEffect, useRef } from 'react';\nimport type { FieldProps } from '@rjsf/utils';\nimport { MappingCollapsible } from '../atoms/mapping-collapsible';\nimport { IconButton } from '../atoms/icon-button';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport {\n valueConfigNestedSchema,\n valueConfigNestedUiSchema,\n} from '../../schemas/value-config-schema';\n\n/**\n * MappingLoopField - Custom field for array processing with loop transformation\n *\n * Manages a loop tuple: [source, transform]\n * - source: String path to array ('nested', 'data.items') or 'this' for current value\n * - transform: ValueConfig to apply to each item in the array\n *\n * Features:\n * - Collapsible toggle interface\n * - Source path input with placeholder hints\n * - Recursive ValueConfig form for item transformation\n * - Empty state with add button\n *\n * @example\n * // In schema:\n * loop: {\n * type: 'array',\n * title: 'Loop',\n * description: 'Process arrays by applying transformation to each item',\n * items: [\n * { type: 'string' }, // source\n * { type: 'object' } // transform\n * ],\n * minItems: 2,\n * maxItems: 2\n * }\n *\n * // In uiSchema:\n * loop: {\n * 'ui:field': 'mappingLoop',\n * }\n *\n * @example\n * // Usage:\n * {\n * loop: [\n * 'nested', // Process items in event.nested array\n * { map: { item_id: 'data.id', item_name: 'data.name' } }\n * ]\n * }\n */\nexport function MappingLoopField(props: FieldProps) {\n const { formData, onChange, schema, disabled, readonly } = props;\n\n // Parse loop tuple [source, transform] - pure function, no state\n const parseFormData = (\n data: unknown,\n ): [string, Record<string, unknown> | undefined] => {\n if (Array.isArray(data) && data.length === 2) {\n const source = (data[0] as string) || '';\n const transform = (data[1] as Record<string, unknown>) || undefined;\n return [source, transform];\n }\n return ['', undefined];\n };\n\n // Validate loop data and return undefined if invalid/empty\n const validateLoop = (\n sourceValue: string,\n transformValue: Record<string, unknown> | undefined,\n ): [string, Record<string, unknown>] | undefined => {\n // Source must be a non-empty string\n const hasValidSource =\n typeof sourceValue === 'string' && sourceValue.trim().length > 0;\n\n // Transform must be a non-empty object with at least one property\n const hasValidTransform =\n transformValue &&\n typeof transformValue === 'object' &&\n Object.keys(transformValue).length > 0;\n\n // Only return loop if both source and transform are valid\n if (hasValidSource && hasValidTransform) {\n return [sourceValue, transformValue];\n }\n\n return undefined;\n };\n\n // Internal state to manage loop data\n const [source, setSource] = useState<string>(\n () => parseFormData(formData)[0],\n );\n const [transform, setTransform] = useState<\n Record<string, unknown> | undefined\n >(() => parseFormData(formData)[1]);\n\n // UI state - start collapsed\n const [isExpanded, setIsExpanded] = useState(false);\n\n // Track previous formData to avoid redundant updates\n const prevFormDataRef = useRef<unknown>(formData);\n\n // Sync external changes to internal state\n useEffect(() => {\n // Only sync if formData actually changed from external source\n if (prevFormDataRef.current === formData) {\n return;\n }\n prevFormDataRef.current = formData;\n\n if (!formData) {\n if (source !== '' || transform !== undefined) {\n setSource('');\n setTransform(undefined);\n }\n return;\n }\n\n const [newSource, newTransform] = parseFormData(formData);\n\n // Only update if data actually changed (prevent infinite loops)\n if (\n newSource !== source ||\n JSON.stringify(newTransform) !== JSON.stringify(transform)\n ) {\n setSource(newSource);\n setTransform(newTransform);\n }\n }, [formData]);\n\n const handleSourceChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newSource = e.target.value;\n setSource(newSource);\n\n // If source becomes empty, clear transform and send undefined\n if (!newSource || newSource.trim().length === 0) {\n setTransform(undefined);\n prevFormDataRef.current = undefined;\n onChange(undefined);\n return;\n }\n\n // Validate and send current state\n const validLoop = validateLoop(newSource, transform);\n\n // Update ref before calling onChange to prevent sync loop\n prevFormDataRef.current = validLoop;\n onChange(validLoop);\n };\n\n const handleTransformChange = (newTransform: unknown) => {\n const newTransformObj = newTransform as Record<string, unknown> | undefined;\n setTransform(newTransformObj);\n\n // Validate and update formData\n const validLoop = validateLoop(source, newTransformObj);\n\n // Update ref before calling onChange to prevent sync loop\n prevFormDataRef.current = validLoop;\n onChange(validLoop);\n };\n\n const title = schema?.title || 'Loop';\n const description =\n schema?.description ||\n 'Process arrays by applying transformation to each item';\n\n // Check if source has a value\n const hasSource = source && source.trim().length > 0;\n\n return (\n <div className=\"elb-rjsf-widget\">\n <MappingCollapsible\n mode=\"toggle\"\n title={title}\n description={description}\n isExpanded={isExpanded}\n onToggle={setIsExpanded}\n >\n <div className=\"elb-mapping-loop-content\">\n {/* Source input - always visible */}\n <div className=\"elb-mapping-loop-source\">\n <label className=\"elb-mapping-loop-label\">Source array path</label>\n <input\n type=\"text\"\n className=\"elb-mapping-loop-source-input\"\n value={source}\n onChange={handleSourceChange}\n placeholder=\"e.g., nested, data.items, or 'this'\"\n disabled={disabled || readonly}\n />\n <div className=\"elb-mapping-loop-hint\">\n Path to array in event, or 'this' for current value\n </div>\n </div>\n\n {/* Transform section - only visible when source is valid */}\n {hasSource && (\n <div className=\"elb-mapping-loop-transform\">\n <div className=\"elb-mapping-loop-transform-header\">\n <label className=\"elb-mapping-loop-label\">\n Transform each item\n </label>\n <div className=\"elb-mapping-loop-hint\">\n Mapping applied to each array item\n </div>\n </div>\n <div className=\"elb-mapping-loop-transform-form\">\n <MappingFormWrapper\n schema={valueConfigNestedSchema}\n uiSchema={valueConfigNestedUiSchema}\n formData={transform}\n onChange={handleTransformChange}\n nested={true}\n />\n </div>\n </div>\n )}\n </div>\n </MappingCollapsible>\n </div>\n );\n}\n","import type { RegistryFieldsType } from '@rjsf/utils';\nimport { MappingConsentField } from '../atoms/mapping-consent-field';\nimport { MappingConditionField } from '../atoms/mapping-condition-field';\nimport { MappingFnField } from '../atoms/mapping-fn-field';\nimport { MappingKeyField } from '../atoms/mapping-key-field';\nimport { MappingValidateField } from '../atoms/mapping-validate-field';\nimport { MappingDataField } from '../atoms/mapping-data-field';\nimport { MappingSettingsField } from '../atoms/mapping-settings-field';\nimport { MappingObjectExplorerField } from '../atoms/mapping-object-explorer-field';\nimport { MappingMapField } from '../molecules/mapping-map-field';\nimport { MappingSetField } from '../molecules/mapping-set-field';\nimport { MappingLoopField } from '../molecules/mapping-loop-field';\n\n/**\n * Field Registry for RJSF Mapping Forms\n *\n * Central registry of all custom fields used in react-jsonschema-form.\n * Fields are used for complex types (like objects) while widgets are for primitives.\n * Fields are referenced in uiSchema via 'ui:field' property.\n *\n * @example\n * // In uiSchema:\n * const uiSchema = {\n * consent: {\n * 'ui:field': 'mappingConsent'\n * }\n * }\n *\n * @example\n * // In Form component:\n * <Form\n * schema={schema}\n * fields={mappingFields}\n * ...\n * />\n */\n\n/**\n * Mapping Fields Registry\n *\n * Available fields:\n * - mappingConsent: Collapsible consent requirements editor for object types\n * - mappingCondition: Checkbox-collapsible condition function editor for string types\n * - mappingFn: Checkbox-collapsible custom transformation function editor for string types\n * - mappingKey: Simple text input for event path extraction (e.g., 'data.id', 'user.email')\n * - mappingValidate: Checkbox-collapsible validate function editor for string types\n * - mappingData: Toggle-collapsible data transformation editor for object types\n * - mappingSettings: Destination-specific settings editor (schema-aware or JSON fallback)\n * - objectExplorer: Generic object key-value explorer with add/rename/delete/navigate\n * - mappingMap: Key-value pair editor for object transformation mapping\n * - mappingSet: Array of values editor for static value arrays\n * - mappingLoop: Array processing with transformation editor for loop tuples\n */\nexport const mappingFields: RegistryFieldsType = {\n mappingConsent: MappingConsentField,\n mappingCondition: MappingConditionField,\n mappingFn: MappingFnField,\n mappingKey: MappingKeyField,\n mappingValidate: MappingValidateField,\n mappingData: MappingDataField,\n mappingSettings: MappingSettingsField,\n objectExplorer: MappingObjectExplorerField,\n mappingMap: MappingMapField,\n mappingSet: MappingSetField,\n mappingLoop: MappingLoopField,\n};\n","import React from 'react';\n\nexport interface MappingGridProps {\n children: React.ReactNode;\n layout?: 'row' | 'cols-2' | string;\n gap?: number | string;\n responsive?: boolean;\n className?: string;\n}\n\n/**\n * MappingGrid - Enhanced grid layout component for form fields\n *\n * Provides flexible grid layouts for mapping form components with responsive\n * support. Designed for form field arrangements like [Label, Input] pairs,\n * [AutoSelect, Button] combinations, and multi-column layouts.\n *\n * @example\n * // Two column layout\n * <MappingGrid layout=\"cols-2\">\n * <label>Name</label>\n * <input />\n * </MappingGrid>\n *\n * @example\n * // Single row with auto-fit columns\n * <MappingGrid layout=\"row\">\n * <AutoSelect />\n * <IconButton />\n * </MappingGrid>\n *\n * @example\n * // Custom grid template\n * <MappingGrid layout=\"1fr 2fr\">\n * <label>Field</label>\n * <input />\n * </MappingGrid>\n *\n * @example\n * // Responsive: 1 col on mobile, 2 cols on tablet+\n * <MappingGrid layout=\"cols-2\" responsive>\n * <field1 />\n * <field2 />\n * </MappingGrid>\n */\nexport function MappingGrid({\n children,\n layout = 'row',\n gap = 12,\n responsive = true,\n className = '',\n}: MappingGridProps) {\n // Convert layout shortcuts to CSS classes\n const getLayoutClass = () => {\n switch (layout) {\n case 'row':\n return 'elb-mapping-grid-row';\n case 'cols-2':\n return 'elb-mapping-grid-cols-2';\n default:\n // For custom grid-template-columns, use inline style as fallback\n return '';\n }\n };\n\n // Convert gap to CSS class\n const getGapClass = () => {\n const gapNum = typeof gap === 'number' ? gap : parseInt(gap, 10);\n if ([8, 12, 16, 20].includes(gapNum)) {\n return `elb-mapping-grid-gap-${gapNum}`;\n }\n return ''; // Fallback to inline style for custom gaps\n };\n\n const layoutClass = getLayoutClass();\n const gapClass = getGapClass();\n const responsiveClass = responsive ? 'elb-mapping-grid-responsive' : '';\n\n // Build class list\n const classes = [\n 'elb-mapping-grid',\n layoutClass,\n gapClass,\n responsiveClass,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Only use inline styles for custom layouts/gaps not covered by CSS classes\n const needsCustomLayout = !layoutClass && layout !== 'row';\n const needsCustomGap = !gapClass;\n\n const inlineStyle: React.CSSProperties = {};\n if (needsCustomLayout) {\n inlineStyle.gridTemplateColumns = layout;\n }\n if (needsCustomGap) {\n inlineStyle.gap = typeof gap === 'number' ? `${gap}px` : gap;\n }\n\n return (\n <div\n className={classes}\n style={Object.keys(inlineStyle).length > 0 ? inlineStyle : undefined}\n >\n {children}\n </div>\n );\n}\n","import type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingFormWrapper } from '../forms/mapping-form-wrapper';\nimport type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport type { DestinationSchemas } from '../../types/schemas';\n\n/**\n * Navigate through a JSON Schema following a path\n * Used for finding nested schema properties\n */\nfunction navigateSchemaByPath(\n path: string[],\n schema: RJSFSchema,\n): RJSFSchema | undefined {\n let current = schema;\n\n // Find the settings index to start navigation from there\n const settingsIndex = path.indexOf('settings');\n if (settingsIndex === -1) return undefined;\n\n // Navigate from after 'settings' to before 'map'\n // For ['entity', 'action', 'settings', 'track', 'map'], navigate through 'track'\n const startIndex = settingsIndex + 1;\n const endIndex = path[path.length - 1] === 'map' ? path.length - 1 : path.length;\n\n for (let i = startIndex; i < endIndex; i++) {\n const segment = path[i];\n if (!current.properties || !(segment in current.properties)) {\n return undefined;\n }\n current = current.properties[segment] as RJSFSchema;\n }\n\n return current;\n}\n\n/**\n * Map Pane View (RJSF) - Schema-driven version of map pane\n *\n * Drop-in replacement for MappingMapPaneView using RJSF objectExplorer widget.\n * Provides identical functionality but is schema-driven instead of hardcoded.\n *\n * Features (identical to original):\n * - Add new key-value pairs\n * - View configured properties as badges\n * - Navigate to individual key editors (ValueType pane)\n * - Delete keys\n * - Rename keys inline\n *\n * Schema-driven features:\n * - When schemas.data provided: Shows property suggestions from destination data schema\n * - When schemas.mapping provided: Shows property suggestions for settings paths\n * - Displays property descriptions and types as hints\n * - Automatically opens correct editors (enum, boolean, map, etc.) based on schema\n *\n * Path-based schema selection:\n * - data.map paths → uses schemas.data\n * - settings.map paths → uses schemas.mapping (navigates to nested properties)\n *\n * @example\n * // Data mapping with schema\n * <MappingMapPaneViewRJSF\n * path={['product', 'view', 'data', 'map']}\n * mappingState={mappingState}\n * navigation={navigation}\n * schemas={{ data: dataSchema }}\n * />\n *\n * @example\n * // Settings mapping with schema\n * <MappingMapPaneViewRJSF\n * path={['product', 'view', 'settings', 'map']}\n * mappingState={mappingState}\n * navigation={navigation}\n * schemas={{ mapping: mappingSchema }}\n * />\n */\nexport interface MappingMapPaneViewRJSFProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schemas?: DestinationSchemas;\n className?: string;\n}\n\nexport function MappingMapPaneViewRJSF({\n path,\n mappingState,\n navigation,\n schemas,\n className = '',\n}: MappingMapPaneViewRJSFProps) {\n // Determine the actual map path\n // If path points to a ValueConfig container (value has 'map' property),\n // we need to append 'map' to get to the actual map contents\n const value = mappingState.actions.getValue(path);\n const isValueConfigContainer =\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n 'map' in value;\n\n // Actual path to the map object\n const mapPath = isValueConfigContainer ? [...path, 'map'] : path;\n\n // Get current map value\n const mapValue = mappingState.actions.getValue(mapPath);\n const map =\n mapValue && typeof mapValue === 'object' && !Array.isArray(mapValue)\n ? (mapValue as Record<string, unknown>)\n : {};\n\n const mapKeys = Object.keys(map);\n\n // Determine the last element of the path for detection logic\n const lastElement = path[path.length - 1];\n\n // Check if this is a data path to use dataSchema\n // Only for: ['entity', 'action', 'data'] or ['entity', 'action', 'data', 'map']\n const dataIndex = path.indexOf('data');\n const isDataPath =\n dataIndex !== -1 &&\n ((lastElement === 'data' && dataIndex === path.length - 1) ||\n (lastElement === 'map' && dataIndex === path.length - 2));\n\n // Check if this is a settings path to use mappingSchema\n // Handles: ['entity', 'action', 'settings'], ['entity', 'action', 'settings', 'map']\n // and nested: ['entity', 'action', 'settings', 'track'] or ['entity', 'action', 'settings', 'track', 'map']\n const settingsIndex = path.indexOf('settings');\n const isSettingsPath =\n settingsIndex !== -1 &&\n (lastElement === 'settings' ||\n (lastElement === 'map' && settingsIndex < path.length - 1));\n\n // Determine which schema to use for property suggestions\n let propertySuggestionsSchema: RJSFSchema | undefined;\n\n if (isDataPath) {\n // For data paths, use the dataSchema directly\n propertySuggestionsSchema = schemas?.data;\n } else if (isSettingsPath && schemas?.mapping) {\n // For settings paths, navigate to the appropriate schema\n\n // Case 1: ['entity', 'action', 'settings'] - direct settings object\n // Use the full mappingSchema to show track, trackCustom, etc.\n if (lastElement === 'settings' && settingsIndex === path.length - 1) {\n propertySuggestionsSchema = schemas.mapping;\n }\n // Case 2: ['entity', 'action', 'settings', 'map'] - explicit map under settings\n // Use the full mappingSchema\n else if (lastElement === 'map' && settingsIndex === path.length - 2) {\n propertySuggestionsSchema = schemas.mapping;\n }\n // Case 3: ['entity', 'action', 'settings', 'track', 'map'] - nested property under settings\n // Navigate to the nested schema\n else if (lastElement === 'map' && settingsIndex < path.length - 2) {\n const navigatedSchema = navigateSchemaByPath(path, schemas.mapping);\n propertySuggestionsSchema = navigatedSchema || undefined;\n }\n }\n\n // Schema for map - allows arbitrary keys\n const schema: RJSFSchema = {\n type: 'object',\n title: 'Map',\n additionalProperties: true, // Dynamic keys allowed\n };\n\n // UI Schema configures the objectExplorer field\n const uiSchema: UiSchema = {\n 'ui:field': 'objectExplorer', // Use field for objects, not widget\n 'ui:options': {\n allowAdd: true,\n allowRename: true,\n allowDelete: true,\n showBadges: true,\n childNodeType: 'valueType',\n emptyMessage: 'No keys yet. Add keys to transform event data.',\n placeholder: 'Type key name to create or select (e.g., currency)...',\n propertySuggestionsSchema, // Pass data schema for property suggestions\n },\n };\n\n // Form context - provides navigation and state to widget\n // Use mapPath so child navigation works correctly\n const formContext = {\n navigation,\n mappingState,\n path: mapPath,\n };\n\n // Handle changes from widget\n const handleChange = (newValue: unknown) => {\n if (newValue && typeof newValue === 'object' && !Array.isArray(newValue)) {\n mappingState.actions.setValue(mapPath, newValue);\n } else if (\n newValue === null ||\n newValue === undefined ||\n (typeof newValue === 'object' && Object.keys(newValue).length === 0)\n ) {\n // Handle empty object or deletion\n mappingState.actions.deleteValue(mapPath);\n }\n };\n\n return (\n <BaseMappingPane\n title=\"Map\"\n description={\n mapKeys.length === 0\n ? 'No keys yet. Add keys to transform event data.'\n : `${mapKeys.length} ${mapKeys.length === 1 ? 'key' : 'keys'}`\n }\n navigation={navigation}\n className={className}\n >\n <MappingFormWrapper\n schema={schema}\n uiSchema={uiSchema}\n formData={map}\n onChange={handleChange}\n formContext={formContext}\n />\n </BaseMappingPane>\n );\n}\n","import React, { useState, useRef, useEffect } from 'react';\n\nexport interface MappingEnumSelectProps {\n value: string | number;\n onChange: (value: string | number) => void;\n options: Array<string | number>;\n placeholder?: string;\n type?: 'string' | 'number';\n autoFocus?: boolean;\n}\n\n/**\n * MappingEnumSelect - Autocomplete dropdown for enum fields\n *\n * Unified autocomplete/dropdown hybrid:\n * - Click or focus to show all options\n * - Type to filter options (autocomplete)\n * - Accept custom values (not in enum)\n * - Keyboard navigation (ArrowUp, ArrowDown, Enter, Escape)\n * - Click-outside to close\n * - Monospace font consistent with other mapping inputs\n *\n * @example\n * <MappingEnumSelect\n * value=\"PageView\"\n * onChange={setValue}\n * options={['PageView', 'Purchase', 'AddToCart']}\n * />\n */\nexport function MappingEnumSelect({\n value,\n onChange,\n options,\n placeholder = 'Type or select...',\n type = 'string',\n autoFocus = false,\n}: MappingEnumSelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(0);\n const [inputValue, setInputValue] = useState(String(value || ''));\n const [hasTyped, setHasTyped] = useState(false);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Update input value when prop changes externally\n useEffect(() => {\n setInputValue(String(value || ''));\n setHasTyped(false);\n }, [value]);\n\n // Reset highlighted index when dropdown opens or filter changes\n useEffect(() => {\n if (isOpen) {\n setHighlightedIndex(0);\n }\n }, [isOpen]);\n\n // Click outside to close\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n // Commit the typed value on blur\n if (hasTyped && inputValue.trim() !== '') {\n onChange(type === 'number' ? Number(inputValue) : inputValue);\n }\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () =>\n document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen, hasTyped, inputValue, onChange, type]);\n\n // Scroll highlighted option into view\n useEffect(() => {\n if (\n isOpen &&\n dropdownRef.current &&\n dropdownRef.current.children[highlightedIndex]\n ) {\n const highlighted = dropdownRef.current.children[\n highlightedIndex\n ] as HTMLElement;\n if (highlighted) {\n highlighted.scrollIntoView({ block: 'nearest' });\n }\n }\n }, [highlightedIndex, isOpen]);\n\n // Filter options based on input\n const filteredOptions =\n hasTyped && inputValue.trim() !== ''\n ? options.filter((option) =>\n String(option)\n .toLowerCase()\n .includes(inputValue.toLowerCase().trim()),\n )\n : options;\n\n const handleInputFocus = () => {\n setIsOpen(true);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n setHasTyped(true);\n setIsOpen(true);\n setHighlightedIndex(0);\n };\n\n const handleOptionClick = (option: string | number) => {\n setInputValue(String(option));\n onChange(option);\n setIsOpen(false);\n setHasTyped(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n } else if (filteredOptions.length > 0) {\n setHighlightedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev,\n );\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (isOpen && filteredOptions.length > 0) {\n setHighlightedIndex((prev) => (prev > 0 ? prev - 1 : prev));\n }\n break;\n\n case 'Enter':\n e.preventDefault();\n if (\n isOpen &&\n filteredOptions.length > 0 &&\n filteredOptions[highlightedIndex] !== undefined\n ) {\n handleOptionClick(filteredOptions[highlightedIndex]);\n } else {\n // Accept custom value\n const trimmedValue = inputValue.trim();\n if (trimmedValue !== '') {\n onChange(type === 'number' ? Number(trimmedValue) : trimmedValue);\n setIsOpen(false);\n setHasTyped(false);\n }\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n setIsOpen(false);\n // Revert to original value\n setInputValue(String(value || ''));\n setHasTyped(false);\n break;\n\n case 'Tab':\n // Accept current typed value or highlighted option\n if (hasTyped && inputValue.trim() !== '') {\n onChange(type === 'number' ? Number(inputValue) : inputValue);\n }\n setIsOpen(false);\n break;\n }\n };\n\n return (\n <div className=\"elb-mapping-enum-select\" ref={containerRef}>\n <input\n ref={inputRef}\n type=\"text\"\n className={`elb-mapping-enum-select-input ${isOpen ? 'is-open' : ''}`}\n value={inputValue}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoFocus={autoFocus}\n />\n\n {isOpen && (\n <div\n className={`elb-mapping-enum-select-dropdown ${\n filteredOptions.length > 5 ? 'scrollable' : ''\n }`}\n ref={dropdownRef}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <div\n key={String(option)}\n className={`elb-mapping-enum-select-option ${\n index === highlightedIndex ? 'is-highlighted' : ''\n } ${String(option) === String(value) ? 'is-selected' : ''}`}\n onClick={() => handleOptionClick(option)}\n onMouseEnter={() => setHighlightedIndex(index)}\n >\n {String(option)}\n </div>\n ))\n ) : (\n <div className=\"elb-mapping-enum-select-empty\">\n No matching options. Press Enter to use custom value.\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { RJSFSchema } from '@rjsf/utils';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport type { DestinationSchemas } from '../../types/schemas';\nimport type { ConfigStructureDef } from '../../schemas/config-structures/types';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingEnumSelect } from '../atoms/mapping-enum-select';\nimport { getSchemaForPath } from '../../utils/type-detector';\n\n/**\n * Enum Pane View - Pure Presentation Component\n *\n * Edits enum fields with predefined options from JSON Schema.\n * Uses schema.enum to populate dropdown options and schema.type to determine\n * if freeform text input should be allowed.\n *\n * Features:\n * - Dropdown selection from schema-defined enum values\n * - Optional freeform text input for 'string' type enums\n * - Keyboard navigation\n * - Schema-driven: extracts enum values from destination schemas\n *\n * @example\n * // Path: ['order', 'complete', 'settings', 'track']\n * // Schema: { type: 'string', enum: ['PageView', 'Purchase', 'AddToCart'] }\n * <MappingEnumPaneView\n * path={['order', 'complete', 'settings', 'track']}\n * mappingState={mappingState}\n * navigation={navigation}\n * schemas={{\n * mapping: metaPixelMappingSchema,\n * mappingUi: metaPixelMappingUiSchema\n * }}\n * />\n */\nexport interface MappingEnumPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schemas?: DestinationSchemas;\n structure?: ConfigStructureDef;\n className?: string;\n}\n\nexport function MappingEnumPaneView({\n path,\n mappingState,\n navigation,\n schemas,\n structure,\n className = '',\n}: MappingEnumPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const currentValue =\n typeof value === 'string' || typeof value === 'number' ? value : '';\n\n // Get schema for this path using structure-aware detection\n const schema = structure && schemas\n ? getSchemaForPath(value, path, structure, schemas as Record<string, RJSFSchema>)\n : null;\n\n const enumOptions = (schema?.enum as Array<string | number>) || [];\n const enumType = schema?.type === 'number' ? 'number' : 'string';\n\n const handleChange = (newValue: string | number) => {\n if (\n newValue === '' ||\n (typeof newValue === 'string' && newValue.trim() === '')\n ) {\n // Delete if empty\n mappingState.actions.deleteValue(path);\n } else {\n mappingState.actions.setValue(path, newValue);\n }\n };\n\n // Get field name from path (last segment)\n const fieldName = path[path.length - 1];\n\n return (\n <BaseMappingPane\n title={`Enum: ${fieldName}`}\n description=\"Select from dropdown or type custom value\"\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingEnumSelect\n value={currentValue}\n onChange={handleChange}\n options={enumOptions}\n placeholder={\n enumOptions.length > 0\n ? `Type or select ${fieldName}...`\n : 'Type custom value...'\n }\n type={enumType}\n autoFocus\n />\n <div className=\"elb-mapping-pane-hint\">\n {enumOptions.length > 0\n ? `${enumOptions.length} predefined ${enumOptions.length === 1 ? 'option' : 'options'} available. Type to filter or enter custom value.`\n : 'No predefined options. Enter custom value.'}\n </div>\n </div>\n\n {enumOptions.length > 0 && (\n <div className=\"elb-mapping-enum-examples\">\n <div className=\"elb-mapping-enum-examples-title\">\n Available Options:\n </div>\n <ul className=\"elb-mapping-enum-examples-list\">\n {enumOptions.slice(0, 10).map((option) => (\n <li key={String(option)}>\n <code>{String(option)}</code>\n </li>\n ))}\n {enumOptions.length > 10 && (\n <li className=\"elb-mapping-enum-examples-more\">\n ... and {enumOptions.length - 10} more\n </li>\n )}\n </ul>\n </div>\n )}\n </BaseMappingPane>\n );\n}\n","import React from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { Toggle } from '../atoms/toggle';\n\nexport interface MappingBooleanPaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n}\n\n/**\n * Boolean Pane - Toggle switch for boolean settings\n *\n * Provides a simple on/off toggle for boolean fields in mapping configuration.\n * Uses animated toggle component for visual feedback.\n *\n * Used for settings like:\n * - enabled/disabled flags\n * - feature toggles\n * - binary configuration options\n *\n * @example\n * // Schema definition\n * enabled: { type: 'boolean', description: 'Enable tracking' }\n *\n * // Renders as toggle with label\n * <Toggle checked={true} onChange={...} label=\"Enabled\" />\n */\nexport function MappingBooleanPaneView({\n path,\n mappingState,\n navigation,\n className = '',\n}: MappingBooleanPaneViewProps) {\n const value = mappingState.actions.getValue(path);\n const booleanValue = typeof value === 'boolean' ? value : false;\n\n const handleChange = (newValue: boolean) => {\n mappingState.actions.setValue(path, newValue);\n };\n\n const fieldName = path[path.length - 1];\n const displayName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);\n\n return (\n <BaseMappingPane\n title={`Boolean: ${displayName}`}\n description=\"Toggle to enable or disable\"\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <div className=\"elb-mapping-boolean-toggle-wrapper\">\n <Toggle\n checked={booleanValue}\n onChange={handleChange}\n label={booleanValue ? 'Enabled' : 'Disabled'}\n />\n </div>\n <div className=\"elb-mapping-pane-hint\">\n {booleanValue\n ? 'This setting is currently enabled'\n : 'This setting is currently disabled'}\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { MappingInput } from '../atoms/mapping-input';\nimport { validateValue } from '../../utils/schema-validation';\n\n/**\n * Primitive Pane View - Schema-validated text input for primitive values\n *\n * Uses type=\"text\" with schema validation to allow typing ANY value:\n * - String fields (with pattern, minLength, maxLength validation)\n * - Number fields (with min, max validation)\n * - Schema-based hints and placeholders\n * - Real-time validation with error highlighting\n * - Allows typing invalid values to show validation errors\n *\n * Examples:\n * - settings.pixelId: string with pattern validation (can type \"abc123\", shows error)\n * - settings.timeout: number with min/max (can type \"abc\", shows error)\n * - settings.apiKey: string with minLength\n *\n * Key: Always uses type=\"text\" input, never type=\"number\" to allow typing anything\n */\nexport interface MappingPrimitivePaneViewProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schema?: RJSFSchema;\n uiSchema?: UiSchema;\n className?: string;\n}\n\nexport function MappingPrimitivePaneView({\n path,\n mappingState,\n navigation,\n schema,\n uiSchema,\n className = '',\n}: MappingPrimitivePaneViewProps) {\n const value = mappingState.actions.getValue(path);\n\n // Convert to string for editing\n const stringValue =\n value === null ? 'null' : value === undefined ? '' : String(value);\n\n // Determine field type from schema\n const fieldType = schema?.type || 'string';\n const isNumber = fieldType === 'number' || fieldType === 'integer';\n\n const handleChange = (newValue: string) => {\n // Empty string handling\n if (newValue === '') {\n mappingState.actions.setValue(path, '');\n return;\n }\n\n // Number type coercion\n if (isNumber) {\n const asNumber = Number(newValue);\n if (!isNaN(asNumber)) {\n mappingState.actions.setValue(path, asNumber);\n return;\n }\n }\n\n // Default to string (validation will show error if wrong type)\n mappingState.actions.setValue(path, newValue);\n };\n\n // Get field info from schema\n const title = schema?.title || path[path.length - 1];\n const description =\n schema?.description ||\n `${isNumber ? 'Number' : 'Text'} field${schema?.pattern ? ' with validation' : ''}`;\n\n const placeholder =\n uiSchema?.['ui:placeholder'] ||\n (schema?.examples && Array.isArray(schema.examples) && typeof schema.examples[0] === 'string'\n ? schema.examples[0]\n : undefined) ||\n undefined;\n\n // Validate current value\n const validationResult = validateValue(value, schema);\n const hasError = !validationResult.valid;\n\n return (\n <BaseMappingPane\n title={title}\n description={description}\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-pane-field\">\n <MappingInput\n value={stringValue}\n onChange={handleChange}\n placeholder={placeholder}\n type=\"text\"\n autoFocus\n error={hasError}\n />\n <div className=\"elb-mapping-pane-hint\">\n Current type: <strong>{typeof value}</strong>\n {uiSchema?.['ui:help'] && (\n <>\n <br />\n {uiSchema['ui:help']}\n </>\n )}\n {hasError && validationResult.error && (\n <>\n <br />\n <span style={{ color: 'var(--color-button-danger)' }}>\n ⚠ {validationResult.error}\n </span>\n </>\n )}\n </div>\n </div>\n </BaseMappingPane>\n );\n}\n","import React from 'react';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport { RuleTile, type RuleTileStatus } from '../atoms/config-tile';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport type { NodeType } from '../../hooks/useMappingNavigation';\n\n/**\n * Settings Overview Pane - Shows config-level settings as tiles\n *\n * Similar to RuleOverview but for config.settings instead of mapping rules.\n * Shows destination-specific settings like pixelId, measurementId, etc.\n *\n * Features:\n * - Displays configured settings as tiles with values\n * - Shows available settings from schema (if provided)\n * - Click tile to navigate to detailed editor\n * - Schema-driven type detection for correct editor pane\n *\n * @example\n * <SettingsOverviewPane\n * path={['settings']}\n * mappingState={configState}\n * navigation={navigation}\n * schema={settingsSchema}\n * />\n */\nexport interface SettingsOverviewPaneProps {\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n schema?: RJSFSchema;\n className?: string;\n}\n\nfunction getSettingStatus(value: unknown): RuleTileStatus {\n if (value === undefined || value === null) {\n return { enabled: false, text: 'Not set' };\n }\n\n // Display value preview\n if (typeof value === 'string') {\n return { enabled: true, text: value };\n }\n if (typeof value === 'number') {\n return { enabled: true, text: String(value) };\n }\n if (typeof value === 'boolean') {\n return { enabled: true, text: value ? 'Enabled' : 'Disabled' };\n }\n if (Array.isArray(value)) {\n return { enabled: true, text: `${value.length} items` };\n }\n if (typeof value === 'object') {\n const keys = Object.keys(value);\n return { enabled: true, text: `${keys.length} properties` };\n }\n\n return { enabled: true, text: 'Configured' };\n}\n\nexport function SettingsOverviewPane({\n path,\n mappingState,\n navigation,\n schema,\n className = '',\n}: SettingsOverviewPaneProps) {\n const settings = mappingState.actions.getValue(path) as\n | Record<string, unknown>\n | undefined;\n\n\n // Gather all setting keys (from value + schema)\n const configuredKeys = settings ? Object.keys(settings) : [];\n const schemaKeys = schema?.properties ? Object.keys(schema.properties) : [];\n const allKeys = Array.from(\n new Set([...configuredKeys, ...schemaKeys]),\n ).sort();\n\n // Separate configured vs available\n const configuredSettings: Array<{\n key: string;\n title: string;\n description?: string;\n nodeType: NodeType;\n value: unknown;\n }> = [];\n\n const availableSettings: Array<{\n key: string;\n title: string;\n description?: string;\n nodeType: NodeType;\n }> = [];\n\n allKeys.forEach((key) => {\n const propSchema = schema?.properties?.[key] as RJSFSchema | undefined;\n const title =\n propSchema?.title || key.charAt(0).toUpperCase() + key.slice(1);\n const description = propSchema?.description;\n\n let nodeType: NodeType = 'valueConfig';\n if (propSchema) {\n if (propSchema.enum && Array.isArray(propSchema.enum) && propSchema.enum.length > 0) {\n nodeType = 'enum';\n } else if (propSchema.type === 'boolean') {\n nodeType = 'boolean';\n } else if (propSchema.type === 'object') {\n nodeType = 'map';\n } else if (propSchema.type === 'array') {\n nodeType = propSchema.minItems === 2 && propSchema.maxItems === 2 ? 'loop' : 'set';\n } else if (propSchema.type === 'string' || propSchema.type === 'number') {\n nodeType = 'primitive';\n }\n }\n\n const currentValue = mappingState.actions.getValue([...path, key]);\n const hasValue = currentValue !== undefined;\n\n if (hasValue) {\n configuredSettings.push({\n key,\n title,\n description,\n nodeType,\n value: currentValue,\n });\n } else {\n availableSettings.push({\n key,\n title,\n description,\n nodeType,\n });\n }\n });\n\n const handleSettingClick = (key: string, nodeType: NodeType) => {\n navigation.openTab([...path, key], nodeType);\n };\n\n return (\n <BaseMappingPane\n title=\"Settings\"\n description={\n configuredSettings.length === 0\n ? 'No settings configured. Click a tile to add settings.'\n : `${configuredSettings.length} ${configuredSettings.length === 1 ? 'setting' : 'settings'} configured`\n }\n navigation={navigation}\n className={className}\n >\n <div className=\"elb-mapping-rule-section-grid\">\n {/* Configured settings */}\n {configuredSettings.map((setting) => (\n <RuleTile\n key={setting.key}\n label={setting.title}\n description={setting.description || ''}\n status={getSettingStatus(setting.value)}\n onClick={() => handleSettingClick(setting.key, setting.nodeType)}\n />\n ))}\n </div>\n\n {/* Available settings (from schema) */}\n {availableSettings.length > 0 && (\n <div className=\"elb-mapping-rule-section\">\n <h3 className=\"elb-mapping-rule-section-title\">Available Settings</h3>\n <p className=\"elb-mapping-rule-section-description\">\n Click to configure additional destination settings\n </p>\n <div className=\"elb-mapping-rule-section-grid\">\n {availableSettings.map((setting) => (\n <RuleTile\n key={setting.key}\n label={setting.title}\n description={setting.description || ''}\n status={{ enabled: false, text: 'Not set' }}\n onClick={() =>\n handleSettingClick(setting.key, setting.nodeType)\n }\n />\n ))}\n </div>\n </div>\n )}\n </BaseMappingPane>\n );\n}\n","import type { RJSFSchema, UiSchema } from '@rjsf/utils';\n\n/**\n * Universal schema for standard Mapping.Rule properties\n *\n * These are the built-in properties available on every mapping rule,\n * regardless of destination. Defined in @walkeros/core/types/mapping.ts\n *\n * Properties:\n * - name: string - Override destination event name\n * - batch: number - Batch size in milliseconds or event count\n * - ignore: boolean - Skip processing this event\n * - condition: function - When to apply this rule\n * - consent: object - Required consent states\n * - policy: object - Event-level policy rules\n * - data: ValueType - Event data transformation\n * - settings: object - Destination-specific rule settings (schema comes from destination)\n */\n\n/**\n * Schema for 'name' property\n */\nexport const namePropertySchema: RJSFSchema = {\n type: 'string',\n title: 'Event Name Override',\n description: 'Override the destination event name with a custom string',\n minLength: 1,\n maxLength: 100,\n examples: ['page_view', 'PageView', 'view_item', 'product.viewed'],\n};\n\nexport const namePropertyUiSchema: UiSchema = {\n 'ui:placeholder': 'e.g., page_view, PageView, view_item',\n 'ui:help':\n 'This string will be sent to the destination instead of the default entity-action name',\n};\n\n/**\n * Schema for 'batch' property\n */\nexport const batchPropertySchema: RJSFSchema = {\n type: 'number',\n title: 'Batch Size',\n description: 'Batch size in milliseconds (time-based) or event count',\n minimum: 1,\n maximum: 60000,\n examples: [200, 1000, 5000],\n};\n\nexport const batchPropertyUiSchema: UiSchema = {\n 'ui:placeholder': 'e.g., 200, 1000, 5000',\n 'ui:help':\n 'Events will be collected and sent in batches. Use time (ms) for timed batches or count for event-based batches',\n};\n\n/**\n * Get schema for a standard rule property\n *\n * @param propertyName - Name of the rule property (e.g., 'name', 'batch')\n * @returns JSON Schema for the property, or undefined if not found\n */\nexport function getRulePropertySchema(\n propertyName: string,\n): RJSFSchema | undefined {\n switch (propertyName) {\n case 'name':\n return namePropertySchema;\n case 'batch':\n return batchPropertySchema;\n default:\n return undefined;\n }\n}\n\n/**\n * Get UI schema for a standard rule property\n *\n * @param propertyName - Name of the rule property (e.g., 'name', 'batch')\n * @returns UI Schema for the property, or undefined if not found\n */\nexport function getRulePropertyUiSchema(\n propertyName: string,\n): UiSchema | undefined {\n switch (propertyName) {\n case 'name':\n return namePropertyUiSchema;\n case 'batch':\n return batchPropertyUiSchema;\n default:\n return undefined;\n }\n}\n","import { MappingEntityPane } from './mapping-entity-pane';\nimport { ConfigOverviewPane } from './config-overview-pane';\nimport { MappingPolicyOverviewPane } from './mapping-policy-overview-pane';\nimport { MappingValueConfigPaneView } from './mapping-value-config-pane-view';\nimport { MappingValueTypePaneView } from './mapping-value-type-pane-view';\nimport { MappingValuePaneView } from './mapping-value-pane-view';\nimport { MappingKeyPaneView } from './mapping-key-pane-view';\nimport { MappingConditionPaneView } from './mapping-condition-pane-view';\nimport { MappingFnPaneView } from './mapping-fn-pane-view';\nimport { MappingValidatePaneView } from './mapping-validate-pane-view';\nimport { MappingNamePaneView } from './mapping-name-pane-view';\nimport { MappingBatchPaneView } from './mapping-batch-pane-view';\nimport { MappingConsentPaneView } from './mapping-consent-pane-view';\nimport { MappingSetPaneView } from './mapping-set-pane-view';\nimport { MappingLoopPaneView } from './mapping-loop-pane-view';\nimport { MappingMapPaneViewRJSF } from './mapping-map-pane-view-rjsf';\nimport { MappingEnumPaneView } from './mapping-enum-pane-view';\nimport { MappingBooleanPaneView } from './mapping-boolean-pane-view';\nimport { MappingPrimitivePaneView } from './mapping-primitive-pane-view';\nimport { SettingsOverviewPane } from './settings-overview-pane';\nimport type { NodeType } from '../../hooks/useMappingNavigation';\nimport type { UseMappingStateReturn } from '../../hooks/useMappingState';\nimport type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport type { DestinationSchemas } from '../../types/schemas';\nimport type { ConfigStructureDef } from '../../schemas/config-structures/types';\nimport type { RJSFSchema, UiSchema } from '@rjsf/utils';\nimport { getSchemaForPath as getSchemaForPathFromDetector } from '../../utils/type-detector';\nimport {\n getRulePropertyUiSchema,\n} from '../../schemas/rule-properties-schema';\nimport { MAPPING_RULE_STRUCTURE } from '../../schemas/config-structures/mapping-rule';\n\n/**\n * Get JSON Schema for a given path using structure-aware detection\n *\n * FULLY DYNAMIC: No hardcoded path checks. Uses structure definitions to route\n * to the correct schema based on PropertyDef.schemaPath.\n *\n * Structure MUST be provided by the caller (ConfigEditorTabs) to avoid ambiguity.\n *\n * @param path - Path array\n * @param mappingState - Mapping state for value access\n * @param schemas - Destination schemas bundle\n * @param structure - Structure definition (REQUIRED - no auto-detection)\n * @returns JSON Schema or undefined\n */\nfunction getSchemaForPath(\n path: string[],\n mappingState: UseMappingStateReturn,\n schemas?: DestinationSchemas,\n structure?: ConfigStructureDef,\n): RJSFSchema | undefined {\n if (!schemas || !structure) return undefined;\n\n const value = mappingState.actions.getValue(path);\n return getSchemaForPathFromDetector(value, path, structure, schemas as Record<string, RJSFSchema>);\n}\n\n/**\n * Get UI Schema for a given path\n *\n * NOTE: UI Schemas are simple key-based lookups, not nested like JSON Schema.\n * We just need to identify the property key and check the appropriate UI schema dict.\n */\nfunction getUiSchemaForPath(\n path: string[],\n schemas?: DestinationSchemas,\n): UiSchema | undefined {\n if (!schemas || path.length === 0) return undefined;\n\n const propertyKey = path[path.length - 1];\n\n // Try settings UI schema\n if (schemas.settingsUi?.[propertyKey]) {\n return schemas.settingsUi[propertyKey];\n }\n\n // Try mapping UI schema\n if (schemas.mappingUi?.[propertyKey]) {\n return schemas.mappingUi[propertyKey];\n }\n\n // Try rule property UI schema\n return getRulePropertyUiSchema(propertyKey);\n}\n\n/**\n * Mapping Pane Router - Pure Presentation Component\n *\n * Routes to the appropriate pane component based on node type.\n * This is a simple router that delegates to specialized pane views.\n *\n * Supported node types:\n * - 'entity' → MappingEntityPane - Shows list of actions\n * - 'rule' → ConfigOverviewPane - Shows rule properties grid (schema-driven)\n * - 'policy' → MappingPolicyOverviewPane - Shows list of policy rules with badges\n * - 'name' → MappingNamePaneView - Simple string input for event name override\n * - 'batch' → MappingBatchPaneView - Number input for batch size configuration\n * - 'consent' → MappingConsentPaneView - Consent state tiles with discovery\n * - 'valueConfig' → MappingValueConfigPaneView - Full ValueConfig editor\n * - 'valueType' → MappingValueTypePaneView - String or ValueConfig editor (replaces old property/type-grid)\n * - 'enum' → MappingEnumPaneView - Dropdown selector for schema-defined enum fields\n * - 'boolean' → MappingBooleanPaneView - Toggle switch for boolean settings\n * - 'key' → MappingKeyPaneView - Focused key property editor\n * - 'condition' → MappingConditionPaneView - Condition function editor\n * - 'value' → MappingValuePaneView - Primitive value editor (string, number, boolean)\n * - 'fn' → MappingFnPaneView - Transformation function editor\n * - 'validate' → MappingValidatePaneView - Validation function editor\n * - 'set' → MappingSetPaneView - Array of values with drag-and-drop\n * - 'loop' → MappingLoopPaneView - Loop transformation editor\n * - 'map' → MappingMapPaneView - Map object editor (key-value pairs)\n *\n * @example\n * <MappingPane\n * nodeType=\"rule\"\n * path={['product', 'view']}\n * mappingState={mappingState}\n * navigation={navigation}\n * />\n */\nexport interface MappingPaneProps {\n nodeType: NodeType;\n path: string[];\n mappingState: UseMappingStateReturn;\n navigation: UseMappingNavigationReturn;\n className?: string;\n /** Destination schemas for type-aware settings editing */\n schemas?: DestinationSchemas;\n /** Structure definition for schema-aware detection */\n structure?: ConfigStructureDef;\n}\n\nexport function MappingPane({\n nodeType,\n path,\n mappingState,\n navigation,\n className = '',\n schemas,\n structure,\n}: MappingPaneProps) {\n // Handle type selection from grid\n const handleSelectType = (type: string) => {\n // Navigate to the selected type\n navigation.openTab([...path, type], type as NodeType);\n };\n\n // Route to appropriate pane based on node type\n\n switch (nodeType) {\n case 'entity':\n // MappingEntityPane has its own .elb-mapping-entity-pane structure\n return (\n <MappingEntityPane\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'rule':\n const ruleValue = mappingState.actions.getValue(path);\n const ruleStructure = MAPPING_RULE_STRUCTURE;\n return (\n <ConfigOverviewPane\n config={ruleValue as Record<string, unknown>}\n structure={ruleStructure}\n navigation={navigation}\n schemas={schemas as Record<string, RJSFSchema>}\n className={className}\n basePath={path}\n rootStructure={structure}\n />\n );\n\n case 'name':\n // MappingNamePaneView uses standard .elb-mapping-pane structure\n return (\n <MappingNamePaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schema={getSchemaForPath(path, mappingState, schemas, structure)}\n uiSchema={getUiSchemaForPath(path, schemas)}\n className={className}\n />\n );\n\n case 'batch':\n // MappingBatchPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingBatchPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schema={getSchemaForPath(path, mappingState, schemas, structure)}\n uiSchema={getUiSchemaForPath(path, schemas)}\n className={className}\n />\n );\n\n case 'consent':\n // MappingConsentPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingConsentPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'policy':\n // MappingPolicyOverviewPane shows list of policy rules\n return (\n <MappingPolicyOverviewPane\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'condition':\n // MappingConditionPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingConditionPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'value':\n // MappingValuePaneView uses standard .elb-mapping-pane structure\n return (\n <MappingValuePaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'key':\n // MappingKeyPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingKeyPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'fn':\n // MappingFnPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingFnPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'validate':\n // MappingValidatePaneView uses standard .elb-mapping-pane structure\n return (\n <MappingValidatePaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'valueType':\n // MappingValueTypePaneView for string | ValueConfig\n return (\n <MappingValueTypePaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'enum':\n // MappingEnumPaneView for schema-defined enum fields\n return (\n <MappingEnumPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schemas={schemas}\n structure={structure}\n className={className}\n />\n );\n\n case 'boolean':\n // MappingBooleanPaneView for boolean toggle fields\n return (\n <MappingBooleanPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n case 'primitive':\n // MappingPrimitivePaneView for schema-defined string/number primitives\n return (\n <MappingPrimitivePaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schema={getSchemaForPath(path, mappingState, schemas, structure)}\n uiSchema={getUiSchemaForPath(path, schemas)}\n className={className}\n />\n );\n\n case 'set':\n // MappingSetPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingSetPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'loop':\n // MappingLoopPaneView uses standard .elb-mapping-pane structure\n return (\n <MappingLoopPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className={className}\n />\n );\n\n case 'map':\n return (\n <MappingMapPaneViewRJSF\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schemas={schemas}\n className={className}\n />\n );\n\n case 'settings':\n // SettingsOverviewPane shows settings as tiles\n // Schema selection based on PATH context:\n // - If path is ['settings'], use schemas.settings (config-level Settings<T>)\n // - If path contains 'mapping' (e.g., ['mapping','page','view','settings']), use schemas.mapping (rule-level Mapping<T>)\n let settingsSchemaPath: 'settings' | 'mapping' = 'settings';\n\n if (path.length > 1 && path.includes('mapping')) {\n // Rule-level settings (inside mapping entity-action pattern)\n settingsSchemaPath = 'mapping';\n }\n\n const settingsSchema = schemas?.[settingsSchemaPath] as RJSFSchema | undefined;\n\n return (\n <SettingsOverviewPane\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n schema={settingsSchema}\n className={className}\n />\n );\n\n // All other cases use the standard pane wrapper with scrolling content\n case 'valueConfig':\n default: {\n let content: React.ReactNode;\n\n if (nodeType === 'valueConfig') {\n content = (\n <MappingValueConfigPaneView\n path={path}\n mappingState={mappingState}\n navigation={navigation}\n className=\"\"\n />\n );\n } else {\n content = (\n <div className=\"elb-mapping-pane-error\">\n Unknown node type: {nodeType}\n </div>\n );\n }\n\n // Standard pane structure with scrollable content for all remaining types\n return (\n <div className={`elb-mapping-pane ${className}`}>\n <div className=\"elb-mapping-pane-content\">{content}</div>\n </div>\n );\n }\n }\n}\n","import type { RJSFSchema } from '@rjsf/utils';\nimport type { DestinationSchemas } from '../types/schemas';\n\nexport interface ValidationError {\n path: string[];\n error: string;\n value: unknown;\n schema?: RJSFSchema;\n}\n\nexport function validateConfig(\n _config: Record<string, unknown>,\n _schemas?: DestinationSchemas,\n): ValidationError[] {\n return [];\n}\n\nexport function formatPath(path: string[]): string {\n return path.join('.');\n}\n\nexport function groupErrorsBySection(_errors: ValidationError[]): Record<string, ValidationError[]> {\n return {};\n}\n","import type { UseMappingNavigationReturn } from '../../hooks/useMappingNavigation';\nimport type { ValidationError } from '../../utils/config-validator';\nimport { formatPath, groupErrorsBySection } from '../../utils/config-validator';\nimport { BaseMappingPane } from '../atoms/base-mapping-pane';\nimport { detectNodeType } from '../../utils/type-detector';\nimport type { ConfigStructureDef } from '../../schemas/config-structures/types';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport { getValueAtPath } from '../../utils/mapping-path';\n\n/**\n * Validation Overview Pane - Shows all validation errors in the config\n *\n * Displays a list of all fields that have validation errors, grouped by section.\n * Each error shows the path, current value, and error message.\n * Clicking an error navigates to that field for editing.\n *\n * @example\n * <ValidationOverviewPane\n * errors={validationErrors}\n * navigation={navigation}\n * />\n */\nexport interface ValidationOverviewPaneProps {\n errors: ValidationError[];\n navigation: UseMappingNavigationReturn;\n config: unknown;\n structure: ConfigStructureDef;\n schemas?: Record<string, RJSFSchema>;\n className?: string;\n}\n\n/**\n * Format value for display (truncate if too long)\n */\nfunction formatValue(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n\n const str = typeof value === 'string' ? value : JSON.stringify(value);\n const maxLength = 50;\n\n if (str.length > maxLength) {\n return str.substring(0, maxLength) + '...';\n }\n\n return str;\n}\n\n/**\n * Get a nice section title from section key\n */\nfunction getSectionTitle(section: string): string {\n const titles: Record<string, string> = {\n settings: 'Settings',\n mapping: 'Mapping Rules',\n policy: 'Policy',\n consent: 'Consent',\n data: 'Data',\n };\n\n return titles[section] || section.charAt(0).toUpperCase() + section.slice(1);\n}\n\nexport function ValidationOverviewPane({\n errors,\n navigation,\n config,\n structure,\n schemas,\n className = '',\n}: ValidationOverviewPaneProps) {\n const groupedErrors = groupErrorsBySection(errors);\n const sections = Object.keys(groupedErrors).sort();\n\n const handleErrorClick = (error: ValidationError) => {\n const value = getValueAtPath(config as Record<string, unknown>, error.path);\n const nodeType = detectNodeType(value, error.path, structure, schemas);\n navigation.openTab(error.path, nodeType);\n };\n\n return (\n <BaseMappingPane\n title=\"Validation Errors\"\n description={\n errors.length === 0\n ? 'No validation errors found. All fields are valid.'\n : `${errors.length} validation ${errors.length === 1 ? 'error' : 'errors'} found in your configuration.`\n }\n navigation={navigation}\n className={className}\n >\n {errors.length === 0 ? (\n <div className=\"elb-mapping-rule-section\">\n <div\n style={{\n padding: '40px 20px',\n textAlign: 'center',\n color: 'var(--color-text-muted)',\n }}\n >\n <div style={{ fontSize: '48px', marginBottom: '16px' }}>✓</div>\n <div style={{ fontSize: '16px', fontWeight: 500 }}>\n All fields are valid\n </div>\n <div style={{ fontSize: '14px', marginTop: '8px' }}>\n Your configuration has no validation errors.\n </div>\n </div>\n </div>\n ) : (\n sections.map((section) => (\n <div key={section} className=\"elb-mapping-rule-section\">\n <h3 className=\"elb-mapping-rule-section-title\">\n {getSectionTitle(section)}\n </h3>\n <div className=\"elb-validation-errors-list\">\n {groupedErrors[section].map((error, index) => (\n <div\n key={`${formatPath(error.path)}-${index}`}\n className=\"elb-validation-error-item\"\n onClick={() => handleErrorClick(error)}\n >\n <div className=\"elb-validation-error-icon\">⚠</div>\n <div className=\"elb-validation-error-content\">\n <div className=\"elb-validation-error-path\">\n {formatPath(error.path)}\n </div>\n <div className=\"elb-validation-error-message\">\n {error.error}\n </div>\n <div className=\"elb-validation-error-value\">\n Current value: <code>{formatValue(error.value)}</code>\n </div>\n </div>\n <div className=\"elb-validation-error-action\">→</div>\n </div>\n ))}\n </div>\n </div>\n ))\n )}\n </BaseMappingPane>\n );\n}\n","import type { NodeType } from '../hooks/useMappingNavigation';\nimport type { RJSFSchema } from '@rjsf/utils';\nimport type {\n ConfigStructureDef,\n PropertyDef,\n} from '../schemas/config-structures/types';\nimport { MAPPING_RULE_STRUCTURE } from '../schemas/config-structures/mapping-rule';\nimport { detectNodeType } from './type-detector';\n\n/**\n * Tree node structure for config navigation\n */\nexport interface ConfigTreeNode {\n key: string;\n label: string;\n path: string[];\n type: NodeType;\n children?: ConfigTreeNode[];\n hasValue: boolean;\n isExpandable?: boolean;\n}\n\n/**\n * Capitalize first letter of a string\n */\nfunction capitalize(str: string): string {\n if (!str) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\n/**\n * Build tree structure from config using structure definition\n *\n * CONFIG-DRIVEN: Tree reflects actual config values, not schema possibilities.\n * STRUCTURE-AWARE: Uses PropertyDef for metadata (titles, nodeTypes, children strategy).\n *\n * @param config - Actual configuration object\n * @param structure - Structure definition describing config shape\n * @param schemas - Optional JSON Schemas for type hints and labels\n * @param sections - Optional visibility filter (e.g., { verbose: false })\n * @returns Array of root-level tree nodes\n *\n * @example\n * const tree = buildTree(\n * destinationConfig,\n * DESTINATION_CONFIG_STRUCTURE,\n * metaPixelSchemas,\n * { verbose: false }\n * );\n */\nexport function buildTree<T extends Record<string, unknown>>(\n config: T,\n structure: ConfigStructureDef,\n schemas?: Record<string, RJSFSchema>,\n sections?: Record<string, boolean>,\n): ConfigTreeNode[] {\n const nodes: ConfigTreeNode[] = [];\n\n if (!structure.properties) {\n return nodes;\n }\n\n // Iterate actual config keys (config-driven, not schema-driven)\n const configKeys = Object.keys(config).filter(\n (key) => config[key] !== undefined,\n );\n\n for (const key of configKeys) {\n // Check section visibility\n if (sections?.[key] === false) {\n continue;\n }\n\n const propertyDef = structure.properties[key];\n const value = config[key];\n\n const nodeType = detectNodeType(value, [key], structure, schemas);\n\n // Build node\n const node: ConfigTreeNode = {\n key,\n label: propertyDef?.title || capitalize(key),\n path: [key],\n type: nodeType,\n hasValue: true,\n };\n\n // Build children based on children strategy\n if (propertyDef?.children === 'entity-action') {\n // Special: mapping.{entity}.{action} pattern\n node.children = buildEntityActionChildren(\n value as Record<string, Record<string, unknown>>,\n [key],\n schemas,\n );\n node.isExpandable = node.children.length > 0;\n } else if (propertyDef?.children === 'schema-driven') {\n // Build from JSON Schema properties\n const propSchema = schemas?.[propertyDef.schemaPath || key];\n node.children = buildSchemaChildren(\n value as Record<string, unknown>,\n [key],\n propSchema,\n schemas,\n structure,\n );\n node.isExpandable = node.children.length > 0;\n } else if (propertyDef?.children === 'value-driven') {\n // Detect children from value structure\n node.children = buildValueChildren(value, [key], schemas, structure);\n node.isExpandable = node.children.length > 0;\n } else {\n // No children (leaf node)\n node.isExpandable = false;\n }\n\n nodes.push(node);\n }\n\n return nodes;\n}\n\n/**\n * Build children nodes for entity-action pattern\n *\n * Handles the special mapping.{entity}.{action} hierarchy:\n * - First level: entities (page, product, order)\n * - Second level: actions (view, add, complete)\n * - Third level: rule properties (name, batch, settings, data, etc.)\n *\n * Uses MAPPING_RULE_STRUCTURE to properly handle rule properties with schema awareness.\n *\n * @param mapping - Mapping object (entity → action → rule)\n * @param basePath - Base path (e.g., ['mapping'])\n * @param schemas - Schemas dict for rule-level settings\n * @returns Array of entity nodes with action children\n */\nfunction buildEntityActionChildren(\n mapping: Record<string, Record<string, unknown>>,\n basePath: string[],\n schemas?: Record<string, RJSFSchema>,\n): ConfigTreeNode[] {\n const children: ConfigTreeNode[] = [];\n\n Object.keys(mapping).forEach((entity) => {\n const actions = mapping[entity];\n const actionNodes: ConfigTreeNode[] = [];\n\n if (actions && typeof actions === 'object') {\n Object.keys(actions).forEach((action) => {\n const ruleValue = actions[action];\n const rulePath = [...basePath, entity, action];\n\n // Build rule children using MAPPING_RULE_STRUCTURE for proper schema handling\n const ruleChildren = buildValueChildren(\n ruleValue,\n rulePath,\n schemas,\n MAPPING_RULE_STRUCTURE,\n );\n\n actionNodes.push({\n key: action,\n label: capitalize(action),\n path: rulePath,\n type: 'rule',\n hasValue: true,\n children: ruleChildren,\n isExpandable: ruleChildren.length > 0,\n });\n });\n }\n\n children.push({\n key: entity,\n label: capitalize(entity),\n path: [...basePath, entity],\n type: 'entity',\n hasValue: true,\n children: actionNodes,\n isExpandable: actionNodes.length > 0,\n });\n });\n\n return children;\n}\n\n/**\n * Build children from JSON Schema properties\n *\n * Used for settings and other schema-defined objects.\n * Only shows properties that actually exist in config.\n *\n * @param obj - Object with properties\n * @param basePath - Base path\n * @param schema - JSON Schema for this object\n * @param schemas - Full schemas dict for nested navigation\n * @param structure - Optional structure for additional metadata\n * @returns Array of child nodes\n */\nfunction buildSchemaChildren(\n obj: Record<string, unknown>,\n basePath: string[],\n schema?: RJSFSchema,\n schemas?: Record<string, RJSFSchema>,\n structure?: ConfigStructureDef,\n): ConfigTreeNode[] {\n const children: ConfigTreeNode[] = [];\n\n // Only build from actual config values (config-driven)\n Object.keys(obj)\n .filter((key) => obj[key] !== undefined)\n .forEach((key) => {\n const value = obj[key];\n const childPath = [...basePath, key];\n const propSchema = schema?.properties?.[key] as RJSFSchema | undefined;\n\n // Get property definition from structure if available\n const propertyDef = structure?.properties?.[key];\n\n // Determine children - check if nested object has schema\n let valueChildren: ConfigTreeNode[];\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n propSchema?.properties\n ) {\n // This is a schema-defined nested object, recurse with schema\n valueChildren = buildSchemaChildren(\n value as Record<string, unknown>,\n childPath,\n propSchema,\n schemas,\n structure,\n );\n } else {\n // Use value-driven for non-schema objects (pass structure!)\n valueChildren = buildValueChildren(\n value,\n childPath,\n schemas,\n structure,\n );\n }\n\n children.push({\n key,\n label: propertyDef?.title || propSchema?.title || capitalize(key),\n path: childPath,\n type: structure ? detectNodeType(value, childPath, structure, schemas) : 'valueConfig',\n hasValue: true,\n children: valueChildren,\n isExpandable: valueChildren.length > 0,\n });\n });\n\n return children;\n}\n\n/**\n * Build children from value structure\n *\n * Used for data, policy, and other value-driven properties.\n * Detects structure from actual value, but uses schema when available.\n *\n * @param value - Value to inspect\n * @param basePath - Base path\n * @param schemas - Optional schemas dict for schema-aware navigation\n * @param structure - Optional structure definition for property metadata\n * @returns Array of child nodes\n */\nfunction buildValueChildren(\n value: unknown,\n basePath: string[],\n schemas?: Record<string, RJSFSchema>,\n structure?: ConfigStructureDef,\n): ConfigTreeNode[] {\n // For objects: show properties and recurse\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n return Object.keys(obj).map((key) => {\n const childValue = obj[key];\n const childPath = [...basePath, key];\n\n // Check if this property is defined in structure (for rule properties)\n const propertyDef = structure?.properties?.[key];\n\n // Determine if this should use schema-driven children\n let childChildren: ConfigTreeNode[];\n if (propertyDef?.children === 'schema-driven') {\n // Use schema-driven building for nested settings\n const schemaPath = propertyDef.schemaPath || key;\n const propSchema = schemas?.[schemaPath];\n childChildren = buildSchemaChildren(\n childValue as Record<string, unknown>,\n childPath,\n propSchema,\n schemas,\n structure,\n );\n } else {\n // Continue with value-driven recursion\n childChildren = buildValueChildren(\n childValue,\n childPath,\n schemas,\n structure,\n );\n }\n\n const label = propertyDef?.title || capitalize(key);\n\n return {\n key,\n label,\n path: childPath,\n type: structure ? detectNodeType(childValue, childPath, structure, schemas) : 'valueConfig',\n hasValue: true,\n children: childChildren,\n isExpandable: childChildren.length > 0,\n };\n });\n }\n\n // Arrays, primitives: no children\n return [];\n}\n\n","import {\n ConfigEditorBox,\n type ConfigEditorBoxProps,\n} from './config-editor-box';\n\n/**\n * ConfigEditor - Generic Visual Configuration Editor\n *\n * A fully generic configuration editor that works at ANY depth with ANY config type.\n * Uses structure definitions and schemas to provide appropriate editing UI.\n *\n * Key Features:\n * - Works at any depth (full config or nested object)\n * - Structure-driven (no hardcoded assumptions)\n * - Schema-aware (validation, type hints, metadata)\n * - Code/Visual toggle\n * - Tree navigation\n * - Validation with error overview\n * - TypeScript generic for type safety\n *\n * @example\n * // Full DestinationConfig\n * <ConfigEditor\n * config={destinationConfig}\n * onChange={setConfig}\n * structure={DESTINATION_CONFIG_STRUCTURE}\n * schemas={metaSchemas}\n * label=\"Meta Pixel Configuration\"\n * />\n *\n * @example\n * // Single Rule (deep nested)\n * <ConfigEditor\n * config={pageViewRule}\n * onChange={setRule}\n * structure={MAPPING_RULE_STRUCTURE}\n * schemas={{ mapping: mappingSchema }}\n * label=\"Page View Rule\"\n * showTree={false}\n * />\n *\n * @example\n * // Read-only (no onChange)\n * <ConfigEditor\n * config={destinationConfig}\n * structure={DESTINATION_CONFIG_STRUCTURE}\n * initialTab=\"code\"\n * />\n */\nexport function ConfigEditor<T extends Record<string, unknown>>(\n props: ConfigEditorBoxProps<T>,\n) {\n return <ConfigEditorBox {...props} />;\n}\n","import { useState, useEffect } from 'react';\nimport { CodeBox, type CodeBoxProps } from './code-box';\nimport { formatCode } from '../../utils/format-code';\n\nexport type CodeSnippetProps = Omit<CodeBoxProps, 'label' | 'showHeader'> & {\n format?: boolean;\n};\n\n/**\n * CodeSnippet - Prominent code display for snippets\n *\n * Wraps CodeBox with larger font size and generous padding.\n * Use this for showcasing code examples, one-liners, or small code blocks\n * where you want the code to be more visually prominent than in a standard editor.\n *\n * Always renders without a header. Use CodeBox if you need a header.\n *\n * Default behavior:\n * - Read-only (disabled=true)\n * - Copy button enabled (showCopy=true)\n * - Auto-height with sensible bounds (min: 20px, max: 600px)\n * - Auto-format on mount (format=true) - formats code once on initial load\n *\n * Auto-Formatting:\n * - Enabled by default (format=true)\n * - Runs once on component mount using Monaco's built-in formatters\n * - Supports: JavaScript, TypeScript, JSON, HTML, CSS\n * - Use format={false} to disable for special cases (pre-formatted code)\n *\n * Reuses all CodeBox functionality:\n * - Monaco Editor with syntax highlighting\n * - Grid height management and auto-height modes\n * - Copy button\n * - Theme integration\n *\n * @example\n * // Minimal usage - code auto-formats on load\n * <CodeSnippet\n * code=\"import { elb } from '@walkeros/core';\"\n * language=\"javascript\"\n * />\n *\n * @example\n * // Disable auto-formatting for pre-formatted code\n * <CodeSnippet\n * code={alreadyFormattedCode}\n * language=\"javascript\"\n * format={false}\n * />\n *\n * @example\n * // Override defaults if needed\n * <CodeSnippet\n * code={editableCode}\n * language=\"javascript\"\n * disabled={false}\n * showCopy={false}\n * autoHeight={{ min: 100, max: 800 }}\n * />\n */\nexport function CodeSnippet(props: CodeSnippetProps) {\n const {\n code,\n language = 'javascript',\n className,\n disabled = true,\n showCopy = true,\n autoHeight = { min: 20, max: 600 },\n fontSize = 15,\n format = true,\n ...rest\n } = props;\n const snippetClassName = `elb-code-snippet ${className || ''}`.trim();\n const [formattedCode, setFormattedCode] = useState(code);\n\n // Format code on mount\n useEffect(() => {\n if (format) {\n formatCode(code, language).then(setFormattedCode);\n } else {\n setFormattedCode(code);\n }\n }, [code, language, format]);\n\n return (\n <CodeBox\n {...rest}\n code={formattedCode}\n language={language}\n className={snippetClassName}\n showHeader={false}\n disabled={disabled}\n showCopy={showCopy}\n autoHeight={autoHeight}\n fontSize={fontSize}\n />\n );\n}\n","import * as prettier from 'prettier/standalone';\nimport prettierBabel from 'prettier/plugins/babel';\nimport prettierEstree from 'prettier/plugins/estree';\nimport prettierTypescript from 'prettier/plugins/typescript';\nimport prettierHtml from 'prettier/plugins/html';\n\n/**\n * Format code using Prettier\n *\n * @param code - The code to format\n * @param language - The language (javascript, typescript, json, html, css)\n * @returns Formatted code, or original code if formatting fails\n */\nexport async function formatCode(\n code: string,\n language: string,\n): Promise<string> {\n try {\n let formatted: string;\n\n switch (language) {\n case 'javascript':\n case 'js':\n formatted = await prettier.format(code, {\n parser: 'babel',\n plugins: [prettierBabel, prettierEstree],\n semi: true,\n singleQuote: true,\n trailingComma: 'all',\n });\n break;\n\n case 'typescript':\n case 'ts':\n case 'tsx':\n formatted = await prettier.format(code, {\n parser: 'typescript',\n plugins: [prettierTypescript, prettierEstree],\n semi: true,\n singleQuote: true,\n trailingComma: 'all',\n });\n break;\n\n case 'json':\n // Use native JSON for simplicity\n const parsed = JSON.parse(code);\n formatted = JSON.stringify(parsed, null, 2);\n break;\n\n case 'html':\n formatted = await prettier.format(code, {\n parser: 'html',\n plugins: [prettierHtml],\n htmlWhitespaceSensitivity: 'css',\n });\n break;\n\n case 'css':\n case 'scss':\n formatted = await prettier.format(code, {\n parser: 'css',\n plugins: [prettierHtml],\n });\n break;\n\n default:\n // Unsupported language, return original\n return code;\n }\n\n // Trim trailing whitespace/newlines\n return formatted.trim();\n } catch (error) {\n return code;\n }\n}\n","import React, { useState } from 'react';\nimport type { RJSFSchema } from '@rjsf/utils';\n\nexport interface PropertyTableProps {\n schema: RJSFSchema;\n className?: string;\n}\n\ninterface Property {\n name: string;\n type: string;\n description: string;\n default?: string;\n required?: boolean;\n example?: string;\n}\n\ninterface PropertyModalProps {\n property: Property | null;\n isOpen: boolean;\n onClose: () => void;\n}\n\nfunction schemaToProperties(schema: RJSFSchema): Property[] {\n const properties: Property[] = [];\n const required = (schema.required as string[]) || [];\n\n if (!schema.properties) {\n return properties;\n }\n\n for (const [name, prop] of Object.entries(schema.properties)) {\n const property = prop as Record<string, unknown>;\n\n let type = (property.type as string) || 'any';\n\n if (property.enum) {\n type = (property.enum as unknown[])\n .map((v: unknown) => `'${v}'`)\n .join(' | ');\n }\n\n if (type === 'array' && property.items) {\n const items = property.items as Record<string, unknown>;\n if (items.enum) {\n type = `Array<${(items.enum as unknown[]).map((v: unknown) => `'${v}'`).join(' | ')}>`;\n } else {\n type = `Array<${(items.type as string) || 'any'}>`;\n }\n }\n\n if (type === 'object' && property.additionalProperties) {\n const addProps = property.additionalProperties as Record<string, unknown>;\n const valueType = (addProps.type as string) || 'any';\n type = `Record<string, ${valueType}>`;\n }\n\n if (property.anyOf || property.oneOf) {\n const variants = (property.anyOf || property.oneOf) as Array<\n Record<string, unknown>\n >;\n type = variants.map((v) => (v.type as string) || 'any').join(' | ');\n }\n\n let description = (property.description as string) || '';\n let example: string | undefined;\n\n const exampleMatch = description.match(/\\(like\\s+(.+?)\\)$/);\n if (exampleMatch) {\n example = exampleMatch[1];\n description = description.replace(/\\s*\\(like\\s+.+?\\)$/, '');\n }\n\n if (type === 'any' && description.toLowerCase().includes('function')) {\n type = 'function';\n }\n\n properties.push({\n name,\n type,\n description,\n required: required.includes(name),\n default:\n property.default !== undefined ? String(property.default) : undefined,\n example,\n });\n }\n\n return properties;\n}\n\nfunction PropertyModal({ property, isOpen, onClose }: PropertyModalProps) {\n if (!isOpen || !property) return null;\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n return (\n <div className=\"elb-property-table__modal-backdrop\" onClick={handleBackdropClick}>\n <div className=\"elb-property-table__modal-content\">\n <div className=\"elb-property-table__modal-header\">\n <h3 className=\"elb-property-table__modal-title\">\n <code className=\"elb-property-table__modal-property-name\">\n {property.name}\n </code>\n {property.required && (\n <span className=\"elb-property-table__required-icon\">*</span>\n )}\n </h3>\n <button\n className=\"elb-property-table__close-button\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n <div className=\"elb-property-table__modal-body\">\n <div className=\"elb-property-table__modal-row\">\n <span className=\"elb-property-table__modal-label\">Type:</span>\n <code className=\"elb-property-table__modal-type elb-property-table__modal-type--wrap\">\n {property.type}\n </code>\n </div>\n {property.description && (\n <div className=\"elb-property-table__modal-row\">\n <span className=\"elb-property-table__modal-label\">Description:</span>\n <p className=\"elb-property-table__modal-description\">\n {property.description}\n </p>\n </div>\n )}\n {property.default && (\n <div className=\"elb-property-table__modal-row\">\n <span className=\"elb-property-table__modal-label\">Default:</span>\n <code className=\"elb-property-table__modal-default\">\n {property.default}\n </code>\n </div>\n )}\n {property.example && (\n <div className=\"elb-property-table__modal-row\">\n <span className=\"elb-property-table__modal-label\">Example:</span>\n <code className=\"elb-property-table__modal-example\">\n {property.example}\n </code>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport function PropertyTable({ schema, className }: PropertyTableProps) {\n const [selectedProperty, setSelectedProperty] = useState<Property | null>(\n null,\n );\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const properties = schemaToProperties(schema);\n\n const hasRequiredProperties = properties.some(\n (property) => property.required,\n );\n\n const TYPE_MAX_LENGTH = 30;\n\n const isTruncated = (type: string) => type.length > TYPE_MAX_LENGTH;\n\n const truncateType = (type: string) => {\n if (type.length <= TYPE_MAX_LENGTH) return type;\n return type.slice(0, TYPE_MAX_LENGTH);\n };\n\n const openModal = (property: Property) => {\n setSelectedProperty(property);\n setIsModalOpen(true);\n };\n\n const closeModal = () => {\n setIsModalOpen(false);\n setSelectedProperty(null);\n };\n\n return (\n <div className={`elb-explorer ${className || ''}`}>\n <div className=\"elb-property-table__container\">\n <table className=\"elb-property-table\">\n <thead>\n <tr>\n <th>Property</th>\n <th>Type</th>\n <th>Description</th>\n <th>More</th>\n </tr>\n </thead>\n <tbody>\n {properties.map((property: Property, index: number) => (\n <tr key={index}>\n <td className=\"elb-property-table__property-cell\" data-label=\"Property\">\n <code className=\"elb-property-table__property-name\">\n {property.name}\n {property.required && (\n <span className=\"elb-property-table__required-icon\">\n *\n </span>\n )}\n </code>\n </td>\n <td className=\"elb-property-table__type-cell\" data-label=\"Type\">\n {isTruncated(property.type) ? (\n <button\n className=\"elb-property-table__type-button\"\n onClick={() => openModal(property)}\n aria-label={`View full type for ${property.name}`}\n >\n <code className=\"elb-property-table__property-type elb-property-table__property-type--truncated\">\n {truncateType(property.type)}\n </code>\n </button>\n ) : (\n <code className=\"elb-property-table__property-type\">\n {property.type}\n </code>\n )}\n </td>\n <td className=\"elb-property-table__description\" data-label=\"Description\">\n {property.description}\n </td>\n <td className=\"elb-property-table__action-cell\" data-label=\"More\">\n <button\n className=\"elb-property-table__more-button\"\n onClick={() => openModal(property)}\n aria-label={`More info about ${property.name}`}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {hasRequiredProperties && (\n <div className=\"elb-property-table__required-notice\">\n <span className=\"elb-property-table__required-icon\">*</span> Required\n fields\n </div>\n )}\n <PropertyModal\n property={selectedProperty}\n isOpen={isModalOpen}\n onClose={closeModal}\n />\n </div>\n );\n}\n","import type { ConfigStructureDef } from './types';\n\n/**\n * Structure Definition for Destination.Config\n *\n * Describes the shape of a full destination configuration:\n * - settings: Destination-specific settings\n * - mapping: Event mapping rules (entity → action hierarchy)\n * - data: Global data transformations\n * - policy: Processing policy rules\n * - consent: Consent requirements\n * - id, loadScript, queue, verbose: Config options\n *\n * This structure works with DestinationBox and ConfigEditor.\n */\nexport const DESTINATION_CONFIG_STRUCTURE: ConfigStructureDef = {\n type: 'object',\n title: 'Destination Configuration',\n description:\n 'Complete destination configuration with settings, mapping, data, policy, and options',\n rootNodeType: 'entity', // Overview shows tiles\n\n properties: {\n // Config-level settings\n settings: {\n title: 'Settings',\n description: 'Destination-specific configuration',\n nodeType: 'settings', // Shows SettingsOverviewPane\n children: 'schema-driven', // Build from schemas.settings\n schemaPath: 'settings',\n },\n\n // Event mapping rules\n mapping: {\n title: 'Mapping',\n description: 'Event-specific mapping rules',\n nodeType: 'entity', // Shows entity list\n children: 'entity-action', // Special: mapping.{entity}.{action} pattern\n },\n\n // Global data transformations\n data: {\n title: 'Data',\n description: 'Global data transformations',\n children: 'value-driven', // Detect from value (map, loop, etc.)\n schemaPath: 'data',\n },\n\n // Processing policy\n policy: {\n title: 'Policy',\n description: 'Processing policy rules',\n nodeType: 'policy',\n children: 'none',\n },\n\n // Consent requirements\n consent: {\n title: 'Consent',\n description: 'Consent requirements',\n nodeType: 'consent',\n children: 'none',\n },\n\n // Config options\n id: {\n title: 'ID',\n description: 'Destination identifier',\n nodeType: 'primitive',\n children: 'none',\n schemaPath: 'id',\n },\n\n loadScript: {\n title: 'Load Script',\n description: 'Automatically load destination script',\n nodeType: 'boolean',\n children: 'none',\n schemaPath: 'loadScript',\n },\n\n queue: {\n title: 'Queue',\n description: 'Enable event queuing',\n nodeType: 'boolean',\n children: 'none',\n schemaPath: 'queue',\n },\n\n verbose: {\n title: 'Verbose',\n description: 'Enable verbose logging',\n nodeType: 'boolean',\n children: 'none',\n schemaPath: 'verbose',\n },\n },\n\n patterns: {\n 'entity-action': true, // mapping property uses this pattern\n },\n};\n\n/**\n * Helper function to get the NodeType for a root-level property\n * @param key - The property key (e.g., 'settings', 'mapping', 'data')\n * @returns The NodeType if defined in the structure, undefined otherwise\n */\nexport function getRootPropertyNodeType(key: string): string | undefined {\n const property = DESTINATION_CONFIG_STRUCTURE.properties?.[key];\n return property?.nodeType;\n}\n\n/**\n * Alias for backward compatibility\n * @deprecated Use DESTINATION_CONFIG_STRUCTURE instead\n */\nexport const destinationConfigStructureSchema = DESTINATION_CONFIG_STRUCTURE;\n","import React from 'react';\n\nexport interface FooterProps {\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * Footer - Footer atom component for boxes\n *\n * Provides a fixed-height footer area at the bottom of a box.\n * Pairs with Header component for consistent box structure.\n *\n * @example\n * <Box header=\"Preview\">\n * <Preview ... />\n * <Footer>\n * <ButtonGroup buttons={...} />\n * </Footer>\n * </Box>\n */\nexport function Footer({ children, className = '' }: FooterProps) {\n return <div className={`elb-explorer-footer ${className}`}>{children}</div>;\n}\n","import React from 'react';\n\n/**\n * Hint item definition\n */\nexport interface HintItem {\n code: string;\n description: string;\n}\n\n/**\n * PanelHints - Reusable hints component for panel views\n *\n * Displays a clean, modern hints box with code examples and descriptions.\n * Used across all property panel views for consistency.\n *\n * Features:\n * - Minimal design with subtle background\n * - Code-first presentation\n * - Clean typography\n * - Theme-aware styling\n *\n * @example\n * <PanelHints\n * title=\"Common patterns\"\n * hints={[\n * { code: 'data.id', description: 'Product identifier' },\n * { code: 'user.email', description: 'User email address' }\n * ]}\n * />\n */\nexport interface PanelHintsProps {\n title?: string;\n hints: HintItem[];\n className?: string;\n}\n\nexport function PanelHints({\n title = 'Common patterns',\n hints,\n className = '',\n}: PanelHintsProps) {\n return (\n <div className={`elb-panel-hints ${className}`}>\n {title && <div className=\"elb-panel-hints-title\">{title}</div>}\n <ul className=\"elb-panel-hints-list\">\n {hints.map((hint, index) => (\n <li key={index} className=\"elb-panel-hints-item\">\n <code className=\"elb-panel-hints-code\">{hint.code}</code>\n <span className=\"elb-panel-hints-desc\">{hint.description}</span>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","/**\n * @import {MDXComponents} from 'mdx/types.js'\n * @import {Component, ReactElement, ReactNode} from 'react'\n */\n\n/**\n * @callback MergeComponents\n * Custom merge function.\n * @param {Readonly<MDXComponents>} currentComponents\n * Current components from the context.\n * @returns {MDXComponents}\n * Additional components.\n *\n * @typedef Props\n * Configuration for `MDXProvider`.\n * @property {ReactNode | null | undefined} [children]\n * Children (optional).\n * @property {Readonly<MDXComponents> | MergeComponents | null | undefined} [components]\n * Additional components to use or a function that creates them (optional).\n * @property {boolean | null | undefined} [disableParentContext=false]\n * Turn off outer component context (default: `false`).\n */\n\nimport React from 'react'\n\n/** @type {Readonly<MDXComponents>} */\nconst emptyComponents = {}\n\nconst MDXContext = React.createContext(emptyComponents)\n\n/**\n * Get current components from the MDX Context.\n *\n * @param {Readonly<MDXComponents> | MergeComponents | null | undefined} [components]\n * Additional components to use or a function that creates them (optional).\n * @returns {MDXComponents}\n * Current components.\n */\nexport function useMDXComponents(components) {\n const contextComponents = React.useContext(MDXContext)\n\n // Memoize to avoid unnecessary top-level context changes\n return React.useMemo(\n function () {\n // Custom merge via a function prop\n if (typeof components === 'function') {\n return components(contextComponents)\n }\n\n return {...contextComponents, ...components}\n },\n [contextComponents, components]\n )\n}\n\n/**\n * Provider for MDX context.\n *\n * @param {Readonly<Props>} properties\n * Properties.\n * @returns {ReactElement}\n * Element.\n * @satisfies {Component}\n */\nexport function MDXProvider(properties) {\n /** @type {Readonly<MDXComponents>} */\n let allComponents\n\n if (properties.disableParentContext) {\n allComponents =\n typeof properties.components === 'function'\n ? properties.components(emptyComponents)\n : properties.components || emptyComponents\n } else {\n allComponents = useMDXComponents(properties.components)\n }\n\n return React.createElement(\n MDXContext.Provider,\n {value: allComponents},\n properties.children\n )\n}\n","import React, { type FC, type PropsWithChildren, Children } from 'react';\nimport { CodeBox } from '../molecules/code-box';\n\ninterface MDXCodeProps {\n className?: string;\n}\n\n/**\n * MDXCode - Code component for MDX files\n *\n * Automatically detects and renders inline vs block code:\n * - Inline code: `example` → <code className=\"elb-code-inline\">\n * - Block code: ```language\\ncode\\n``` → Uses CodeBox with Monaco editor\n *\n * Language detection:\n * - Extracts language from className (e.g., \"language-typescript\")\n * - Maps common MDX language names to Monaco language IDs\n *\n * Block code features (via CodeBox):\n * - Full Monaco editor with syntax highlighting\n * - Theme-aware (Palenight dark, VS Light)\n * - Copy to clipboard button\n * - Auto-height to fit content\n * - Read-only mode\n *\n * @example\n * // In MDX files (no import needed with MDXProvider):\n * Inline `code` example\n *\n * ```typescript\n * const block = \"code\";\n * ```\n */\nexport const MDXCode: FC<PropsWithChildren<MDXCodeProps>> = ({\n className,\n children,\n}) => {\n // Detect if this is block code based on:\n // 1. Has className (markdown sets \"language-*\" for code blocks)\n // 2. Content contains newlines\n const childrenArray = Children.toArray(children);\n const hasClassName = typeof className === 'string';\n\n // Check if content has newlines (block code)\n const hasNewlines = childrenArray.some((child) => {\n if (typeof child === 'string') {\n return child.match(/[\\n\\r]/g);\n }\n return false;\n });\n\n // Inline code: no className or no newlines\n if (!hasClassName || !hasNewlines) {\n return <code className=\"elb-code-inline\">{children}</code>;\n }\n\n // Block code: extract language from className\n // Format: \"language-typescript\" → \"typescript\"\n const mdxLanguage = className.replace(/^language-/, '');\n\n // Map MDX language names to Monaco language IDs\n const languageMap: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n jsx: 'javascript',\n tsx: 'typescript',\n bash: 'shell',\n sh: 'shell',\n yml: 'yaml',\n md: 'markdown',\n };\n\n const monacoLanguage = languageMap[mdxLanguage] || mdxLanguage;\n\n // Extract code string from children\n const code = childrenArray\n .map((child) => (typeof child === 'string' ? child : ''))\n .join('')\n .trim();\n\n return (\n <CodeBox\n code={code}\n language={monacoLanguage}\n disabled\n showCopy\n showHeader={false}\n autoHeight={{ min: 100, max: 600 }}\n />\n );\n};\n","import React, { type FC, type PropsWithChildren } from 'react';\nimport { MDXProvider as BaseMDXProvider } from '@mdx-js/react';\nimport { MDXCode } from '../components/atoms/mdx-code';\nimport { CodeBox } from '../components/molecules/code-box';\nimport { PropertyTable } from '../components/molecules/property-table';\nimport { DestinationInitDemo } from '../components/demos/DestinationInitDemo';\nimport { DestinationDemo } from '../components/demos/DestinationDemo';\n\n/**\n * MDXProvider - Makes components available in MDX files without explicit imports\n *\n * This provider wraps MDX content and injects React components for HTML elements.\n * Components are automatically used when rendering markdown/MDX content.\n *\n * Key features:\n * - No imports needed in MDX files\n * - Consistent styling across all documentation\n * - Theme-aware (respects data-theme attribute)\n * - Automatic inline vs block code detection\n *\n * Available components (no import needed):\n * - CodeBox: Monaco editor for code display (also auto-used for ```code blocks)\n * - PropertyTable: Display schema-based property documentation\n * - DestinationInitDemo: Interactive demo for destination initialization\n * - DestinationDemo: Interactive demo for destination event processing\n *\n * @example\n * // Wrap your app\n * <MDXProvider>\n * <App />\n * </MDXProvider>\n *\n * @example\n * // Then in any .mdx file, no imports needed:\n * # Documentation\n *\n * Inline `code` and markdown blocks:\n * ```typescript\n * const example = \"Hello\";\n * ```\n *\n * Or use components directly:\n * <CodeBox code=\"const x = 1;\" language=\"javascript\" />\n * <PropertyTable schema={mySchema} />\n */\nexport const MDXProvider: FC<PropsWithChildren> = ({ children }) => {\n const components = {\n // Markdown element mappings\n code: MDXCode, // Auto-handles ```code blocks\n\n // Explorer components (no import needed in MDX)\n CodeBox,\n PropertyTable,\n DestinationInitDemo,\n DestinationDemo,\n };\n\n return <BaseMDXProvider components={components}>{children}</BaseMDXProvider>;\n};\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import {\n AnyClassGroupIds,\n AnyConfig,\n AnyThemeGroupIds,\n ClassGroup,\n ClassValidator,\n Config,\n ThemeGetter,\n ThemeObject,\n} from './types'\n\nexport interface ClassPartObject {\n nextPart: Map<string, ClassPartObject>\n validators: ClassValidatorObject[]\n classGroupId?: AnyClassGroupIds\n}\n\ninterface ClassValidatorObject {\n classGroupId: AnyClassGroupIds\n validator: ClassValidator\n}\n\nconst CLASS_PART_SEPARATOR = '-'\n\nexport const createClassGroupUtils = (config: AnyConfig) => {\n const classMap = createClassMap(config)\n const { conflictingClassGroups, conflictingClassGroupModifiers } = config\n\n const getClassGroupId = (className: string) => {\n const classParts = className.split(CLASS_PART_SEPARATOR)\n\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift()\n }\n\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className)\n }\n\n const getConflictingClassGroupIds = (\n classGroupId: AnyClassGroupIds,\n hasPostfixModifier: boolean,\n ) => {\n const conflicts = conflictingClassGroups[classGroupId] || []\n\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]!]\n }\n\n return conflicts\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nconst getGroupRecursive = (\n classParts: string[],\n classPartObject: ClassPartObject,\n): AnyClassGroupIds | undefined => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[0]!\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart)\n const classGroupFromNextClassPart = nextClassPartObject\n ? getGroupRecursive(classParts.slice(1), nextClassPartObject)\n : undefined\n\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart\n }\n\n if (classPartObject.validators.length === 0) {\n return undefined\n }\n\n const classRest = classParts.join(CLASS_PART_SEPARATOR)\n\n return classPartObject.validators.find(({ validator }) => validator(classRest))?.classGroupId\n}\n\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/\n\nconst getGroupIdForArbitraryProperty = (className: string) => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)![1]\n const property = arbitraryPropertyClassName?.substring(\n 0,\n arbitraryPropertyClassName.indexOf(':'),\n )\n\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property\n }\n }\n}\n\n/**\n * Exported for testing only\n */\nexport const createClassMap = (config: Config<AnyClassGroupIds, AnyThemeGroupIds>) => {\n const { theme, prefix } = config\n const classMap: ClassPartObject = {\n nextPart: new Map<string, ClassPartObject>(),\n validators: [],\n }\n\n const prefixedClassGroupEntries = getPrefixedClassGroupEntries(\n Object.entries(config.classGroups),\n prefix,\n )\n\n prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme)\n })\n\n return classMap\n}\n\nconst processClassesRecursively = (\n classGroup: ClassGroup<AnyThemeGroupIds>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n classGroup.forEach((classDefinition) => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n return\n }\n\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(\n classDefinition(theme),\n classPartObject,\n classGroupId,\n theme,\n )\n return\n }\n\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId,\n })\n\n return\n }\n\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(\n classGroup,\n getPart(classPartObject, key),\n classGroupId,\n theme,\n )\n })\n })\n}\n\nconst getPart = (classPartObject: ClassPartObject, path: string) => {\n let currentClassPartObject = classPartObject\n\n path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: [],\n })\n }\n\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart)!\n })\n\n return currentClassPartObject\n}\n\nconst isThemeGetter = (func: ClassValidator | ThemeGetter): func is ThemeGetter =>\n (func as ThemeGetter).isThemeGetter\n\nconst getPrefixedClassGroupEntries = (\n classGroupEntries: Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]>,\n prefix: string | undefined,\n): Array<[classGroupId: string, classGroup: ClassGroup<AnyThemeGroupIds>]> => {\n if (!prefix) {\n return classGroupEntries\n }\n\n return classGroupEntries.map(([classGroupId, classGroup]) => {\n const prefixedClassGroup = classGroup.map((classDefinition) => {\n if (typeof classDefinition === 'string') {\n return prefix + classDefinition\n }\n\n if (typeof classDefinition === 'object') {\n return Object.fromEntries(\n Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]),\n )\n }\n\n return classDefinition\n })\n\n return [classGroupId, prefixedClassGroup]\n })\n}\n","// Export is needed because TypeScript complains about an error otherwise:\n// Error: …/tailwind-merge/src/config-utils.ts(8,17): semantic error TS4058: Return type of exported function has or is using name 'LruCache' from external module \"…/tailwind-merge/src/lru-cache\" but cannot be named.\nexport interface LruCache<Key, Value> {\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nexport const createLruCache = <Key, Value>(maxCacheSize: number): LruCache<Key, Value> => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {},\n }\n }\n\n let cacheSize = 0\n let cache = new Map<Key, Value>()\n let previousCache = new Map<Key, Value>()\n\n const update = (key: Key, value: Value) => {\n cache.set(key, value)\n cacheSize++\n\n if (cacheSize > maxCacheSize) {\n cacheSize = 0\n previousCache = cache\n cache = new Map()\n }\n }\n\n return {\n get(key) {\n let value = cache.get(key)\n\n if (value !== undefined) {\n return value\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value)\n return value\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value)\n } else {\n update(key, value)\n }\n },\n }\n}\n","import { AnyConfig } from './types'\n\nexport const IMPORTANT_MODIFIER = '!'\n\nexport const createParseClassName = (config: AnyConfig) => {\n const { separator, experimentalParseClassName } = config\n const isSeparatorSingleCharacter = separator.length === 1\n const firstSeparatorCharacter = separator[0]\n const separatorLength = separator.length\n\n // parseClassName inspired by https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n const parseClassName = (className: string) => {\n const modifiers = []\n\n let bracketDepth = 0\n let modifierStart = 0\n let postfixModifierPosition: number | undefined\n\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index]\n\n if (bracketDepth === 0) {\n if (\n currentCharacter === firstSeparatorCharacter &&\n (isSeparatorSingleCharacter ||\n className.slice(index, index + separatorLength) === separator)\n ) {\n modifiers.push(className.slice(modifierStart, index))\n modifierStart = index + separatorLength\n continue\n }\n\n if (currentCharacter === '/') {\n postfixModifierPosition = index\n continue\n }\n }\n\n if (currentCharacter === '[') {\n bracketDepth++\n } else if (currentCharacter === ']') {\n bracketDepth--\n }\n }\n\n const baseClassNameWithImportantModifier =\n modifiers.length === 0 ? className : className.substring(modifierStart)\n const hasImportantModifier =\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)\n const baseClassName = hasImportantModifier\n ? baseClassNameWithImportantModifier.substring(1)\n : baseClassNameWithImportantModifier\n\n const maybePostfixModifierPosition =\n postfixModifierPosition && postfixModifierPosition > modifierStart\n ? postfixModifierPosition - modifierStart\n : undefined\n\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n }\n }\n\n if (experimentalParseClassName) {\n return (className: string) => experimentalParseClassName({ className, parseClassName })\n }\n\n return parseClassName\n}\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nexport const sortModifiers = (modifiers: string[]) => {\n if (modifiers.length <= 1) {\n return modifiers\n }\n\n const sortedModifiers: string[] = []\n let unsortedModifiers: string[] = []\n\n modifiers.forEach((modifier) => {\n const isArbitraryVariant = modifier[0] === '['\n\n if (isArbitraryVariant) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier)\n unsortedModifiers = []\n } else {\n unsortedModifiers.push(modifier)\n }\n })\n\n sortedModifiers.push(...unsortedModifiers.sort())\n\n return sortedModifiers\n}\n","import { createClassGroupUtils } from './class-group-utils'\nimport { createLruCache } from './lru-cache'\nimport { createParseClassName } from './parse-class-name'\nimport { AnyConfig } from './types'\n\nexport type ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createConfigUtils = (config: AnyConfig) => ({\n cache: createLruCache<string, string>(config.cacheSize),\n parseClassName: createParseClassName(config),\n ...createClassGroupUtils(config),\n})\n","import { ConfigUtils } from './config-utils'\nimport { IMPORTANT_MODIFIER, sortModifiers } from './parse-class-name'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\n\nexport const mergeClassList = (classList: string, configUtils: ConfigUtils) => {\n const { parseClassName, getClassGroupId, getConflictingClassGroupIds } = configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict: string[] = []\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)\n\n let result = ''\n\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index]!\n\n const { modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition } =\n parseClassName(originalClassName)\n\n let hasPostfixModifier = Boolean(maybePostfixModifierPosition)\n let classGroupId = getClassGroupId(\n hasPostfixModifier\n ? baseClassName.substring(0, maybePostfixModifierPosition)\n : baseClassName,\n )\n\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n classGroupId = getClassGroupId(baseClassName)\n\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n hasPostfixModifier = false\n }\n\n const variantModifier = sortModifiers(modifiers).join(':')\n\n const modifierId = hasImportantModifier\n ? variantModifier + IMPORTANT_MODIFIER\n : variantModifier\n\n const classId = modifierId + classGroupId\n\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue\n }\n\n classGroupsInConflict.push(classId)\n\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i]!\n classGroupsInConflict.push(modifierId + group)\n }\n\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n }\n\n return result\n}\n","/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false\ntype ClassNameArray = ClassNameValue[]\n\nexport function twJoin(...classLists: ClassNameValue[]): string\nexport function twJoin() {\n let index = 0\n let argument: ClassNameValue\n let resolvedValue: string\n let string = ''\n\n while (index < arguments.length) {\n if ((argument = arguments[index++])) {\n if ((resolvedValue = toValue(argument))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n return string\n}\n\nconst toValue = (mix: ClassNameArray | string) => {\n if (typeof mix === 'string') {\n return mix\n }\n\n let resolvedValue: string\n let string = ''\n\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((resolvedValue = toValue(mix[k] as ClassNameArray | string))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n\n return string\n}\n","import { createConfigUtils } from './config-utils'\nimport { mergeClassList } from './merge-classlist'\nimport { ClassNameValue, twJoin } from './tw-join'\nimport { AnyConfig } from './types'\n\ntype CreateConfigFirst = () => AnyConfig\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\ntype TailwindMerge = (...classLists: ClassNameValue[]) => string\ntype ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport function createTailwindMerge(\n createConfigFirst: CreateConfigFirst,\n ...createConfigRest: CreateConfigSubsequent[]\n): TailwindMerge {\n let configUtils: ConfigUtils\n let cacheGet: ConfigUtils['cache']['get']\n let cacheSet: ConfigUtils['cache']['set']\n let functionToCall = initTailwindMerge\n\n function initTailwindMerge(classList: string) {\n const config = createConfigRest.reduce(\n (previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig),\n createConfigFirst() as AnyConfig,\n )\n\n configUtils = createConfigUtils(config)\n cacheGet = configUtils.cache.get\n cacheSet = configUtils.cache.set\n functionToCall = tailwindMerge\n\n return tailwindMerge(classList)\n }\n\n function tailwindMerge(classList: string) {\n const cachedResult = cacheGet(classList)\n\n if (cachedResult) {\n return cachedResult\n }\n\n const result = mergeClassList(classList, configUtils)\n cacheSet(classList, result)\n\n return result\n }\n\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments as any))\n }\n}\n","import { DefaultThemeGroupIds, NoInfer, ThemeGetter, ThemeObject } from './types'\n\nexport const fromTheme = <\n AdditionalThemeGroupIds extends string = never,\n DefaultThemeGroupIdsInner extends string = DefaultThemeGroupIds,\n>(key: NoInfer<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>): ThemeGetter => {\n const themeGetter = (theme: ThemeObject<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>) =>\n theme[key] || []\n\n themeGetter.isThemeGetter = true as const\n\n return themeGetter\n}\n","const arbitraryValueRegex = /^\\[(?:([a-z-]+):)?(.+)\\]$/i\nconst fractionRegex = /^\\d+\\/\\d+$/\nconst stringLengths = new Set(['px', 'full', 'screen'])\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/\nconst lengthUnitRegex =\n /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch))\\(.+\\)$/\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/\nconst imageRegex =\n /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/\n\nexport const isLength = (value: string) =>\n isNumber(value) || stringLengths.has(value) || fractionRegex.test(value)\n\nexport const isArbitraryLength = (value: string) =>\n getIsArbitraryValue(value, 'length', isLengthOnly)\n\nexport const isNumber = (value: string) => Boolean(value) && !Number.isNaN(Number(value))\n\nexport const isArbitraryNumber = (value: string) => getIsArbitraryValue(value, 'number', isNumber)\n\nexport const isInteger = (value: string) => Boolean(value) && Number.isInteger(Number(value))\n\nexport const isPercent = (value: string) => value.endsWith('%') && isNumber(value.slice(0, -1))\n\nexport const isArbitraryValue = (value: string) => arbitraryValueRegex.test(value)\n\nexport const isTshirtSize = (value: string) => tshirtUnitRegex.test(value)\n\nconst sizeLabels = new Set(['length', 'size', 'percentage'])\n\nexport const isArbitrarySize = (value: string) => getIsArbitraryValue(value, sizeLabels, isNever)\n\nexport const isArbitraryPosition = (value: string) =>\n getIsArbitraryValue(value, 'position', isNever)\n\nconst imageLabels = new Set(['image', 'url'])\n\nexport const isArbitraryImage = (value: string) => getIsArbitraryValue(value, imageLabels, isImage)\n\nexport const isArbitraryShadow = (value: string) => getIsArbitraryValue(value, '', isShadow)\n\nexport const isAny = () => true\n\nconst getIsArbitraryValue = (\n value: string,\n label: string | Set<string>,\n testValue: (value: string) => boolean,\n) => {\n const result = arbitraryValueRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return typeof label === 'string' ? result[1] === label : label.has(result[1])\n }\n\n return testValue(result[2]!)\n }\n\n return false\n}\n\nconst isLengthOnly = (value: string) =>\n // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n // For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\n lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)\n\nconst isNever = () => false\n\nconst isShadow = (value: string) => shadowRegex.test(value)\n\nconst isImage = (value: string) => imageRegex.test(value)\n","import { fromTheme } from './from-theme'\nimport { Config, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\nimport {\n isAny,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isInteger,\n isLength,\n isNumber,\n isPercent,\n isTshirtSize,\n} from './validators'\n\nexport const getDefaultConfig = () => {\n const colors = fromTheme('colors')\n const spacing = fromTheme('spacing')\n const blur = fromTheme('blur')\n const brightness = fromTheme('brightness')\n const borderColor = fromTheme('borderColor')\n const borderRadius = fromTheme('borderRadius')\n const borderSpacing = fromTheme('borderSpacing')\n const borderWidth = fromTheme('borderWidth')\n const contrast = fromTheme('contrast')\n const grayscale = fromTheme('grayscale')\n const hueRotate = fromTheme('hueRotate')\n const invert = fromTheme('invert')\n const gap = fromTheme('gap')\n const gradientColorStops = fromTheme('gradientColorStops')\n const gradientColorStopPositions = fromTheme('gradientColorStopPositions')\n const inset = fromTheme('inset')\n const margin = fromTheme('margin')\n const opacity = fromTheme('opacity')\n const padding = fromTheme('padding')\n const saturate = fromTheme('saturate')\n const scale = fromTheme('scale')\n const sepia = fromTheme('sepia')\n const skew = fromTheme('skew')\n const space = fromTheme('space')\n const translate = fromTheme('translate')\n\n const getOverscroll = () => ['auto', 'contain', 'none'] as const\n const getOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'] as const\n const getSpacingWithAutoAndArbitrary = () => ['auto', isArbitraryValue, spacing] as const\n const getSpacingWithArbitrary = () => [isArbitraryValue, spacing] as const\n const getLengthWithEmptyAndArbitrary = () => ['', isLength, isArbitraryLength] as const\n const getNumberWithAutoAndArbitrary = () => ['auto', isNumber, isArbitraryValue] as const\n const getPositions = () =>\n [\n 'bottom',\n 'center',\n 'left',\n 'left-bottom',\n 'left-top',\n 'right',\n 'right-bottom',\n 'right-top',\n 'top',\n ] as const\n const getLineStyles = () => ['solid', 'dashed', 'dotted', 'double', 'none'] as const\n const getBlendModes = () =>\n [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ] as const\n const getAlign = () =>\n ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch'] as const\n const getZeroAndEmpty = () => ['', '0', isArbitraryValue] as const\n const getBreaks = () =>\n ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'] as const\n const getNumberAndArbitrary = () => [isNumber, isArbitraryValue]\n\n return {\n cacheSize: 500,\n separator: ':',\n theme: {\n colors: [isAny],\n spacing: [isLength, isArbitraryLength],\n blur: ['none', '', isTshirtSize, isArbitraryValue],\n brightness: getNumberAndArbitrary(),\n borderColor: [colors],\n borderRadius: ['none', '', 'full', isTshirtSize, isArbitraryValue],\n borderSpacing: getSpacingWithArbitrary(),\n borderWidth: getLengthWithEmptyAndArbitrary(),\n contrast: getNumberAndArbitrary(),\n grayscale: getZeroAndEmpty(),\n hueRotate: getNumberAndArbitrary(),\n invert: getZeroAndEmpty(),\n gap: getSpacingWithArbitrary(),\n gradientColorStops: [colors],\n gradientColorStopPositions: [isPercent, isArbitraryLength],\n inset: getSpacingWithAutoAndArbitrary(),\n margin: getSpacingWithAutoAndArbitrary(),\n opacity: getNumberAndArbitrary(),\n padding: getSpacingWithArbitrary(),\n saturate: getNumberAndArbitrary(),\n scale: getNumberAndArbitrary(),\n sepia: getZeroAndEmpty(),\n skew: getNumberAndArbitrary(),\n space: getSpacingWithArbitrary(),\n translate: getSpacingWithArbitrary(),\n },\n classGroups: {\n // Layout\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{ aspect: ['auto', 'square', 'video', isArbitraryValue] }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{ columns: [isTshirtSize] }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{ 'break-after': getBreaks() }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{ 'break-before': getBreaks() }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{ 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column'] }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{ 'box-decoration': ['slice', 'clone'] }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{ box: ['border', 'content'] }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: [\n 'block',\n 'inline-block',\n 'inline',\n 'flex',\n 'inline-flex',\n 'table',\n 'inline-table',\n 'table-caption',\n 'table-cell',\n 'table-column',\n 'table-column-group',\n 'table-footer-group',\n 'table-header-group',\n 'table-row-group',\n 'table-row',\n 'flow-root',\n 'grid',\n 'inline-grid',\n 'contents',\n 'list-item',\n 'hidden',\n ],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{ float: ['right', 'left', 'none', 'start', 'end'] }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{ clear: ['left', 'right', 'both', 'none', 'start', 'end'] }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{ object: ['contain', 'cover', 'fill', 'none', 'scale-down'] }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{ object: [...getPositions(), isArbitraryValue] }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{ overflow: getOverflow() }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{ 'overflow-x': getOverflow() }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{ 'overflow-y': getOverflow() }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{ overscroll: getOverscroll() }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{ 'overscroll-x': getOverscroll() }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{ 'overscroll-y': getOverscroll() }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{ inset: [inset] }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{ 'inset-x': [inset] }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{ 'inset-y': [inset] }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{ start: [inset] }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{ end: [inset] }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{ top: [inset] }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{ right: [inset] }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{ bottom: [inset] }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{ left: [inset] }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{ z: ['auto', isInteger, isArbitraryValue] }],\n // Flexbox and Grid\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{ basis: getSpacingWithAutoAndArbitrary() }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{ flex: ['row', 'row-reverse', 'col', 'col-reverse'] }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{ flex: ['wrap', 'wrap-reverse', 'nowrap'] }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{ flex: ['1', 'auto', 'initial', 'none', isArbitraryValue] }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{ grow: getZeroAndEmpty() }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{ shrink: getZeroAndEmpty() }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{ order: ['first', 'last', 'none', isInteger, isArbitraryValue] }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{ 'grid-cols': [isAny] }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [\n {\n col: [\n 'auto',\n { span: ['full', isInteger, isArbitraryValue] },\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{ 'col-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{ 'col-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{ 'grid-rows': [isAny] }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [\n { row: ['auto', { span: [isInteger, isArbitraryValue] }, isArbitraryValue] },\n ],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{ 'row-start': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{ 'row-end': getNumberWithAutoAndArbitrary() }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{ 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense'] }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{ 'auto-cols': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{ 'auto-rows': ['auto', 'min', 'max', 'fr', isArbitraryValue] }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{ gap: [gap] }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{ 'gap-x': [gap] }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{ 'gap-y': [gap] }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{ justify: ['normal', ...getAlign()] }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{ 'justify-items': ['start', 'end', 'center', 'stretch'] }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{ 'justify-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{ content: ['normal', ...getAlign(), 'baseline'] }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{ items: ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{ self: ['auto', 'start', 'end', 'center', 'stretch', 'baseline'] }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{ 'place-content': [...getAlign(), 'baseline'] }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{ 'place-items': ['start', 'end', 'center', 'baseline', 'stretch'] }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{ 'place-self': ['auto', 'start', 'end', 'center', 'stretch'] }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{ p: [padding] }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{ px: [padding] }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{ py: [padding] }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{ ps: [padding] }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{ pe: [padding] }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{ pt: [padding] }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{ pr: [padding] }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{ pb: [padding] }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{ pl: [padding] }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{ m: [margin] }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{ mx: [margin] }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{ my: [margin] }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{ ms: [margin] }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{ me: [margin] }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{ mt: [margin] }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{ mr: [margin] }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{ mb: [margin] }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{ ml: [margin] }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x': [{ 'space-x': [space] }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y': [{ 'space-y': [space] }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y-reverse': ['space-y-reverse'],\n // Sizing\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [\n {\n w: [\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svw',\n 'lvw',\n 'dvw',\n isArbitraryValue,\n spacing,\n ],\n },\n ],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{ 'min-w': [isArbitraryValue, spacing, 'min', 'max', 'fit'] }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [\n {\n 'max-w': [\n isArbitraryValue,\n spacing,\n 'none',\n 'full',\n 'min',\n 'max',\n 'fit',\n 'prose',\n { screen: [isTshirtSize] },\n isTshirtSize,\n ],\n },\n ],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [\n {\n h: [\n isArbitraryValue,\n spacing,\n 'auto',\n 'min',\n 'max',\n 'fit',\n 'svh',\n 'lvh',\n 'dvh',\n ],\n },\n ],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [\n { 'min-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [\n { 'max-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh'] },\n ],\n /**\n * Size\n * @see https://tailwindcss.com/docs/size\n */\n size: [{ size: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit'] }],\n // Typography\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{ text: ['base', isTshirtSize, isArbitraryLength] }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [\n {\n font: [\n 'thin',\n 'extralight',\n 'light',\n 'normal',\n 'medium',\n 'semibold',\n 'bold',\n 'extrabold',\n 'black',\n isArbitraryNumber,\n ],\n },\n ],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{ font: [isAny] }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [\n {\n tracking: [\n 'tighter',\n 'tight',\n 'normal',\n 'wide',\n 'wider',\n 'widest',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{ 'line-clamp': ['none', isNumber, isArbitraryNumber] }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [\n {\n leading: [\n 'none',\n 'tight',\n 'snug',\n 'normal',\n 'relaxed',\n 'loose',\n isLength,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{ 'list-image': ['none', isArbitraryValue] }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{ list: ['none', 'disc', 'decimal', isArbitraryValue] }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{ list: ['inside', 'outside'] }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{ placeholder: [colors] }],\n /**\n * Placeholder Opacity\n * @see https://tailwindcss.com/docs/placeholder-opacity\n */\n 'placeholder-opacity': [{ 'placeholder-opacity': [opacity] }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{ text: ['left', 'center', 'right', 'justify', 'start', 'end'] }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{ text: [colors] }],\n /**\n * Text Opacity\n * @see https://tailwindcss.com/docs/text-opacity\n */\n 'text-opacity': [{ 'text-opacity': [opacity] }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{ decoration: [...getLineStyles(), 'wavy'] }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [\n { decoration: ['auto', 'from-font', isLength, isArbitraryLength] },\n ],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{ 'underline-offset': ['auto', isLength, isArbitraryValue] }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{ decoration: [colors] }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{ text: ['wrap', 'nowrap', 'balance', 'pretty'] }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{ indent: getSpacingWithArbitrary() }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [\n {\n align: [\n 'baseline',\n 'top',\n 'middle',\n 'bottom',\n 'text-top',\n 'text-bottom',\n 'sub',\n 'super',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [\n { whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces'] },\n ],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{ break: ['normal', 'words', 'all', 'keep'] }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{ hyphens: ['none', 'manual', 'auto'] }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{ content: ['none', isArbitraryValue] }],\n // Backgrounds\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{ bg: ['fixed', 'local', 'scroll'] }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{ 'bg-clip': ['border', 'padding', 'content', 'text'] }],\n /**\n * Background Opacity\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/background-opacity\n */\n 'bg-opacity': [{ 'bg-opacity': [opacity] }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{ 'bg-origin': ['border', 'padding', 'content'] }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{ bg: [...getPositions(), isArbitraryPosition] }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{ bg: ['no-repeat', { repeat: ['', 'x', 'y', 'round', 'space'] }] }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{ bg: ['auto', 'cover', 'contain', isArbitrarySize] }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [\n {\n bg: [\n 'none',\n { 'gradient-to': ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl'] },\n isArbitraryImage,\n ],\n },\n ],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{ bg: [colors] }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{ from: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{ via: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{ to: [gradientColorStopPositions] }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{ from: [gradientColorStops] }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{ via: [gradientColorStops] }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{ to: [gradientColorStops] }],\n // Borders\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{ rounded: [borderRadius] }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{ 'rounded-s': [borderRadius] }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{ 'rounded-e': [borderRadius] }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{ 'rounded-t': [borderRadius] }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{ 'rounded-r': [borderRadius] }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{ 'rounded-b': [borderRadius] }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{ 'rounded-l': [borderRadius] }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{ 'rounded-ss': [borderRadius] }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{ 'rounded-se': [borderRadius] }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{ 'rounded-ee': [borderRadius] }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{ 'rounded-es': [borderRadius] }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{ 'rounded-tl': [borderRadius] }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{ 'rounded-tr': [borderRadius] }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{ 'rounded-br': [borderRadius] }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{ 'rounded-bl': [borderRadius] }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{ border: [borderWidth] }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{ 'border-x': [borderWidth] }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{ 'border-y': [borderWidth] }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{ 'border-s': [borderWidth] }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{ 'border-e': [borderWidth] }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{ 'border-t': [borderWidth] }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{ 'border-r': [borderWidth] }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{ 'border-b': [borderWidth] }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{ 'border-l': [borderWidth] }],\n /**\n * Border Opacity\n * @see https://tailwindcss.com/docs/border-opacity\n */\n 'border-opacity': [{ 'border-opacity': [opacity] }],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{ border: [...getLineStyles(), 'hidden'] }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x': [{ 'divide-x': [borderWidth] }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y': [{ 'divide-y': [borderWidth] }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Divide Opacity\n * @see https://tailwindcss.com/docs/divide-opacity\n */\n 'divide-opacity': [{ 'divide-opacity': [opacity] }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/divide-style\n */\n 'divide-style': [{ divide: getLineStyles() }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{ border: [borderColor] }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{ 'border-x': [borderColor] }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{ 'border-y': [borderColor] }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{ 'border-s': [borderColor] }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{ 'border-e': [borderColor] }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{ 'border-t': [borderColor] }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{ 'border-r': [borderColor] }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{ 'border-b': [borderColor] }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{ 'border-l': [borderColor] }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{ divide: [borderColor] }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{ outline: ['', ...getLineStyles()] }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{ 'outline-offset': [isLength, isArbitraryValue] }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{ outline: [isLength, isArbitraryLength] }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{ outline: [colors] }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w': [{ ring: getLengthWithEmptyAndArbitrary() }],\n /**\n * Ring Width Inset\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/ring-color\n */\n 'ring-color': [{ ring: [colors] }],\n /**\n * Ring Opacity\n * @see https://tailwindcss.com/docs/ring-opacity\n */\n 'ring-opacity': [{ 'ring-opacity': [opacity] }],\n /**\n * Ring Offset Width\n * @see https://tailwindcss.com/docs/ring-offset-width\n */\n 'ring-offset-w': [{ 'ring-offset': [isLength, isArbitraryLength] }],\n /**\n * Ring Offset Color\n * @see https://tailwindcss.com/docs/ring-offset-color\n */\n 'ring-offset-color': [{ 'ring-offset': [colors] }],\n // Effects\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{ shadow: ['', 'inner', 'none', isTshirtSize, isArbitraryShadow] }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow-color\n */\n 'shadow-color': [{ shadow: [isAny] }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{ opacity: [opacity] }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{ 'mix-blend': [...getBlendModes(), 'plus-lighter', 'plus-darker'] }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{ 'bg-blend': getBlendModes() }],\n // Filters\n /**\n * Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{ filter: ['', 'none'] }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{ blur: [blur] }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{ brightness: [brightness] }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{ contrast: [contrast] }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{ 'drop-shadow': ['', 'none', isTshirtSize, isArbitraryValue] }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{ grayscale: [grayscale] }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{ 'hue-rotate': [hueRotate] }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{ invert: [invert] }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{ saturate: [saturate] }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{ sepia: [sepia] }],\n /**\n * Backdrop Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{ 'backdrop-filter': ['', 'none'] }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{ 'backdrop-blur': [blur] }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{ 'backdrop-brightness': [brightness] }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{ 'backdrop-contrast': [contrast] }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{ 'backdrop-grayscale': [grayscale] }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{ 'backdrop-hue-rotate': [hueRotate] }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{ 'backdrop-invert': [invert] }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{ 'backdrop-opacity': [opacity] }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{ 'backdrop-saturate': [saturate] }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{ 'backdrop-sepia': [sepia] }],\n // Tables\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{ border: ['collapse', 'separate'] }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{ 'border-spacing': [borderSpacing] }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{ 'border-spacing-x': [borderSpacing] }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{ 'border-spacing-y': [borderSpacing] }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{ table: ['auto', 'fixed'] }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{ caption: ['top', 'bottom'] }],\n // Transitions and Animation\n /**\n * Tranisition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [\n {\n transition: [\n 'none',\n 'all',\n '',\n 'colors',\n 'opacity',\n 'shadow',\n 'transform',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{ duration: getNumberAndArbitrary() }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{ ease: ['linear', 'in', 'out', 'in-out', isArbitraryValue] }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{ delay: getNumberAndArbitrary() }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{ animate: ['none', 'spin', 'ping', 'pulse', 'bounce', isArbitraryValue] }],\n // Transforms\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{ transform: ['', 'gpu', 'none'] }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{ scale: [scale] }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{ 'scale-x': [scale] }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{ 'scale-y': [scale] }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{ rotate: [isInteger, isArbitraryValue] }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{ 'translate-x': [translate] }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{ 'translate-y': [translate] }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{ 'skew-x': [skew] }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{ 'skew-y': [skew] }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [\n {\n origin: [\n 'center',\n 'top',\n 'top-right',\n 'right',\n 'bottom-right',\n 'bottom',\n 'bottom-left',\n 'left',\n 'top-left',\n isArbitraryValue,\n ],\n },\n ],\n // Interactivity\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{ accent: ['auto', colors] }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{ appearance: ['none', 'auto'] }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [\n {\n cursor: [\n 'auto',\n 'default',\n 'pointer',\n 'wait',\n 'text',\n 'move',\n 'help',\n 'not-allowed',\n 'none',\n 'context-menu',\n 'progress',\n 'cell',\n 'crosshair',\n 'vertical-text',\n 'alias',\n 'copy',\n 'no-drop',\n 'grab',\n 'grabbing',\n 'all-scroll',\n 'col-resize',\n 'row-resize',\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n 'ew-resize',\n 'ns-resize',\n 'nesw-resize',\n 'nwse-resize',\n 'zoom-in',\n 'zoom-out',\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{ caret: [colors] }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{ 'pointer-events': ['none', 'auto'] }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{ resize: ['none', 'y', 'x', ''] }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{ scroll: ['auto', 'smooth'] }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{ 'scroll-m': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{ 'scroll-mx': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{ 'scroll-my': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{ 'scroll-ms': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{ 'scroll-me': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{ 'scroll-mt': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{ 'scroll-mr': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{ 'scroll-mb': getSpacingWithArbitrary() }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{ 'scroll-ml': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{ 'scroll-p': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{ 'scroll-px': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{ 'scroll-py': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{ 'scroll-ps': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{ 'scroll-pe': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{ 'scroll-pt': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{ 'scroll-pr': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{ 'scroll-pb': getSpacingWithArbitrary() }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{ 'scroll-pl': getSpacingWithArbitrary() }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{ snap: ['start', 'end', 'center', 'align-none'] }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{ snap: ['normal', 'always'] }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{ snap: ['none', 'x', 'y', 'both'] }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{ snap: ['mandatory', 'proximity'] }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [\n {\n touch: ['auto', 'none', 'manipulation'],\n },\n ],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [\n {\n 'touch-pan': ['x', 'left', 'right'],\n },\n ],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [\n {\n 'touch-pan': ['y', 'up', 'down'],\n },\n ],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{ select: ['none', 'text', 'all', 'auto'] }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [\n { 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryValue] },\n ],\n // SVG\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{ fill: [colors, 'none'] }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{ stroke: [isLength, isArbitraryLength, isArbitraryNumber] }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{ stroke: [colors, 'none'] }],\n // Accessibility\n /**\n * Screen Readers\n * @see https://tailwindcss.com/docs/screen-readers\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{ 'forced-color-adjust': ['auto', 'none'] }],\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': [\n 'fvn-ordinal',\n 'fvn-slashed-zero',\n 'fvn-figure',\n 'fvn-spacing',\n 'fvn-fraction',\n ],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: [\n 'rounded-s',\n 'rounded-e',\n 'rounded-t',\n 'rounded-r',\n 'rounded-b',\n 'rounded-l',\n 'rounded-ss',\n 'rounded-se',\n 'rounded-ee',\n 'rounded-es',\n 'rounded-tl',\n 'rounded-tr',\n 'rounded-br',\n 'rounded-bl',\n ],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': [\n 'border-w-s',\n 'border-w-e',\n 'border-w-t',\n 'border-w-r',\n 'border-w-b',\n 'border-w-l',\n ],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': [\n 'border-color-s',\n 'border-color-e',\n 'border-color-t',\n 'border-color-r',\n 'border-color-b',\n 'border-color-l',\n ],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n 'scroll-m': [\n 'scroll-mx',\n 'scroll-my',\n 'scroll-ms',\n 'scroll-me',\n 'scroll-mt',\n 'scroll-mr',\n 'scroll-mb',\n 'scroll-ml',\n ],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': [\n 'scroll-px',\n 'scroll-py',\n 'scroll-ps',\n 'scroll-pe',\n 'scroll-pt',\n 'scroll-pr',\n 'scroll-pb',\n 'scroll-pl',\n ],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch'],\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading'],\n },\n } as const satisfies Config<DefaultClassGroupIds, DefaultThemeGroupIds>\n}\n","import { AnyConfig, ConfigExtension } from './types'\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nexport const mergeConfigs = <ClassGroupIds extends string, ThemeGroupIds extends string = never>(\n baseConfig: AnyConfig,\n {\n cacheSize,\n prefix,\n separator,\n experimentalParseClassName,\n extend = {},\n override = {},\n }: ConfigExtension<ClassGroupIds, ThemeGroupIds>,\n) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize)\n overrideProperty(baseConfig, 'prefix', prefix)\n overrideProperty(baseConfig, 'separator', separator)\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName)\n\n for (const configKey in override) {\n overrideConfigProperties(\n baseConfig[configKey as keyof typeof override],\n override[configKey as keyof typeof override],\n )\n }\n\n for (const key in extend) {\n mergeConfigProperties(\n baseConfig[key as keyof typeof extend],\n extend[key as keyof typeof extend],\n )\n }\n\n return baseConfig\n}\n\nconst overrideProperty = <T extends object, K extends keyof T>(\n baseObject: T,\n overrideKey: K,\n overrideValue: T[K] | undefined,\n) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue\n }\n}\n\nconst overrideConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n overrideObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key])\n }\n }\n}\n\nconst mergeConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n mergeObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n const mergeValue = mergeObject[key]\n\n if (mergeValue !== undefined) {\n baseObject[key] = (baseObject[key] || []).concat(mergeValue)\n }\n }\n }\n}\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\nimport { mergeConfigs } from './merge-configs'\nimport { AnyConfig, ConfigExtension, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\n\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\n\nexport const extendTailwindMerge = <\n AdditionalClassGroupIds extends string = never,\n AdditionalThemeGroupIds extends string = never,\n>(\n configExtension:\n | ConfigExtension<\n DefaultClassGroupIds | AdditionalClassGroupIds,\n DefaultThemeGroupIds | AdditionalThemeGroupIds\n >\n | CreateConfigSubsequent,\n ...createConfig: CreateConfigSubsequent[]\n) =>\n typeof configExtension === 'function'\n ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig)\n : createTailwindMerge(\n () => mergeConfigs(getDefaultConfig(), configExtension),\n ...createConfig,\n )\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\n\nexport const twMerge = createTailwindMerge(getDefaultConfig)\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Utility function to merge class names with Tailwind CSS classes\n * Uses clsx for conditional classes and tailwind-merge to handle conflicts\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6CpB,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqKnB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;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":["useState","useCallback","useEffect","useState","jsx","jsxs","useEffect","useState","useRef","useCallback","useRef","jsx","useState","useRef","useCallback","useEffect","handleChange","loadPackageTypes","jsx","jsxs","useState","useRef","useState","useEffect","useCallback","jsx","jsxs","useRef","useState","useCallback","useEffect","jsx","jsxs","useState","useCallback","useEffect","useState","useCallback","useEffect","jsx","jsxs","useState","useCallback","useEffect","useState","useCallback","useEffect","createEvent","jsx","jsxs","useState","useCallback","createEvent","result","useEffect","useState","useCallback","useEffect","tryCatchAsync","startFlow","jsx","jsxs","useState","useCallback","tryCatchAsync","startFlow","useEffect","useState","useCallback","useState","useEffect","useRef","useCallback","jsx","jsx","useState","useRef","useEffect","useCallback","useState","useMemo","jsx","jsx","jsx","useMemo","useState","useState","useEffect","startFlow","jsx","useState","useEffect","startFlow","jsx","jsxs","useState","useCallback","useState","useEffect","useCallback","tryCatchAsync","jsx","jsxs","useState","useCallback","tryCatchAsync","useEffect","useState","useMemo","useCallback","useEffect","useState","useMemo","useState","useCallback","useRef","useState","useRef","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","Fragment","jsx","jsxs","useState","useEffect","useRef","jsx","jsx","jsxs","useState","useRef","useEffect","jsx","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useState","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","path","value","jsx","jsxs","jsx","jsxs","isString","isValueConfig","jsx","jsxs","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","Fragment","jsx","Fragment","jsx","jsxs","HELP_SECTIONS","Fragment","jsx","jsxs","HELP_SECTIONS","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useState","useMemo","jsx","jsxs","jsx","jsxs","useState","useMemo","value","useState","jsx","jsxs","useState","value","jsx","jsxs","useCallback","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","useState","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","useEffect","value","React","useState","useEffect","Fragment","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","React","useEffect","useState","jsx","jsxs","getPropertyStatus","jsx","jsxs","useState","value","jsx","jsx","jsxs","DEFAULT_CONDITION","jsx","jsx","jsxs","DEFAULT_FN","jsx","jsx","jsxs","jsx","jsx","jsxs","DEFAULT_VALIDATE","jsx","useState","useEffect","useRef","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","useState","useEffect","useRef","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsx","useState","useEffect","useRef","jsx","jsxs","jsx","jsxs","entries","useState","useRef","useEffect","useState","useEffect","useRef","jsx","jsxs","jsx","jsxs","entries","useState","useRef","useEffect","useState","useEffect","useRef","jsx","jsxs","source","transform","useState","useRef","useEffect","jsx","jsx","jsxs","useCallback","jsx","useState","useRef","useEffect","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","isNumber","jsx","jsxs","jsx","jsxs","getSchemaForPath","jsx","jsxs","formatValue","capitalize","Fragment","jsx","jsxs","useState","useMemo","useEffect","jsx","useState","useMemo","useCallback","jsx","useState","useEffect","prettier","prettierBabel","prettierEstree","prettierTypescript","prettierHtml","jsx","format","useState","useEffect","useState","jsx","jsxs","jsx","jsx","jsxs","React","jsx","jsx","MDXProvider","CLASS_PART_SEPARATOR","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getClassGroupId","className","classParts","split","length","shift","getGroupRecursive","getGroupIdForArbitraryProperty","getConflictingClassGroupIds","classGroupId","hasPostfixModifier","conflicts","classPartObject","currentClassPart","nextClassPartObject","nextPart","get","classGroupFromNextClassPart","slice","undefined","validators","classRest","join","find","validator","arbitraryPropertyRegex","test","arbitraryPropertyClassName","exec","property","substring","indexOf","theme","prefix","Map","prefixedClassGroupEntries","getPrefixedClassGroupEntries","Object","entries","classGroups","forEach","classGroup","processClassesRecursively","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","push","key","path","currentClassPartObject","pathPart","has","set","func","classGroupEntries","map","prefixedClassGroup","fromEntries","value","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","createParseClassName","separator","experimentalParseClassName","isSeparatorSingleCharacter","firstSeparatorCharacter","separatorLength","parseClassName","modifiers","bracketDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","hasImportantModifier","startsWith","baseClassName","maybePostfixModifierPosition","sortModifiers","sortedModifiers","unsortedModifiers","modifier","isArbitraryVariant","sort","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","classGroupsInConflict","classNames","trim","result","originalClassName","Boolean","variantModifier","modifierId","classId","includes","conflictGroups","i","group","twJoin","argument","resolvedValue","string","arguments","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","reduce","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","callTailwindMerge","apply","fromTheme","themeGetter","arbitraryValueRegex","fractionRegex","stringLengths","Set","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isLength","isNumber","isArbitraryLength","getIsArbitraryValue","isLengthOnly","Number","isNaN","isArbitraryNumber","isInteger","isPercent","endsWith","isArbitraryValue","isTshirtSize","sizeLabels","isArbitrarySize","isNever","isArbitraryPosition","imageLabels","isArbitraryImage","isImage","isArbitraryShadow","isShadow","isAny","label","testValue","getDefaultConfig","colors","fromTheme","spacing","blur","brightness","borderColor","borderRadius","borderSpacing","borderWidth","contrast","grayscale","hueRotate","invert","gap","gradientColorStops","gradientColorStopPositions","inset","margin","opacity","padding","saturate","scale","sepia","skew","space","translate","getOverscroll","getOverflow","getSpacingWithAutoAndArbitrary","isArbitraryValue","getSpacingWithArbitrary","getLengthWithEmptyAndArbitrary","isLength","isArbitraryLength","getNumberWithAutoAndArbitrary","isNumber","getPositions","getLineStyles","getBlendModes","getAlign","getZeroAndEmpty","getBreaks","getNumberAndArbitrary","cacheSize","separator","theme","isAny","isTshirtSize","isPercent","classGroups","aspect","container","columns","box","display","float","clear","isolation","object","overflow","overscroll","position","start","end","top","right","bottom","left","visibility","z","isInteger","basis","flex","grow","shrink","order","col","span","row","justify","content","items","self","p","px","py","ps","pe","pt","pr","pb","pl","m","mx","my","ms","me","mt","mr","mb","ml","w","screen","h","size","text","font","isArbitraryNumber","tracking","leading","list","placeholder","decoration","indent","align","whitespace","break","hyphens","bg","isArbitraryPosition","repeat","isArbitrarySize","isArbitraryImage","from","via","to","rounded","border","divide","outline","ring","shadow","isArbitraryShadow","filter","table","caption","transition","duration","ease","delay","animate","transform","rotate","origin","accent","appearance","cursor","caret","resize","scroll","snap","touch","select","fill","stroke","sr","conflictingClassGroups","conflictingClassGroupModifiers","twMerge","createTailwindMerge","getDefaultConfig"]}
|