@deckedout/visual-editor 1.0.2 → 1.0.5
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/README.md +52 -0
- package/dist/index.js +161 -195
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +161 -212
- package/dist/index.mjs.map +1 -1
- package/package.json +41 -3
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/editorUtils.ts","../src/core/VisualEditor.tsx","../src/core/useEditorState.ts","../src/core/ElementRegistry.ts","../src/elements/TextElement.tsx","../src/utils/snapping.ts","../src/elements/ImageElement.tsx","../src/elements/index.ts","../src/components/Inspector.tsx","../src/ui/input.tsx","../src/lib/utils.ts","../src/ui/label.tsx","../src/ui/slider.tsx","../src/ui/separator.tsx","../src/ui/select.tsx","../src/ui/textarea.tsx","../src/ui/checkbox.tsx","../src/components/LayersPanel.tsx","../src/ui/badge.tsx","../src/ui/scroll-area.tsx","../src/ui/general/TooltipButton.tsx","../src/ui/button.tsx","../src/ui/tooltip.tsx","../src/ui/general/TooltipWrapper.tsx","../src/components/VisualEditorWorkspace.tsx","../src/components/Topbar.tsx","../src/ui/switch.tsx","../src/components/CustomActionRenderer.tsx","../src/components/Canvas.tsx","../src/components/SnapGuides.tsx","../src/components/CentralizedTransformer.tsx","../src/components/Toolbar.tsx","../src/components/AssetPicker.tsx","../src/index.ts"],"sourcesContent":["/**\n * Visual Editor - Utility Functions\n *\n * Common utility functions used throughout the visual editor.\n */\n\nimport { EditorElement, CanvasExport } from \"../types\";\nimport { v4 as uuidv4 } from \"uuid\";\n\n/**\n * Generate a unique ID for an element\n */\nexport const generateElementId = (): string => {\n return `element-${uuidv4()}`;\n};\n\n/**\n * Create a new element with default values\n */\nexport const createElement = <TProps = any>(\n type: string,\n props: TProps,\n options?: {\n position?: { x: number; y: number };\n size?: { width: number; height: number };\n rotation?: number;\n opacity?: number;\n zIndex?: number;\n visible?: boolean;\n locked?: boolean;\n displayName?: string;\n }\n): EditorElement<TProps> => {\n return {\n id: generateElementId(),\n type,\n position: options?.position || { x: 0, y: 0 },\n size: options?.size || { width: 100, height: 100 },\n rotation: options?.rotation || 0,\n opacity: options?.opacity ?? 1,\n zIndex: options?.zIndex || 0,\n visible: options?.visible ?? true,\n locked: options?.locked ?? false,\n displayName: options?.displayName,\n props,\n };\n};\n\n/**\n * Deep clone an element\n */\nexport const cloneElement = <TProps = any>(\n element: EditorElement<TProps>\n): EditorElement<TProps> => {\n return {\n ...element,\n id: generateElementId(), // New ID for the clone\n props: { ...element.props },\n position: { ...element.position },\n size: { ...element.size },\n };\n};\n\n/**\n * Duplicate an element with a slight offset\n */\nexport const duplicateElement = <TProps = any>(\n element: EditorElement<TProps>,\n offset: { x: number; y: number } = { x: 20, y: 20 }\n): EditorElement<TProps> => {\n const cloned = cloneElement(element);\n return {\n ...cloned,\n position: {\n x: element.position.x + offset.x,\n y: element.position.y + offset.y,\n },\n zIndex: element.zIndex + 1, // Place on top\n };\n};\n\n/**\n * Sort elements by z-index (ascending)\n */\nexport const sortByZIndex = (elements: EditorElement[]): EditorElement[] => {\n return [...elements].sort((a, b) => a.zIndex - b.zIndex);\n};\n\n/**\n * Get the highest z-index among elements\n */\nexport const getMaxZIndex = (elements: EditorElement[]): number => {\n if (elements.length === 0) return 0;\n return Math.max(...elements.map((el) => el.zIndex));\n};\n\n/**\n * Bring an element to front\n */\nexport const bringToFront = (elements: EditorElement[], elementId: string): EditorElement[] => {\n const maxZ = getMaxZIndex(elements);\n return elements.map((el) => (el.id === elementId ? { ...el, zIndex: maxZ + 1 } : el));\n};\n\n/**\n * Send an element to back\n */\nexport const sendToBack = (elements: EditorElement[], elementId: string): EditorElement[] => {\n const minZ = Math.min(...elements.map((el) => el.zIndex));\n return elements.map((el) => (el.id === elementId ? { ...el, zIndex: minZ - 1 } : el));\n};\n\n/**\n * Check if two rectangles overlap\n */\nexport const checkOverlap = (\n rect1: { x: number; y: number; width: number; height: number },\n rect2: { x: number; y: number; width: number; height: number }\n): boolean => {\n return !(\n rect1.x + rect1.width < rect2.x ||\n rect2.x + rect2.width < rect1.x ||\n rect1.y + rect1.height < rect2.y ||\n rect2.y + rect2.height < rect1.y\n );\n};\n\n/**\n * Check if a point is inside a rectangle\n */\nexport const pointInRect = (\n point: { x: number; y: number },\n rect: { x: number; y: number; width: number; height: number }\n): boolean => {\n return (\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height\n );\n};\n\n/**\n * Snap a value to grid\n */\nexport const snapToGrid = (value: number, gridSize: number): number => {\n return Math.round(value / gridSize) * gridSize;\n};\n\n/**\n * Snap position to grid\n */\nexport const snapPositionToGrid = (\n position: { x: number; y: number },\n gridSize: number\n): { x: number; y: number } => {\n return {\n x: snapToGrid(position.x, gridSize),\n y: snapToGrid(position.y, gridSize),\n };\n};\n\n/**\n * Constrain a value between min and max\n */\nexport const clamp = (value: number, min: number, max: number): number => {\n return Math.min(Math.max(value, min), max);\n};\n\n/**\n * Constrain position within canvas bounds\n */\nexport const constrainToCanvas = (\n position: { x: number; y: number },\n size: { width: number; height: number },\n canvasSize: { width: number; height: number }\n): { x: number; y: number } => {\n return {\n x: clamp(position.x, 0, canvasSize.width - size.width),\n y: clamp(position.y, 0, canvasSize.height - size.height),\n };\n};\n\n/**\n * Calculate bounding box for rotated rectangle\n */\nexport const getRotatedBoundingBox = (\n x: number,\n y: number,\n width: number,\n height: number,\n rotation: number\n): { x: number; y: number; width: number; height: number } => {\n const rad = (rotation * Math.PI) / 180;\n const cos = Math.abs(Math.cos(rad));\n const sin = Math.abs(Math.sin(rad));\n\n const newWidth = width * cos + height * sin;\n const newHeight = width * sin + height * cos;\n\n return {\n x: x - (newWidth - width) / 2,\n y: y - (newHeight - height) / 2,\n width: newWidth,\n height: newHeight,\n };\n};\n\n/**\n * Export canvas to JSON string\n */\nexport const exportToJSON = (data: CanvasExport): string => {\n return JSON.stringify(data, null, 2);\n};\n\n/**\n * Import canvas from JSON string\n */\nexport const importFromJSON = (json: string): CanvasExport => {\n try {\n const data = JSON.parse(json);\n // Validate basic structure\n if (!data.width || !data.height || !Array.isArray(data.elements)) {\n throw new Error(\"Invalid canvas data structure\");\n }\n\n // Normalize elements to ensure they have visible and locked properties\n const normalizedElements = data.elements.map((element: EditorElement) => ({\n ...element,\n visible: element.visible ?? true,\n locked: element.locked ?? false,\n }));\n\n return {\n ...data,\n elements: normalizedElements,\n };\n } catch (error) {\n throw new Error(`Failed to parse canvas data: ${(error as Error).message}`);\n }\n};\n\n/**\n * Calculate center point of an element\n */\nexport const getElementCenter = (element: EditorElement): { x: number; y: number } => {\n return {\n x: element.position.x + element.size.width / 2,\n y: element.position.y + element.size.height / 2,\n };\n};\n\n/**\n * Calculate distance between two points\n */\nexport const distance = (p1: { x: number; y: number }, p2: { x: number; y: number }): number => {\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n return Math.sqrt(dx * dx + dy * dy);\n};\n\n/**\n * Degrees to radians\n */\nexport const degToRad = (degrees: number): number => {\n return (degrees * Math.PI) / 180;\n};\n\n/**\n * Radians to degrees\n */\nexport const radToDeg = (radians: number): number => {\n return (radians * 180) / Math.PI;\n};\n\n/**\n * Validate element data\n */\nexport const isValidElement = (element: any): element is EditorElement => {\n return (\n element &&\n typeof element.id === \"string\" &&\n typeof element.type === \"string\" &&\n element.position &&\n typeof element.position.x === \"number\" &&\n typeof element.position.y === \"number\" &&\n element.size &&\n typeof element.size.width === \"number\" &&\n typeof element.size.height === \"number\" &&\n typeof element.rotation === \"number\" &&\n typeof element.zIndex === \"number\" &&\n element.props !== undefined\n );\n};\n\n/**\n * Validate canvas export data\n */\nexport const isValidCanvasExport = (data: any): data is CanvasExport => {\n return (\n data &&\n typeof data.width === \"number\" &&\n typeof data.height === \"number\" &&\n Array.isArray(data.elements) &&\n data.elements.every(isValidElement)\n );\n};\n","/**\n * Visual Editor - Main Editor Component\n *\n * The core editor component that integrates all functionality:\n * - Canvas rendering with Konva\n * - Element management\n * - Selection and transformation\n * - Mode switching\n */\n\nimport React, { useEffect, useCallback, useRef } from \"react\";\nimport { Stage, Layer } from \"react-konva\";\nimport { VisualEditorProps, EditorElement, EditorMode } from \"../types\";\nimport { useEditorState } from \"./useEditorState\";\nimport { ElementRegistry, useElementRegistry } from \"./ElementRegistry\";\nimport { defaultElements } from \"../elements\";\n\n/**\n * Main Visual Editor Component\n */\nexport const VisualEditor: React.FC<VisualEditorProps> = ({\n mode,\n initialData,\n width: propWidth,\n height: propHeight,\n readonly = false,\n onChange,\n onSelectionChange,\n onExport,\n customElements = [],\n showToolbar = true,\n showInspector = true,\n className = \"\",\n style = {},\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const stageRef = useRef<any>(null);\n\n // Initialize editor state\n const {\n state,\n api,\n setCanvasSize,\n setMode: setEditorMode,\n undo,\n redo,\n canUndo,\n canRedo,\n } = useEditorState(mode || null);\n\n // Initialize element registry\n const registry = useElementRegistry([\n ...defaultElements,\n ...(mode?.registeredElements || []),\n ...customElements,\n ]);\n\n // Determine canvas size\n const canvasWidth = propWidth || state.canvasSize.width || mode?.defaultCanvasSize.width || 800;\n const canvasHeight =\n propHeight || state.canvasSize.height || mode?.defaultCanvasSize.height || 600;\n\n // Update canvas size when props change\n useEffect(() => {\n if (propWidth && propHeight) {\n setCanvasSize(propWidth, propHeight);\n }\n }, [propWidth, propHeight, setCanvasSize]);\n\n // Load initial data\n useEffect(() => {\n if (initialData) {\n api.importJSON(initialData);\n }\n }, [initialData, api]);\n\n // Update mode when it changes\n useEffect(() => {\n if (mode) {\n setEditorMode(mode);\n // Register mode elements\n if (mode.registeredElements) {\n mode.registeredElements.forEach((el) => registry.register(el));\n }\n // Call mode activation hook\n if (mode.onModeActivate) {\n mode.onModeActivate(api);\n }\n }\n }, [mode, setEditorMode, registry, api]);\n\n // Notify parent of changes\n useEffect(() => {\n if (onChange) {\n const data = api.exportJSON();\n onChange(data);\n }\n }, [state.elements, onChange, api]);\n\n // Notify parent of selection changes\n useEffect(() => {\n if (onSelectionChange) {\n const selected = api.getSelectedElement();\n onSelectionChange(selected);\n }\n }, [state.selectedElementId, onSelectionChange, api]);\n\n // Handle keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Undo: Ctrl/Cmd + Z\n if ((e.ctrlKey || e.metaKey) && e.key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n undo();\n }\n // Redo: Ctrl/Cmd + Shift + Z or Ctrl/Cmd + Y\n if (\n ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === \"z\") ||\n ((e.ctrlKey || e.metaKey) && e.key === \"y\")\n ) {\n e.preventDefault();\n redo();\n }\n // Delete: Delete or Backspace\n if ((e.key === \"Delete\" || e.key === \"Backspace\") && !readonly) {\n e.preventDefault();\n const selected = api.getSelectedElement();\n if (selected) {\n api.removeElement(selected.id);\n }\n }\n // Deselect: Escape\n if (e.key === \"Escape\") {\n e.preventDefault();\n api.selectElement(null);\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [undo, redo, readonly, api]);\n\n // Render an element using its registered renderer\n const renderElement = useCallback(\n (element: EditorElement) => {\n const renderer = registry.get(element.type);\n if (!renderer) {\n console.warn(`No renderer found for element type: ${element.type}`);\n return null;\n }\n\n // Get the renderer component\n const RendererComponent = renderer.renderComponent;\n if (!RendererComponent) {\n console.warn(`No renderComponent found for element type: ${element.type}`);\n return null;\n }\n\n const isSelected = state.selectedElementId === element.id;\n\n return (\n <RendererComponent\n key={element.id}\n element={element}\n isSelected={isSelected}\n onSelect={() => !readonly && api.selectElement(element.id)}\n onTransform={(updates) => !readonly && api.updateElement(element.id, updates)}\n />\n );\n },\n [registry, state.selectedElementId, readonly, api]\n );\n\n // Handle click on canvas background (deselect)\n const handleStageClick = useCallback(\n (e: any) => {\n // Clicked on stage - deselect\n if (e.target === e.target.getStage()) {\n api.selectElement(null);\n }\n },\n [api]\n );\n\n // Sort elements by z-index for proper rendering order\n const sortedElements = [...state.elements].sort((a, b) => a.zIndex - b.zIndex);\n\n return (\n <div\n ref={containerRef}\n className={`visual-editor ${className}`}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n backgroundColor: mode?.backgroundColor || \"#f0f0f0\",\n ...style,\n }}\n >\n {/* Canvas */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n overflow: \"auto\",\n }}\n >\n <Stage\n ref={stageRef}\n width={canvasWidth}\n height={canvasHeight}\n onClick={handleStageClick}\n onTap={handleStageClick}\n style={{\n backgroundColor: \"#ffffff\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n }}\n >\n <Layer>{sortedElements.map(renderElement)}</Layer>\n </Stage>\n </div>\n </div>\n );\n};\n","/**\n * Visual Editor - Core State Management\n *\n * Provides the state management logic for the visual editor using useReducer.\n * This hook encapsulates all state mutations and provides a clean API.\n */\n\nimport { useReducer, useCallback, useMemo } from \"react\";\nimport {\n EditorState,\n EditorAction,\n EditorElement,\n EditorAPI,\n EditorMode,\n CanvasExport,\n} from \"../types\";\n\n/**\n * Initial state for the editor\n */\nconst createInitialState = (mode: EditorMode | null): EditorState => ({\n elements: [],\n selectedElementId: null,\n canvasSize: mode?.defaultCanvasSize || { width: 800, height: 600 },\n zoom: 1,\n pan: { x: 0, y: 0 },\n mode,\n history: {\n past: [],\n future: [],\n },\n});\n\n/**\n * State reducer for the editor\n */\nconst editorReducer = (state: EditorState, action: EditorAction): EditorState => {\n switch (action.type) {\n case \"ADD_ELEMENT\": {\n // Normalize element to ensure it has visible and locked properties\n const normalizedElement = {\n ...action.element,\n visible: action.element.visible ?? true,\n locked: action.element.locked ?? false,\n };\n const newElements = [...state.elements, normalizedElement];\n return {\n ...state,\n elements: newElements,\n selectedElementId: normalizedElement.id,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n }\n\n case \"UPDATE_ELEMENT\": {\n const newElements = state.elements.map((el) =>\n el.id === action.id ? { ...el, ...action.updates } : el\n );\n return {\n ...state,\n elements: newElements,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n }\n\n case \"REMOVE_ELEMENT\": {\n const newElements = state.elements.filter((el) => el.id !== action.id);\n return {\n ...state,\n elements: newElements,\n selectedElementId: state.selectedElementId === action.id ? null : state.selectedElementId,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n }\n\n case \"SELECT_ELEMENT\":\n return {\n ...state,\n selectedElementId: action.id,\n };\n\n case \"SET_ELEMENTS\":\n return {\n ...state,\n elements: action.elements,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n\n case \"LOAD_ELEMENTS\":\n // Load elements without recording history (for initial load)\n return {\n ...state,\n elements: action.elements.map((el) => ({\n ...el,\n visible: el.visible ?? true,\n locked: el.locked ?? false,\n })),\n };\n\n case \"REORDER_ELEMENT\": {\n const currentIndex = state.elements.findIndex((el) => el.id === action.elementId);\n if (currentIndex === -1 || currentIndex === action.newIndex) return state;\n\n const newElements = [...state.elements];\n const [element] = newElements.splice(currentIndex, 1);\n newElements.splice(action.newIndex, 0, element);\n\n // Update z-indices to match array indices\n newElements.forEach((el, index) => {\n el.zIndex = index;\n });\n\n return {\n ...state,\n elements: newElements,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n }\n\n case \"SET_CANVAS_SIZE\":\n return {\n ...state,\n canvasSize: {\n width: action.width,\n height: action.height,\n },\n };\n\n case \"SET_ZOOM\":\n return {\n ...state,\n zoom: action.zoom,\n };\n\n case \"SET_PAN\":\n return {\n ...state,\n pan: {\n x: action.x,\n y: action.y,\n },\n };\n\n case \"SET_MODE\":\n return {\n ...state,\n mode: action.mode,\n canvasSize: action.mode.defaultCanvasSize,\n };\n\n case \"CLEAR\":\n return {\n ...state,\n elements: [],\n selectedElementId: null,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n\n case \"UNDO\": {\n if (state.history.past.length === 0) return state;\n const previous = state.history.past[state.history.past.length - 1];\n const newPast = state.history.past.slice(0, -1);\n return {\n ...state,\n elements: previous,\n history: {\n past: newPast,\n future: [state.elements, ...state.history.future],\n },\n };\n }\n\n case \"REDO\": {\n if (state.history.future.length === 0) return state;\n const next = state.history.future[0];\n const newFuture = state.history.future.slice(1);\n return {\n ...state,\n elements: next,\n history: {\n past: [...state.history.past, state.elements],\n future: newFuture,\n },\n };\n }\n\n default:\n return state;\n }\n};\n\n/**\n * Custom hook for managing editor state\n */\nexport const useEditorState = (initialMode: EditorMode | null = null) => {\n const [state, dispatch] = useReducer(editorReducer, createInitialState(initialMode));\n\n // ============================================================================\n // API Methods\n // ============================================================================\n\n const addElement = useCallback((element: EditorElement) => {\n dispatch({ type: \"ADD_ELEMENT\", element });\n }, []);\n\n const updateElement = useCallback((id: string, updates: Partial<EditorElement>) => {\n dispatch({ type: \"UPDATE_ELEMENT\", id, updates });\n }, []);\n\n const removeElement = useCallback((id: string) => {\n dispatch({ type: \"REMOVE_ELEMENT\", id });\n }, []);\n\n const selectElement = useCallback((id: string | null) => {\n dispatch({ type: \"SELECT_ELEMENT\", id });\n }, []);\n\n const getSelectedElement = useCallback((): EditorElement | null => {\n if (!state.selectedElementId) return null;\n return state.elements.find((el) => el.id === state.selectedElementId) || null;\n }, [state.selectedElementId, state.elements]);\n\n const getAllElements = useCallback((): EditorElement[] => {\n return state.elements;\n }, [state.elements]);\n\n const moveElement = useCallback(\n (id: string, deltaX: number, deltaY: number) => {\n const element = state.elements.find((el) => el.id === id);\n if (!element) return;\n\n updateElement(id, {\n position: {\n x: element.position.x + deltaX,\n y: element.position.y + deltaY,\n },\n });\n },\n [state.elements, updateElement]\n );\n\n const rotateElement = useCallback(\n (id: string, angle: number) => {\n updateElement(id, { rotation: angle });\n },\n [updateElement]\n );\n\n const resizeElement = useCallback(\n (id: string, width: number, height: number) => {\n updateElement(id, {\n size: { width, height },\n });\n },\n [updateElement]\n );\n\n const updateZIndex = useCallback(\n (id: string, zIndex: number) => {\n updateElement(id, { zIndex });\n },\n [updateElement]\n );\n\n const reorderElement = useCallback((id: string, newIndex: number) => {\n dispatch({ type: \"REORDER_ELEMENT\", elementId: id, newIndex });\n }, []);\n\n const exportJSON = useCallback((): CanvasExport => {\n return {\n width: state.canvasSize.width,\n height: state.canvasSize.height,\n elements: state.elements,\n metadata: {\n version: \"1.0.0\",\n mode: state.mode?.name,\n created: new Date().toISOString(),\n },\n };\n }, [state.canvasSize, state.elements, state.mode]);\n\n const importJSON = useCallback((data: CanvasExport) => {\n dispatch({\n type: \"SET_CANVAS_SIZE\",\n width: data.width,\n height: data.height,\n });\n dispatch({ type: \"SET_ELEMENTS\", elements: data.elements });\n }, []);\n\n const clear = useCallback(() => {\n dispatch({ type: \"CLEAR\" });\n }, []);\n\n const setCanvasSize = useCallback((width: number, height: number) => {\n dispatch({ type: \"SET_CANVAS_SIZE\", width, height });\n }, []);\n\n const setMode = useCallback((mode: EditorMode) => {\n dispatch({ type: \"SET_MODE\", mode });\n }, []);\n\n const undo = useCallback(() => {\n dispatch({ type: \"UNDO\" });\n }, []);\n\n const redo = useCallback(() => {\n dispatch({ type: \"REDO\" });\n }, []);\n\n // ============================================================================\n // Copy/Paste/Duplicate Operations\n // ============================================================================\n\n const copyElement = useCallback(\n (id: string | null = null): EditorElement | null => {\n const elementToCopy = id ? state.elements.find((el) => el.id === id) : getSelectedElement();\n\n if (!elementToCopy) return null;\n\n // Return a deep copy for clipboard\n return {\n ...elementToCopy,\n props: { ...elementToCopy.props },\n position: { ...elementToCopy.position },\n size: { ...elementToCopy.size },\n };\n },\n [state.elements, getSelectedElement]\n );\n\n const duplicateElement = useCallback(\n (id: string | null = null, offset = { x: 20, y: 20 }) => {\n const elementToDuplicate = id\n ? state.elements.find((el) => el.id === id)\n : getSelectedElement();\n\n if (!elementToDuplicate) return;\n\n // Import duplicateElement utility\n const { duplicateElement: duplicateUtil } = require(\"../utils/editorUtils\");\n const duplicated = duplicateUtil(elementToDuplicate, offset);\n\n addElement(duplicated);\n },\n [state.elements, getSelectedElement, addElement]\n );\n\n const pasteElement = useCallback(\n (copiedElement: EditorElement, offset = { x: 20, y: 20 }) => {\n if (!copiedElement) return;\n\n // Import utilities\n const { generateElementId } = require(\"../utils/editorUtils\");\n\n // Create new element with new ID and offset position\n const pasted: EditorElement = {\n ...copiedElement,\n id: generateElementId(),\n props: { ...copiedElement.props },\n position: {\n x: copiedElement.position.x + offset.x,\n y: copiedElement.position.y + offset.y,\n },\n size: { ...copiedElement.size },\n zIndex: Math.max(...state.elements.map((el) => el.zIndex), 0) + 1,\n };\n\n addElement(pasted);\n },\n [state.elements, addElement]\n );\n\n // ============================================================================\n // Clear state history\n // ============================================================================\n\n const clearHistory = useCallback(() => {\n state.history.past = [];\n state.history.future = [];\n }, []);\n\n // ============================================================================\n // Load elements without history\n // ============================================================================\n\n const loadElements = useCallback((elements: EditorElement[]) => {\n dispatch({ type: \"LOAD_ELEMENTS\", elements });\n }, []);\n\n // ============================================================================\n // Build API Object\n // ============================================================================\n\n const api: EditorAPI = useMemo(\n () => ({\n addElement,\n updateElement,\n removeElement,\n selectElement,\n getSelectedElement,\n getAllElements,\n moveElement,\n rotateElement,\n resizeElement,\n updateZIndex,\n reorderElement,\n exportJSON,\n importJSON,\n clear,\n copyElement,\n duplicateElement,\n pasteElement,\n clearHistory,\n loadElements,\n }),\n [\n addElement,\n updateElement,\n removeElement,\n selectElement,\n getSelectedElement,\n getAllElements,\n moveElement,\n rotateElement,\n resizeElement,\n updateZIndex,\n reorderElement,\n exportJSON,\n importJSON,\n clear,\n copyElement,\n duplicateElement,\n pasteElement,\n clearHistory,\n loadElements,\n ]\n );\n\n return {\n state,\n api,\n // Additional helpers\n setCanvasSize,\n setMode,\n undo,\n redo,\n canUndo: state.history.past.length > 0,\n canRedo: state.history.future.length > 0,\n };\n};\n","/**\n * Visual Editor - Element Registry\n *\n * Manages registration and retrieval of element renderers.\n * This is what makes the editor extensible - new element types\n * can be registered dynamically.\n */\n\nimport { ElementRenderer } from \"../types\";\n\n/**\n * Registry class for managing element renderers\n */\nexport class ElementRegistry {\n private renderers: Map<string, ElementRenderer> = new Map();\n\n /**\n * Register a new element renderer\n */\n register(renderer: ElementRenderer): void {\n if (this.renderers.has(renderer.type)) {\n console.warn(\n `Element renderer with type \"${renderer.type}\" is already registered. Skipping.`\n );\n return;\n }\n this.renderers.set(renderer.type, renderer);\n }\n\n /**\n * Register multiple element renderers at once\n */\n registerMany(renderers: ElementRenderer[]): void {\n renderers.forEach((renderer) => this.register(renderer));\n }\n\n /**\n * Get a renderer by type\n */\n get(type: string): ElementRenderer | undefined {\n return this.renderers.get(type);\n }\n\n /**\n * Check if a renderer exists for a type\n */\n has(type: string): boolean {\n return this.renderers.has(type);\n }\n\n /**\n * Get all registered renderers\n */\n getAll(): ElementRenderer[] {\n return Array.from(this.renderers.values());\n }\n\n /**\n * Get the internal renderers map\n */\n getMap(): Map<string, ElementRenderer> {\n return this.renderers;\n }\n\n /**\n * Get all registered types\n */\n getAllTypes(): string[] {\n return Array.from(this.renderers.keys());\n }\n\n /**\n * Unregister a renderer\n */\n unregister(type: string): boolean {\n return this.renderers.delete(type);\n }\n\n /**\n * Clear all registered renderers\n */\n clear(): void {\n this.renderers.clear();\n }\n\n /**\n * Get the number of registered renderers\n */\n get size(): number {\n return this.renderers.size;\n }\n}\n\n/**\n * Create a global singleton registry (can be used across the app)\n */\nexport const globalElementRegistry = new ElementRegistry();\n\n/**\n * Hook to use the element registry in React components\n */\nimport { useMemo } from \"react\";\n\nexport const useElementRegistry = (initialRenderers?: ElementRenderer[]): ElementRegistry => {\n return useMemo(() => {\n const registry = new ElementRegistry();\n if (initialRenderers) {\n registry.registerMany(initialRenderers);\n }\n return registry;\n }, [initialRenderers]);\n};\n","/**\n * Visual Editor - Text Element Renderer\n *\n * Built-in text element renderer using Konva.\n */\n\nimport React from \"react\";\nimport { Text } from \"react-konva\";\nimport { ElementRenderer, EditorElement, TextElementProps } from \"../types\";\nimport { Type } from \"lucide-react\";\nimport { getSnappingPosition, SnapGuide } from \"../utils/snapping\";\nimport { KonvaEventObject, Node, NodeConfig } from \"konva/lib/Node\";\n\n/**\n * Text element renderer component\n */\nexport const TextElementRenderer: React.FC<{\n element: EditorElement<TextElementProps>;\n isSelected: boolean;\n onSelect: () => void;\n onTransform: (updates: Partial<EditorElement>) => void;\n // Snapping props\n allElements?: EditorElement[];\n canvasSize?: { width: number; height: number };\n onSnapGuides?: (guides: { vertical: SnapGuide[]; horizontal: SnapGuide[] }) => void;\n onClearSnapGuides?: () => void;\n // Element ID for centralized transformer\n elementId?: string;\n}> = ({\n element,\n isSelected,\n onSelect,\n onTransform,\n allElements = [],\n canvasSize,\n onSnapGuides,\n onClearSnapGuides,\n elementId,\n}) => {\n const shapeRef = React.useRef<any>(null);\n\n // Don't render if element is hidden\n const isVisible = element.visible !== false;\n const isLocked = element.locked === true;\n\n // Don't render if not visible\n if (!isVisible) {\n return null;\n }\n\n const handleClick = (e: KonvaEventObject<MouseEvent, Node<NodeConfig>>) => {\n if (isLocked) return;\n e.evt.button !== 0 ? undefined : onSelect();\n };\n\n const handleDragMove = (e: KonvaEventObject<MouseEvent, Node<NodeConfig>>) => {\n // Only allow left-click (button 0) dragging\n if (!canvasSize || !onSnapGuides || !isSelected || e.evt.button !== 0) return;\n\n const node = e.target;\n const snapResult = getSnappingPosition(element, node.x(), node.y(), allElements, {\n threshold: 5,\n snapToElements: true,\n snapToCanvas: true,\n canvasSize,\n });\n\n // Apply snapped position\n node.x(snapResult.x);\n node.y(snapResult.y);\n\n // Show snap guides\n onSnapGuides({\n vertical: snapResult.verticalGuides,\n horizontal: snapResult.horizontalGuides,\n });\n };\n\n const handleDragEnd = (e: any) => {\n // Clear snap guides\n if (onClearSnapGuides) {\n onClearSnapGuides();\n }\n\n onTransform({\n position: {\n x: e.target.x(),\n y: e.target.y(),\n },\n });\n };\n\n const handleTransform = () => {\n const node = shapeRef.current;\n if (!node) return;\n\n const scaleX = node.scaleX();\n const scaleY = node.scaleY();\n\n // Update width based on scaleX, keep font size constant\n const newWidth = Math.max(20, node.width() * scaleX);\n const newHeight = Math.max(20, node.height() * scaleY);\n\n // Reset scale immediately to prevent stretching\n node.scaleX(1);\n node.scaleY(1);\n\n // Update dimensions\n node.width(newWidth);\n node.height(newHeight);\n };\n\n // Build text decoration string\n const getTextDecoration = () => {\n const decorations: string[] = [];\n if (element.props.underline) decorations.push(\"underline\");\n if (element.props.strikethrough) decorations.push(\"line-through\");\n if (element.props.overline) decorations.push(\"overline\");\n return decorations.join(\" \") || \"\";\n };\n\n return (\n <>\n <Text\n ref={shapeRef}\n id={elementId || element.id}\n x={element.position.x}\n y={element.position.y}\n width={element.size.width}\n height={element.size.height}\n text={element.props.content}\n fontSize={element.props.fontSize}\n fontFamily={element.props.fontFamily || \"Arial\"}\n opacity={element.opacity}\n fill={element.props.color}\n align={element.props.align || \"left\"}\n fontStyle={\n `${element.props.bold ? \"bold\" : \"\"} ${element.props.italic ? \"italic\" : \"\"}`.trim() ||\n \"normal\"\n }\n textDecoration={getTextDecoration()}\n rotation={element.rotation}\n draggable={!isLocked && isSelected}\n listening={!isLocked}\n onClick={handleClick}\n onTap={isLocked ? undefined : onSelect}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n onTransform={handleTransform}\n ellipsis={element.props.textOverflow === \"ellipsis\"}\n verticalAlign={element.props.verticalAlign || \"top\"}\n stroke={element.props.strokeColor || \"#000000\"}\n strokeWidth={element.props.strokeWidth || 0}\n strokeEnabled\n fillAfterStrokeEnabled\n />\n </>\n );\n};\n\n/**\n * Text element renderer definition\n */\nexport const textElementRenderer: ElementRenderer<TextElementProps> = {\n type: \"text\",\n displayName: \"Text\",\n render: (element) => <div>Text: {element.props.content}</div>, // Placeholder for non-Konva contexts\n renderComponent: TextElementRenderer, // Konva rendering component\n icon: <Type className=\"w-4 h-4\" />,\n defaultProps: {\n content: \"Text\",\n fontSize: 16,\n fontFamily: \"Arial\",\n color: \"#000000\",\n strokeColor: \"#000000\",\n strokeWidth: 0,\n align: \"left\",\n verticalAlign: \"top\",\n bold: false,\n italic: false,\n underline: false,\n overline: false,\n strikethrough: false,\n wordWrap: \"break-word\",\n },\n defaultSize: {\n width: 200,\n height: 50,\n },\n inspectorSchema: [\n {\n name: \"content\",\n type: \"string\",\n label: \"Text Content\",\n defaultValue: \"Text\",\n },\n {\n name: \"fontSize\",\n type: \"number\",\n label: \"Font Size\",\n min: 0,\n max: 1024,\n step: 1,\n defaultValue: 16,\n },\n {\n name: \"fontFamily\",\n type: \"select\",\n label: \"Font Family\",\n options: [\n { value: \"Arial\", label: \"Arial\" },\n { value: \"Times New Roman\", label: \"Times New Roman\" },\n { value: \"Courier New\", label: \"Courier New\" },\n { value: \"Georgia\", label: \"Georgia\" },\n { value: \"Verdana\", label: \"Verdana\" },\n { value: \"Outfit\", label: \"Outfit\" },\n ],\n defaultValue: \"Outfit\",\n },\n {\n name: \"color\",\n type: \"color\",\n label: \"Text Color\",\n defaultValue: \"#000000\",\n },\n {\n name: \"strokeColor\",\n type: \"color\",\n label: \"Stroke Color\",\n defaultValue: \"#000000\",\n },\n {\n name: \"strokeWidth\",\n type: \"number\",\n label: \"Stroke Width\",\n min: 0,\n max: 50,\n step: 1,\n defaultValue: 0,\n },\n {\n name: \"align\",\n type: \"select\",\n label: \"Horizontal Alignment\",\n options: [\n { value: \"left\", label: \"Left\" },\n { value: \"center\", label: \"Center\" },\n { value: \"right\", label: \"Right\" },\n ],\n defaultValue: \"left\",\n },\n {\n name: \"verticalAlign\",\n type: \"select\",\n label: \"Vertical Alignment\",\n options: [\n { value: \"top\", label: \"Top\" },\n { value: \"middle\", label: \"Middle\" },\n { value: \"bottom\", label: \"Bottom\" },\n ],\n defaultValue: \"top\",\n },\n {\n name: \"bold\",\n type: \"boolean\",\n label: \"Bold\",\n defaultValue: false,\n },\n {\n name: \"italic\",\n type: \"boolean\",\n label: \"Italic\",\n defaultValue: false,\n },\n {\n name: \"underline\",\n type: \"boolean\",\n label: \"Underline\",\n defaultValue: false,\n },\n {\n name: \"strikethrough\",\n type: \"boolean\",\n label: \"Strikethrough\",\n defaultValue: false,\n },\n ],\n};\n","/**\n * Snapping Utilities\n *\n * Helper functions for snapping elements to guides, other elements, and canvas edges.\n */\n\nimport { EditorElement } from \"../types\";\n\nexport interface SnapGuide {\n /** Position of the guide line */\n position: number;\n /** Orientation of the guide (vertical or horizontal) */\n orientation: \"vertical\" | \"horizontal\";\n /** Snap type (element edge, center, or canvas edge) */\n type: \"edge\" | \"center\" | \"canvas\";\n}\n\nexport interface SnapResult {\n /** Snapped x position */\n x: number;\n /** Snapped y position */\n y: number;\n /** Vertical guides to display */\n verticalGuides: SnapGuide[];\n /** Horizontal guides to display */\n horizontalGuides: SnapGuide[];\n}\n\nexport interface SnapOptions {\n /** Snap threshold in pixels */\n threshold?: number;\n /** Whether to snap to other elements */\n snapToElements?: boolean;\n /** Whether to snap to canvas edges */\n snapToCanvas?: boolean;\n /** Canvas size */\n canvasSize?: { width: number; height: number };\n}\n\n/**\n * Calculate the axis-aligned bounding box for a rotated element\n * Note: In Konva (without offsetX/offsetY), rotation happens around the TOP-LEFT corner (x, y)\n * For snapping, we primarily care about the CENTER point, not the rotated edges\n */\nfunction getRotatedBounds(\n x: number,\n y: number,\n width: number,\n height: number,\n rotation: number\n): { left: number; right: number; top: number; bottom: number; centerX: number; centerY: number } {\n // If no significant rotation, return simple bounds\n if (Math.abs(rotation) < 0.1 || Math.abs(rotation - 360) < 0.1) {\n return {\n left: x,\n right: x + width,\n top: y,\n bottom: y + height,\n centerX: x + width / 2,\n centerY: y + height / 2,\n };\n }\n\n // Convert rotation to radians\n const rad = (rotation * Math.PI) / 180;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n // Calculate the four corners (relative to rotation origin at x, y)\n const corners = [\n { x: 0, y: 0 }, // top-left (rotation origin)\n { x: width, y: 0 }, // top-right\n { x: width, y: height }, // bottom-right\n { x: 0, y: height }, // bottom-left\n ];\n\n // Rotate corners around (x, y) and find min/max\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n\n for (const corner of corners) {\n // Rotate point around origin (x, y)\n const rotatedX = x + corner.x * cos - corner.y * sin;\n const rotatedY = y + corner.x * sin + corner.y * cos;\n minX = Math.min(minX, rotatedX);\n maxX = Math.max(maxX, rotatedX);\n minY = Math.min(minY, rotatedY);\n maxY = Math.max(maxY, rotatedY);\n }\n\n // Calculate the actual center of the rotated rectangle\n // The center point rotates around (x, y)\n const centerX = x + (width / 2) * cos - (height / 2) * sin;\n const centerY = y + (width / 2) * sin + (height / 2) * cos;\n\n return {\n left: minX,\n right: maxX,\n top: minY,\n bottom: maxY,\n centerX,\n centerY,\n };\n}\n\n/**\n * Calculate snapping for an element being dragged\n */\nexport function getSnappingPosition(\n draggedElement: EditorElement,\n x: number,\n y: number,\n allElements: EditorElement[],\n options: SnapOptions = {}\n): SnapResult {\n const { threshold = 5, snapToElements = true, snapToCanvas = true, canvasSize } = options;\n\n let snappedX = x;\n let snappedY = y;\n const verticalGuides: SnapGuide[] = [];\n const horizontalGuides: SnapGuide[] = [];\n\n // Calculate dragged element bounds (accounting for rotation)\n const draggedBounds = getRotatedBounds(\n x,\n y,\n draggedElement.size.width,\n draggedElement.size.height,\n draggedElement.rotation\n );\n\n const draggedLeft = draggedBounds.left;\n const draggedRight = draggedBounds.right;\n const draggedTop = draggedBounds.top;\n const draggedBottom = draggedBounds.bottom;\n const draggedCenterX = draggedBounds.centerX;\n const draggedCenterY = draggedBounds.centerY;\n\n // Check if the dragged element is significantly rotated\n const isRotated =\n Math.abs(draggedElement.rotation) > 0.1 && Math.abs(draggedElement.rotation - 360) > 0.1;\n\n // Track closest snap distances\n let closestVerticalSnap = threshold;\n let closestHorizontalSnap = threshold;\n let verticalOffset = 0;\n let horizontalOffset = 0;\n\n // Snap to canvas edges\n if (snapToCanvas && canvasSize) {\n // For rotated elements, snap to axis-aligned bounding box edges\n // NOTE: Edge snapping for rotated elements now enabled\n // Left edge\n if (Math.abs(draggedLeft) <= closestVerticalSnap) {\n verticalOffset = -draggedLeft;\n closestVerticalSnap = Math.abs(draggedLeft);\n verticalGuides.push({ position: 0, orientation: \"vertical\", type: \"canvas\" });\n }\n\n // Right edge\n if (Math.abs(draggedRight - canvasSize.width) <= closestVerticalSnap) {\n verticalOffset = canvasSize.width - draggedRight;\n closestVerticalSnap = Math.abs(draggedRight - canvasSize.width);\n verticalGuides.push({\n position: canvasSize.width,\n orientation: \"vertical\",\n type: \"canvas\",\n });\n }\n\n // Top edge\n if (Math.abs(draggedTop) <= closestHorizontalSnap) {\n horizontalOffset = -draggedTop;\n closestHorizontalSnap = Math.abs(draggedTop);\n horizontalGuides.push({ position: 0, orientation: \"horizontal\", type: \"canvas\" });\n }\n\n // Bottom edge\n if (Math.abs(draggedBottom - canvasSize.height) <= closestHorizontalSnap) {\n horizontalOffset = canvasSize.height - draggedBottom;\n closestHorizontalSnap = Math.abs(draggedBottom - canvasSize.height);\n horizontalGuides.push({\n position: canvasSize.height,\n orientation: \"horizontal\",\n type: \"canvas\",\n });\n }\n\n // Center X (always available, even for rotated elements)\n const canvasCenterX = canvasSize.width / 2;\n if (Math.abs(draggedCenterX - canvasCenterX) <= closestVerticalSnap) {\n verticalOffset = canvasCenterX - draggedCenterX;\n closestVerticalSnap = Math.abs(draggedCenterX - canvasCenterX);\n verticalGuides.length = 0; // Clear edge guides if center snaps\n verticalGuides.push({\n position: canvasCenterX,\n orientation: \"vertical\",\n type: \"center\",\n });\n }\n\n // Center Y (always available, even for rotated elements)\n const canvasCenterY = canvasSize.height / 2;\n if (Math.abs(draggedCenterY - canvasCenterY) <= closestHorizontalSnap) {\n horizontalOffset = canvasCenterY - draggedCenterY;\n closestHorizontalSnap = Math.abs(draggedCenterY - canvasCenterY);\n horizontalGuides.length = 0; // Clear edge guides if center snaps\n horizontalGuides.push({\n position: canvasCenterY,\n orientation: \"horizontal\",\n type: \"center\",\n });\n }\n }\n\n // Snap to other elements\n if (snapToElements) {\n for (const element of allElements) {\n // Skip self\n if (element.id === draggedElement.id) continue;\n\n // Skip hidden elements\n if (element.visible === false) continue;\n\n // Calculate element bounds (accounting for rotation)\n const elementBounds = getRotatedBounds(\n element.position.x,\n element.position.y,\n element.size.width,\n element.size.height,\n element.rotation\n );\n\n const elementLeft = elementBounds.left;\n const elementRight = elementBounds.right;\n const elementTop = elementBounds.top;\n const elementBottom = elementBounds.bottom;\n const elementCenterX = elementBounds.centerX;\n const elementCenterY = elementBounds.centerY;\n\n // Check if target element is rotated\n const isElementRotated =\n Math.abs(element.rotation) > 0.1 && Math.abs(element.rotation - 360) > 0.1;\n\n // For rotated elements (either dragged or target), only snap centers, not edges\n // NOTE: Edge snapping for rotated elements now enabled - snaps to axis-aligned bounding box\n const shouldSkipEdges = false; // Changed: always show edge guides\n\n // Vertical snapping (left, right, center)\n if (!shouldSkipEdges) {\n // Left to left\n if (Math.abs(draggedLeft - elementLeft) <= closestVerticalSnap) {\n verticalOffset = elementLeft - draggedLeft;\n closestVerticalSnap = Math.abs(draggedLeft - elementLeft);\n verticalGuides.length = 0;\n verticalGuides.push({ position: elementLeft, orientation: \"vertical\", type: \"edge\" });\n }\n\n // Right to right\n if (Math.abs(draggedRight - elementRight) <= closestVerticalSnap) {\n verticalOffset = elementRight - draggedRight;\n closestVerticalSnap = Math.abs(draggedRight - elementRight);\n verticalGuides.length = 0;\n verticalGuides.push({\n position: elementRight,\n orientation: \"vertical\",\n type: \"edge\",\n });\n }\n\n // Left to right\n if (Math.abs(draggedLeft - elementRight) <= closestVerticalSnap) {\n verticalOffset = elementRight - draggedLeft;\n closestVerticalSnap = Math.abs(draggedLeft - elementRight);\n verticalGuides.length = 0;\n verticalGuides.push({\n position: elementRight,\n orientation: \"vertical\",\n type: \"edge\",\n });\n }\n\n // Right to left\n if (Math.abs(draggedRight - elementLeft) <= closestVerticalSnap) {\n verticalOffset = elementLeft - draggedRight;\n closestVerticalSnap = Math.abs(draggedRight - elementLeft);\n verticalGuides.length = 0;\n verticalGuides.push({ position: elementLeft, orientation: \"vertical\", type: \"edge\" });\n }\n }\n\n // Center to center (always available)\n if (Math.abs(draggedCenterX - elementCenterX) <= closestVerticalSnap) {\n verticalOffset = elementCenterX - draggedCenterX;\n closestVerticalSnap = Math.abs(draggedCenterX - elementCenterX);\n verticalGuides.length = 0;\n verticalGuides.push({\n position: elementCenterX,\n orientation: \"vertical\",\n type: \"center\",\n });\n }\n\n // Horizontal snapping (top, bottom, center)\n if (!shouldSkipEdges) {\n // Top to top\n if (Math.abs(draggedTop - elementTop) <= closestHorizontalSnap) {\n horizontalOffset = elementTop - draggedTop;\n closestHorizontalSnap = Math.abs(draggedTop - elementTop);\n horizontalGuides.length = 0;\n horizontalGuides.push({\n position: elementTop,\n orientation: \"horizontal\",\n type: \"edge\",\n });\n }\n\n // Bottom to bottom\n if (Math.abs(draggedBottom - elementBottom) <= closestHorizontalSnap) {\n horizontalOffset = elementBottom - draggedBottom;\n closestHorizontalSnap = Math.abs(draggedBottom - elementBottom);\n horizontalGuides.length = 0;\n horizontalGuides.push({\n position: elementBottom,\n orientation: \"horizontal\",\n type: \"edge\",\n });\n }\n\n // Top to bottom\n if (Math.abs(draggedTop - elementBottom) <= closestHorizontalSnap) {\n horizontalOffset = elementBottom - draggedTop;\n closestHorizontalSnap = Math.abs(draggedTop - elementBottom);\n horizontalGuides.length = 0;\n horizontalGuides.push({\n position: elementBottom,\n orientation: \"horizontal\",\n type: \"edge\",\n });\n }\n\n // Bottom to top\n if (Math.abs(draggedBottom - elementTop) <= closestHorizontalSnap) {\n horizontalOffset = elementTop - draggedBottom;\n closestHorizontalSnap = Math.abs(draggedBottom - elementTop);\n horizontalGuides.length = 0;\n horizontalGuides.push({\n position: elementTop,\n orientation: \"horizontal\",\n type: \"edge\",\n });\n }\n }\n\n // Center to center (always available)\n if (Math.abs(draggedCenterY - elementCenterY) <= closestHorizontalSnap) {\n horizontalOffset = elementCenterY - draggedCenterY;\n closestHorizontalSnap = Math.abs(draggedCenterY - elementCenterY);\n horizontalGuides.length = 0;\n horizontalGuides.push({\n position: elementCenterY,\n orientation: \"horizontal\",\n type: \"center\",\n });\n }\n }\n }\n\n // Apply offsets to get final snapped position\n snappedX = x + verticalOffset;\n snappedY = y + horizontalOffset;\n\n return {\n x: snappedX,\n y: snappedY,\n verticalGuides,\n horizontalGuides,\n };\n}\n","/**\n * Visual Editor - Image Element Renderer\n *\n * Built-in image element renderer using Konva.\n */\n\nimport React from \"react\";\nimport { Image as KonvaImage, Transformer, Rect, Text, Group } from \"react-konva\";\nimport { ElementRenderer, EditorElement, ImageElementProps } from \"../types\";\nimport useImage from \"use-image\";\nimport { Image } from \"lucide-react\";\nimport { getSnappingPosition, SnapGuide } from \"../utils/snapping\";\nimport { KonvaEventObject, Node, NodeConfig } from \"konva/lib/Node\";\n\n/**\n * Image element renderer component\n */\nexport const ImageElementRenderer: React.FC<{\n element: EditorElement<ImageElementProps>;\n isSelected: boolean;\n onSelect: () => void;\n onTransform: (updates: Partial<EditorElement>) => void;\n // Snapping props\n allElements?: EditorElement[];\n canvasSize?: { width: number; height: number };\n onSnapGuides?: (guides: { vertical: SnapGuide[]; horizontal: SnapGuide[] }) => void;\n onClearSnapGuides?: () => void;\n // Image URL mapping for asset resolution\n imageUrls?: Map<string, string>;\n // Element ID for centralized transformer\n elementId?: string;\n // Callback to notify when node structure changes (e.g., image loads)\n onNodeUpdate?: () => void;\n}> = ({\n element,\n isSelected,\n onSelect,\n onTransform,\n allElements = [],\n canvasSize,\n onSnapGuides,\n onClearSnapGuides,\n imageUrls,\n elementId,\n onNodeUpdate,\n}) => {\n // Resolve image source - use imageUrls map if available\n const imageSrc = React.useMemo(() => {\n const src = element.props.src;\n\n // If src is already a full URL (http, blob, data), use it directly\n if (src && (src.startsWith(\"http\") || src.startsWith(\"blob:\") || src.startsWith(\"data:\"))) {\n return src;\n }\n\n // Otherwise, try to resolve from imageUrls map\n if (src && imageUrls) {\n const resolvedUrl = imageUrls.get(src);\n if (resolvedUrl) {\n return resolvedUrl;\n }\n }\n\n // Fallback to original src\n return src;\n }, [element.props.src, imageUrls]);\n\n const [image] = useImage(imageSrc);\n const shapeRef = React.useRef<any>(null);\n const transformerRef = React.useRef<any>(null);\n\n // Don't render if element is hidden\n const isVisible = element.visible !== false;\n const isLocked = element.locked === true;\n\n React.useEffect(() => {\n if (isSelected && transformerRef.current && shapeRef.current) {\n transformerRef.current.nodes([shapeRef.current]);\n transformerRef.current.getLayer().batchDraw();\n }\n }, [isSelected]);\n\n // Trigger a re-render/update when the image loads or changes\n // This helps the CentralizedTransformer re-attach to the updated node\n React.useEffect(() => {\n if (shapeRef.current) {\n // Force the layer to redraw when image changes\n const layer = shapeRef.current.getLayer();\n if (layer) {\n layer.batchDraw();\n }\n \n // Notify parent that the node has been updated (for transformer re-attachment)\n if (onNodeUpdate) {\n onNodeUpdate();\n }\n }\n }, [image, onNodeUpdate]);\n\n // Don't render if not visible\n if (!isVisible) {\n return null;\n }\n\n const handleClick = (e: KonvaEventObject<MouseEvent, Node<NodeConfig>>) => {\n if (isLocked) return;\n e.evt.button !== 0 ? undefined : onSelect();\n };\n\n const handleDragMove = (e: KonvaEventObject<MouseEvent, Node<NodeConfig>>) => {\n if (!canvasSize || !onSnapGuides || e.evt.button !== 0) return;\n\n const node = e.target;\n const snapResult = getSnappingPosition(element, node.x(), node.y(), allElements, {\n threshold: 5,\n snapToElements: true,\n snapToCanvas: true,\n canvasSize,\n });\n\n // Apply snapped position\n node.x(snapResult.x);\n node.y(snapResult.y);\n\n // Show snap guides\n onSnapGuides({\n vertical: snapResult.verticalGuides,\n horizontal: snapResult.horizontalGuides,\n });\n };\n\n const handleDragEnd = (e: any) => {\n // Clear snap guides\n if (onClearSnapGuides) {\n onClearSnapGuides();\n }\n\n onTransform({\n position: {\n x: e.target.x(),\n y: e.target.y(),\n },\n });\n };\n\n return (\n <>\n {image ? (\n <KonvaImage\n ref={shapeRef}\n id={elementId || element.id}\n x={element.position.x}\n y={element.position.y}\n width={element.size.width}\n height={element.size.height}\n image={image}\n opacity={element.opacity}\n rotation={element.rotation}\n draggable={!isLocked && isSelected}\n listening={!isLocked}\n onClick={handleClick}\n onTap={isLocked ? undefined : onSelect}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n />\n ) : (\n <Group\n ref={shapeRef}\n id={elementId || element.id}\n x={element.position.x}\n y={element.position.y}\n width={element.size.width}\n height={element.size.height}\n rotation={element.rotation}\n draggable={!isLocked && isSelected}\n listening={!isLocked}\n onClick={isLocked ? undefined : handleClick}\n onTap={isLocked ? undefined : onSelect}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n >\n {/* Placeholder rectangle with dashed border */}\n <Rect\n width={element.size.width}\n height={element.size.height}\n fill=\"#f0f0f0\"\n stroke=\"#999999\"\n strokeWidth={2}\n dash={[10, 5]}\n opacity={element.opacity}\n />\n {/* Placeholder text */}\n <Text\n width={element.size.width}\n height={element.size.height}\n text=\"No Image\"\n fontSize={16}\n fill=\"#666666\"\n align=\"center\"\n verticalAlign=\"middle\"\n />\n </Group>\n )}\n </>\n );\n};\n\n/**\n * Image element renderer definition\n */\nexport const imageElementRenderer: ElementRenderer<ImageElementProps> = {\n type: \"image\",\n displayName: \"Image\",\n render: (element) => <div>Image: {element.props.src}</div>, // Placeholder for non-Konva contexts\n renderComponent: ImageElementRenderer, // Konva rendering component\n icon: <Image className=\"w-4 h-4\" />,\n defaultProps: {\n src: \"\",\n fit: \"fill\",\n },\n defaultSize: {\n width: 200,\n height: 200,\n },\n inspectorSchema: [\n {\n name: \"src\",\n type: \"image\",\n label: \"Image Source\",\n description: \"URL or path to the image\",\n defaultValue: \"\",\n },\n {\n name: \"fit\",\n type: \"select\",\n label: \"Fit Mode\",\n options: [{ value: \"fill\", label: \"Fill\" }],\n defaultValue: \"contain\",\n },\n ],\n};\n","/**\n * Visual Editor - Built-in Elements\n *\n * Exports all built-in element renderers.\n */\n\nexport { textElementRenderer, TextElementRenderer } from \"./TextElement\";\nexport { imageElementRenderer, ImageElementRenderer } from \"./ImageElement\";\n\n// Export default element set\nimport { textElementRenderer } from \"./TextElement\";\nimport { imageElementRenderer } from \"./ImageElement\";\n\nexport const defaultElements = [textElementRenderer, imageElementRenderer];\n","/**\n * Inspector Component\n *\n * Schema-driven property panel for editing selected element properties.\n * Dynamically renders fields based on the element's inspectorSchema.\n */\n\nimport React from \"react\";\nimport { Input } from \"@/ui/input\";\nimport { Label } from \"@/ui/label\";\nimport { Button } from \"@/ui/button\";\nimport { Slider } from \"@/ui/slider\";\nimport { Separator } from \"@/ui/separator\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/ui/select\";\nimport { Textarea } from \"@/ui/textarea\";\nimport {\n EditorElement,\n InspectorFieldSchema,\n ElementRenderer,\n EditorAPI,\n EditorMode,\n} from \"../types\";\nimport { Checkbox } from \"@/ui/checkbox\";\n\nexport interface InspectorProps {\n /** Currently selected element */\n selectedElement: EditorElement | null;\n\n /** Element renderer for the selected element */\n elementRenderer: ElementRenderer | null;\n\n /** Editor API for updating elements */\n api: EditorAPI;\n\n /** Editor mode (for custom placeholder and context) */\n mode?: EditorMode;\n\n /** Canvas size (passed to placeholder component) */\n canvasSize?: { width: number; height: number };\n\n /** Function to set canvas size */\n setCanvasSize?: (width: number, height: number) => void;\n\n /** Optional custom style */\n style?: React.CSSProperties;\n\n /** Optional className */\n className?: string;\n}\n\n/**\n * Inspector component that renders property fields based on element schema\n */\nexport const Inspector: React.FC<InspectorProps> = ({\n selectedElement,\n elementRenderer,\n api,\n mode,\n canvasSize,\n setCanvasSize,\n style,\n className,\n}) => {\n // Local state for input values during editing\n const [editingValues, setEditingValues] = React.useState<Record<string, string>>({});\n\n // Debounce timer refs for color changes\n const debounceTimers = React.useRef<Record<string, NodeJS.Timeout>>({});\n\n // Cleanup debounce timers on unmount\n React.useEffect(() => {\n return () => {\n Object.values(debounceTimers.current).forEach((timer) => clearTimeout(timer));\n };\n }, []);\n\n // No selection or no renderer - show custom placeholder or default empty state\n if (!selectedElement || !elementRenderer) {\n // If mode has custom inspector placeholder, render it\n if (mode?.inspectorPlaceholder) {\n const PlaceholderComponent = mode.inspectorPlaceholder;\n return (\n <div className={`w-full bg-card h-full ${className}`} style={style}>\n <div className=\"flex h-10 sticky top-0 items-center justify-between px-3 py-2 border-b bg-popover\">\n <h3 className=\"text-sm font-semibold\">Inspector</h3>\n </div>\n <PlaceholderComponent\n api={api}\n canvasSize={canvasSize}\n setCanvasSize={setCanvasSize}\n {...(mode.context || {})}\n />\n </div>\n );\n }\n\n // Default empty state\n return (\n <div className={`w-full bg-card h-full ${className}`} style={style}>\n <div className=\"flex h-10 items-center justify-between px-3 py-2 border-b bg-popover\">\n <h3 className=\"text-sm font-semibold\">Inspector</h3>\n </div>\n <p className=\"p-4 text-sm text-muted-foreground\">\n No element selected. Click on an element to edit its properties.\n </p>\n </div>\n );\n }\n\n const schema = elementRenderer.inspectorSchema || [];\n\n // Handler for updating element properties\n const handlePropChange = (propName: string, value: any) => {\n api.updateElement(selectedElement.id, {\n props: {\n ...selectedElement.props,\n [propName]: value,\n },\n });\n };\n\n // Debounced handler for color changes (300ms delay)\n const handleColorChange = (propName: string, value: string) => {\n // Clear existing timer for this property\n if (debounceTimers.current[propName]) {\n clearTimeout(debounceTimers.current[propName]);\n }\n\n // Update local state immediately for responsive UI\n setEditingValues((prev) => ({ ...prev, [propName]: value }));\n\n // Set new timer to update the actual element\n debounceTimers.current[propName] = setTimeout(() => {\n handlePropChange(propName, value);\n // Clear editing state after update\n setEditingValues((prev) => {\n const newState = { ...prev };\n delete newState[propName];\n return newState;\n });\n delete debounceTimers.current[propName];\n }, 300); // 300ms debounce delay\n };\n\n // Handler for position/size/rotation/opacity changes\n const handleTransformChange = (field: string, value: number) => {\n // Round to 2 decimal places for cleaner values\n const roundedValue = Math.round(value * 100) / 100;\n\n if (field === \"x\" || field === \"y\") {\n api.updateElement(selectedElement.id, {\n position: {\n ...selectedElement.position,\n [field]: roundedValue,\n },\n });\n } else if (field === \"width\" || field === \"height\") {\n api.updateElement(selectedElement.id, {\n size: {\n ...selectedElement.size,\n [field]: roundedValue,\n },\n });\n } else if (field === \"rotation\") {\n // When rotating via input, rotate around the element's center\n // Step 1: Calculate the current visual center (accounting for current rotation)\n const width = selectedElement.size.width;\n const height = selectedElement.size.height;\n const oldRotRad = (selectedElement.rotation * Math.PI) / 180;\n\n // The visual center with current rotation\n const centerOffsetX = width / 2;\n const centerOffsetY = height / 2;\n const rotatedCenterX =\n selectedElement.position.x +\n centerOffsetX * Math.cos(oldRotRad) -\n centerOffsetY * Math.sin(oldRotRad);\n const rotatedCenterY =\n selectedElement.position.y +\n centerOffsetX * Math.sin(oldRotRad) +\n centerOffsetY * Math.cos(oldRotRad);\n\n // Step 2: Calculate new position that keeps this center fixed with new rotation\n const newRotRad = (roundedValue * Math.PI) / 180;\n const newX =\n rotatedCenterX -\n (centerOffsetX * Math.cos(newRotRad) - centerOffsetY * Math.sin(newRotRad));\n const newY =\n rotatedCenterY -\n (centerOffsetX * Math.sin(newRotRad) + centerOffsetY * Math.cos(newRotRad));\n\n api.updateElement(selectedElement.id, {\n position: {\n x: Math.round(newX * 100) / 100,\n y: Math.round(newY * 100) / 100,\n },\n rotation: roundedValue,\n });\n } else if (field === \"opacity\") {\n // Clamp opacity between 0 and 1\n const clampedValue = Math.max(0, Math.min(1, roundedValue));\n api.updateElement(selectedElement.id, {\n opacity: clampedValue,\n });\n }\n };\n\n // Get display value for a transform field (with 2 decimal places)\n const getDisplayValue = (field: string): string => {\n // If currently editing, use the editing value\n if (editingValues[field] !== undefined) {\n return editingValues[field];\n }\n\n // Otherwise, format the actual value to 2 decimals\n let value: number;\n if (field === \"x\") value = selectedElement.position.x;\n else if (field === \"y\") value = selectedElement.position.y;\n else if (field === \"width\") value = selectedElement.size.width;\n else if (field === \"height\") value = selectedElement.size.height;\n else if (field === \"rotation\") value = selectedElement.rotation;\n else if (field === \"opacity\") value = selectedElement.opacity;\n else return \"0\";\n\n return value.toFixed(2);\n };\n\n // Handle input change (while typing)\n const handleInputChange = (field: string, value: string) => {\n setEditingValues((prev) => ({ ...prev, [field]: value }));\n };\n\n // Handle input blur (when user finishes editing)\n const handleInputBlur = (field: string) => {\n const value = editingValues[field];\n if (value !== undefined) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n handleTransformChange(field, numValue);\n }\n // Clear editing state\n setEditingValues((prev) => {\n const newState = { ...prev };\n delete newState[field];\n return newState;\n });\n }\n };\n\n return (\n <div className={`h-full bg-card overflow-y-auto ${className}`} style={style}>\n {/* Header */}\n <div className=\"flex h-10 sticky top-0 items-center justify-between px-3 py-2 border-b bg-popover\">\n <h3 className=\"text-sm font-semibold\">Inspector</h3>\n </div>\n\n <div className=\"p-4\">\n <h3 className=\"text-lg font-semibold mb-1\">\n {elementRenderer.displayName || selectedElement.type}\n </h3>\n\n <p className=\"text-xs text-muted-foreground mb-4\">ID: {selectedElement.id}</p>\n\n <Separator className=\"my-4\" />\n\n {/* Display Name (always visible) */}\n <div className=\"mb-4\">\n <Label htmlFor=\"display-name\" className=\"text-xs\">\n Display Name\n </Label>\n <Input\n id=\"display-name\"\n type=\"text\"\n value={selectedElement.displayName || \"\"}\n onChange={(e) => {\n api.updateElement(selectedElement.id, {\n displayName: e.target.value,\n });\n }}\n placeholder={elementRenderer.displayName || selectedElement.type}\n className=\"h-8 mt-1\"\n />\n </div>\n\n <Separator className=\"my-4\" />\n\n {/* Transform Properties (always visible) */}\n <h4 className=\"text-sm font-medium mb-3\">Transform</h4>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex gap-2\">\n <div className=\"flex flex-col gap-2 items-start\">\n <Label htmlFor=\"x-position\" className=\"text-xs\">\n X\n </Label>\n <Input\n id=\"x-position\"\n type=\"number\"\n step={0.5}\n value={getDisplayValue(\"x\")}\n onChange={(e) => handleInputChange(\"x\", e.target.value)}\n onBlur={() => handleInputBlur(\"x\")}\n className=\"h-8\"\n />\n </div>\n <div className=\"flex flex-col gap-2 items-start\">\n <Label htmlFor=\"y-position\" className=\"text-xs\">\n Y\n </Label>\n <Input\n id=\"y-position\"\n type=\"number\"\n step={0.5}\n value={getDisplayValue(\"y\")}\n onChange={(e) => handleInputChange(\"y\", e.target.value)}\n onBlur={() => handleInputBlur(\"y\")}\n className=\"h-8\"\n />\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n <div className=\"flex flex-col gap-2 items-start\">\n <Label htmlFor=\"width\" className=\"text-xs\">\n Width\n </Label>\n <Input\n id=\"width\"\n type=\"number\"\n step={0.5}\n value={getDisplayValue(\"width\")}\n onChange={(e) => handleInputChange(\"width\", e.target.value)}\n onBlur={() => handleInputBlur(\"width\")}\n className=\"h-8\"\n />\n </div>\n <div className=\"flex h-8 gap-2\">\n <div className=\"flex flex-col gap-2 items-start\">\n <Label htmlFor=\"height\" className=\"text-xs\">\n Height\n </Label>\n <Input\n id=\"height\"\n type=\"number\"\n step={0.5}\n value={getDisplayValue(\"height\")}\n onChange={(e) => handleInputChange(\"height\", e.target.value)}\n onBlur={() => handleInputBlur(\"height\")}\n className=\"h-8\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n <div className=\"flex flex-col gap-2 items-start flex-1\">\n <Label htmlFor=\"rotation\" className=\"text-xs\">\n Rotation\n </Label>\n <Input\n id=\"rotation\"\n type=\"number\"\n step={1}\n value={getDisplayValue(\"rotation\")}\n onChange={(e) => handleInputChange(\"rotation\", e.target.value)}\n onBlur={() => handleInputBlur(\"rotation\")}\n className=\"h-8 flex-1\"\n />\n </div>\n <div className=\"flex flex-col gap-2 items-start flex-1\">\n <Label htmlFor=\"opacity\" className=\"text-xs\">\n Opacity\n </Label>\n <Input\n id=\"opacity\"\n type=\"number\"\n step={0.01}\n min={0}\n max={1}\n value={getDisplayValue(\"opacity\")}\n onChange={(e) => handleInputChange(\"opacity\", e.target.value)}\n onBlur={() => handleInputBlur(\"opacity\")}\n className=\"h-8 flex-1\"\n />\n </div>\n </div>\n\n <Separator className=\"my-4\" />\n\n {/* Element-specific Properties */}\n {schema.length > 0 && (\n <>\n <h4 className=\"text-sm font-medium mb-3\">Properties</h4>\n <div className=\"space-y-3\">\n {schema.map((field) =>\n renderField(\n field,\n selectedElement.props,\n editingValues,\n handlePropChange,\n handleColorChange,\n mode\n )\n )}\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * Render a single inspector field based on its type\n */\nexport function renderField(\n field: InspectorFieldSchema,\n props: any,\n editingValues: Record<string, string>,\n onChange: (name: string, value: any) => void,\n onColorChange: (name: string, value: string) => void,\n mode?: EditorMode\n): React.ReactNode {\n // Use editing value if available, otherwise use actual prop value\n const value = editingValues[field.name] ?? props[field.name] ?? field.defaultValue;\n\n switch (field.type) {\n case \"custom\":\n // Custom renderer support\n if (!field.customRenderer) {\n console.error(`Custom field \"${field.name}\" has no customRenderer defined`);\n return null;\n }\n\n const CustomComponent = field.customRenderer;\n return (\n <div key={field.name}>\n <CustomComponent\n value={value}\n onChange={(newValue) => onChange(field.name, newValue)}\n field={field}\n elementProps={props}\n mode={mode}\n />\n </div>\n );\n\n case \"string\":\n const isMultiline = field.name === \"content\" || field.name === \"text\";\n return (\n <div key={field.name}>\n <Label htmlFor={field.name} className=\"text-xs\">\n {field.label}\n </Label>\n {isMultiline ? (\n <Textarea\n id={field.name}\n value={value || \"\"}\n onChange={(e) => onChange(field.name, e.target.value)}\n className=\"mt-1\"\n rows={3}\n />\n ) : (\n <Input\n id={field.name}\n value={value || \"\"}\n onChange={(e) => onChange(field.name, e.target.value)}\n className=\"h-8 mt-1\"\n />\n )}\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n\n case \"number\":\n return (\n <div key={field.name}>\n <Label htmlFor={field.name} className=\"text-xs\">\n {field.label}\n </Label>\n <Input\n id={field.name}\n type=\"number\"\n value={value ?? 0}\n onChange={(e) => onChange(field.name, parseFloat(Number(e.target.value).toFixed(2)))}\n min={field.min}\n max={field.max}\n step={field.step || 1}\n className=\"h-8 mt-1\"\n />\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n\n case \"color\":\n return (\n <div key={field.name}>\n <Label htmlFor={field.name} className=\"text-xs\">\n {field.label}\n </Label>\n <Input\n id={field.name}\n type=\"color\"\n value={value || \"#000000\"}\n onChange={(e) => onColorChange(field.name, e.target.value)}\n className=\"h-10 mt-1\"\n />\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n\n case \"select\":\n return (\n <div key={field.name}>\n <Label htmlFor={field.name} className=\"text-xs\">\n {field.label}\n </Label>\n <Select\n value={value || field.defaultValue || \"\"}\n onValueChange={(newValue) => onChange(field.name, newValue)}\n >\n <SelectTrigger className=\"h-8 mt-1\">\n <SelectValue placeholder={field.label} />\n </SelectTrigger>\n <SelectContent>\n {field.options?.map((option) => (\n <SelectItem key={option.value} value={String(option.value)}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n\n case \"boolean\":\n return (\n <div key={field.name} className=\"flex items-start space-x-2\">\n <Checkbox\n id={field.name}\n checked={Boolean(value) as boolean}\n onCheckedChange={(checked) => onChange(field.name, checked)}\n className=\"mt-1\"\n />\n <div>\n <Label htmlFor={field.name} className=\"text-xs font-medium cursor-pointer\">\n {field.label}\n </Label>\n {field.description && (\n <p className=\"text-xs text-muted-foreground\">{field.description}</p>\n )}\n </div>\n </div>\n );\n\n case \"slider\":\n return (\n <div key={field.name}>\n <div className=\"flex items-center justify-between mb-2\">\n <Label className=\"text-xs\">{field.label}</Label>\n <span className=\"text-xs text-muted-foreground\">{value}</span>\n </div>\n <Slider\n value={[Number(value ?? field.defaultValue ?? 0)]}\n onValueChange={([newValue]) => onChange(field.name, newValue)}\n min={field.min || 0}\n max={field.max || 100}\n step={field.step || 1}\n className=\"mt-1\"\n />\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n\n case \"image\":\n return (\n <div key={field.name}>\n <Label htmlFor={field.name} className=\"text-xs\">\n {field.label}\n </Label>\n <Input\n id={field.name}\n value={value || \"\"}\n onChange={(e) => onChange(field.name, e.target.value)}\n className=\"h-8 mt-1\"\n placeholder=\"Image URL or path\"\n />\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n\n default:\n return null;\n }\n}\n\nexport default Inspector;\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","import * as React from \"react\"\nimport * as SliderPrimitive from \"@radix-ui/react-slider\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex w-full touch-none select-none items-center\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-2 w-full grow overflow-hidden rounded-full bg-secondary\">\n <SliderPrimitive.Range className=\"absolute h-full bg-primary\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n))\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n","import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n","import * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { Check } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n","/**\n * Layers Panel Component\n *\n * Displays all elements in the canvas with controls to show/hide, lock/unlock,\n * reorder, and delete elements.\n */\n\nimport React from \"react\";\nimport { Badge } from \"@/ui/badge\";\nimport { ScrollArea } from \"@/ui/scroll-area\";\nimport { TooltipButton } from \"@/ui/general/TooltipButton\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/ui/select\";\nimport {\n Eye,\n EyeOff,\n Lock,\n Unlock,\n Trash2,\n ChevronDown,\n Type,\n Image as ImageIcon,\n Layers,\n ChevronUp,\n Filter,\n} from \"lucide-react\";\nimport { EditorElement, EditorAPI, ElementRenderer } from \"../types\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface LayersPanelProps {\n /** All elements in the canvas */\n elements: EditorElement[];\n\n /** Currently selected element ID */\n selectedElementId: string | null;\n\n /** Editor API for manipulating elements */\n api: EditorAPI;\n\n /** Element registry to get renderer info */\n elementRenderers: Map<string, ElementRenderer>;\n\n /** Optional custom style */\n style?: React.CSSProperties;\n\n /** Optional className */\n className?: string;\n}\n\n/**\n * Get icon for element type\n */\nconst getElementIcon = (type: string) => {\n switch (type) {\n case \"text\":\n return <Type className=\"h-4 w-4\" />;\n case \"image\":\n return <ImageIcon className=\"h-4 w-4\" />;\n default:\n return <Layers className=\"h-4 w-4\" />;\n }\n};\n\n/**\n * Get display name for element\n */\nconst getElementDisplayName = (element: EditorElement, renderer?: ElementRenderer): string => {\n // Use custom display name if set\n if (element.displayName) return element.displayName;\n\n // Use renderer display name\n if (renderer?.displayName) return renderer.displayName;\n\n // For text elements, show preview of content\n if (element.type === \"text\" && element.props.content) {\n const preview = element.props.content.substring(0, 20);\n return `${preview}${element.props.content.length > 20 ? \"...\" : \"\"}`;\n }\n\n // Default: capitalize type\n return element.type.charAt(0).toUpperCase() + element.type.slice(1);\n};\n\n/**\n * Layers Panel component\n */\nexport const LayersPanel: React.FC<LayersPanelProps> = ({\n elements,\n selectedElementId,\n api,\n elementRenderers,\n style,\n className,\n}) => {\n const [filter, setFilter] = React.useState<string>(\"all\");\n\n // Get all available element types from the registry\n const availableTypes = Array.from(elementRenderers.keys());\n\n // Sort elements by z-index (descending - top to bottom)\n const sortedElements = [...elements].sort((a, b) => b.zIndex - a.zIndex);\n\n // Filter elements\n const filteredElements = sortedElements.filter((el) => {\n if (filter === \"all\") return true;\n return el.type === filter;\n });\n\n // Move element up in z-index (increase array index since z-index = array index)\n const handleMoveUp = (element: EditorElement, e: React.MouseEvent) => {\n e.stopPropagation();\n\n // Find element's current array position\n const currentIndex = elements.findIndex((el) => el.id === element.id);\n\n // Move up means higher z-index, which means higher array index\n if (currentIndex < elements.length - 1) {\n api.reorderElement(element.id, currentIndex + 1);\n }\n };\n\n // Move element down in z-index (decrease array index since z-index = array index)\n const handleMoveDown = (element: EditorElement, e: React.MouseEvent) => {\n e.stopPropagation();\n\n // Find element's current array position\n const currentIndex = elements.findIndex((el) => el.id === element.id);\n\n // Move down means lower z-index, which means lower array index\n if (currentIndex > 0) {\n api.reorderElement(element.id, currentIndex - 1);\n }\n };\n\n return (\n <div className={cn(\"flex flex-col bg-card border-l\", className)} style={style}>\n {/* Header */}\n <div className=\"flex h-10 items-center justify-between px-3 py-2 border-b bg-popover\">\n <h3 className=\"text-sm font-semibold\">Layers</h3>\n <Badge variant=\"default\" className=\"text-xs\">\n {filteredElements.length}\n </Badge>\n </div>\n\n {/* Filter Dropdown */}\n <div className=\"flex gap-2 items-center p-3 border-b\">\n <Filter className=\"icon\" />\n <Select value={filter} onValueChange={(value: any) => setFilter(value)}>\n <SelectTrigger id=\"layer-filter\" className=\"h-8\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n <div className=\"flex items-center gap-2\">\n <Layers className=\"h-4 w-4\" />\n All Elements\n </div>\n </SelectItem>\n {availableTypes.map((type) => (\n <SelectItem key={type} value={type}>\n <div className=\"flex items-center gap-2\">\n {getElementIcon(type)}\n {type.charAt(0).toUpperCase() + type.slice(1)} Only\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Layers List */}\n <ScrollArea className=\"flex-1\">\n <div className=\"p-2 space-y-1\">\n {filteredElements.length === 0 ? (\n <div className=\"text-center py-8 text-sm text-muted-foreground\">\n {filter === \"all\" ? \"No elements yet\" : `No ${filter} elements`}\n </div>\n ) : (\n filteredElements.map((element) => {\n const renderer = elementRenderers.get(element.type);\n const isSelected = element.id === selectedElementId;\n const isVisible = element.visible !== false;\n const isLocked = element.locked === true;\n\n return (\n <div\n key={element.id}\n className={cn(\n \"group flex items-center gap-2 px-2 py-2 rounded cursor-pointer transition-all\",\n isSelected\n ? \"bg-primary/15 border border-primary/30 shadow-sm\"\n : \"hover:bg-muted/70\",\n isLocked && \"opacity-60\",\n !isVisible && \"opacity-40\"\n )}\n onClick={() => !isLocked && api.selectElement(element.id)}\n >\n {/* Element Icon */}\n <div className=\"text-muted-foreground\">{getElementIcon(element.type)}</div>\n\n {/* Element Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium truncate\">\n {getElementDisplayName(element, renderer)}\n </div>\n <div className=\"flex items-center gap-2 text-[10px] text-muted-foreground\">\n <span>z:{element.zIndex}</span>\n </div>\n </div>\n\n {/* Quick Actions */}\n <div className=\"flex items-center gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n {/* Z-index Controls */}\n <div className=\"flex flex-col\">\n {element.zIndex < elements.length - 1 && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-3 w-6\"\n onClick={(e) => handleMoveUp(element, e)}\n tooltip=\"Move Upward\"\n tooltipDelay={500}\n >\n <ChevronUp className=\"h-3 w-3\" />\n </TooltipButton>\n )}\n {element.zIndex > 0 && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-3 w-6\"\n onClick={(e) => handleMoveDown(element, e)}\n tooltip=\"Move Downward\"\n tooltipDelay={500}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </TooltipButton>\n )}\n </div>\n\n {/* Visibility Toggle */}\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={(e) => {\n e.stopPropagation();\n api.updateElement(element.id, { visible: !isVisible });\n }}\n tooltip={isVisible ? \"Hide\" : \"Show\"}\n tooltipDelay={500}\n >\n {isVisible ? <Eye className=\"h-3 w-3\" /> : <EyeOff className=\"h-3 w-3\" />}\n </TooltipButton>\n\n {/* Lock Toggle */}\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={(e) => {\n e.stopPropagation();\n api.updateElement(element.id, { locked: !isLocked });\n }}\n tooltip={isLocked ? \"Unlock\" : \"Lock\"}\n tooltipDelay={500}\n >\n {isLocked ? <Lock className=\"h-3 w-3\" /> : <Unlock className=\"h-3 w-3\" />}\n </TooltipButton>\n\n {/* Delete */}\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 text-destructive hover:text-destructive\"\n onClick={(e) => {\n e.stopPropagation();\n api.removeElement(element.id);\n }}\n tooltip=\"Delete\"\n tooltipDelay={500}\n >\n <Trash2 className=\"h-3 w-3\" />\n </TooltipButton>\n </div>\n </div>\n );\n })\n )}\n </div>\n </ScrollArea>\n\n {/* Footer Stats */}\n <div className=\"border-t p-2\">\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>{elements.filter((e) => e.visible !== false).length} visible</span>\n <span>•</span>\n <span>{elements.filter((e) => e.locked === true).length} locked</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default LayersPanel;\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nconst ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nexport { ScrollArea, ScrollBar }\n","import * as React from \"react\";\nimport { Button, ButtonProps } from \"@/ui/button\";\nimport { TooltipWrapper } from \"@/ui/general/TooltipWrapper\";\n\ninterface TooltipButtonProps extends ButtonProps {\n tooltip: string;\n shortcut?: string;\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n tooltipAlign?: \"start\" | \"center\" | \"end\";\n tooltipDelay?: number;\n children: React.ReactNode;\n}\n\nconst TooltipButton = React.forwardRef<HTMLButtonElement, TooltipButtonProps>(\n (\n {\n tooltip,\n shortcut,\n tooltipSide = \"top\",\n tooltipAlign = \"center\",\n tooltipDelay = 700,\n children,\n className,\n ...props\n },\n ref\n ) => {\n return (\n <TooltipWrapper\n tooltip={tooltip}\n shortcut={shortcut}\n tooltipSide={tooltipSide}\n tooltipAlign={tooltipAlign}\n tooltipDelay={tooltipDelay}\n asChild={true}\n triggerClassName=\"\"\n >\n <Button ref={ref} className={className} {...props}>\n {children}\n </Button>\n </TooltipWrapper>\n );\n }\n);\n\nTooltipButton.displayName = \"TooltipButton\";\n\nexport { TooltipButton, type TooltipButtonProps };\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n className\n )}\n {...props}\n />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import * as React from \"react\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"@/ui/tooltip\";\n\ninterface TooltipWrapperProps {\n tooltip: string;\n shortcut?: string;\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n tooltipAlign?: \"start\" | \"center\" | \"end\";\n tooltipDelay?: number;\n children: React.ReactNode;\n triggerClassName?: string;\n asChild?: boolean;\n}\n\nconst TooltipWrapper: React.FC<TooltipWrapperProps> = ({\n tooltip,\n shortcut,\n tooltipSide = \"top\",\n tooltipAlign = \"center\",\n tooltipDelay = 700,\n children,\n triggerClassName = \"flex-1\",\n asChild = true,\n}) => {\n return (\n <TooltipProvider delayDuration={tooltipDelay}>\n <Tooltip>\n <TooltipTrigger className={triggerClassName} asChild={asChild}>\n {children}\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} align={tooltipAlign}>\n <div className=\"flex items-center gap-2\">\n <span>{tooltip}</span>\n {shortcut && (\n <kbd className=\"inline-flex items-center px-1.5 py-0.5 text-xs font-mono bg-muted text-gray rounded border\">\n {shortcut}\n </kbd>\n )}\n </div>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n\nTooltipWrapper.displayName = \"TooltipWrapper\";\n\nexport { TooltipWrapper, type TooltipWrapperProps };\n","/**\n * Visual Editor Workspace\n *\n * Integrated workspace that combines Toolbar, Canvas (VisualEditor), and Inspector.\n * This component creates a complete editor experience by coordinating all three parts.\n */\n\nimport React, { useCallback, useImperativeHandle } from \"react\";\nimport { Topbar } from \"./Topbar\";\nimport { Inspector } from \"./Inspector\";\nimport { LayersPanel } from \"./LayersPanel\";\nimport { Canvas } from \"./Canvas\";\nimport { useEditorState } from \"../core/useEditorState\";\nimport { useElementRegistry } from \"../core/ElementRegistry\";\nimport { defaultElements } from \"../elements\";\nimport { exportToJSON, importFromJSON } from \"../utils/editorUtils\";\nimport type { EditorMode, CanvasExport, EditorAPI, EditorElement } from \"../types\";\nimport { Toolbar } from \"./Toolbar\";\n\nexport interface VisualEditorWorkspaceProps {\n /** Editor mode configuration */\n mode?: EditorMode;\n\n /** Initial canvas data */\n initialData?: CanvasExport;\n\n /** Canvas width (overrides mode default) */\n width?: number;\n\n /** Canvas height (overrides mode default) */\n height?: number;\n\n /** Whether the editor is in readonly mode */\n readonly?: boolean;\n\n /** Callback when data changes */\n onChange?: (data: CanvasExport) => void;\n\n /** Custom element renderers (extends mode elements) */\n customElements?: any[];\n\n /** Whether to show the toolbar */\n showToolbar?: boolean;\n\n /** Whether to show the topbar (canvas size, undo, redo, delete, import, export) */\n showTopbar?: boolean;\n\n /** Whether to show the inspector panel */\n showInspector?: boolean;\n\n /** Whether to show the layers panel */\n showLayers?: boolean;\n\n /** Whether to show the asset picker (if defined in mode) */\n showAssetPicker?: boolean;\n\n /** Whether to show the canvas */\n showCanvas?: boolean;\n\n /** Whether to enable snap guides */\n enableSnapGuides?: boolean;\n\n /** Whether to enable pan and zoom controls */\n enablePanZoom?: boolean;\n\n /** Optional background image URL - replaces solid background color when provided */\n backgroundImageUrl?: string;\n\n /** Whether to hide all elements on the canvas */\n hideElements?: boolean;\n\n /** Custom CSS class */\n className?: string;\n\n /** Ref to access the editor API */\n apiRef?: React.Ref<EditorAPI>;\n}\n\n/**\n * Complete visual editor workspace with toolbar, canvas, and inspector\n */\nexport const VisualEditorWorkspace: React.FC<VisualEditorWorkspaceProps> = ({\n mode,\n initialData,\n width,\n height,\n readonly = false,\n onChange,\n customElements = [],\n showTopbar = true,\n showToolbar = true,\n showInspector = true,\n showLayers = true,\n showAssetPicker = true,\n showCanvas = true,\n enableSnapGuides = true,\n enablePanZoom = true,\n backgroundImageUrl,\n hideElements = false,\n className = \"\",\n apiRef,\n}) => {\n // Memoize element list to prevent re-registration\n const elementList = React.useMemo(() => {\n return [...defaultElements, ...(mode?.registeredElements || []), ...customElements];\n }, [mode, customElements]);\n\n // Initialize element registry\n const registry = useElementRegistry(elementList);\n\n // Initialize editor state\n const { state, api, undo, redo, canUndo, canRedo, setCanvasSize } = useEditorState(mode || null);\n\n // Clipboard ref for copy/paste operations\n const clipboardRef = React.useRef<EditorElement | null>(null);\n\n // Snap guides state (controlled internally)\n const [snapGuidesEnabled, setSnapGuidesEnabled] = React.useState(enableSnapGuides);\n\n // Background color state (controlled locally, initialized from mode)\n const [backgroundColor, setBackgroundColor] = React.useState(\n mode?.backgroundColor || \"#1a1a1a\"\n );\n\n // Background image state (controlled locally, initialized from mode)\n const [backgroundImage, setBackgroundImage] = React.useState<string>(\n mode?.backgroundImage || \"\"\n );\n\n // Sync external enableSnapGuides prop changes\n React.useEffect(() => {\n setSnapGuidesEnabled(enableSnapGuides);\n }, [enableSnapGuides]);\n\n // Sync mode backgroundColor changes\n React.useEffect(() => {\n if (mode?.backgroundColor) {\n setBackgroundColor(mode.backgroundColor);\n }\n }, [mode?.backgroundColor]);\n\n // Sync mode backgroundImage changes (including empty string to clear)\n React.useEffect(() => {\n setBackgroundImage(mode?.backgroundImage || \"\");\n }, [mode?.backgroundImage]);\n\n // Sync canvas size with editor state (editor state is the source of truth)\n const canvasSize = state.canvasSize;\n\n // Expose API via ref\n useImperativeHandle(apiRef, () => api, [api]);\n\n // Load initial data\n React.useEffect(() => {\n if (initialData && initialData.elements && initialData.elements.length > 0) {\n // Use loadElements to avoid recording history\n api.loadElements(initialData.elements);\n if (initialData.width && initialData.height) {\n setCanvasSize(initialData.width, initialData.height);\n }\n }\n }, []); // Only run once on mount\n\n // Get available element renderers for toolbar\n const availableRenderers = Array.from(registry.getAll().values());\n\n // Get current selection and renderer for inspector\n const selectedElement = state.selectedElementId\n ? state.elements.find((el) => el.id === state.selectedElementId) || null\n : null;\n\n const selectedRenderer = selectedElement ? registry.get(selectedElement.type) || null : null;\n\n // Handle export\n const handleExport = useCallback(() => {\n const data: CanvasExport = {\n width: canvasSize.width,\n height: canvasSize.height,\n elements: state.elements,\n metadata: {\n version: \"1.0\",\n mode: mode?.name || \"default\",\n created: new Date().toISOString(),\n },\n };\n\n const json = exportToJSON(data);\n const blob = new Blob([json], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `canvas-${Date.now()}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }, [state.elements, canvasSize, mode]);\n\n // Handle import\n const handleImport = useCallback(() => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".json\";\n input.onchange = async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) return;\n\n try {\n const text = await file.text();\n const imported = importFromJSON(text);\n\n if (imported) {\n // Clear current elements\n state.elements.forEach((el) => api.removeElement(el.id));\n\n // Load imported elements\n imported.elements.forEach((el) => api.addElement(el));\n\n // Update canvas size\n if (imported.width && imported.height) {\n setCanvasSize(imported.width, imported.height);\n }\n }\n } catch (error) {\n console.error(\"Failed to import:\", error);\n alert(`Failed to import: ${(error as Error).message}`);\n }\n };\n input.click();\n }, [state.elements, api]);\n\n // Notify parent of changes (use ref to prevent infinite loops)\n const onChangeRef = React.useRef(onChange);\n React.useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (onChangeRef.current) {\n onChangeRef.current({\n width: canvasSize.width,\n height: canvasSize.height,\n elements: state.elements,\n metadata: {\n backgroundColor: backgroundColor,\n backgroundImage: backgroundImage,\n },\n });\n }\n }, [state.elements, canvasSize, backgroundColor, backgroundImage]);\n\n // Keyboard shortcuts\n React.useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (readonly) return;\n\n // Undo: Ctrl+Z\n if (e.ctrlKey && e.key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n if (canUndo) undo();\n }\n // Redo: Ctrl+Y or Ctrl+Shift+Z\n else if ((e.ctrlKey && e.key === \"y\") || (e.ctrlKey && e.shiftKey && e.key === \"Z\")) {\n e.preventDefault();\n if (canRedo) redo();\n }\n // Delete: Delete\n else if (e.key === \"Delete\" && selectedElement) {\n e.preventDefault();\n api.removeElement(selectedElement.id);\n }\n // Deselect: Escape\n else if (e.key === \"Escape\") {\n e.preventDefault();\n api.selectElement(null);\n }\n // Copy: Ctrl+C\n else if (e.ctrlKey && e.key === \"c\" && selectedElement) {\n e.preventDefault();\n const copied = api.copyElement();\n if (copied) {\n // Store in a temporary clipboard (we'll use a ref for this)\n clipboardRef.current = copied;\n }\n }\n // Paste: Ctrl+V\n else if (e.ctrlKey && e.key === \"v\" && clipboardRef.current) {\n e.preventDefault();\n api.pasteElement(clipboardRef.current);\n }\n // Duplicate: Ctrl+D\n else if (e.ctrlKey && e.key === \"d\" && selectedElement) {\n e.preventDefault();\n api.duplicateElement();\n }\n\n // Move selected element with arrow keys only when no input/textarea/select\n // or contentEditable element is focused. Prevent interfering with text editing.\n const isInputFocused = () => {\n const active = document.activeElement as HTMLElement | null;\n if (!active) return false;\n // If body is focused, nothing else is focused\n if (active === document.body) return false;\n // Content editable elements\n if (active.isContentEditable) return true;\n const tag = active.tagName?.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") return true;\n const role = active.getAttribute ? active.getAttribute(\"role\") : null;\n if (role === \"textbox\") return true;\n return false;\n };\n\n if (selectedElement && !isInputFocused()) {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n api.moveElement(selectedElement.id, 0, -1);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n api.moveElement(selectedElement.id, 0, 1);\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n api.moveElement(selectedElement.id, -1, 0);\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault();\n api.moveElement(selectedElement.id, 1, 0);\n }\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [canUndo, canRedo, undo, redo, selectedElement, api, readonly]);\n\n return (\n <div className={`flex flex-col ${className}`}>\n {/* Topbar */}\n {showTopbar && (\n <Topbar\n api={api}\n canvasSize={canvasSize}\n canUndo={canUndo}\n canRedo={canRedo}\n onUndo={undo}\n onRedo={redo}\n onExport={handleExport}\n onImport={handleImport}\n setCanvasSize={setCanvasSize}\n backgroundColor={backgroundColor}\n setBackgroundColor={setBackgroundColor}\n backgroundImage={backgroundImage}\n setBackgroundImage={setBackgroundImage}\n imageUrls={mode?.context?.imageUrls}\n clipboardRef={clipboardRef}\n enableSnapGuides={snapGuidesEnabled}\n onSnapGuidesChange={setSnapGuidesEnabled}\n config={mode?.topbarConfig}\n />\n )}\n\n {/* Main content: Canvas + Layers + Inspector + Asset Picker */}\n <div className=\"flex w-full h-full overflow-hidden\">\n {/* Toolbar */}\n {showToolbar && (\n <Toolbar\n api={api}\n elementRenderers={availableRenderers}\n canvasSize={canvasSize}\n config={mode?.toolbarConfig}\n />\n )}\n\n {/* Canvas */}\n {showCanvas && (\n <Canvas\n canvasSize={canvasSize}\n elements={state.elements}\n selectedElementId={state.selectedElementId}\n registry={registry}\n mode={mode ? { ...mode, backgroundColor } : undefined}\n readonly={readonly}\n enableSnapGuides={snapGuidesEnabled}\n enablePanZoom={enablePanZoom}\n backgroundImageUrl={\n backgroundImage && mode?.context?.imageUrls\n ? mode.context.imageUrls.get(backgroundImage)\n : undefined\n }\n hideElements={hideElements}\n onSelectElement={(id) => api.selectElement(id)}\n onTransformElement={(id, updates) => api.updateElement(id, updates)}\n />\n )}\n\n {/* Layers Panel */}\n {showLayers && (\n <LayersPanel\n elements={state.elements}\n selectedElementId={state.selectedElementId}\n api={api}\n elementRenderers={registry.getMap()}\n className=\"w-64\"\n />\n )}\n\n {/* Inspector Panel (with asset picker at bottom if position === 'bottom') */}\n {showInspector && (\n <div className=\"w-80 h-full border-l bg-background flex flex-col\">\n {/* Inspector Panel */}\n <div className=\"flex-1 min-h-0 overflow-auto\">\n <Inspector\n selectedElement={selectedElement}\n elementRenderer={selectedRenderer}\n api={api}\n mode={mode}\n canvasSize={canvasSize}\n setCanvasSize={setCanvasSize}\n />\n </div>\n\n {/* Asset Picker at Bottom (default position) */}\n {showAssetPicker &&\n mode?.assetPickerComponent &&\n (!mode.assetPickerPosition || mode.assetPickerPosition === \"bottom\") &&\n React.createElement(mode.assetPickerComponent, {\n ...mode.assetPickerProps,\n api,\n className: mode.assetPickerHeight || \"h-[40%]\",\n })}\n </div>\n )}\n\n {/* Asset Picker as Separate Panel (position === 'right') */}\n {showAssetPicker &&\n mode?.assetPickerComponent &&\n mode.assetPickerPosition === \"right\" &&\n React.createElement(mode.assetPickerComponent, {\n ...mode.assetPickerProps,\n api,\n className: `border-l ${mode.assetPickerHeight || \"w-80\"}`,\n })}\n </div>\n </div>\n );\n};\n\nexport default VisualEditorWorkspace;\n","/**\n * Topbar Component\n *\n * Provides controls for element creation, undo/redo, and editor actions.\n */\n\nimport React from \"react\";\nimport { Separator } from \"@/ui/separator\";\nimport { TooltipButton } from \"@/ui/general/TooltipButton\";\nimport { Undo, Redo, Trash2, Download, Upload, Copy, Clipboard, CopyPlus, Image, X } from \"lucide-react\";\nimport { EditorAPI, TopbarConfig } from \"../types\";\nimport { Input } from \"@/ui/input\";\nimport { Button } from \"@/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/ui/select\";\nimport CustomActionRenderer from \"./CustomActionRenderer\";\n\nexport interface TopbarProps {\n /** Editor API for performing actions */\n api: EditorAPI;\n\n /** Canvas size for positioning new elements */\n canvasSize: { width: number; height: number };\n\n /** Can undo */\n canUndo: boolean;\n\n /** Can redo */\n canRedo: boolean;\n\n /** Undo callback */\n onUndo: () => void;\n\n /** Redo callback */\n onRedo: () => void;\n\n /** Export callback */\n onExport?: () => void;\n\n /** Import callback */\n onImport?: () => void;\n\n /** Set canvas size callback */\n setCanvasSize: (width: number, height: number) => void;\n\n /** Background color */\n backgroundColor?: string;\n\n /** Set background color callback */\n setBackgroundColor?: (color: string) => void;\n\n /** Background image filename */\n backgroundImage?: string;\n\n /** Set background image callback */\n setBackgroundImage?: (image: string) => void;\n\n /** Available images from context (for image picker) */\n imageUrls?: Map<string, string>;\n\n /** Clipboard ref for copy/paste operations */\n clipboardRef?: React.MutableRefObject<any>;\n\n /** Enable snap guides */\n enableSnapGuides?: boolean;\n\n /** Callback when snap guides toggle changes */\n onSnapGuidesChange?: (enabled: boolean) => void;\n\n /** Configuration for topbar visibility and custom actions */\n config?: TopbarConfig;\n\n /** Optional custom style */\n style?: React.CSSProperties;\n\n /** Optional className */\n className?: string;\n}\n\n/**\n * Topbar component with element creation and editor controls\n */\nexport const Topbar: React.FC<TopbarProps> = ({\n api,\n canvasSize,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n onExport,\n onImport,\n setCanvasSize,\n backgroundColor,\n setBackgroundColor,\n backgroundImage,\n setBackgroundImage,\n imageUrls,\n clipboardRef,\n enableSnapGuides = true,\n onSnapGuidesChange,\n config,\n style,\n className,\n}) => {\n const selectedElement = api.getSelectedElement();\n\n // Default config values\n const {\n showUndo = true,\n showRedo = true,\n showDelete = true,\n showCopy = true,\n showPaste = true,\n showDuplicate = true,\n showExport = true,\n showImport = true,\n showCanvasSize = true,\n showSnapGuides = true,\n actionsStart = [],\n actionsEnd = [],\n actionsStartClassName = \"\",\n actionsEndClassName = \"\",\n customActions = [], // Backwards compatibility - defaults to end\n } = config || {};\n\n // Default snap guides toggle action (added to end actions if showSnapGuides is true and callback exists)\n const defaultSnapGuidesAction =\n showSnapGuides && onSnapGuidesChange\n ? [\n {\n type: \"toggle\" as const,\n id: \"snap-guides-toggle\",\n label: \"Snap Guides\",\n value: enableSnapGuides,\n onChange: (value: boolean) => {\n onSnapGuidesChange(value);\n },\n },\n ]\n : [];\n\n // Combine actionsEnd with default snap guides and customActions for backwards compatibility\n const endActions = [...actionsEnd, ...defaultSnapGuidesAction, ...customActions];\n\n // Delete selected element\n const handleDelete = () => {\n if (selectedElement) {\n api.removeElement(selectedElement.id);\n }\n };\n\n // Copy selected element\n const handleCopy = () => {\n const copied = api.copyElement();\n if (copied && clipboardRef) {\n clipboardRef.current = copied;\n }\n };\n\n // Paste from clipboard\n const handlePaste = () => {\n if (clipboardRef?.current) {\n api.pasteElement(clipboardRef.current);\n }\n };\n\n // Duplicate selected element\n const handleDuplicate = () => {\n api.duplicateElement();\n };\n\n // Helper to check if an action should be disabled\n const isDisabled = (disabled: boolean | ((api: EditorAPI) => boolean) | undefined): boolean => {\n if (typeof disabled === \"function\") {\n return disabled(api);\n }\n return disabled || false;\n };\n\n return (\n <div\n className={`flex h-12 items-center px-3 py-1 bg-popover border-b gap-2 ${className}`}\n style={style}\n >\n {/* Left side: Canvas size and background color controls */}\n {showCanvasSize && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">Canvas:</span>\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">W:</span>\n <Input\n placeholder=\"Width\"\n className=\"h-8 w-20\"\n type=\"number\"\n step={1}\n value={canvasSize.width}\n onChange={(e) =>\n setCanvasSize(Number(Number(e.target.value).toFixed(0)), canvasSize.height)\n }\n />\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">H:</span>\n <Input\n placeholder=\"Height\"\n className=\"h-8 w-20\"\n type=\"number\"\n step={1}\n value={canvasSize.height}\n onChange={(e) =>\n setCanvasSize(canvasSize.width, Number(Number(e.target.value).toFixed(0)))\n }\n />\n </div>\n {setBackgroundColor && backgroundColor && (\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">BG:</span>\n <Input\n placeholder=\"#000000\"\n className=\"h-8 w-24\"\n type=\"color\"\n value={backgroundColor}\n onChange={(e) => setBackgroundColor(e.target.value)}\n />\n </div>\n )}\n {setBackgroundImage && imageUrls && imageUrls.size > 0 && (\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">Texture:</span>\n {backgroundImage ? (\n <div className=\"flex items-center gap-1\">\n <Select value={backgroundImage} onValueChange={setBackgroundImage}>\n <SelectTrigger className=\"h-8 w-32\">\n <SelectValue placeholder=\"None\" />\n </SelectTrigger>\n <SelectContent>\n {Array.from(imageUrls.keys()).map((imageName) => (\n <SelectItem key={imageName} value={imageName}>\n {imageName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => setBackgroundImage(\"\")}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n ) : (\n <Select value=\"\" onValueChange={setBackgroundImage}>\n <SelectTrigger className=\"h-8 w-32\">\n <SelectValue placeholder=\"None\">\n <div className=\"flex items-center gap-2\">\n <Image className=\"h-3 w-3\" />\n <span>None</span>\n </div>\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {Array.from(imageUrls.keys()).map((imageName) => (\n <SelectItem key={imageName} value={imageName}>\n {imageName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Right side: Action buttons */}\n <div className=\"flex w-full gap-2\">\n {/* Custom Actions - Start (before default controls) */}\n {actionsStart.length > 0 && (\n <>\n <div className={`flex items-center gap-1 ${actionsStartClassName}`}>\n {actionsStart.map((action) => (\n <CustomActionRenderer\n key={action.id}\n action={action}\n api={api}\n layout=\"horizontal\"\n />\n ))}\n </div>\n {/* Separator after start actions if there are more sections */}\n {(showUndo ||\n showRedo ||\n showDelete ||\n (showExport && onExport) ||\n (showImport && onImport) ||\n endActions.length > 0) && <Separator orientation=\"vertical\" className=\"h-6\" />}\n </>\n )}\n\n {/* History Controls */}\n {(showUndo || showRedo) && (\n <>\n <div className=\"flex items-center gap-1\">\n {showUndo && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={onUndo}\n disabled={!canUndo}\n className=\"h-8 w-8\"\n tooltip=\"Undo\"\n shortcut=\"Ctrl+Z\"\n tooltipDelay={500}\n >\n <Undo className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n\n {showRedo && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={onRedo}\n disabled={!canRedo}\n className=\"h-8 w-8\"\n tooltip=\"Redo\"\n shortcut=\"Ctrl+Y\"\n tooltipDelay={500}\n >\n <Redo className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n </div>\n {/* Separator after history if there are more sections */}\n {(showCopy ||\n showPaste ||\n showDuplicate ||\n showDelete ||\n (showExport && onExport) ||\n (showImport && onImport) ||\n endActions.length > 0) && <Separator orientation=\"vertical\" className=\"h-6\" />}\n </>\n )}\n\n {/* Element Actions */}\n {(showCopy || showPaste || showDuplicate || showDelete) && (\n <>\n <div className=\"flex items-center gap-1\">\n {showCopy && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCopy}\n disabled={!selectedElement}\n className=\"h-8 w-8\"\n tooltip=\"Copy\"\n shortcut=\"Ctrl+C\"\n tooltipDelay={500}\n >\n <Copy className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n\n {showPaste && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={handlePaste}\n disabled={!clipboardRef?.current}\n className=\"h-8 w-8\"\n tooltip=\"Paste\"\n shortcut=\"Ctrl+V\"\n tooltipDelay={500}\n >\n <Clipboard className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n\n {showDuplicate && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleDuplicate}\n disabled={!selectedElement}\n className=\"h-8 w-8\"\n tooltip=\"Duplicate\"\n shortcut=\"Ctrl+D\"\n tooltipDelay={500}\n >\n <CopyPlus className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n\n {showDelete && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleDelete}\n disabled={!selectedElement}\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n tooltip=\"Delete Selected\"\n shortcut=\"Delete\"\n tooltipDelay={500}\n >\n <Trash2 className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n </div>\n {/* Separator after element actions if there are more sections */}\n {((showExport && onExport) || (showImport && onImport) || endActions.length > 0) && (\n <Separator orientation=\"vertical\" className=\"h-6\" />\n )}\n </>\n )}\n\n {/* Import/Export */}\n {((showExport && onExport) || (showImport && onImport)) && (\n <>\n <div className=\"flex items-center gap-1\">\n {showExport && onExport && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={onExport}\n className=\"h-8 w-8\"\n tooltip=\"Export to JSON\"\n tooltipDelay={500}\n >\n <Download className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n\n {showImport && onImport && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={onImport}\n className=\"h-8 w-8\"\n tooltip=\"Import from JSON\"\n tooltipDelay={500}\n >\n <Upload className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n </div>\n {/* Separator after import/export if there are end actions */}\n {endActions.length > 0 && <Separator orientation=\"vertical\" className=\"h-6\" />}\n </>\n )}\n\n {/* Custom Actions - End (after default controls) */}\n {endActions.length > 0 && (\n <div className={`flex items-center gap-1 ${actionsEndClassName}`}>\n {endActions.map((action) => (\n <CustomActionRenderer key={action.id} action={action} api={api} layout=\"horizontal\" />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Topbar;\n","import * as React from \"react\";\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-secondary data-[state=unchecked]:bg-input\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"pointer-events-none block h-5 w-5 rounded-full bg-primary shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0 data-[state=checked]:bg-background\"\n )}\n />\n </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","import React from \"react\";\nimport { Label } from \"@/ui/label\";\nimport { Input } from \"@/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/ui/select\";\nimport { Switch } from \"@/ui/switch\";\nimport { Separator } from \"@/ui/separator\";\nimport { TooltipButton } from \"@/ui/general/TooltipButton\";\nimport { Plus } from \"lucide-react\";\nimport { CustomEditorAction, EditorAPI } from \"../types\";\n\nexport interface CustomActionRendererProps {\n action: CustomEditorAction;\n api: EditorAPI;\n /** Layout orientation - 'horizontal' for topbar, 'vertical' for toolbar */\n layout?: \"horizontal\" | \"vertical\";\n}\n\n/**\n * Helper component to render different types of custom actions\n * Supports both horizontal (topbar) and vertical (toolbar) layouts\n */\nconst CustomActionRenderer: React.FC<CustomActionRendererProps> = ({\n action,\n api,\n layout = \"horizontal\",\n}) => {\n // Helper to check if an action should be disabled\n const isDisabled = (disabled: boolean | ((api: EditorAPI) => boolean) | undefined): boolean => {\n if (typeof disabled === \"function\") {\n return disabled(api);\n }\n return disabled || false;\n };\n\n const isVertical = layout === \"vertical\";\n\n switch (action.type) {\n case \"button\":\n return (\n <TooltipButton\n key={action.id}\n variant={isVertical ? \"outline\" : \"ghost\"}\n size={isVertical ? \"sm\" : \"icon\"}\n onClick={() => action.onClick(api)}\n disabled={isDisabled(action.disabled)}\n className={isVertical ? \"icon-button\" : \"h-8 w-8\"}\n tooltip={action.label}\n shortcut={action.shortcut}\n tooltipDelay={500}\n tooltipSide={isVertical ? \"right\" : undefined}\n >\n {action.icon || <Plus className=\"h-4 w-4\" />}\n </TooltipButton>\n );\n\n case \"dropdown\":\n return (\n <div\n key={action.id}\n className={isVertical ? \"flex flex-col gap-1 px-1\" : \"flex items-center gap-2\"}\n >\n {isVertical ? (\n <Label className=\"text-xs\">{action.label}</Label>\n ) : (\n action.icon && <span className=\"text-muted-foreground\">{action.icon}</span>\n )}\n <Select\n value={action.value}\n onValueChange={(value) => action.onChange(value, api)}\n disabled={isDisabled(action.disabled)}\n >\n <SelectTrigger className={isVertical ? \"h-8 w-full\" : \"h-8 w-auto min-w-[120px]\"}>\n <SelectValue placeholder={action.placeholder || action.label} />\n </SelectTrigger>\n <SelectContent>\n {action.options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n <div className=\"flex items-center gap-2\">\n {option.icon && <span>{option.icon}</span>}\n <span>{option.label}</span>\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n\n case \"input\":\n return (\n <div\n key={action.id}\n className={isVertical ? \"flex flex-col gap-1 px-1\" : \"flex items-center gap-2\"}\n >\n <Label className=\"text-xs whitespace-nowrap\">{action.label}{isVertical ? \"\" : \":\"}</Label>\n <Input\n type={action.inputType || \"text\"}\n value={action.value}\n onChange={(e) => action.onChange(e.target.value, api)}\n placeholder={action.placeholder}\n disabled={isDisabled(action.disabled)}\n className={isVertical ? \"h-8 w-full\" : \"h-8 w-32\"}\n min={action.min}\n max={action.max}\n step={action.step}\n />\n </div>\n );\n\n case \"color\":\n return (\n <div\n key={action.id}\n className={isVertical ? \"flex flex-col gap-1 px-1\" : \"flex items-center gap-2\"}\n >\n <Label className=\"text-xs whitespace-nowrap\">{action.label}{isVertical ? \"\" : \":\"}</Label>\n <Input\n type=\"color\"\n value={action.value}\n onChange={(e) => action.onChange(e.target.value, api)}\n disabled={isDisabled(action.disabled)}\n className={isVertical ? \"h-8 w-full p-1 cursor-pointer\" : \"h-8 w-16 p-1 cursor-pointer\"}\n />\n </div>\n );\n\n case \"toggle\":\n return (\n <div\n key={action.id}\n className={isVertical ? \"flex items-center justify-between gap-2 px-1\" : \"flex items-center gap-2\"}\n >\n {action.icon && <span className=\"text-muted-foreground\">{action.icon}</span>}\n <Label className=\"text-xs whitespace-nowrap\">{action.label}</Label>\n <Switch\n checked={action.value}\n onCheckedChange={(checked) => action.onChange(checked, api)}\n disabled={isDisabled(action.disabled)}\n />\n </div>\n );\n\n case \"separator\":\n return (\n <Separator\n key={action.id}\n orientation={isVertical ? \"horizontal\" : \"vertical\"}\n className={isVertical ? undefined : \"h-6\"}\n />\n );\n\n default:\n return null;\n }\n};\n\nexport default CustomActionRenderer;\n","/**\n * Canvas Component\n *\n * Renders the main canvas with elements, background, and snap guides.\n * Handles element rendering and stage interactions.\n */\n\nimport React, { useCallback, useRef, useState } from \"react\";\nimport { Stage, Layer, Rect, Image as KonvaImage } from \"react-konva\";\nimport { SnapGuides } from \"./SnapGuides\";\nimport { CentralizedTransformer } from \"./CentralizedTransformer\";\nimport { EditorElement, EditorMode, ElementRenderer } from \"../types\";\nimport { SnapGuide, getSnappingPosition } from \"../utils/snapping\";\nimport { ElementRegistry } from \"../core/ElementRegistry\";\n\nexport interface CanvasProps {\n /** Canvas size */\n canvasSize: { width: number; height: number };\n\n /** All elements to render */\n elements: EditorElement[];\n\n /** Currently selected element ID */\n selectedElementId: string | null;\n\n /** Element registry for looking up renderers */\n registry: ElementRegistry;\n\n /** Editor mode configuration */\n mode?: EditorMode;\n\n /** Whether the editor is in readonly mode */\n readonly?: boolean;\n\n /** Whether to enable snap guides */\n enableSnapGuides?: boolean;\n\n /** Whether to enable pan and zoom controls */\n enablePanZoom?: boolean;\n\n /** Optional background image URL - replaces solid background color when provided */\n backgroundImageUrl?: string;\n\n /** Whether to hide all elements on the canvas */\n hideElements?: boolean;\n\n /** Callback when an element is selected */\n onSelectElement: (id: string | null) => void;\n\n /** Callback when an element is transformed */\n onTransformElement: (id: string, updates: Partial<EditorElement>) => void;\n\n /** Optional custom style */\n style?: React.CSSProperties;\n\n /** Optional className */\n className?: string;\n}\n\n/**\n * Canvas component - renders the Konva stage with all elements\n */\nexport const Canvas: React.FC<CanvasProps> = ({\n canvasSize,\n elements,\n selectedElementId,\n registry,\n mode,\n readonly = false,\n enableSnapGuides = true,\n enablePanZoom = true,\n backgroundImageUrl,\n hideElements = false,\n onSelectElement,\n onTransformElement,\n style,\n className = \"\",\n}) => {\n const stageRef = useRef<any>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const [snapGuides, setSnapGuides] = useState<{\n vertical: SnapGuide[];\n horizontal: SnapGuide[];\n }>({ vertical: [], horizontal: [] });\n\n // Pan and zoom state\n const [stageScale, setStageScale] = useState(1);\n const [stagePosition, setStagePosition] = useState({ x: 0, y: 0 });\n const isPanning = useRef(false);\n\n // Container size for dynamic stage sizing\n const [containerSize, setContainerSize] = useState({ width: 800, height: 600 });\n\n // Background image state\n const [backgroundImage, setBackgroundImage] = useState<HTMLImageElement | null>(null);\n\n // Transformer update trigger - incremented when we need to force transformer re-attachment\n const [transformerUpdateTrigger, setTransformerUpdateTrigger] = useState(0);\n\n // Load background image when URL changes\n React.useEffect(() => {\n if (!backgroundImageUrl) {\n setBackgroundImage(null);\n return;\n }\n\n const img = new window.Image();\n img.crossOrigin = \"anonymous\";\n img.onload = () => {\n setBackgroundImage(img);\n };\n img.onerror = (err) => {\n console.error(\"Failed to load canvas background image:\", err);\n setBackgroundImage(null);\n };\n img.src = backgroundImageUrl;\n\n return () => {\n img.onload = null;\n img.onerror = null;\n };\n }, [backgroundImageUrl]);\n\n // Update container size on mount and resize\n React.useEffect(() => {\n const updateSize = () => {\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n setContainerSize({\n width: rect.width,\n height: rect.height,\n });\n }\n };\n\n updateSize();\n\n // Add resize observer to track container size changes\n const resizeObserver = new ResizeObserver(updateSize);\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current);\n }\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n // Calculate dynamic stage size that fits the container while showing the full canvas\n const stageSize = React.useMemo(() => {\n // Use container size, ensuring stage is at least as large as the container\n const width = Math.max(containerSize.width, canvasSize.width);\n const height = Math.max(containerSize.height, canvasSize.height);\n\n return { width, height };\n }, [containerSize, canvasSize]);\n\n // Calculate layer offset to center the canvas in the stage\n const layerOffset = React.useMemo(() => {\n return {\n x: Math.max(0, (stageSize.width - canvasSize.width) / 2),\n y: Math.max(0, (stageSize.height - canvasSize.height) / 2),\n };\n }, [stageSize, canvasSize]);\n\n // Handle click on canvas background (deselect)\n const handleStageClick = useCallback(\n (e: any) => {\n // Clicked on stage - deselect\n if (e.target === e.target.getStage()) {\n onSelectElement(null);\n }\n },\n [onSelectElement]\n );\n\n const onClearSnapGuides = useCallback(() => {\n setSnapGuides({ vertical: [], horizontal: [] });\n }, []);\n\n // Callback to force transformer re-attachment (e.g., when images load)\n const onTransformerUpdate = useCallback(() => {\n setTransformerUpdateTrigger((prev) => prev + 1);\n }, []);\n\n // Handle zoom (mouse wheel)\n const handleWheel = useCallback(\n (e: any) => {\n if (!enablePanZoom) return;\n\n e.evt.preventDefault();\n\n const stage = stageRef.current;\n if (!stage) return;\n\n const oldScale = stage.scaleX();\n const pointer = stage.getPointerPosition();\n\n // Calculate mouse position relative to stage\n const mousePointTo = {\n x: (pointer.x - stage.x()) / oldScale,\n y: (pointer.y - stage.y()) / oldScale,\n };\n\n // Zoom factor\n const scaleBy = 1.05;\n const direction = e.evt.deltaY > 0 ? -1 : 1;\n\n // Calculate new scale with limits\n let newScale = direction > 0 ? oldScale * scaleBy : oldScale / scaleBy;\n newScale = Math.max(0.1, Math.min(5, newScale)); // Limit zoom between 0.1x and 5x\n\n // Calculate new position to zoom towards mouse\n const newPos = {\n x: pointer.x - mousePointTo.x * newScale,\n y: pointer.y - mousePointTo.y * newScale,\n };\n\n setStageScale(newScale);\n setStagePosition(newPos);\n },\n [enablePanZoom]\n );\n\n // Handle pan start (middle mouse button or space + drag)\n const handleMouseDown = useCallback(\n (e: any) => {\n if (!enablePanZoom) return;\n\n // Middle mouse button or space + left click\n if (e.evt.button === 1 || (e.evt.button === 0 && e.evt.shiftKey)) {\n e.evt.preventDefault();\n isPanning.current = true;\n }\n },\n [enablePanZoom]\n );\n\n // Handle pan move\n const handleMouseMove = useCallback(\n (e: any) => {\n if (!enablePanZoom || !isPanning.current) return;\n\n e.evt.preventDefault();\n\n const stage = stageRef.current;\n if (!stage) return;\n\n const newPos = {\n x: stagePosition.x + e.evt.movementX,\n y: stagePosition.y + e.evt.movementY,\n };\n\n setStagePosition(newPos);\n },\n [enablePanZoom, stagePosition]\n );\n\n // Handle pan end\n const handleMouseUp = useCallback(() => {\n isPanning.current = false;\n }, []);\n\n // Update stage transform\n React.useEffect(() => {\n const stage = stageRef.current;\n if (stage) {\n stage.scale({ x: stageScale, y: stageScale });\n stage.position(stagePosition);\n stage.batchDraw();\n }\n }, [stageScale, stagePosition]);\n\n // Render element using registry\n const renderElement = useCallback(\n (element: EditorElement) => {\n const isSelected = selectedElementId === element.id;\n\n // Get the renderer from registry\n const renderer = registry.get(element.type);\n if (!renderer) {\n console.warn(`No renderer found for element type: ${element.type}`);\n return null;\n }\n\n // Get the renderer component\n const RendererComponent = renderer.renderComponent;\n if (!RendererComponent) {\n console.warn(`No renderComponent found for element type: ${element.type}`);\n return null;\n }\n\n // Common props for all renderers\n const commonProps = {\n element,\n isSelected,\n onSelect: () => !readonly && onSelectElement(element.id),\n onTransform: (updates: Partial<EditorElement>) =>\n !readonly && onTransformElement(element.id, updates),\n // Snapping callbacks\n allElements: elements,\n canvasSize,\n onSnapGuides: enableSnapGuides ? setSnapGuides : undefined,\n onClearSnapGuides: enableSnapGuides ? onClearSnapGuides : undefined,\n // Pass element ID for centralized transformer lookup\n elementId: element.id,\n // Disable individual transformers (centralized transformer will handle it)\n disableTransformer: true,\n // Callback to notify when node structure changes (e.g., image loads)\n onNodeUpdate: onTransformerUpdate,\n // Pass mode context to renderers (e.g., cardData for TemplatedText)\n ...(mode?.context || {}),\n };\n\n return <RendererComponent key={element.id} {...commonProps} />;\n },\n [\n selectedElementId,\n registry,\n readonly,\n onSelectElement,\n onTransformElement,\n elements,\n canvasSize,\n enableSnapGuides,\n onClearSnapGuides,\n onTransformerUpdate,\n mode,\n ]\n );\n\n // Sort elements by z-index\n const sortedElements = [...elements].sort((a, b) => a.zIndex - b.zIndex);\n\n return (\n <div\n className={`flex flex-1 overflow-hidden items-center justify-center ${className}`}\n style={style}\n >\n <div\n ref={containerRef}\n className=\"flex relative w-full h-full items-center justify-center overflow-hidden\"\n >\n {/* Zoom indicator */}\n {enablePanZoom && stageScale !== 1 && (\n <div\n style={{\n position: \"absolute\",\n top: 10,\n right: 10,\n zIndex: 10,\n background: \"rgba(0, 0, 0, 0.7)\",\n color: \"white\",\n padding: \"4px 12px\",\n borderRadius: \"4px\",\n fontSize: \"12px\",\n fontWeight: 500,\n pointerEvents: \"none\",\n }}\n >\n {Math.round(stageScale * 100)}%\n </div>\n )}\n\n <Stage\n className=\"w-full h-full\"\n ref={stageRef}\n width={stageSize.width}\n height={stageSize.height}\n onClick={handleStageClick}\n onTap={handleStageClick}\n onWheel={handleWheel}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n style={{\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n cursor: isPanning.current ? \"grabbing\" : \"default\",\n }}\n >\n <Layer x={layerOffset.x} y={layerOffset.y} listening={true}>\n {/* Canvas background - shows the actual canvas bounds */}\n {backgroundImage ? (\n <KonvaImage\n x={0}\n y={0}\n width={canvasSize.width}\n height={canvasSize.height}\n image={backgroundImage}\n listening={false}\n />\n ) : (\n <Rect\n x={0}\n y={0}\n width={canvasSize.width}\n height={canvasSize.height}\n fill={mode?.backgroundColor || \"#ffffff\"}\n listening={false}\n />\n )}\n\n {/* Elements can now render outside canvas bounds */}\n {!hideElements && sortedElements.map(renderElement)}\n\n {/* Snap guides */}\n {enableSnapGuides && (\n <SnapGuides\n verticalGuides={snapGuides.vertical}\n horizontalGuides={snapGuides.horizontal}\n canvasSize={canvasSize}\n />\n )}\n\n {/* Centralized Transformer */}\n <CentralizedTransformer\n selectedElementId={selectedElementId}\n stageRef={stageRef}\n isLocked={readonly}\n updateTrigger={transformerUpdateTrigger}\n onTransform={(elementId, updates) => {\n // During transform, calculate snap guides based on the new size/position\n if (!enableSnapGuides) return;\n\n const element = elements.find((el) => el.id === elementId);\n if (!element) return;\n\n // Create a temporary element with the updated properties for snapping calculation\n const tempElement = {\n ...element,\n position: updates.position || element.position,\n size: updates.size || element.size,\n rotation: updates.rotation ?? element.rotation,\n };\n\n // Calculate snapping based on the temporary element\n const snapResult = getSnappingPosition(\n tempElement,\n tempElement.position.x,\n tempElement.position.y,\n elements.filter((el) => el.id !== elementId),\n {\n threshold: 5,\n snapToElements: true,\n snapToCanvas: true,\n canvasSize,\n }\n );\n\n // Update snap guides (but don't apply position changes during resize)\n setSnapGuides({\n vertical: snapResult.verticalGuides,\n horizontal: snapResult.horizontalGuides,\n });\n }}\n onTransformEnd={(elementId, updates) => {\n onTransformElement(elementId, updates);\n // Clear snap guides after transform ends\n setSnapGuides({ vertical: [], horizontal: [] });\n }}\n />\n </Layer>\n </Stage>\n </div>\n </div>\n );\n};\n\nexport default Canvas;\n","/**\n * Snap Guides Component\n *\n * Renders visual guide lines when elements are being snapped.\n */\n\nimport React from \"react\";\nimport { Line } from \"react-konva\";\nimport { SnapGuide } from \"../utils/snapping\";\n\nexport interface SnapGuidesProps {\n /** Vertical guides to display */\n verticalGuides: SnapGuide[];\n /** Horizontal guides to display */\n horizontalGuides: SnapGuide[];\n /** Canvas size */\n canvasSize: { width: number; height: number };\n}\n\n/**\n * Snap guides renderer\n */\nexport const SnapGuides: React.FC<SnapGuidesProps> = ({\n verticalGuides,\n horizontalGuides,\n canvasSize,\n}) => {\n return (\n <>\n {/* Vertical guides */}\n {verticalGuides.map((guide, index) => (\n <Line\n key={`v-${index}`}\n points={[guide.position, 0, guide.position, canvasSize.height]}\n stroke={guide.type === \"center\" ? \"#ff00ff\" : \"#00ff00\"}\n strokeWidth={1}\n dash={guide.type === \"center\" ? [4, 4] : undefined}\n listening={false}\n />\n ))}\n\n {/* Horizontal guides */}\n {horizontalGuides.map((guide, index) => (\n <Line\n key={`h-${index}`}\n points={[0, guide.position, canvasSize.width, guide.position]}\n stroke={guide.type === \"center\" ? \"#ff00ff\" : \"#00ff00\"}\n strokeWidth={1}\n dash={guide.type === \"center\" ? [4, 4] : undefined}\n listening={false}\n />\n ))}\n </>\n );\n};\n","/**\n * Centralized Transformer Component\n *\n * A single transformer that handles all selected elements,\n * eliminating the need for individual transformers in each element.\n */\n\nimport React, { useEffect, useRef } from \"react\";\nimport { Transformer } from \"react-konva\";\nimport Konva from \"konva\";\nimport { KonvaEventObject } from \"konva/lib/Node\";\n\nexport interface CentralizedTransformerProps {\n /** ID of the selected element */\n selectedElementId: string | null;\n\n /** Reference to the stage to find nodes */\n stageRef: React.RefObject<Konva.Stage>;\n\n /** Whether the element is locked (readonly mode) */\n isLocked?: boolean;\n\n /** Update trigger - increment this to force re-attachment */\n updateTrigger?: number;\n\n /** Callback when transform ends */\n onTransformEnd?: (\n elementId: string,\n updates: {\n position?: { x: number; y: number };\n size?: { width: number; height: number };\n rotation?: number;\n }\n ) => void;\n\n /** Callback during transform for snap guides (optional) */\n onTransform?: (\n elementId: string,\n updates: {\n position?: { x: number; y: number };\n size?: { width: number; height: number };\n rotation?: number;\n }\n ) => void;\n}\n\n/**\n * Centralized transformer that attaches to the selected element\n */\nexport const CentralizedTransformer: React.FC<CentralizedTransformerProps> = ({\n selectedElementId,\n stageRef,\n isLocked = false,\n updateTrigger = 0,\n onTransformEnd,\n onTransform,\n}) => {\n const transformerRef = useRef<Konva.Transformer>(null);\n\n useEffect(() => {\n const transformer = transformerRef.current;\n const stage = stageRef.current;\n\n if (!transformer || !stage || !selectedElementId || isLocked) {\n // Clear transformer if no selection or locked\n if (transformer) {\n transformer.nodes([]);\n transformer.getLayer()?.batchDraw();\n }\n return;\n }\n\n // Find the selected node by ID\n // We need to search for a node with matching ID in the stage\n const findNodeById = (id: string): Konva.Node | null => {\n const layer = stage.getLayers()[0]; // Get the main layer\n if (!layer) return null;\n\n // Search through all children\n const findInChildren = (node: Konva.Node): Konva.Node | null => {\n // Check if this node has the ID we're looking for\n // We'll use the element's ID as part of the key, so we need to check attrs\n if (node.attrs.id === id || node.id() === id) {\n return node;\n }\n\n // Recursively search children\n const children = (node as any).getChildren?.();\n if (children) {\n for (const child of children) {\n const found = findInChildren(child);\n if (found) return found;\n }\n }\n\n return null;\n };\n\n return findInChildren(layer);\n };\n\n const selectedNode = findNodeById(selectedElementId);\n\n if (selectedNode && selectedNode.draggable()) {\n // Attach transformer to the node\n transformer.nodes([selectedNode]);\n transformer.getLayer()?.batchDraw();\n } else {\n transformer.nodes([]);\n transformer.getLayer()?.batchDraw();\n }\n }, [selectedElementId, stageRef, isLocked, updateTrigger]);\n\n const handleTransform = (e: KonvaEventObject<Event>) => {\n if (!onTransform || !selectedElementId) return;\n\n const node = e.target;\n const scaleX = node.scaleX();\n const scaleY = node.scaleY();\n\n const updates = {\n position: {\n x: node.x(),\n y: node.y(),\n },\n size: {\n width: Math.max(5, node.width() * scaleX),\n height: Math.max(5, node.height() * scaleY),\n },\n rotation: node.rotation(),\n };\n\n onTransform(selectedElementId, updates);\n };\n\n const handleTransformEnd = (e: KonvaEventObject<Event>) => {\n if (!onTransformEnd || !selectedElementId) return;\n\n const node = e.target;\n const scaleX = node.scaleX();\n const scaleY = node.scaleY();\n\n // Reset scale to 1 and apply it to width/height\n node.scaleX(1);\n node.scaleY(1);\n\n const updates = {\n position: {\n x: node.x(),\n y: node.y(),\n },\n size: {\n width: Math.max(5, node.width() * scaleX),\n height: Math.max(5, node.height() * scaleY),\n },\n rotation: node.rotation(),\n };\n\n onTransformEnd(selectedElementId, updates);\n };\n\n // Don't render if locked or no selection\n if (isLocked || !selectedElementId) {\n return null;\n }\n\n return (\n <Transformer\n ref={transformerRef}\n rotateEnabled={true}\n rotationSnaps={[0, 90, 180, 270]}\n keepRatio={false}\n anchorCornerRadius={2}\n flipEnabled={false}\n enabledAnchors={[\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n \"middle-left\",\n \"middle-right\",\n \"top-center\",\n \"bottom-center\",\n ]}\n boundBoxFunc={(oldBox, newBox) => {\n // Limit resize to minimum 20px\n if (newBox.width < 20 || newBox.height < 20) {\n return oldBox;\n }\n return newBox;\n }}\n onTransform={handleTransform}\n onTransformEnd={handleTransformEnd}\n />\n );\n};\n\nexport default CentralizedTransformer;\n","/**\n * Toolbar Component\n *\n * Provides controls for element creation, undo/redo, and editor actions.\n */\n\nimport React from \"react\";\nimport { Separator } from \"@/ui/separator\";\nimport { TooltipButton } from \"@/ui/general/TooltipButton\";\nimport { Plus } from \"lucide-react\";\nimport { EditorAPI, ElementRenderer, ToolbarConfig } from \"../types\";\nimport { createElement } from \"../utils/editorUtils\";\nimport { useEditorState } from \"../core/useEditorState\";\nimport CustomActionRenderer from \"./CustomActionRenderer\";\n\nexport interface ToolbarProps {\n /** Editor API for performing actions */\n api: EditorAPI;\n\n /** Available element renderers to create */\n elementRenderers: ElementRenderer[];\n\n /** Canvas size for positioning new elements */\n canvasSize: { width: number; height: number };\n\n /** Configuration for toolbar visibility and custom tools */\n config?: ToolbarConfig;\n\n /** Optional custom style */\n style?: React.CSSProperties;\n\n /** Optional className */\n className?: string;\n}\n\n/**\n * Toolbar component with element creation and editor controls\n */\nexport const Toolbar: React.FC<ToolbarProps> = ({\n api,\n elementRenderers,\n canvasSize,\n config,\n style,\n className,\n}) => {\n const selectedElement = api.getSelectedElement();\n\n // Default config values\n const {\n showElementTools = true,\n hiddenElementTypes = [],\n toolsStart = [],\n toolsEnd = [],\n toolsStartClassName = \"\",\n toolsEndClassName = \"\",\n customTools = [], // Backwards compatibility - defaults to end\n } = config || {};\n\n // Combine toolsEnd with customTools for backwards compatibility\n const endTools = [...toolsEnd, ...customTools];\n\n // Filter element renderers based on configuration\n const visibleRenderers = showElementTools\n ? elementRenderers.filter((renderer) => !hiddenElementTypes.includes(renderer.type))\n : [];\n\n // Create a new element of the given type\n const handleCreateElement = (renderer: ElementRenderer) => {\n const newElement = createElement(renderer.type, renderer.defaultProps, {\n position: { x: canvasSize.width / 2, y: canvasSize.height / 2 }, // Center of canvas\n size: {\n width: renderer.defaultSize?.width || 100,\n height: renderer.defaultSize?.height || 100,\n },\n zIndex: api.getAllElements().length, // Top of stack\n });\n\n api.addElement(newElement);\n api.selectElement(newElement.id);\n };\n\n // Helper to check if an action should be disabled\n const isDisabled = (disabled: boolean | ((api: EditorAPI) => boolean) | undefined): boolean => {\n if (typeof disabled === \"function\") {\n return disabled(api);\n }\n return disabled || false;\n };\n\n return (\n <div\n className={`flex flex-col justify-start items-center bg-popover gap-2 p-2 ${className}`}\n style={style}\n >\n {/* Custom Tools - Start (before element creation tools) */}\n {toolsStart.length > 0 && (\n <>\n <div className={`flex flex-col gap-1 ${toolsStartClassName}`}>\n {toolsStart.map((tool) => (\n <CustomActionRenderer key={tool.id} action={tool} api={api} layout=\"vertical\" />\n ))}\n </div>\n {/* Separator after start tools if there are more sections */}\n {(visibleRenderers.length > 0 || endTools.length > 0) && (\n <Separator orientation=\"horizontal\" />\n )}\n </>\n )}\n\n {/* Element Creation Buttons */}\n {visibleRenderers.length > 0 && (\n <>\n <div className=\"flex flex-col gap-1\">\n {visibleRenderers.map((renderer) => (\n <TooltipButton\n key={renderer.type}\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleCreateElement(renderer)}\n className=\"icon-button\"\n tooltip={`Add ${renderer.displayName}`}\n tooltipDelay={500}\n tooltipSide=\"right\"\n >\n {renderer.icon || <Plus className=\"h-4 w-4\" />}\n </TooltipButton>\n ))}\n </div>\n {/* Separator after element tools if there are end tools */}\n {endTools.length > 0 && (\n <Separator orientation=\"horizontal\" />\n )}\n </>\n )}\n\n {/* Custom Tools - End (after element creation tools) */}\n {endTools.length > 0 && (\n <div className={`flex flex-col gap-1 ${toolsEndClassName}`}>\n {endTools.map((tool) => (\n <CustomActionRenderer key={tool.id} action={tool} api={api} layout=\"vertical\" />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default Toolbar;\n","/**\n * Asset Picker Panel\n *\n * Displays project assets that can be dragged/clicked to use in the editor.\n * Integrates with useProjectAssets to show game assets.\n */\n\nimport React from \"react\";\nimport { ScrollArea } from \"@/ui/scroll-area\";\nimport { Input } from \"@/ui/input\";\nimport { Search } from \"lucide-react\";\n\nexport interface AssetPickerProps {\n /** List of assets to display */\n assets: Array<{\n name: string;\n path: string;\n type?: string;\n }>;\n\n /** Callback when an asset is selected */\n onAssetSelect?: (assetPath: string) => void;\n\n /** Custom render function for asset items */\n renderAsset?: (asset: { name: string; path: string; type?: string }) => React.ReactNode;\n\n /** Custom CSS class */\n className?: string;\n\n /** Title for the panel */\n title?: string;\n}\n\n/**\n * Asset Picker component that displays available assets\n */\nexport const AssetPicker: React.FC<AssetPickerProps> = ({\n assets,\n onAssetSelect,\n renderAsset,\n className = \"\",\n title = \"Assets\",\n}) => {\n const [searchQuery, setSearchQuery] = React.useState(\"\");\n\n // Filter assets based on search query\n const filteredAssets = React.useMemo(() => {\n if (!searchQuery) return assets;\n const query = searchQuery.toLowerCase();\n return assets.filter((asset) => asset.name.toLowerCase().includes(query));\n }, [assets, searchQuery]);\n\n // Default asset renderer\n const defaultRenderAsset = React.useCallback(\n (asset: { name: string; path: string; type?: string }) => {\n const isImage = asset.name.match(/\\.(jpg|jpeg|png|gif|svg|webp)$/i);\n\n return (\n <div\n key={asset.path}\n className=\"flex flex-col items-center p-2 border rounded hover:bg-accent cursor-pointer transition-colors\"\n onClick={() => onAssetSelect?.(asset.path)}\n title={asset.name}\n >\n {isImage ? (\n <div className=\"w-16 h-16 flex items-center justify-center bg-muted rounded mb-1\">\n <img\n src={`asset:///${asset.path}`}\n alt={asset.name}\n className=\"max-w-full max-h-full object-contain\"\n onError={(e) => {\n // Fallback if image fails to load\n e.currentTarget.style.display = \"none\";\n e.currentTarget.parentElement!.innerHTML = `\n <div class=\"text-xs text-muted-foreground\">Image</div>\n `;\n }}\n />\n </div>\n ) : (\n <div className=\"w-16 h-16 flex items-center justify-center bg-muted rounded mb-1\">\n <div className=\"text-xs text-muted-foreground\">File</div>\n </div>\n )}\n <div className=\"text-xs text-center truncate w-full\">{asset.name}</div>\n </div>\n );\n },\n [onAssetSelect]\n );\n\n const assetRenderer = renderAsset || defaultRenderAsset;\n\n return (\n <div className={`flex flex-col bg-background border-t ${className || 'h-full'}`}>\n {/* Header */}\n <div className=\"p-3 border-b\">\n <h3 className=\"text-sm font-semibold mb-2\">{title}</h3>\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder=\"Search assets...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-8 h-8 text-sm\"\n />\n </div>\n </div>\n\n {/* Asset Grid */}\n <ScrollArea className=\"flex-1\">\n {filteredAssets.length > 0 ? (\n <div className=\"grid grid-cols-3 gap-2 p-3\">\n {filteredAssets.map((asset) => assetRenderer(asset))}\n </div>\n ) : (\n <div className=\"flex items-center justify-center h-32 text-sm text-muted-foreground\">\n {searchQuery ? \"No assets found\" : \"No assets available\"}\n </div>\n )}\n </ScrollArea>\n </div>\n );\n};\n\nexport default AssetPicker;\n","/**\n * Visual Editor - Main Entry Point\n *\n * Exports all public APIs for the visual editor module.\n * This is the main entry point for consuming the editor.\n */\n\n// Main component\nexport { VisualEditor } from \"./core/VisualEditor\";\n\n// UI Components\nexport { Inspector, renderField } from \"./components/Inspector\";\nexport { LayersPanel } from \"./components/LayersPanel\";\nexport { VisualEditorWorkspace } from \"./components/VisualEditorWorkspace\";\nexport { AssetPicker } from \"./components/AssetPicker\";\nexport type { AssetPickerProps } from \"./components/AssetPicker\";\n\n// Core hooks and utilities\nexport { useEditorState } from \"./core/useEditorState\";\nexport { ElementRegistry, useElementRegistry, globalElementRegistry } from \"./core/ElementRegistry\";\n\n// Built-in elements\nexport { defaultElements, textElementRenderer, imageElementRenderer } from \"./elements\";\nexport { TextElementRenderer } from \"./elements/TextElement\";\nexport { ImageElementRenderer } from \"./elements/ImageElement\";\n\n// Utility functions\nexport * from \"./utils/editorUtils\";\n\n// Type definitions\nexport type {\n // Core types\n EditorElement,\n EditorAPI,\n EditorMode,\n EditorState,\n EditorAction,\n\n // Element types\n ElementRenderer,\n TextElementProps,\n ImageElementProps,\n\n // Inspector types\n InspectorFieldType,\n InspectorFieldSchema,\n CustomRendererProps,\n\n // Canvas types\n CanvasExport,\n\n // Component props\n VisualEditorProps,\n} from \"./types\";\n\n// Snapping utilities\nexport * from \"./utils/snapping\";\n"],"mappings":"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","names":["useCallback","duplicateElement","generateElementId","useMemo","React","Text","Fragment","jsx","jsxs","React","Text","jsx","useCallback","React","React","jsx","React","jsx","React","jsx","jsxs","React","jsx","React","jsx","jsxs","jsxs","jsx","React","jsx","React","Check","jsx","Check","Fragment","jsx","jsxs","React","React","cva","jsx","cva","React","jsx","jsxs","React","React","cva","jsx","cva","React","jsx","jsx","jsxs","jsx","ChevronDown","Type","ChevronUp","jsx","jsxs","Type","React","ChevronUp","ChevronDown","React","useCallback","Trash2","Image","React","jsx","jsx","jsxs","Fragment","jsx","jsxs","Image","Trash2","React","useCallback","useRef","Stage","Layer","Rect","KonvaImage","Fragment","jsx","jsxs","useEffect","useRef","Transformer","jsx","jsx","jsxs","useRef","React","useCallback","Stage","Layer","KonvaImage","Rect","Plus","Fragment","jsx","jsxs","Plus","jsx","jsxs","React","useCallback","React","jsx","jsxs","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/VisualEditor.tsx","../src/core/useEditorState.ts","../src/utils/editorUtils.ts","../src/core/ElementRegistry.ts","../src/elements/TextElement.tsx","../src/utils/snapping.ts","../src/elements/ImageElement.tsx","../src/elements/index.ts","../src/components/Inspector.tsx","../src/ui/input.tsx","../src/lib/utils.ts","../src/ui/label.tsx","../src/ui/slider.tsx","../src/ui/separator.tsx","../src/ui/select.tsx","../src/ui/textarea.tsx","../src/ui/checkbox.tsx","../src/components/LayersPanel.tsx","../src/ui/badge.tsx","../src/ui/scroll-area.tsx","../src/ui/general/TooltipButton.tsx","../src/ui/button.tsx","../src/ui/tooltip.tsx","../src/ui/general/TooltipWrapper.tsx","../src/components/VisualEditorWorkspace.tsx","../src/components/Topbar.tsx","../src/ui/switch.tsx","../src/components/CustomActionRenderer.tsx","../src/components/Canvas.tsx","../src/components/SnapGuides.tsx","../src/components/CentralizedTransformer.tsx","../src/components/Toolbar.tsx","../src/components/AssetPicker.tsx"],"sourcesContent":["/**\n * Visual Editor - Main Editor Component\n *\n * The core editor component that integrates all functionality:\n * - Canvas rendering with Konva\n * - Element management\n * - Selection and transformation\n * - Mode switching\n */\n\nimport React, { useEffect, useCallback, useRef } from \"react\";\nimport { Stage, Layer } from \"react-konva\";\nimport { VisualEditorProps, EditorElement, EditorMode } from \"../types\";\nimport { useEditorState } from \"./useEditorState\";\nimport { ElementRegistry, useElementRegistry } from \"./ElementRegistry\";\nimport { defaultElements } from \"../elements\";\n\n/**\n * Main Visual Editor Component\n */\nexport const VisualEditor: React.FC<VisualEditorProps> = ({\n mode,\n initialData,\n width: propWidth,\n height: propHeight,\n readonly = false,\n onChange,\n onSelectionChange,\n onExport,\n customElements = [],\n showToolbar = true,\n showInspector = true,\n className = \"\",\n style = {},\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const stageRef = useRef<any>(null);\n\n // Initialize editor state\n const {\n state,\n api,\n setCanvasSize,\n setMode: setEditorMode,\n undo,\n redo,\n canUndo,\n canRedo,\n } = useEditorState(mode || null);\n\n // Initialize element registry\n const registry = useElementRegistry([\n ...defaultElements,\n ...(mode?.registeredElements || []),\n ...customElements,\n ]);\n\n // Determine canvas size\n const canvasWidth = propWidth || state.canvasSize.width || mode?.defaultCanvasSize.width || 800;\n const canvasHeight =\n propHeight || state.canvasSize.height || mode?.defaultCanvasSize.height || 600;\n\n // Update canvas size when props change\n useEffect(() => {\n if (propWidth && propHeight) {\n setCanvasSize(propWidth, propHeight);\n }\n }, [propWidth, propHeight, setCanvasSize]);\n\n // Load initial data\n useEffect(() => {\n if (initialData) {\n api.importJSON(initialData);\n }\n }, [initialData, api]);\n\n // Update mode when it changes\n useEffect(() => {\n if (mode) {\n setEditorMode(mode);\n // Register mode elements\n if (mode.registeredElements) {\n mode.registeredElements.forEach((el) => registry.register(el));\n }\n // Call mode activation hook\n if (mode.onModeActivate) {\n mode.onModeActivate(api);\n }\n }\n }, [mode, setEditorMode, registry, api]);\n\n // Notify parent of changes\n useEffect(() => {\n if (onChange) {\n const data = api.exportJSON();\n onChange(data);\n }\n }, [state.elements, onChange, api]);\n\n // Notify parent of selection changes\n useEffect(() => {\n if (onSelectionChange) {\n const selected = api.getSelectedElement();\n onSelectionChange(selected);\n }\n }, [state.selectedElementId, onSelectionChange, api]);\n\n // Handle keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Undo: Ctrl/Cmd + Z\n if ((e.ctrlKey || e.metaKey) && e.key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n undo();\n }\n // Redo: Ctrl/Cmd + Shift + Z or Ctrl/Cmd + Y\n if (\n ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === \"z\") ||\n ((e.ctrlKey || e.metaKey) && e.key === \"y\")\n ) {\n e.preventDefault();\n redo();\n }\n // Delete: Delete or Backspace\n if ((e.key === \"Delete\" || e.key === \"Backspace\") && !readonly) {\n e.preventDefault();\n const selected = api.getSelectedElement();\n if (selected) {\n api.removeElement(selected.id);\n }\n }\n // Deselect: Escape\n if (e.key === \"Escape\") {\n e.preventDefault();\n api.selectElement(null);\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [undo, redo, readonly, api]);\n\n // Render an element using its registered renderer\n const renderElement = useCallback(\n (element: EditorElement) => {\n const renderer = registry.get(element.type);\n if (!renderer) {\n console.warn(`No renderer found for element type: ${element.type}`);\n return null;\n }\n\n // Get the renderer component\n const RendererComponent = renderer.renderComponent;\n if (!RendererComponent) {\n console.warn(`No renderComponent found for element type: ${element.type}`);\n return null;\n }\n\n const isSelected = state.selectedElementId === element.id;\n\n return (\n <RendererComponent\n key={element.id}\n element={element}\n isSelected={isSelected}\n onSelect={() => !readonly && api.selectElement(element.id)}\n onTransform={(updates) => !readonly && api.updateElement(element.id, updates)}\n />\n );\n },\n [registry, state.selectedElementId, readonly, api]\n );\n\n // Handle click on canvas background (deselect)\n const handleStageClick = useCallback(\n (e: any) => {\n // Clicked on stage - deselect\n if (e.target === e.target.getStage()) {\n api.selectElement(null);\n }\n },\n [api]\n );\n\n // Sort elements by z-index for proper rendering order\n const sortedElements = [...state.elements].sort((a, b) => a.zIndex - b.zIndex);\n\n return (\n <div\n ref={containerRef}\n className={`visual-editor ${className}`}\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n backgroundColor: mode?.backgroundColor || \"#f0f0f0\",\n ...style,\n }}\n >\n {/* Canvas */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n overflow: \"auto\",\n }}\n >\n <Stage\n ref={stageRef}\n width={canvasWidth}\n height={canvasHeight}\n onClick={handleStageClick}\n onTap={handleStageClick}\n style={{\n backgroundColor: \"#ffffff\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n }}\n >\n <Layer>{sortedElements.map(renderElement)}</Layer>\n </Stage>\n </div>\n </div>\n );\n};\n","/**\n * Visual Editor - Core State Management\n *\n * Provides the state management logic for the visual editor using useReducer.\n * This hook encapsulates all state mutations and provides a clean API.\n */\n\nimport { useReducer, useCallback, useMemo } from \"react\";\nimport {\n EditorState,\n EditorAction,\n EditorElement,\n EditorAPI,\n EditorMode,\n CanvasExport,\n} from \"../types\";\nimport { \n duplicateElement as duplicateElementUtil,\n generateElementId \n} from \"../utils/editorUtils\";\n\n/**\n * Initial state for the editor\n */\nconst createInitialState = (mode: EditorMode | null): EditorState => ({\n elements: [],\n selectedElementId: null,\n canvasSize: mode?.defaultCanvasSize || { width: 800, height: 600 },\n zoom: 1,\n pan: { x: 0, y: 0 },\n mode,\n history: {\n past: [],\n future: [],\n },\n});\n\n/**\n * State reducer for the editor\n */\nconst editorReducer = (state: EditorState, action: EditorAction): EditorState => {\n switch (action.type) {\n case \"ADD_ELEMENT\": {\n // Normalize element to ensure it has visible and locked properties\n const normalizedElement = {\n ...action.element,\n visible: action.element.visible ?? true,\n locked: action.element.locked ?? false,\n };\n const newElements = [...state.elements, normalizedElement];\n return {\n ...state,\n elements: newElements,\n selectedElementId: normalizedElement.id,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n }\n\n case \"UPDATE_ELEMENT\": {\n const newElements = state.elements.map((el) =>\n el.id === action.id ? { ...el, ...action.updates } : el\n );\n return {\n ...state,\n elements: newElements,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n }\n\n case \"REMOVE_ELEMENT\": {\n const newElements = state.elements.filter((el) => el.id !== action.id);\n return {\n ...state,\n elements: newElements,\n selectedElementId: state.selectedElementId === action.id ? null : state.selectedElementId,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n }\n\n case \"SELECT_ELEMENT\":\n return {\n ...state,\n selectedElementId: action.id,\n };\n\n case \"SET_ELEMENTS\":\n return {\n ...state,\n elements: action.elements,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n\n case \"LOAD_ELEMENTS\":\n // Load elements without recording history (for initial load)\n return {\n ...state,\n elements: action.elements.map((el) => ({\n ...el,\n visible: el.visible ?? true,\n locked: el.locked ?? false,\n })),\n };\n\n case \"REORDER_ELEMENT\": {\n const currentIndex = state.elements.findIndex((el) => el.id === action.elementId);\n if (currentIndex === -1 || currentIndex === action.newIndex) return state;\n\n const newElements = [...state.elements];\n const [element] = newElements.splice(currentIndex, 1);\n newElements.splice(action.newIndex, 0, element);\n\n // Update z-indices to match array indices\n newElements.forEach((el, index) => {\n el.zIndex = index;\n });\n\n return {\n ...state,\n elements: newElements,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n }\n\n case \"SET_CANVAS_SIZE\":\n return {\n ...state,\n canvasSize: {\n width: action.width,\n height: action.height,\n },\n };\n\n case \"SET_ZOOM\":\n return {\n ...state,\n zoom: action.zoom,\n };\n\n case \"SET_PAN\":\n return {\n ...state,\n pan: {\n x: action.x,\n y: action.y,\n },\n };\n\n case \"SET_MODE\":\n return {\n ...state,\n mode: action.mode,\n canvasSize: action.mode.defaultCanvasSize,\n };\n\n case \"CLEAR\":\n return {\n ...state,\n elements: [],\n selectedElementId: null,\n history: {\n past: [...state.history.past, state.elements],\n future: [],\n },\n };\n\n case \"UNDO\": {\n if (state.history.past.length === 0) return state;\n const previous = state.history.past[state.history.past.length - 1];\n const newPast = state.history.past.slice(0, -1);\n return {\n ...state,\n elements: previous,\n history: {\n past: newPast,\n future: [state.elements, ...state.history.future],\n },\n };\n }\n\n case \"REDO\": {\n if (state.history.future.length === 0) return state;\n const next = state.history.future[0];\n const newFuture = state.history.future.slice(1);\n return {\n ...state,\n elements: next,\n history: {\n past: [...state.history.past, state.elements],\n future: newFuture,\n },\n };\n }\n\n default:\n return state;\n }\n};\n\n/**\n * Custom hook for managing editor state\n */\nexport const useEditorState = (initialMode: EditorMode | null = null) => {\n const [state, dispatch] = useReducer(editorReducer, createInitialState(initialMode));\n\n // ============================================================================\n // API Methods\n // ============================================================================\n\n const addElement = useCallback((element: EditorElement) => {\n dispatch({ type: \"ADD_ELEMENT\", element });\n }, []);\n\n const updateElement = useCallback((id: string, updates: Partial<EditorElement>) => {\n dispatch({ type: \"UPDATE_ELEMENT\", id, updates });\n }, []);\n\n const removeElement = useCallback((id: string) => {\n dispatch({ type: \"REMOVE_ELEMENT\", id });\n }, []);\n\n const selectElement = useCallback((id: string | null) => {\n dispatch({ type: \"SELECT_ELEMENT\", id });\n }, []);\n\n const getSelectedElement = useCallback((): EditorElement | null => {\n if (!state.selectedElementId) return null;\n return state.elements.find((el) => el.id === state.selectedElementId) || null;\n }, [state.selectedElementId, state.elements]);\n\n const getAllElements = useCallback((): EditorElement[] => {\n return state.elements;\n }, [state.elements]);\n\n const moveElement = useCallback(\n (id: string, deltaX: number, deltaY: number) => {\n const element = state.elements.find((el) => el.id === id);\n if (!element) return;\n\n updateElement(id, {\n position: {\n x: element.position.x + deltaX,\n y: element.position.y + deltaY,\n },\n });\n },\n [state.elements, updateElement]\n );\n\n const rotateElement = useCallback(\n (id: string, angle: number) => {\n updateElement(id, { rotation: angle });\n },\n [updateElement]\n );\n\n const resizeElement = useCallback(\n (id: string, width: number, height: number) => {\n updateElement(id, {\n size: { width, height },\n });\n },\n [updateElement]\n );\n\n const updateZIndex = useCallback(\n (id: string, zIndex: number) => {\n updateElement(id, { zIndex });\n },\n [updateElement]\n );\n\n const reorderElement = useCallback((id: string, newIndex: number) => {\n dispatch({ type: \"REORDER_ELEMENT\", elementId: id, newIndex });\n }, []);\n\n const exportJSON = useCallback((): CanvasExport => {\n return {\n width: state.canvasSize.width,\n height: state.canvasSize.height,\n elements: state.elements,\n metadata: {\n version: \"1.0.0\",\n mode: state.mode?.name,\n created: new Date().toISOString(),\n },\n };\n }, [state.canvasSize, state.elements, state.mode]);\n\n const importJSON = useCallback((data: CanvasExport) => {\n dispatch({\n type: \"SET_CANVAS_SIZE\",\n width: data.width,\n height: data.height,\n });\n dispatch({ type: \"SET_ELEMENTS\", elements: data.elements });\n }, []);\n\n const clear = useCallback(() => {\n dispatch({ type: \"CLEAR\" });\n }, []);\n\n const setCanvasSize = useCallback((width: number, height: number) => {\n dispatch({ type: \"SET_CANVAS_SIZE\", width, height });\n }, []);\n\n const setMode = useCallback((mode: EditorMode) => {\n dispatch({ type: \"SET_MODE\", mode });\n }, []);\n\n const undo = useCallback(() => {\n dispatch({ type: \"UNDO\" });\n }, []);\n\n const redo = useCallback(() => {\n dispatch({ type: \"REDO\" });\n }, []);\n\n // ============================================================================\n // Copy/Paste/Duplicate Operations\n // ============================================================================\n\n const copyElement = useCallback(\n (id: string | null = null): EditorElement | null => {\n const elementToCopy = id ? state.elements.find((el) => el.id === id) : getSelectedElement();\n\n if (!elementToCopy) return null;\n\n // Return a deep copy for clipboard\n return {\n ...elementToCopy,\n props: { ...elementToCopy.props },\n position: { ...elementToCopy.position },\n size: { ...elementToCopy.size },\n };\n },\n [state.elements, getSelectedElement]\n );\n\n const duplicateElement = useCallback(\n (id: string | null = null, offset = { x: 20, y: 20 }) => {\n const elementToDuplicate = id\n ? state.elements.find((el) => el.id === id)\n : getSelectedElement();\n\n if (!elementToDuplicate) return;\n\n const duplicated = duplicateElementUtil(elementToDuplicate, offset);\n\n addElement(duplicated);\n },\n [state.elements, getSelectedElement, addElement]\n );\n\n const pasteElement = useCallback(\n (copiedElement: EditorElement, offset = { x: 20, y: 20 }) => {\n if (!copiedElement) return;\n\n // Create new element with new ID and offset position\n const pasted: EditorElement = {\n ...copiedElement,\n id: generateElementId(),\n props: { ...copiedElement.props },\n position: {\n x: copiedElement.position.x + offset.x,\n y: copiedElement.position.y + offset.y,\n },\n size: { ...copiedElement.size },\n zIndex: Math.max(...state.elements.map((el) => el.zIndex), 0) + 1,\n };\n\n addElement(pasted);\n },\n [state.elements, addElement]\n );\n\n // ============================================================================\n // Clear state history\n // ============================================================================\n\n const clearHistory = useCallback(() => {\n state.history.past = [];\n state.history.future = [];\n }, []);\n\n // ============================================================================\n // Load elements without history\n // ============================================================================\n\n const loadElements = useCallback((elements: EditorElement[]) => {\n dispatch({ type: \"LOAD_ELEMENTS\", elements });\n }, []);\n\n // ============================================================================\n // Build API Object\n // ============================================================================\n\n const api: EditorAPI = useMemo(\n () => ({\n addElement,\n updateElement,\n removeElement,\n selectElement,\n getSelectedElement,\n getAllElements,\n moveElement,\n rotateElement,\n resizeElement,\n updateZIndex,\n reorderElement,\n exportJSON,\n importJSON,\n clear,\n copyElement,\n duplicateElement,\n pasteElement,\n clearHistory,\n loadElements,\n }),\n [\n addElement,\n updateElement,\n removeElement,\n selectElement,\n getSelectedElement,\n getAllElements,\n moveElement,\n rotateElement,\n resizeElement,\n updateZIndex,\n reorderElement,\n exportJSON,\n importJSON,\n clear,\n copyElement,\n duplicateElement,\n pasteElement,\n clearHistory,\n loadElements,\n ]\n );\n\n return {\n state,\n api,\n // Additional helpers\n setCanvasSize,\n setMode,\n undo,\n redo,\n canUndo: state.history.past.length > 0,\n canRedo: state.history.future.length > 0,\n };\n};\n","/**\n * Visual Editor - Utility Functions\n *\n * Common utility functions used throughout the visual editor.\n */\n\nimport { EditorElement, CanvasExport } from \"../types\";\nimport { v4 as uuidv4 } from \"uuid\";\n\n/**\n * Generate a unique ID for an element\n */\nexport const generateElementId = (): string => {\n return `element-${uuidv4()}`;\n};\n\n/**\n * Create a new element with default values\n */\nexport const createElement = <TProps = any>(\n type: string,\n props: TProps,\n options?: {\n position?: { x: number; y: number };\n size?: { width: number; height: number };\n rotation?: number;\n opacity?: number;\n zIndex?: number;\n visible?: boolean;\n locked?: boolean;\n displayName?: string;\n }\n): EditorElement<TProps> => {\n return {\n id: generateElementId(),\n type,\n position: options?.position || { x: 0, y: 0 },\n size: options?.size || { width: 100, height: 100 },\n rotation: options?.rotation || 0,\n opacity: options?.opacity ?? 1,\n zIndex: options?.zIndex || 0,\n visible: options?.visible ?? true,\n locked: options?.locked ?? false,\n displayName: options?.displayName,\n props,\n };\n};\n\n/**\n * Deep clone an element\n */\nexport const cloneElement = <TProps = any>(\n element: EditorElement<TProps>\n): EditorElement<TProps> => {\n return {\n ...element,\n id: generateElementId(), // New ID for the clone\n props: { ...element.props },\n position: { ...element.position },\n size: { ...element.size },\n };\n};\n\n/**\n * Duplicate an element with a slight offset\n */\nexport const duplicateElement = <TProps = any>(\n element: EditorElement<TProps>,\n offset: { x: number; y: number } = { x: 20, y: 20 }\n): EditorElement<TProps> => {\n const cloned = cloneElement(element);\n return {\n ...cloned,\n position: {\n x: element.position.x + offset.x,\n y: element.position.y + offset.y,\n },\n zIndex: element.zIndex + 1, // Place on top\n };\n};\n\n/**\n * Sort elements by z-index (ascending)\n */\nexport const sortByZIndex = (elements: EditorElement[]): EditorElement[] => {\n return [...elements].sort((a, b) => a.zIndex - b.zIndex);\n};\n\n/**\n * Get the highest z-index among elements\n */\nexport const getMaxZIndex = (elements: EditorElement[]): number => {\n if (elements.length === 0) return 0;\n return Math.max(...elements.map((el) => el.zIndex));\n};\n\n/**\n * Bring an element to front\n */\nexport const bringToFront = (elements: EditorElement[], elementId: string): EditorElement[] => {\n const maxZ = getMaxZIndex(elements);\n return elements.map((el) => (el.id === elementId ? { ...el, zIndex: maxZ + 1 } : el));\n};\n\n/**\n * Send an element to back\n */\nexport const sendToBack = (elements: EditorElement[], elementId: string): EditorElement[] => {\n const minZ = Math.min(...elements.map((el) => el.zIndex));\n return elements.map((el) => (el.id === elementId ? { ...el, zIndex: minZ - 1 } : el));\n};\n\n/**\n * Check if two rectangles overlap\n */\nexport const checkOverlap = (\n rect1: { x: number; y: number; width: number; height: number },\n rect2: { x: number; y: number; width: number; height: number }\n): boolean => {\n return !(\n rect1.x + rect1.width < rect2.x ||\n rect2.x + rect2.width < rect1.x ||\n rect1.y + rect1.height < rect2.y ||\n rect2.y + rect2.height < rect1.y\n );\n};\n\n/**\n * Check if a point is inside a rectangle\n */\nexport const pointInRect = (\n point: { x: number; y: number },\n rect: { x: number; y: number; width: number; height: number }\n): boolean => {\n return (\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height\n );\n};\n\n/**\n * Snap a value to grid\n */\nexport const snapToGrid = (value: number, gridSize: number): number => {\n return Math.round(value / gridSize) * gridSize;\n};\n\n/**\n * Snap position to grid\n */\nexport const snapPositionToGrid = (\n position: { x: number; y: number },\n gridSize: number\n): { x: number; y: number } => {\n return {\n x: snapToGrid(position.x, gridSize),\n y: snapToGrid(position.y, gridSize),\n };\n};\n\n/**\n * Constrain a value between min and max\n */\nexport const clamp = (value: number, min: number, max: number): number => {\n return Math.min(Math.max(value, min), max);\n};\n\n/**\n * Constrain position within canvas bounds\n */\nexport const constrainToCanvas = (\n position: { x: number; y: number },\n size: { width: number; height: number },\n canvasSize: { width: number; height: number }\n): { x: number; y: number } => {\n return {\n x: clamp(position.x, 0, canvasSize.width - size.width),\n y: clamp(position.y, 0, canvasSize.height - size.height),\n };\n};\n\n/**\n * Calculate bounding box for rotated rectangle\n */\nexport const getRotatedBoundingBox = (\n x: number,\n y: number,\n width: number,\n height: number,\n rotation: number\n): { x: number; y: number; width: number; height: number } => {\n const rad = (rotation * Math.PI) / 180;\n const cos = Math.abs(Math.cos(rad));\n const sin = Math.abs(Math.sin(rad));\n\n const newWidth = width * cos + height * sin;\n const newHeight = width * sin + height * cos;\n\n return {\n x: x - (newWidth - width) / 2,\n y: y - (newHeight - height) / 2,\n width: newWidth,\n height: newHeight,\n };\n};\n\n/**\n * Export canvas to JSON string\n */\nexport const exportToJSON = (data: CanvasExport): string => {\n return JSON.stringify(data, null, 2);\n};\n\n/**\n * Import canvas from JSON string\n */\nexport const importFromJSON = (json: string): CanvasExport => {\n try {\n const data = JSON.parse(json);\n // Validate basic structure\n if (!data.width || !data.height || !Array.isArray(data.elements)) {\n throw new Error(\"Invalid canvas data structure\");\n }\n\n // Normalize elements to ensure they have visible and locked properties\n const normalizedElements = data.elements.map((element: EditorElement) => ({\n ...element,\n visible: element.visible ?? true,\n locked: element.locked ?? false,\n }));\n\n return {\n ...data,\n elements: normalizedElements,\n };\n } catch (error) {\n throw new Error(`Failed to parse canvas data: ${(error as Error).message}`);\n }\n};\n\n/**\n * Calculate center point of an element\n */\nexport const getElementCenter = (element: EditorElement): { x: number; y: number } => {\n return {\n x: element.position.x + element.size.width / 2,\n y: element.position.y + element.size.height / 2,\n };\n};\n\n/**\n * Calculate distance between two points\n */\nexport const distance = (p1: { x: number; y: number }, p2: { x: number; y: number }): number => {\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n return Math.sqrt(dx * dx + dy * dy);\n};\n\n/**\n * Degrees to radians\n */\nexport const degToRad = (degrees: number): number => {\n return (degrees * Math.PI) / 180;\n};\n\n/**\n * Radians to degrees\n */\nexport const radToDeg = (radians: number): number => {\n return (radians * 180) / Math.PI;\n};\n\n/**\n * Validate element data\n */\nexport const isValidElement = (element: any): element is EditorElement => {\n return (\n element &&\n typeof element.id === \"string\" &&\n typeof element.type === \"string\" &&\n element.position &&\n typeof element.position.x === \"number\" &&\n typeof element.position.y === \"number\" &&\n element.size &&\n typeof element.size.width === \"number\" &&\n typeof element.size.height === \"number\" &&\n typeof element.rotation === \"number\" &&\n typeof element.zIndex === \"number\" &&\n element.props !== undefined\n );\n};\n\n/**\n * Validate canvas export data\n */\nexport const isValidCanvasExport = (data: any): data is CanvasExport => {\n return (\n data &&\n typeof data.width === \"number\" &&\n typeof data.height === \"number\" &&\n Array.isArray(data.elements) &&\n data.elements.every(isValidElement)\n );\n};\n","/**\n * Visual Editor - Element Registry\n *\n * Manages registration and retrieval of element renderers.\n * This is what makes the editor extensible - new element types\n * can be registered dynamically.\n */\n\nimport { ElementRenderer } from \"../types\";\n\n/**\n * Registry class for managing element renderers\n */\nexport class ElementRegistry {\n private renderers: Map<string, ElementRenderer> = new Map();\n\n /**\n * Register a new element renderer\n */\n register(renderer: ElementRenderer): void {\n if (this.renderers.has(renderer.type)) {\n console.warn(\n `Element renderer with type \"${renderer.type}\" is already registered. Skipping.`\n );\n return;\n }\n this.renderers.set(renderer.type, renderer);\n }\n\n /**\n * Register multiple element renderers at once\n */\n registerMany(renderers: ElementRenderer[]): void {\n renderers.forEach((renderer) => this.register(renderer));\n }\n\n /**\n * Get a renderer by type\n */\n get(type: string): ElementRenderer | undefined {\n return this.renderers.get(type);\n }\n\n /**\n * Check if a renderer exists for a type\n */\n has(type: string): boolean {\n return this.renderers.has(type);\n }\n\n /**\n * Get all registered renderers\n */\n getAll(): ElementRenderer[] {\n return Array.from(this.renderers.values());\n }\n\n /**\n * Get the internal renderers map\n */\n getMap(): Map<string, ElementRenderer> {\n return this.renderers;\n }\n\n /**\n * Get all registered types\n */\n getAllTypes(): string[] {\n return Array.from(this.renderers.keys());\n }\n\n /**\n * Unregister a renderer\n */\n unregister(type: string): boolean {\n return this.renderers.delete(type);\n }\n\n /**\n * Clear all registered renderers\n */\n clear(): void {\n this.renderers.clear();\n }\n\n /**\n * Get the number of registered renderers\n */\n get size(): number {\n return this.renderers.size;\n }\n}\n\n/**\n * Create a global singleton registry (can be used across the app)\n */\nexport const globalElementRegistry = new ElementRegistry();\n\n/**\n * Hook to use the element registry in React components\n */\nimport { useMemo } from \"react\";\n\nexport const useElementRegistry = (initialRenderers?: ElementRenderer[]): ElementRegistry => {\n return useMemo(() => {\n const registry = new ElementRegistry();\n if (initialRenderers) {\n registry.registerMany(initialRenderers);\n }\n return registry;\n }, [initialRenderers]);\n};\n","/**\n * Visual Editor - Text Element Renderer\n *\n * Built-in text element renderer using Konva.\n */\n\nimport React from \"react\";\nimport { Text } from \"react-konva\";\nimport { ElementRenderer, EditorElement, TextElementProps } from \"../types\";\nimport { Type } from \"lucide-react\";\nimport { getSnappingPosition, SnapGuide } from \"../utils/snapping\";\nimport { KonvaEventObject, Node, NodeConfig } from \"konva/lib/Node\";\n\n/**\n * Text element renderer component\n */\nexport const TextElementRenderer: React.FC<{\n element: EditorElement<TextElementProps>;\n isSelected: boolean;\n onSelect: () => void;\n onTransform: (updates: Partial<EditorElement>) => void;\n // Snapping props\n allElements?: EditorElement[];\n canvasSize?: { width: number; height: number };\n onSnapGuides?: (guides: { vertical: SnapGuide[]; horizontal: SnapGuide[] }) => void;\n onClearSnapGuides?: () => void;\n // Element ID for centralized transformer\n elementId?: string;\n}> = ({\n element,\n isSelected,\n onSelect,\n onTransform,\n allElements = [],\n canvasSize,\n onSnapGuides,\n onClearSnapGuides,\n elementId,\n}) => {\n const shapeRef = React.useRef<any>(null);\n\n // Don't render if element is hidden\n const isVisible = element.visible !== false;\n const isLocked = element.locked === true;\n\n // Don't render if not visible\n if (!isVisible) {\n return null;\n }\n\n const handleClick = (e: KonvaEventObject<MouseEvent, Node<NodeConfig>>) => {\n if (isLocked) return;\n e.evt.button !== 0 ? undefined : onSelect();\n };\n\n const handleDragMove = (e: KonvaEventObject<MouseEvent, Node<NodeConfig>>) => {\n // Only allow left-click (button 0) dragging\n if (!canvasSize || !onSnapGuides || !isSelected || e.evt.button !== 0) return;\n\n const node = e.target;\n const snapResult = getSnappingPosition(element, node.x(), node.y(), allElements, {\n threshold: 5,\n snapToElements: true,\n snapToCanvas: true,\n canvasSize,\n });\n\n // Apply snapped position\n node.x(snapResult.x);\n node.y(snapResult.y);\n\n // Show snap guides\n onSnapGuides({\n vertical: snapResult.verticalGuides,\n horizontal: snapResult.horizontalGuides,\n });\n };\n\n const handleDragEnd = (e: any) => {\n // Clear snap guides\n if (onClearSnapGuides) {\n onClearSnapGuides();\n }\n\n onTransform({\n position: {\n x: e.target.x(),\n y: e.target.y(),\n },\n });\n };\n\n const handleTransform = () => {\n const node = shapeRef.current;\n if (!node) return;\n\n const scaleX = node.scaleX();\n const scaleY = node.scaleY();\n\n // Update width based on scaleX, keep font size constant\n const newWidth = Math.max(20, node.width() * scaleX);\n const newHeight = Math.max(20, node.height() * scaleY);\n\n // Reset scale immediately to prevent stretching\n node.scaleX(1);\n node.scaleY(1);\n\n // Update dimensions\n node.width(newWidth);\n node.height(newHeight);\n };\n\n // Build text decoration string\n const getTextDecoration = () => {\n const decorations: string[] = [];\n if (element.props.underline) decorations.push(\"underline\");\n if (element.props.strikethrough) decorations.push(\"line-through\");\n if (element.props.overline) decorations.push(\"overline\");\n return decorations.join(\" \") || \"\";\n };\n\n return (\n <>\n <Text\n ref={shapeRef}\n id={elementId || element.id}\n x={element.position.x}\n y={element.position.y}\n width={element.size.width}\n height={element.size.height}\n text={element.props.content}\n fontSize={element.props.fontSize}\n fontFamily={element.props.fontFamily || \"Arial\"}\n opacity={element.opacity}\n fill={element.props.color}\n align={element.props.align || \"left\"}\n fontStyle={\n `${element.props.bold ? \"bold\" : \"\"} ${element.props.italic ? \"italic\" : \"\"}`.trim() ||\n \"normal\"\n }\n textDecoration={getTextDecoration()}\n rotation={element.rotation}\n draggable={!isLocked && isSelected}\n listening={!isLocked}\n onClick={handleClick}\n onTap={isLocked ? undefined : onSelect}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n onTransform={handleTransform}\n ellipsis={element.props.textOverflow === \"ellipsis\"}\n verticalAlign={element.props.verticalAlign || \"top\"}\n stroke={element.props.strokeColor || \"#000000\"}\n strokeWidth={element.props.strokeWidth || 0}\n strokeEnabled\n fillAfterStrokeEnabled\n />\n </>\n );\n};\n\n/**\n * Text element renderer definition\n */\nexport const textElementRenderer: ElementRenderer<TextElementProps> = {\n type: \"text\",\n displayName: \"Text\",\n render: (element) => <div>Text: {element.props.content}</div>, // Placeholder for non-Konva contexts\n renderComponent: TextElementRenderer, // Konva rendering component\n icon: <Type className=\"w-4 h-4\" />,\n defaultProps: {\n content: \"Text\",\n fontSize: 16,\n fontFamily: \"Arial\",\n color: \"#000000\",\n strokeColor: \"#000000\",\n strokeWidth: 0,\n align: \"left\",\n verticalAlign: \"top\",\n bold: false,\n italic: false,\n underline: false,\n overline: false,\n strikethrough: false,\n wordWrap: \"break-word\",\n },\n defaultSize: {\n width: 200,\n height: 50,\n },\n inspectorSchema: [\n {\n name: \"content\",\n type: \"string\",\n label: \"Text Content\",\n defaultValue: \"Text\",\n },\n {\n name: \"fontSize\",\n type: \"number\",\n label: \"Font Size\",\n min: 0,\n max: 1024,\n step: 1,\n defaultValue: 16,\n },\n {\n name: \"fontFamily\",\n type: \"select\",\n label: \"Font Family\",\n options: [\n { value: \"Arial\", label: \"Arial\" },\n { value: \"Times New Roman\", label: \"Times New Roman\" },\n { value: \"Courier New\", label: \"Courier New\" },\n { value: \"Georgia\", label: \"Georgia\" },\n { value: \"Verdana\", label: \"Verdana\" },\n { value: \"Outfit\", label: \"Outfit\" },\n ],\n defaultValue: \"Outfit\",\n },\n {\n name: \"color\",\n type: \"color\",\n label: \"Text Color\",\n defaultValue: \"#000000\",\n },\n {\n name: \"strokeColor\",\n type: \"color\",\n label: \"Stroke Color\",\n defaultValue: \"#000000\",\n },\n {\n name: \"strokeWidth\",\n type: \"number\",\n label: \"Stroke Width\",\n min: 0,\n max: 50,\n step: 1,\n defaultValue: 0,\n },\n {\n name: \"align\",\n type: \"select\",\n label: \"Horizontal Alignment\",\n options: [\n { value: \"left\", label: \"Left\" },\n { value: \"center\", label: \"Center\" },\n { value: \"right\", label: \"Right\" },\n ],\n defaultValue: \"left\",\n },\n {\n name: \"verticalAlign\",\n type: \"select\",\n label: \"Vertical Alignment\",\n options: [\n { value: \"top\", label: \"Top\" },\n { value: \"middle\", label: \"Middle\" },\n { value: \"bottom\", label: \"Bottom\" },\n ],\n defaultValue: \"top\",\n },\n {\n name: \"bold\",\n type: \"boolean\",\n label: \"Bold\",\n defaultValue: false,\n },\n {\n name: \"italic\",\n type: \"boolean\",\n label: \"Italic\",\n defaultValue: false,\n },\n {\n name: \"underline\",\n type: \"boolean\",\n label: \"Underline\",\n defaultValue: false,\n },\n {\n name: \"strikethrough\",\n type: \"boolean\",\n label: \"Strikethrough\",\n defaultValue: false,\n },\n ],\n};\n","/**\n * Snapping Utilities\n *\n * Helper functions for snapping elements to guides, other elements, and canvas edges.\n */\n\nimport { EditorElement } from \"../types\";\n\nexport interface SnapGuide {\n /** Position of the guide line */\n position: number;\n /** Orientation of the guide (vertical or horizontal) */\n orientation: \"vertical\" | \"horizontal\";\n /** Snap type (element edge, center, or canvas edge) */\n type: \"edge\" | \"center\" | \"canvas\";\n}\n\nexport interface SnapResult {\n /** Snapped x position */\n x: number;\n /** Snapped y position */\n y: number;\n /** Vertical guides to display */\n verticalGuides: SnapGuide[];\n /** Horizontal guides to display */\n horizontalGuides: SnapGuide[];\n}\n\nexport interface SnapOptions {\n /** Snap threshold in pixels */\n threshold?: number;\n /** Whether to snap to other elements */\n snapToElements?: boolean;\n /** Whether to snap to canvas edges */\n snapToCanvas?: boolean;\n /** Canvas size */\n canvasSize?: { width: number; height: number };\n}\n\n/**\n * Calculate the axis-aligned bounding box for a rotated element\n * Note: In Konva (without offsetX/offsetY), rotation happens around the TOP-LEFT corner (x, y)\n * For snapping, we primarily care about the CENTER point, not the rotated edges\n */\nfunction getRotatedBounds(\n x: number,\n y: number,\n width: number,\n height: number,\n rotation: number\n): { left: number; right: number; top: number; bottom: number; centerX: number; centerY: number } {\n // If no significant rotation, return simple bounds\n if (Math.abs(rotation) < 0.1 || Math.abs(rotation - 360) < 0.1) {\n return {\n left: x,\n right: x + width,\n top: y,\n bottom: y + height,\n centerX: x + width / 2,\n centerY: y + height / 2,\n };\n }\n\n // Convert rotation to radians\n const rad = (rotation * Math.PI) / 180;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n // Calculate the four corners (relative to rotation origin at x, y)\n const corners = [\n { x: 0, y: 0 }, // top-left (rotation origin)\n { x: width, y: 0 }, // top-right\n { x: width, y: height }, // bottom-right\n { x: 0, y: height }, // bottom-left\n ];\n\n // Rotate corners around (x, y) and find min/max\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n\n for (const corner of corners) {\n // Rotate point around origin (x, y)\n const rotatedX = x + corner.x * cos - corner.y * sin;\n const rotatedY = y + corner.x * sin + corner.y * cos;\n minX = Math.min(minX, rotatedX);\n maxX = Math.max(maxX, rotatedX);\n minY = Math.min(minY, rotatedY);\n maxY = Math.max(maxY, rotatedY);\n }\n\n // Calculate the actual center of the rotated rectangle\n // The center point rotates around (x, y)\n const centerX = x + (width / 2) * cos - (height / 2) * sin;\n const centerY = y + (width / 2) * sin + (height / 2) * cos;\n\n return {\n left: minX,\n right: maxX,\n top: minY,\n bottom: maxY,\n centerX,\n centerY,\n };\n}\n\n/**\n * Calculate snapping for an element being dragged\n */\nexport function getSnappingPosition(\n draggedElement: EditorElement,\n x: number,\n y: number,\n allElements: EditorElement[],\n options: SnapOptions = {}\n): SnapResult {\n const { threshold = 5, snapToElements = true, snapToCanvas = true, canvasSize } = options;\n\n let snappedX = x;\n let snappedY = y;\n const verticalGuides: SnapGuide[] = [];\n const horizontalGuides: SnapGuide[] = [];\n\n // Calculate dragged element bounds (accounting for rotation)\n const draggedBounds = getRotatedBounds(\n x,\n y,\n draggedElement.size.width,\n draggedElement.size.height,\n draggedElement.rotation\n );\n\n const draggedLeft = draggedBounds.left;\n const draggedRight = draggedBounds.right;\n const draggedTop = draggedBounds.top;\n const draggedBottom = draggedBounds.bottom;\n const draggedCenterX = draggedBounds.centerX;\n const draggedCenterY = draggedBounds.centerY;\n\n // Check if the dragged element is significantly rotated\n const isRotated =\n Math.abs(draggedElement.rotation) > 0.1 && Math.abs(draggedElement.rotation - 360) > 0.1;\n\n // Track closest snap distances\n let closestVerticalSnap = threshold;\n let closestHorizontalSnap = threshold;\n let verticalOffset = 0;\n let horizontalOffset = 0;\n\n // Snap to canvas edges\n if (snapToCanvas && canvasSize) {\n // For rotated elements, snap to axis-aligned bounding box edges\n // NOTE: Edge snapping for rotated elements now enabled\n // Left edge\n if (Math.abs(draggedLeft) <= closestVerticalSnap) {\n verticalOffset = -draggedLeft;\n closestVerticalSnap = Math.abs(draggedLeft);\n verticalGuides.push({ position: 0, orientation: \"vertical\", type: \"canvas\" });\n }\n\n // Right edge\n if (Math.abs(draggedRight - canvasSize.width) <= closestVerticalSnap) {\n verticalOffset = canvasSize.width - draggedRight;\n closestVerticalSnap = Math.abs(draggedRight - canvasSize.width);\n verticalGuides.push({\n position: canvasSize.width,\n orientation: \"vertical\",\n type: \"canvas\",\n });\n }\n\n // Top edge\n if (Math.abs(draggedTop) <= closestHorizontalSnap) {\n horizontalOffset = -draggedTop;\n closestHorizontalSnap = Math.abs(draggedTop);\n horizontalGuides.push({ position: 0, orientation: \"horizontal\", type: \"canvas\" });\n }\n\n // Bottom edge\n if (Math.abs(draggedBottom - canvasSize.height) <= closestHorizontalSnap) {\n horizontalOffset = canvasSize.height - draggedBottom;\n closestHorizontalSnap = Math.abs(draggedBottom - canvasSize.height);\n horizontalGuides.push({\n position: canvasSize.height,\n orientation: \"horizontal\",\n type: \"canvas\",\n });\n }\n\n // Center X (always available, even for rotated elements)\n const canvasCenterX = canvasSize.width / 2;\n if (Math.abs(draggedCenterX - canvasCenterX) <= closestVerticalSnap) {\n verticalOffset = canvasCenterX - draggedCenterX;\n closestVerticalSnap = Math.abs(draggedCenterX - canvasCenterX);\n verticalGuides.length = 0; // Clear edge guides if center snaps\n verticalGuides.push({\n position: canvasCenterX,\n orientation: \"vertical\",\n type: \"center\",\n });\n }\n\n // Center Y (always available, even for rotated elements)\n const canvasCenterY = canvasSize.height / 2;\n if (Math.abs(draggedCenterY - canvasCenterY) <= closestHorizontalSnap) {\n horizontalOffset = canvasCenterY - draggedCenterY;\n closestHorizontalSnap = Math.abs(draggedCenterY - canvasCenterY);\n horizontalGuides.length = 0; // Clear edge guides if center snaps\n horizontalGuides.push({\n position: canvasCenterY,\n orientation: \"horizontal\",\n type: \"center\",\n });\n }\n }\n\n // Snap to other elements\n if (snapToElements) {\n for (const element of allElements) {\n // Skip self\n if (element.id === draggedElement.id) continue;\n\n // Skip hidden elements\n if (element.visible === false) continue;\n\n // Calculate element bounds (accounting for rotation)\n const elementBounds = getRotatedBounds(\n element.position.x,\n element.position.y,\n element.size.width,\n element.size.height,\n element.rotation\n );\n\n const elementLeft = elementBounds.left;\n const elementRight = elementBounds.right;\n const elementTop = elementBounds.top;\n const elementBottom = elementBounds.bottom;\n const elementCenterX = elementBounds.centerX;\n const elementCenterY = elementBounds.centerY;\n\n // Check if target element is rotated\n const isElementRotated =\n Math.abs(element.rotation) > 0.1 && Math.abs(element.rotation - 360) > 0.1;\n\n // For rotated elements (either dragged or target), only snap centers, not edges\n // NOTE: Edge snapping for rotated elements now enabled - snaps to axis-aligned bounding box\n const shouldSkipEdges = false; // Changed: always show edge guides\n\n // Vertical snapping (left, right, center)\n if (!shouldSkipEdges) {\n // Left to left\n if (Math.abs(draggedLeft - elementLeft) <= closestVerticalSnap) {\n verticalOffset = elementLeft - draggedLeft;\n closestVerticalSnap = Math.abs(draggedLeft - elementLeft);\n verticalGuides.length = 0;\n verticalGuides.push({ position: elementLeft, orientation: \"vertical\", type: \"edge\" });\n }\n\n // Right to right\n if (Math.abs(draggedRight - elementRight) <= closestVerticalSnap) {\n verticalOffset = elementRight - draggedRight;\n closestVerticalSnap = Math.abs(draggedRight - elementRight);\n verticalGuides.length = 0;\n verticalGuides.push({\n position: elementRight,\n orientation: \"vertical\",\n type: \"edge\",\n });\n }\n\n // Left to right\n if (Math.abs(draggedLeft - elementRight) <= closestVerticalSnap) {\n verticalOffset = elementRight - draggedLeft;\n closestVerticalSnap = Math.abs(draggedLeft - elementRight);\n verticalGuides.length = 0;\n verticalGuides.push({\n position: elementRight,\n orientation: \"vertical\",\n type: \"edge\",\n });\n }\n\n // Right to left\n if (Math.abs(draggedRight - elementLeft) <= closestVerticalSnap) {\n verticalOffset = elementLeft - draggedRight;\n closestVerticalSnap = Math.abs(draggedRight - elementLeft);\n verticalGuides.length = 0;\n verticalGuides.push({ position: elementLeft, orientation: \"vertical\", type: \"edge\" });\n }\n }\n\n // Center to center (always available)\n if (Math.abs(draggedCenterX - elementCenterX) <= closestVerticalSnap) {\n verticalOffset = elementCenterX - draggedCenterX;\n closestVerticalSnap = Math.abs(draggedCenterX - elementCenterX);\n verticalGuides.length = 0;\n verticalGuides.push({\n position: elementCenterX,\n orientation: \"vertical\",\n type: \"center\",\n });\n }\n\n // Horizontal snapping (top, bottom, center)\n if (!shouldSkipEdges) {\n // Top to top\n if (Math.abs(draggedTop - elementTop) <= closestHorizontalSnap) {\n horizontalOffset = elementTop - draggedTop;\n closestHorizontalSnap = Math.abs(draggedTop - elementTop);\n horizontalGuides.length = 0;\n horizontalGuides.push({\n position: elementTop,\n orientation: \"horizontal\",\n type: \"edge\",\n });\n }\n\n // Bottom to bottom\n if (Math.abs(draggedBottom - elementBottom) <= closestHorizontalSnap) {\n horizontalOffset = elementBottom - draggedBottom;\n closestHorizontalSnap = Math.abs(draggedBottom - elementBottom);\n horizontalGuides.length = 0;\n horizontalGuides.push({\n position: elementBottom,\n orientation: \"horizontal\",\n type: \"edge\",\n });\n }\n\n // Top to bottom\n if (Math.abs(draggedTop - elementBottom) <= closestHorizontalSnap) {\n horizontalOffset = elementBottom - draggedTop;\n closestHorizontalSnap = Math.abs(draggedTop - elementBottom);\n horizontalGuides.length = 0;\n horizontalGuides.push({\n position: elementBottom,\n orientation: \"horizontal\",\n type: \"edge\",\n });\n }\n\n // Bottom to top\n if (Math.abs(draggedBottom - elementTop) <= closestHorizontalSnap) {\n horizontalOffset = elementTop - draggedBottom;\n closestHorizontalSnap = Math.abs(draggedBottom - elementTop);\n horizontalGuides.length = 0;\n horizontalGuides.push({\n position: elementTop,\n orientation: \"horizontal\",\n type: \"edge\",\n });\n }\n }\n\n // Center to center (always available)\n if (Math.abs(draggedCenterY - elementCenterY) <= closestHorizontalSnap) {\n horizontalOffset = elementCenterY - draggedCenterY;\n closestHorizontalSnap = Math.abs(draggedCenterY - elementCenterY);\n horizontalGuides.length = 0;\n horizontalGuides.push({\n position: elementCenterY,\n orientation: \"horizontal\",\n type: \"center\",\n });\n }\n }\n }\n\n // Apply offsets to get final snapped position\n snappedX = x + verticalOffset;\n snappedY = y + horizontalOffset;\n\n return {\n x: snappedX,\n y: snappedY,\n verticalGuides,\n horizontalGuides,\n };\n}\n","/**\n * Visual Editor - Image Element Renderer\n *\n * Built-in image element renderer using Konva.\n */\n\nimport React from \"react\";\nimport { Image as KonvaImage, Transformer, Rect, Text, Group } from \"react-konva\";\nimport { ElementRenderer, EditorElement, ImageElementProps } from \"../types\";\nimport useImage from \"use-image\";\nimport { Image } from \"lucide-react\";\nimport { getSnappingPosition, SnapGuide } from \"../utils/snapping\";\nimport { KonvaEventObject, Node, NodeConfig } from \"konva/lib/Node\";\n\n/**\n * Image element renderer component\n */\nexport const ImageElementRenderer: React.FC<{\n element: EditorElement<ImageElementProps>;\n isSelected: boolean;\n onSelect: () => void;\n onTransform: (updates: Partial<EditorElement>) => void;\n // Snapping props\n allElements?: EditorElement[];\n canvasSize?: { width: number; height: number };\n onSnapGuides?: (guides: { vertical: SnapGuide[]; horizontal: SnapGuide[] }) => void;\n onClearSnapGuides?: () => void;\n // Image URL mapping for asset resolution\n imageUrls?: Map<string, string>;\n // Element ID for centralized transformer\n elementId?: string;\n // Callback to notify when node structure changes (e.g., image loads)\n onNodeUpdate?: () => void;\n}> = ({\n element,\n isSelected,\n onSelect,\n onTransform,\n allElements = [],\n canvasSize,\n onSnapGuides,\n onClearSnapGuides,\n imageUrls,\n elementId,\n onNodeUpdate,\n}) => {\n // Resolve image source - use imageUrls map if available\n const imageSrc = React.useMemo(() => {\n const src = element.props.src;\n\n // If src is already a full URL (http, blob, data), use it directly\n if (src && (src.startsWith(\"http\") || src.startsWith(\"blob:\") || src.startsWith(\"data:\"))) {\n return src;\n }\n\n // Otherwise, try to resolve from imageUrls map\n if (src && imageUrls) {\n const resolvedUrl = imageUrls.get(src);\n if (resolvedUrl) {\n return resolvedUrl;\n }\n }\n\n // Fallback to original src\n return src;\n }, [element.props.src, imageUrls]);\n\n const [image] = useImage(imageSrc);\n const shapeRef = React.useRef<any>(null);\n const transformerRef = React.useRef<any>(null);\n\n // Don't render if element is hidden\n const isVisible = element.visible !== false;\n const isLocked = element.locked === true;\n\n React.useEffect(() => {\n if (isSelected && transformerRef.current && shapeRef.current) {\n transformerRef.current.nodes([shapeRef.current]);\n transformerRef.current.getLayer().batchDraw();\n }\n }, [isSelected]);\n\n // Trigger a re-render/update when the image loads or changes\n // This helps the CentralizedTransformer re-attach to the updated node\n React.useEffect(() => {\n if (shapeRef.current) {\n // Force the layer to redraw when image changes\n const layer = shapeRef.current.getLayer();\n if (layer) {\n layer.batchDraw();\n }\n \n // Notify parent that the node has been updated (for transformer re-attachment)\n if (onNodeUpdate) {\n onNodeUpdate();\n }\n }\n }, [image, onNodeUpdate]);\n\n // Don't render if not visible\n if (!isVisible) {\n return null;\n }\n\n const handleClick = (e: KonvaEventObject<MouseEvent, Node<NodeConfig>>) => {\n if (isLocked) return;\n e.evt.button !== 0 ? undefined : onSelect();\n };\n\n const handleDragMove = (e: KonvaEventObject<MouseEvent, Node<NodeConfig>>) => {\n if (!canvasSize || !onSnapGuides || e.evt.button !== 0) return;\n\n const node = e.target;\n const snapResult = getSnappingPosition(element, node.x(), node.y(), allElements, {\n threshold: 5,\n snapToElements: true,\n snapToCanvas: true,\n canvasSize,\n });\n\n // Apply snapped position\n node.x(snapResult.x);\n node.y(snapResult.y);\n\n // Show snap guides\n onSnapGuides({\n vertical: snapResult.verticalGuides,\n horizontal: snapResult.horizontalGuides,\n });\n };\n\n const handleDragEnd = (e: any) => {\n // Clear snap guides\n if (onClearSnapGuides) {\n onClearSnapGuides();\n }\n\n onTransform({\n position: {\n x: e.target.x(),\n y: e.target.y(),\n },\n });\n };\n\n return (\n <>\n {image ? (\n <KonvaImage\n ref={shapeRef}\n id={elementId || element.id}\n x={element.position.x}\n y={element.position.y}\n width={element.size.width}\n height={element.size.height}\n image={image}\n opacity={element.opacity}\n rotation={element.rotation}\n draggable={!isLocked && isSelected}\n listening={!isLocked}\n onClick={handleClick}\n onTap={isLocked ? undefined : onSelect}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n />\n ) : (\n <Group\n ref={shapeRef}\n id={elementId || element.id}\n x={element.position.x}\n y={element.position.y}\n width={element.size.width}\n height={element.size.height}\n rotation={element.rotation}\n draggable={!isLocked && isSelected}\n listening={!isLocked}\n onClick={isLocked ? undefined : handleClick}\n onTap={isLocked ? undefined : onSelect}\n onDragMove={handleDragMove}\n onDragEnd={handleDragEnd}\n >\n {/* Placeholder rectangle with dashed border */}\n <Rect\n width={element.size.width}\n height={element.size.height}\n fill=\"#f0f0f0\"\n stroke=\"#999999\"\n strokeWidth={2}\n dash={[10, 5]}\n opacity={element.opacity}\n />\n {/* Placeholder text */}\n <Text\n width={element.size.width}\n height={element.size.height}\n text=\"No Image\"\n fontSize={16}\n fill=\"#666666\"\n align=\"center\"\n verticalAlign=\"middle\"\n />\n </Group>\n )}\n </>\n );\n};\n\n/**\n * Image element renderer definition\n */\nexport const imageElementRenderer: ElementRenderer<ImageElementProps> = {\n type: \"image\",\n displayName: \"Image\",\n render: (element) => <div>Image: {element.props.src}</div>, // Placeholder for non-Konva contexts\n renderComponent: ImageElementRenderer, // Konva rendering component\n icon: <Image className=\"w-4 h-4\" />,\n defaultProps: {\n src: \"\",\n fit: \"fill\",\n },\n defaultSize: {\n width: 200,\n height: 200,\n },\n inspectorSchema: [\n {\n name: \"src\",\n type: \"image\",\n label: \"Image Source\",\n description: \"URL or path to the image\",\n defaultValue: \"\",\n },\n {\n name: \"fit\",\n type: \"select\",\n label: \"Fit Mode\",\n options: [{ value: \"fill\", label: \"Fill\" }],\n defaultValue: \"contain\",\n },\n ],\n};\n","/**\n * Visual Editor - Built-in Elements\n *\n * Exports all built-in element renderers.\n */\n\nexport { textElementRenderer, TextElementRenderer } from \"./TextElement\";\nexport { imageElementRenderer, ImageElementRenderer } from \"./ImageElement\";\n\n// Export default element set\nimport { textElementRenderer } from \"./TextElement\";\nimport { imageElementRenderer } from \"./ImageElement\";\n\nexport const defaultElements = [textElementRenderer, imageElementRenderer];\n","/**\n * Inspector Component\n *\n * Schema-driven property panel for editing selected element properties.\n * Dynamically renders fields based on the element's inspectorSchema.\n */\n\nimport React from \"react\";\nimport { Input } from \"@/ui/input\";\nimport { Label } from \"@/ui/label\";\nimport { Button } from \"@/ui/button\";\nimport { Slider } from \"@/ui/slider\";\nimport { Separator } from \"@/ui/separator\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/ui/select\";\nimport { Textarea } from \"@/ui/textarea\";\nimport {\n EditorElement,\n InspectorFieldSchema,\n ElementRenderer,\n EditorAPI,\n EditorMode,\n} from \"../types\";\nimport { Checkbox } from \"@/ui/checkbox\";\n\nexport interface InspectorProps {\n /** Currently selected element */\n selectedElement: EditorElement | null;\n\n /** Element renderer for the selected element */\n elementRenderer: ElementRenderer | null;\n\n /** Editor API for updating elements */\n api: EditorAPI;\n\n /** Editor mode (for custom placeholder and context) */\n mode?: EditorMode;\n\n /** Canvas size (passed to placeholder component) */\n canvasSize?: { width: number; height: number };\n\n /** Function to set canvas size */\n setCanvasSize?: (width: number, height: number) => void;\n\n /** Optional custom style */\n style?: React.CSSProperties;\n\n /** Optional className */\n className?: string;\n}\n\n/**\n * Inspector component that renders property fields based on element schema\n */\nexport const Inspector: React.FC<InspectorProps> = ({\n selectedElement,\n elementRenderer,\n api,\n mode,\n canvasSize,\n setCanvasSize,\n style,\n className,\n}) => {\n // Local state for input values during editing\n const [editingValues, setEditingValues] = React.useState<Record<string, string>>({});\n\n // Debounce timer refs for color changes\n const debounceTimers = React.useRef<Record<string, NodeJS.Timeout>>({});\n\n // Cleanup debounce timers on unmount\n React.useEffect(() => {\n return () => {\n Object.values(debounceTimers.current).forEach((timer) => clearTimeout(timer));\n };\n }, []);\n\n // No selection or no renderer - show custom placeholder or default empty state\n if (!selectedElement || !elementRenderer) {\n // If mode has custom inspector placeholder, render it\n if (mode?.inspectorPlaceholder) {\n const PlaceholderComponent = mode.inspectorPlaceholder;\n return (\n <div className={`w-full bg-card h-full ${className}`} style={style}>\n <div className=\"flex h-10 sticky top-0 items-center justify-between px-3 py-2 border-b bg-popover\">\n <h3 className=\"text-sm font-semibold\">Inspector</h3>\n </div>\n <PlaceholderComponent\n api={api}\n canvasSize={canvasSize}\n setCanvasSize={setCanvasSize}\n {...(mode.context || {})}\n />\n </div>\n );\n }\n\n // Default empty state\n return (\n <div className={`w-full bg-card h-full ${className}`} style={style}>\n <div className=\"flex h-10 items-center justify-between px-3 py-2 border-b bg-popover\">\n <h3 className=\"text-sm font-semibold\">Inspector</h3>\n </div>\n <p className=\"p-4 text-sm text-muted-foreground\">\n No element selected. Click on an element to edit its properties.\n </p>\n </div>\n );\n }\n\n const schema = elementRenderer.inspectorSchema || [];\n\n // Handler for updating element properties\n const handlePropChange = (propName: string, value: any) => {\n api.updateElement(selectedElement.id, {\n props: {\n ...selectedElement.props,\n [propName]: value,\n },\n });\n };\n\n // Debounced handler for color changes (300ms delay)\n const handleColorChange = (propName: string, value: string) => {\n // Clear existing timer for this property\n if (debounceTimers.current[propName]) {\n clearTimeout(debounceTimers.current[propName]);\n }\n\n // Update local state immediately for responsive UI\n setEditingValues((prev) => ({ ...prev, [propName]: value }));\n\n // Set new timer to update the actual element\n debounceTimers.current[propName] = setTimeout(() => {\n handlePropChange(propName, value);\n // Clear editing state after update\n setEditingValues((prev) => {\n const newState = { ...prev };\n delete newState[propName];\n return newState;\n });\n delete debounceTimers.current[propName];\n }, 300); // 300ms debounce delay\n };\n\n // Handler for position/size/rotation/opacity changes\n const handleTransformChange = (field: string, value: number) => {\n // Round to 2 decimal places for cleaner values\n const roundedValue = Math.round(value * 100) / 100;\n\n if (field === \"x\" || field === \"y\") {\n api.updateElement(selectedElement.id, {\n position: {\n ...selectedElement.position,\n [field]: roundedValue,\n },\n });\n } else if (field === \"width\" || field === \"height\") {\n api.updateElement(selectedElement.id, {\n size: {\n ...selectedElement.size,\n [field]: roundedValue,\n },\n });\n } else if (field === \"rotation\") {\n // When rotating via input, rotate around the element's center\n // Step 1: Calculate the current visual center (accounting for current rotation)\n const width = selectedElement.size.width;\n const height = selectedElement.size.height;\n const oldRotRad = (selectedElement.rotation * Math.PI) / 180;\n\n // The visual center with current rotation\n const centerOffsetX = width / 2;\n const centerOffsetY = height / 2;\n const rotatedCenterX =\n selectedElement.position.x +\n centerOffsetX * Math.cos(oldRotRad) -\n centerOffsetY * Math.sin(oldRotRad);\n const rotatedCenterY =\n selectedElement.position.y +\n centerOffsetX * Math.sin(oldRotRad) +\n centerOffsetY * Math.cos(oldRotRad);\n\n // Step 2: Calculate new position that keeps this center fixed with new rotation\n const newRotRad = (roundedValue * Math.PI) / 180;\n const newX =\n rotatedCenterX -\n (centerOffsetX * Math.cos(newRotRad) - centerOffsetY * Math.sin(newRotRad));\n const newY =\n rotatedCenterY -\n (centerOffsetX * Math.sin(newRotRad) + centerOffsetY * Math.cos(newRotRad));\n\n api.updateElement(selectedElement.id, {\n position: {\n x: Math.round(newX * 100) / 100,\n y: Math.round(newY * 100) / 100,\n },\n rotation: roundedValue,\n });\n } else if (field === \"opacity\") {\n // Clamp opacity between 0 and 1\n const clampedValue = Math.max(0, Math.min(1, roundedValue));\n api.updateElement(selectedElement.id, {\n opacity: clampedValue,\n });\n }\n };\n\n // Get display value for a transform field (with 2 decimal places)\n const getDisplayValue = (field: string): string => {\n // If currently editing, use the editing value\n if (editingValues[field] !== undefined) {\n return editingValues[field];\n }\n\n // Otherwise, format the actual value to 2 decimals\n let value: number;\n if (field === \"x\") value = selectedElement.position.x;\n else if (field === \"y\") value = selectedElement.position.y;\n else if (field === \"width\") value = selectedElement.size.width;\n else if (field === \"height\") value = selectedElement.size.height;\n else if (field === \"rotation\") value = selectedElement.rotation;\n else if (field === \"opacity\") value = selectedElement.opacity;\n else return \"0\";\n\n return value.toFixed(2);\n };\n\n // Handle input change (while typing)\n const handleInputChange = (field: string, value: string) => {\n setEditingValues((prev) => ({ ...prev, [field]: value }));\n };\n\n // Handle input blur (when user finishes editing)\n const handleInputBlur = (field: string) => {\n const value = editingValues[field];\n if (value !== undefined) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n handleTransformChange(field, numValue);\n }\n // Clear editing state\n setEditingValues((prev) => {\n const newState = { ...prev };\n delete newState[field];\n return newState;\n });\n }\n };\n\n return (\n <div className={`h-full bg-card overflow-y-auto ${className}`} style={style}>\n {/* Header */}\n <div className=\"flex h-10 sticky top-0 items-center justify-between px-3 py-2 border-b bg-popover\">\n <h3 className=\"text-sm font-semibold\">Inspector</h3>\n </div>\n\n <div className=\"p-4\">\n <h3 className=\"text-lg font-semibold mb-1\">\n {elementRenderer.displayName || selectedElement.type}\n </h3>\n\n <p className=\"text-xs text-muted-foreground mb-4\">ID: {selectedElement.id}</p>\n\n <Separator className=\"my-4\" />\n\n {/* Display Name (always visible) */}\n <div className=\"mb-4\">\n <Label htmlFor=\"display-name\" className=\"text-xs\">\n Display Name\n </Label>\n <Input\n id=\"display-name\"\n type=\"text\"\n value={selectedElement.displayName || \"\"}\n onChange={(e) => {\n api.updateElement(selectedElement.id, {\n displayName: e.target.value,\n });\n }}\n placeholder={elementRenderer.displayName || selectedElement.type}\n className=\"h-8 mt-1\"\n />\n </div>\n\n <Separator className=\"my-4\" />\n\n {/* Transform Properties (always visible) */}\n <h4 className=\"text-sm font-medium mb-3\">Transform</h4>\n\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex gap-2\">\n <div className=\"flex flex-col gap-2 items-start\">\n <Label htmlFor=\"x-position\" className=\"text-xs\">\n X\n </Label>\n <Input\n id=\"x-position\"\n type=\"number\"\n step={0.5}\n value={getDisplayValue(\"x\")}\n onChange={(e) => handleInputChange(\"x\", e.target.value)}\n onBlur={() => handleInputBlur(\"x\")}\n className=\"h-8\"\n />\n </div>\n <div className=\"flex flex-col gap-2 items-start\">\n <Label htmlFor=\"y-position\" className=\"text-xs\">\n Y\n </Label>\n <Input\n id=\"y-position\"\n type=\"number\"\n step={0.5}\n value={getDisplayValue(\"y\")}\n onChange={(e) => handleInputChange(\"y\", e.target.value)}\n onBlur={() => handleInputBlur(\"y\")}\n className=\"h-8\"\n />\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n <div className=\"flex flex-col gap-2 items-start\">\n <Label htmlFor=\"width\" className=\"text-xs\">\n Width\n </Label>\n <Input\n id=\"width\"\n type=\"number\"\n step={0.5}\n value={getDisplayValue(\"width\")}\n onChange={(e) => handleInputChange(\"width\", e.target.value)}\n onBlur={() => handleInputBlur(\"width\")}\n className=\"h-8\"\n />\n </div>\n <div className=\"flex h-8 gap-2\">\n <div className=\"flex flex-col gap-2 items-start\">\n <Label htmlFor=\"height\" className=\"text-xs\">\n Height\n </Label>\n <Input\n id=\"height\"\n type=\"number\"\n step={0.5}\n value={getDisplayValue(\"height\")}\n onChange={(e) => handleInputChange(\"height\", e.target.value)}\n onBlur={() => handleInputBlur(\"height\")}\n className=\"h-8\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n <div className=\"flex flex-col gap-2 items-start flex-1\">\n <Label htmlFor=\"rotation\" className=\"text-xs\">\n Rotation\n </Label>\n <Input\n id=\"rotation\"\n type=\"number\"\n step={1}\n value={getDisplayValue(\"rotation\")}\n onChange={(e) => handleInputChange(\"rotation\", e.target.value)}\n onBlur={() => handleInputBlur(\"rotation\")}\n className=\"h-8 flex-1\"\n />\n </div>\n <div className=\"flex flex-col gap-2 items-start flex-1\">\n <Label htmlFor=\"opacity\" className=\"text-xs\">\n Opacity\n </Label>\n <Input\n id=\"opacity\"\n type=\"number\"\n step={0.01}\n min={0}\n max={1}\n value={getDisplayValue(\"opacity\")}\n onChange={(e) => handleInputChange(\"opacity\", e.target.value)}\n onBlur={() => handleInputBlur(\"opacity\")}\n className=\"h-8 flex-1\"\n />\n </div>\n </div>\n\n <Separator className=\"my-4\" />\n\n {/* Element-specific Properties */}\n {schema.length > 0 && (\n <>\n <h4 className=\"text-sm font-medium mb-3\">Properties</h4>\n <div className=\"space-y-3\">\n {schema.map((field) =>\n renderField(\n field,\n selectedElement.props,\n editingValues,\n handlePropChange,\n handleColorChange,\n mode\n )\n )}\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * Render a single inspector field based on its type\n */\nexport function renderField(\n field: InspectorFieldSchema,\n props: any,\n editingValues: Record<string, string>,\n onChange: (name: string, value: any) => void,\n onColorChange: (name: string, value: string) => void,\n mode?: EditorMode\n): React.ReactNode {\n // Use editing value if available, otherwise use actual prop value\n const value = editingValues[field.name] ?? props[field.name] ?? field.defaultValue;\n\n switch (field.type) {\n case \"custom\": {\n // Custom renderer support\n if (!field.customRenderer) {\n console.error(`Custom field \"${field.name}\" has no customRenderer defined`);\n return null;\n }\n\n const CustomComponent = field.customRenderer;\n return (\n <div key={field.name}>\n <CustomComponent\n value={value}\n onChange={(newValue) => onChange(field.name, newValue)}\n field={field}\n elementProps={props}\n mode={mode}\n />\n </div>\n );\n }\n\n case \"string\": {\n const isMultiline = field.name === \"content\" || field.name === \"text\";\n return (\n <div key={field.name}>\n <Label htmlFor={field.name} className=\"text-xs\">\n {field.label}\n </Label>\n {isMultiline ? (\n <Textarea\n id={field.name}\n value={value || \"\"}\n onChange={(e) => onChange(field.name, e.target.value)}\n className=\"mt-1\"\n rows={3}\n />\n ) : (\n <Input\n id={field.name}\n value={value || \"\"}\n onChange={(e) => onChange(field.name, e.target.value)}\n className=\"h-8 mt-1\"\n />\n )}\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n }\n\n case \"number\": {\n return (\n <div key={field.name}>\n <Label htmlFor={field.name} className=\"text-xs\">\n {field.label}\n </Label>\n <Input\n id={field.name}\n type=\"number\"\n value={value ?? 0}\n onChange={(e) => onChange(field.name, parseFloat(Number(e.target.value).toFixed(2)))}\n min={field.min}\n max={field.max}\n step={field.step || 1}\n className=\"h-8 mt-1\"\n />\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n }\n\n case \"color\": {\n return (\n <div key={field.name}>\n <Label htmlFor={field.name} className=\"text-xs\">\n {field.label}\n </Label>\n <Input\n id={field.name}\n type=\"color\"\n value={value || \"#000000\"}\n onChange={(e) => onColorChange(field.name, e.target.value)}\n className=\"h-10 mt-1\"\n />\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n }\n\n case \"select\": {\n return (\n <div key={field.name}>\n <Label htmlFor={field.name} className=\"text-xs\">\n {field.label}\n </Label>\n <Select\n value={value || field.defaultValue || \"\"}\n onValueChange={(newValue) => onChange(field.name, newValue)}\n >\n <SelectTrigger className=\"h-8 mt-1\">\n <SelectValue placeholder={field.label} />\n </SelectTrigger>\n <SelectContent>\n {field.options?.map((option) => (\n <SelectItem key={option.value} value={String(option.value)}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n }\n\n case \"boolean\": {\n return (\n <div key={field.name} className=\"flex items-start space-x-2\">\n <Checkbox\n id={field.name}\n checked={Boolean(value) as boolean}\n onCheckedChange={(checked) => onChange(field.name, checked)}\n className=\"mt-1\"\n />\n <div>\n <Label htmlFor={field.name} className=\"text-xs font-medium cursor-pointer\">\n {field.label}\n </Label>\n {field.description && (\n <p className=\"text-xs text-muted-foreground\">{field.description}</p>\n )}\n </div>\n </div>\n );\n }\n\n case \"slider\": {\n return (\n <div key={field.name}>\n <div className=\"flex items-center justify-between mb-2\">\n <Label className=\"text-xs\">{field.label}</Label>\n <span className=\"text-xs text-muted-foreground\">{value}</span>\n </div>\n <Slider\n value={[Number(value ?? field.defaultValue ?? 0)]}\n onValueChange={([newValue]) => onChange(field.name, newValue)}\n min={field.min || 0}\n max={field.max || 100}\n step={field.step || 1}\n className=\"mt-1\"\n />\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n }\n\n case \"image\": {\n return (\n <div key={field.name}>\n <Label htmlFor={field.name} className=\"text-xs\">\n {field.label}\n </Label>\n <Input\n id={field.name}\n value={value || \"\"}\n onChange={(e) => onChange(field.name, e.target.value)}\n className=\"h-8 mt-1\"\n placeholder=\"Image URL or path\"\n />\n {field.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{field.description}</p>\n )}\n </div>\n );\n }\n\n default:\n return null;\n }\n}\n\nexport default Inspector;\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","import * as React from \"react\"\nimport * as SliderPrimitive from \"@radix-ui/react-slider\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn(\n \"relative flex w-full touch-none select-none items-center\",\n className\n )}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-2 w-full grow overflow-hidden rounded-full bg-secondary\">\n <SliderPrimitive.Range className=\"absolute h-full bg-primary\" />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n))\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n","import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n","import * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { Check } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-current\")}\n >\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n","/**\n * Layers Panel Component\n *\n * Displays all elements in the canvas with controls to show/hide, lock/unlock,\n * reorder, and delete elements.\n */\n\nimport React from \"react\";\nimport { Badge } from \"@/ui/badge\";\nimport { ScrollArea } from \"@/ui/scroll-area\";\nimport { TooltipButton } from \"@/ui/general/TooltipButton\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/ui/select\";\nimport {\n Eye,\n EyeOff,\n Lock,\n Unlock,\n Trash2,\n ChevronDown,\n Type,\n Image as ImageIcon,\n Layers,\n ChevronUp,\n Filter,\n} from \"lucide-react\";\nimport { EditorElement, EditorAPI, ElementRenderer } from \"../types\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface LayersPanelProps {\n /** All elements in the canvas */\n elements: EditorElement[];\n\n /** Currently selected element ID */\n selectedElementId: string | null;\n\n /** Editor API for manipulating elements */\n api: EditorAPI;\n\n /** Element registry to get renderer info */\n elementRenderers: Map<string, ElementRenderer>;\n\n /** Optional custom style */\n style?: React.CSSProperties;\n\n /** Optional className */\n className?: string;\n}\n\n/**\n * Get icon for element type\n */\nconst getElementIcon = (type: string) => {\n switch (type) {\n case \"text\":\n return <Type className=\"h-4 w-4\" />;\n case \"image\":\n return <ImageIcon className=\"h-4 w-4\" />;\n default:\n return <Layers className=\"h-4 w-4\" />;\n }\n};\n\n/**\n * Get display name for element\n */\nconst getElementDisplayName = (element: EditorElement, renderer?: ElementRenderer): string => {\n // Use custom display name if set\n if (element.displayName) return element.displayName;\n\n // Use renderer display name\n if (renderer?.displayName) return renderer.displayName;\n\n // For text elements, show preview of content\n if (element.type === \"text\" && element.props.content) {\n const preview = element.props.content.substring(0, 20);\n return `${preview}${element.props.content.length > 20 ? \"...\" : \"\"}`;\n }\n\n // Default: capitalize type\n return element.type.charAt(0).toUpperCase() + element.type.slice(1);\n};\n\n/**\n * Layers Panel component\n */\nexport const LayersPanel: React.FC<LayersPanelProps> = ({\n elements,\n selectedElementId,\n api,\n elementRenderers,\n style,\n className,\n}) => {\n const [filter, setFilter] = React.useState<string>(\"all\");\n\n // Get all available element types from the registry\n const availableTypes = Array.from(elementRenderers.keys());\n\n // Sort elements by z-index (descending - top to bottom)\n const sortedElements = [...elements].sort((a, b) => b.zIndex - a.zIndex);\n\n // Filter elements\n const filteredElements = sortedElements.filter((el) => {\n if (filter === \"all\") return true;\n return el.type === filter;\n });\n\n // Move element up in z-index (increase array index since z-index = array index)\n const handleMoveUp = (element: EditorElement, e: React.MouseEvent) => {\n e.stopPropagation();\n\n // Find element's current array position\n const currentIndex = elements.findIndex((el) => el.id === element.id);\n\n // Move up means higher z-index, which means higher array index\n if (currentIndex < elements.length - 1) {\n api.reorderElement(element.id, currentIndex + 1);\n }\n };\n\n // Move element down in z-index (decrease array index since z-index = array index)\n const handleMoveDown = (element: EditorElement, e: React.MouseEvent) => {\n e.stopPropagation();\n\n // Find element's current array position\n const currentIndex = elements.findIndex((el) => el.id === element.id);\n\n // Move down means lower z-index, which means lower array index\n if (currentIndex > 0) {\n api.reorderElement(element.id, currentIndex - 1);\n }\n };\n\n return (\n <div className={cn(\"flex flex-col bg-card border-l\", className)} style={style}>\n {/* Header */}\n <div className=\"flex h-10 items-center justify-between px-3 py-2 border-b bg-popover\">\n <h3 className=\"text-sm font-semibold\">Layers</h3>\n <Badge variant=\"default\" className=\"text-xs\">\n {filteredElements.length}\n </Badge>\n </div>\n\n {/* Filter Dropdown */}\n <div className=\"flex gap-2 items-center p-3 border-b\">\n <Filter className=\"icon\" />\n <Select value={filter} onValueChange={(value: any) => setFilter(value)}>\n <SelectTrigger id=\"layer-filter\" className=\"h-8\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n <div className=\"flex items-center gap-2\">\n <Layers className=\"h-4 w-4\" />\n All Elements\n </div>\n </SelectItem>\n {availableTypes.map((type) => (\n <SelectItem key={type} value={type}>\n <div className=\"flex items-center gap-2\">\n {getElementIcon(type)}\n {type.charAt(0).toUpperCase() + type.slice(1)} Only\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Layers List */}\n <ScrollArea className=\"flex-1\">\n <div className=\"p-2 space-y-1\">\n {filteredElements.length === 0 ? (\n <div className=\"text-center py-8 text-sm text-muted-foreground\">\n {filter === \"all\" ? \"No elements yet\" : `No ${filter} elements`}\n </div>\n ) : (\n filteredElements.map((element) => {\n const renderer = elementRenderers.get(element.type);\n const isSelected = element.id === selectedElementId;\n const isVisible = element.visible !== false;\n const isLocked = element.locked === true;\n\n return (\n <div\n key={element.id}\n className={cn(\n \"group flex items-center gap-2 px-2 py-2 rounded cursor-pointer transition-all\",\n isSelected\n ? \"bg-primary/15 border border-primary/30 shadow-sm\"\n : \"hover:bg-muted/70\",\n isLocked && \"opacity-60\",\n !isVisible && \"opacity-40\"\n )}\n onClick={() => !isLocked && api.selectElement(element.id)}\n >\n {/* Element Icon */}\n <div className=\"text-muted-foreground\">{getElementIcon(element.type)}</div>\n\n {/* Element Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium truncate\">\n {getElementDisplayName(element, renderer)}\n </div>\n <div className=\"flex items-center gap-2 text-[10px] text-muted-foreground\">\n <span>z:{element.zIndex}</span>\n </div>\n </div>\n\n {/* Quick Actions */}\n <div className=\"flex items-center gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n {/* Z-index Controls */}\n <div className=\"flex flex-col\">\n {element.zIndex < elements.length - 1 && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-3 w-6\"\n onClick={(e) => handleMoveUp(element, e)}\n tooltip=\"Move Upward\"\n tooltipDelay={500}\n >\n <ChevronUp className=\"h-3 w-3\" />\n </TooltipButton>\n )}\n {element.zIndex > 0 && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-3 w-6\"\n onClick={(e) => handleMoveDown(element, e)}\n tooltip=\"Move Downward\"\n tooltipDelay={500}\n >\n <ChevronDown className=\"h-3 w-3\" />\n </TooltipButton>\n )}\n </div>\n\n {/* Visibility Toggle */}\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={(e) => {\n e.stopPropagation();\n api.updateElement(element.id, { visible: !isVisible });\n }}\n tooltip={isVisible ? \"Hide\" : \"Show\"}\n tooltipDelay={500}\n >\n {isVisible ? <Eye className=\"h-3 w-3\" /> : <EyeOff className=\"h-3 w-3\" />}\n </TooltipButton>\n\n {/* Lock Toggle */}\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6\"\n onClick={(e) => {\n e.stopPropagation();\n api.updateElement(element.id, { locked: !isLocked });\n }}\n tooltip={isLocked ? \"Unlock\" : \"Lock\"}\n tooltipDelay={500}\n >\n {isLocked ? <Lock className=\"h-3 w-3\" /> : <Unlock className=\"h-3 w-3\" />}\n </TooltipButton>\n\n {/* Delete */}\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-6 w-6 text-destructive hover:text-destructive\"\n onClick={(e) => {\n e.stopPropagation();\n api.removeElement(element.id);\n }}\n tooltip=\"Delete\"\n tooltipDelay={500}\n >\n <Trash2 className=\"h-3 w-3\" />\n </TooltipButton>\n </div>\n </div>\n );\n })\n )}\n </div>\n </ScrollArea>\n\n {/* Footer Stats */}\n <div className=\"border-t p-2\">\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>{elements.filter((e) => e.visible !== false).length} visible</span>\n <span>•</span>\n <span>{elements.filter((e) => e.locked === true).length} locked</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default LayersPanel;\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nconst ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nexport { ScrollArea, ScrollBar }\n","import * as React from \"react\";\nimport { Button, ButtonProps } from \"@/ui/button\";\nimport { TooltipWrapper } from \"@/ui/general/TooltipWrapper\";\n\ninterface TooltipButtonProps extends ButtonProps {\n tooltip: string;\n shortcut?: string;\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n tooltipAlign?: \"start\" | \"center\" | \"end\";\n tooltipDelay?: number;\n children: React.ReactNode;\n}\n\nconst TooltipButton = React.forwardRef<HTMLButtonElement, TooltipButtonProps>(\n (\n {\n tooltip,\n shortcut,\n tooltipSide = \"top\",\n tooltipAlign = \"center\",\n tooltipDelay = 700,\n children,\n className,\n ...props\n },\n ref\n ) => {\n return (\n <TooltipWrapper\n tooltip={tooltip}\n shortcut={shortcut}\n tooltipSide={tooltipSide}\n tooltipAlign={tooltipAlign}\n tooltipDelay={tooltipDelay}\n asChild={true}\n triggerClassName=\"\"\n >\n <Button ref={ref} className={className} {...props}>\n {children}\n </Button>\n </TooltipWrapper>\n );\n }\n);\n\nTooltipButton.displayName = \"TooltipButton\";\n\nexport { TooltipButton, type TooltipButtonProps };\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-9 rounded-md px-3\",\n lg: \"h-11 rounded-md px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n className\n )}\n {...props}\n />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","import * as React from \"react\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"@/ui/tooltip\";\n\ninterface TooltipWrapperProps {\n tooltip: string;\n shortcut?: string;\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n tooltipAlign?: \"start\" | \"center\" | \"end\";\n tooltipDelay?: number;\n children: React.ReactNode;\n triggerClassName?: string;\n asChild?: boolean;\n}\n\nconst TooltipWrapper: React.FC<TooltipWrapperProps> = ({\n tooltip,\n shortcut,\n tooltipSide = \"top\",\n tooltipAlign = \"center\",\n tooltipDelay = 700,\n children,\n triggerClassName = \"flex-1\",\n asChild = true,\n}) => {\n return (\n <TooltipProvider delayDuration={tooltipDelay}>\n <Tooltip>\n <TooltipTrigger className={triggerClassName} asChild={asChild}>\n {children}\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} align={tooltipAlign}>\n <div className=\"flex items-center gap-2\">\n <span>{tooltip}</span>\n {shortcut && (\n <kbd className=\"inline-flex items-center px-1.5 py-0.5 text-xs font-mono bg-muted text-gray rounded border\">\n {shortcut}\n </kbd>\n )}\n </div>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n};\n\nTooltipWrapper.displayName = \"TooltipWrapper\";\n\nexport { TooltipWrapper, type TooltipWrapperProps };\n","/**\n * Visual Editor Workspace\n *\n * Integrated workspace that combines Toolbar, Canvas (VisualEditor), and Inspector.\n * This component creates a complete editor experience by coordinating all three parts.\n */\n\nimport React, { useCallback, useImperativeHandle } from \"react\";\nimport { Topbar } from \"./Topbar\";\nimport { Inspector } from \"./Inspector\";\nimport { LayersPanel } from \"./LayersPanel\";\nimport { Canvas } from \"./Canvas\";\nimport { useEditorState } from \"../core/useEditorState\";\nimport { useElementRegistry } from \"../core/ElementRegistry\";\nimport { defaultElements } from \"../elements\";\nimport { exportToJSON, importFromJSON } from \"../utils/editorUtils\";\nimport type { EditorMode, CanvasExport, EditorAPI, EditorElement } from \"../types\";\nimport { Toolbar } from \"./Toolbar\";\n\nexport interface VisualEditorWorkspaceProps {\n /** Editor mode configuration */\n mode?: EditorMode;\n\n /** Initial canvas data */\n initialData?: CanvasExport;\n\n /** Canvas width (overrides mode default) */\n width?: number;\n\n /** Canvas height (overrides mode default) */\n height?: number;\n\n /** Whether the editor is in readonly mode */\n readonly?: boolean;\n\n /** Callback when data changes */\n onChange?: (data: CanvasExport) => void;\n\n /** Custom element renderers (extends mode elements) */\n customElements?: any[];\n\n /** Whether to show the toolbar */\n showToolbar?: boolean;\n\n /** Whether to show the topbar (canvas size, undo, redo, delete, import, export) */\n showTopbar?: boolean;\n\n /** Whether to show the inspector panel */\n showInspector?: boolean;\n\n /** Whether to show the layers panel */\n showLayers?: boolean;\n\n /** Whether to show the asset picker (if defined in mode) */\n showAssetPicker?: boolean;\n\n /** Whether to show the canvas */\n showCanvas?: boolean;\n\n /** Whether to enable snap guides */\n enableSnapGuides?: boolean;\n\n /** Whether to enable pan and zoom controls */\n enablePanZoom?: boolean;\n\n /** Optional background image URL - replaces solid background color when provided */\n backgroundImageUrl?: string;\n\n /** Whether to hide all elements on the canvas */\n hideElements?: boolean;\n\n /** Custom CSS class */\n className?: string;\n\n /** Ref to access the editor API */\n apiRef?: React.Ref<EditorAPI>;\n}\n\n/**\n * Complete visual editor workspace with toolbar, canvas, and inspector\n */\nexport const VisualEditorWorkspace: React.FC<VisualEditorWorkspaceProps> = ({\n mode,\n initialData,\n width,\n height,\n readonly = false,\n onChange,\n customElements = [],\n showTopbar = true,\n showToolbar = true,\n showInspector = true,\n showLayers = true,\n showAssetPicker = true,\n showCanvas = true,\n enableSnapGuides = true,\n enablePanZoom = true,\n backgroundImageUrl,\n hideElements = false,\n className = \"\",\n apiRef,\n}) => {\n // Memoize element list to prevent re-registration\n const elementList = React.useMemo(() => {\n return [...defaultElements, ...(mode?.registeredElements || []), ...customElements];\n }, [mode, customElements]);\n\n // Initialize element registry\n const registry = useElementRegistry(elementList);\n\n // Initialize editor state\n const { state, api, undo, redo, canUndo, canRedo, setCanvasSize } = useEditorState(mode || null);\n\n // Clipboard ref for copy/paste operations\n const clipboardRef = React.useRef<EditorElement | null>(null);\n\n // Snap guides state (controlled internally)\n const [snapGuidesEnabled, setSnapGuidesEnabled] = React.useState(enableSnapGuides);\n\n // Background color state (controlled locally, initialized from mode)\n const [backgroundColor, setBackgroundColor] = React.useState(\n mode?.backgroundColor || \"#1a1a1a\"\n );\n\n // Background image state (controlled locally, initialized from mode)\n const [backgroundImage, setBackgroundImage] = React.useState<string>(\n mode?.backgroundImage || \"\"\n );\n\n // Sync external enableSnapGuides prop changes\n React.useEffect(() => {\n setSnapGuidesEnabled(enableSnapGuides);\n }, [enableSnapGuides]);\n\n // Sync mode backgroundColor changes\n React.useEffect(() => {\n if (mode?.backgroundColor) {\n setBackgroundColor(mode.backgroundColor);\n }\n }, [mode?.backgroundColor]);\n\n // Sync mode backgroundImage changes (including empty string to clear)\n React.useEffect(() => {\n setBackgroundImage(mode?.backgroundImage || \"\");\n }, [mode?.backgroundImage]);\n\n // Sync canvas size with editor state (editor state is the source of truth)\n const canvasSize = state.canvasSize;\n\n // Expose API via ref\n useImperativeHandle(apiRef, () => api, [api]);\n\n // Load initial data\n React.useEffect(() => {\n if (initialData && initialData.elements && initialData.elements.length > 0) {\n // Use loadElements to avoid recording history\n api.loadElements(initialData.elements);\n if (initialData.width && initialData.height) {\n setCanvasSize(initialData.width, initialData.height);\n }\n }\n }, []); // Only run once on mount\n\n // Get available element renderers for toolbar\n const availableRenderers = Array.from(registry.getAll().values());\n\n // Get current selection and renderer for inspector\n const selectedElement = state.selectedElementId\n ? state.elements.find((el) => el.id === state.selectedElementId) || null\n : null;\n\n const selectedRenderer = selectedElement ? registry.get(selectedElement.type) || null : null;\n\n // Handle export\n const handleExport = useCallback(() => {\n const data: CanvasExport = {\n width: canvasSize.width,\n height: canvasSize.height,\n elements: state.elements,\n metadata: {\n version: \"1.0\",\n mode: mode?.name || \"default\",\n created: new Date().toISOString(),\n },\n };\n\n const json = exportToJSON(data);\n const blob = new Blob([json], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `canvas-${Date.now()}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }, [state.elements, canvasSize, mode]);\n\n // Handle import\n const handleImport = useCallback(() => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".json\";\n input.onchange = async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) return;\n\n try {\n const text = await file.text();\n const imported = importFromJSON(text);\n\n if (imported) {\n // Clear current elements\n state.elements.forEach((el) => api.removeElement(el.id));\n\n // Load imported elements\n imported.elements.forEach((el) => api.addElement(el));\n\n // Update canvas size\n if (imported.width && imported.height) {\n setCanvasSize(imported.width, imported.height);\n }\n }\n } catch (error) {\n console.error(\"Failed to import:\", error);\n alert(`Failed to import: ${(error as Error).message}`);\n }\n };\n input.click();\n }, [state.elements, api]);\n\n // Notify parent of changes (use ref to prevent infinite loops)\n const onChangeRef = React.useRef(onChange);\n React.useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (onChangeRef.current) {\n onChangeRef.current({\n width: canvasSize.width,\n height: canvasSize.height,\n elements: state.elements,\n metadata: {\n backgroundColor: backgroundColor,\n backgroundImage: backgroundImage,\n },\n });\n }\n }, [state.elements, canvasSize, backgroundColor, backgroundImage]);\n\n // Keyboard shortcuts\n React.useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (readonly) return;\n\n // Undo: Ctrl+Z\n if (e.ctrlKey && e.key === \"z\" && !e.shiftKey) {\n e.preventDefault();\n if (canUndo) undo();\n }\n // Redo: Ctrl+Y or Ctrl+Shift+Z\n else if ((e.ctrlKey && e.key === \"y\") || (e.ctrlKey && e.shiftKey && e.key === \"Z\")) {\n e.preventDefault();\n if (canRedo) redo();\n }\n // Delete: Delete\n else if (e.key === \"Delete\" && selectedElement) {\n e.preventDefault();\n api.removeElement(selectedElement.id);\n }\n // Deselect: Escape\n else if (e.key === \"Escape\") {\n e.preventDefault();\n api.selectElement(null);\n }\n // Copy: Ctrl+C\n else if (e.ctrlKey && e.key === \"c\" && selectedElement) {\n e.preventDefault();\n const copied = api.copyElement();\n if (copied) {\n // Store in a temporary clipboard (we'll use a ref for this)\n clipboardRef.current = copied;\n }\n }\n // Paste: Ctrl+V\n else if (e.ctrlKey && e.key === \"v\" && clipboardRef.current) {\n e.preventDefault();\n api.pasteElement(clipboardRef.current);\n }\n // Duplicate: Ctrl+D\n else if (e.ctrlKey && e.key === \"d\" && selectedElement) {\n e.preventDefault();\n api.duplicateElement();\n }\n\n // Move selected element with arrow keys only when no input/textarea/select\n // or contentEditable element is focused. Prevent interfering with text editing.\n const isInputFocused = () => {\n const active = document.activeElement as HTMLElement | null;\n if (!active) return false;\n // If body is focused, nothing else is focused\n if (active === document.body) return false;\n // Content editable elements\n if (active.isContentEditable) return true;\n const tag = active.tagName?.toLowerCase();\n if (tag === \"input\" || tag === \"textarea\" || tag === \"select\") return true;\n const role = active.getAttribute ? active.getAttribute(\"role\") : null;\n if (role === \"textbox\") return true;\n return false;\n };\n\n if (selectedElement && !isInputFocused()) {\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n api.moveElement(selectedElement.id, 0, -1);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n api.moveElement(selectedElement.id, 0, 1);\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n api.moveElement(selectedElement.id, -1, 0);\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault();\n api.moveElement(selectedElement.id, 1, 0);\n }\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [canUndo, canRedo, undo, redo, selectedElement, api, readonly]);\n\n return (\n <div className={`flex flex-col ${className}`}>\n {/* Topbar */}\n {showTopbar && (\n <Topbar\n api={api}\n canvasSize={canvasSize}\n canUndo={canUndo}\n canRedo={canRedo}\n onUndo={undo}\n onRedo={redo}\n onExport={handleExport}\n onImport={handleImport}\n setCanvasSize={setCanvasSize}\n backgroundColor={backgroundColor}\n setBackgroundColor={setBackgroundColor}\n backgroundImage={backgroundImage}\n setBackgroundImage={setBackgroundImage}\n imageUrls={mode?.context?.imageUrls}\n clipboardRef={clipboardRef}\n enableSnapGuides={snapGuidesEnabled}\n onSnapGuidesChange={setSnapGuidesEnabled}\n config={mode?.topbarConfig}\n />\n )}\n\n {/* Main content: Canvas + Layers + Inspector + Asset Picker */}\n <div className=\"flex w-full h-full overflow-hidden\">\n {/* Toolbar */}\n {showToolbar && (\n <Toolbar\n api={api}\n elementRenderers={availableRenderers}\n canvasSize={canvasSize}\n config={mode?.toolbarConfig}\n />\n )}\n\n {/* Canvas */}\n {showCanvas && (\n <Canvas\n canvasSize={canvasSize}\n elements={state.elements}\n selectedElementId={state.selectedElementId}\n registry={registry}\n mode={mode ? { ...mode, backgroundColor } : undefined}\n readonly={readonly}\n enableSnapGuides={snapGuidesEnabled}\n enablePanZoom={enablePanZoom}\n backgroundImageUrl={\n backgroundImage && mode?.context?.imageUrls\n ? mode.context.imageUrls.get(backgroundImage)\n : backgroundImageUrl\n }\n hideElements={hideElements}\n onSelectElement={(id) => api.selectElement(id)}\n onTransformElement={(id, updates) => api.updateElement(id, updates)}\n />\n )}\n\n {/* Layers Panel */}\n {showLayers && (\n <LayersPanel\n elements={state.elements}\n selectedElementId={state.selectedElementId}\n api={api}\n elementRenderers={registry.getMap()}\n className=\"w-64\"\n />\n )}\n\n {/* Inspector Panel (with asset picker at bottom if position === 'bottom') */}\n {showInspector && (\n <div className=\"w-80 h-full border-l bg-background flex flex-col\">\n {/* Inspector Panel */}\n <div className=\"flex-1 min-h-0 overflow-auto\">\n <Inspector\n selectedElement={selectedElement}\n elementRenderer={selectedRenderer}\n api={api}\n mode={mode}\n canvasSize={canvasSize}\n setCanvasSize={setCanvasSize}\n />\n </div>\n\n {/* Asset Picker at Bottom (default position) */}\n {showAssetPicker &&\n mode?.assetPickerComponent &&\n (!mode.assetPickerPosition || mode.assetPickerPosition === \"bottom\") &&\n React.createElement(mode.assetPickerComponent, {\n ...mode.assetPickerProps,\n api,\n className: mode.assetPickerHeight || \"h-[40%]\",\n })}\n </div>\n )}\n\n {/* Asset Picker as Separate Panel (position === 'right') */}\n {showAssetPicker &&\n mode?.assetPickerComponent &&\n mode.assetPickerPosition === \"right\" &&\n React.createElement(mode.assetPickerComponent, {\n ...mode.assetPickerProps,\n api,\n className: `border-l ${mode.assetPickerHeight || \"w-80\"}`,\n })}\n </div>\n </div>\n );\n};\n\nexport default VisualEditorWorkspace;\n","/**\n * Topbar Component\n *\n * Provides controls for element creation, undo/redo, and editor actions.\n */\n\nimport React from \"react\";\nimport { Separator } from \"@/ui/separator\";\nimport { TooltipButton } from \"@/ui/general/TooltipButton\";\nimport { Undo, Redo, Trash2, Download, Upload, Copy, Clipboard, CopyPlus, Image, X } from \"lucide-react\";\nimport { EditorAPI, TopbarConfig } from \"../types\";\nimport { Input } from \"@/ui/input\";\nimport { Button } from \"@/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/ui/select\";\nimport CustomActionRenderer from \"./CustomActionRenderer\";\n\nexport interface TopbarProps {\n /** Editor API for performing actions */\n api: EditorAPI;\n\n /** Canvas size for positioning new elements */\n canvasSize: { width: number; height: number };\n\n /** Can undo */\n canUndo: boolean;\n\n /** Can redo */\n canRedo: boolean;\n\n /** Undo callback */\n onUndo: () => void;\n\n /** Redo callback */\n onRedo: () => void;\n\n /** Export callback */\n onExport?: () => void;\n\n /** Import callback */\n onImport?: () => void;\n\n /** Set canvas size callback */\n setCanvasSize: (width: number, height: number) => void;\n\n /** Background color */\n backgroundColor?: string;\n\n /** Set background color callback */\n setBackgroundColor?: (color: string) => void;\n\n /** Background image filename */\n backgroundImage?: string;\n\n /** Set background image callback */\n setBackgroundImage?: (image: string) => void;\n\n /** Available images from context (for image picker) */\n imageUrls?: Map<string, string>;\n\n /** Clipboard ref for copy/paste operations */\n clipboardRef?: React.MutableRefObject<any>;\n\n /** Enable snap guides */\n enableSnapGuides?: boolean;\n\n /** Callback when snap guides toggle changes */\n onSnapGuidesChange?: (enabled: boolean) => void;\n\n /** Configuration for topbar visibility and custom actions */\n config?: TopbarConfig;\n\n /** Optional custom style */\n style?: React.CSSProperties;\n\n /** Optional className */\n className?: string;\n}\n\n/**\n * Topbar component with element creation and editor controls\n */\nexport const Topbar: React.FC<TopbarProps> = ({\n api,\n canvasSize,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n onExport,\n onImport,\n setCanvasSize,\n backgroundColor,\n setBackgroundColor,\n backgroundImage,\n setBackgroundImage,\n imageUrls,\n clipboardRef,\n enableSnapGuides = true,\n onSnapGuidesChange,\n config,\n style,\n className,\n}) => {\n const selectedElement = api.getSelectedElement();\n\n // Default config values\n const {\n showUndo = true,\n showRedo = true,\n showDelete = true,\n showCopy = true,\n showPaste = true,\n showDuplicate = true,\n showExport = true,\n showImport = true,\n showCanvasSize = true,\n showSnapGuides = true,\n actionsStart = [],\n actionsEnd = [],\n actionsStartClassName = \"\",\n actionsEndClassName = \"\",\n customActions = [], // Backwards compatibility - defaults to end\n } = config || {};\n\n // Default snap guides toggle action (added to end actions if showSnapGuides is true and callback exists)\n const defaultSnapGuidesAction =\n showSnapGuides && onSnapGuidesChange\n ? [\n {\n type: \"toggle\" as const,\n id: \"snap-guides-toggle\",\n label: \"Snap Guides\",\n value: enableSnapGuides,\n onChange: (value: boolean) => {\n onSnapGuidesChange(value);\n },\n },\n ]\n : [];\n\n // Combine actionsEnd with default snap guides and customActions for backwards compatibility\n const endActions = [...actionsEnd, ...defaultSnapGuidesAction, ...customActions];\n\n // Delete selected element\n const handleDelete = () => {\n if (selectedElement) {\n api.removeElement(selectedElement.id);\n }\n };\n\n // Copy selected element\n const handleCopy = () => {\n const copied = api.copyElement();\n if (copied && clipboardRef) {\n clipboardRef.current = copied;\n }\n };\n\n // Paste from clipboard\n const handlePaste = () => {\n if (clipboardRef?.current) {\n api.pasteElement(clipboardRef.current);\n }\n };\n\n // Duplicate selected element\n const handleDuplicate = () => {\n api.duplicateElement();\n };\n\n // Helper to check if an action should be disabled\n const isDisabled = (disabled: boolean | ((api: EditorAPI) => boolean) | undefined): boolean => {\n if (typeof disabled === \"function\") {\n return disabled(api);\n }\n return disabled || false;\n };\n\n return (\n <div\n className={`flex h-12 items-center px-3 py-1 bg-popover border-b gap-2 ${className}`}\n style={style}\n >\n {/* Left side: Canvas size and background color controls */}\n {showCanvasSize && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">Canvas:</span>\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">W:</span>\n <Input\n placeholder=\"Width\"\n className=\"h-8 w-20\"\n type=\"number\"\n step={1}\n value={canvasSize.width}\n onChange={(e) =>\n setCanvasSize(Number(Number(e.target.value).toFixed(0)), canvasSize.height)\n }\n />\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">H:</span>\n <Input\n placeholder=\"Height\"\n className=\"h-8 w-20\"\n type=\"number\"\n step={1}\n value={canvasSize.height}\n onChange={(e) =>\n setCanvasSize(canvasSize.width, Number(Number(e.target.value).toFixed(0)))\n }\n />\n </div>\n {setBackgroundColor && backgroundColor && (\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">BG:</span>\n <Input\n placeholder=\"#000000\"\n className=\"h-8 w-24\"\n type=\"color\"\n value={backgroundColor}\n onChange={(e) => setBackgroundColor(e.target.value)}\n />\n </div>\n )}\n {setBackgroundImage && imageUrls && imageUrls.size > 0 && (\n <div className=\"flex items-center gap-1\">\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">Texture:</span>\n {backgroundImage ? (\n <div className=\"flex items-center gap-1\">\n <Select value={backgroundImage} onValueChange={setBackgroundImage}>\n <SelectTrigger className=\"h-8 w-32\">\n <SelectValue placeholder=\"None\" />\n </SelectTrigger>\n <SelectContent>\n {Array.from(imageUrls.keys()).map((imageName) => (\n <SelectItem key={imageName} value={imageName}>\n {imageName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => setBackgroundImage(\"\")}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </div>\n ) : (\n <Select value=\"\" onValueChange={setBackgroundImage}>\n <SelectTrigger className=\"h-8 w-32\">\n <SelectValue placeholder=\"None\">\n <div className=\"flex items-center gap-2\">\n <Image className=\"h-3 w-3\" />\n <span>None</span>\n </div>\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {Array.from(imageUrls.keys()).map((imageName) => (\n <SelectItem key={imageName} value={imageName}>\n {imageName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Right side: Action buttons */}\n <div className=\"flex w-full gap-2\">\n {/* Custom Actions - Start (before default controls) */}\n {actionsStart.length > 0 && (\n <>\n <div className={`flex items-center gap-1 ${actionsStartClassName}`}>\n {actionsStart.map((action) => (\n <CustomActionRenderer\n key={action.id}\n action={action}\n api={api}\n layout=\"horizontal\"\n />\n ))}\n </div>\n {/* Separator after start actions if there are more sections */}\n {(showUndo ||\n showRedo ||\n showDelete ||\n (showExport && onExport) ||\n (showImport && onImport) ||\n endActions.length > 0) && <Separator orientation=\"vertical\" className=\"h-6\" />}\n </>\n )}\n\n {/* History Controls */}\n {(showUndo || showRedo) && (\n <>\n <div className=\"flex items-center gap-1\">\n {showUndo && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={onUndo}\n disabled={!canUndo}\n className=\"h-8 w-8\"\n tooltip=\"Undo\"\n shortcut=\"Ctrl+Z\"\n tooltipDelay={500}\n >\n <Undo className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n\n {showRedo && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={onRedo}\n disabled={!canRedo}\n className=\"h-8 w-8\"\n tooltip=\"Redo\"\n shortcut=\"Ctrl+Y\"\n tooltipDelay={500}\n >\n <Redo className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n </div>\n {/* Separator after history if there are more sections */}\n {(showCopy ||\n showPaste ||\n showDuplicate ||\n showDelete ||\n (showExport && onExport) ||\n (showImport && onImport) ||\n endActions.length > 0) && <Separator orientation=\"vertical\" className=\"h-6\" />}\n </>\n )}\n\n {/* Element Actions */}\n {(showCopy || showPaste || showDuplicate || showDelete) && (\n <>\n <div className=\"flex items-center gap-1\">\n {showCopy && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCopy}\n disabled={!selectedElement}\n className=\"h-8 w-8\"\n tooltip=\"Copy\"\n shortcut=\"Ctrl+C\"\n tooltipDelay={500}\n >\n <Copy className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n\n {showPaste && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={handlePaste}\n disabled={!clipboardRef?.current}\n className=\"h-8 w-8\"\n tooltip=\"Paste\"\n shortcut=\"Ctrl+V\"\n tooltipDelay={500}\n >\n <Clipboard className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n\n {showDuplicate && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleDuplicate}\n disabled={!selectedElement}\n className=\"h-8 w-8\"\n tooltip=\"Duplicate\"\n shortcut=\"Ctrl+D\"\n tooltipDelay={500}\n >\n <CopyPlus className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n\n {showDelete && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleDelete}\n disabled={!selectedElement}\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n tooltip=\"Delete Selected\"\n shortcut=\"Delete\"\n tooltipDelay={500}\n >\n <Trash2 className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n </div>\n {/* Separator after element actions if there are more sections */}\n {((showExport && onExport) || (showImport && onImport) || endActions.length > 0) && (\n <Separator orientation=\"vertical\" className=\"h-6\" />\n )}\n </>\n )}\n\n {/* Import/Export */}\n {((showExport && onExport) || (showImport && onImport)) && (\n <>\n <div className=\"flex items-center gap-1\">\n {showExport && onExport && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={onExport}\n className=\"h-8 w-8\"\n tooltip=\"Export to JSON\"\n tooltipDelay={500}\n >\n <Download className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n\n {showImport && onImport && (\n <TooltipButton\n variant=\"ghost\"\n size=\"icon\"\n onClick={onImport}\n className=\"h-8 w-8\"\n tooltip=\"Import from JSON\"\n tooltipDelay={500}\n >\n <Upload className=\"h-4 w-4\" />\n </TooltipButton>\n )}\n </div>\n {/* Separator after import/export if there are end actions */}\n {endActions.length > 0 && <Separator orientation=\"vertical\" className=\"h-6\" />}\n </>\n )}\n\n {/* Custom Actions - End (after default controls) */}\n {endActions.length > 0 && (\n <div className={`flex items-center gap-1 ${actionsEndClassName}`}>\n {endActions.map((action) => (\n <CustomActionRenderer key={action.id} action={action} api={api} layout=\"horizontal\" />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default Topbar;\n","import * as React from \"react\";\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-secondary data-[state=unchecked]:bg-input\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"pointer-events-none block h-5 w-5 rounded-full bg-primary shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0 data-[state=checked]:bg-background\"\n )}\n />\n </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","import React from \"react\";\nimport { Label } from \"@/ui/label\";\nimport { Input } from \"@/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/ui/select\";\nimport { Switch } from \"@/ui/switch\";\nimport { Separator } from \"@/ui/separator\";\nimport { TooltipButton } from \"@/ui/general/TooltipButton\";\nimport { Plus } from \"lucide-react\";\nimport { CustomEditorAction, EditorAPI } from \"../types\";\n\nexport interface CustomActionRendererProps {\n action: CustomEditorAction;\n api: EditorAPI;\n /** Layout orientation - 'horizontal' for topbar, 'vertical' for toolbar */\n layout?: \"horizontal\" | \"vertical\";\n}\n\n/**\n * Helper component to render different types of custom actions\n * Supports both horizontal (topbar) and vertical (toolbar) layouts\n */\nconst CustomActionRenderer: React.FC<CustomActionRendererProps> = ({\n action,\n api,\n layout = \"horizontal\",\n}) => {\n // Helper to check if an action should be disabled\n const isDisabled = (disabled: boolean | ((api: EditorAPI) => boolean) | undefined): boolean => {\n if (typeof disabled === \"function\") {\n return disabled(api);\n }\n return disabled || false;\n };\n\n const isVertical = layout === \"vertical\";\n\n switch (action.type) {\n case \"button\":\n return (\n <TooltipButton\n key={action.id}\n variant={isVertical ? \"outline\" : \"ghost\"}\n size={isVertical ? \"sm\" : \"icon\"}\n onClick={() => action.onClick(api)}\n disabled={isDisabled(action.disabled)}\n className={isVertical ? \"icon-button\" : \"h-8 w-8\"}\n tooltip={action.label}\n shortcut={action.shortcut}\n tooltipDelay={500}\n tooltipSide={isVertical ? \"right\" : undefined}\n >\n {action.icon || <Plus className=\"h-4 w-4\" />}\n </TooltipButton>\n );\n\n case \"dropdown\":\n return (\n <div\n key={action.id}\n className={isVertical ? \"flex flex-col gap-1 px-1\" : \"flex items-center gap-2\"}\n >\n {isVertical ? (\n <Label className=\"text-xs\">{action.label}</Label>\n ) : (\n action.icon && <span className=\"text-muted-foreground\">{action.icon}</span>\n )}\n <Select\n value={action.value}\n onValueChange={(value) => action.onChange(value, api)}\n disabled={isDisabled(action.disabled)}\n >\n <SelectTrigger className={isVertical ? \"h-8 w-full\" : \"h-8 w-auto min-w-[120px]\"}>\n <SelectValue placeholder={action.placeholder || action.label} />\n </SelectTrigger>\n <SelectContent>\n {action.options.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n <div className=\"flex items-center gap-2\">\n {option.icon && <span>{option.icon}</span>}\n <span>{option.label}</span>\n </div>\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n\n case \"input\":\n return (\n <div\n key={action.id}\n className={isVertical ? \"flex flex-col gap-1 px-1\" : \"flex items-center gap-2\"}\n >\n <Label className=\"text-xs whitespace-nowrap\">{action.label}{isVertical ? \"\" : \":\"}</Label>\n <Input\n type={action.inputType || \"text\"}\n value={action.value}\n onChange={(e) => action.onChange(e.target.value, api)}\n placeholder={action.placeholder}\n disabled={isDisabled(action.disabled)}\n className={isVertical ? \"h-8 w-full\" : \"h-8 w-32\"}\n min={action.min}\n max={action.max}\n step={action.step}\n />\n </div>\n );\n\n case \"color\":\n return (\n <div\n key={action.id}\n className={isVertical ? \"flex flex-col gap-1 px-1\" : \"flex items-center gap-2\"}\n >\n <Label className=\"text-xs whitespace-nowrap\">{action.label}{isVertical ? \"\" : \":\"}</Label>\n <Input\n type=\"color\"\n value={action.value}\n onChange={(e) => action.onChange(e.target.value, api)}\n disabled={isDisabled(action.disabled)}\n className={isVertical ? \"h-8 w-full p-1 cursor-pointer\" : \"h-8 w-16 p-1 cursor-pointer\"}\n />\n </div>\n );\n\n case \"toggle\":\n return (\n <div\n key={action.id}\n className={isVertical ? \"flex items-center justify-between gap-2 px-1\" : \"flex items-center gap-2\"}\n >\n {action.icon && <span className=\"text-muted-foreground\">{action.icon}</span>}\n <Label className=\"text-xs whitespace-nowrap\">{action.label}</Label>\n <Switch\n checked={action.value}\n onCheckedChange={(checked) => action.onChange(checked, api)}\n disabled={isDisabled(action.disabled)}\n />\n </div>\n );\n\n case \"separator\":\n return (\n <Separator\n key={action.id}\n orientation={isVertical ? \"horizontal\" : \"vertical\"}\n className={isVertical ? undefined : \"h-6\"}\n />\n );\n\n default:\n return null;\n }\n};\n\nexport default CustomActionRenderer;\n","/**\n * Canvas Component\n *\n * Renders the main canvas with elements, background, and snap guides.\n * Handles element rendering and stage interactions.\n */\n\nimport React, { useCallback, useRef, useState } from \"react\";\nimport { Stage, Layer, Rect, Image as KonvaImage } from \"react-konva\";\nimport { SnapGuides } from \"./SnapGuides\";\nimport { CentralizedTransformer } from \"./CentralizedTransformer\";\nimport { EditorElement, EditorMode, ElementRenderer } from \"../types\";\nimport { SnapGuide, getSnappingPosition } from \"../utils/snapping\";\nimport { ElementRegistry } from \"../core/ElementRegistry\";\n\nexport interface CanvasProps {\n /** Canvas size */\n canvasSize: { width: number; height: number };\n\n /** All elements to render */\n elements: EditorElement[];\n\n /** Currently selected element ID */\n selectedElementId: string | null;\n\n /** Element registry for looking up renderers */\n registry: ElementRegistry;\n\n /** Editor mode configuration */\n mode?: EditorMode;\n\n /** Whether the editor is in readonly mode */\n readonly?: boolean;\n\n /** Whether to enable snap guides */\n enableSnapGuides?: boolean;\n\n /** Whether to enable pan and zoom controls */\n enablePanZoom?: boolean;\n\n /** Optional background image URL - replaces solid background color when provided */\n backgroundImageUrl?: string;\n\n /** Whether to hide all elements on the canvas */\n hideElements?: boolean;\n\n /** Callback when an element is selected */\n onSelectElement: (id: string | null) => void;\n\n /** Callback when an element is transformed */\n onTransformElement: (id: string, updates: Partial<EditorElement>) => void;\n\n /** Optional custom style */\n style?: React.CSSProperties;\n\n /** Optional className */\n className?: string;\n}\n\n/**\n * Canvas component - renders the Konva stage with all elements\n */\nexport const Canvas: React.FC<CanvasProps> = ({\n canvasSize,\n elements,\n selectedElementId,\n registry,\n mode,\n readonly = false,\n enableSnapGuides = true,\n enablePanZoom = true,\n backgroundImageUrl,\n hideElements = false,\n onSelectElement,\n onTransformElement,\n style,\n className = \"\",\n}) => {\n const stageRef = useRef<any>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const [snapGuides, setSnapGuides] = useState<{\n vertical: SnapGuide[];\n horizontal: SnapGuide[];\n }>({ vertical: [], horizontal: [] });\n\n // Pan and zoom state\n const [stageScale, setStageScale] = useState(1);\n const [stagePosition, setStagePosition] = useState({ x: 0, y: 0 });\n const isPanning = useRef(false);\n\n // Container size for dynamic stage sizing\n const [containerSize, setContainerSize] = useState({ width: 800, height: 600 });\n\n // Background image state\n const [backgroundImage, setBackgroundImage] = useState<HTMLImageElement | null>(null);\n\n // Transformer update trigger - incremented when we need to force transformer re-attachment\n const [transformerUpdateTrigger, setTransformerUpdateTrigger] = useState(0);\n\n // Load background image when URL changes\n React.useEffect(() => {\n if (!backgroundImageUrl) {\n setBackgroundImage(null);\n return;\n }\n\n const img = new window.Image();\n img.crossOrigin = \"anonymous\";\n img.onload = () => {\n setBackgroundImage(img);\n };\n img.onerror = (err) => {\n console.error(\"Failed to load canvas background image:\", err);\n setBackgroundImage(null);\n };\n img.src = backgroundImageUrl;\n\n return () => {\n img.onload = null;\n img.onerror = null;\n };\n }, [backgroundImageUrl]);\n\n // Update container size on mount and resize\n React.useEffect(() => {\n const updateSize = () => {\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n setContainerSize({\n width: rect.width,\n height: rect.height,\n });\n }\n };\n\n updateSize();\n\n // Add resize observer to track container size changes\n const resizeObserver = new ResizeObserver(updateSize);\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current);\n }\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n // Calculate dynamic stage size that fits the container while showing the full canvas\n const stageSize = React.useMemo(() => {\n // Use container size, ensuring stage is at least as large as the container\n const width = Math.max(containerSize.width, canvasSize.width);\n const height = Math.max(containerSize.height, canvasSize.height);\n\n return { width, height };\n }, [containerSize, canvasSize]);\n\n // Calculate layer offset to center the canvas in the stage\n const layerOffset = React.useMemo(() => {\n return {\n x: Math.max(0, (stageSize.width - canvasSize.width) / 2),\n y: Math.max(0, (stageSize.height - canvasSize.height) / 2),\n };\n }, [stageSize, canvasSize]);\n\n // Handle click on canvas background (deselect)\n const handleStageClick = useCallback(\n (e: any) => {\n // Clicked on stage - deselect\n if (e.target === e.target.getStage()) {\n onSelectElement(null);\n }\n },\n [onSelectElement]\n );\n\n const onClearSnapGuides = useCallback(() => {\n setSnapGuides({ vertical: [], horizontal: [] });\n }, []);\n\n // Callback to force transformer re-attachment (e.g., when images load)\n const onTransformerUpdate = useCallback(() => {\n setTransformerUpdateTrigger((prev) => prev + 1);\n }, []);\n\n // Handle zoom (mouse wheel)\n const handleWheel = useCallback(\n (e: any) => {\n if (!enablePanZoom) return;\n\n e.evt.preventDefault();\n\n const stage = stageRef.current;\n if (!stage) return;\n\n const oldScale = stage.scaleX();\n const pointer = stage.getPointerPosition();\n\n // Calculate mouse position relative to stage\n const mousePointTo = {\n x: (pointer.x - stage.x()) / oldScale,\n y: (pointer.y - stage.y()) / oldScale,\n };\n\n // Zoom factor\n const scaleBy = 1.05;\n const direction = e.evt.deltaY > 0 ? -1 : 1;\n\n // Calculate new scale with limits\n let newScale = direction > 0 ? oldScale * scaleBy : oldScale / scaleBy;\n newScale = Math.max(0.1, Math.min(5, newScale)); // Limit zoom between 0.1x and 5x\n\n // Calculate new position to zoom towards mouse\n const newPos = {\n x: pointer.x - mousePointTo.x * newScale,\n y: pointer.y - mousePointTo.y * newScale,\n };\n\n setStageScale(newScale);\n setStagePosition(newPos);\n },\n [enablePanZoom]\n );\n\n // Handle pan start (middle mouse button or space + drag)\n const handleMouseDown = useCallback(\n (e: any) => {\n if (!enablePanZoom) return;\n\n // Middle mouse button or space + left click\n if (e.evt.button === 1 || (e.evt.button === 0 && e.evt.shiftKey)) {\n e.evt.preventDefault();\n isPanning.current = true;\n }\n },\n [enablePanZoom]\n );\n\n // Handle pan move\n const handleMouseMove = useCallback(\n (e: any) => {\n if (!enablePanZoom || !isPanning.current) return;\n\n e.evt.preventDefault();\n\n const stage = stageRef.current;\n if (!stage) return;\n\n const newPos = {\n x: stagePosition.x + e.evt.movementX,\n y: stagePosition.y + e.evt.movementY,\n };\n\n setStagePosition(newPos);\n },\n [enablePanZoom, stagePosition]\n );\n\n // Handle pan end\n const handleMouseUp = useCallback(() => {\n isPanning.current = false;\n }, []);\n\n // Update stage transform\n React.useEffect(() => {\n const stage = stageRef.current;\n if (stage) {\n stage.scale({ x: stageScale, y: stageScale });\n stage.position(stagePosition);\n stage.batchDraw();\n }\n }, [stageScale, stagePosition]);\n\n // Render element using registry\n const renderElement = useCallback(\n (element: EditorElement) => {\n const isSelected = selectedElementId === element.id;\n\n // Get the renderer from registry\n const renderer = registry.get(element.type);\n if (!renderer) {\n console.warn(`No renderer found for element type: ${element.type}`);\n return null;\n }\n\n // Get the renderer component\n const RendererComponent = renderer.renderComponent;\n if (!RendererComponent) {\n console.warn(`No renderComponent found for element type: ${element.type}`);\n return null;\n }\n\n // Common props for all renderers\n const commonProps = {\n element,\n isSelected,\n onSelect: () => !readonly && onSelectElement(element.id),\n onTransform: (updates: Partial<EditorElement>) =>\n !readonly && onTransformElement(element.id, updates),\n // Snapping callbacks\n allElements: elements,\n canvasSize,\n onSnapGuides: enableSnapGuides ? setSnapGuides : undefined,\n onClearSnapGuides: enableSnapGuides ? onClearSnapGuides : undefined,\n // Pass element ID for centralized transformer lookup\n elementId: element.id,\n // Disable individual transformers (centralized transformer will handle it)\n disableTransformer: true,\n // Callback to notify when node structure changes (e.g., image loads)\n onNodeUpdate: onTransformerUpdate,\n // Pass mode context to renderers (e.g., cardData for TemplatedText)\n ...(mode?.context || {}),\n };\n\n return <RendererComponent key={element.id} {...commonProps} />;\n },\n [\n selectedElementId,\n registry,\n readonly,\n onSelectElement,\n onTransformElement,\n elements,\n canvasSize,\n enableSnapGuides,\n onClearSnapGuides,\n onTransformerUpdate,\n mode,\n ]\n );\n\n // Sort elements by z-index\n const sortedElements = [...elements].sort((a, b) => a.zIndex - b.zIndex);\n\n return (\n <div\n className={`flex flex-1 overflow-hidden items-center justify-center ${className}`}\n style={style}\n >\n <div\n ref={containerRef}\n className=\"flex relative w-full h-full items-center justify-center overflow-hidden\"\n >\n {/* Zoom indicator */}\n {enablePanZoom && stageScale !== 1 && (\n <div\n style={{\n position: \"absolute\",\n top: 10,\n right: 10,\n zIndex: 10,\n background: \"rgba(0, 0, 0, 0.7)\",\n color: \"white\",\n padding: \"4px 12px\",\n borderRadius: \"4px\",\n fontSize: \"12px\",\n fontWeight: 500,\n pointerEvents: \"none\",\n }}\n >\n {Math.round(stageScale * 100)}%\n </div>\n )}\n\n <Stage\n className=\"w-full h-full\"\n ref={stageRef}\n width={stageSize.width}\n height={stageSize.height}\n onClick={handleStageClick}\n onTap={handleStageClick}\n onWheel={handleWheel}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n style={{\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n cursor: isPanning.current ? \"grabbing\" : \"default\",\n }}\n >\n <Layer x={layerOffset.x} y={layerOffset.y} listening={true}>\n {/* Canvas background - shows the actual canvas bounds */}\n {backgroundImage ? (\n <KonvaImage\n x={0}\n y={0}\n width={canvasSize.width}\n height={canvasSize.height}\n image={backgroundImage}\n listening={false}\n />\n ) : (\n <Rect\n x={0}\n y={0}\n width={canvasSize.width}\n height={canvasSize.height}\n fill={mode?.backgroundColor || \"#ffffff\"}\n listening={false}\n />\n )}\n\n {/* Elements can now render outside canvas bounds */}\n {!hideElements && sortedElements.map(renderElement)}\n\n {/* Snap guides */}\n {enableSnapGuides && (\n <SnapGuides\n verticalGuides={snapGuides.vertical}\n horizontalGuides={snapGuides.horizontal}\n canvasSize={canvasSize}\n />\n )}\n\n {/* Centralized Transformer */}\n <CentralizedTransformer\n selectedElementId={selectedElementId}\n stageRef={stageRef}\n isLocked={readonly}\n updateTrigger={transformerUpdateTrigger}\n onTransform={(elementId, updates) => {\n // During transform, calculate snap guides based on the new size/position\n if (!enableSnapGuides) return;\n\n const element = elements.find((el) => el.id === elementId);\n if (!element) return;\n\n // Create a temporary element with the updated properties for snapping calculation\n const tempElement = {\n ...element,\n position: updates.position || element.position,\n size: updates.size || element.size,\n rotation: updates.rotation ?? element.rotation,\n };\n\n // Calculate snapping based on the temporary element\n const snapResult = getSnappingPosition(\n tempElement,\n tempElement.position.x,\n tempElement.position.y,\n elements.filter((el) => el.id !== elementId),\n {\n threshold: 5,\n snapToElements: true,\n snapToCanvas: true,\n canvasSize,\n }\n );\n\n // Update snap guides (but don't apply position changes during resize)\n setSnapGuides({\n vertical: snapResult.verticalGuides,\n horizontal: snapResult.horizontalGuides,\n });\n }}\n onTransformEnd={(elementId, updates) => {\n onTransformElement(elementId, updates);\n // Clear snap guides after transform ends\n setSnapGuides({ vertical: [], horizontal: [] });\n }}\n />\n </Layer>\n </Stage>\n </div>\n </div>\n );\n};\n\nexport default Canvas;\n","/**\n * Snap Guides Component\n *\n * Renders visual guide lines when elements are being snapped.\n */\n\nimport React from \"react\";\nimport { Line } from \"react-konva\";\nimport { SnapGuide } from \"../utils/snapping\";\n\nexport interface SnapGuidesProps {\n /** Vertical guides to display */\n verticalGuides: SnapGuide[];\n /** Horizontal guides to display */\n horizontalGuides: SnapGuide[];\n /** Canvas size */\n canvasSize: { width: number; height: number };\n}\n\n/**\n * Snap guides renderer\n */\nexport const SnapGuides: React.FC<SnapGuidesProps> = ({\n verticalGuides,\n horizontalGuides,\n canvasSize,\n}) => {\n return (\n <>\n {/* Vertical guides */}\n {verticalGuides.map((guide, index) => (\n <Line\n key={`v-${index}`}\n points={[guide.position, 0, guide.position, canvasSize.height]}\n stroke={guide.type === \"center\" ? \"#ff00ff\" : \"#00ff00\"}\n strokeWidth={1}\n dash={guide.type === \"center\" ? [4, 4] : undefined}\n listening={false}\n />\n ))}\n\n {/* Horizontal guides */}\n {horizontalGuides.map((guide, index) => (\n <Line\n key={`h-${index}`}\n points={[0, guide.position, canvasSize.width, guide.position]}\n stroke={guide.type === \"center\" ? \"#ff00ff\" : \"#00ff00\"}\n strokeWidth={1}\n dash={guide.type === \"center\" ? [4, 4] : undefined}\n listening={false}\n />\n ))}\n </>\n );\n};\n","/**\n * Centralized Transformer Component\n *\n * A single transformer that handles all selected elements,\n * eliminating the need for individual transformers in each element.\n */\n\nimport React, { useEffect, useRef } from \"react\";\nimport { Transformer } from \"react-konva\";\nimport Konva from \"konva\";\nimport { KonvaEventObject } from \"konva/lib/Node\";\n\nexport interface CentralizedTransformerProps {\n /** ID of the selected element */\n selectedElementId: string | null;\n\n /** Reference to the stage to find nodes */\n stageRef: React.RefObject<Konva.Stage>;\n\n /** Whether the element is locked (readonly mode) */\n isLocked?: boolean;\n\n /** Update trigger - increment this to force re-attachment */\n updateTrigger?: number;\n\n /** Callback when transform ends */\n onTransformEnd?: (\n elementId: string,\n updates: {\n position?: { x: number; y: number };\n size?: { width: number; height: number };\n rotation?: number;\n }\n ) => void;\n\n /** Callback during transform for snap guides (optional) */\n onTransform?: (\n elementId: string,\n updates: {\n position?: { x: number; y: number };\n size?: { width: number; height: number };\n rotation?: number;\n }\n ) => void;\n}\n\n/**\n * Centralized transformer that attaches to the selected element\n */\nexport const CentralizedTransformer: React.FC<CentralizedTransformerProps> = ({\n selectedElementId,\n stageRef,\n isLocked = false,\n updateTrigger = 0,\n onTransformEnd,\n onTransform,\n}) => {\n const transformerRef = useRef<Konva.Transformer>(null);\n\n useEffect(() => {\n const transformer = transformerRef.current;\n const stage = stageRef.current;\n\n if (!transformer || !stage || !selectedElementId || isLocked) {\n // Clear transformer if no selection or locked\n if (transformer) {\n transformer.nodes([]);\n transformer.getLayer()?.batchDraw();\n }\n return;\n }\n\n // Find the selected node by ID\n // We need to search for a node with matching ID in the stage\n const findNodeById = (id: string): Konva.Node | null => {\n const layer = stage.getLayers()[0]; // Get the main layer\n if (!layer) return null;\n\n // Search through all children\n const findInChildren = (node: Konva.Node): Konva.Node | null => {\n // Check if this node has the ID we're looking for\n // We'll use the element's ID as part of the key, so we need to check attrs\n if (node.attrs.id === id || node.id() === id) {\n return node;\n }\n\n // Recursively search children\n const children = (node as any).getChildren?.();\n if (children) {\n for (const child of children) {\n const found = findInChildren(child);\n if (found) return found;\n }\n }\n\n return null;\n };\n\n return findInChildren(layer);\n };\n\n const selectedNode = findNodeById(selectedElementId);\n\n if (selectedNode && selectedNode.draggable()) {\n // Attach transformer to the node\n transformer.nodes([selectedNode]);\n transformer.getLayer()?.batchDraw();\n } else {\n transformer.nodes([]);\n transformer.getLayer()?.batchDraw();\n }\n }, [selectedElementId, stageRef, isLocked, updateTrigger]);\n\n const handleTransform = (e: KonvaEventObject<Event>) => {\n if (!onTransform || !selectedElementId) return;\n\n const node = e.target;\n const scaleX = node.scaleX();\n const scaleY = node.scaleY();\n\n const updates = {\n position: {\n x: node.x(),\n y: node.y(),\n },\n size: {\n width: Math.max(5, node.width() * scaleX),\n height: Math.max(5, node.height() * scaleY),\n },\n rotation: node.rotation(),\n };\n\n onTransform(selectedElementId, updates);\n };\n\n const handleTransformEnd = (e: KonvaEventObject<Event>) => {\n if (!onTransformEnd || !selectedElementId) return;\n\n const node = e.target;\n const scaleX = node.scaleX();\n const scaleY = node.scaleY();\n\n // Reset scale to 1 and apply it to width/height\n node.scaleX(1);\n node.scaleY(1);\n\n const updates = {\n position: {\n x: node.x(),\n y: node.y(),\n },\n size: {\n width: Math.max(5, node.width() * scaleX),\n height: Math.max(5, node.height() * scaleY),\n },\n rotation: node.rotation(),\n };\n\n onTransformEnd(selectedElementId, updates);\n };\n\n // Don't render if locked or no selection\n if (isLocked || !selectedElementId) {\n return null;\n }\n\n return (\n <Transformer\n ref={transformerRef}\n rotateEnabled={true}\n rotationSnaps={[0, 90, 180, 270]}\n keepRatio={false}\n anchorCornerRadius={2}\n flipEnabled={false}\n enabledAnchors={[\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n \"middle-left\",\n \"middle-right\",\n \"top-center\",\n \"bottom-center\",\n ]}\n boundBoxFunc={(oldBox, newBox) => {\n // Limit resize to minimum 20px\n if (newBox.width < 20 || newBox.height < 20) {\n return oldBox;\n }\n return newBox;\n }}\n onTransform={handleTransform}\n onTransformEnd={handleTransformEnd}\n />\n );\n};\n\nexport default CentralizedTransformer;\n","/**\n * Toolbar Component\n *\n * Provides controls for element creation, undo/redo, and editor actions.\n */\n\nimport React from \"react\";\nimport { Separator } from \"@/ui/separator\";\nimport { TooltipButton } from \"@/ui/general/TooltipButton\";\nimport { Plus } from \"lucide-react\";\nimport { EditorAPI, ElementRenderer, ToolbarConfig } from \"../types\";\nimport { createElement } from \"../utils/editorUtils\";\nimport { useEditorState } from \"../core/useEditorState\";\nimport CustomActionRenderer from \"./CustomActionRenderer\";\n\nexport interface ToolbarProps {\n /** Editor API for performing actions */\n api: EditorAPI;\n\n /** Available element renderers to create */\n elementRenderers: ElementRenderer[];\n\n /** Canvas size for positioning new elements */\n canvasSize: { width: number; height: number };\n\n /** Configuration for toolbar visibility and custom tools */\n config?: ToolbarConfig;\n\n /** Optional custom style */\n style?: React.CSSProperties;\n\n /** Optional className */\n className?: string;\n}\n\n/**\n * Toolbar component with element creation and editor controls\n */\nexport const Toolbar: React.FC<ToolbarProps> = ({\n api,\n elementRenderers,\n canvasSize,\n config,\n style,\n className,\n}) => {\n const selectedElement = api.getSelectedElement();\n\n // Default config values\n const {\n showElementTools = true,\n hiddenElementTypes = [],\n toolsStart = [],\n toolsEnd = [],\n toolsStartClassName = \"\",\n toolsEndClassName = \"\",\n customTools = [], // Backwards compatibility - defaults to end\n } = config || {};\n\n // Combine toolsEnd with customTools for backwards compatibility\n const endTools = [...toolsEnd, ...customTools];\n\n // Filter element renderers based on configuration\n const visibleRenderers = showElementTools\n ? elementRenderers.filter((renderer) => !hiddenElementTypes.includes(renderer.type))\n : [];\n\n // Create a new element of the given type\n const handleCreateElement = (renderer: ElementRenderer) => {\n const newElement = createElement(renderer.type, renderer.defaultProps, {\n position: { x: canvasSize.width / 2, y: canvasSize.height / 2 }, // Center of canvas\n size: {\n width: renderer.defaultSize?.width || 100,\n height: renderer.defaultSize?.height || 100,\n },\n zIndex: api.getAllElements().length, // Top of stack\n });\n\n api.addElement(newElement);\n api.selectElement(newElement.id);\n };\n\n // Helper to check if an action should be disabled\n const isDisabled = (disabled: boolean | ((api: EditorAPI) => boolean) | undefined): boolean => {\n if (typeof disabled === \"function\") {\n return disabled(api);\n }\n return disabled || false;\n };\n\n return (\n <div\n className={`flex flex-col justify-start items-center bg-popover gap-2 p-2 ${className}`}\n style={style}\n >\n {/* Custom Tools - Start (before element creation tools) */}\n {toolsStart.length > 0 && (\n <>\n <div className={`flex flex-col gap-1 ${toolsStartClassName}`}>\n {toolsStart.map((tool) => (\n <CustomActionRenderer key={tool.id} action={tool} api={api} layout=\"vertical\" />\n ))}\n </div>\n {/* Separator after start tools if there are more sections */}\n {(visibleRenderers.length > 0 || endTools.length > 0) && (\n <Separator orientation=\"horizontal\" />\n )}\n </>\n )}\n\n {/* Element Creation Buttons */}\n {visibleRenderers.length > 0 && (\n <>\n <div className=\"flex flex-col gap-1\">\n {visibleRenderers.map((renderer) => (\n <TooltipButton\n key={renderer.type}\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleCreateElement(renderer)}\n className=\"icon-button\"\n tooltip={`Add ${renderer.displayName}`}\n tooltipDelay={500}\n tooltipSide=\"right\"\n >\n {renderer.icon || <Plus className=\"h-4 w-4\" />}\n </TooltipButton>\n ))}\n </div>\n {/* Separator after element tools if there are end tools */}\n {endTools.length > 0 && (\n <Separator orientation=\"horizontal\" />\n )}\n </>\n )}\n\n {/* Custom Tools - End (after element creation tools) */}\n {endTools.length > 0 && (\n <div className={`flex flex-col gap-1 ${toolsEndClassName}`}>\n {endTools.map((tool) => (\n <CustomActionRenderer key={tool.id} action={tool} api={api} layout=\"vertical\" />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default Toolbar;\n","/**\n * Asset Picker Panel\n *\n * Displays project assets that can be dragged/clicked to use in the editor.\n * Integrates with useProjectAssets to show game assets.\n */\n\nimport React from \"react\";\nimport { ScrollArea } from \"@/ui/scroll-area\";\nimport { Input } from \"@/ui/input\";\nimport { Search } from \"lucide-react\";\n\nexport interface AssetPickerProps {\n /** List of assets to display */\n assets: Array<{\n name: string;\n path: string;\n type?: string;\n }>;\n\n /** Callback when an asset is selected */\n onAssetSelect?: (assetPath: string) => void;\n\n /** Custom render function for asset items */\n renderAsset?: (asset: { name: string; path: string; type?: string }) => React.ReactNode;\n\n /** Custom CSS class */\n className?: string;\n\n /** Title for the panel */\n title?: string;\n}\n\n/**\n * Asset Picker component that displays available assets\n */\nexport const AssetPicker: React.FC<AssetPickerProps> = ({\n assets,\n onAssetSelect,\n renderAsset,\n className = \"\",\n title = \"Assets\",\n}) => {\n const [searchQuery, setSearchQuery] = React.useState(\"\");\n\n // Filter assets based on search query\n const filteredAssets = React.useMemo(() => {\n if (!searchQuery) return assets;\n const query = searchQuery.toLowerCase();\n return assets.filter((asset) => asset.name.toLowerCase().includes(query));\n }, [assets, searchQuery]);\n\n // Default asset renderer\n const defaultRenderAsset = React.useCallback(\n (asset: { name: string; path: string; type?: string }) => {\n const isImage = asset.name.match(/\\.(jpg|jpeg|png|gif|svg|webp)$/i);\n\n return (\n <div\n key={asset.path}\n className=\"flex flex-col items-center p-2 border rounded hover:bg-accent cursor-pointer transition-colors\"\n onClick={() => onAssetSelect?.(asset.path)}\n title={asset.name}\n >\n {isImage ? (\n <div className=\"w-16 h-16 flex items-center justify-center bg-muted rounded mb-1\">\n <img\n src={`asset:///${asset.path}`}\n alt={asset.name}\n className=\"max-w-full max-h-full object-contain\"\n onError={(e) => {\n // Fallback if image fails to load\n e.currentTarget.style.display = \"none\";\n e.currentTarget.parentElement!.innerHTML = `\n <div class=\"text-xs text-muted-foreground\">Image</div>\n `;\n }}\n />\n </div>\n ) : (\n <div className=\"w-16 h-16 flex items-center justify-center bg-muted rounded mb-1\">\n <div className=\"text-xs text-muted-foreground\">File</div>\n </div>\n )}\n <div className=\"text-xs text-center truncate w-full\">{asset.name}</div>\n </div>\n );\n },\n [onAssetSelect]\n );\n\n const assetRenderer = renderAsset || defaultRenderAsset;\n\n return (\n <div className={`flex flex-col bg-background border-t ${className || 'h-full'}`}>\n {/* Header */}\n <div className=\"p-3 border-b\">\n <h3 className=\"text-sm font-semibold mb-2\">{title}</h3>\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder=\"Search assets...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-8 h-8 text-sm\"\n />\n </div>\n </div>\n\n {/* Asset Grid */}\n <ScrollArea className=\"flex-1\">\n {filteredAssets.length > 0 ? (\n <div className=\"grid grid-cols-3 gap-2 p-3\">\n {filteredAssets.map((asset) => assetRenderer(asset))}\n </div>\n ) : (\n <div className=\"flex items-center justify-center h-32 text-sm text-muted-foreground\">\n {searchQuery ? \"No assets found\" : \"No assets available\"}\n </div>\n )}\n </ScrollArea>\n </div>\n );\n};\n\nexport default AssetPicker;\n"],"mappings":";;;AAUA,SAAgB,WAAW,eAAAA,cAAa,cAAc;AACtD,SAAS,OAAO,aAAa;;;ACJ7B,SAAS,YAAY,aAAa,eAAe;;;ACAjD,SAAS,MAAM,cAAc;AAKtB,IAAM,oBAAoB,MAAc;AAC7C,SAAO,WAAW,OAAO,CAAC;AAC5B;AAKO,IAAM,gBAAgB,CAC3B,MACA,OACA,YAU0B;AAC1B,SAAO;AAAA,IACL,IAAI,kBAAkB;AAAA,IACtB;AAAA,IACA,UAAU,SAAS,YAAY,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IAC5C,MAAM,SAAS,QAAQ,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,IACjD,UAAU,SAAS,YAAY;AAAA,IAC/B,SAAS,SAAS,WAAW;AAAA,IAC7B,QAAQ,SAAS,UAAU;AAAA,IAC3B,SAAS,SAAS,WAAW;AAAA,IAC7B,QAAQ,SAAS,UAAU;AAAA,IAC3B,aAAa,SAAS;AAAA,IACtB;AAAA,EACF;AACF;AAKO,IAAM,eAAe,CAC1B,YAC0B;AAC1B,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,kBAAkB;AAAA;AAAA,IACtB,OAAO,EAAE,GAAG,QAAQ,MAAM;AAAA,IAC1B,UAAU,EAAE,GAAG,QAAQ,SAAS;AAAA,IAChC,MAAM,EAAE,GAAG,QAAQ,KAAK;AAAA,EAC1B;AACF;AAKO,IAAM,mBAAmB,CAC9B,SACA,SAAmC,EAAE,GAAG,IAAI,GAAG,GAAG,MACxB;AAC1B,QAAM,SAAS,aAAa,OAAO;AACnC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU;AAAA,MACR,GAAG,QAAQ,SAAS,IAAI,OAAO;AAAA,MAC/B,GAAG,QAAQ,SAAS,IAAI,OAAO;AAAA,IACjC;AAAA,IACA,QAAQ,QAAQ,SAAS;AAAA;AAAA,EAC3B;AACF;AAKO,IAAM,eAAe,CAAC,aAA+C;AAC1E,SAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AACzD;AAKO,IAAM,eAAe,CAAC,aAAsC;AACjE,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,SAAO,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;AACpD;AAKO,IAAM,eAAe,CAAC,UAA2B,cAAuC;AAC7F,QAAM,OAAO,aAAa,QAAQ;AAClC,SAAO,SAAS,IAAI,CAAC,OAAQ,GAAG,OAAO,YAAY,EAAE,GAAG,IAAI,QAAQ,OAAO,EAAE,IAAI,EAAG;AACtF;AAKO,IAAM,aAAa,CAAC,UAA2B,cAAuC;AAC3F,QAAM,OAAO,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;AACxD,SAAO,SAAS,IAAI,CAAC,OAAQ,GAAG,OAAO,YAAY,EAAE,GAAG,IAAI,QAAQ,OAAO,EAAE,IAAI,EAAG;AACtF;AAKO,IAAM,eAAe,CAC1B,OACA,UACY;AACZ,SAAO,EACL,MAAM,IAAI,MAAM,QAAQ,MAAM,KAC9B,MAAM,IAAI,MAAM,QAAQ,MAAM,KAC9B,MAAM,IAAI,MAAM,SAAS,MAAM,KAC/B,MAAM,IAAI,MAAM,SAAS,MAAM;AAEnC;AAKO,IAAM,cAAc,CACzB,OACA,SACY;AACZ,SACE,MAAM,KAAK,KAAK,KAChB,MAAM,KAAK,KAAK,IAAI,KAAK,SACzB,MAAM,KAAK,KAAK,KAChB,MAAM,KAAK,KAAK,IAAI,KAAK;AAE7B;AAKO,IAAM,aAAa,CAAC,OAAe,aAA6B;AACrE,SAAO,KAAK,MAAM,QAAQ,QAAQ,IAAI;AACxC;AAKO,IAAM,qBAAqB,CAChC,UACA,aAC6B;AAC7B,SAAO;AAAA,IACL,GAAG,WAAW,SAAS,GAAG,QAAQ;AAAA,IAClC,GAAG,WAAW,SAAS,GAAG,QAAQ;AAAA,EACpC;AACF;AAKO,IAAM,QAAQ,CAAC,OAAe,KAAa,QAAwB;AACxE,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;AAC3C;AAKO,IAAM,oBAAoB,CAC/B,UACA,MACA,eAC6B;AAC7B,SAAO;AAAA,IACL,GAAG,MAAM,SAAS,GAAG,GAAG,WAAW,QAAQ,KAAK,KAAK;AAAA,IACrD,GAAG,MAAM,SAAS,GAAG,GAAG,WAAW,SAAS,KAAK,MAAM;AAAA,EACzD;AACF;AAKO,IAAM,wBAAwB,CACnC,GACA,GACA,OACA,QACA,aAC4D;AAC5D,QAAM,MAAO,WAAW,KAAK,KAAM;AACnC,QAAM,MAAM,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC;AAClC,QAAM,MAAM,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC;AAElC,QAAM,WAAW,QAAQ,MAAM,SAAS;AACxC,QAAM,YAAY,QAAQ,MAAM,SAAS;AAEzC,SAAO;AAAA,IACL,GAAG,KAAK,WAAW,SAAS;AAAA,IAC5B,GAAG,KAAK,YAAY,UAAU;AAAA,IAC9B,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAKO,IAAM,eAAe,CAAC,SAA+B;AAC1D,SAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACrC;AAKO,IAAM,iBAAiB,CAAC,SAA+B;AAC5D,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,IAAI;AAE5B,QAAI,CAAC,KAAK,SAAS,CAAC,KAAK,UAAU,CAAC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAChE,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAGA,UAAM,qBAAqB,KAAK,SAAS,IAAI,CAAC,aAA4B;AAAA,MACxE,GAAG;AAAA,MACH,SAAS,QAAQ,WAAW;AAAA,MAC5B,QAAQ,QAAQ,UAAU;AAAA,IAC5B,EAAE;AAEF,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,IACZ;AAAA,EACF,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,gCAAiC,MAAgB,OAAO,EAAE;AAAA,EAC5E;AACF;AAKO,IAAM,mBAAmB,CAAC,YAAqD;AACpF,SAAO;AAAA,IACL,GAAG,QAAQ,SAAS,IAAI,QAAQ,KAAK,QAAQ;AAAA,IAC7C,GAAG,QAAQ,SAAS,IAAI,QAAQ,KAAK,SAAS;AAAA,EAChD;AACF;AAKO,IAAM,WAAW,CAAC,IAA8B,OAAyC;AAC9F,QAAM,KAAK,GAAG,IAAI,GAAG;AACrB,QAAM,KAAK,GAAG,IAAI,GAAG;AACrB,SAAO,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AACpC;AAKO,IAAM,WAAW,CAAC,YAA4B;AACnD,SAAQ,UAAU,KAAK,KAAM;AAC/B;AAKO,IAAM,WAAW,CAAC,YAA4B;AACnD,SAAQ,UAAU,MAAO,KAAK;AAChC;AAKO,IAAM,iBAAiB,CAAC,YAA2C;AACxE,SACE,WACA,OAAO,QAAQ,OAAO,YACtB,OAAO,QAAQ,SAAS,YACxB,QAAQ,YACR,OAAO,QAAQ,SAAS,MAAM,YAC9B,OAAO,QAAQ,SAAS,MAAM,YAC9B,QAAQ,QACR,OAAO,QAAQ,KAAK,UAAU,YAC9B,OAAO,QAAQ,KAAK,WAAW,YAC/B,OAAO,QAAQ,aAAa,YAC5B,OAAO,QAAQ,WAAW,YAC1B,QAAQ,UAAU;AAEtB;AAKO,IAAM,sBAAsB,CAAC,SAAoC;AACtE,SACE,QACA,OAAO,KAAK,UAAU,YACtB,OAAO,KAAK,WAAW,YACvB,MAAM,QAAQ,KAAK,QAAQ,KAC3B,KAAK,SAAS,MAAM,cAAc;AAEtC;;;AD1RA,IAAM,qBAAqB,CAAC,UAA0C;AAAA,EACpE,UAAU,CAAC;AAAA,EACX,mBAAmB;AAAA,EACnB,YAAY,MAAM,qBAAqB,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,EACjE,MAAM;AAAA,EACN,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EAClB;AAAA,EACA,SAAS;AAAA,IACP,MAAM,CAAC;AAAA,IACP,QAAQ,CAAC;AAAA,EACX;AACF;AAKA,IAAM,gBAAgB,CAAC,OAAoB,WAAsC;AAC/E,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,eAAe;AAElB,YAAM,oBAAoB;AAAA,QACxB,GAAG,OAAO;AAAA,QACV,SAAS,OAAO,QAAQ,WAAW;AAAA,QACnC,QAAQ,OAAO,QAAQ,UAAU;AAAA,MACnC;AACA,YAAM,cAAc,CAAC,GAAG,MAAM,UAAU,iBAAiB;AACzD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,QACV,mBAAmB,kBAAkB;AAAA,QACrC,SAAS;AAAA,UACP,MAAM,CAAC,GAAG,MAAM,QAAQ,MAAM,MAAM,QAAQ;AAAA,UAC5C,QAAQ,CAAC;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,kBAAkB;AACrB,YAAM,cAAc,MAAM,SAAS;AAAA,QAAI,CAAC,OACtC,GAAG,OAAO,OAAO,KAAK,EAAE,GAAG,IAAI,GAAG,OAAO,QAAQ,IAAI;AAAA,MACvD;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,QACV,SAAS;AAAA,UACP,MAAM,CAAC,GAAG,MAAM,QAAQ,MAAM,MAAM,QAAQ;AAAA,UAC5C,QAAQ,CAAC;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,kBAAkB;AACrB,YAAM,cAAc,MAAM,SAAS,OAAO,CAAC,OAAO,GAAG,OAAO,OAAO,EAAE;AACrE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,QACV,mBAAmB,MAAM,sBAAsB,OAAO,KAAK,OAAO,MAAM;AAAA,QACxE,SAAS;AAAA,UACP,MAAM,CAAC,GAAG,MAAM,QAAQ,MAAM,MAAM,QAAQ;AAAA,UAC5C,QAAQ,CAAC;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,mBAAmB,OAAO;AAAA,MAC5B;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,OAAO;AAAA,QACjB,SAAS;AAAA,UACP,MAAM,CAAC,GAAG,MAAM,QAAQ,MAAM,MAAM,QAAQ;AAAA,UAC5C,QAAQ,CAAC;AAAA,QACX;AAAA,MACF;AAAA,IAEF,KAAK;AAEH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,OAAO,SAAS,IAAI,CAAC,QAAQ;AAAA,UACrC,GAAG;AAAA,UACH,SAAS,GAAG,WAAW;AAAA,UACvB,QAAQ,GAAG,UAAU;AAAA,QACvB,EAAE;AAAA,MACJ;AAAA,IAEF,KAAK,mBAAmB;AACtB,YAAM,eAAe,MAAM,SAAS,UAAU,CAAC,OAAO,GAAG,OAAO,OAAO,SAAS;AAChF,UAAI,iBAAiB,MAAM,iBAAiB,OAAO,SAAU,QAAO;AAEpE,YAAM,cAAc,CAAC,GAAG,MAAM,QAAQ;AACtC,YAAM,CAAC,OAAO,IAAI,YAAY,OAAO,cAAc,CAAC;AACpD,kBAAY,OAAO,OAAO,UAAU,GAAG,OAAO;AAG9C,kBAAY,QAAQ,CAAC,IAAI,UAAU;AACjC,WAAG,SAAS;AAAA,MACd,CAAC;AAED,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,QACV,SAAS;AAAA,UACP,MAAM,CAAC,GAAG,MAAM,QAAQ,MAAM,MAAM,QAAQ;AAAA,UAC5C,QAAQ,CAAC;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY;AAAA,UACV,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,OAAO;AAAA,MACf;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,KAAK;AAAA,UACH,GAAG,OAAO;AAAA,UACV,GAAG,OAAO;AAAA,QACZ;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM,OAAO;AAAA,QACb,YAAY,OAAO,KAAK;AAAA,MAC1B;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,CAAC;AAAA,QACX,mBAAmB;AAAA,QACnB,SAAS;AAAA,UACP,MAAM,CAAC,GAAG,MAAM,QAAQ,MAAM,MAAM,QAAQ;AAAA,UAC5C,QAAQ,CAAC;AAAA,QACX;AAAA,MACF;AAAA,IAEF,KAAK,QAAQ;AACX,UAAI,MAAM,QAAQ,KAAK,WAAW,EAAG,QAAO;AAC5C,YAAM,WAAW,MAAM,QAAQ,KAAK,MAAM,QAAQ,KAAK,SAAS,CAAC;AACjE,YAAM,UAAU,MAAM,QAAQ,KAAK,MAAM,GAAG,EAAE;AAC9C,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,QACV,SAAS;AAAA,UACP,MAAM;AAAA,UACN,QAAQ,CAAC,MAAM,UAAU,GAAG,MAAM,QAAQ,MAAM;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,UAAI,MAAM,QAAQ,OAAO,WAAW,EAAG,QAAO;AAC9C,YAAM,OAAO,MAAM,QAAQ,OAAO,CAAC;AACnC,YAAM,YAAY,MAAM,QAAQ,OAAO,MAAM,CAAC;AAC9C,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,QACV,SAAS;AAAA,UACP,MAAM,CAAC,GAAG,MAAM,QAAQ,MAAM,MAAM,QAAQ;AAAA,UAC5C,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,IAEA;AACE,aAAO;AAAA,EACX;AACF;AAKO,IAAM,iBAAiB,CAAC,cAAiC,SAAS;AACvE,QAAM,CAAC,OAAO,QAAQ,IAAI,WAAW,eAAe,mBAAmB,WAAW,CAAC;AAMnF,QAAM,aAAa,YAAY,CAAC,YAA2B;AACzD,aAAS,EAAE,MAAM,eAAe,QAAQ,CAAC;AAAA,EAC3C,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,YAAY,CAAC,IAAY,YAAoC;AACjF,aAAS,EAAE,MAAM,kBAAkB,IAAI,QAAQ,CAAC;AAAA,EAClD,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,YAAY,CAAC,OAAe;AAChD,aAAS,EAAE,MAAM,kBAAkB,GAAG,CAAC;AAAA,EACzC,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,YAAY,CAAC,OAAsB;AACvD,aAAS,EAAE,MAAM,kBAAkB,GAAG,CAAC;AAAA,EACzC,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAqB,YAAY,MAA4B;AACjE,QAAI,CAAC,MAAM,kBAAmB,QAAO;AACrC,WAAO,MAAM,SAAS,KAAK,CAAC,OAAO,GAAG,OAAO,MAAM,iBAAiB,KAAK;AAAA,EAC3E,GAAG,CAAC,MAAM,mBAAmB,MAAM,QAAQ,CAAC;AAE5C,QAAM,iBAAiB,YAAY,MAAuB;AACxD,WAAO,MAAM;AAAA,EACf,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,QAAM,cAAc;AAAA,IAClB,CAAC,IAAY,QAAgB,WAAmB;AAC9C,YAAM,UAAU,MAAM,SAAS,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE;AACxD,UAAI,CAAC,QAAS;AAEd,oBAAc,IAAI;AAAA,QAChB,UAAU;AAAA,UACR,GAAG,QAAQ,SAAS,IAAI;AAAA,UACxB,GAAG,QAAQ,SAAS,IAAI;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,MAAM,UAAU,aAAa;AAAA,EAChC;AAEA,QAAM,gBAAgB;AAAA,IACpB,CAAC,IAAY,UAAkB;AAC7B,oBAAc,IAAI,EAAE,UAAU,MAAM,CAAC;AAAA,IACvC;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,gBAAgB;AAAA,IACpB,CAAC,IAAY,OAAe,WAAmB;AAC7C,oBAAc,IAAI;AAAA,QAChB,MAAM,EAAE,OAAO,OAAO;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,eAAe;AAAA,IACnB,CAAC,IAAY,WAAmB;AAC9B,oBAAc,IAAI,EAAE,OAAO,CAAC;AAAA,IAC9B;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,iBAAiB,YAAY,CAAC,IAAY,aAAqB;AACnE,aAAS,EAAE,MAAM,mBAAmB,WAAW,IAAI,SAAS,CAAC;AAAA,EAC/D,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,YAAY,MAAoB;AACjD,WAAO;AAAA,MACL,OAAO,MAAM,WAAW;AAAA,MACxB,QAAQ,MAAM,WAAW;AAAA,MACzB,UAAU,MAAM;AAAA,MAChB,UAAU;AAAA,QACR,SAAS;AAAA,QACT,MAAM,MAAM,MAAM;AAAA,QAClB,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,MAAM,UAAU,MAAM,IAAI,CAAC;AAEjD,QAAM,aAAa,YAAY,CAAC,SAAuB;AACrD,aAAS;AAAA,MACP,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,aAAS,EAAE,MAAM,gBAAgB,UAAU,KAAK,SAAS,CAAC;AAAA,EAC5D,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,YAAY,MAAM;AAC9B,aAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB,YAAY,CAAC,OAAe,WAAmB;AACnE,aAAS,EAAE,MAAM,mBAAmB,OAAO,OAAO,CAAC;AAAA,EACrD,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,YAAY,CAAC,SAAqB;AAChD,aAAS,EAAE,MAAM,YAAY,KAAK,CAAC;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,QAAM,OAAO,YAAY,MAAM;AAC7B,aAAS,EAAE,MAAM,OAAO,CAAC;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,QAAM,OAAO,YAAY,MAAM;AAC7B,aAAS,EAAE,MAAM,OAAO,CAAC;AAAA,EAC3B,GAAG,CAAC,CAAC;AAML,QAAM,cAAc;AAAA,IAClB,CAAC,KAAoB,SAA+B;AAClD,YAAM,gBAAgB,KAAK,MAAM,SAAS,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,IAAI,mBAAmB;AAE1F,UAAI,CAAC,cAAe,QAAO;AAG3B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO,EAAE,GAAG,cAAc,MAAM;AAAA,QAChC,UAAU,EAAE,GAAG,cAAc,SAAS;AAAA,QACtC,MAAM,EAAE,GAAG,cAAc,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,IACA,CAAC,MAAM,UAAU,kBAAkB;AAAA,EACrC;AAEA,QAAMC,oBAAmB;AAAA,IACvB,CAAC,KAAoB,MAAM,SAAS,EAAE,GAAG,IAAI,GAAG,GAAG,MAAM;AACvD,YAAM,qBAAqB,KACvB,MAAM,SAAS,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,IACxC,mBAAmB;AAEvB,UAAI,CAAC,mBAAoB;AAEzB,YAAM,aAAa,iBAAqB,oBAAoB,MAAM;AAElE,iBAAW,UAAU;AAAA,IACvB;AAAA,IACA,CAAC,MAAM,UAAU,oBAAoB,UAAU;AAAA,EACjD;AAEA,QAAM,eAAe;AAAA,IACnB,CAAC,eAA8B,SAAS,EAAE,GAAG,IAAI,GAAG,GAAG,MAAM;AAC3D,UAAI,CAAC,cAAe;AAGpB,YAAM,SAAwB;AAAA,QAC5B,GAAG;AAAA,QACH,IAAI,kBAAkB;AAAA,QACtB,OAAO,EAAE,GAAG,cAAc,MAAM;AAAA,QAChC,UAAU;AAAA,UACR,GAAG,cAAc,SAAS,IAAI,OAAO;AAAA,UACrC,GAAG,cAAc,SAAS,IAAI,OAAO;AAAA,QACvC;AAAA,QACA,MAAM,EAAE,GAAG,cAAc,KAAK;AAAA,QAC9B,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI;AAAA,MAClE;AAEA,iBAAW,MAAM;AAAA,IACnB;AAAA,IACA,CAAC,MAAM,UAAU,UAAU;AAAA,EAC7B;AAMA,QAAM,eAAe,YAAY,MAAM;AACrC,UAAM,QAAQ,OAAO,CAAC;AACtB,UAAM,QAAQ,SAAS,CAAC;AAAA,EAC1B,GAAG,CAAC,CAAC;AAML,QAAM,eAAe,YAAY,CAAC,aAA8B;AAC9D,aAAS,EAAE,MAAM,iBAAiB,SAAS,CAAC;AAAA,EAC9C,GAAG,CAAC,CAAC;AAML,QAAM,MAAiB;AAAA,IACrB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,MAAM,QAAQ,KAAK,SAAS;AAAA,IACrC,SAAS,MAAM,QAAQ,OAAO,SAAS;AAAA,EACzC;AACF;;;AE9WA,SAAS,WAAAC,gBAAe;AAxFjB,IAAM,kBAAN,MAAsB;AAAA,EAAtB;AACL,SAAQ,YAA0C,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAK1D,SAAS,UAAiC;AACxC,QAAI,KAAK,UAAU,IAAI,SAAS,IAAI,GAAG;AACrC,cAAQ;AAAA,QACN,+BAA+B,SAAS,IAAI;AAAA,MAC9C;AACA;AAAA,IACF;AACA,SAAK,UAAU,IAAI,SAAS,MAAM,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,WAAoC;AAC/C,cAAU,QAAQ,CAAC,aAAa,KAAK,SAAS,QAAQ,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAA2C;AAC7C,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAuB;AACzB,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,SAA4B;AAC1B,WAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,SAAuC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAwB;AACtB,WAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAuB;AAChC,WAAO,KAAK,UAAU,OAAO,IAAI;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK,UAAU;AAAA,EACxB;AACF;AAKO,IAAM,wBAAwB,IAAI,gBAAgB;AAOlD,IAAM,qBAAqB,CAAC,qBAA0D;AAC3F,SAAOA,SAAQ,MAAM;AACnB,UAAM,WAAW,IAAI,gBAAgB;AACrC,QAAI,kBAAkB;AACpB,eAAS,aAAa,gBAAgB;AAAA,IACxC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,gBAAgB,CAAC;AACvB;;;ACzGA,OAAO,WAAW;AAClB,SAAS,YAAY;AAErB,SAAS,YAAY;;;ACmCrB,SAAS,iBACP,GACA,GACA,OACA,QACA,UACgG;AAEhG,MAAI,KAAK,IAAI,QAAQ,IAAI,OAAO,KAAK,IAAI,WAAW,GAAG,IAAI,KAAK;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,IAAI;AAAA,MACX,KAAK;AAAA,MACL,QAAQ,IAAI;AAAA,MACZ,SAAS,IAAI,QAAQ;AAAA,MACrB,SAAS,IAAI,SAAS;AAAA,IACxB;AAAA,EACF;AAGA,QAAM,MAAO,WAAW,KAAK,KAAM;AACnC,QAAM,MAAM,KAAK,IAAI,GAAG;AACxB,QAAM,MAAM,KAAK,IAAI,GAAG;AAGxB,QAAM,UAAU;AAAA,IACd,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA;AAAA,IACb,EAAE,GAAG,OAAO,GAAG,EAAE;AAAA;AAAA,IACjB,EAAE,GAAG,OAAO,GAAG,OAAO;AAAA;AAAA,IACtB,EAAE,GAAG,GAAG,GAAG,OAAO;AAAA;AAAA,EACpB;AAGA,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AAEX,aAAW,UAAU,SAAS;AAE5B,UAAM,WAAW,IAAI,OAAO,IAAI,MAAM,OAAO,IAAI;AACjD,UAAM,WAAW,IAAI,OAAO,IAAI,MAAM,OAAO,IAAI;AACjD,WAAO,KAAK,IAAI,MAAM,QAAQ;AAC9B,WAAO,KAAK,IAAI,MAAM,QAAQ;AAC9B,WAAO,KAAK,IAAI,MAAM,QAAQ;AAC9B,WAAO,KAAK,IAAI,MAAM,QAAQ;AAAA,EAChC;AAIA,QAAM,UAAU,IAAK,QAAQ,IAAK,MAAO,SAAS,IAAK;AACvD,QAAM,UAAU,IAAK,QAAQ,IAAK,MAAO,SAAS,IAAK;AAEvD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,oBACd,gBACA,GACA,GACA,aACA,UAAuB,CAAC,GACZ;AACZ,QAAM,EAAE,YAAY,GAAG,iBAAiB,MAAM,eAAe,MAAM,WAAW,IAAI;AAElF,MAAI,WAAW;AACf,MAAI,WAAW;AACf,QAAM,iBAA8B,CAAC;AACrC,QAAM,mBAAgC,CAAC;AAGvC,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA,eAAe,KAAK;AAAA,IACpB,eAAe,KAAK;AAAA,IACpB,eAAe;AAAA,EACjB;AAEA,QAAM,cAAc,cAAc;AAClC,QAAM,eAAe,cAAc;AACnC,QAAM,aAAa,cAAc;AACjC,QAAM,gBAAgB,cAAc;AACpC,QAAM,iBAAiB,cAAc;AACrC,QAAM,iBAAiB,cAAc;AAGrC,QAAM,YACJ,KAAK,IAAI,eAAe,QAAQ,IAAI,OAAO,KAAK,IAAI,eAAe,WAAW,GAAG,IAAI;AAGvF,MAAI,sBAAsB;AAC1B,MAAI,wBAAwB;AAC5B,MAAI,iBAAiB;AACrB,MAAI,mBAAmB;AAGvB,MAAI,gBAAgB,YAAY;AAI9B,QAAI,KAAK,IAAI,WAAW,KAAK,qBAAqB;AAChD,uBAAiB,CAAC;AAClB,4BAAsB,KAAK,IAAI,WAAW;AAC1C,qBAAe,KAAK,EAAE,UAAU,GAAG,aAAa,YAAY,MAAM,SAAS,CAAC;AAAA,IAC9E;AAGA,QAAI,KAAK,IAAI,eAAe,WAAW,KAAK,KAAK,qBAAqB;AACpE,uBAAiB,WAAW,QAAQ;AACpC,4BAAsB,KAAK,IAAI,eAAe,WAAW,KAAK;AAC9D,qBAAe,KAAK;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,aAAa;AAAA,QACb,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,IAAI,UAAU,KAAK,uBAAuB;AACjD,yBAAmB,CAAC;AACpB,8BAAwB,KAAK,IAAI,UAAU;AAC3C,uBAAiB,KAAK,EAAE,UAAU,GAAG,aAAa,cAAc,MAAM,SAAS,CAAC;AAAA,IAClF;AAGA,QAAI,KAAK,IAAI,gBAAgB,WAAW,MAAM,KAAK,uBAAuB;AACxE,yBAAmB,WAAW,SAAS;AACvC,8BAAwB,KAAK,IAAI,gBAAgB,WAAW,MAAM;AAClE,uBAAiB,KAAK;AAAA,QACpB,UAAU,WAAW;AAAA,QACrB,aAAa;AAAA,QACb,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAGA,UAAM,gBAAgB,WAAW,QAAQ;AACzC,QAAI,KAAK,IAAI,iBAAiB,aAAa,KAAK,qBAAqB;AACnE,uBAAiB,gBAAgB;AACjC,4BAAsB,KAAK,IAAI,iBAAiB,aAAa;AAC7D,qBAAe,SAAS;AACxB,qBAAe,KAAK;AAAA,QAClB,UAAU;AAAA,QACV,aAAa;AAAA,QACb,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAGA,UAAM,gBAAgB,WAAW,SAAS;AAC1C,QAAI,KAAK,IAAI,iBAAiB,aAAa,KAAK,uBAAuB;AACrE,yBAAmB,gBAAgB;AACnC,8BAAwB,KAAK,IAAI,iBAAiB,aAAa;AAC/D,uBAAiB,SAAS;AAC1B,uBAAiB,KAAK;AAAA,QACpB,UAAU;AAAA,QACV,aAAa;AAAA,QACb,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,gBAAgB;AAClB,eAAW,WAAW,aAAa;AAEjC,UAAI,QAAQ,OAAO,eAAe,GAAI;AAGtC,UAAI,QAAQ,YAAY,MAAO;AAG/B,YAAM,gBAAgB;AAAA,QACpB,QAAQ,SAAS;AAAA,QACjB,QAAQ,SAAS;AAAA,QACjB,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,QAAQ;AAAA,MACV;AAEA,YAAM,cAAc,cAAc;AAClC,YAAM,eAAe,cAAc;AACnC,YAAM,aAAa,cAAc;AACjC,YAAM,gBAAgB,cAAc;AACpC,YAAM,iBAAiB,cAAc;AACrC,YAAM,iBAAiB,cAAc;AAGrC,YAAM,mBACJ,KAAK,IAAI,QAAQ,QAAQ,IAAI,OAAO,KAAK,IAAI,QAAQ,WAAW,GAAG,IAAI;AAIzE,YAAM,kBAAkB;AAGxB,UAAI,CAAC,iBAAiB;AAEpB,YAAI,KAAK,IAAI,cAAc,WAAW,KAAK,qBAAqB;AAC9D,2BAAiB,cAAc;AAC/B,gCAAsB,KAAK,IAAI,cAAc,WAAW;AACxD,yBAAe,SAAS;AACxB,yBAAe,KAAK,EAAE,UAAU,aAAa,aAAa,YAAY,MAAM,OAAO,CAAC;AAAA,QACtF;AAGA,YAAI,KAAK,IAAI,eAAe,YAAY,KAAK,qBAAqB;AAChE,2BAAiB,eAAe;AAChC,gCAAsB,KAAK,IAAI,eAAe,YAAY;AAC1D,yBAAe,SAAS;AACxB,yBAAe,KAAK;AAAA,YAClB,UAAU;AAAA,YACV,aAAa;AAAA,YACb,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAGA,YAAI,KAAK,IAAI,cAAc,YAAY,KAAK,qBAAqB;AAC/D,2BAAiB,eAAe;AAChC,gCAAsB,KAAK,IAAI,cAAc,YAAY;AACzD,yBAAe,SAAS;AACxB,yBAAe,KAAK;AAAA,YAClB,UAAU;AAAA,YACV,aAAa;AAAA,YACb,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAGA,YAAI,KAAK,IAAI,eAAe,WAAW,KAAK,qBAAqB;AAC/D,2BAAiB,cAAc;AAC/B,gCAAsB,KAAK,IAAI,eAAe,WAAW;AACzD,yBAAe,SAAS;AACxB,yBAAe,KAAK,EAAE,UAAU,aAAa,aAAa,YAAY,MAAM,OAAO,CAAC;AAAA,QACtF;AAAA,MACF;AAGA,UAAI,KAAK,IAAI,iBAAiB,cAAc,KAAK,qBAAqB;AACpE,yBAAiB,iBAAiB;AAClC,8BAAsB,KAAK,IAAI,iBAAiB,cAAc;AAC9D,uBAAe,SAAS;AACxB,uBAAe,KAAK;AAAA,UAClB,UAAU;AAAA,UACV,aAAa;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAGA,UAAI,CAAC,iBAAiB;AAEpB,YAAI,KAAK,IAAI,aAAa,UAAU,KAAK,uBAAuB;AAC9D,6BAAmB,aAAa;AAChC,kCAAwB,KAAK,IAAI,aAAa,UAAU;AACxD,2BAAiB,SAAS;AAC1B,2BAAiB,KAAK;AAAA,YACpB,UAAU;AAAA,YACV,aAAa;AAAA,YACb,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAGA,YAAI,KAAK,IAAI,gBAAgB,aAAa,KAAK,uBAAuB;AACpE,6BAAmB,gBAAgB;AACnC,kCAAwB,KAAK,IAAI,gBAAgB,aAAa;AAC9D,2BAAiB,SAAS;AAC1B,2BAAiB,KAAK;AAAA,YACpB,UAAU;AAAA,YACV,aAAa;AAAA,YACb,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAGA,YAAI,KAAK,IAAI,aAAa,aAAa,KAAK,uBAAuB;AACjE,6BAAmB,gBAAgB;AACnC,kCAAwB,KAAK,IAAI,aAAa,aAAa;AAC3D,2BAAiB,SAAS;AAC1B,2BAAiB,KAAK;AAAA,YACpB,UAAU;AAAA,YACV,aAAa;AAAA,YACb,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAGA,YAAI,KAAK,IAAI,gBAAgB,UAAU,KAAK,uBAAuB;AACjE,6BAAmB,aAAa;AAChC,kCAAwB,KAAK,IAAI,gBAAgB,UAAU;AAC3D,2BAAiB,SAAS;AAC1B,2BAAiB,KAAK;AAAA,YACpB,UAAU;AAAA,YACV,aAAa;AAAA,YACb,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAGA,UAAI,KAAK,IAAI,iBAAiB,cAAc,KAAK,uBAAuB;AACtE,2BAAmB,iBAAiB;AACpC,gCAAwB,KAAK,IAAI,iBAAiB,cAAc;AAChE,yBAAiB,SAAS;AAC1B,yBAAiB,KAAK;AAAA,UACpB,UAAU;AAAA,UACV,aAAa;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,aAAW,IAAI;AACf,aAAW,IAAI;AAEf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF;AACF;;;ADlQI,mBACE,KA2CiB,YA5CnB;AA1GG,IAAM,sBAYR,CAAC;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,WAAW,MAAM,OAAY,IAAI;AAGvC,QAAM,YAAY,QAAQ,YAAY;AACtC,QAAM,WAAW,QAAQ,WAAW;AAGpC,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,CAAC,MAAsD;AACzE,QAAI,SAAU;AACd,MAAE,IAAI,WAAW,IAAI,SAAY,SAAS;AAAA,EAC5C;AAEA,QAAM,iBAAiB,CAAC,MAAsD;AAE5E,QAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,WAAW,EAAG;AAEvE,UAAM,OAAO,EAAE;AACf,UAAM,aAAa,oBAAoB,SAAS,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG,aAAa;AAAA,MAC/E,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd;AAAA,IACF,CAAC;AAGD,SAAK,EAAE,WAAW,CAAC;AACnB,SAAK,EAAE,WAAW,CAAC;AAGnB,iBAAa;AAAA,MACX,UAAU,WAAW;AAAA,MACrB,YAAY,WAAW;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,CAAC,MAAW;AAEhC,QAAI,mBAAmB;AACrB,wBAAkB;AAAA,IACpB;AAEA,gBAAY;AAAA,MACV,UAAU;AAAA,QACR,GAAG,EAAE,OAAO,EAAE;AAAA,QACd,GAAG,EAAE,OAAO,EAAE;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,MAAM;AAC5B,UAAM,OAAO,SAAS;AACtB,QAAI,CAAC,KAAM;AAEX,UAAM,SAAS,KAAK,OAAO;AAC3B,UAAM,SAAS,KAAK,OAAO;AAG3B,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK,MAAM,IAAI,MAAM;AACnD,UAAM,YAAY,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,MAAM;AAGrD,SAAK,OAAO,CAAC;AACb,SAAK,OAAO,CAAC;AAGb,SAAK,MAAM,QAAQ;AACnB,SAAK,OAAO,SAAS;AAAA,EACvB;AAGA,QAAM,oBAAoB,MAAM;AAC9B,UAAM,cAAwB,CAAC;AAC/B,QAAI,QAAQ,MAAM,UAAW,aAAY,KAAK,WAAW;AACzD,QAAI,QAAQ,MAAM,cAAe,aAAY,KAAK,cAAc;AAChE,QAAI,QAAQ,MAAM,SAAU,aAAY,KAAK,UAAU;AACvD,WAAO,YAAY,KAAK,GAAG,KAAK;AAAA,EAClC;AAEA,SACE,gCACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,IAAI,aAAa,QAAQ;AAAA,MACzB,GAAG,QAAQ,SAAS;AAAA,MACpB,GAAG,QAAQ,SAAS;AAAA,MACpB,OAAO,QAAQ,KAAK;AAAA,MACpB,QAAQ,QAAQ,KAAK;AAAA,MACrB,MAAM,QAAQ,MAAM;AAAA,MACpB,UAAU,QAAQ,MAAM;AAAA,MACxB,YAAY,QAAQ,MAAM,cAAc;AAAA,MACxC,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ,MAAM;AAAA,MACpB,OAAO,QAAQ,MAAM,SAAS;AAAA,MAC9B,WACE,GAAG,QAAQ,MAAM,OAAO,SAAS,EAAE,IAAI,QAAQ,MAAM,SAAS,WAAW,EAAE,GAAG,KAAK,KACnF;AAAA,MAEF,gBAAgB,kBAAkB;AAAA,MAClC,UAAU,QAAQ;AAAA,MAClB,WAAW,CAAC,YAAY;AAAA,MACxB,WAAW,CAAC;AAAA,MACZ,SAAS;AAAA,MACT,OAAO,WAAW,SAAY;AAAA,MAC9B,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,aAAa;AAAA,MACb,UAAU,QAAQ,MAAM,iBAAiB;AAAA,MACzC,eAAe,QAAQ,MAAM,iBAAiB;AAAA,MAC9C,QAAQ,QAAQ,MAAM,eAAe;AAAA,MACrC,aAAa,QAAQ,MAAM,eAAe;AAAA,MAC1C,eAAa;AAAA,MACb,wBAAsB;AAAA;AAAA,EACxB,GACF;AAEJ;AAKO,IAAM,sBAAyD;AAAA,EACpE,MAAM;AAAA,EACN,aAAa;AAAA,EACb,QAAQ,CAAC,YAAY,qBAAC,SAAI;AAAA;AAAA,IAAO,QAAQ,MAAM;AAAA,KAAQ;AAAA;AAAA,EACvD,iBAAiB;AAAA;AAAA,EACjB,MAAM,oBAAC,QAAK,WAAU,WAAU;AAAA,EAChC,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO;AAAA,IACP,eAAe;AAAA,IACf,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,UAAU;AAAA,IACV,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,QACP,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,QACjC,EAAE,OAAO,mBAAmB,OAAO,kBAAkB;AAAA,QACrD,EAAE,OAAO,eAAe,OAAO,cAAc;AAAA,QAC7C,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,QACrC,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,QACrC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,MACrC;AAAA,MACA,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,MACL,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,QACP,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,QAC/B,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,QACnC,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,MACnC;AAAA,MACA,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,QACP,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,QAC7B,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,QACnC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,MACrC;AAAA,MACA,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,cAAc;AAAA,IAChB;AAAA,EACF;AACF;;;AEzRA,OAAOC,YAAW;AAClB,SAAS,SAAS,YAAyB,MAAM,QAAAC,OAAM,aAAa;AAEpE,OAAO,cAAc;AACrB,SAAS,aAAa;AAwIlB,qBAAAC,WAEI,OAAAC,MAkBA,QAAAC,aApBJ;AAjIG,IAAM,uBAgBR,CAAC;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AAEJ,QAAM,WAAWC,OAAM,QAAQ,MAAM;AACnC,UAAM,MAAM,QAAQ,MAAM;AAG1B,QAAI,QAAQ,IAAI,WAAW,MAAM,KAAK,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,OAAO,IAAI;AACzF,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,WAAW;AACpB,YAAM,cAAc,UAAU,IAAI,GAAG;AACrC,UAAI,aAAa;AACf,eAAO;AAAA,MACT;AAAA,IACF;AAGA,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,MAAM,KAAK,SAAS,CAAC;AAEjC,QAAM,CAAC,KAAK,IAAI,SAAS,QAAQ;AACjC,QAAM,WAAWA,OAAM,OAAY,IAAI;AACvC,QAAM,iBAAiBA,OAAM,OAAY,IAAI;AAG7C,QAAM,YAAY,QAAQ,YAAY;AACtC,QAAM,WAAW,QAAQ,WAAW;AAEpC,EAAAA,OAAM,UAAU,MAAM;AACpB,QAAI,cAAc,eAAe,WAAW,SAAS,SAAS;AAC5D,qBAAe,QAAQ,MAAM,CAAC,SAAS,OAAO,CAAC;AAC/C,qBAAe,QAAQ,SAAS,EAAE,UAAU;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAIf,EAAAA,OAAM,UAAU,MAAM;AACpB,QAAI,SAAS,SAAS;AAEpB,YAAM,QAAQ,SAAS,QAAQ,SAAS;AACxC,UAAI,OAAO;AACT,cAAM,UAAU;AAAA,MAClB;AAGA,UAAI,cAAc;AAChB,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,YAAY,CAAC;AAGxB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,CAAC,MAAsD;AACzE,QAAI,SAAU;AACd,MAAE,IAAI,WAAW,IAAI,SAAY,SAAS;AAAA,EAC5C;AAEA,QAAM,iBAAiB,CAAC,MAAsD;AAC5E,QAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,IAAI,WAAW,EAAG;AAExD,UAAM,OAAO,EAAE;AACf,UAAM,aAAa,oBAAoB,SAAS,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG,aAAa;AAAA,MAC/E,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd;AAAA,IACF,CAAC;AAGD,SAAK,EAAE,WAAW,CAAC;AACnB,SAAK,EAAE,WAAW,CAAC;AAGnB,iBAAa;AAAA,MACX,UAAU,WAAW;AAAA,MACrB,YAAY,WAAW;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,CAAC,MAAW;AAEhC,QAAI,mBAAmB;AACrB,wBAAkB;AAAA,IACpB;AAEA,gBAAY;AAAA,MACV,UAAU;AAAA,QACR,GAAG,EAAE,OAAO,EAAE;AAAA,QACd,GAAG,EAAE,OAAO,EAAE;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SACE,gBAAAF,KAAAD,WAAA,EACG,kBACC,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,IAAI,aAAa,QAAQ;AAAA,MACzB,GAAG,QAAQ,SAAS;AAAA,MACpB,GAAG,QAAQ,SAAS;AAAA,MACpB,OAAO,QAAQ,KAAK;AAAA,MACpB,QAAQ,QAAQ,KAAK;AAAA,MACrB;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ;AAAA,MAClB,WAAW,CAAC,YAAY;AAAA,MACxB,WAAW,CAAC;AAAA,MACZ,SAAS;AAAA,MACT,OAAO,WAAW,SAAY;AAAA,MAC9B,YAAY;AAAA,MACZ,WAAW;AAAA;AAAA,EACb,IAEA,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,IAAI,aAAa,QAAQ;AAAA,MACzB,GAAG,QAAQ,SAAS;AAAA,MACpB,GAAG,QAAQ,SAAS;AAAA,MACpB,OAAO,QAAQ,KAAK;AAAA,MACpB,QAAQ,QAAQ,KAAK;AAAA,MACrB,UAAU,QAAQ;AAAA,MAClB,WAAW,CAAC,YAAY;AAAA,MACxB,WAAW,CAAC;AAAA,MACZ,SAAS,WAAW,SAAY;AAAA,MAChC,OAAO,WAAW,SAAY;AAAA,MAC9B,YAAY;AAAA,MACZ,WAAW;AAAA,MAGX;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,QAAQ,KAAK;AAAA,YACpB,QAAQ,QAAQ,KAAK;AAAA,YACrB,MAAK;AAAA,YACL,QAAO;AAAA,YACP,aAAa;AAAA,YACb,MAAM,CAAC,IAAI,CAAC;AAAA,YACZ,SAAS,QAAQ;AAAA;AAAA,QACnB;AAAA,QAEA,gBAAAA;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,OAAO,QAAQ,KAAK;AAAA,YACpB,QAAQ,QAAQ,KAAK;AAAA,YACrB,MAAK;AAAA,YACL,UAAU;AAAA,YACV,MAAK;AAAA,YACL,OAAM;AAAA,YACN,eAAc;AAAA;AAAA,QAChB;AAAA;AAAA;AAAA,EACF,GAEJ;AAEJ;AAKO,IAAM,uBAA2D;AAAA,EACtE,MAAM;AAAA,EACN,aAAa;AAAA,EACb,QAAQ,CAAC,YAAY,gBAAAF,MAAC,SAAI;AAAA;AAAA,IAAQ,QAAQ,MAAM;AAAA,KAAI;AAAA;AAAA,EACpD,iBAAiB;AAAA;AAAA,EACjB,MAAM,gBAAAD,KAAC,SAAM,WAAU,WAAU;AAAA,EACjC,cAAc;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS,CAAC,EAAE,OAAO,QAAQ,OAAO,OAAO,CAAC;AAAA,MAC1C,cAAc;AAAA,IAChB;AAAA,EACF;AACF;;;ACnOO,IAAM,kBAAkB,CAAC,qBAAqB,oBAAoB;;;APoJjE,gBAAAI,YAAA;AA7ID,IAAM,eAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB,CAAC;AAAA,EAClB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,QAAQ,CAAC;AACX,MAAM;AACJ,QAAM,eAAe,OAAuB,IAAI;AAChD,QAAM,WAAW,OAAY,IAAI;AAGjC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,eAAe,QAAQ,IAAI;AAG/B,QAAM,WAAW,mBAAmB;AAAA,IAClC,GAAG;AAAA,IACH,GAAI,MAAM,sBAAsB,CAAC;AAAA,IACjC,GAAG;AAAA,EACL,CAAC;AAGD,QAAM,cAAc,aAAa,MAAM,WAAW,SAAS,MAAM,kBAAkB,SAAS;AAC5F,QAAM,eACJ,cAAc,MAAM,WAAW,UAAU,MAAM,kBAAkB,UAAU;AAG7E,YAAU,MAAM;AACd,QAAI,aAAa,YAAY;AAC3B,oBAAc,WAAW,UAAU;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,WAAW,YAAY,aAAa,CAAC;AAGzC,YAAU,MAAM;AACd,QAAI,aAAa;AACf,UAAI,WAAW,WAAW;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,aAAa,GAAG,CAAC;AAGrB,YAAU,MAAM;AACd,QAAI,MAAM;AACR,oBAAc,IAAI;AAElB,UAAI,KAAK,oBAAoB;AAC3B,aAAK,mBAAmB,QAAQ,CAAC,OAAO,SAAS,SAAS,EAAE,CAAC;AAAA,MAC/D;AAEA,UAAI,KAAK,gBAAgB;AACvB,aAAK,eAAe,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,eAAe,UAAU,GAAG,CAAC;AAGvC,YAAU,MAAM;AACd,QAAI,UAAU;AACZ,YAAM,OAAO,IAAI,WAAW;AAC5B,eAAS,IAAI;AAAA,IACf;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,UAAU,GAAG,CAAC;AAGlC,YAAU,MAAM;AACd,QAAI,mBAAmB;AACrB,YAAM,WAAW,IAAI,mBAAmB;AACxC,wBAAkB,QAAQ;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,MAAM,mBAAmB,mBAAmB,GAAG,CAAC;AAGpD,YAAU,MAAM;AACd,UAAM,gBAAgB,CAAC,MAAqB;AAE1C,WAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,OAAO,CAAC,EAAE,UAAU;AAC5D,UAAE,eAAe;AACjB,aAAK;AAAA,MACP;AAEA,WACI,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,QACnD,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KACvC;AACA,UAAE,eAAe;AACjB,aAAK;AAAA,MACP;AAEA,WAAK,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,CAAC,UAAU;AAC9D,UAAE,eAAe;AACjB,cAAM,WAAW,IAAI,mBAAmB;AACxC,YAAI,UAAU;AACZ,cAAI,cAAc,SAAS,EAAE;AAAA,QAC/B;AAAA,MACF;AAEA,UAAI,EAAE,QAAQ,UAAU;AACtB,UAAE,eAAe;AACjB,YAAI,cAAc,IAAI;AAAA,MACxB;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,MAAM,MAAM,UAAU,GAAG,CAAC;AAG9B,QAAM,gBAAgBC;AAAA,IACpB,CAAC,YAA2B;AAC1B,YAAM,WAAW,SAAS,IAAI,QAAQ,IAAI;AAC1C,UAAI,CAAC,UAAU;AACb,gBAAQ,KAAK,uCAAuC,QAAQ,IAAI,EAAE;AAClE,eAAO;AAAA,MACT;AAGA,YAAM,oBAAoB,SAAS;AACnC,UAAI,CAAC,mBAAmB;AACtB,gBAAQ,KAAK,8CAA8C,QAAQ,IAAI,EAAE;AACzE,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,MAAM,sBAAsB,QAAQ;AAEvD,aACE,gBAAAD;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA;AAAA,UACA,UAAU,MAAM,CAAC,YAAY,IAAI,cAAc,QAAQ,EAAE;AAAA,UACzD,aAAa,CAAC,YAAY,CAAC,YAAY,IAAI,cAAc,QAAQ,IAAI,OAAO;AAAA;AAAA,QAJvE,QAAQ;AAAA,MAKf;AAAA,IAEJ;AAAA,IACA,CAAC,UAAU,MAAM,mBAAmB,UAAU,GAAG;AAAA,EACnD;AAGA,QAAM,mBAAmBC;AAAA,IACvB,CAAC,MAAW;AAEV,UAAI,EAAE,WAAW,EAAE,OAAO,SAAS,GAAG;AACpC,YAAI,cAAc,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAGA,QAAM,iBAAiB,CAAC,GAAG,MAAM,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAE7E,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,iBAAiB,SAAS;AAAA,MACrC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,QACf,UAAU;AAAA,QACV,iBAAiB,MAAM,mBAAmB;AAAA,QAC1C,GAAG;AAAA,MACL;AAAA,MAGA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,gBAAgB;AAAA,YAChB,YAAY;AAAA,YACZ,UAAU;AAAA,UACZ;AAAA,UAEA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,iBAAiB;AAAA,gBACjB,WAAW;AAAA,cACb;AAAA,cAEA,0BAAAA,KAAC,SAAO,yBAAe,IAAI,aAAa,GAAE;AAAA;AAAA,UAC5C;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AQ5NA,OAAOE,aAAW;;;ACPlB,YAAYC,YAAW;;;ACAvB,SAA0B,YAAY;AACtC,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;;;ADEM,gBAAAC,YAAA;AAHN,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,MAAM,GAAG,MAAM,GAAG,QAAQ;AACtC,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,MAAM,cAAc;;;AEjBpB,YAAYC,YAAW;AACvB,YAAY,oBAAoB;AAChC,SAAS,WAA8B;AAarC,gBAAAC,YAAA;AATF,IAAM,gBAAgB;AAAA,EACpB;AACF;AAEA,IAAM,QAAc,kBAIlB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAgB;AAAA,EAAf;AAAA,IACC;AAAA,IACA,WAAW,GAAG,cAAc,GAAG,SAAS;AAAA,IACvC,GAAG;AAAA;AACN,CACD;AACD,MAAM,cAA6B,oBAAK;;;ACvBxC,YAAYC,YAAW;AACvB,YAAY,qBAAqB;AAQ/B,SASI,OAAAC,MATJ,QAAAC,aAAA;AAJF,IAAM,SAAe,kBAGnB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,sBAAAD,KAAiB,uBAAhB,EAAsB,WAAU,sEAC/B,0BAAAA,KAAiB,uBAAhB,EAAsB,WAAU,8BAA6B,GAChE;AAAA,MACA,gBAAAA,KAAiB,uBAAhB,EAAsB,WAAU,kQAAiQ;AAAA;AAAA;AACpS,CACD;AACD,OAAO,cAA8B,qBAAK;;;ACvB1C,YAAYE,YAAW;AACvB,YAAY,wBAAwB;AAYhC,gBAAAC,YAAA;AARJ,IAAM,YAAkB;AAAA,EAItB,CACE,EAAE,WAAW,cAAc,cAAc,aAAa,MAAM,GAAG,MAAM,GACrE,QAEA,gBAAAA;AAAA,IAAoB;AAAA,IAAnB;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,gBAAgB,eAAe,mBAAmB;AAAA,QAClD;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,UAAU,cAAiC,wBAAK;;;ACxBhD,YAAYC,YAAW;AACvB,YAAY,qBAAqB;AACjC,SAAS,OAAO,aAAa,iBAAiB;AAc5C,SAUI,OAAAC,MAVJ,QAAAC,aAAA;AAVF,IAAM,SAAyB;AAI/B,IAAM,cAA8B;AAEpC,IAAM,gBAAsB,kBAG1B,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC,gBAAAC;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEH;AAAA;AAAA,MACD,gBAAAC,KAAiB,sBAAhB,EAAqB,SAAO,MAC3B,0BAAAA,KAAC,eAAY,WAAU,sBAAqB,GAC9C;AAAA;AAAA;AACF,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,uBAA6B,kBAGjC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,0BAAAA,KAAC,aAAU,WAAU,WAAU;AAAA;AACjC,CACD;AACD,qBAAqB,cAA8B,+BAAe;AAElE,IAAM,yBAA+B,kBAGnC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,0BAAAA,KAAC,eAAY,WAAU,WAAU;AAAA;AACnC,CACD;AACD,uBAAuB,cACL,iCAAiB;AAEnC,IAAM,gBAAsB,kBAG1B,CAAC,EAAE,WAAW,UAAU,WAAW,UAAU,GAAG,MAAM,GAAG,QACzD,gBAAAA,KAAiB,wBAAhB,EACC,0BAAAD;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA,aAAa,YACX;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,sBAAAC,KAAC,wBAAqB;AAAA,MACtB,gBAAAA;AAAA,QAAiB;AAAA,QAAhB;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,aAAa,YACX;AAAA,UACJ;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,MACA,gBAAAA,KAAC,0BAAuB;AAAA;AAAA;AAC1B,GACF,CACD;AACD,cAAc,cAA8B,wBAAQ;AAEpD,IAAM,cAAoB,kBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,0CAA0C,SAAS;AAAA,IAChE,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA8B,sBAAM;AAEhD,IAAM,aAAmB,kBAGvB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC,gBAAAD;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ;AAAA,sBAAAC,KAAC,UAAK,WAAU,gEACd,0BAAAA,KAAiB,+BAAhB,EACC,0BAAAA,KAAC,SAAM,WAAU,WAAU,GAC7B,GACF;AAAA,MAEA,gBAAAA,KAAiB,0BAAhB,EAA0B,UAAS;AAAA;AAAA;AACtC,CACD;AACD,WAAW,cAA8B,qBAAK;AAE9C,IAAM,kBAAwB,kBAG5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,4BAA4B,SAAS;AAAA,IAClD,GAAG;AAAA;AACN,CACD;AACD,gBAAgB,cAA8B,0BAAU;;;AClJxD,YAAYC,YAAW;AASnB,gBAAAC,YAAA;AALJ,IAAM,WAAiB,kBAGrB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAClC,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AACD,SAAS,cAAc;;;ACnBvB,YAAYC,aAAW;AACvB,YAAY,uBAAuB;AACnC,SAAS,SAAAC,cAAa;AAmBhB,gBAAAC,aAAA;AAfN,IAAM,WAAiB,mBAGrB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAmB;AAAA,EAAlB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,0BAAAA;AAAA,MAAmB;AAAA,MAAlB;AAAA,QACC,WAAW,GAAG,+CAA+C;AAAA,QAE7D,0BAAAA,MAACC,QAAA,EAAM,WAAU,WAAU;AAAA;AAAA,IAC7B;AAAA;AACF,CACD;AACD,SAAS,cAAgC,uBAAK;;;ARyDtC,SAqTI,YAAAC,WAnTA,OAAAC,OAFJ,QAAAC,aAAA;AA7BD,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AAEJ,QAAM,CAAC,eAAe,gBAAgB,IAAIC,QAAM,SAAiC,CAAC,CAAC;AAGnF,QAAM,iBAAiBA,QAAM,OAAuC,CAAC,CAAC;AAGtE,EAAAA,QAAM,UAAU,MAAM;AACpB,WAAO,MAAM;AACX,aAAO,OAAO,eAAe,OAAO,EAAE,QAAQ,CAAC,UAAU,aAAa,KAAK,CAAC;AAAA,IAC9E;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,MAAI,CAAC,mBAAmB,CAAC,iBAAiB;AAExC,QAAI,MAAM,sBAAsB;AAC9B,YAAM,uBAAuB,KAAK;AAClC,aACE,gBAAAD,MAAC,SAAI,WAAW,yBAAyB,SAAS,IAAI,OACpD;AAAA,wBAAAD,MAAC,SAAI,WAAU,qFACb,0BAAAA,MAAC,QAAG,WAAU,yBAAwB,uBAAS,GACjD;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACC,GAAI,KAAK,WAAW,CAAC;AAAA;AAAA,QACxB;AAAA,SACF;AAAA,IAEJ;AAGA,WACE,gBAAAC,MAAC,SAAI,WAAW,yBAAyB,SAAS,IAAI,OACpD;AAAA,sBAAAD,MAAC,SAAI,WAAU,wEACb,0BAAAA,MAAC,QAAG,WAAU,yBAAwB,uBAAS,GACjD;AAAA,MACA,gBAAAA,MAAC,OAAE,WAAU,qCAAoC,8EAEjD;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,SAAS,gBAAgB,mBAAmB,CAAC;AAGnD,QAAM,mBAAmB,CAAC,UAAkB,UAAe;AACzD,QAAI,cAAc,gBAAgB,IAAI;AAAA,MACpC,OAAO;AAAA,QACL,GAAG,gBAAgB;AAAA,QACnB,CAAC,QAAQ,GAAG;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,oBAAoB,CAAC,UAAkB,UAAkB;AAE7D,QAAI,eAAe,QAAQ,QAAQ,GAAG;AACpC,mBAAa,eAAe,QAAQ,QAAQ,CAAC;AAAA,IAC/C;AAGA,qBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,EAAE;AAG3D,mBAAe,QAAQ,QAAQ,IAAI,WAAW,MAAM;AAClD,uBAAiB,UAAU,KAAK;AAEhC,uBAAiB,CAAC,SAAS;AACzB,cAAM,WAAW,EAAE,GAAG,KAAK;AAC3B,eAAO,SAAS,QAAQ;AACxB,eAAO;AAAA,MACT,CAAC;AACD,aAAO,eAAe,QAAQ,QAAQ;AAAA,IACxC,GAAG,GAAG;AAAA,EACR;AAGA,QAAM,wBAAwB,CAAC,OAAe,UAAkB;AAE9D,UAAM,eAAe,KAAK,MAAM,QAAQ,GAAG,IAAI;AAE/C,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,UAAI,cAAc,gBAAgB,IAAI;AAAA,QACpC,UAAU;AAAA,UACR,GAAG,gBAAgB;AAAA,UACnB,CAAC,KAAK,GAAG;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH,WAAW,UAAU,WAAW,UAAU,UAAU;AAClD,UAAI,cAAc,gBAAgB,IAAI;AAAA,QACpC,MAAM;AAAA,UACJ,GAAG,gBAAgB;AAAA,UACnB,CAAC,KAAK,GAAG;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH,WAAW,UAAU,YAAY;AAG/B,YAAM,QAAQ,gBAAgB,KAAK;AACnC,YAAM,SAAS,gBAAgB,KAAK;AACpC,YAAM,YAAa,gBAAgB,WAAW,KAAK,KAAM;AAGzD,YAAM,gBAAgB,QAAQ;AAC9B,YAAM,gBAAgB,SAAS;AAC/B,YAAM,iBACJ,gBAAgB,SAAS,IACzB,gBAAgB,KAAK,IAAI,SAAS,IAClC,gBAAgB,KAAK,IAAI,SAAS;AACpC,YAAM,iBACJ,gBAAgB,SAAS,IACzB,gBAAgB,KAAK,IAAI,SAAS,IAClC,gBAAgB,KAAK,IAAI,SAAS;AAGpC,YAAM,YAAa,eAAe,KAAK,KAAM;AAC7C,YAAM,OACJ,kBACC,gBAAgB,KAAK,IAAI,SAAS,IAAI,gBAAgB,KAAK,IAAI,SAAS;AAC3E,YAAM,OACJ,kBACC,gBAAgB,KAAK,IAAI,SAAS,IAAI,gBAAgB,KAAK,IAAI,SAAS;AAE3E,UAAI,cAAc,gBAAgB,IAAI;AAAA,QACpC,UAAU;AAAA,UACR,GAAG,KAAK,MAAM,OAAO,GAAG,IAAI;AAAA,UAC5B,GAAG,KAAK,MAAM,OAAO,GAAG,IAAI;AAAA,QAC9B;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,WAAW,UAAU,WAAW;AAE9B,YAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,YAAY,CAAC;AAC1D,UAAI,cAAc,gBAAgB,IAAI;AAAA,QACpC,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,kBAAkB,CAAC,UAA0B;AAEjD,QAAI,cAAc,KAAK,MAAM,QAAW;AACtC,aAAO,cAAc,KAAK;AAAA,IAC5B;AAGA,QAAI;AACJ,QAAI,UAAU,IAAK,SAAQ,gBAAgB,SAAS;AAAA,aAC3C,UAAU,IAAK,SAAQ,gBAAgB,SAAS;AAAA,aAChD,UAAU,QAAS,SAAQ,gBAAgB,KAAK;AAAA,aAChD,UAAU,SAAU,SAAQ,gBAAgB,KAAK;AAAA,aACjD,UAAU,WAAY,SAAQ,gBAAgB;AAAA,aAC9C,UAAU,UAAW,SAAQ,gBAAgB;AAAA,QACjD,QAAO;AAEZ,WAAO,MAAM,QAAQ,CAAC;AAAA,EACxB;AAGA,QAAM,oBAAoB,CAAC,OAAe,UAAkB;AAC1D,qBAAiB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,EAAE;AAAA,EAC1D;AAGA,QAAM,kBAAkB,CAAC,UAAkB;AACzC,UAAM,QAAQ,cAAc,KAAK;AACjC,QAAI,UAAU,QAAW;AACvB,YAAM,WAAW,WAAW,KAAK;AACjC,UAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,8BAAsB,OAAO,QAAQ;AAAA,MACvC;AAEA,uBAAiB,CAAC,SAAS;AACzB,cAAM,WAAW,EAAE,GAAG,KAAK;AAC3B,eAAO,SAAS,KAAK;AACrB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAW,kCAAkC,SAAS,IAAI,OAE7D;AAAA,oBAAAD,MAAC,SAAI,WAAU,qFACb,0BAAAA,MAAC,QAAG,WAAU,yBAAwB,uBAAS,GACjD;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,OACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,8BACX,0BAAgB,eAAe,gBAAgB,MAClD;AAAA,MAEA,gBAAAC,MAAC,OAAE,WAAU,sCAAqC;AAAA;AAAA,QAAK,gBAAgB;AAAA,SAAG;AAAA,MAE1E,gBAAAD,MAAC,aAAU,WAAU,QAAO;AAAA,MAG5B,gBAAAC,MAAC,SAAI,WAAU,QACb;AAAA,wBAAAD,MAAC,SAAM,SAAQ,gBAAe,WAAU,WAAU,0BAElD;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,MAAK;AAAA,YACL,OAAO,gBAAgB,eAAe;AAAA,YACtC,UAAU,CAAC,MAAM;AACf,kBAAI,cAAc,gBAAgB,IAAI;AAAA,gBACpC,aAAa,EAAE,OAAO;AAAA,cACxB,CAAC;AAAA,YACH;AAAA,YACA,aAAa,gBAAgB,eAAe,gBAAgB;AAAA,YAC5D,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MAEA,gBAAAA,MAAC,aAAU,WAAU,QAAO;AAAA,MAG5B,gBAAAA,MAAC,QAAG,WAAU,4BAA2B,uBAAS;AAAA,MAElD,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,wBAAAA,MAAC,SAAI,WAAU,cACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,mCACb;AAAA,4BAAAD,MAAC,SAAM,SAAQ,cAAa,WAAU,WAAU,eAEhD;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO,gBAAgB,GAAG;AAAA,gBAC1B,UAAU,CAAC,MAAM,kBAAkB,KAAK,EAAE,OAAO,KAAK;AAAA,gBACtD,QAAQ,MAAM,gBAAgB,GAAG;AAAA,gBACjC,WAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,UACA,gBAAAC,MAAC,SAAI,WAAU,mCACb;AAAA,4BAAAD,MAAC,SAAM,SAAQ,cAAa,WAAU,WAAU,eAEhD;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO,gBAAgB,GAAG;AAAA,gBAC1B,UAAU,CAAC,MAAM,kBAAkB,KAAK,EAAE,OAAO,KAAK;AAAA,gBACtD,QAAQ,MAAM,gBAAgB,GAAG;AAAA,gBACjC,WAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,WACF;AAAA,QAEA,gBAAAC,MAAC,SAAI,WAAU,cACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,mCACb;AAAA,4BAAAD,MAAC,SAAM,SAAQ,SAAQ,WAAU,WAAU,mBAE3C;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO,gBAAgB,OAAO;AAAA,gBAC9B,UAAU,CAAC,MAAM,kBAAkB,SAAS,EAAE,OAAO,KAAK;AAAA,gBAC1D,QAAQ,MAAM,gBAAgB,OAAO;AAAA,gBACrC,WAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,UACA,gBAAAA,MAAC,SAAI,WAAU,kBACb,0BAAAC,MAAC,SAAI,WAAU,mCACb;AAAA,4BAAAD,MAAC,SAAM,SAAQ,UAAS,WAAU,WAAU,oBAE5C;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO,gBAAgB,QAAQ;AAAA,gBAC/B,UAAU,CAAC,MAAM,kBAAkB,UAAU,EAAE,OAAO,KAAK;AAAA,gBAC3D,QAAQ,MAAM,gBAAgB,QAAQ;AAAA,gBACtC,WAAU;AAAA;AAAA,YACZ;AAAA,aACF,GACF;AAAA,WACF;AAAA,QAEA,gBAAAC,MAAC,SAAI,WAAU,cACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,0CACb;AAAA,4BAAAD,MAAC,SAAM,SAAQ,YAAW,WAAU,WAAU,sBAE9C;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO,gBAAgB,UAAU;AAAA,gBACjC,UAAU,CAAC,MAAM,kBAAkB,YAAY,EAAE,OAAO,KAAK;AAAA,gBAC7D,QAAQ,MAAM,gBAAgB,UAAU;AAAA,gBACxC,WAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,UACA,gBAAAC,MAAC,SAAI,WAAU,0CACb;AAAA,4BAAAD,MAAC,SAAM,SAAQ,WAAU,WAAU,WAAU,qBAE7C;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAG;AAAA,gBACH,MAAK;AAAA,gBACL,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,OAAO,gBAAgB,SAAS;AAAA,gBAChC,UAAU,CAAC,MAAM,kBAAkB,WAAW,EAAE,OAAO,KAAK;AAAA,gBAC5D,QAAQ,MAAM,gBAAgB,SAAS;AAAA,gBACvC,WAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,WACF;AAAA,QAEA,gBAAAA,MAAC,aAAU,WAAU,QAAO;AAAA,QAG3B,OAAO,SAAS,KACf,gBAAAC,MAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,QAAG,WAAU,4BAA2B,wBAAU;AAAA,UACnD,gBAAAA,MAAC,SAAI,WAAU,aACZ,iBAAO;AAAA,YAAI,CAAC,UACX;AAAA,cACE;AAAA,cACA,gBAAgB;AAAA,cAChB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF,GACF;AAAA,WACF;AAAA,SAEJ;AAAA,OACF;AAAA,KACF;AAEJ;AAKO,SAAS,YACd,OACA,OACA,eACA,UACA,eACA,MACiB;AAEjB,QAAM,QAAQ,cAAc,MAAM,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK,MAAM;AAEtE,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK,UAAU;AAEb,UAAI,CAAC,MAAM,gBAAgB;AACzB,gBAAQ,MAAM,iBAAiB,MAAM,IAAI,iCAAiC;AAC1E,eAAO;AAAA,MACT;AAEA,YAAM,kBAAkB,MAAM;AAC9B,aACE,gBAAAA,MAAC,SACC,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,UAAU,CAAC,aAAa,SAAS,MAAM,MAAM,QAAQ;AAAA,UACrD;AAAA,UACA,cAAc;AAAA,UACd;AAAA;AAAA,MACF,KAPQ,MAAM,IAQhB;AAAA,IAEJ;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,cAAc,MAAM,SAAS,aAAa,MAAM,SAAS;AAC/D,aACE,gBAAAC,MAAC,SACC;AAAA,wBAAAD,MAAC,SAAM,SAAS,MAAM,MAAM,WAAU,WACnC,gBAAM,OACT;AAAA,QACC,cACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,MAAM;AAAA,YACV,OAAO,SAAS;AAAA,YAChB,UAAU,CAAC,MAAM,SAAS,MAAM,MAAM,EAAE,OAAO,KAAK;AAAA,YACpD,WAAU;AAAA,YACV,MAAM;AAAA;AAAA,QACR,IAEA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,MAAM;AAAA,YACV,OAAO,SAAS;AAAA,YAChB,UAAU,CAAC,MAAM,SAAS,MAAM,MAAM,EAAE,OAAO,KAAK;AAAA,YACpD,WAAU;AAAA;AAAA,QACZ;AAAA,QAED,MAAM,eACL,gBAAAA,MAAC,OAAE,WAAU,sCAAsC,gBAAM,aAAY;AAAA,WArB/D,MAAM,IAuBhB;AAAA,IAEJ;AAAA,IAEA,KAAK,UAAU;AACb,aACE,gBAAAC,MAAC,SACC;AAAA,wBAAAD,MAAC,SAAM,SAAS,MAAM,MAAM,WAAU,WACnC,gBAAM,OACT;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,MAAM;AAAA,YACV,MAAK;AAAA,YACL,OAAO,SAAS;AAAA,YAChB,UAAU,CAAC,MAAM,SAAS,MAAM,MAAM,WAAW,OAAO,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA,YACnF,KAAK,MAAM;AAAA,YACX,KAAK,MAAM;AAAA,YACX,MAAM,MAAM,QAAQ;AAAA,YACpB,WAAU;AAAA;AAAA,QACZ;AAAA,QACC,MAAM,eACL,gBAAAA,MAAC,OAAE,WAAU,sCAAsC,gBAAM,aAAY;AAAA,WAf/D,MAAM,IAiBhB;AAAA,IAEJ;AAAA,IAEA,KAAK,SAAS;AACZ,aACE,gBAAAC,MAAC,SACC;AAAA,wBAAAD,MAAC,SAAM,SAAS,MAAM,MAAM,WAAU,WACnC,gBAAM,OACT;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,MAAM;AAAA,YACV,MAAK;AAAA,YACL,OAAO,SAAS;AAAA,YAChB,UAAU,CAAC,MAAM,cAAc,MAAM,MAAM,EAAE,OAAO,KAAK;AAAA,YACzD,WAAU;AAAA;AAAA,QACZ;AAAA,QACC,MAAM,eACL,gBAAAA,MAAC,OAAE,WAAU,sCAAsC,gBAAM,aAAY;AAAA,WAZ/D,MAAM,IAchB;AAAA,IAEJ;AAAA,IAEA,KAAK,UAAU;AACb,aACE,gBAAAC,MAAC,SACC;AAAA,wBAAAD,MAAC,SAAM,SAAS,MAAM,MAAM,WAAU,WACnC,gBAAM,OACT;AAAA,QACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,SAAS,MAAM,gBAAgB;AAAA,YACtC,eAAe,CAAC,aAAa,SAAS,MAAM,MAAM,QAAQ;AAAA,YAE1D;AAAA,8BAAAD,MAAC,iBAAc,WAAU,YACvB,0BAAAA,MAAC,eAAY,aAAa,MAAM,OAAO,GACzC;AAAA,cACA,gBAAAA,MAAC,iBACE,gBAAM,SAAS,IAAI,CAAC,WACnB,gBAAAA,MAAC,cAA8B,OAAO,OAAO,OAAO,KAAK,GACtD,iBAAO,SADO,OAAO,KAExB,CACD,GACH;AAAA;AAAA;AAAA,QACF;AAAA,QACC,MAAM,eACL,gBAAAA,MAAC,OAAE,WAAU,sCAAsC,gBAAM,aAAY;AAAA,WApB/D,MAAM,IAsBhB;AAAA,IAEJ;AAAA,IAEA,KAAK,WAAW;AACd,aACE,gBAAAC,MAAC,SAAqB,WAAU,8BAC9B;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,MAAM;AAAA,YACV,SAAS,QAAQ,KAAK;AAAA,YACtB,iBAAiB,CAAC,YAAY,SAAS,MAAM,MAAM,OAAO;AAAA,YAC1D,WAAU;AAAA;AAAA,QACZ;AAAA,QACA,gBAAAC,MAAC,SACC;AAAA,0BAAAD,MAAC,SAAM,SAAS,MAAM,MAAM,WAAU,sCACnC,gBAAM,OACT;AAAA,UACC,MAAM,eACL,gBAAAA,MAAC,OAAE,WAAU,iCAAiC,gBAAM,aAAY;AAAA,WAEpE;AAAA,WAdQ,MAAM,IAehB;AAAA,IAEJ;AAAA,IAEA,KAAK,UAAU;AACb,aACE,gBAAAC,MAAC,SACC;AAAA,wBAAAA,MAAC,SAAI,WAAU,0CACb;AAAA,0BAAAD,MAAC,SAAM,WAAU,WAAW,gBAAM,OAAM;AAAA,UACxC,gBAAAA,MAAC,UAAK,WAAU,iCAAiC,iBAAM;AAAA,WACzD;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,CAAC,OAAO,SAAS,MAAM,gBAAgB,CAAC,CAAC;AAAA,YAChD,eAAe,CAAC,CAAC,QAAQ,MAAM,SAAS,MAAM,MAAM,QAAQ;AAAA,YAC5D,KAAK,MAAM,OAAO;AAAA,YAClB,KAAK,MAAM,OAAO;AAAA,YAClB,MAAM,MAAM,QAAQ;AAAA,YACpB,WAAU;AAAA;AAAA,QACZ;AAAA,QACC,MAAM,eACL,gBAAAA,MAAC,OAAE,WAAU,sCAAsC,gBAAM,aAAY;AAAA,WAd/D,MAAM,IAgBhB;AAAA,IAEJ;AAAA,IAEA,KAAK,SAAS;AACZ,aACE,gBAAAC,MAAC,SACC;AAAA,wBAAAD,MAAC,SAAM,SAAS,MAAM,MAAM,WAAU,WACnC,gBAAM,OACT;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,MAAM;AAAA,YACV,OAAO,SAAS;AAAA,YAChB,UAAU,CAAC,MAAM,SAAS,MAAM,MAAM,EAAE,OAAO,KAAK;AAAA,YACpD,WAAU;AAAA,YACV,aAAY;AAAA;AAAA,QACd;AAAA,QACC,MAAM,eACL,gBAAAA,MAAC,OAAE,WAAU,sCAAsC,gBAAM,aAAY;AAAA,WAZ/D,MAAM,IAchB;AAAA,IAEJ;AAAA,IAEA;AACE,aAAO;AAAA,EACX;AACF;;;ASjmBA,OAAOG,aAAW;;;ACNlB,SAAS,OAAAC,YAA8B;AA8BnC,gBAAAC,aAAA;AA1BJ,IAAM,gBAAgBC;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,WACE;AAAA,QACF,aACE;AAAA,QACF,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAMA,SAAS,MAAM,EAAE,WAAW,SAAS,GAAG,MAAM,GAAe;AAC3D,SACE,gBAAAD,MAAC,SAAI,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS,GAAI,GAAG,OAAO;AAE1E;;;ACjCA,YAAYE,aAAW;AACvB,YAAY,yBAAyB;AAQnC,SAKE,OAAAC,OALF,QAAAC,aAAA;AAJF,IAAM,aAAmB,mBAGvB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QACpC,gBAAAA;AAAA,EAAqB;AAAA,EAApB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,4BAA4B,SAAS;AAAA,IAClD,GAAG;AAAA,IAEJ;AAAA,sBAAAD,MAAqB,8BAApB,EAA6B,WAAU,mCACrC,UACH;AAAA,MACA,gBAAAA,MAAC,aAAU;AAAA,MACX,gBAAAA,MAAqB,4BAApB,EAA2B;AAAA;AAAA;AAC9B,CACD;AACD,WAAW,cAAkC,yBAAK;AAElD,IAAM,YAAkB,mBAGtB,CAAC,EAAE,WAAW,cAAc,YAAY,GAAG,MAAM,GAAG,QACpD,gBAAAA;AAAA,EAAqB;AAAA,EAApB;AAAA,IACC;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA,gBAAgB,cACd;AAAA,MACF,gBAAgB,gBACd;AAAA,MACF;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IAEJ,0BAAAA,MAAqB,qCAApB,EAAoC,WAAU,0CAAyC;AAAA;AAC1F,CACD;AACD,UAAU,cAAkC,wCAAoB;;;AC3ChE,YAAYE,aAAW;;;ACAvB,YAAYC,aAAW;AACvB,SAAS,YAAY;AACrB,SAAS,OAAAC,YAA8B;AA2CjC,gBAAAC,aAAA;AAvCN,IAAM,iBAAiBC;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,SACE;AAAA,QACF,WACE;AAAA,QACF,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAQA,IAAM,SAAe;AAAA,EACnB,CAAC,EAAE,WAAW,SAAS,MAAM,UAAU,OAAO,GAAG,MAAM,GAAG,QAAQ;AAChE,UAAM,OAAO,UAAU,OAAO;AAC9B,WACE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,QAC1D;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;;;ACnDrB,YAAYE,aAAW;AACvB,YAAY,sBAAsB;AAchC,gBAAAC,aAAA;AAVF,IAAM,kBAAmC;AAEzC,IAAM,UAA2B;AAEjC,IAAM,iBAAkC;AAExC,IAAM,iBAAuB,mBAG3B,CAAC,EAAE,WAAW,aAAa,GAAG,GAAG,MAAM,GAAG,QAC1C,gBAAAA;AAAA,EAAkB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,eAAe,cAA+B,yBAAQ;;;ACA9C,gBAAAC,OAIE,QAAAC,aAJF;AAbR,IAAM,iBAAgD,CAAC;AAAA,EACrD;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,eAAe;AAAA,EACf,eAAe;AAAA,EACf;AAAA,EACA,mBAAmB;AAAA,EACnB,UAAU;AACZ,MAAM;AACJ,SACE,gBAAAD,MAAC,mBAAgB,eAAe,cAC9B,0BAAAC,MAAC,WACC;AAAA,oBAAAD,MAAC,kBAAe,WAAW,kBAAkB,SAC1C,UACH;AAAA,IACA,gBAAAA,MAAC,kBAAe,MAAM,aAAa,OAAO,cACxC,0BAAAC,MAAC,SAAI,WAAU,2BACb;AAAA,sBAAAD,MAAC,UAAM,mBAAQ;AAAA,MACd,YACC,gBAAAA,MAAC,SAAI,WAAU,8FACZ,oBACH;AAAA,OAEJ,GACF;AAAA,KACF,GACF;AAEJ;AAEA,eAAe,cAAc;;;AHRrB,gBAAAE,aAAA;AAxBR,IAAM,gBAAsB;AAAA,EAC1B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,eAAe;AAAA,IACf,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,kBAAiB;AAAA,QAEjB,0BAAAA,MAAC,UAAO,KAAU,WAAuB,GAAG,OACzC,UACH;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;;;AHjC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,OACK;AA8BM,gBAAAC,OAkFP,QAAAC,aAlFO;AAHb,IAAM,iBAAiB,CAAC,SAAiB;AACvC,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,gBAAAD,MAACE,OAAA,EAAK,WAAU,WAAU;AAAA,IACnC,KAAK;AACH,aAAO,gBAAAF,MAAC,aAAU,WAAU,WAAU;AAAA,IACxC;AACE,aAAO,gBAAAA,MAAC,UAAO,WAAU,WAAU;AAAA,EACvC;AACF;AAKA,IAAM,wBAAwB,CAAC,SAAwB,aAAuC;AAE5F,MAAI,QAAQ,YAAa,QAAO,QAAQ;AAGxC,MAAI,UAAU,YAAa,QAAO,SAAS;AAG3C,MAAI,QAAQ,SAAS,UAAU,QAAQ,MAAM,SAAS;AACpD,UAAM,UAAU,QAAQ,MAAM,QAAQ,UAAU,GAAG,EAAE;AACrD,WAAO,GAAG,OAAO,GAAG,QAAQ,MAAM,QAAQ,SAAS,KAAK,QAAQ,EAAE;AAAA,EACpE;AAGA,SAAO,QAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,QAAQ,KAAK,MAAM,CAAC;AACpE;AAKO,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,IAAIG,QAAM,SAAiB,KAAK;AAGxD,QAAM,iBAAiB,MAAM,KAAK,iBAAiB,KAAK,CAAC;AAGzD,QAAM,iBAAiB,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAGvE,QAAM,mBAAmB,eAAe,OAAO,CAAC,OAAO;AACrD,QAAI,WAAW,MAAO,QAAO;AAC7B,WAAO,GAAG,SAAS;AAAA,EACrB,CAAC;AAGD,QAAM,eAAe,CAAC,SAAwB,MAAwB;AACpE,MAAE,gBAAgB;AAGlB,UAAM,eAAe,SAAS,UAAU,CAAC,OAAO,GAAG,OAAO,QAAQ,EAAE;AAGpE,QAAI,eAAe,SAAS,SAAS,GAAG;AACtC,UAAI,eAAe,QAAQ,IAAI,eAAe,CAAC;AAAA,IACjD;AAAA,EACF;AAGA,QAAM,iBAAiB,CAAC,SAAwB,MAAwB;AACtE,MAAE,gBAAgB;AAGlB,UAAM,eAAe,SAAS,UAAU,CAAC,OAAO,GAAG,OAAO,QAAQ,EAAE;AAGpE,QAAI,eAAe,GAAG;AACpB,UAAI,eAAe,QAAQ,IAAI,eAAe,CAAC;AAAA,IACjD;AAAA,EACF;AAEA,SACE,gBAAAF,MAAC,SAAI,WAAW,GAAG,kCAAkC,SAAS,GAAG,OAE/D;AAAA,oBAAAA,MAAC,SAAI,WAAU,wEACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,yBAAwB,oBAAM;AAAA,MAC5C,gBAAAA,MAAC,SAAM,SAAQ,WAAU,WAAU,WAChC,2BAAiB,QACpB;AAAA,OACF;AAAA,IAGA,gBAAAC,MAAC,SAAI,WAAU,wCACb;AAAA,sBAAAD,MAAC,UAAO,WAAU,QAAO;AAAA,MACzB,gBAAAC,MAAC,UAAO,OAAO,QAAQ,eAAe,CAAC,UAAe,UAAU,KAAK,GACnE;AAAA,wBAAAD,MAAC,iBAAc,IAAG,gBAAe,WAAU,OACzC,0BAAAA,MAAC,eAAY,GACf;AAAA,QACA,gBAAAC,MAAC,iBACC;AAAA,0BAAAD,MAAC,cAAW,OAAM,OAChB,0BAAAC,MAAC,SAAI,WAAU,2BACb;AAAA,4BAAAD,MAAC,UAAO,WAAU,WAAU;AAAA,YAAE;AAAA,aAEhC,GACF;AAAA,UACC,eAAe,IAAI,CAAC,SACnB,gBAAAA,MAAC,cAAsB,OAAO,MAC5B,0BAAAC,MAAC,SAAI,WAAU,2BACZ;AAAA,2BAAe,IAAI;AAAA,YACnB,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAAA,YAAE;AAAA,aAChD,KAJe,IAKjB,CACD;AAAA,WACH;AAAA,SACF;AAAA,OACF;AAAA,IAGA,gBAAAD,MAAC,cAAW,WAAU,UACpB,0BAAAA,MAAC,SAAI,WAAU,iBACZ,2BAAiB,WAAW,IAC3B,gBAAAA,MAAC,SAAI,WAAU,kDACZ,qBAAW,QAAQ,oBAAoB,MAAM,MAAM,aACtD,IAEA,iBAAiB,IAAI,CAAC,YAAY;AAChC,YAAM,WAAW,iBAAiB,IAAI,QAAQ,IAAI;AAClD,YAAM,aAAa,QAAQ,OAAO;AAClC,YAAM,YAAY,QAAQ,YAAY;AACtC,YAAM,WAAW,QAAQ,WAAW;AAEpC,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW;AAAA,YACT;AAAA,YACA,aACI,qDACA;AAAA,YACJ,YAAY;AAAA,YACZ,CAAC,aAAa;AAAA,UAChB;AAAA,UACA,SAAS,MAAM,CAAC,YAAY,IAAI,cAAc,QAAQ,EAAE;AAAA,UAGxD;AAAA,4BAAAD,MAAC,SAAI,WAAU,yBAAyB,yBAAe,QAAQ,IAAI,GAAE;AAAA,YAGrE,gBAAAC,MAAC,SAAI,WAAU,kBACb;AAAA,8BAAAD,MAAC,SAAI,WAAU,gCACZ,gCAAsB,SAAS,QAAQ,GAC1C;AAAA,cACA,gBAAAA,MAAC,SAAI,WAAU,6DACb,0BAAAC,MAAC,UAAK;AAAA;AAAA,gBAAG,QAAQ;AAAA,iBAAO,GAC1B;AAAA,eACF;AAAA,YAGA,gBAAAA,MAAC,SAAI,WAAU,kFAEb;AAAA,8BAAAA,MAAC,SAAI,WAAU,iBACZ;AAAA,wBAAQ,SAAS,SAAS,SAAS,KAClC,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,CAAC,MAAM,aAAa,SAAS,CAAC;AAAA,oBACvC,SAAQ;AAAA,oBACR,cAAc;AAAA,oBAEd,0BAAAA,MAACI,YAAA,EAAU,WAAU,WAAU;AAAA;AAAA,gBACjC;AAAA,gBAED,QAAQ,SAAS,KAChB,gBAAAJ;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,WAAU;AAAA,oBACV,SAAS,CAAC,MAAM,eAAe,SAAS,CAAC;AAAA,oBACzC,SAAQ;AAAA,oBACR,cAAc;AAAA,oBAEd,0BAAAA,MAACK,cAAA,EAAY,WAAU,WAAU;AAAA;AAAA,gBACnC;AAAA,iBAEJ;AAAA,cAGA,gBAAAL;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,CAAC,MAAM;AACd,sBAAE,gBAAgB;AAClB,wBAAI,cAAc,QAAQ,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC;AAAA,kBACvD;AAAA,kBACA,SAAS,YAAY,SAAS;AAAA,kBAC9B,cAAc;AAAA,kBAEb,sBAAY,gBAAAA,MAAC,OAAI,WAAU,WAAU,IAAK,gBAAAA,MAAC,UAAO,WAAU,WAAU;AAAA;AAAA,cACzE;AAAA,cAGA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,CAAC,MAAM;AACd,sBAAE,gBAAgB;AAClB,wBAAI,cAAc,QAAQ,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC;AAAA,kBACrD;AAAA,kBACA,SAAS,WAAW,WAAW;AAAA,kBAC/B,cAAc;AAAA,kBAEb,qBAAW,gBAAAA,MAAC,QAAK,WAAU,WAAU,IAAK,gBAAAA,MAAC,UAAO,WAAU,WAAU;AAAA;AAAA,cACzE;AAAA,cAGA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,CAAC,MAAM;AACd,sBAAE,gBAAgB;AAClB,wBAAI,cAAc,QAAQ,EAAE;AAAA,kBAC9B;AAAA,kBACA,SAAQ;AAAA,kBACR,cAAc;AAAA,kBAEd,0BAAAA,MAAC,UAAO,WAAU,WAAU;AAAA;AAAA,cAC9B;AAAA,eACF;AAAA;AAAA;AAAA,QAlGK,QAAQ;AAAA,MAmGf;AAAA,IAEJ,CAAC,GAEL,GACF;AAAA,IAGA,gBAAAA,MAAC,SAAI,WAAU,gBACb,0BAAAC,MAAC,SAAI,WAAU,mEACb;AAAA,sBAAAA,MAAC,UAAM;AAAA,iBAAS,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK,EAAE;AAAA,QAAO;AAAA,SAAQ;AAAA,MAClE,gBAAAD,MAAC,UAAK,oBAAC;AAAA,MACP,gBAAAC,MAAC,UAAM;AAAA,iBAAS,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE;AAAA,QAAO;AAAA,SAAO;AAAA,OACjE,GACF;AAAA,KACF;AAEJ;;;AOtSA,OAAOK,WAAS,eAAAC,cAAa,2BAA2B;;;ACExD,SAAS,MAAM,MAAM,UAAAC,SAAQ,UAAU,QAAQ,MAAM,WAAW,UAAU,SAAAC,QAAO,SAAS;;;ACT1F,YAAYC,aAAW;AACvB,YAAY,sBAAsB;AAgB9B,gBAAAC,aAAA;AAZJ,IAAM,SAAe,mBAGnB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B,gBAAAA;AAAA,EAAkB;AAAA,EAAjB;AAAA,IACC,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA,IACJ;AAAA,IAEA,0BAAAA;AAAA,MAAkB;AAAA,MAAjB;AAAA,QACC,WAAW;AAAA,UACT;AAAA,QACF;AAAA;AAAA,IACF;AAAA;AACF,CACD;AACD,OAAO,cAA+B,sBAAK;;;ACX3C,SAAS,YAAY;AA4CK,gBAAAC,OA0BR,QAAAC,aA1BQ;AA9B1B,IAAM,uBAA4D,CAAC;AAAA,EACjE;AAAA,EACA;AAAA,EACA,SAAS;AACX,MAAM;AAEJ,QAAM,aAAa,CAAC,aAA2E;AAC7F,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,SAAS,GAAG;AAAA,IACrB;AACA,WAAO,YAAY;AAAA,EACrB;AAEA,QAAM,aAAa,WAAW;AAE9B,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aACE,gBAAAD;AAAA,QAAC;AAAA;AAAA,UAEC,SAAS,aAAa,YAAY;AAAA,UAClC,MAAM,aAAa,OAAO;AAAA,UAC1B,SAAS,MAAM,OAAO,QAAQ,GAAG;AAAA,UACjC,UAAU,WAAW,OAAO,QAAQ;AAAA,UACpC,WAAW,aAAa,gBAAgB;AAAA,UACxC,SAAS,OAAO;AAAA,UAChB,UAAU,OAAO;AAAA,UACjB,cAAc;AAAA,UACd,aAAa,aAAa,UAAU;AAAA,UAEnC,iBAAO,QAAQ,gBAAAA,MAAC,QAAK,WAAU,WAAU;AAAA;AAAA,QAXrC,OAAO;AAAA,MAYd;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,aAAa,6BAA6B;AAAA,UAEpD;AAAA,yBACC,gBAAAD,MAAC,SAAM,WAAU,WAAW,iBAAO,OAAM,IAEzC,OAAO,QAAQ,gBAAAA,MAAC,UAAK,WAAU,yBAAyB,iBAAO,MAAK;AAAA,YAEtE,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,OAAO;AAAA,gBACd,eAAe,CAAC,UAAU,OAAO,SAAS,OAAO,GAAG;AAAA,gBACpD,UAAU,WAAW,OAAO,QAAQ;AAAA,gBAEpC;AAAA,kCAAAD,MAAC,iBAAc,WAAW,aAAa,eAAe,4BACpD,0BAAAA,MAAC,eAAY,aAAa,OAAO,eAAe,OAAO,OAAO,GAChE;AAAA,kBACA,gBAAAA,MAAC,iBACE,iBAAO,QAAQ,IAAI,CAAC,WACnB,gBAAAA,MAAC,cAA8B,OAAO,OAAO,OAC3C,0BAAAC,MAAC,SAAI,WAAU,2BACZ;AAAA,2BAAO,QAAQ,gBAAAD,MAAC,UAAM,iBAAO,MAAK;AAAA,oBACnC,gBAAAA,MAAC,UAAM,iBAAO,OAAM;AAAA,qBACtB,KAJe,OAAO,KAKxB,CACD,GACH;AAAA;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,QA1BK,OAAO;AAAA,MA2Bd;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,aAAa,6BAA6B;AAAA,UAErD;AAAA,4BAAAA,MAAC,SAAM,WAAU,6BAA6B;AAAA,qBAAO;AAAA,cAAO,aAAa,KAAK;AAAA,eAAI;AAAA,YAClF,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,OAAO,aAAa;AAAA,gBAC1B,OAAO,OAAO;AAAA,gBACd,UAAU,CAAC,MAAM,OAAO,SAAS,EAAE,OAAO,OAAO,GAAG;AAAA,gBACpD,aAAa,OAAO;AAAA,gBACpB,UAAU,WAAW,OAAO,QAAQ;AAAA,gBACpC,WAAW,aAAa,eAAe;AAAA,gBACvC,KAAK,OAAO;AAAA,gBACZ,KAAK,OAAO;AAAA,gBACZ,MAAM,OAAO;AAAA;AAAA,YACf;AAAA;AAAA;AAAA,QAdK,OAAO;AAAA,MAed;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,aAAa,6BAA6B;AAAA,UAErD;AAAA,4BAAAA,MAAC,SAAM,WAAU,6BAA6B;AAAA,qBAAO;AAAA,cAAO,aAAa,KAAK;AAAA,eAAI;AAAA,YAClF,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO,OAAO;AAAA,gBACd,UAAU,CAAC,MAAM,OAAO,SAAS,EAAE,OAAO,OAAO,GAAG;AAAA,gBACpD,UAAU,WAAW,OAAO,QAAQ;AAAA,gBACpC,WAAW,aAAa,kCAAkC;AAAA;AAAA,YAC5D;AAAA;AAAA;AAAA,QAVK,OAAO;AAAA,MAWd;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,aAAa,iDAAiD;AAAA,UAExE;AAAA,mBAAO,QAAQ,gBAAAD,MAAC,UAAK,WAAU,yBAAyB,iBAAO,MAAK;AAAA,YACrE,gBAAAA,MAAC,SAAM,WAAU,6BAA6B,iBAAO,OAAM;AAAA,YAC3D,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,OAAO;AAAA,gBAChB,iBAAiB,CAAC,YAAY,OAAO,SAAS,SAAS,GAAG;AAAA,gBAC1D,UAAU,WAAW,OAAO,QAAQ;AAAA;AAAA,YACtC;AAAA;AAAA;AAAA,QATK,OAAO;AAAA,MAUd;AAAA,IAGJ,KAAK;AACH,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,aAAa,aAAa,eAAe;AAAA,UACzC,WAAW,aAAa,SAAY;AAAA;AAAA,QAF/B,OAAO;AAAA,MAGd;AAAA,IAGJ;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAO,+BAAQ;;;AF8BL,SA6FA,YAAAE,WA7FA,OAAAC,OACA,QAAAC,cADA;AAzGH,IAAM,SAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,kBAAkB,IAAI,mBAAmB;AAG/C,QAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,IACb,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,eAAe,CAAC;AAAA,IAChB,aAAa,CAAC;AAAA,IACd,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,gBAAgB,CAAC;AAAA;AAAA,EACnB,IAAI,UAAU,CAAC;AAGf,QAAM,0BACJ,kBAAkB,qBACd;AAAA,IACE;AAAA,MACE,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO;AAAA,MACP,UAAU,CAAC,UAAmB;AAC5B,2BAAmB,KAAK;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,IACA,CAAC;AAGP,QAAM,aAAa,CAAC,GAAG,YAAY,GAAG,yBAAyB,GAAG,aAAa;AAG/E,QAAM,eAAe,MAAM;AACzB,QAAI,iBAAiB;AACnB,UAAI,cAAc,gBAAgB,EAAE;AAAA,IACtC;AAAA,EACF;AAGA,QAAM,aAAa,MAAM;AACvB,UAAM,SAAS,IAAI,YAAY;AAC/B,QAAI,UAAU,cAAc;AAC1B,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF;AAGA,QAAM,cAAc,MAAM;AACxB,QAAI,cAAc,SAAS;AACzB,UAAI,aAAa,aAAa,OAAO;AAAA,IACvC;AAAA,EACF;AAGA,QAAM,kBAAkB,MAAM;AAC5B,QAAI,iBAAiB;AAAA,EACvB;AAGA,QAAM,aAAa,CAAC,aAA2E;AAC7F,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,SAAS,GAAG;AAAA,IACrB;AACA,WAAO,YAAY;AAAA,EACrB;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,8DAA8D,SAAS;AAAA,MAClF;AAAA,MAGC;AAAA,0BACC,gBAAAA,OAAC,SAAI,WAAU,2BACb;AAAA,0BAAAD,MAAC,UAAK,WAAU,WAAU,qBAAO;AAAA,UACjC,gBAAAC,OAAC,SAAI,WAAU,2BACb;AAAA,4BAAAD,MAAC,UAAK,WAAU,mDAAkD,gBAAE;AAAA,YACpE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,aAAY;AAAA,gBACZ,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO,WAAW;AAAA,gBAClB,UAAU,CAAC,MACT,cAAc,OAAO,OAAO,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,WAAW,MAAM;AAAA;AAAA,YAE9E;AAAA,aACF;AAAA,UACA,gBAAAC,OAAC,SAAI,WAAU,2BACb;AAAA,4BAAAD,MAAC,UAAK,WAAU,mDAAkD,gBAAE;AAAA,YACpE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,aAAY;AAAA,gBACZ,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO,WAAW;AAAA,gBAClB,UAAU,CAAC,MACT,cAAc,WAAW,OAAO,OAAO,OAAO,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA;AAAA,YAE7E;AAAA,aACF;AAAA,UACC,sBAAsB,mBACrB,gBAAAC,OAAC,SAAI,WAAU,2BACb;AAAA,4BAAAD,MAAC,UAAK,WAAU,mDAAkD,iBAAG;AAAA,YACrE,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,aAAY;AAAA,gBACZ,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA;AAAA,YACpD;AAAA,aACF;AAAA,UAED,sBAAsB,aAAa,UAAU,OAAO,KACnD,gBAAAC,OAAC,SAAI,WAAU,2BACb;AAAA,4BAAAD,MAAC,UAAK,WAAU,mDAAkD,sBAAQ;AAAA,YACzE,kBACC,gBAAAC,OAAC,SAAI,WAAU,2BACb;AAAA,8BAAAA,OAAC,UAAO,OAAO,iBAAiB,eAAe,oBAC7C;AAAA,gCAAAD,MAAC,iBAAc,WAAU,YACvB,0BAAAA,MAAC,eAAY,aAAY,QAAO,GAClC;AAAA,gBACA,gBAAAA,MAAC,iBACE,gBAAM,KAAK,UAAU,KAAK,CAAC,EAAE,IAAI,CAAC,cACjC,gBAAAA,MAAC,cAA2B,OAAO,WAChC,uBADc,SAEjB,CACD,GACH;AAAA,iBACF;AAAA,cACA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MAAM,mBAAmB,EAAE;AAAA,kBAEpC,0BAAAA,MAAC,KAAE,WAAU,WAAU;AAAA;AAAA,cACzB;AAAA,eACF,IAEA,gBAAAC,OAAC,UAAO,OAAM,IAAG,eAAe,oBAC9B;AAAA,8BAAAD,MAAC,iBAAc,WAAU,YACvB,0BAAAA,MAAC,eAAY,aAAY,QACvB,0BAAAC,OAAC,SAAI,WAAU,2BACb;AAAA,gCAAAD,MAACE,QAAA,EAAM,WAAU,WAAU;AAAA,gBAC3B,gBAAAF,MAAC,UAAK,kBAAI;AAAA,iBACZ,GACF,GACF;AAAA,cACA,gBAAAA,MAAC,iBACE,gBAAM,KAAK,UAAU,KAAK,CAAC,EAAE,IAAI,CAAC,cACjC,gBAAAA,MAAC,cAA2B,OAAO,WAChC,uBADc,SAEjB,CACD,GACH;AAAA,eACF;AAAA,aAEJ;AAAA,WAEJ;AAAA,QAIF,gBAAAC,OAAC,SAAI,WAAU,qBAEZ;AAAA,uBAAa,SAAS,KACrB,gBAAAA,OAAAF,WAAA,EACE;AAAA,4BAAAC,MAAC,SAAI,WAAW,2BAA2B,qBAAqB,IAC7D,uBAAa,IAAI,CAAC,WACjB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBAEC;AAAA,gBACA;AAAA,gBACA,QAAO;AAAA;AAAA,cAHF,OAAO;AAAA,YAId,CACD,GACH;AAAA,aAEE,YACA,YACA,cACC,cAAc,YACd,cAAc,YACf,WAAW,SAAS,MAAM,gBAAAA,MAAC,aAAU,aAAY,YAAW,WAAU,OAAM;AAAA,aAChF;AAAA,WAIA,YAAY,aACZ,gBAAAC,OAAAF,WAAA,EACE;AAAA,4BAAAE,OAAC,SAAI,WAAU,2BACZ;AAAA,0BACC,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU,CAAC;AAAA,kBACX,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,UAAS;AAAA,kBACT,cAAc;AAAA,kBAEd,0BAAAA,MAAC,QAAK,WAAU,WAAU;AAAA;AAAA,cAC5B;AAAA,cAGD,YACC,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU,CAAC;AAAA,kBACX,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,UAAS;AAAA,kBACT,cAAc;AAAA,kBAEd,0BAAAA,MAAC,QAAK,WAAU,WAAU;AAAA;AAAA,cAC5B;AAAA,eAEJ;AAAA,aAEE,YACA,aACA,iBACA,cACC,cAAc,YACd,cAAc,YACf,WAAW,SAAS,MAAM,gBAAAA,MAAC,aAAU,aAAY,YAAW,WAAU,OAAM;AAAA,aAChF;AAAA,WAIA,YAAY,aAAa,iBAAiB,eAC1C,gBAAAC,OAAAF,WAAA,EACE;AAAA,4BAAAE,OAAC,SAAI,WAAU,2BACZ;AAAA,0BACC,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU,CAAC;AAAA,kBACX,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,UAAS;AAAA,kBACT,cAAc;AAAA,kBAEd,0BAAAA,MAAC,QAAK,WAAU,WAAU;AAAA;AAAA,cAC5B;AAAA,cAGD,aACC,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU,CAAC,cAAc;AAAA,kBACzB,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,UAAS;AAAA,kBACT,cAAc;AAAA,kBAEd,0BAAAA,MAAC,aAAU,WAAU,WAAU;AAAA;AAAA,cACjC;AAAA,cAGD,iBACC,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU,CAAC;AAAA,kBACX,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,UAAS;AAAA,kBACT,cAAc;AAAA,kBAEd,0BAAAA,MAAC,YAAS,WAAU,WAAU;AAAA;AAAA,cAChC;AAAA,cAGD,cACC,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU,CAAC;AAAA,kBACX,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,UAAS;AAAA,kBACT,cAAc;AAAA,kBAEd,0BAAAA,MAACG,SAAA,EAAO,WAAU,WAAU;AAAA;AAAA,cAC9B;AAAA,eAEJ;AAAA,aAEG,cAAc,YAAc,cAAc,YAAa,WAAW,SAAS,MAC5E,gBAAAH,MAAC,aAAU,aAAY,YAAW,WAAU,OAAM;AAAA,aAEtD;AAAA,WAIC,cAAc,YAAc,cAAc,aAC3C,gBAAAC,OAAAF,WAAA,EACE;AAAA,4BAAAE,OAAC,SAAI,WAAU,2BACZ;AAAA,4BAAc,YACb,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,cAAc;AAAA,kBAEd,0BAAAA,MAAC,YAAS,WAAU,WAAU;AAAA;AAAA,cAChC;AAAA,cAGD,cAAc,YACb,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,WAAU;AAAA,kBACV,SAAQ;AAAA,kBACR,cAAc;AAAA,kBAEd,0BAAAA,MAAC,UAAO,WAAU,WAAU;AAAA;AAAA,cAC9B;AAAA,eAEJ;AAAA,YAEC,WAAW,SAAS,KAAK,gBAAAA,MAAC,aAAU,aAAY,YAAW,WAAU,OAAM;AAAA,aAC9E;AAAA,UAID,WAAW,SAAS,KACnB,gBAAAA,MAAC,SAAI,WAAW,2BAA2B,mBAAmB,IAC3D,qBAAW,IAAI,CAAC,WACf,gBAAAA,MAAC,gCAAqC,QAAgB,KAAU,QAAO,gBAA5C,OAAO,EAAkD,CACrF,GACH;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;;;AG7cA,OAAOI,WAAS,eAAAC,cAAa,UAAAC,SAAQ,gBAAgB;AACrD,SAAS,SAAAC,QAAO,SAAAC,QAAO,QAAAC,OAAM,SAASC,mBAAkB;;;ACDxD,SAAS,YAAY;AAqBjB,qBAAAC,WAGI,OAAAC,OAHJ,QAAAC,cAAA;AANG,IAAM,aAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SACE,gBAAAA,OAAAF,WAAA,EAEG;AAAA,mBAAe,IAAI,CAAC,OAAO,UAC1B,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,QAAQ,CAAC,MAAM,UAAU,GAAG,MAAM,UAAU,WAAW,MAAM;AAAA,QAC7D,QAAQ,MAAM,SAAS,WAAW,YAAY;AAAA,QAC9C,aAAa;AAAA,QACb,MAAM,MAAM,SAAS,WAAW,CAAC,GAAG,CAAC,IAAI;AAAA,QACzC,WAAW;AAAA;AAAA,MALN,KAAK,KAAK;AAAA,IAMjB,CACD;AAAA,IAGA,iBAAiB,IAAI,CAAC,OAAO,UAC5B,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,QAAQ,CAAC,GAAG,MAAM,UAAU,WAAW,OAAO,MAAM,QAAQ;AAAA,QAC5D,QAAQ,MAAM,SAAS,WAAW,YAAY;AAAA,QAC9C,aAAa;AAAA,QACb,MAAM,MAAM,SAAS,WAAW,CAAC,GAAG,CAAC,IAAI;AAAA,QACzC,WAAW;AAAA;AAAA,MALN,KAAK,KAAK;AAAA,IAMjB,CACD;AAAA,KACH;AAEJ;;;AC/CA,SAAgB,aAAAE,YAAW,UAAAC,eAAc;AACzC,SAAS,eAAAC,oBAAmB;AA+JxB,gBAAAC,aAAA;AAtHG,IAAM,yBAAgE,CAAC;AAAA,EAC5E;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB;AAAA,EACA;AACF,MAAM;AACJ,QAAM,iBAAiBF,QAA0B,IAAI;AAErD,EAAAD,WAAU,MAAM;AACd,UAAM,cAAc,eAAe;AACnC,UAAM,QAAQ,SAAS;AAEvB,QAAI,CAAC,eAAe,CAAC,SAAS,CAAC,qBAAqB,UAAU;AAE5D,UAAI,aAAa;AACf,oBAAY,MAAM,CAAC,CAAC;AACpB,oBAAY,SAAS,GAAG,UAAU;AAAA,MACpC;AACA;AAAA,IACF;AAIA,UAAM,eAAe,CAAC,OAAkC;AACtD,YAAM,QAAQ,MAAM,UAAU,EAAE,CAAC;AACjC,UAAI,CAAC,MAAO,QAAO;AAGnB,YAAM,iBAAiB,CAAC,SAAwC;AAG9D,YAAI,KAAK,MAAM,OAAO,MAAM,KAAK,GAAG,MAAM,IAAI;AAC5C,iBAAO;AAAA,QACT;AAGA,cAAM,WAAY,KAAa,cAAc;AAC7C,YAAI,UAAU;AACZ,qBAAW,SAAS,UAAU;AAC5B,kBAAM,QAAQ,eAAe,KAAK;AAClC,gBAAI,MAAO,QAAO;AAAA,UACpB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAEA,aAAO,eAAe,KAAK;AAAA,IAC7B;AAEA,UAAM,eAAe,aAAa,iBAAiB;AAEnD,QAAI,gBAAgB,aAAa,UAAU,GAAG;AAE5C,kBAAY,MAAM,CAAC,YAAY,CAAC;AAChC,kBAAY,SAAS,GAAG,UAAU;AAAA,IACpC,OAAO;AACL,kBAAY,MAAM,CAAC,CAAC;AACpB,kBAAY,SAAS,GAAG,UAAU;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,mBAAmB,UAAU,UAAU,aAAa,CAAC;AAEzD,QAAM,kBAAkB,CAAC,MAA+B;AACtD,QAAI,CAAC,eAAe,CAAC,kBAAmB;AAExC,UAAM,OAAO,EAAE;AACf,UAAM,SAAS,KAAK,OAAO;AAC3B,UAAM,SAAS,KAAK,OAAO;AAE3B,UAAM,UAAU;AAAA,MACd,UAAU;AAAA,QACR,GAAG,KAAK,EAAE;AAAA,QACV,GAAG,KAAK,EAAE;AAAA,MACZ;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,MAAM;AAAA,QACxC,QAAQ,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,MAAM;AAAA,MAC5C;AAAA,MACA,UAAU,KAAK,SAAS;AAAA,IAC1B;AAEA,gBAAY,mBAAmB,OAAO;AAAA,EACxC;AAEA,QAAM,qBAAqB,CAAC,MAA+B;AACzD,QAAI,CAAC,kBAAkB,CAAC,kBAAmB;AAE3C,UAAM,OAAO,EAAE;AACf,UAAM,SAAS,KAAK,OAAO;AAC3B,UAAM,SAAS,KAAK,OAAO;AAG3B,SAAK,OAAO,CAAC;AACb,SAAK,OAAO,CAAC;AAEb,UAAM,UAAU;AAAA,MACd,UAAU;AAAA,QACR,GAAG,KAAK,EAAE;AAAA,QACV,GAAG,KAAK,EAAE;AAAA,MACZ;AAAA,MACA,MAAM;AAAA,QACJ,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,MAAM;AAAA,QACxC,QAAQ,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,MAAM;AAAA,MAC5C;AAAA,MACA,UAAU,KAAK,SAAS;AAAA,IAC1B;AAEA,mBAAe,mBAAmB,OAAO;AAAA,EAC3C;AAGA,MAAI,YAAY,CAAC,mBAAmB;AAClC,WAAO;AAAA,EACT;AAEA,SACE,gBAAAG;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,eAAe;AAAA,MACf,eAAe,CAAC,GAAG,IAAI,KAAK,GAAG;AAAA,MAC/B,WAAW;AAAA,MACX,oBAAoB;AAAA,MACpB,aAAa;AAAA,MACb,gBAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,cAAc,CAAC,QAAQ,WAAW;AAEhC,YAAI,OAAO,QAAQ,MAAM,OAAO,SAAS,IAAI;AAC3C,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA,MACA,aAAa;AAAA,MACb,gBAAgB;AAAA;AAAA,EAClB;AAEJ;;;AFwHa,gBAAAE,OA+BH,QAAAC,cA/BG;AA7PN,IAAM,SAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,WAAWC,QAAY,IAAI;AACjC,QAAM,eAAeA,QAAuB,IAAI;AAEhD,QAAM,CAAC,YAAY,aAAa,IAAI,SAGjC,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;AAGnC,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,CAAC;AAC9C,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACjE,QAAM,YAAYA,QAAO,KAAK;AAG9B,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC;AAG9E,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAkC,IAAI;AAGpF,QAAM,CAAC,0BAA0B,2BAA2B,IAAI,SAAS,CAAC;AAG1E,EAAAC,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,oBAAoB;AACvB,yBAAmB,IAAI;AACvB;AAAA,IACF;AAEA,UAAM,MAAM,IAAI,OAAO,MAAM;AAC7B,QAAI,cAAc;AAClB,QAAI,SAAS,MAAM;AACjB,yBAAmB,GAAG;AAAA,IACxB;AACA,QAAI,UAAU,CAAC,QAAQ;AACrB,cAAQ,MAAM,2CAA2C,GAAG;AAC5D,yBAAmB,IAAI;AAAA,IACzB;AACA,QAAI,MAAM;AAEV,WAAO,MAAM;AACX,UAAI,SAAS;AACb,UAAI,UAAU;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,kBAAkB,CAAC;AAGvB,EAAAA,QAAM,UAAU,MAAM;AACpB,UAAM,aAAa,MAAM;AACvB,UAAI,aAAa,SAAS;AACxB,cAAM,OAAO,aAAa,QAAQ,sBAAsB;AACxD,yBAAiB;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,QAAQ,KAAK;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAEA,eAAW;AAGX,UAAM,iBAAiB,IAAI,eAAe,UAAU;AACpD,QAAI,aAAa,SAAS;AACxB,qBAAe,QAAQ,aAAa,OAAO;AAAA,IAC7C;AAEA,WAAO,MAAM;AACX,qBAAe,WAAW;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,YAAYA,QAAM,QAAQ,MAAM;AAEpC,UAAM,QAAQ,KAAK,IAAI,cAAc,OAAO,WAAW,KAAK;AAC5D,UAAM,SAAS,KAAK,IAAI,cAAc,QAAQ,WAAW,MAAM;AAE/D,WAAO,EAAE,OAAO,OAAO;AAAA,EACzB,GAAG,CAAC,eAAe,UAAU,CAAC;AAG9B,QAAM,cAAcA,QAAM,QAAQ,MAAM;AACtC,WAAO;AAAA,MACL,GAAG,KAAK,IAAI,IAAI,UAAU,QAAQ,WAAW,SAAS,CAAC;AAAA,MACvD,GAAG,KAAK,IAAI,IAAI,UAAU,SAAS,WAAW,UAAU,CAAC;AAAA,IAC3D;AAAA,EACF,GAAG,CAAC,WAAW,UAAU,CAAC;AAG1B,QAAM,mBAAmBC;AAAA,IACvB,CAAC,MAAW;AAEV,UAAI,EAAE,WAAW,EAAE,OAAO,SAAS,GAAG;AACpC,wBAAgB,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,oBAAoBA,aAAY,MAAM;AAC1C,kBAAc,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;AAAA,EAChD,GAAG,CAAC,CAAC;AAGL,QAAM,sBAAsBA,aAAY,MAAM;AAC5C,gCAA4B,CAAC,SAAS,OAAO,CAAC;AAAA,EAChD,GAAG,CAAC,CAAC;AAGL,QAAM,cAAcA;AAAA,IAClB,CAAC,MAAW;AACV,UAAI,CAAC,cAAe;AAEpB,QAAE,IAAI,eAAe;AAErB,YAAM,QAAQ,SAAS;AACvB,UAAI,CAAC,MAAO;AAEZ,YAAM,WAAW,MAAM,OAAO;AAC9B,YAAM,UAAU,MAAM,mBAAmB;AAGzC,YAAM,eAAe;AAAA,QACnB,IAAI,QAAQ,IAAI,MAAM,EAAE,KAAK;AAAA,QAC7B,IAAI,QAAQ,IAAI,MAAM,EAAE,KAAK;AAAA,MAC/B;AAGA,YAAM,UAAU;AAChB,YAAM,YAAY,EAAE,IAAI,SAAS,IAAI,KAAK;AAG1C,UAAI,WAAW,YAAY,IAAI,WAAW,UAAU,WAAW;AAC/D,iBAAW,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,QAAQ,CAAC;AAG9C,YAAM,SAAS;AAAA,QACb,GAAG,QAAQ,IAAI,aAAa,IAAI;AAAA,QAChC,GAAG,QAAQ,IAAI,aAAa,IAAI;AAAA,MAClC;AAEA,oBAAc,QAAQ;AACtB,uBAAiB,MAAM;AAAA,IACzB;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAGA,QAAM,kBAAkBA;AAAA,IACtB,CAAC,MAAW;AACV,UAAI,CAAC,cAAe;AAGpB,UAAI,EAAE,IAAI,WAAW,KAAM,EAAE,IAAI,WAAW,KAAK,EAAE,IAAI,UAAW;AAChE,UAAE,IAAI,eAAe;AACrB,kBAAU,UAAU;AAAA,MACtB;AAAA,IACF;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAGA,QAAM,kBAAkBA;AAAA,IACtB,CAAC,MAAW;AACV,UAAI,CAAC,iBAAiB,CAAC,UAAU,QAAS;AAE1C,QAAE,IAAI,eAAe;AAErB,YAAM,QAAQ,SAAS;AACvB,UAAI,CAAC,MAAO;AAEZ,YAAM,SAAS;AAAA,QACb,GAAG,cAAc,IAAI,EAAE,IAAI;AAAA,QAC3B,GAAG,cAAc,IAAI,EAAE,IAAI;AAAA,MAC7B;AAEA,uBAAiB,MAAM;AAAA,IACzB;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,EAC/B;AAGA,QAAM,gBAAgBA,aAAY,MAAM;AACtC,cAAU,UAAU;AAAA,EACtB,GAAG,CAAC,CAAC;AAGL,EAAAD,QAAM,UAAU,MAAM;AACpB,UAAM,QAAQ,SAAS;AACvB,QAAI,OAAO;AACT,YAAM,MAAM,EAAE,GAAG,YAAY,GAAG,WAAW,CAAC;AAC5C,YAAM,SAAS,aAAa;AAC5B,YAAM,UAAU;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,YAAY,aAAa,CAAC;AAG9B,QAAM,gBAAgBC;AAAA,IACpB,CAAC,YAA2B;AAC1B,YAAM,aAAa,sBAAsB,QAAQ;AAGjD,YAAM,WAAW,SAAS,IAAI,QAAQ,IAAI;AAC1C,UAAI,CAAC,UAAU;AACb,gBAAQ,KAAK,uCAAuC,QAAQ,IAAI,EAAE;AAClE,eAAO;AAAA,MACT;AAGA,YAAM,oBAAoB,SAAS;AACnC,UAAI,CAAC,mBAAmB;AACtB,gBAAQ,KAAK,8CAA8C,QAAQ,IAAI,EAAE;AACzE,eAAO;AAAA,MACT;AAGA,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA,UAAU,MAAM,CAAC,YAAY,gBAAgB,QAAQ,EAAE;AAAA,QACvD,aAAa,CAAC,YACZ,CAAC,YAAY,mBAAmB,QAAQ,IAAI,OAAO;AAAA;AAAA,QAErD,aAAa;AAAA,QACb;AAAA,QACA,cAAc,mBAAmB,gBAAgB;AAAA,QACjD,mBAAmB,mBAAmB,oBAAoB;AAAA;AAAA,QAE1D,WAAW,QAAQ;AAAA;AAAA,QAEnB,oBAAoB;AAAA;AAAA,QAEpB,cAAc;AAAA;AAAA,QAEd,GAAI,MAAM,WAAW,CAAC;AAAA,MACxB;AAEA,aAAO,gBAAAJ,MAAC,qBAAoC,GAAG,eAAhB,QAAQ,EAAqB;AAAA,IAC9D;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAEvE,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,2DAA2D,SAAS;AAAA,MAC/E;AAAA,MAEA,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,WAAU;AAAA,UAGT;AAAA,6BAAiB,eAAe,KAC/B,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,cAAc;AAAA,kBACd,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,eAAe;AAAA,gBACjB;AAAA,gBAEC;AAAA,uBAAK,MAAM,aAAa,GAAG;AAAA,kBAAE;AAAA;AAAA;AAAA,YAChC;AAAA,YAGF,gBAAAD;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,KAAK;AAAA,gBACL,OAAO,UAAU;AAAA,gBACjB,QAAQ,UAAU;AAAA,gBAClB,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,aAAa;AAAA,gBACb,aAAa;AAAA,gBACb,WAAW;AAAA,gBACX,OAAO;AAAA,kBACL,WAAW;AAAA,kBACX,QAAQ,UAAU,UAAU,aAAa;AAAA,gBAC3C;AAAA,gBAEA,0BAAAJ,OAACK,QAAA,EAAM,GAAG,YAAY,GAAG,GAAG,YAAY,GAAG,WAAW,MAEnD;AAAA,oCACC,gBAAAN;AAAA,oBAACO;AAAA,oBAAA;AAAA,sBACC,GAAG;AAAA,sBACH,GAAG;AAAA,sBACH,OAAO,WAAW;AAAA,sBAClB,QAAQ,WAAW;AAAA,sBACnB,OAAO;AAAA,sBACP,WAAW;AAAA;AAAA,kBACb,IAEA,gBAAAP;AAAA,oBAACQ;AAAA,oBAAA;AAAA,sBACC,GAAG;AAAA,sBACH,GAAG;AAAA,sBACH,OAAO,WAAW;AAAA,sBAClB,QAAQ,WAAW;AAAA,sBACnB,MAAM,MAAM,mBAAmB;AAAA,sBAC/B,WAAW;AAAA;AAAA,kBACb;AAAA,kBAID,CAAC,gBAAgB,eAAe,IAAI,aAAa;AAAA,kBAGjD,oBACC,gBAAAR;AAAA,oBAAC;AAAA;AAAA,sBACC,gBAAgB,WAAW;AAAA,sBAC3B,kBAAkB,WAAW;AAAA,sBAC7B;AAAA;AAAA,kBACF;AAAA,kBAIF,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC;AAAA,sBACA;AAAA,sBACA,UAAU;AAAA,sBACV,eAAe;AAAA,sBACf,aAAa,CAAC,WAAW,YAAY;AAEnC,4BAAI,CAAC,iBAAkB;AAEvB,8BAAM,UAAU,SAAS,KAAK,CAAC,OAAO,GAAG,OAAO,SAAS;AACzD,4BAAI,CAAC,QAAS;AAGd,8BAAM,cAAc;AAAA,0BAClB,GAAG;AAAA,0BACH,UAAU,QAAQ,YAAY,QAAQ;AAAA,0BACtC,MAAM,QAAQ,QAAQ,QAAQ;AAAA,0BAC9B,UAAU,QAAQ,YAAY,QAAQ;AAAA,wBACxC;AAGA,8BAAM,aAAa;AAAA,0BACjB;AAAA,0BACA,YAAY,SAAS;AAAA,0BACrB,YAAY,SAAS;AAAA,0BACrB,SAAS,OAAO,CAAC,OAAO,GAAG,OAAO,SAAS;AAAA,0BAC3C;AAAA,4BACE,WAAW;AAAA,4BACX,gBAAgB;AAAA,4BAChB,cAAc;AAAA,4BACd;AAAA,0BACF;AAAA,wBACF;AAGA,sCAAc;AAAA,0BACZ,UAAU,WAAW;AAAA,0BACrB,YAAY,WAAW;AAAA,wBACzB,CAAC;AAAA,sBACH;AAAA,sBACA,gBAAgB,CAAC,WAAW,YAAY;AACtC,2CAAmB,WAAW,OAAO;AAErC,sCAAc,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;AAAA,sBAChD;AAAA;AAAA,kBACF;AAAA,mBACF;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AG1cA,SAAS,QAAAS,aAAY;AAwFb,qBAAAC,WAGM,OAAAC,OAHN,QAAAC,cAAA;AA3DD,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,kBAAkB,IAAI,mBAAmB;AAG/C,QAAM;AAAA,IACJ,mBAAmB;AAAA,IACnB,qBAAqB,CAAC;AAAA,IACtB,aAAa,CAAC;AAAA,IACd,WAAW,CAAC;AAAA,IACZ,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,cAAc,CAAC;AAAA;AAAA,EACjB,IAAI,UAAU,CAAC;AAGf,QAAM,WAAW,CAAC,GAAG,UAAU,GAAG,WAAW;AAG7C,QAAM,mBAAmB,mBACrB,iBAAiB,OAAO,CAAC,aAAa,CAAC,mBAAmB,SAAS,SAAS,IAAI,CAAC,IACjF,CAAC;AAGL,QAAM,sBAAsB,CAAC,aAA8B;AACzD,UAAM,aAAa,cAAc,SAAS,MAAM,SAAS,cAAc;AAAA,MACrE,UAAU,EAAE,GAAG,WAAW,QAAQ,GAAG,GAAG,WAAW,SAAS,EAAE;AAAA;AAAA,MAC9D,MAAM;AAAA,QACJ,OAAO,SAAS,aAAa,SAAS;AAAA,QACtC,QAAQ,SAAS,aAAa,UAAU;AAAA,MAC1C;AAAA,MACA,QAAQ,IAAI,eAAe,EAAE;AAAA;AAAA,IAC/B,CAAC;AAED,QAAI,WAAW,UAAU;AACzB,QAAI,cAAc,WAAW,EAAE;AAAA,EACjC;AAGA,QAAM,aAAa,CAAC,aAA2E;AAC7F,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,SAAS,GAAG;AAAA,IACrB;AACA,WAAO,YAAY;AAAA,EACrB;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,iEAAiE,SAAS;AAAA,MACrF;AAAA,MAGC;AAAA,mBAAW,SAAS,KACnB,gBAAAA,OAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,SAAI,WAAW,uBAAuB,mBAAmB,IACvD,qBAAW,IAAI,CAAC,SACf,gBAAAA,MAAC,gCAAmC,QAAQ,MAAM,KAAU,QAAO,cAAxC,KAAK,EAA8C,CAC/E,GACH;AAAA,WAEE,iBAAiB,SAAS,KAAK,SAAS,SAAS,MACjD,gBAAAA,MAAC,aAAU,aAAY,cAAa;AAAA,WAExC;AAAA,QAID,iBAAiB,SAAS,KACzB,gBAAAC,OAAAF,WAAA,EACE;AAAA,0BAAAC,MAAC,SAAI,WAAU,uBACZ,2BAAiB,IAAI,CAAC,aACrB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,oBAAoB,QAAQ;AAAA,cAC3C,WAAU;AAAA,cACV,SAAS,OAAO,SAAS,WAAW;AAAA,cACpC,cAAc;AAAA,cACd,aAAY;AAAA,cAEX,mBAAS,QAAQ,gBAAAA,MAACE,OAAA,EAAK,WAAU,WAAU;AAAA;AAAA,YATvC,SAAS;AAAA,UAUhB,CACD,GACH;AAAA,UAEC,SAAS,SAAS,KACjB,gBAAAF,MAAC,aAAU,aAAY,cAAa;AAAA,WAExC;AAAA,QAID,SAAS,SAAS,KACjB,gBAAAA,MAAC,SAAI,WAAW,uBAAuB,iBAAiB,IACrD,mBAAS,IAAI,CAAC,SACb,gBAAAA,MAAC,gCAAmC,QAAQ,MAAM,KAAU,QAAO,cAAxC,KAAK,EAA8C,CAC/E,GACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AP6LQ,gBAAAG,OAqEE,QAAAC,cArEF;AA9PD,IAAM,wBAA8D,CAAC;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,iBAAiB,CAAC;AAAA,EAClB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB;AAAA,EACA,eAAe;AAAA,EACf,YAAY;AAAA,EACZ;AACF,MAAM;AAEJ,QAAM,cAAcC,QAAM,QAAQ,MAAM;AACtC,WAAO,CAAC,GAAG,iBAAiB,GAAI,MAAM,sBAAsB,CAAC,GAAI,GAAG,cAAc;AAAA,EACpF,GAAG,CAAC,MAAM,cAAc,CAAC;AAGzB,QAAM,WAAW,mBAAmB,WAAW;AAG/C,QAAM,EAAE,OAAO,KAAK,MAAM,MAAM,SAAS,SAAS,cAAc,IAAI,eAAe,QAAQ,IAAI;AAG/F,QAAM,eAAeA,QAAM,OAA6B,IAAI;AAG5D,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,QAAM,SAAS,gBAAgB;AAGjF,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,QAAM;AAAA,IAClD,MAAM,mBAAmB;AAAA,EAC3B;AAGA,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,QAAM;AAAA,IAClD,MAAM,mBAAmB;AAAA,EAC3B;AAGA,EAAAA,QAAM,UAAU,MAAM;AACpB,yBAAqB,gBAAgB;AAAA,EACvC,GAAG,CAAC,gBAAgB,CAAC;AAGrB,EAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,MAAM,iBAAiB;AACzB,yBAAmB,KAAK,eAAe;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,MAAM,eAAe,CAAC;AAG1B,EAAAA,QAAM,UAAU,MAAM;AACpB,uBAAmB,MAAM,mBAAmB,EAAE;AAAA,EAChD,GAAG,CAAC,MAAM,eAAe,CAAC;AAG1B,QAAM,aAAa,MAAM;AAGzB,sBAAoB,QAAQ,MAAM,KAAK,CAAC,GAAG,CAAC;AAG5C,EAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,eAAe,YAAY,YAAY,YAAY,SAAS,SAAS,GAAG;AAE1E,UAAI,aAAa,YAAY,QAAQ;AACrC,UAAI,YAAY,SAAS,YAAY,QAAQ;AAC3C,sBAAc,YAAY,OAAO,YAAY,MAAM;AAAA,MACrD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,qBAAqB,MAAM,KAAK,SAAS,OAAO,EAAE,OAAO,CAAC;AAGhE,QAAM,kBAAkB,MAAM,oBAC1B,MAAM,SAAS,KAAK,CAAC,OAAO,GAAG,OAAO,MAAM,iBAAiB,KAAK,OAClE;AAEJ,QAAM,mBAAmB,kBAAkB,SAAS,IAAI,gBAAgB,IAAI,KAAK,OAAO;AAGxF,QAAM,eAAeC,aAAY,MAAM;AACrC,UAAM,OAAqB;AAAA,MACzB,OAAO,WAAW;AAAA,MAClB,QAAQ,WAAW;AAAA,MACnB,UAAU,MAAM;AAAA,MAChB,UAAU;AAAA,QACR,SAAS;AAAA,QACT,MAAM,MAAM,QAAQ;AAAA,QACpB,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,OAAO,aAAa,IAAI;AAC9B,UAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC1D,UAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO;AACT,MAAE,WAAW,UAAU,KAAK,IAAI,CAAC;AACjC,MAAE,MAAM;AACR,QAAI,gBAAgB,GAAG;AAAA,EACzB,GAAG,CAAC,MAAM,UAAU,YAAY,IAAI,CAAC;AAGrC,QAAM,eAAeA,aAAY,MAAM;AACrC,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,OAAO;AACb,UAAM,SAAS;AACf,UAAM,WAAW,OAAO,MAAM;AAC5B,YAAM,OAAQ,EAAE,OAA4B,QAAQ,CAAC;AACrD,UAAI,CAAC,KAAM;AAEX,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,cAAM,WAAW,eAAe,IAAI;AAEpC,YAAI,UAAU;AAEZ,gBAAM,SAAS,QAAQ,CAAC,OAAO,IAAI,cAAc,GAAG,EAAE,CAAC;AAGvD,mBAAS,SAAS,QAAQ,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC;AAGpD,cAAI,SAAS,SAAS,SAAS,QAAQ;AACrC,0BAAc,SAAS,OAAO,SAAS,MAAM;AAAA,UAC/C;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,qBAAqB,KAAK;AACxC,cAAM,qBAAsB,MAAgB,OAAO,EAAE;AAAA,MACvD;AAAA,IACF;AACA,UAAM,MAAM;AAAA,EACd,GAAG,CAAC,MAAM,UAAU,GAAG,CAAC;AAGxB,QAAM,cAAcD,QAAM,OAAO,QAAQ;AACzC,EAAAA,QAAM,UAAU,MAAM;AACpB,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,QAAQ,CAAC;AAEb,EAAAA,QAAM,UAAU,MAAM;AACpB,QAAI,YAAY,SAAS;AACvB,kBAAY,QAAQ;AAAA,QAClB,OAAO,WAAW;AAAA,QAClB,QAAQ,WAAW;AAAA,QACnB,UAAU,MAAM;AAAA,QAChB,UAAU;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,YAAY,iBAAiB,eAAe,CAAC;AAGjE,EAAAA,QAAM,UAAU,MAAM;AACpB,UAAM,gBAAgB,CAAC,MAAqB;AAC1C,UAAI,SAAU;AAGd,UAAI,EAAE,WAAW,EAAE,QAAQ,OAAO,CAAC,EAAE,UAAU;AAC7C,UAAE,eAAe;AACjB,YAAI,QAAS,MAAK;AAAA,MACpB,WAEU,EAAE,WAAW,EAAE,QAAQ,OAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAM;AACnF,UAAE,eAAe;AACjB,YAAI,QAAS,MAAK;AAAA,MACpB,WAES,EAAE,QAAQ,YAAY,iBAAiB;AAC9C,UAAE,eAAe;AACjB,YAAI,cAAc,gBAAgB,EAAE;AAAA,MACtC,WAES,EAAE,QAAQ,UAAU;AAC3B,UAAE,eAAe;AACjB,YAAI,cAAc,IAAI;AAAA,MACxB,WAES,EAAE,WAAW,EAAE,QAAQ,OAAO,iBAAiB;AACtD,UAAE,eAAe;AACjB,cAAM,SAAS,IAAI,YAAY;AAC/B,YAAI,QAAQ;AAEV,uBAAa,UAAU;AAAA,QACzB;AAAA,MACF,WAES,EAAE,WAAW,EAAE,QAAQ,OAAO,aAAa,SAAS;AAC3D,UAAE,eAAe;AACjB,YAAI,aAAa,aAAa,OAAO;AAAA,MACvC,WAES,EAAE,WAAW,EAAE,QAAQ,OAAO,iBAAiB;AACtD,UAAE,eAAe;AACjB,YAAI,iBAAiB;AAAA,MACvB;AAIA,YAAM,iBAAiB,MAAM;AAC3B,cAAM,SAAS,SAAS;AACxB,YAAI,CAAC,OAAQ,QAAO;AAEpB,YAAI,WAAW,SAAS,KAAM,QAAO;AAErC,YAAI,OAAO,kBAAmB,QAAO;AACrC,cAAM,MAAM,OAAO,SAAS,YAAY;AACxC,YAAI,QAAQ,WAAW,QAAQ,cAAc,QAAQ,SAAU,QAAO;AACtE,cAAM,OAAO,OAAO,eAAe,OAAO,aAAa,MAAM,IAAI;AACjE,YAAI,SAAS,UAAW,QAAO;AAC/B,eAAO;AAAA,MACT;AAEA,UAAI,mBAAmB,CAAC,eAAe,GAAG;AACxC,YAAI,EAAE,QAAQ,WAAW;AACvB,YAAE,eAAe;AACjB,cAAI,YAAY,gBAAgB,IAAI,GAAG,EAAE;AAAA,QAC3C,WAAW,EAAE,QAAQ,aAAa;AAChC,YAAE,eAAe;AACjB,cAAI,YAAY,gBAAgB,IAAI,GAAG,CAAC;AAAA,QAC1C,WAAW,EAAE,QAAQ,aAAa;AAChC,YAAE,eAAe;AACjB,cAAI,YAAY,gBAAgB,IAAI,IAAI,CAAC;AAAA,QAC3C,WAAW,EAAE,QAAQ,cAAc;AACjC,YAAE,eAAe;AACjB,cAAI,YAAY,gBAAgB,IAAI,GAAG,CAAC;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,SAAS,SAAS,MAAM,MAAM,iBAAiB,KAAK,QAAQ,CAAC;AAEjE,SACE,gBAAAD,OAAC,SAAI,WAAW,iBAAiB,SAAS,IAEvC;AAAA,kBACC,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,kBAAkB;AAAA,QAClB,oBAAoB;AAAA,QACpB,QAAQ,MAAM;AAAA;AAAA,IAChB;AAAA,IAIF,gBAAAC,OAAC,SAAI,WAAU,sCAEZ;AAAA,qBACC,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,kBAAkB;AAAA,UAClB;AAAA,UACA,QAAQ,MAAM;AAAA;AAAA,MAChB;AAAA,MAID,cACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,mBAAmB,MAAM;AAAA,UACzB;AAAA,UACA,MAAM,OAAO,EAAE,GAAG,MAAM,gBAAgB,IAAI;AAAA,UAC5C;AAAA,UACA,kBAAkB;AAAA,UAClB;AAAA,UACA,oBACE,mBAAmB,MAAM,SAAS,YAC9B,KAAK,QAAQ,UAAU,IAAI,eAAe,IAC1C;AAAA,UAEN;AAAA,UACA,iBAAiB,CAAC,OAAO,IAAI,cAAc,EAAE;AAAA,UAC7C,oBAAoB,CAAC,IAAI,YAAY,IAAI,cAAc,IAAI,OAAO;AAAA;AAAA,MACpE;AAAA,MAID,cACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,MAAM;AAAA,UAChB,mBAAmB,MAAM;AAAA,UACzB;AAAA,UACA,kBAAkB,SAAS,OAAO;AAAA,UAClC,WAAU;AAAA;AAAA,MACZ;AAAA,MAID,iBACC,gBAAAC,OAAC,SAAI,WAAU,oDAEb;AAAA,wBAAAD,MAAC,SAAI,WAAU,gCACb,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,iBAAiB;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF,GACF;AAAA,QAGC,mBACC,MAAM,yBACL,CAAC,KAAK,uBAAuB,KAAK,wBAAwB,aAC3DE,QAAM,cAAc,KAAK,sBAAsB;AAAA,UAC7C,GAAG,KAAK;AAAA,UACR;AAAA,UACA,WAAW,KAAK,qBAAqB;AAAA,QACvC,CAAC;AAAA,SACL;AAAA,MAID,mBACC,MAAM,wBACN,KAAK,wBAAwB,WAC7BA,QAAM,cAAc,KAAK,sBAAsB;AAAA,QAC7C,GAAG,KAAK;AAAA,QACR;AAAA,QACA,WAAW,YAAY,KAAK,qBAAqB,MAAM;AAAA,MACzD,CAAC;AAAA,OACL;AAAA,KACF;AAEJ;;;AQlbA,OAAOE,aAAW;AAGlB,SAAS,cAAc;AAgDf,SAQM,OAAAC,OARN,QAAAC,cAAA;AAtBD,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV,MAAM;AACJ,QAAM,CAAC,aAAa,cAAc,IAAIC,QAAM,SAAS,EAAE;AAGvD,QAAM,iBAAiBA,QAAM,QAAQ,MAAM;AACzC,QAAI,CAAC,YAAa,QAAO;AACzB,UAAM,QAAQ,YAAY,YAAY;AACtC,WAAO,OAAO,OAAO,CAAC,UAAU,MAAM,KAAK,YAAY,EAAE,SAAS,KAAK,CAAC;AAAA,EAC1E,GAAG,CAAC,QAAQ,WAAW,CAAC;AAGxB,QAAM,qBAAqBA,QAAM;AAAA,IAC/B,CAAC,UAAyD;AACxD,YAAM,UAAU,MAAM,KAAK,MAAM,iCAAiC;AAElE,aACE,gBAAAD;AAAA,QAAC;AAAA;AAAA,UAEC,WAAU;AAAA,UACV,SAAS,MAAM,gBAAgB,MAAM,IAAI;AAAA,UACzC,OAAO,MAAM;AAAA,UAEZ;AAAA,sBACC,gBAAAD,MAAC,SAAI,WAAU,oEACb,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK,YAAY,MAAM,IAAI;AAAA,gBAC3B,KAAK,MAAM;AAAA,gBACX,WAAU;AAAA,gBACV,SAAS,CAAC,MAAM;AAEd,oBAAE,cAAc,MAAM,UAAU;AAChC,oBAAE,cAAc,cAAe,YAAY;AAAA;AAAA;AAAA,gBAG7C;AAAA;AAAA,YACF,GACF,IAEA,gBAAAA,MAAC,SAAI,WAAU,oEACb,0BAAAA,MAAC,SAAI,WAAU,iCAAgC,kBAAI,GACrD;AAAA,YAEF,gBAAAA,MAAC,SAAI,WAAU,uCAAuC,gBAAM,MAAK;AAAA;AAAA;AAAA,QAzB5D,MAAM;AAAA,MA0Bb;AAAA,IAEJ;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,gBAAgB,eAAe;AAErC,SACE,gBAAAC,OAAC,SAAI,WAAW,wCAAwC,aAAa,QAAQ,IAE3E;AAAA,oBAAAA,OAAC,SAAI,WAAU,gBACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,8BAA8B,iBAAM;AAAA,MAClD,gBAAAC,OAAC,SAAI,WAAU,YACb;AAAA,wBAAAD,MAAC,UAAO,WAAU,oFAAmF;AAAA,QACrG,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,YAC9C,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,OACF;AAAA,IAGA,gBAAAA,MAAC,cAAW,WAAU,UACnB,yBAAe,SAAS,IACvB,gBAAAA,MAAC,SAAI,WAAU,8BACZ,yBAAe,IAAI,CAAC,UAAU,cAAc,KAAK,CAAC,GACrD,IAEA,gBAAAA,MAAC,SAAI,WAAU,uEACZ,wBAAc,oBAAoB,uBACrC,GAEJ;AAAA,KACF;AAEJ;","names":["useCallback","duplicateElement","useMemo","React","Text","Fragment","jsx","jsxs","React","Text","jsx","useCallback","React","React","jsx","React","jsx","React","jsx","jsxs","React","jsx","React","jsx","jsxs","jsxs","jsx","React","jsx","React","Check","jsx","Check","Fragment","jsx","jsxs","React","React","cva","jsx","cva","React","jsx","jsxs","React","React","cva","jsx","cva","React","jsx","jsx","jsxs","jsx","ChevronDown","Type","ChevronUp","jsx","jsxs","Type","React","ChevronUp","ChevronDown","React","useCallback","Trash2","Image","React","jsx","jsx","jsxs","Fragment","jsx","jsxs","Image","Trash2","React","useCallback","useRef","Stage","Layer","Rect","KonvaImage","Fragment","jsx","jsxs","useEffect","useRef","Transformer","jsx","jsx","jsxs","useRef","React","useCallback","Stage","Layer","KonvaImage","Rect","Plus","Fragment","jsx","jsxs","Plus","jsx","jsxs","React","useCallback","React","jsx","jsxs","React"]}
|