@elixpo/lixsketch 5.5.9 → 5.5.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react/{AIRenderer-46WIFF2B.js → AIRenderer-PWWLWI6U.js} +84 -16
- package/dist/react/AIRenderer-PWWLWI6U.js.map +7 -0
- package/dist/react/{CopyPaste-4CKJRHJ3.js → CopyPaste-SA72NDFN.js} +2 -2
- package/dist/react/{EventDispatcher-AD2BPPPS.js → EventDispatcher-BZQRHROG.js} +2 -2
- package/dist/react/{MermaidFlowchartRenderer-A26B2SM3.js → MermaidFlowchartRenderer-4YEMAYQC.js} +18 -3
- package/dist/react/MermaidFlowchartRenderer-4YEMAYQC.js.map +7 -0
- package/dist/react/{MermaidSequenceRenderer-OF4JK77D.js → MermaidSequenceRenderer-KCUHO7UI.js} +106 -4
- package/dist/react/MermaidSequenceRenderer-KCUHO7UI.js.map +7 -0
- package/dist/react/MermaidStructuredRenderer-GGOOGON5.js +365 -0
- package/dist/react/MermaidStructuredRenderer-GGOOGON5.js.map +7 -0
- package/dist/react/{SceneSerializer-4U4B24JM.js → SceneSerializer-ZPHV6IUP.js} +2 -2
- package/dist/react/{SketchEngine-XWWTA2MT.js → SketchEngine-NPF2XN6Z.js} +7 -7
- package/dist/react/TextShape-U6ZZKB35.js +8 -0
- package/dist/react/{chunk-QXFBG7OM.js → chunk-42O6W7DF.js} +18 -1
- package/dist/react/chunk-42O6W7DF.js.map +7 -0
- package/dist/react/{chunk-YVCENC7J.js → chunk-5QIT2WBE.js} +19 -116
- package/dist/react/chunk-5QIT2WBE.js.map +7 -0
- package/dist/react/index.js +34 -100
- package/dist/react/index.js.map +3 -3
- package/dist/react/{textTool-KY4AYUTC.js → textTool-HY5NMM7H.js} +2 -2
- package/package.json +1 -1
- package/src/core/AIRenderer.js +95 -11
- package/src/core/MermaidFlowchartRenderer.js +18 -3
- package/src/core/MermaidSequenceRenderer.js +116 -7
- package/src/core/MermaidStructuredRenderer.js +363 -0
- package/src/react/LixSketchCanvas.jsx +1 -1
- package/src/react/components/modals/LixScriptModal.jsx +22 -96
- package/src/react/components/sidebars/TextSidebar.jsx +1 -1
- package/src/react/store/useUIStore.js +1 -1
- package/src/shapes/TextShape.js +19 -0
- package/src/tools/textTool.js +23 -157
- package/dist/react/AIRenderer-46WIFF2B.js.map +0 -7
- package/dist/react/MermaidFlowchartRenderer-A26B2SM3.js.map +0 -7
- package/dist/react/MermaidSequenceRenderer-OF4JK77D.js.map +0 -7
- package/dist/react/TextShape-54ZJ66E3.js +0 -8
- package/dist/react/chunk-QXFBG7OM.js.map +0 -7
- package/dist/react/chunk-YVCENC7J.js.map +0 -7
- /package/dist/react/{CopyPaste-4CKJRHJ3.js.map → CopyPaste-SA72NDFN.js.map} +0 -0
- /package/dist/react/{EventDispatcher-AD2BPPPS.js.map → EventDispatcher-BZQRHROG.js.map} +0 -0
- /package/dist/react/{SceneSerializer-4U4B24JM.js.map → SceneSerializer-ZPHV6IUP.js.map} +0 -0
- /package/dist/react/{SketchEngine-XWWTA2MT.js.map → SketchEngine-NPF2XN6Z.js.map} +0 -0
- /package/dist/react/{TextShape-54ZJ66E3.js.map → TextShape-U6ZZKB35.js.map} +0 -0
- /package/dist/react/{textTool-KY4AYUTC.js.map → textTool-HY5NMM7H.js.map} +0 -0
package/dist/react/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/react/LixSketchCanvas.jsx", "../../src/react/store/useSketchStore.js", "../../src/react/store/useUIStore.js", "../../src/react/components/canvas/SVGCanvas.jsx", "../../src/react/hooks/useSketchEngine.js", "../../src/react/hooks/inertStores.js", "../../src/react/components/Toolbar.jsx", "../../src/react/components/Footer.jsx", "../../src/react/components/AppMenu.jsx", "../../src/react/hooks/useTranslation.js", "../../src/react/components/sidebars/ShapeSidebar.jsx", "../../src/react/components/sidebars/RectangleSidebar.jsx", "../../src/react/components/sidebars/CircleSidebar.jsx", "../../src/react/components/sidebars/LineSidebar.jsx", "../../src/react/components/sidebars/ArrowSidebar.jsx", "../../src/react/components/sidebars/PaintbrushSidebar.jsx", "../../src/react/components/sidebars/TextSidebar.jsx", "../../src/react/components/sidebars/FrameSidebar.jsx", "../../src/react/components/sidebars/IconSidebar.jsx", "../../src/react/components/sidebars/ImageSidebar.jsx", "../../src/react/components/canvas/MultiSelectActions.jsx", "../../src/react/utils/toast.js", "../../src/react/components/canvas/ContextMenu.jsx", "../../src/react/components/canvas/FindBar.jsx", "../../src/react/components/canvas/ImageSourcePicker.jsx", "../../src/react/components/canvas/CanvasLoadingOverlay.jsx", "../../src/react/components/modals/ShortcutsModal.jsx", "../../src/react/components/modals/CommandPalette.jsx", "../../src/react/components/modals/ExportImageModal.jsx", "../../src/react/components/modals/HelpModal.jsx", "../../src/react/components/modals/LixScriptModal.jsx", "../../src/react/components/modals/GraphModal.jsx", "../../src/react/toolsEnum.js", "../../src/EngineShortcuts.js"],
|
|
4
|
-
"sourcesContent": ["'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { compressImage } from '../utils/imageCompressor.js';\nlet _saveScene = null;\nlet _loadScene = null;\nasync function ensureSceneSerializer() {\n if (_saveScene && _loadScene) return;\n const m = await import('../core/SceneSerializer.js');\n _saveScene = m.saveScene;\n _loadScene = m.loadScene;\n}\n\nimport useSketchStore, { TOOLS } from './store/useSketchStore.js';\nimport useUIStore from './store/useUIStore.js';\nimport SVGCanvas from './components/canvas/SVGCanvas.jsx';\nimport Toolbar from './components/Toolbar.jsx';\nimport Footer from './components/Footer.jsx';\nimport AppMenu from './components/AppMenu.jsx';\nimport RectangleSidebar from './components/sidebars/RectangleSidebar.jsx';\nimport CircleSidebar from './components/sidebars/CircleSidebar.jsx';\nimport LineSidebar from './components/sidebars/LineSidebar.jsx';\nimport ArrowSidebar from './components/sidebars/ArrowSidebar.jsx';\nimport PaintbrushSidebar from './components/sidebars/PaintbrushSidebar.jsx';\nimport TextSidebar from './components/sidebars/TextSidebar.jsx';\nimport FrameSidebar from './components/sidebars/FrameSidebar.jsx';\nimport IconSidebar from './components/sidebars/IconSidebar.jsx';\nimport ImageSidebar from './components/sidebars/ImageSidebar.jsx';\nimport MultiSelectActions from './components/canvas/MultiSelectActions.jsx';\nimport ContextMenu from './components/canvas/ContextMenu.jsx';\nimport FindBar from './components/canvas/FindBar.jsx';\nimport ImageSourcePicker from './components/canvas/ImageSourcePicker.jsx';\nimport CanvasLoadingOverlay from './components/canvas/CanvasLoadingOverlay.jsx';\nimport ShortcutsModal from './components/modals/ShortcutsModal.jsx';\nimport CommandPalette from './components/modals/CommandPalette.jsx';\nimport ExportImageModal from './components/modals/ExportImageModal.jsx';\nimport HelpModal from './components/modals/HelpModal.jsx';\nimport LixScriptModal from './components/modals/LixScriptModal.jsx';\nimport GraphModal from './components/modals/GraphModal.jsx';\n\nconst SAVE_DEBOUNCE_MS = 1500;\n\n/**\n * Self-contained canvas component. Mounts the SketchEngine on an internal\n * <svg>, renders the full toolbar + per-shape sidebars + offline modals,\n * and surfaces scene changes + image uploads to the host.\n *\n * Offline-first: no cloud sync, AI, or auth code paths reach this build.\n * The host owns persistence and image upload via the two callbacks.\n */\nexport default function LixSketchCanvas({\n initialScene = null,\n onSceneChange = null,\n onUploadImage = null,\n onExit = null,\n className = '',\n style = null,\n}) {\n const wrapperRef = useRef(null);\n const lastSceneJsonRef = useRef('');\n const debounceRef = useRef(null);\n const [bootstrapped, setBootstrapped] = useState(false);\n\n // Re-route engine image uploads through the host before any user action.\n useEffect(() => {\n installImageUploadBridge(onUploadImage);\n }, [onUploadImage]);\n\n // Eager-load lixFont / lixCode so the textarea overlay used while a user\n // types into a text shape uses the same font as the final rendered text.\n // Without this, the first text edit shows in a system font and snaps to\n // lixFont only after the SVG re-renders.\n useEffect(() => {\n if (typeof document === 'undefined' || !document.fonts?.load) return;\n Promise.allSettled([\n document.fonts.load('1em lixFont'),\n document.fonts.load('1em lixCode'),\n ]).catch(() => {});\n }, []);\n\n // Apply initialScene once the engine reports ready (via window.__sketchEngine).\n useEffect(() => {\n if (!initialScene || bootstrapped) return;\n let cancelled = false;\n async function tryLoad() {\n if (cancelled) return;\n const serializer = window.__sceneSerializer;\n if (!serializer) {\n setTimeout(tryLoad, 200);\n return;\n }\n try {\n await ensureSceneSerializer();\n if (cancelled) return;\n const data = typeof initialScene === 'string' ? JSON.parse(initialScene) : initialScene;\n if (data && data.format === 'lixsketch') {\n _loadScene(data);\n lastSceneJsonRef.current = JSON.stringify(data);\n }\n } catch (err) {\n console.warn('[LixSketchCanvas] initialScene load failed:', err);\n }\n setBootstrapped(true);\n }\n tryLoad();\n return () => { cancelled = true; };\n }, [initialScene, bootstrapped]);\n\n // Ctrl+S \u2192 flush + show toast. Same UX as the standalone product but\n // with no cloud round-trip \u2014 onSceneChange (passed by the host) is the\n // real persistence layer.\n useEffect(() => {\n function handleKey(e) {\n if (!(e.ctrlKey || e.metaKey)) return;\n const key = (e.key || '').toLowerCase();\n if (key !== 's' || e.shiftKey) return;\n e.preventDefault();\n (async () => {\n try {\n await ensureSceneSerializer();\n const scene = _saveScene('Untitled');\n const json = JSON.stringify(scene);\n lastSceneJsonRef.current = json;\n if (onSceneChange) {\n const metadata = {\n shapeCount: Array.isArray(scene.shapes) ? scene.shapes.length : 0,\n viewport: scene.viewport || null,\n zoom: scene.zoom || 1,\n sizeBytes: json.length,\n savedAt: Date.now(),\n };\n onSceneChange(scene, metadata);\n }\n // Show the in-canvas save toast (rendered below).\n const toast = document.getElementById('lixsketch-save-toast');\n if (toast) {\n toast.classList.remove('hidden');\n clearTimeout(toast._hideTimer);\n toast._hideTimer = setTimeout(() => toast.classList.add('hidden'), 1800);\n }\n useUIStore.getState().setSaveStatus?.('cloud');\n } catch (err) {\n console.warn('[LixSketchCanvas] Ctrl+S save failed:', err);\n }\n })();\n }\n window.addEventListener('keydown', handleKey);\n return () => window.removeEventListener('keydown', handleKey);\n }, [onSceneChange]);\n\n // Scene-change autosave \u2014 MutationObserver + mouseup, debounced.\n useEffect(() => {\n if (!onSceneChange) return;\n let svg = null;\n let observer = null;\n\n const flush = async () => {\n try {\n await ensureSceneSerializer();\n const scene = _saveScene('Untitled');\n const json = JSON.stringify(scene);\n if (json === lastSceneJsonRef.current) return;\n lastSceneJsonRef.current = json;\n const metadata = {\n shapeCount: Array.isArray(scene.shapes) ? scene.shapes.length : 0,\n viewport: scene.viewport || null,\n zoom: scene.zoom || 1,\n sizeBytes: json.length,\n savedAt: Date.now(),\n };\n onSceneChange(scene, metadata);\n } catch (err) {\n console.warn('[LixSketchCanvas] save failed:', err);\n }\n };\n const debounced = () => {\n clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(flush, SAVE_DEBOUNCE_MS);\n };\n\n function attach() {\n svg = window.svg;\n if (!svg) {\n setTimeout(attach, 200);\n return;\n }\n observer = new MutationObserver(debounced);\n observer.observe(svg, { childList: true, subtree: true, attributes: true });\n svg.addEventListener('mouseup', debounced);\n }\n attach();\n window.addEventListener('beforeunload', flush);\n\n return () => {\n if (observer) observer.disconnect();\n if (svg) svg.removeEventListener('mouseup', debounced);\n window.removeEventListener('beforeunload', flush);\n clearTimeout(debounceRef.current);\n };\n }, [onSceneChange]);\n\n return (\n <div\n ref={wrapperRef}\n className={`lixsketch-canvas-root canvas-mode ${className}`}\n style={style}\n >\n <SVGCanvas />\n <Toolbar />\n <Footer />\n <AppMenu />\n <RectangleSidebar />\n <CircleSidebar />\n <LineSidebar />\n <ArrowSidebar />\n <PaintbrushSidebar />\n <TextSidebar />\n <FrameSidebar />\n <IconSidebar />\n <ImageSidebar />\n <MultiSelectActions />\n <ShortcutsModal />\n <CommandPalette />\n <ExportImageModal />\n <HelpModal />\n <LixScriptModal />\n <GraphModal />\n <ContextMenu />\n <FindBar />\n <ImageSourcePicker />\n <CanvasLoadingOverlay />\n\n {/* Floating header \u2014 menu trigger + help / shortcuts. Hosts can\n hide this strip by setting CSS `.lixsketch-floating-header { display: none }`\n if they render their own chrome (blogs.elixpo's CanvasSubpage does). */}\n <div className=\"lixsketch-floating-header absolute top-2 right-2 z-[1000] flex items-center gap-1.5 font-[lixFont]\">\n <button\n type=\"button\"\n title=\"LixScript \u2014 write shapes in DSL\"\n onClick={() => useUIStore.getState().toggleAIModal?.()}\n className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-surface border border-border-light text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <i className=\"bx bx-code-alt text-base\" />\n </button>\n <button\n type=\"button\"\n title=\"Graph \u2014 plot equations\"\n onClick={() => useUIStore.getState().toggleGraphModal?.()}\n className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-surface border border-border-light text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <i className=\"bx bx-line-chart text-base\" />\n </button>\n <button\n type=\"button\"\n title=\"Help (?)\"\n onClick={() => useUIStore.getState().toggleHelpModal?.()}\n className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-surface border border-border-light text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <i className=\"bx bx-help-circle text-base\" />\n </button>\n <button\n type=\"button\"\n title=\"Shortcuts (Ctrl+/)\"\n onClick={() => useUIStore.getState().toggleShortcutsModal?.()}\n className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-surface border border-border-light text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <i className=\"bx bx-command text-base\" />\n </button>\n <button\n type=\"button\"\n title=\"Menu\"\n onClick={() => useUIStore.getState().toggleMenu?.()}\n className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-surface border border-border-light text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <i className=\"bx bx-menu text-base\" />\n </button>\n </div>\n\n {/* Save toast \u2014 same look as the standalone product. Hidden by\n default; Ctrl+S flips the `hidden` class on/off. */}\n <div\n id=\"lixsketch-save-toast\"\n className=\"hidden fixed bottom-20 left-1/2 -translate-x-1/2 z-[9999] px-4 py-2 rounded-xl bg-surface/85 backdrop-blur-md border border-border-light text-text-secondary text-xs font-[lixFont] pointer-events-none\"\n >\n <i className=\"bx bx-check text-green-400 mr-1.5\" />\n Saved\n </div>\n </div>\n );\n}\n\n// \u2500\u2500 Image upload bridge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction installImageUploadBridge(onUploadImage) {\n if (typeof window === 'undefined') return;\n if (!onUploadImage) {\n // Offline mode (no host upload pipeline): leave the engine's\n // compressed-data-URL placement as the final state.\n window.uploadImageToCloudinary = async () => {};\n return;\n }\n\n window.uploadImageToCloudinary = async function bridgedUpload(imageShape) {\n const href = imageShape?.element?.getAttribute('href') || '';\n if (!href.startsWith('data:')) return;\n\n imageShape.uploadStatus = 'uploading';\n imageShape.uploadAbortController = new AbortController();\n const signal = imageShape.uploadAbortController.signal;\n imageShape.showUploadIndicator?.();\n\n try {\n let payloadDataUrl = href;\n try {\n const compressed = await compressImage(href);\n if (compressed?.dataUrl) payloadDataUrl = compressed.dataUrl;\n } catch (err) {\n console.warn('[LixSketchCanvas] compression failed, sending raw:', err);\n }\n if (signal.aborted) return;\n\n const result = await onUploadImage(payloadDataUrl);\n if (signal.aborted) return;\n if (!result?.url) throw new Error(result?.error || 'Upload failed');\n\n imageShape.element.setAttribute('href', result.url);\n imageShape.element.setAttribute('data-href', result.url);\n if (result.publicId) imageShape.element.setAttribute('data-cloudinary-id', result.publicId);\n if (typeof result.sizeBytes === 'number') {\n const oldSize = imageShape.element.__fileSize || 0;\n imageShape.element.__fileSize = result.sizeBytes;\n window.__roomImageBytesUsed = Math.max(\n 0,\n (window.__roomImageBytesUsed || 0) - oldSize + result.sizeBytes\n );\n }\n imageShape.uploadStatus = 'done';\n } catch (err) {\n if (!signal.aborted) {\n console.warn('[LixSketchCanvas] upload failed:', err);\n imageShape.uploadStatus = 'failed';\n }\n } finally {\n imageShape.removeUploadIndicator?.();\n imageShape.uploadAbortController = null;\n }\n };\n}\n", "import { create } from 'zustand'\n\n// Tool enum replaces 15 boolean flags\nexport const TOOLS = {\n SELECT: 'select',\n PAN: 'pan',\n RECTANGLE: 'rectangle',\n CIRCLE: 'circle',\n LINE: 'line',\n ARROW: 'arrow',\n FREEHAND: 'freehand',\n TEXT: 'text',\n CODE: 'code',\n ERASER: 'eraser',\n LASER: 'laser',\n IMAGE: 'image',\n FRAME: 'frame',\n ICON: 'icon',\n}\n\n// Action types for undo/redo\nexport const ACTION = {\n CREATE: 'create',\n DELETE: 'delete',\n MODIFY: 'modify',\n PASTE: 'paste',\n}\n\n// Tool -> cursor mapping\nconst TOOL_CURSORS = {\n [TOOLS.SELECT]: 'default',\n [TOOLS.PAN]: 'grab',\n [TOOLS.RECTANGLE]: 'crosshair',\n [TOOLS.CIRCLE]: 'crosshair',\n [TOOLS.LINE]: 'crosshair',\n [TOOLS.ARROW]: 'crosshair',\n [TOOLS.FREEHAND]: 'crosshair',\n [TOOLS.TEXT]: 'text',\n [TOOLS.CODE]: 'text',\n [TOOLS.LASER]: 'crosshair',\n [TOOLS.IMAGE]: 'crosshair',\n [TOOLS.FRAME]: 'crosshair',\n [TOOLS.ICON]: 'crosshair',\n}\n\n// Tool -> sidebar mapping\nconst TOOL_SIDEBARS = {\n [TOOLS.FREEHAND]: 'paintbrush',\n [TOOLS.RECTANGLE]: 'rectangle',\n [TOOLS.CIRCLE]: 'circle',\n [TOOLS.LINE]: 'line',\n [TOOLS.ARROW]: 'arrow',\n [TOOLS.TEXT]: 'text',\n [TOOLS.CODE]: 'text',\n [TOOLS.FRAME]: 'frame',\n}\n\n// Keyboard shortcut -> tool mapping\nexport const SHORTCUT_MAP = {\n h: TOOLS.PAN,\n v: TOOLS.SELECT,\n 1: TOOLS.SELECT,\n r: TOOLS.RECTANGLE,\n 2: TOOLS.RECTANGLE,\n o: TOOLS.CIRCLE,\n 4: TOOLS.CIRCLE,\n a: TOOLS.ARROW,\n 5: TOOLS.ARROW,\n l: TOOLS.LINE,\n 6: TOOLS.LINE,\n p: TOOLS.FREEHAND,\n 7: TOOLS.FREEHAND,\n t: TOOLS.TEXT,\n 8: TOOLS.TEXT,\n 9: TOOLS.IMAGE,\n e: TOOLS.ERASER,\n 0: TOOLS.ERASER,\n i: TOOLS.ICON,\n f: TOOLS.FRAME,\n k: TOOLS.LASER,\n}\n\nconst useSketchStore = create((set, get) => ({\n // --- Active tool (replaces 15 boolean flags) ---\n activeTool: TOOLS.SELECT,\n activeSidebar: null, // which sidebar to show\n selectedShapeSidebar: null, // sidebar shown when a shape is selected (overrides activeSidebar)\n\n setActiveTool: (tool, { afterDraw } = {}) => {\n // In view mode, only pan is allowed\n if (get().viewMode && tool !== TOOLS.PAN) return\n // Tool lock: don't switch to SELECT after drawing\n if (afterDraw && tool === TOOLS.SELECT && get().toolLock) return\n set({\n activeTool: tool,\n activeSidebar: TOOL_SIDEBARS[tool] || null,\n selectedShapeSidebar: null,\n })\n },\n\n // Called by engine when a shape is selected/deselected\n setSelectedShapeSidebar: (sidebar) => set({ selectedShapeSidebar: sidebar }),\n clearSelectedShapeSidebar: () => set({ selectedShapeSidebar: null }),\n\n getCursor: () => {\n const tool = get().activeTool\n if (tool === TOOLS.ERASER) {\n return `url(\"data:image/svg+xml;base64,${typeof btoa !== 'undefined' ? btoa('<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"><circle cx=\"10\" cy=\"10\" r=\"7\" fill=\"#222\" stroke=\"white\" stroke-width=\"2\"/></svg>') : ''}\") 10 10, auto`\n }\n if (tool === TOOLS.LASER) {\n return `url(\"data:image/svg+xml;base64,${typeof btoa !== 'undefined' ? btoa('<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#1971c2\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"></path><polyline points=\"15 3 21 3 21 9\"></polyline><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"></line></svg>') : ''}\") 0 0, auto`\n }\n return TOOL_CURSORS[tool] || 'crosshair'\n },\n\n // --- Shapes ---\n shapes: [],\n currentShape: null,\n lastMousePos: null,\n\n addShape: (shape) =>\n set((s) => ({ shapes: [...s.shapes, shape] })),\n\n removeShape: (shape) =>\n set((s) => ({ shapes: s.shapes.filter((sh) => sh !== shape) })),\n\n setCurrentShape: (shape) => set({ currentShape: shape }),\n setLastMousePos: (pos) => set({ lastMousePos: pos }),\n\n clearShapes: () => set({ shapes: [], currentShape: null }),\n\n // --- Undo/Redo ---\n undoStack: [],\n redoStack: [],\n\n pushUndo: (action) =>\n set((s) => ({\n undoStack: [...s.undoStack, action],\n redoStack: [], // clear redo on new action\n })),\n\n popUndo: () => {\n const { undoStack } = get()\n if (undoStack.length === 0) return null\n const action = undoStack[undoStack.length - 1]\n set((s) => ({\n undoStack: s.undoStack.slice(0, -1),\n redoStack: [...s.redoStack, action],\n }))\n return action\n },\n\n popRedo: () => {\n const { redoStack } = get()\n if (redoStack.length === 0) return null\n const action = redoStack[redoStack.length - 1]\n set((s) => ({\n redoStack: s.redoStack.slice(0, -1),\n undoStack: [...s.undoStack, action],\n }))\n return action\n },\n\n clearHistory: () => set({ undoStack: [], redoStack: [] }),\n\n // --- Viewport / Zoom ---\n zoom: 1,\n viewBox: { x: 0, y: 0, width: 0, height: 0 },\n translation: { x: 0, y: 0 },\n isPanning: false,\n panStart: null,\n\n setZoom: (zoom) => set({ zoom: Math.max(0.4, Math.min(30, zoom)) }),\n setViewBox: (vb) => set({ viewBox: vb }),\n setTranslation: (t) => set({ translation: t }),\n setIsPanning: (v) => set({ isPanning: v }),\n setPanStart: (p) => set({ panStart: p }),\n\n // --- Canvas background ---\n canvasBackground: 'var(--lixsketch-bg, #ffffff)',\n setCanvasBackground: (color) => set({ canvasBackground: color }),\n\n // --- Grid ---\n gridEnabled: false,\n toggleGrid: () => set((s) => ({ gridEnabled: !s.gridEnabled })),\n\n // --- Modes ---\n viewMode: false,\n zenMode: false,\n toolLock: false,\n snapToObjects: false,\n\n toggleViewMode: () => {\n const entering = !get().viewMode\n if (entering) {\n set({ viewMode: true, zenMode: false, activeTool: TOOLS.PAN, activeSidebar: null, selectedShapeSidebar: null })\n } else {\n set({ viewMode: false, activeTool: TOOLS.SELECT, activeSidebar: null })\n }\n },\n toggleZenMode: () => set((s) => ({ zenMode: !s.zenMode, viewMode: false })),\n\n // --- Canvas/Docs split layout ---\n // 'canvas' = sketch only, 'split' = side-by-side, 'docs' = doc only\n // Hydrated from localStorage on first store consumption (see\n // hydrateLayoutMode below). Persisted on every change.\n layoutMode: 'canvas',\n setLayoutMode: (mode) => {\n if (!['canvas', 'split', 'docs'].includes(mode)) return\n set({ layoutMode: mode })\n if (typeof window !== 'undefined') {\n try { localStorage.setItem('lixsketch-layout-mode', mode) } catch {}\n }\n },\n hydrateLayoutMode: () => {\n if (typeof window === 'undefined') return\n try {\n const saved = localStorage.getItem('lixsketch-layout-mode')\n if (saved && ['canvas', 'split', 'docs'].includes(saved)) {\n set({ layoutMode: saved })\n }\n } catch {}\n },\n toggleToolLock: () => set((s) => ({ toolLock: !s.toolLock })),\n toggleSnapToObjects: () => set((s) => ({ snapToObjects: !s.snapToObjects })),\n\n // --- RoughJS refs (set once after mount) ---\n roughCanvas: null,\n roughGenerator: null,\n setRoughRefs: (canvas, generator) =>\n set({ roughCanvas: canvas, roughGenerator: generator }),\n}))\n\nexport default useSketchStore\n", "import { create } from 'zustand'\n\n/**\n * Swap black\u2194white colors on all shapes when theme changes.\n * prevTheme / nextTheme are resolved ('dark' | 'light').\n */\nfunction invertShapeColors(prevResolved, nextResolved) {\n if (prevResolved === nextResolved) return\n const shapes = window.shapes\n if (!shapes || shapes.length === 0) return\n\n // Going light \u2192 dark: #000 \u2192 #fff. Going dark \u2192 light: #fff \u2192 #000.\n const from = nextResolved === 'light' ? '#ffffff' : '#000000'\n const to = nextResolved === 'light' ? '#000000' : '#ffffff'\n\n const normalize = (c) => {\n if (!c || c === 'transparent' || c === 'none') return c\n const lower = c.toLowerCase().trim()\n if (lower === '#fff' || lower === '#ffffff' || lower === 'white') return '#ffffff'\n if (lower === '#000' || lower === '#000000' || lower === 'black') return '#000000'\n return lower\n }\n\n for (const shape of shapes) {\n let changed = false\n if (shape.options) {\n if (normalize(shape.options.stroke) === from) {\n shape.options.stroke = to\n changed = true\n }\n if (normalize(shape.options.fill) === from) {\n shape.options.fill = to\n changed = true\n }\n }\n // Text shapes store color directly\n if (shape.color !== undefined && normalize(shape.color) === from) {\n shape.color = to\n changed = true\n }\n if (shape.strokeColor !== undefined && normalize(shape.strokeColor) === from) {\n shape.strokeColor = to\n changed = true\n }\n if (changed && typeof shape.draw === 'function') {\n shape.draw()\n }\n }\n}\n\nfunction applyTheme(theme) {\n // Issue #38 bug #1: scope theme to body classes so light mode only\n // affects the canvas, not the landing/blog pages. Token values live\n // in `body.canvas-mode` (light default) and `body.canvas-mode.theme-\n // dark` (toggle) rules in src/app/globals.css.\n const body = document.body\n if (!body) return\n const resolved = theme === 'system'\n ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n : theme\n body.classList.remove('theme-dark', 'theme-light')\n if (resolved === 'dark') body.classList.add('theme-dark')\n\n const svgEl = window.svg\n if (svgEl) svgEl.style.background = resolved === 'light' ? '#f4f3ee' : ''\n}\n\nconst useUIStore = create((set, get) => ({\n // --- Modals ---\n shortcutsModalOpen: false,\n saveModalOpen: false,\n aiModalOpen: false,\n graphModalOpen: false,\n commandPaletteOpen: false,\n helpModalOpen: false,\n exportImageModalOpen: false,\n findBarOpen: false,\n canvasPropertiesOpen: false,\n imageGenerateModalOpen: false,\n\n toggleShortcutsModal: () =>\n set((s) => ({ shortcutsModalOpen: !s.shortcutsModalOpen })),\n toggleSaveModal: () =>\n set((s) => ({ saveModalOpen: !s.saveModalOpen })),\n toggleAIModal: () =>\n set((s) => ({ aiModalOpen: !s.aiModalOpen })),\n toggleGraphModal: () =>\n set((s) => ({ graphModalOpen: !s.graphModalOpen })),\n toggleCommandPalette: () =>\n set((s) => ({ commandPaletteOpen: !s.commandPaletteOpen })),\n toggleHelpModal: () =>\n set((s) => ({ helpModalOpen: !s.helpModalOpen })),\n toggleExportImageModal: () =>\n set((s) => ({ exportImageModalOpen: !s.exportImageModalOpen })),\n toggleFindBar: () =>\n set((s) => ({ findBarOpen: !s.findBarOpen })),\n closeFindBar: () =>\n set({ findBarOpen: false }),\n toggleCanvasProperties: () =>\n set((s) => ({ canvasPropertiesOpen: !s.canvasPropertiesOpen })),\n toggleImageGenerateModal: () =>\n set((s) => ({ imageGenerateModalOpen: !s.imageGenerateModalOpen })),\n closeImageGenerateModal: () =>\n set({ imageGenerateModalOpen: false }),\n closeAllModals: () =>\n set({ shortcutsModalOpen: false, saveModalOpen: false, aiModalOpen: false, graphModalOpen: false, commandPaletteOpen: false, helpModalOpen: false, exportImageModalOpen: false, findBarOpen: false, canvasPropertiesOpen: false, imageGenerateModalOpen: false }),\n\n // --- Menu ---\n menuOpen: false,\n toggleMenu: () => set((s) => ({ menuOpen: !s.menuOpen })),\n closeMenu: () => set({ menuOpen: false }),\n\n // --- Workspace ---\n workspaceName: '',\n setWorkspaceName: (name) => {\n if (typeof window !== 'undefined') {\n localStorage.setItem('lixsketch-workspace-name', name)\n }\n set({ workspaceName: name })\n },\n\n // --- Save Status ---\n // 'idle' | 'local' | 'cloud' | 'failed'\n saveStatus: 'idle',\n setSaveStatus: (status) => set({ saveStatus: status }),\n\n // --- Session / Encryption ---\n // Key is persisted in localStorage keyed by session ID so it survives page refreshes.\n // This ensures re-saving a workspace uses the same key, keeping old share links valid.\n sessionEncryptionKey: null,\n setSessionEncryptionKey: (key, sessionId) => {\n if (typeof window !== 'undefined' && sessionId) {\n localStorage.setItem(`lixsketch-enc-key-${sessionId}`, key)\n }\n set({ sessionEncryptionKey: key })\n },\n loadEncryptionKeyForSession: (sessionId) => {\n if (typeof window !== 'undefined' && sessionId) {\n const stored = localStorage.getItem(`lixsketch-enc-key-${sessionId}`)\n if (stored) {\n set({ sessionEncryptionKey: stored })\n return stored\n }\n }\n return null\n },\n clearEncryptionKeyForSession: (sessionId) => {\n if (typeof window !== 'undefined' && sessionId) {\n localStorage.removeItem(`lixsketch-enc-key-${sessionId}`)\n }\n set({ sessionEncryptionKey: null })\n },\n\n // --- Canvas Loading ---\n canvasLoading: false,\n canvasLoadingMessage: 'Loading canvas...',\n setCanvasLoading: (loading, message) => set({ canvasLoading: loading, canvasLoadingMessage: message || 'Loading canvas...' }),\n\n // --- Theme ---\n // Issue #38 bug #1: light by default. Dark stays available via toggle.\n theme: 'dark',\n setTheme: (newTheme) => {\n const prev = get().theme\n const resolve = (t) => t === 'system'\n ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n : t\n invertShapeColors(resolve(prev), resolve(newTheme))\n applyTheme(newTheme)\n set({ theme: newTheme })\n },\n\n // --- Language / i18n ---\n language: 'en',\n setLanguage: (lang) => {\n set({ language: lang })\n },\n persistUIPrefs: (prefs) => {\n if (typeof window !== 'undefined') {\n const existing = localStorage.getItem('lix_ui_prefs')\n let parsed = {}\n try {\n if (existing) parsed = JSON.parse(existing)\n } catch (e) {}\n \n const updated = { ...parsed, ...prefs }\n localStorage.setItem('lix_ui_prefs', JSON.stringify(updated))\n \n if (prefs.language) {\n set({ language: prefs.language })\n window.dispatchEvent(new CustomEvent('lix-language-changed', { detail: { language: prefs.language } }))\n }\n }\n }\n}))\n\nexport default useUIStore\n", "\"use client\"\n\nimport { useRef, useState, useEffect } from 'react'\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport useSketchEngine from '../../hooks/useSketchEngine'\n\nconst GRID_SIZE = 20\n\nexport default function SVGCanvas() {\n const [svgReady, setSvgReady] = useState(false)\n const svgRef = useRef(null)\n const canvasBackground = useSketchStore((s) => s.canvasBackground)\n const gridEnabled = useSketchStore((s) => s.gridEnabled)\n const getCursor = useSketchStore((s) => s.getCursor)\n const cursor = getCursor()\n\n // viewBox is owned imperatively by the lixsketch engine (zoom/pan call\n // svg.setAttribute('viewBox', \u2026) directly). React must NOT re-render\n // the viewBox prop or it'll snap back over engine writes \u2014 which is\n // what was causing zoom deformity and the pan-release jump in split\n // mode. The initial value is set in the effect below; React never\n // rewrites it after that.\n useEffect(() => {\n const applyImperative = (w, h) => {\n const zoom = window.currentZoom || 1\n const cv = window.currentViewBox || { x: 0, y: 0 }\n const vbW = w / zoom\n const vbH = h / zoom\n const x = cv.x || 0\n const y = cv.y || 0\n window.currentViewBox = { x, y, width: vbW, height: vbH }\n const el = svgRef.current\n if (el) el.setAttribute('viewBox', `${x} ${y} ${vbW} ${vbH}`)\n }\n\n const sync = () => {\n const el = svgRef.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n const w = Math.max(1, Math.round(rect.width))\n const h = Math.max(1, Math.round(rect.height))\n applyImperative(w, h)\n }\n\n sync()\n setSvgReady(true)\n\n window.addEventListener('resize', sync)\n\n let ro\n if (typeof ResizeObserver !== 'undefined' && svgRef.current) {\n ro = new ResizeObserver(sync)\n ro.observe(svgRef.current)\n }\n\n return () => {\n window.removeEventListener('resize', sync)\n if (ro) ro.disconnect()\n }\n }, [])\n\n // Close icon sidebar when clicking on canvas without an icon ready to place\n useEffect(() => {\n const svg = svgRef.current\n if (!svg) return\n\n const handleCanvasClick = () => {\n const activeTool = useSketchStore.getState().activeTool\n // If icon tool is active but no icon is queued for placement, close the sidebar\n if (activeTool === TOOLS.ICON && !window.isIconToolActive) {\n useSketchStore.getState().setActiveTool(TOOLS.SELECT)\n }\n }\n\n svg.addEventListener('pointerdown', handleCanvasClick)\n return () => svg.removeEventListener('pointerdown', handleCanvasClick)\n }, [svgReady])\n\n // Initialize the imperative sketch engine on this SVG element\n useSketchEngine(svgRef, svgReady)\n\n // Expose grid state to engine\n useEffect(() => {\n window.__gridEnabled = gridEnabled\n }, [gridEnabled])\n\n return (\n <svg\n id=\"freehand-canvas\"\n ref={svgRef}\n className=\"absolute inset-0 w-full h-full\"\n style={{\n background: canvasBackground,\n cursor,\n userSelect: 'none',\n WebkitUserSelect: 'none',\n touchAction: 'none',\n }}\n preserveAspectRatio=\"none\"\n suppressHydrationWarning\n >\n {gridEnabled && (\n <defs>\n <pattern\n id=\"grid-small\"\n width={GRID_SIZE}\n height={GRID_SIZE}\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d={`M ${GRID_SIZE} 0 L 0 0 0 ${GRID_SIZE}`}\n fill=\"none\"\n stroke=\"rgba(255,255,255,0.06)\"\n strokeWidth=\"0.5\"\n />\n </pattern>\n <pattern\n id=\"grid-large\"\n width={GRID_SIZE * 5}\n height={GRID_SIZE * 5}\n patternUnits=\"userSpaceOnUse\"\n >\n <rect width={GRID_SIZE * 5} height={GRID_SIZE * 5} fill=\"url(#grid-small)\" />\n <path\n d={`M ${GRID_SIZE * 5} 0 L 0 0 0 ${GRID_SIZE * 5}`}\n fill=\"none\"\n stroke=\"rgba(255,255,255,0.12)\"\n strokeWidth=\"0.8\"\n />\n </pattern>\n </defs>\n )}\n {gridEnabled && (\n <rect\n x=\"-100000\"\n y=\"-100000\"\n width=\"200000\"\n height=\"200000\"\n fill=\"url(#grid-large)\"\n style={{ pointerEvents: 'none' }}\n />\n )}\n </svg>\n )\n}\n", "\"use client\"\n\nimport { useEffect, useRef } from 'react'\nimport useSketchStore from '../store/useSketchStore'\nimport { WORKER_URL } from './inertStores'\n\n/**\n * Hook that initializes the SketchEngine on the provided SVG element\n * and bridges Zustand activeTool changes to the engine's window flags.\n */\nexport default function useSketchEngine(svgRef, ready = true) {\n const engineRef = useRef(null)\n\n useEffect(() => {\n if (!ready || !svgRef.current) return\n\n let cancelled = false\n\n async function initEngine() {\n try {\n // Expose Zustand store API on window BEFORE engine init\n // so SketchEngine globals can call into React state\n const storeState = useSketchStore.getState()\n window.__sketchStoreApi = {\n setSelectedShapeSidebar: (sidebar) => useSketchStore.getState().setSelectedShapeSidebar(sidebar),\n clearSelectedShapeSidebar: () => useSketchStore.getState().clearSelectedShapeSidebar(),\n setActiveTool: (tool, opts) => useSketchStore.getState().setActiveTool(tool, opts),\n setZoom: (zoom) => useSketchStore.setState({ zoom }),\n getState: () => useSketchStore.getState(),\n }\n\n // Import the engine class directly (not via ../../index.js) so the\n // chunk doesn't pull SceneSerializer + the shape graph in before\n // engine.init() has had a chance to wire window.svg / window.rough.\n const { SketchEngine } = await import('../../SketchEngine.js')\n if (cancelled) return\n\n const engine = new SketchEngine(svgRef.current)\n await engine.init()\n engineRef.current = engine\n window.__sketchEngine = engine\n window.__WORKER_URL = WORKER_URL\n\n // Sync current tool immediately after init\n const currentTool = useSketchStore.getState().activeTool\n engine.setActiveTool(currentTool)\n } catch (err) {\n console.error('[useSketchEngine] Failed to initialize:', err)\n }\n }\n\n initEngine()\n\n return () => {\n cancelled = true\n if (engineRef.current) {\n engineRef.current.cleanup()\n engineRef.current = null\n }\n }\n }, [svgRef, ready])\n\n // Subscribe to Zustand activeTool changes and bridge to engine\n useEffect(() => {\n const unsub = useSketchStore.subscribe(\n (state, prevState) => {\n if (state.activeTool !== prevState?.activeTool && engineRef.current) {\n engineRef.current.setActiveTool(state.activeTool)\n }\n }\n )\n return unsub\n }, [])\n\n return engineRef\n}\n", "// Inert replacements for the standalone product's auth / cloud / collab\n// state. These let us copy components that reference cloud-coupled hooks\n// without hauling the whole product backend along. Each export mirrors\n// the shape the consumer expects but with no-op implementations.\n\nconst noop = () => {};\n\nconst inertAuth = {\n isAuthenticated: false,\n user: null,\n setUser: noop,\n setAuthenticated: noop,\n logout: noop,\n};\n\nconst inertCollab = {\n roomId: null,\n connected: false,\n setRoom: noop,\n setConnected: noop,\n};\n\nconst inertProfile = {\n profile: null,\n setProfile: noop,\n};\n\nfunction makeStore(state) {\n // Match the zustand call signature used in selectors:\n // const x = useStore((s) => s.foo)\n // const x = useStore.getState().foo\n function useStore(selector) {\n return typeof selector === 'function' ? selector(state) : state;\n }\n useStore.getState = () => state;\n useStore.setState = noop;\n useStore.subscribe = () => () => {};\n return useStore;\n}\n\nexport const useAuthStore = makeStore(inertAuth);\nexport const useCollabStore = makeStore(inertCollab);\nexport const useProfileStore = makeStore(inertProfile);\n\nexport const WORKER_URL = '';\nexport function getSessionID() {\n if (typeof window !== 'undefined' && window.__sessionID) return window.__sessionID;\n return null;\n}\n\nexport async function triggerDocCloudSync() { /* offline mode: no-op */ }\nexport function persistLayoutMode() { /* offline mode: no-op */ }\n\n// Cloud-sync trigger used by the standalone product's AppMenu / keyboard\n// shortcuts. The package's offline build should never hit a server, so we\n// resolve immediately. The host's onSceneChange callback (passed to\n// LixSketchCanvas) handles real persistence.\nexport async function triggerCloudSync() { return false; }\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../store/useSketchStore'\nimport useUIStore from '../store/useUIStore'\n\n// Items are built lazily inside the component body so esbuild's lazy ESM\n// wrapper can't evaluate them before the store module finishes init.\nfunction getViewModeItems() {\n return [\n { tool: TOOLS.PAN, icon: 'bxs-hand', title: 'Pan (H)', key: 'H' },\n ]\n}\n\nfunction getToolItems() {\n return [\n { tool: TOOLS.PAN, icon: 'bxs-hand', title: 'Pan (H)', key: 'H' },\n { tool: TOOLS.SELECT, icon: 'bxs-pointer', title: 'Select (V)', key: 'V' },\n 'spacer',\n { tool: TOOLS.RECTANGLE, icon: 'bx-square', title: 'Rectangle (R)', key: 'R' },\n { tool: TOOLS.CIRCLE, icon: 'bx-circle', title: 'Circle (O)', key: 'O' },\n { tool: TOOLS.LINE, icon: 'bx-minus', title: 'Line (L)', key: 'L' },\n { tool: TOOLS.ARROW, icon: 'bx-right-arrow-alt', title: 'Arrow (A)', rotate: true, key: 'A' },\n { tool: TOOLS.TEXT, icon: 'bx-text', title: 'Text (T)', key: 'T' },\n { tool: TOOLS.FREEHAND, icon: 'bx-pen', title: 'Freehand (P)', key: 'P' },\n { tool: TOOLS.IMAGE, icon: 'bx-image-alt', title: 'Image (9)', key: '9' },\n { tool: TOOLS.ICON, icon: 'bx-wink-smile', title: 'Icon (I)', key: 'I' },\n 'spacer',\n { tool: TOOLS.FRAME, icon: 'bx-crop', title: 'Frame (F)', key: 'F' },\n { tool: TOOLS.LASER, icon: 'bxs-magic-wand', title: 'Laser (K)', key: 'K' },\n { tool: TOOLS.ERASER, icon: 'bxs-eraser', title: 'Eraser (E)', key: 'E' },\n // AI tool entry removed while the assistant is coming-soon.\n // Restore `{ tool: 'ai', icon: null, title: 'AI', isAI: true }` here\n // when the modal becomes a real feature again.\n ]\n}\n\nexport default function Toolbar() {\n const activeTool = useSketchStore((s) => s.activeTool)\n const setActiveTool = useSketchStore((s) => s.setActiveTool)\n const viewMode = useSketchStore((s) => s.viewMode)\n const toolLock = useSketchStore((s) => s.toolLock)\n const toggleToolLock = useSketchStore((s) => s.toggleToolLock)\n const toggleAIModal = useUIStore((s) => s.toggleAIModal)\n\n const items = viewMode ? getViewModeItems() : getToolItems()\n\n return (\n <>\n <div className={`absolute left-2.5 top-1/2 -translate-y-1/2 w-[46px] rounded-xl bg-surface z-[1000] flex flex-col items-center py-1.5 gap-0.5 font-[lixFont] max-h-[calc(100vh-120px)] overflow-y-auto no-scrollbar`}>\n {/* Tool lock button at the top */}\n {!viewMode && (\n <>\n <button\n title=\"Tool Lock (Q)\"\n onClick={toggleToolLock}\n className={`relative w-[33px] h-[30px] flex items-center justify-center rounded-lg transition-all duration-200 ${\n toolLock\n ? 'bg-accent-blue/20 text-accent-blue'\n : 'text-text-dim hover:text-text-muted hover:bg-surface-hover'\n }`}\n >\n <i className={`bx ${toolLock ? 'bxs-lock-alt' : 'bx-lock-alt'} text-lg`} />\n <span className=\"absolute bottom-0.5 right-[-1px] text-[10px] leading-none opacity-50\">Q</span>\n </button>\n <div className=\"w-6 h-px bg-border-light my-0.5\" />\n </>\n )}\n\n {items.map((item, idx) => {\n if (item === 'spacer') {\n return (\n <div\n key={`spacer-${idx}`}\n className=\"w-6 h-px bg-border-light my-0.5\"\n />\n )\n }\n\n const isActive = activeTool === item.tool\n\n if (item.isAI) {\n return (\n <button\n key=\"ai\"\n title={item.title}\n onClick={toggleAIModal}\n className=\"w-[33px] h-[31px] flex items-center justify-center rounded-lg text-text-muted hover:text-accent hover:bg-surface-hover transition-all duration-200\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z\" />\n <path d=\"M18 14l1 3 3 1-3 1-1 3-1-3-3-1 3-1 1-3z\" />\n </svg>\n </button>\n )\n }\n\n return (\n <button\n key={item.tool}\n title={item.title}\n onClick={() => setActiveTool(item.tool)}\n className={`relative w-[33px] h-[31px] flex items-center justify-center rounded-lg transition-all duration-200 ${\n isActive\n ? 'bg-surface-active text-text-primary'\n : 'text-text-muted hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <i\n className={`bx ${item.icon} text-xl`}\n style={item.rotate ? { transform: 'rotate(-45deg)' } : undefined}\n />\n {item.key && (\n <span className={`absolute bottom-0.5 right-[-1px] text-[10px] leading-none ${isActive ? 'opacity-60' : 'opacity-35'}`}>\n {item.key}\n </span>\n )}\n </button>\n )\n })}\n </div>\n {viewMode && (\n <div className=\"absolute top-16 left-2.5 w-[46px] z-[1000] flex justify-center font-[lixFont]\">\n <span className=\"text-text-dim text-[9px] text-center leading-tight\">\n View<br/>Mode<br/>\n <kbd className=\"text-[8px] text-text-muted\">Esc</kbd>\n </span>\n </div>\n )}\n </>\n )\n}\n", "\"use client\"\n\nimport useSketchStore from '../store/useSketchStore'\nimport { useCallback } from 'react'\n\nexport default function Footer() {\n const zoom = useSketchStore((s) => s.zoom)\n const setZoom = useSketchStore((s) => s.setZoom)\n const viewMode = useSketchStore((s) => s.viewMode)\n const zenMode = useSketchStore((s) => s.zenMode)\n\n const zoomPercent = Math.round(zoom * 100)\n\n const handleZoomIn = useCallback(() => {\n if (window.zoomFromCenter) window.zoomFromCenter(1)\n }, [])\n\n const handleZoomOut = useCallback(() => {\n if (window.zoomFromCenter) window.zoomFromCenter(-1)\n }, [])\n\n const handleZoomReset = useCallback(() => {\n if (window.zoomReset) window.zoomReset()\n }, [])\n\n const handleZoomFit = useCallback(() => {\n if (window.zoomFit) window.zoomFit()\n }, [])\n\n const handleUndo = useCallback(() => {\n if (window.undo) window.undo()\n }, [])\n\n const handleRedo = useCallback(() => {\n if (window.redo) window.redo()\n }, [])\n\n if (viewMode || zenMode) return null\n\n return (\n <div className=\"absolute bottom-1 right-5 flex items-center gap-2.5 z-[1000] font-[lixFont]\">\n {/* Undo/Redo */}\n <div className=\"flex items-center bg-surface rounded-lg overflow-hidden\">\n <button\n onClick={handleUndo}\n title=\"Undo (Ctrl+Z)\"\n className=\"w-9 h-9 flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-undo text-lg\" />\n </button>\n <div className=\"w-px h-5 bg-border-light\" />\n <button\n onClick={handleRedo}\n title=\"Redo (Ctrl+Shift+Z)\"\n className=\"w-9 h-9 flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-redo text-lg\" />\n </button>\n </div>\n\n {/* Zoom controls */}\n <div className=\"flex items-center bg-surface rounded-lg overflow-hidden\">\n <button\n onClick={handleZoomFit}\n aria-label=\"Fit canvas to content\"\n title=\"Fit to Content (Shift+1)\"\n className=\"w-9 h-9 flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-target-lock text-lg\" />\n </button>\n <div className=\"w-px h-5 bg-border-light\" />\n <button\n onClick={handleZoomOut}\n title=\"Zoom Out (Ctrl+-)\"\n className=\"w-9 h-9 flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-minus text-lg\" />\n </button>\n <div className=\"w-px h-5 bg-border-light\" />\n <button\n onClick={handleZoomReset}\n title=\"Reset Zoom (Ctrl+0)\"\n className=\"min-w-[52px] h-9 flex items-center justify-center text-text-secondary text-sm px-2 hover:bg-surface-hover transition-all duration-200\"\n >\n {zoomPercent}%\n </button>\n <div className=\"w-px h-5 bg-border-light\" />\n <button\n onClick={handleZoomIn}\n title=\"Zoom In (Ctrl++)\"\n className=\"w-9 h-9 flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-plus text-lg\" />\n </button>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState } from 'react'\nimport useUIStore from '../store/useUIStore'\nimport useSketchStore from '../store/useSketchStore'\nimport { useAuthStore } from '../hooks/inertStores'\nimport { triggerCloudSync } from '../hooks/inertStores'\nimport { triggerDocCloudSync, persistLayoutMode } from '../hooks/inertStores'\nimport { useTranslation } from '../hooks/useTranslation'\n\n// Issue #38 follow-up: theme-paired swatches. The menu picks the\n// matching list at render time based on the active theme.\nconst CANVAS_BACKGROUNDS_LIGHT = [\n { color: '#ffffff', label: 'menu.canvasBg.white' },\n { color: '#faf9f5', label: 'menu.canvasBg.cream' },\n { color: '#f5f3ed', label: 'menu.canvasBg.paper' },\n { color: '#f0f5fb', label: 'menu.canvasBg.skyTint' },\n { color: '#f0f5ef', label: 'menu.canvasBg.sageTint' },\n]\nconst CANVAS_BACKGROUNDS_DARK = [\n { color: '#000000', label: 'menu.canvasBg.black' },\n { color: '#161718', label: 'menu.canvasBg.darkGray' },\n { color: '#13171C', label: 'menu.canvasBg.blueBlack' },\n { color: '#181605', label: 'menu.canvasBg.darkYellow' },\n { color: '#1B1615', label: 'menu.canvasBg.darkBrown' },\n]\n\nexport default function AppMenu() {\n const { t, language } = useTranslation()\n\n const LINKS = [\n { label: t('links.documentation'), icon: 'bx-book-open', href: '/docs' },\n { label: t('links.github'), icon: 'bxl-github', href: 'https://github.com/elixpo/sketch.elixpo' },\n { label: t('links.reportIssue'), icon: 'bx-bug', href: 'https://github.com/elixpo/sketch.elixpo/issues' },\n ]\n\n const PREFERENCE_ITEMS = [\n { label: t('prefs.toolLock'), shortcut: 'Q', id: 'toolLock' },\n { label: t('prefs.snapObjects'), shortcut: 'Alt+S', id: 'snapObjects' },\n { label: t('prefs.toggleGrid'), shortcut: \"Ctrl+'\", id: 'toggleGrid' },\n { label: t('prefs.zenMode'), shortcut: 'Alt+Z', id: 'zenMode' },\n { label: t('prefs.viewMode'), shortcut: 'Alt+R', id: 'viewMode' },\n { label: t('prefs.canvasShapeProps'), shortcut: 'Alt+/', id: 'properties' },\n { label: t('prefs.arrowBinding'), id: 'arrowBinding', toggle: true },\n { label: t('prefs.snapMidpoints'), id: 'snapMidpoints', toggle: true },\n ]\n\n const menuOpen = useUIStore((s) => s.menuOpen)\n const closeMenu = useUIStore((s) => s.closeMenu)\n const toggleSaveModal = useUIStore((s) => s.toggleSaveModal)\n const toggleCommandPalette = useUIStore((s) => s.toggleCommandPalette)\n const toggleHelpModal = useUIStore((s) => s.toggleHelpModal)\n const toggleExportImageModal = useUIStore((s) => s.toggleExportImageModal)\n const theme = useUIStore((s) => s.theme)\n const setTheme = useUIStore((s) => s.setTheme)\n const persistUIPrefs = useUIStore((s) => s.persistUIPrefs)\n const canvasBackground = useSketchStore((s) => s.canvasBackground)\n const setCanvasBackground = useSketchStore((s) => s.setCanvasBackground)\n const clearShapes = useSketchStore((s) => s.clearShapes)\n const clearHistory = useSketchStore((s) => s.clearHistory)\n const gridEnabled = useSketchStore((s) => s.gridEnabled)\n const toggleGrid = useSketchStore((s) => s.toggleGrid)\n\n const viewMode = useSketchStore((s) => s.viewMode)\n const zenMode = useSketchStore((s) => s.zenMode)\n const toolLock = useSketchStore((s) => s.toolLock)\n const snapToObjects = useSketchStore((s) => s.snapToObjects)\n const toggleViewMode = useSketchStore((s) => s.toggleViewMode)\n const toggleZenMode = useSketchStore((s) => s.toggleZenMode)\n const toggleToolLock = useSketchStore((s) => s.toggleToolLock)\n const toggleSnapToObjects = useSketchStore((s) => s.toggleSnapToObjects)\n\n const layoutMode = useSketchStore((s) => s.layoutMode)\n const setLayoutMode = useSketchStore((s) => s.setLayoutMode)\n const handleSetLayout = (mode) => {\n if (mode === layoutMode) return\n setLayoutMode(mode)\n persistLayoutMode(mode)\n }\n\n const isAuthenticated = useAuthStore((s) => s.isAuthenticated)\n const authUser = useAuthStore((s) => s.user)\n const login = useAuthStore((s) => s.login)\n const logout = useAuthStore((s) => s.logout)\n\n const [prefsOpen, setPrefsOpen] = useState(false)\n\n // Menu is always accessible (via floating button in view/zen mode)\n\n const handleOpen = () => {\n const serializer = window.__sceneSerializer\n if (serializer) {\n serializer.upload().then((result) => {\n if (result && result.success) closeMenu()\n else if (result && result.error) {\n console.warn('[Open] Invalid scene file:', result.error)\n }\n })\n }\n closeMenu()\n }\n\n return (\n <>\n {menuOpen && (\n <div\n className=\"fixed inset-0 z-[999]\"\n onClick={() => { closeMenu(); setPrefsOpen(false) }}\n />\n )}\n <div\n className={`absolute top-14 right-4 w-[230px] max-h-[calc(100vh-140px)] overflow-y-auto no-scrollbar bg-surface/75 backdrop-blur-lg rounded-2xl z-[1000] border border-border-light p-1.5 font-[lixFont] text-[13px] transition-all duration-200 ${\n menuOpen\n ? 'opacity-100 blur-0 pointer-events-auto'\n : 'opacity-0 blur-[20px] pointer-events-none'\n }`}\n >\n {/* Open */}\n <button\n onClick={handleOpen}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-folder-open text-sm\" />\n {t('menu.open')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+O</span>\n </button>\n\n {/* Quick Save */}\n <button\n onClick={() => {\n const serializer = window.__sceneSerializer\n if (serializer) {\n const workspaceName = useUIStore.getState().workspaceName || 'Untitled'\n const sceneData = serializer.save(workspaceName)\n const sessionId = window.__sessionID\n const key = sessionId ? `lixsketch-autosave-${sessionId}` : 'lixsketch-autosave'\n localStorage.setItem(key, JSON.stringify(sceneData))\n useUIStore.getState().setSaveStatus('local')\n triggerCloudSync()\n }\n closeMenu()\n }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-check-circle text-sm\" />\n {t('menu.quickSave')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+S</span>\n </button>\n\n {/* Save & Share */}\n <button\n onClick={() => { toggleSaveModal(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-save text-sm\" />\n {t('menu.saveShare')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+Shift+S</span>\n </button>\n\n {/* Export Image */}\n <button\n onClick={() => { toggleExportImageModal(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-image text-sm\" />\n {t('menu.exportImage')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+Shift+E</span>\n </button>\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Commands - highlighted */}\n <button\n onClick={() => { toggleCommandPalette(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-2 rounded-lg text-xs transition-all duration-200 text-accent-blue bg-accent-blue/10 hover:bg-accent-blue/20 cursor-pointer\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-command text-sm\" />\n {t('menu.commands')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+/</span>\n </button>\n\n {/* Find Text */}\n <button\n onClick={() => { useUIStore.getState().toggleFindBar(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-search text-sm\" />\n {t('menu.findText')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+F</span>\n </button>\n\n {/* Canvas Properties */}\n <button\n onClick={() => { useUIStore.getState().toggleCanvasProperties(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-info-circle text-sm\" />\n {t('menu.canvasProperties')}\n </span>\n </button>\n\n {/* Help */}\n <button\n onClick={() => { toggleHelpModal(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-help-circle text-sm\" />\n {t('menu.help')}\n </span>\n </button>\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Document layout */}\n <div className=\"px-3 py-1.5\">\n <p className=\"text-text-dim text-[10px] uppercase tracking-wider mb-1.5 flex items-center gap-1.5\">\n <i className=\"bx bx-file-blank text-[11px]\" />\n Document\n </p>\n <div className=\"flex items-center gap-1 bg-surface/60 border border-border-light rounded-lg p-0.5\">\n {[\n { key: 'canvas', icon: 'bx-pen', label: 'Canvas' },\n { key: 'split', icon: 'bx-layout', label: 'Split' },\n { key: 'docs', icon: 'bxs-notepad', label: 'Docs' },\n ].map((m) => {\n const active = layoutMode === m.key\n return (\n <button\n key={m.key}\n onClick={() => handleSetLayout(m.key)}\n title={m.label}\n className={`flex-1 flex items-center justify-center gap-1 h-6 rounded-md text-[10.5px] transition-all duration-150 ${\n active\n ? 'bg-accent-blue text-text-primary'\n : 'text-text-muted hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <i className={`bx ${m.icon} text-[11px]`} />\n {m.label}\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Sync doc now (Ctrl+S triggers both, but explicit action is useful from menu) */}\n <button\n onClick={() => {\n triggerCloudSync()\n triggerDocCloudSync()\n closeMenu()\n }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-cloud-upload text-sm\" />\n Sync canvas + doc\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+S</span>\n </button>\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Preferences - inline expandable */}\n <button\n onClick={() => setPrefsOpen((p) => !p)}\n className={`w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200 ${prefsOpen ? 'bg-surface-hover' : ''}`}\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-cog text-sm\" />\n {t('menu.preferences')}\n </span>\n <i className={`bx bx-chevron-down text-sm text-text-dim transition-transform duration-150 ${prefsOpen ? 'rotate-180' : ''}`} />\n </button>\n\n {prefsOpen && (\n <div className=\"ml-2 border-l border-border-light pl-1\">\n {/* Language Switcher */}\n <div className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[11px] transition-all duration-200\">\n <span className=\"flex items-center gap-2\">\n {t('prefs.language')}\n </span>\n <select \n className=\"bg-surface-hover text-text-primary text-[10px] rounded px-1 outline-none border border-border-light\"\n value={language}\n onChange={(e) => persistUIPrefs({ language: e.target.value })}\n >\n <option value=\"en\">English</option>\n <option value=\"bg\">\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438</option>\n <option value=\"de\">Deutsch</option>\n </select>\n </div>\n \n {PREFERENCE_ITEMS.map((item) => {\n const isActive =\n (item.id === 'toolLock' && toolLock) ||\n (item.id === 'snapObjects' && snapToObjects) ||\n (item.id === 'toggleGrid' && gridEnabled) ||\n (item.id === 'zenMode' && zenMode) ||\n (item.id === 'viewMode' && viewMode) ||\n (item.toggle) // arrow binding, snap midpoints default on\n\n const handleClick = () => {\n if (item.id === 'toolLock') toggleToolLock()\n else if (item.id === 'snapObjects') toggleSnapToObjects()\n else if (item.id === 'toggleGrid') toggleGrid()\n else if (item.id === 'zenMode') { toggleZenMode(); closeMenu() }\n else if (item.id === 'viewMode') { toggleViewMode(); closeMenu() }\n }\n\n return (\n <button\n key={item.id}\n onClick={handleClick}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[11px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n {isActive && (\n <i className=\"bx bx-check text-sm text-accent-blue\" />\n )}\n {item.label}\n </span>\n {item.shortcut && (\n <span className=\"text-text-dim text-[10px]\">{item.shortcut}</span>\n )}\n </button>\n )\n })}\n </div>\n )}\n\n {/* Grid toggle */}\n <button\n onClick={toggleGrid}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-grid-alt text-sm\" />\n {t('menu.showGrid')}\n </span>\n <div className={`w-7 h-4 rounded-full transition-all duration-150 relative ${gridEnabled ? 'bg-accent-blue' : 'bg-white/10'}`}>\n <div className={`absolute top-0.5 w-3 h-3 rounded-full bg-white transition-all duration-150 ${gridEnabled ? 'left-3.5' : 'left-0.5'}`} />\n </div>\n </button>\n\n {/* Reset The Canvas */}\n <button\n onClick={() => {\n const serializer = window.__sceneSerializer\n if (serializer?.resetCanvas) serializer.resetCanvas()\n clearShapes(); clearHistory(); closeMenu()\n }}\n className=\"w-full flex items-center justify-between px-3 py-2 rounded-lg text-red-400 text-xs hover:bg-red-500/10 cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-reset text-sm\" />\n {t('menu.resetCanvas')}\n </span>\n </button>\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Links */}\n {LINKS.map((link) => {\n const isExternal = link.href.startsWith('http')\n return (\n <a\n key={link.label}\n href={link.href}\n {...(isExternal ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n onClick={closeMenu}\n className=\"w-full flex items-center gap-2 px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <i className={`bx ${link.icon} text-sm`} />\n {link.label}\n </a>\n )\n })}\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Sign In / Sign Out */}\n {isAuthenticated ? (\n <>\n <div className=\"px-3 py-2 flex items-center gap-2\">\n {authUser?.avatar ? (\n <img src={authUser.avatar} alt=\"\" className=\"w-5 h-5 rounded-full\" />\n ) : (\n <i className=\"bx bx-user-circle text-sm text-accent-blue\" />\n )}\n <span className=\"text-text-secondary text-xs truncate flex-1\">{authUser?.displayName || authUser?.email}</span>\n </div>\n <button\n onClick={() => { logout(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-2 rounded-lg text-xs transition-all duration-200 text-red-400 hover:bg-red-500/10 cursor-pointer\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-log-out text-sm\" />\n {t('menu.signOut')}\n </span>\n </button>\n </>\n ) : (\n <button\n onClick={() => { login(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-2 rounded-lg text-xs transition-all duration-200 text-text-secondary hover:bg-surface-hover\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-log-in text-sm\" />\n {t('menu.signIn')}\n </span>\n <span className=\"text-text-dim text-[10px] px-1.5 py-0.5 rounded bg-accent-blue/15 text-accent-blue\">Elixpo</span>\n </button>\n )}\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Theme toggle */}\n <div className=\"px-3 py-2\">\n <p className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">\n {t('menu.theme')}\n </p>\n <div className=\"flex items-center gap-1\">\n {[\n { value: 'light', icon: 'bxs-sun' },\n { value: 'dark', icon: 'bxs-moon' },\n { value: 'system', icon: 'bx-laptop' },\n ].map((t) => (\n <button\n key={t.value}\n onClick={() => setTheme(t.value)}\n className={`flex-1 flex items-center justify-center py-1.5 rounded-lg text-xs cursor-pointer transition-all duration-200 ${\n theme === t.value\n ? 'bg-accent text-text-primary'\n : 'text-text-muted hover:bg-surface-hover'\n }`}\n >\n <i className={`bx ${t.icon} text-sm`} />\n </button>\n ))}\n </div>\n </div>\n\n {/* Canvas background */}\n <div className=\"px-3 py-2\">\n <p className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">\n {t('menu.canvasBackground')}\n </p>\n <div className=\"flex items-center gap-1.5\">\n {(theme === 'dark' ? CANVAS_BACKGROUNDS_DARK : CANVAS_BACKGROUNDS_LIGHT).map((bg) => (\n <button\n key={bg.color}\n onClick={() => setCanvasBackground(bg.color)}\n title={t(bg.label)}\n className={`w-7 h-7 rounded-full border-2 cursor-pointer transition-all duration-200 ${\n canvasBackground === bg.color\n ? 'border-accent scale-110'\n : 'border-border hover:border-border-light'\n }`}\n style={{ backgroundColor: bg.color }}\n />\n ))}\n </div>\n </div>\n </div>\n </>\n )\n}\n", "// Lightweight i18n stub for the offline package. Converts dotted keys\n// into readable labels so consumers don't have to ship a full translation\n// table just to get nice button names. A real `t()` from the host can be\n// passed in via `options.t` if needed (LixSketchCanvas can wire it up\n// later).\n//\n// t('sidebar.sectionHeader.stroke') \u2192 'Stroke'\n// t('sidebar.bringForward') \u2192 'Bring forward'\n// t('menu.canvasBackground') \u2192 'Canvas background'\n// t('shortcuts.deselect', 'Deselect') \u2192 'Deselect' (fallback wins)\n\n// Hand-written overrides for keys that don't reduce cleanly from the\n// last segment alone (acronyms, hyphens, multi-word phrases).\nconst OVERRIDES = {\n 'sidebar.sectionHeader.stroke': 'Stroke',\n 'sidebar.sectionHeader.fill': 'Fill',\n 'sidebar.sectionHeader.background': 'Background',\n 'sidebar.sectionHeader.backgroundImage': 'Background image',\n 'sidebar.sectionHeader.width': 'Width',\n 'sidebar.sectionHeader.edge': 'Edge style',\n 'sidebar.sectionHeader.head': 'Arrow head',\n 'sidebar.sectionHeader.type': 'Type',\n 'sidebar.sectionHeader.name': 'Name',\n 'sidebar.sectionHeader.color': 'Color',\n 'sidebar.sectionHeader.fit': 'Fit',\n 'sidebar.sectionHeader.roughness': 'Roughness',\n 'sidebar.sectionHeader.sloppiness': 'Sloppiness',\n 'sidebar.sectionHeader.taper': 'Taper',\n 'menu.canvasBackground': 'Canvas background',\n 'menu.canvasProperties': 'Canvas properties',\n 'menu.exportImage': 'Export as image',\n 'menu.findText': 'Find text',\n 'menu.quickSave': 'Quick save',\n 'menu.resetCanvas': 'Reset canvas',\n 'menu.saveShare': 'Save & share',\n 'menu.showGrid': 'Show grid',\n 'menu.signIn': 'Sign in',\n 'menu.signOut': 'Sign out',\n 'prefs.toolLock': 'Tool lock',\n 'prefs.toggleGrid': 'Toggle grid',\n 'prefs.snapObjects': 'Snap to objects',\n 'prefs.snapMidpoints': 'Snap to midpoints',\n 'prefs.zenMode': 'Zen mode',\n 'prefs.viewMode': 'View mode',\n 'prefs.canvasShapeProps': 'Canvas & shape properties',\n 'prefs.arrowBinding': 'Arrow binding',\n 'prefs.language': 'Language',\n 'sidebar.bringForward': 'Bring forward',\n 'sidebar.bringToFront': 'Bring to front',\n 'sidebar.sendBackward': 'Send backward',\n 'sidebar.sendToBack': 'Send to back',\n 'sidebar.fillColor': 'Fill color',\n 'sidebar.strokeColor': 'Stroke color',\n 'sidebar.codeMode': 'Code mode',\n 'sidebar.renderText': 'Render text',\n 'sidebar.newLine': 'New line',\n};\n\nfunction camelToWords(s) {\n return s.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/-/g, ' ');\n}\n\nfunction autoFormat(key) {\n const last = key.split('.').pop() || key;\n const words = camelToWords(last);\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\nfunction tImpl(key, fallbackOrOpts) {\n if (typeof key !== 'string') return fallbackOrOpts ?? '';\n // The product calls t() with various signatures: (key), (key, fallback),\n // (key, { defaultValue }). Handle all of them.\n let fallback = '';\n if (typeof fallbackOrOpts === 'string') {\n fallback = fallbackOrOpts;\n } else if (fallbackOrOpts && typeof fallbackOrOpts === 'object') {\n fallback = fallbackOrOpts.defaultValue || '';\n }\n if (fallback) return fallback;\n if (OVERRIDES[key]) return OVERRIDES[key];\n return autoFormat(key);\n}\n\nexport function useTranslation() {\n return {\n t: tImpl,\n locale: 'en',\n setLocale: () => {},\n };\n}\n\nexport default useTranslation;\n", "\"use client\"\n\nimport { useState, useRef, useEffect } from 'react'\nimport useSketchStore from '../../store/useSketchStore'\n\n/**\n * A toolbar button that opens a popover panel above it on click.\n * Shows an icon (or custom preview) in the bar, popover shows full options.\n */\nexport function ToolbarButton({ icon, preview, children, tooltip }) {\n const [open, setOpen] = useState(false)\n const ref = useRef(null)\n\n // Close on outside click\n useEffect(() => {\n if (!open) return\n const handler = (e) => {\n if (ref.current && !ref.current.contains(e.target)) setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative flex items-center\">\n <button\n onClick={() => setOpen(!open)}\n title={tooltip}\n className={`h-9 flex items-center gap-1.5 px-3 rounded-lg transition-all duration-100 ${\n open\n ? 'bg-surface-active text-text-primary'\n : 'text-text-muted hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {preview || (icon && <i className={`bx ${icon} text-base`} />)}\n <svg className={`w-2 h-2 opacity-40 transition-transform duration-100 ${open ? 'rotate-180' : ''}`} viewBox=\"0 0 8 5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M1 1l3 3 3-3\" />\n </svg>\n </button>\n\n {open && (\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-3 z-20\">\n <div className=\"bg-surface-card border border-border-light rounded-xl p-3 shadow-xl shadow-black/10 min-w-max\">\n {children}\n </div>\n {/* Arrow pointer */}\n <div className=\"absolute -bottom-[5px] left-1/2 -translate-x-1/2 w-2.5 h-2.5 rotate-45 bg-surface-card border-r border-b border-border-light\" />\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Simple toolbar divider\n */\nfunction Divider() {\n return <div className=\"w-px h-5 bg-surface-hover mx-0.5 shrink-0\" />\n}\n\n/**\n * Bottom toolbar container - appears when tool/shape is active\n */\nexport default function ShapeSidebar({ visible, children }) {\n const viewMode = useSketchStore((s) => s.viewMode)\n const show = visible && !viewMode\n\n return (\n <div\n className={`absolute bottom-14 left-1/2 -translate-x-1/2 bg-surface border border-border-light rounded-xl px-2 py-1.5 z-[999] font-[lixFont] transition-all duration-200 ${\n show\n ? 'opacity-100 pointer-events-auto translate-y-0'\n : 'opacity-0 pointer-events-none translate-y-2'\n }`}\n >\n <div className=\"flex items-center gap-0.5\">\n {children}\n </div>\n </div>\n )\n}\n\n/**\n * Layer ordering controls - add to any shape sidebar\n */\nimport { useTranslation } from '../../hooks/useTranslation'\n\nfunction LayerControls() {\n const { t } = useTranslation()\n const doLayer = (method) => {\n const shape = window.currentShape\n if (!shape || !window.__layerOrder) return\n window.__layerOrder[method](shape)\n }\n\n return (\n <div className=\"flex items-center gap-0.5\">\n <button\n onClick={() => doLayer('sendToBack')}\n title={t('sidebar.sendToBack', { defaultValue: 'Send to back' })}\n className=\"h-9 w-8 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-100\"\n >\n <i className=\"bx bx-chevrons-down text-base\" />\n </button>\n <button\n onClick={() => doLayer('sendBackward')}\n title={t('sidebar.sendBackward')}\n className=\"h-9 w-8 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-100\"\n >\n <i className=\"bx bx-chevron-down text-base\" />\n </button>\n <button\n onClick={() => doLayer('bringForward')}\n title={t('sidebar.bringForward')}\n className=\"h-9 w-8 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-100\"\n >\n <i className=\"bx bx-chevron-up text-base\" />\n </button>\n <button\n onClick={() => doLayer('bringToFront')}\n title={t('sidebar.bringToFront', { defaultValue: 'Bring to front' })}\n className=\"h-9 w-8 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-100\"\n >\n <i className=\"bx bx-chevrons-up text-base\" />\n </button>\n </div>\n )\n}\n\nexport { Divider, LayerControls }\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst STROKE_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\nconst BG_COLORS = ['transparent', '#f0f0f0', '#ffcccb', '#90ee90', '#add8e6', '#FFE4B5', '#DDA0DD', '#2d2d2d']\n\nconst FILLS = [\n { value: 'hachure', label: 'sidebar.fill.hachure' },\n { value: 'solid', label: 'sidebar.fill.solid' },\n { value: 'dots', label: 'sidebar.fill.dots' },\n { value: 'cross-hatch', label: 'sidebar.fill.cross' },\n { value: 'transparent', label: 'sidebar.fill.none' },\n]\n\nfunction ColorGrid({ colors, selected, onSelect }) {\n return (\n <div className=\"grid grid-cols-4 gap-1.5\">\n {colors.map((c) => {\n const isTrans = c === 'transparent'\n return (\n <button\n key={c}\n onClick={() => onSelect(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${\n selected === c ? 'border-[#5B57D1] scale-110' : 'border-white/[0.08] hover:border-white/20'\n }`}\n style={!isTrans ? { backgroundColor: c } : undefined}\n >\n {isTrans && (\n <svg className=\"w-full h-full text-text-dim\" viewBox=\"0 0 20 20\">\n <line x1=\"4\" y1=\"16\" x2=\"16\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n )}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport default function RectangleSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [strokeColor, setStrokeColor] = useState('#fff')\n const [bgColor, setBgColor] = useState('transparent')\n const [thickness, setThickness] = useState(2)\n const [lineStyle, setLineStyle] = useState('solid')\n const [fillStyle, setFillStyle] = useState('hachure')\n\n const update = useCallback((changes, localSetters) => {\n Object.entries(localSetters).forEach(([, fn]) => fn())\n if (window.updateSelectedRectStyle) window.updateSelectedRectStyle(changes)\n }, [])\n\n const updateStroke = useCallback((v) => { setStrokeColor(v); if (window.updateSelectedRectStyle) window.updateSelectedRectStyle({ stroke: v }) }, [])\n const updateBg = useCallback((v) => { setBgColor(v); if (window.updateSelectedRectStyle) window.updateSelectedRectStyle({ fill: v }) }, [])\n const updateThickness = useCallback((v) => { setThickness(v); if (window.updateSelectedRectStyle) window.updateSelectedRectStyle({ strokeWidth: v }) }, [])\n const updateStyle = useCallback((v) => { setLineStyle(v); if (window.updateSelectedRectStyle) window.updateSelectedRectStyle({ outlineStyle: v }) }, [])\n const updateFill = useCallback((v) => { setFillStyle(v); if (window.updateSelectedRectStyle) window.updateSelectedRectStyle({ fillStyle: v }) }, [])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.RECTANGLE || selectedShapeSidebar === 'rectangle'}>\n {/* Stroke color */}\n <ToolbarButton\n tooltip={t('sidebar.strokeColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: strokeColor }} />}\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.stroke')}</p>\n <ColorGrid colors={STROKE_COLORS} selected={strokeColor} onSelect={updateStroke} />\n </ToolbarButton>\n\n <Divider />\n\n {/* Background */}\n <ToolbarButton\n tooltip={t('sidebar.fillColor')}\n preview={\n <span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: bgColor === 'transparent' ? 'transparent' : bgColor }}>\n {bgColor === 'transparent' && (\n <svg className=\"w-full h-full text-text-dim\" viewBox=\"0 0 16 16\"><line x1=\"2\" y1=\"14\" x2=\"14\" y2=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" /></svg>\n )}\n </span>\n }\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.background')}</p>\n <ColorGrid colors={BG_COLORS} selected={bgColor} onSelect={updateBg} />\n </ToolbarButton>\n\n <Divider />\n\n {/* Thickness */}\n <ToolbarButton icon=\"bxs-edit-alt\" tooltip={t('sidebar.strokeWidth')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.width')}</p>\n <div className=\"flex items-center gap-1\">\n {[1, 2, 4, 7].map((w) => (\n <button\n key={w}\n onClick={() => updateThickness(w)}\n className={`w-9 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${\n thickness === w ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-muted hover:bg-white/[0.06]'\n }`}\n >\n <div className=\"w-5 rounded-full bg-current\" style={{ height: Math.max(1, w) }} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n {/* Stroke style */}\n <ToolbarButton icon=\"bxs-minus-circle\" tooltip=\"Stroke style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.style')}</p>\n <div className=\"flex items-center gap-1\">\n {[\n { v: 'solid', d: '' },\n { v: 'dashed', d: '6 4' },\n { v: 'dotted', d: '2 3' },\n ].map((s) => (\n <button\n key={s.v}\n onClick={() => updateStyle(s.v)}\n className={`w-11 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${\n lineStyle === s.v ? 'bg-[#5B57D1]/20' : 'hover:bg-white/[0.06]'\n }`}\n >\n <svg width=\"28\" height=\"4\" viewBox=\"0 0 28 4\">\n <line x1=\"0\" y1=\"2\" x2=\"28\" y2=\"2\" stroke=\"#fff\" strokeWidth=\"2\" strokeDasharray={s.d} strokeLinecap=\"round\" />\n </svg>\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n {/* Fill pattern */}\n <ToolbarButton icon=\"bxs-brush\" tooltip=\"Fill style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.fill')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {FILLS.map((f) => (\n <button\n key={f.value}\n onClick={() => updateFill(f.value)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${\n fillStyle === f.value ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'\n }`}\n >\n <span className=\"w-1.5 h-1.5 rounded-full bg-current\" />\n {t(f.label)}\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst STROKE_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\nconst BG_COLORS = ['transparent', '#f0f0f0', '#ffcccb', '#90ee90', '#add8e6', '#FFE4B5', '#DDA0DD', '#2d2d2d']\n\nconst FILLS = [\n { value: 'hachure', label: 'sidebar.fill.hachure' },\n { value: 'solid', label: 'sidebar.fill.solid' },\n { value: 'dots', label: 'sidebar.fill.dots' },\n { value: 'cross-hatch', label: 'sidebar.fill.cross' },\n { value: 'transparent', label: 'sidebar.fill.none' },\n]\n\nfunction ColorGrid({ colors, selected, onSelect }) {\n return (\n <div className=\"grid grid-cols-4 gap-1.5\">\n {colors.map((c) => {\n const isTrans = c === 'transparent'\n return (\n <button\n key={c}\n onClick={() => onSelect(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${\n selected === c ? 'border-accent-blue scale-110' : 'border-white/[0.08] hover:border-white/20'\n }`}\n style={!isTrans ? { backgroundColor: c } : undefined}\n >\n {isTrans && (\n <svg className=\"w-full h-full text-text-dim\" viewBox=\"0 0 20 20\">\n <line x1=\"4\" y1=\"16\" x2=\"16\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n )}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport default function CircleSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [strokeColor, setStrokeColor] = useState('#fff')\n const [bgColor, setBgColor] = useState('transparent')\n const [thickness, setThickness] = useState(2)\n const [lineStyle, setLineStyle] = useState('solid')\n const [fillStyle, setFillStyle] = useState('hachure')\n\n const updateStroke = useCallback((v) => { setStrokeColor(v); if (window.updateSelectedCircleStyle) window.updateSelectedCircleStyle({ stroke: v }) }, [])\n const updateBg = useCallback((v) => { setBgColor(v); if (window.updateSelectedCircleStyle) window.updateSelectedCircleStyle({ fill: v }) }, [])\n const updateThickness = useCallback((v) => { setThickness(v); if (window.updateSelectedCircleStyle) window.updateSelectedCircleStyle({ strokeWidth: v }) }, [])\n const updateStyle = useCallback((v) => { setLineStyle(v); if (window.updateSelectedCircleStyle) window.updateSelectedCircleStyle({ outlineStyle: v }) }, [])\n const updateFill = useCallback((v) => { setFillStyle(v); if (window.updateSelectedCircleStyle) window.updateSelectedCircleStyle({ fillStyle: v }) }, [])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.CIRCLE || selectedShapeSidebar === 'circle'}>\n <ToolbarButton\n tooltip={t('sidebar.strokeColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: strokeColor }} />}\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.stroke')}</p>\n <ColorGrid colors={STROKE_COLORS} selected={strokeColor} onSelect={updateStroke} />\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton\n tooltip={t('sidebar.fillColor')}\n preview={\n <span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: bgColor === 'transparent' ? 'transparent' : bgColor }}>\n {bgColor === 'transparent' && <svg className=\"w-full h-full text-text-dim\" viewBox=\"0 0 16 16\"><line x1=\"2\" y1=\"14\" x2=\"14\" y2=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" /></svg>}\n </span>\n }\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.background')}</p>\n <ColorGrid colors={BG_COLORS} selected={bgColor} onSelect={updateBg} />\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-edit-alt\" tooltip={t('sidebar.strokeWidth')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.width')}</p>\n <div className=\"flex items-center gap-1\">\n {[1, 2, 4, 7].map((w) => (\n <button key={w} onClick={() => updateThickness(w)}\n className={`w-9 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${thickness === w ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-muted hover:bg-white/[0.06]'}`}\n >\n <div className=\"w-5 rounded-full bg-current\" style={{ height: Math.max(1, w) }} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-minus-circle\" tooltip=\"Stroke style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.style')}</p>\n <div className=\"flex items-center gap-1\">\n {[{ v: 'solid', d: '' }, { v: 'dashed', d: '6 4' }, { v: 'dotted', d: '2 3' }].map((s) => (\n <button key={s.v} onClick={() => updateStyle(s.v)}\n className={`w-11 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${lineStyle === s.v ? 'bg-[#5B57D1]/20' : 'hover:bg-white/[0.06]'}`}\n >\n <svg width=\"28\" height=\"4\" viewBox=\"0 0 28 4\"><line x1=\"0\" y1=\"2\" x2=\"28\" y2=\"2\" stroke=\"#fff\" strokeWidth=\"2\" strokeDasharray={s.d} strokeLinecap=\"round\" /></svg>\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-brush\" tooltip=\"Fill style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.fill')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {FILLS.map((f) => (\n <button key={f.value} onClick={() => updateFill(f.value)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${fillStyle === f.value ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <span className=\"w-1.5 h-1.5 rounded-full bg-current\" />\n {t(f.label)}\n </button>\n ))}\n </div>\n </ToolbarButton>\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst STROKE_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\n\nfunction ColorGrid({ colors, selected, onSelect }) {\n return (\n <div className=\"grid grid-cols-4 gap-1.5\">\n {colors.map((c) => (\n <button key={c} onClick={() => onSelect(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${selected === c ? 'border-[#5B57D1] scale-110' : 'border-white/[0.08] hover:border-white/20'}`}\n style={{ backgroundColor: c }}\n />\n ))}\n </div>\n )\n}\n\nexport default function LineSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [strokeColor, setStrokeColor] = useState('#fff')\n const [thickness, setThickness] = useState(2)\n const [lineStyle, setLineStyle] = useState('solid')\n const [sloppiness, setSloppiness] = useState(0)\n const [edge, setEdge] = useState('smooth')\n\n const updateStroke = useCallback((v) => { setStrokeColor(v); if (window.updateSelectedLineStyle) window.updateSelectedLineStyle({ stroke: v }) }, [])\n const updateThickness = useCallback((v) => { setThickness(v); if (window.updateSelectedLineStyle) window.updateSelectedLineStyle({ strokeWidth: v }) }, [])\n const updateStyle = useCallback((v) => { setLineStyle(v); if (window.updateSelectedLineStyle) window.updateSelectedLineStyle({ strokeStyle: v }) }, [])\n const updateSloppiness = useCallback((v) => { setSloppiness(v); if (window.updateSelectedLineStyle) window.updateSelectedLineStyle({ sloppiness: v }) }, [])\n const updateEdge = useCallback((v) => { setEdge(v); if (window.updateSelectedLineStyle) window.updateSelectedLineStyle({ edge: v === 'smooth' ? 1 : 5 }) }, [])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.LINE || selectedShapeSidebar === 'line'}>\n <ToolbarButton tooltip={t('sidebar.strokeColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: strokeColor }} />}\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.stroke')}</p>\n <ColorGrid colors={STROKE_COLORS} selected={strokeColor} onSelect={updateStroke} />\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-edit-alt\" tooltip={t('sidebar.strokeWidth')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.width')}</p>\n <div className=\"flex items-center gap-1\">\n {[1, 2, 4, 7].map((w) => (\n <button key={w} onClick={() => updateThickness(w)}\n className={`w-9 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${thickness === w ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-muted hover:bg-white/[0.06]'}`}\n >\n <div className=\"w-5 rounded-full bg-current\" style={{ height: Math.max(1, w) }} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-minus-circle\" tooltip=\"Stroke style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.style')}</p>\n <div className=\"flex items-center gap-1\">\n {[{ v: 'solid', d: '' }, { v: 'dashed', d: '6 4' }, { v: 'dotted', d: '2 3' }].map((s) => (\n <button key={s.v} onClick={() => updateStyle(s.v)}\n className={`w-11 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${lineStyle === s.v ? 'bg-[#5B57D1]/20' : 'hover:bg-white/[0.06]'}`}\n >\n <svg width=\"28\" height=\"4\" viewBox=\"0 0 28 4\"><line x1=\"0\" y1=\"2\" x2=\"28\" y2=\"2\" stroke=\"#fff\" strokeWidth=\"2\" strokeDasharray={s.d} strokeLinecap=\"round\" /></svg>\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-shape-polygon\" tooltip=\"Sloppiness\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.sloppiness')}</p>\n <div className=\"flex items-center gap-1\">\n {[{ v: 0, l: '0' }, { v: 2, l: '2' }, { v: 4, l: '4' }].map((s) => (\n <button key={s.v} onClick={() => updateSloppiness(s.v)}\n className={`w-8 h-8 flex items-center justify-center rounded-lg text-xs transition-all duration-100 ${sloppiness === s.v ? 'bg-[#5B57D1]/20 text-accent-blue' : 'text-text-muted hover:bg-white/6'}`}\n >{s.l}</button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-landscape\" tooltip=\"Edge\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.edge')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {[{ v: 'smooth', i: 'bxs-droplet', l: 'Smooth' }, { v: 'rough', i: 'bxs-bolt', l: 'Rough' }].map((e) => (\n <button key={e.v} onClick={() => updateEdge(e.v)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${edge === e.v ? 'bg-accent-blue text-white' : 'text-text-secondary hover:bg-white/6'}`}\n >\n <i className={`bx ${e.i} text-sm`} /> {e.l}\n </button>\n ))}\n </div>\n </ToolbarButton>\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst STROKE_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\n\nconst HEAD_STYLES = [\n { value: 'default', svg: '<svg width=\"22\" height=\"12\" viewBox=\"0 0 24 14\"><line x1=\"2\" y1=\"7\" x2=\"16\" y2=\"7\" stroke=\"#fff\" stroke-width=\"2\"/><polyline points=\"13,2 19,7 13,12\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2\" stroke-linejoin=\"round\"/></svg>' },\n { value: 'square', svg: '<svg width=\"22\" height=\"12\" viewBox=\"0 0 24 14\"><line x1=\"2\" y1=\"7\" x2=\"14\" y2=\"7\" stroke=\"#fff\" stroke-width=\"2\"/><rect x=\"14\" y=\"3\" width=\"6\" height=\"8\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.5\"/></svg>' },\n { value: 'outline', svg: '<svg width=\"22\" height=\"12\" viewBox=\"0 0 24 14\"><line x1=\"2\" y1=\"7\" x2=\"13\" y2=\"7\" stroke=\"#fff\" stroke-width=\"2\"/><polygon points=\"13,2 21,7 13,12\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.5\"/></svg>' },\n { value: 'solid', svg: '<svg width=\"22\" height=\"12\" viewBox=\"0 0 24 14\"><line x1=\"2\" y1=\"7\" x2=\"13\" y2=\"7\" stroke=\"#fff\" stroke-width=\"2\"/><polygon points=\"13,2 21,7 13,12\" fill=\"#fff\"/></svg>' },\n]\n\nfunction SvgIcon({ svg }) {\n return <span dangerouslySetInnerHTML={{ __html: svg }} />\n}\n\nfunction ColorGrid({ colors, selected, onSelect }) {\n return (\n <div className=\"grid grid-cols-4 gap-1.5\">\n {colors.map((c) => (\n <button key={c} onClick={() => onSelect(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${selected === c ? 'border-[#5B57D1] scale-110' : 'border-white/[0.08] hover:border-white/20'}`}\n style={{ backgroundColor: c }}\n />\n ))}\n </div>\n )\n}\n\nexport default function ArrowSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [headStyle, setHeadStyle] = useState('default')\n const [strokeColor, setStrokeColor] = useState('#fff')\n const [thickness, setThickness] = useState(2)\n const [outlineStyle, setOutlineStyle] = useState('solid')\n const [arrowType, setArrowType] = useState('straight')\n const [curvature, setCurvature] = useState(20)\n\n // Bridge helpers: update React state + engine state + selected arrow\n const updateHead = useCallback((v) => {\n setHeadStyle(v)\n if (window.arrowToolSettings) window.arrowToolSettings.headStyle = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ arrowHeadStyle: v })\n }, [])\n\n const updateStroke = useCallback((v) => {\n setStrokeColor(v)\n if (window.arrowToolSettings) window.arrowToolSettings.strokeColor = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ stroke: v })\n }, [])\n\n const updateThickness = useCallback((v) => {\n setThickness(v)\n if (window.arrowToolSettings) window.arrowToolSettings.strokeWidth = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ strokeWidth: v })\n }, [])\n\n const updateOutline = useCallback((v) => {\n setOutlineStyle(v)\n if (window.arrowToolSettings) window.arrowToolSettings.outlineStyle = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ arrowOutlineStyle: v })\n }, [])\n\n const updateType = useCallback((v) => {\n setArrowType(v)\n if (window.arrowToolSettings) window.arrowToolSettings.arrowCurved = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ arrowCurved: v })\n }, [])\n\n const updateCurvature = useCallback((v) => {\n setCurvature(v)\n if (window.arrowToolSettings) window.arrowToolSettings.curveAmount = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ arrowCurveAmount: v })\n }, [])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.ARROW || selectedShapeSidebar === 'arrow'}>\n {/* Head style */}\n <ToolbarButton icon=\"bxs-right-arrow\" tooltip=\"Arrow head\">\n <p className=\"text-xs text-text-secondary uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.head')}</p>\n <div className=\"flex items-center gap-1\">\n {HEAD_STYLES.map((h) => (\n <button key={h.value} onClick={() => updateHead(h.value)}\n className={`w-10 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${headStyle === h.value ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <SvgIcon svg={h.svg} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton tooltip={t('sidebar.strokeColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: strokeColor }} />}\n >\n <p className=\"text-xs text-text-secondary uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.stroke')}</p>\n <ColorGrid colors={STROKE_COLORS} selected={strokeColor} onSelect={updateStroke} />\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-edit-alt\" tooltip={t('sidebar.strokeWidth')}>\n <p className=\"text-xs text-text-secondary uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.width')}</p>\n <div className=\"flex items-center gap-1\">\n {[1, 2, 4, 7].map((w) => (\n <button key={w} onClick={() => updateThickness(w)}\n className={`w-9 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${thickness === w ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <div className=\"w-5 rounded-full bg-current\" style={{ height: Math.max(1, w) }} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-minus-circle\" tooltip=\"Stroke style\">\n <p className=\"text-xs text-text-secondary uppercase tracking-wider mb-2\">{t('sidebar.style')}</p>\n <div className=\"flex items-center gap-1\">\n {[{ v: 'solid', d: '' }, { v: 'dashed', d: '6 4' }, { v: 'dotted', d: '2 3' }].map((s) => (\n <button key={s.v} onClick={() => updateOutline(s.v)}\n className={`w-11 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${outlineStyle === s.v ? 'bg-[#5B57D1]/20' : 'hover:bg-white/[0.06]'}`}\n >\n <svg width=\"28\" height=\"4\" viewBox=\"0 0 28 4\"><line x1=\"0\" y1=\"2\" x2=\"28\" y2=\"2\" stroke=\"#fff\" strokeWidth=\"2\" strokeDasharray={s.d} strokeLinecap=\"round\" /></svg>\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n {/* Arrow type */}\n <ToolbarButton icon=\"bxs-share-alt\" tooltip=\"Arrow type\">\n <p className=\"text-xs text-text-secondary uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.type')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {[\n { v: 'straight', i: 'bxs-right-arrow-alt', l: 'Straight' },\n { v: 'curved', i: 'bxs-analyse', l: 'Curved' },\n { v: 'elbow', i: 'bxs-network-chart', l: 'Elbow' },\n ].map((a) => (\n <button key={a.v} onClick={() => updateType(a.v)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${arrowType === a.v ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <i className={`bx ${a.i} text-sm`} /> {a.l}\n </button>\n ))}\n {arrowType === 'curved' && (\n <>\n <div className=\"w-full h-px bg-white/[0.08] my-1\" />\n <p className=\"text-[9px] text-text-dim uppercase tracking-wider mb-1\">Curvature</p>\n <div className=\"flex items-center gap-1\">\n {[{ v: 8, l: 'Lo' }, { v: 20, l: 'Md' }, { v: 40, l: 'Hi' }].map((c) => (\n <button key={c.v} onClick={() => updateCurvature(c.v)}\n className={`flex-1 py-1 rounded-md text-xs text-center transition-all duration-100 ${curvature === c.v ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >{c.l}</button>\n ))}\n </div>\n </>\n )}\n </div>\n </ToolbarButton>\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst STROKE_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\n\n// Map taper UI values to perfect-freehand thinning values\nconst TAPER_MAP = { uniform: 0, pen: 0.5, brush: 0.8 }\n\nfunction ColorGrid({ colors, selected, onSelect }) {\n return (\n <div className=\"grid grid-cols-4 gap-1.5\">\n {colors.map((c) => (\n <button key={c} onClick={() => onSelect(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${selected === c ? 'border-[#5B57D1] scale-110' : 'border-white/[0.08] hover:border-white/20'}`}\n style={{ backgroundColor: c }}\n />\n ))}\n </div>\n )\n}\n\nexport default function PaintbrushSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [strokeColor, setStrokeColor] = useState('#fff')\n const [thickness, setThickness] = useState(2)\n const [lineStyle, setLineStyle] = useState('solid')\n const [taper, setTaper] = useState('uniform')\n const [roughness, setRoughness] = useState('smooth')\n const [opacity, setOpacity] = useState(1)\n\n const updateStroke = useCallback((v) => { setStrokeColor(v); if (window.updateSelectedFreehandStyle) window.updateSelectedFreehandStyle({ stroke: v }) }, [])\n const updateThickness = useCallback((v) => { setThickness(v); if (window.updateSelectedFreehandStyle) window.updateSelectedFreehandStyle({ strokeWidth: v }) }, [])\n const updateTaper = useCallback((v) => { setTaper(v); if (window.updateSelectedFreehandStyle) window.updateSelectedFreehandStyle({ thinning: TAPER_MAP[v] }) }, [])\n const updateRoughness = useCallback((v) => { setRoughness(v); if (window.updateSelectedFreehandStyle) window.updateSelectedFreehandStyle({ roughness: v }) }, [])\n const updateOpacity = useCallback((v) => { setOpacity(v); if (window.updateSelectedFreehandStyle) window.updateSelectedFreehandStyle({ opacity: v }) }, [])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.FREEHAND || selectedShapeSidebar === 'paintbrush'}>\n <ToolbarButton tooltip={t('sidebar.strokeColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: strokeColor }} />}\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.stroke')}</p>\n <ColorGrid colors={STROKE_COLORS} selected={strokeColor} onSelect={updateStroke} />\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-edit-alt\" tooltip={t('sidebar.strokeWidth')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.width')}</p>\n <div className=\"flex items-center gap-1\">\n {[1, 2, 4, 7].map((w) => (\n <button key={w} onClick={() => updateThickness(w)}\n className={`w-9 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${thickness === w ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-muted hover:bg-white/[0.06]'}`}\n >\n <div className=\"w-5 rounded-full bg-current\" style={{ height: Math.max(1, w) }} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-pen\" tooltip=\"Taper\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.taper')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {[\n { v: 'uniform', i: 'bxs-minus-circle', l: 'Uniform' },\n { v: 'pen', i: 'bxs-pen', l: 'Pen' },\n { v: 'brush', i: 'bxs-brush', l: 'Brush' },\n ].map((t) => (\n <button key={t.v} onClick={() => updateTaper(t.v)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${taper === t.v ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <i className={`bx ${t.i} text-sm`} /> {t.l}\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-shape-polygon\" tooltip=\"Roughness\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.roughness')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {[\n { v: 'smooth', i: 'bxs-droplet', l: 'Smooth' },\n { v: 'medium', i: 'bxs-leaf', l: 'Medium' },\n { v: 'rough', i: 'bxs-bolt', l: 'Rough' },\n ].map((r) => (\n <button key={r.v} onClick={() => updateRoughness(r.v)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${roughness === r.v ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <i className={`bx ${r.i} text-sm`} /> {r.l}\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-sun\" tooltip={t('sidebar.opacity')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">Opacity {Math.round(opacity * 100)}%</p>\n <input\n type=\"range\" min=\"0\" max=\"1\" step=\"0.05\" value={opacity}\n onChange={(e) => updateOpacity(parseFloat(e.target.value))}\n className=\"w-28 h-1 bg-white/10 rounded-full appearance-none cursor-pointer accent-[#5B57D1]\"\n />\n </ToolbarButton>\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback, useEffect } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst TEXT_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\n\nconst FONTS = [\n { value: 'lixFont', label: 'Lix' },\n { value: 'lixCode', label: 'Code' },\n { value: 'lixDefault', label: 'Default' },\n { value: 'lixFancy', label: 'Fancy' },\n]\n\nconst SIZE_MAP = { S: '20px', M: '30px', L: '48px', XL: '72px' }\n\nconst LANGUAGES = [\n 'javascript', 'typescript', 'python', 'java', 'c', 'cpp', 'csharp',\n 'go', 'rust', 'ruby', 'php', 'swift', 'kotlin', 'html', 'css',\n 'sql', 'bash', 'json', 'yaml', 'markdown',\n]\n\nexport default function TextSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [textColor, setTextColor] = useState('#fff')\n const [fontSize, setFontSize] = useState('M')\n const [font, setFont] = useState('lixFont')\n const [codeMode, setCodeMode] = useState(false)\n const [language, setLanguage] = useState('javascript')\n\n // Sync code mode state from engine when a shape is selected\n useEffect(() => {\n window.__onCodeModeChanged = (isCode) => {\n setCodeMode(isCode)\n window.isTextInCodeMode = isCode\n }\n return () => { window.__onCodeModeChanged = null }\n }, [])\n\n const updateColor = useCallback((c) => {\n setTextColor(c)\n if (window.updateSelectedTextStyle) window.updateSelectedTextStyle({ color: c })\n }, [])\n\n const updateFont = useCallback((f) => {\n setFont(f)\n if (window.updateSelectedTextStyle) window.updateSelectedTextStyle({ font: f })\n }, [])\n\n const updateSize = useCallback((s) => {\n setFontSize(s)\n if (window.updateSelectedTextStyle) window.updateSelectedTextStyle({ fontSize: SIZE_MAP[s] })\n }, [])\n\n const toggleCodeMode = useCallback(() => {\n const next = !codeMode\n setCodeMode(next)\n window.isTextInCodeMode = next\n if (next) {\n // Convert selected text \u2192 code\n if (window.__convertTextToCode) window.__convertTextToCode()\n } else {\n // Convert selected code \u2192 text\n if (window.__convertCodeToText) window.__convertCodeToText()\n }\n }, [codeMode])\n\n const updateLanguage = useCallback((lang) => {\n setLanguage(lang)\n if (window.__setCodeLanguage) window.__setCodeLanguage(lang)\n }, [])\n\n const visible = activeTool === TOOLS.TEXT || activeTool === TOOLS.CODE || selectedShapeSidebar === 'text'\n\n return (\n <>\n <ShapeSidebar visible={visible}>\n {/* Color */}\n <ToolbarButton tooltip={t('sidebar.textColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: textColor }} />}\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.color')}</p>\n <div className=\"grid grid-cols-4 gap-1.5\">\n {TEXT_COLORS.map((c) => (\n <button key={c} onClick={() => updateColor(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${textColor === c ? 'border-[#5B57D1] scale-110' : 'border-white/[0.08] hover:border-white/20'}`}\n style={{ backgroundColor: c }}\n />\n ))}\n </div>\n </ToolbarButton>\n\n {!codeMode && (\n <>\n <Divider />\n\n {/* Font */}\n <ToolbarButton icon=\"bxs-font-family\" tooltip={t('sidebar.font')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.font')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {FONTS.map((f) => (\n <button key={f.value} onClick={() => updateFont(f.value)}\n className={`flex items-center px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${font === f.value ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n style={{ fontFamily: f.value }}\n >\n {f.label}\n </button>\n ))}\n </div>\n </ToolbarButton>\n </>\n )}\n\n <Divider />\n\n {/* Size */}\n <ToolbarButton icon=\"bxs-chevrons-up\" tooltip={t('sidebar.size')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.size')}</p>\n <div className=\"flex items-center gap-1\">\n {['S', 'M', 'L', 'XL'].map((s) => (\n <button key={s} onClick={() => updateSize(s)}\n className={`w-8 h-8 flex items-center justify-center rounded-lg text-xs transition-all duration-100 ${fontSize === s ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-muted hover:bg-white/[0.06]'}`}\n >{s}</button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n {/* Code mode */}\n <ToolbarButton icon=\"bxs-terminal\" tooltip={t('sidebar.codeMode')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.code')}</p>\n <div className=\"flex flex-col gap-2\">\n <button onClick={toggleCodeMode}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${codeMode ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <div className={`w-6 h-3 rounded-full transition-all duration-150 relative ${codeMode ? 'bg-white/30' : 'bg-white/10'}`}>\n <div className={`absolute top-0.5 w-2 h-2 rounded-full bg-white transition-all duration-150 ${codeMode ? 'left-3.5' : 'left-0.5'}`} />\n </div>\n {codeMode ? t('sidebar.on') : t('sidebar.off')}\n </button>\n {codeMode && (\n <div className=\"flex flex-wrap gap-1 max-w-[180px]\">\n {LANGUAGES.map((lang) => (\n <button key={lang} onClick={() => updateLanguage(lang)}\n className={`px-1.5 py-0.5 rounded text-[9px] transition-all duration-100 ${language === lang ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-dim hover:bg-white/[0.06] hover:text-text-secondary'}`}\n >{lang}</button>\n ))}\n </div>\n )}\n </div>\n </ToolbarButton>\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n\n {/* Keyboard shortcut hint \u2014 positioned below the property bar */}\n <div\n className={`absolute bottom-7 left-1/2 -translate-x-1/2 z-[998] font-[lixFont] transition-all duration-200 ${\n visible ? 'opacity-100 translate-y-0' : 'opacity-0 pointer-events-none translate-y-2'\n }`}\n >\n <p className=\"text-[10px] text-white/30 leading-relaxed text-center whitespace-nowrap\">\n <span className=\"text-white/50\">Ctrl+Enter</span> / <span className=\"text-white/50\">Enter</span> \u2014 {t('sidebar.renderText')} \n <span className=\"text-white/50\">Shift+Enter</span> \u2014 {t('sidebar.newLine')}\n </p>\n </div>\n </>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport useUIStore from '../../store/useUIStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback, useEffect } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { compressImage } from '../../../utils/imageCompressor.js'\nimport { IMAGE_ACCEPT_ATTR, isAllowedImage } from '../../../utils/allowedImageTypes.js'\n\nconst FILL_STYLES = [\n { id: 'transparent', label: 'None', icon: 'bx-x' },\n { id: 'solid', label: 'Solid', icon: 'bxs-square' },\n { id: 'grid', label: 'Grid', icon: 'bx-grid-alt' },\n]\n\nconst FILL_COLORS = [\n '#1e1e28',\n '#13171C',\n '#1a1a2e',\n '#0d1117',\n '#2d2d3a',\n '#ffffff',\n]\n\nexport default function FrameSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const toggleAIModal = useUIStore((s) => s.toggleAIModal)\n const [frameName, setFrameName] = useState('Frame 1')\n const [isGraph, setIsGraph] = useState(false)\n const [fillStyle, setFillStyle] = useState('transparent')\n const [fillColor, setFillColor] = useState('#1e1e28')\n\n // Sync state from the actual selected frame when sidebar opens\n useEffect(() => {\n if (selectedShapeSidebar === 'frame' || activeTool === TOOLS.FRAME) {\n const shape = typeof window !== 'undefined' ? window.currentShape : null\n if (shape && shape.shapeName === 'frame') {\n if (shape.frameName) setFrameName(shape.frameName)\n setIsGraph(shape._frameType === 'graph')\n setFillStyle(shape.fillStyle || 'transparent')\n setFillColor(shape.fillColor || '#1e1e28')\n } else {\n setIsGraph(false)\n setFillStyle('transparent')\n setFillColor('#1e1e28')\n }\n }\n }, [selectedShapeSidebar, activeTool])\n\n const updateName = useCallback((e) => {\n const name = e.target.value\n setFrameName(name)\n const shape = window.currentShape\n if (shape && shape.shapeName === 'frame') {\n shape.frameName = name\n shape.draw()\n }\n }, [])\n\n const updateFillStyle = useCallback((style) => {\n setFillStyle(style)\n const shape = window.currentShape\n if (shape && shape.shapeName === 'frame') {\n shape.fillStyle = style\n shape.draw()\n }\n }, [])\n\n const updateFillColor = useCallback((color) => {\n setFillColor(color)\n const shape = window.currentShape\n if (shape && shape.shapeName === 'frame') {\n shape.fillColor = color\n shape.draw()\n }\n }, [])\n\n const resizeToFit = useCallback(() => {\n const shape = window.currentShape\n if (shape && shape.shapeName === 'frame' && typeof shape.resizeToFitContents === 'function') {\n shape.resizeToFitContents()\n }\n }, [])\n\n const handleAIEdit = useCallback(() => {\n const shape = window.currentShape\n if (shape && shape.shapeName === 'frame') {\n window.__aiEditTargetFrame = shape\n toggleAIModal()\n }\n }, [toggleAIModal])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.FRAME || selectedShapeSidebar === 'frame'}>\n <ToolbarButton icon=\"bxs-rename\" tooltip=\"Frame name\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.name')}</p>\n <input\n type=\"text\"\n value={frameName}\n onChange={updateName}\n className=\"w-32 px-2.5 py-1.5 bg-white/[0.05] border border-white/[0.1] rounded-lg text-white text-xs outline-none focus:border-[#5B57D1]/50 transition-all duration-150 font-[lixFont]\"\n spellCheck={false}\n />\n </ToolbarButton>\n\n <Divider />\n\n {/* Fill style */}\n <ToolbarButton icon=\"bxs-palette\" tooltip=\"Fill style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.background')}</p>\n <div className=\"flex gap-1 mb-2.5\">\n {FILL_STYLES.map((s) => (\n <button\n key={s.id}\n onClick={() => updateFillStyle(s.id)}\n title={s.label}\n className={`flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${\n fillStyle === s.id\n ? 'bg-white/[0.12] text-white'\n : 'text-text-muted hover:text-white hover:bg-white/[0.06]'\n }`}\n >\n <i className={`bx ${s.icon} text-sm`} />\n {s.label}\n </button>\n ))}\n </div>\n\n {/* Color picker \u2014 only show for solid/grid */}\n {fillStyle !== 'transparent' && (\n <>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-1.5\">{t('sidebar.sectionHeader.color')}</p>\n <div className=\"flex items-center gap-1.5\">\n {FILL_COLORS.map((c) => (\n <button\n key={c}\n onClick={() => updateFillColor(c)}\n title={c}\n className={`w-6 h-6 rounded-md border-2 transition-all duration-100 ${\n fillColor === c ? 'border-accent-blue scale-110' : 'border-white/10 hover:border-white/30'\n }`}\n style={{ backgroundColor: c }}\n />\n ))}\n <label className=\"w-6 h-6 rounded-md border-2 border-white/10 hover:border-white/30 cursor-pointer overflow-hidden relative transition-all duration-100\" title=\"Custom color\">\n <input\n type=\"color\"\n value={fillColor}\n onChange={(e) => updateFillColor(e.target.value)}\n className=\"absolute inset-0 opacity-0 cursor-pointer\"\n />\n <i className=\"bx bx-palette text-xs text-text-muted absolute inset-0 flex items-center justify-center\" />\n </label>\n </div>\n </>\n )}\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bx-image-alt\" tooltip=\"Background image\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.backgroundImage')}</p>\n <div className=\"flex gap-1.5 mb-2\">\n <button\n onClick={() => {\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = IMAGE_ACCEPT_ATTR\n input.onchange = async (e) => {\n const file = e.target.files?.[0]\n if (!file) return\n if (!isAllowedImage(file)) {\n console.warn('[FrameSidebar] Rejected file type:', file.type)\n return\n }\n const reader = new FileReader()\n reader.onload = async (ev) => {\n const shape = window.currentShape\n if (!shape?.shapeName === 'frame' || !shape.setImageFromURL) return\n // Compress heavily before setting\n try {\n const compressed = await compressImage(ev.target.result, { maxWidth: 1280, quality: 0.5 })\n shape.setImageFromURL(compressed.dataUrl, shape._frameImageFit || 'cover')\n } catch {\n shape.setImageFromURL(ev.target.result, shape._frameImageFit || 'cover')\n }\n }\n reader.readAsDataURL(file)\n }\n input.click()\n }}\n className=\"flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg text-text-secondary text-xs hover:bg-white/[0.06] hover:text-white transition-all duration-100\"\n >\n <i className=\"bx bx-upload text-sm\" />\n Set Image\n </button>\n <button\n onClick={() => {\n const shape = window.currentShape\n if (shape?.shapeName === 'frame' && shape.setImageFromURL) {\n shape.setImageFromURL(null)\n shape.draw()\n }\n }}\n className=\"flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg text-text-secondary text-xs hover:bg-white/[0.06] hover:text-red-400 transition-all duration-100\"\n >\n <i className=\"bx bx-x text-sm\" />\n Remove\n </button>\n </div>\n {/* Fit controls \u2014 only show when frame has an image */}\n {(() => {\n const shape = typeof window !== 'undefined' ? window.currentShape : null\n if (!shape?.shapeName === 'frame' || !shape?._frameImageURL) return null\n return (\n <>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-1.5\">{t('sidebar.sectionHeader.fit')}</p>\n <div className=\"flex gap-1\">\n {[\n { id: 'cover', label: 'Cover' },\n { id: 'contain', label: 'Contain' },\n { id: 'fill', label: 'Stretch' },\n ].map((f) => (\n <button\n key={f.id}\n onClick={() => {\n const s = window.currentShape\n if (s?.shapeName === 'frame' && s.setImageFromURL && s._frameImageURL) {\n s.setImageFromURL(s._frameImageURL, f.id)\n }\n }}\n className={`px-2 py-1 rounded-md text-[10px] transition-all ${\n shape._frameImageFit === f.id\n ? 'bg-white/[0.12] text-white'\n : 'text-text-muted hover:text-white hover:bg-white/[0.06]'\n }`}\n >{f.label}</button>\n ))}\n </div>\n </>\n )\n })()}\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-expand\" tooltip=\"Actions\">\n <button onClick={resizeToFit} className=\"flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-text-secondary text-xs hover:bg-white/[0.06] hover:text-white transition-all duration-100\">\n <i className=\"bx bxs-expand text-sm\" />\n Resize to Fit\n </button>\n </ToolbarButton>\n\n {/* AI Edit / Graph Edit removed while AI is coming-soon. Restore the\n button + handleAIEdit wiring when the assistant ships. */}\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport { useState, useEffect, useCallback, useRef } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\n// Origin of the icons API. When the package runs same-origin with\n// sketch.elixpo this stays empty (relative path). External hosts (e.g.\n// blogs.elixpo) point at the public sketch.elixpo deploy via\n// window.__lixsketchIconsOrigin = 'https://sketch.elixpo.com'\n// The endpoints are CORS-enabled so any origin can fetch.\nconst DEFAULT_ICONS_ORIGIN = 'https://sketch.elixpo.com';\nfunction getIconsBaseUrl() {\n if (typeof window === 'undefined') return '';\n if (window.__lixsketchIconsOrigin) return window.__lixsketchIconsOrigin;\n // Same-origin if the host is sketch.elixpo itself; otherwise default to prod.\n if (typeof location !== 'undefined' && /sketch\\.elixpo/.test(location.host)) return '';\n return DEFAULT_ICONS_ORIGIN;\n}\n\nconst iconResultCache = new Map()\n\nconst CATEGORIES = [\n { value: null, label: 'All', icon: 'bxs-grid-alt' },\n { value: 'tech', label: 'Tech', icon: 'bxs-chip' },\n { value: 'devops', label: 'DevOps', icon: 'bxs-server' },\n { value: 'design', label: 'Design', icon: 'bxs-palette' },\n { value: 'social media', label: 'Social', icon: 'bxs-share-alt' },\n { value: 'navigation', label: 'Nav', icon: 'bxs-navigation' },\n { value: 'business', label: 'Business', icon: 'bxs-briefcase' },\n { value: 'media', label: 'Media', icon: 'bxs-videos' },\n]\n\n// Normalize an SVG string so it renders fully within a fixed box.\n// Ensures the inner <svg> has width/height=\"100%\" and a viewBox.\nfunction normalizeSvg(raw) {\n if (!raw) return raw\n // Parse to a temp element so we can inspect attributes\n const tmp = document.createElement('div')\n tmp.innerHTML = raw\n const svgEl = tmp.querySelector('svg')\n if (!svgEl) return raw\n\n // Ensure viewBox exists \u2014 derive from width/height if missing\n if (!svgEl.getAttribute('viewBox')) {\n const w = parseFloat(svgEl.getAttribute('width')) || 24\n const h = parseFloat(svgEl.getAttribute('height')) || 24\n svgEl.setAttribute('viewBox', `0 0 ${w} ${h}`)\n }\n // Force the SVG to fill its container\n svgEl.setAttribute('width', '100%')\n svgEl.setAttribute('height', '100%')\n return tmp.innerHTML\n}\n\nfunction IconCell({ icon, onClick }) {\n const name = icon.filename?.replace('.svg', '').replace(/_/g, ' ') || ''\n const normalizedSvg = typeof document !== 'undefined' && icon.svg ? normalizeSvg(icon.svg) : icon.svg\n return (\n <button\n onClick={onClick}\n title={name}\n style={{ width: '44px', height: '44px', overflow: 'hidden', flexShrink: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', borderRadius: '8px', cursor: 'pointer', background: 'transparent', border: 'none', padding: 0 }}\n className=\"hover:bg-surface-hover transition-colors duration-100\"\n >\n {normalizedSvg ? (\n <div\n style={{ width: '24px', height: '24px', overflow: 'visible', flexShrink: 0, pointerEvents: 'none', filter: 'brightness(0) invert(1)' }}\n dangerouslySetInnerHTML={{ __html: normalizedSvg }}\n />\n ) : (\n <img\n src={`/icons/${encodeURIComponent(icon.filename)}`}\n alt=\"\"\n style={{ width: '24px', height: '24px', pointerEvents: 'none', filter: 'invert(1)' }}\n loading=\"lazy\"\n />\n )}\n </button>\n )\n}\n\nexport default function IconSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const setActiveTool = useSketchStore((s) => s.setActiveTool)\n const visible = activeTool === TOOLS.ICON\n const [query, setQuery] = useState('')\n const [category, setCategory] = useState(null)\n const [icons, setIcons] = useState([])\n const [loading, setLoading] = useState(false)\n const debounceRef = useRef(null)\n\n // Close on Escape\n useEffect(() => {\n if (!visible) return\n const handler = (e) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n setActiveTool(TOOLS.SELECT)\n }\n }\n document.addEventListener('keydown', handler, true)\n return () => document.removeEventListener('keydown', handler, true)\n }, [visible, setActiveTool])\n\n // Close when clicking on the canvas (outside the sidebar)\n useEffect(() => {\n if (!visible) return\n const svgEl = document.getElementById('freehand-canvas')\n if (!svgEl) return\n const handleCanvasClick = () => setActiveTool(TOOLS.SELECT)\n svgEl.addEventListener('mousedown', handleCanvasClick)\n return () => svgEl.removeEventListener('mousedown', handleCanvasClick)\n }, [visible, setActiveTool])\n\n const fetchIcons = useCallback(async (searchQuery, cat) => {\n const params = new URLSearchParams()\n if (searchQuery) params.set('q', searchQuery)\n if (cat) params.set('category', cat)\n params.set('inline', '1')\n const cacheKey = params.toString()\n\n // Return cached results instantly if available\n if (iconResultCache.has(cacheKey)) {\n setIcons(iconResultCache.get(cacheKey))\n return\n }\n\n setLoading(true)\n try {\n const res = await fetch(`${getIconsBaseUrl()}/api/icons/search?${cacheKey}`)\n if (res.ok) {\n const data = await res.json()\n const results = data.results || []\n iconResultCache.set(cacheKey, results)\n setIcons(results)\n }\n } catch (err) {\n console.error('Icon fetch failed:', err)\n }\n setLoading(false)\n }, [])\n\n // Fetch icons when visibility, query, or category changes (debounced for query typing)\n useEffect(() => {\n if (!visible) return\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => {\n fetchIcons(query, category)\n }, query ? 300 : 0)\n return () => clearTimeout(debounceRef.current)\n }, [query, visible, category, fetchIcons])\n\n // Preload all categories in background on first sidebar open\n const hasPreloaded = useRef(false)\n useEffect(() => {\n if (!visible || hasPreloaded.current) return\n hasPreloaded.current = true\n // Fire-and-forget: preload each category so switching is instant\n CATEGORIES.forEach((cat) => {\n const params = new URLSearchParams()\n if (cat.value) params.set('category', cat.value)\n params.set('inline', '1')\n const key = params.toString()\n if (!iconResultCache.has(key)) {\n fetch(`${getIconsBaseUrl()}/api/icons/search?${key}`)\n .then((r) => r.ok ? r.json() : null)\n .then((data) => { if (data?.results) iconResultCache.set(key, data.results) })\n .catch(() => {})\n }\n })\n }, [visible])\n\n const handleIconClick = useCallback((icon) => {\n if (typeof window === 'undefined') return\n const place = (svgContent) => {\n if (window.prepareIconPlacement) {\n window.prepareIconPlacement(svgContent)\n } else {\n window.iconToPlace = svgContent\n }\n }\n if (icon.svg) {\n place(icon.svg)\n } else {\n fetch(`${getIconsBaseUrl()}/api/icons/serve?name=${encodeURIComponent(icon.filename)}`)\n .then((r) => r.text())\n .then(place)\n .catch(() => {})\n }\n }, [])\n\n return (\n <div\n className={`absolute top-[60px] right-2 bottom-[56px] w-[300px] bg-surface border border-border-light rounded-2xl z-[999] font-[lixFont] flex flex-col transition-transform duration-200 ${\n visible ? 'translate-x-0' : 'translate-x-full'\n }`}\n >\n {/* Header */}\n <div className=\"px-3.5 pt-3.5 pb-2 shrink-0\">\n <div className=\"flex items-center justify-between mb-2.5\">\n <h3 className=\"text-text-primary text-sm font-medium\">Icons</h3>\n <button\n onClick={() => setActiveTool(TOOLS.SELECT)}\n className=\"w-6 h-6 flex items-center justify-center rounded-md text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors duration-100\"\n title=\"Close (Esc)\"\n >\n <i className=\"bx bx-x text-lg\" />\n </button>\n </div>\n\n {/* Search */}\n <div className=\"flex items-center gap-2 bg-surface-hover border border-border-light rounded-lg px-2.5 py-2\">\n <i className=\"bx bxs-search text-text-muted text-sm\" />\n <input\n id=\"iconSearchInput\"\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search icons...\"\n className=\"flex-1 bg-transparent text-text-primary text-sm outline-none placeholder:text-text-dim\"\n spellCheck={false}\n />\n {query && (\n <button onClick={() => setQuery('')} className=\"text-text-dim hover:text-text-secondary\">\n <i className=\"bx bxs-x-circle text-sm\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Categories */}\n <div className=\"flex flex-wrap gap-1 px-3.5 pb-2.5 shrink-0\">\n {CATEGORIES.map((cat) => (\n <button\n key={cat.value || 'all'}\n onClick={() => setCategory(cat.value)}\n className={`flex items-center gap-1 px-2 py-1 rounded-md text-xs whitespace-nowrap transition-colors duration-100 ${\n category === cat.value\n ? 'bg-accent-blue/20 text-accent-blue-hover'\n : 'text-text-muted hover:bg-surface-hover hover:text-text-primary'\n }`}\n >\n <i className={`bx ${cat.icon} text-xs`} />\n {cat.label}\n </button>\n ))}\n </div>\n\n {/* Divider */}\n <div className=\"h-px bg-surface-hover mx-3.5 shrink-0\" />\n\n {/* Icon grid \u2014 scrollable */}\n <div className=\"flex-1 overflow-y-auto no-scrollbar px-3 py-2.5\" id=\"iconsContainer\">\n {loading ? (\n <div className=\"flex items-center justify-center py-12 text-text-muted text-sm\">\n <i className=\"bx bxs-hourglass bx-spin text-lg mr-2\" />\n Loading...\n </div>\n ) : icons.length === 0 ? (\n <div className=\"flex items-center justify-center py-12 text-text-muted text-sm\">\n No icons found\n </div>\n ) : (\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(6, minmax(0, 1fr))', gap: '2px' }}>\n {icons.map((icon, i) => (\n <IconCell\n key={icon.filename || i}\n icon={icon}\n onClick={() => handleIconClick(icon)}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport useSketchStore from '../../store/useSketchStore'\nimport useUIStore from '../../store/useUIStore'\nimport ShapeSidebar, { Divider, LayerControls } from './ShapeSidebar'\nimport { useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nexport default function ImageSidebar() {\n const { t } = useTranslation()\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const toggleImageGenerateModal = useUIStore((s) => s.toggleImageGenerateModal)\n\n const handleEditWithAI = useCallback(() => {\n const shape = window.currentShape\n if (!shape || shape.shapeName !== 'image') return\n\n // Get the image URL from the element\n const el = shape.element\n const href = el?.getAttribute('href') || el?.getAttributeNS('http://www.w3.org/1999/xlink', 'href') || ''\n const w = parseFloat(el?.getAttribute('width')) || 512\n const h = parseFloat(el?.getAttribute('height')) || 512\n\n // Store reference for the modal to pick up\n window.__editImageRef = { imageUrl: href, width: w, height: h, shape }\n toggleImageGenerateModal()\n }, [toggleImageGenerateModal])\n\n const handleReplace = useCallback(() => {\n if (window.openImageFilePicker) {\n // Store current shape so the new image replaces it\n window.__replaceImageShape = window.currentShape\n window.openImageFilePicker()\n }\n }, [])\n\n return (\n <ShapeSidebar visible={selectedShapeSidebar === 'image'}>\n {/* Edit with AI */}\n <button\n onClick={handleEditWithAI}\n title=\"Edit with AI\"\n className=\"h-9 flex items-center gap-1.5 px-3 rounded-lg text-text-muted hover:text-purple-400 hover:bg-purple-500/10 transition-all duration-100\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\">\n <path d=\"M12 2l2.4 7.2L22 12l-7.6 2.8L12 22l-2.4-7.2L2 12l7.6-2.8L12 2z\" />\n </svg>\n <span className=\"text-xs\">AI Edit</span>\n </button>\n\n <Divider />\n\n {/* Replace image */}\n <button\n onClick={handleReplace}\n title=\"Replace image\"\n className=\"h-9 flex items-center gap-1.5 px-3 rounded-lg text-text-muted hover:text-white hover:bg-white/[0.06] transition-all duration-100\"\n >\n <i className=\"bx bx-upload text-base\" />\n <span className=\"text-xs\">Replace</span>\n </button>\n\n <Divider />\n\n {/* Layer controls */}\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport { useState, useEffect } from 'react'\nimport { showToast } from '../../utils/toast'\n\nexport default function MultiSelectActions() {\n const [count, setCount] = useState(0)\n const [groupState, setGroupState] = useState('none') // 'none' | 'partial' | 'all'\n\n useEffect(() => {\n // Poll multi-selection state. Cheap \u2014 Set size + a single\n // groupId pass over selectedShapes.\n const interval = setInterval(() => {\n const ms = window.multiSelection\n const sel = ms?.selectedShapes\n const n = sel ? sel.size : 0\n setCount((prev) => (prev !== n ? n : prev))\n\n if (n < 2) {\n setGroupState('none')\n return\n }\n let withId = 0\n let groupIds = new Set()\n sel.forEach((s) => {\n if (s.groupId) {\n withId++\n groupIds.add(s.groupId)\n }\n })\n // \"all\" = every shape has a groupId AND they all share the same one\n if (withId === n && groupIds.size === 1) setGroupState('all')\n else if (withId > 0) setGroupState('partial')\n else setGroupState('none')\n }, 200)\n return () => clearInterval(interval)\n }, [])\n\n if (count < 2) return null\n\n const handleFrame = () => {\n if (window.frameSelectedShapes) {\n window.frameSelectedShapes()\n setCount(0)\n }\n }\n\n const handleGroup = () => {\n const ms = window.multiSelection\n const sel = ms?.selectedShapes\n if (!sel || sel.size < 2) return\n const newId = `g-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\n sel.forEach((s) => { s.groupId = newId })\n if (typeof ms.updateControls === 'function') ms.updateControls()\n showToast(`Grouped ${sel.size} shapes`, { tone: 'success' })\n }\n\n const handleUngroup = () => {\n const ms = window.multiSelection\n const sel = ms?.selectedShapes\n if (!sel || sel.size === 0) return\n const groupIds = new Set()\n sel.forEach((s) => { if (s.groupId) groupIds.add(s.groupId) })\n if (groupIds.size === 0 || !Array.isArray(window.shapes)) return\n let cleared = 0\n for (const s of window.shapes) {\n if (s.groupId && groupIds.has(s.groupId)) { s.groupId = null; cleared++ }\n }\n if (typeof ms.updateControls === 'function') ms.updateControls()\n showToast(`Ungrouped ${cleared} shapes`, { tone: 'success' })\n }\n\n const grouped = groupState === 'all'\n\n return (\n <div className=\"absolute top-14 left-1/2 -translate-x-1/2 z-[1000] font-[lixFont]\">\n <div className=\"flex items-center gap-2 bg-surface/90 backdrop-blur-lg border border-border-light rounded-xl px-3 py-1.5 shadow-lg\">\n <span className=\"text-text-muted text-xs\">\n {count} selected{grouped && <span className=\"ml-1 text-accent-blue\">\u00B7 grouped</span>}\n </span>\n <div className=\"w-px h-4 bg-border-light\" />\n\n {/* Frame is only useful when shapes aren't already grouped \u2014 a\n grouped set is conceptually a \"frameless frame\" already. */}\n {!grouped && (\n <button\n onClick={handleFrame}\n className=\"flex items-center gap-1.5 px-2.5 py-1 rounded-lg text-xs text-accent-blue hover:bg-accent-blue/10 transition-all duration-150\"\n title=\"Wrap selection in a frame\"\n >\n <i className=\"bx bx-crop text-sm\" />\n Frame it\n </button>\n )}\n\n {/* Group / Ungroup toggle. Group is shown when nothing in the\n selection is grouped yet; Ungroup once they're a single group. */}\n {grouped ? (\n <button\n onClick={handleUngroup}\n className=\"flex items-center gap-1.5 px-2.5 py-1 rounded-lg text-xs text-yellow-400 hover:bg-yellow-500/10 transition-all duration-150\"\n title=\"Ungroup (Ctrl+Shift+G)\"\n >\n <i className=\"bx bx-unlink text-sm\" />\n Ungroup\n </button>\n ) : (\n <button\n onClick={handleGroup}\n className=\"flex items-center gap-1.5 px-2.5 py-1 rounded-lg text-xs text-text-secondary hover:bg-surface-hover transition-all duration-150\"\n title=\"Group (Ctrl+G)\"\n >\n <i className=\"bx bx-link text-sm\" />\n Group\n </button>\n )}\n </div>\n </div>\n )\n}\n", "// Lightweight toast stub for offline mode. Hosts can override by mounting\n// a #lixsketch-toast container; otherwise we fall back to a console log.\nexport function showToast(message, options = {}) {\n const tone = options.tone || 'info';\n const root = typeof document !== 'undefined' ? document.getElementById('lixsketch-toast') : null;\n if (!root) {\n console.log(`[lixsketch:${tone}]`, message);\n return;\n }\n const el = document.createElement('div');\n el.className = `lixsketch-toast-item is-${tone}`;\n el.textContent = message;\n root.appendChild(el);\n setTimeout(() => { el.classList.add('is-leaving'); }, 1800);\n setTimeout(() => { try { root.removeChild(el); } catch {} }, 2200);\n}\n\nexport default { showToast };\n", "\"use client\"\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\nimport useSketchStore from '../../store/useSketchStore'\nimport useUIStore from '../../store/useUIStore'\nimport { showToast } from '../../utils/toast'\n\n// \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction getCleanSVG() {\n const svgEl = window.svg\n if (!svgEl) return null\n const clone = svgEl.cloneNode(true)\n clone.querySelectorAll(\n '[data-selection], .selection-handle, .resize-handle, .rotation-handle, .anchor, .rotate-anchor, .resize-anchor, .rotation-anchor, .selection-outline'\n ).forEach((el) => el.remove())\n return clone\n}\n\nfunction renderToCanvas(clone, scale, bgColor) {\n return new Promise((resolve) => {\n const svgData = new XMLSerializer().serializeToString(clone)\n const vb = window.svg.viewBox.baseVal\n const canvas = document.createElement('canvas')\n canvas.width = vb.width * scale\n canvas.height = vb.height * scale\n const ctx = canvas.getContext('2d')\n ctx.scale(scale, scale)\n const img = new Image()\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n img.onload = () => {\n if (bgColor) {\n ctx.fillStyle = bgColor\n ctx.fillRect(0, 0, vb.width, vb.height)\n }\n ctx.drawImage(img, 0, 0, vb.width, vb.height)\n URL.revokeObjectURL(url)\n resolve(canvas)\n }\n img.onerror = () => { URL.revokeObjectURL(url); resolve(null) }\n img.src = url\n })\n}\n\nfunction getShapeAtPoint(x, y) {\n const shapes = window.shapes\n if (!shapes) return null\n // Walk backwards (topmost first)\n for (let i = shapes.length - 1; i >= 0; i--) {\n const shape = shapes[i]\n const el = shape.group || shape.element\n if (!el) continue\n const rect = el.getBoundingClientRect()\n if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) {\n return shape\n }\n }\n return null\n}\n\n// \u2500\u2500 Menu item components \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction MenuItem({ label, shortcut, onClick, disabled, danger }) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`w-full flex items-center justify-between px-3 py-1.5 text-xs transition-colors duration-100 ${\n disabled\n ? 'text-text-dim cursor-default'\n : danger\n ? 'text-red-400 hover:bg-red-500/15 cursor-pointer'\n : 'text-text-secondary hover:bg-surface-hover cursor-pointer'\n }`}\n >\n <span>{label}</span>\n {shortcut && <span className=\"text-text-dim text-[10px] ml-6\">{shortcut}</span>}\n </button>\n )\n}\n\nfunction CheckMenuItem({ label, shortcut, checked, onClick }) {\n return (\n <button\n onClick={onClick}\n className=\"w-full flex items-center justify-between px-3 py-1.5 text-xs text-text-secondary hover:bg-surface-hover cursor-pointer transition-colors duration-100\"\n >\n <span className=\"flex items-center gap-2\">\n {checked && <i className=\"bx bx-check text-sm text-accent-blue -ml-0.5\" />}\n {!checked && <span className=\"w-[14px]\" />}\n {label}\n </span>\n {shortcut && <span className=\"text-text-dim text-[10px] ml-6\">{shortcut}</span>}\n </button>\n )\n}\n\nfunction Separator() {\n return <hr className=\"border-border-light my-1\" />\n}\n\n// \u2500\u2500 Main component \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport default function ContextMenu() {\n const [visible, setVisible] = useState(false)\n const [position, setPosition] = useState({ x: 0, y: 0 })\n const [targetShape, setTargetShape] = useState(null)\n const menuRef = useRef(null)\n\n const gridEnabled = useSketchStore((s) => s.gridEnabled)\n const snapToObjects = useSketchStore((s) => s.snapToObjects)\n const zenMode = useSketchStore((s) => s.zenMode)\n const viewMode = useSketchStore((s) => s.viewMode)\n\n const close = useCallback(() => {\n setVisible(false)\n setTargetShape(null)\n }, [])\n\n // Context menu handler\n useEffect(() => {\n const handleContextMenu = (e) => {\n const svg = document.getElementById('freehand-canvas')\n if (!svg) return\n\n // Only handle right-clicks on or within the SVG canvas\n if (!svg.contains(e.target) && e.target !== svg) return\n\n e.preventDefault()\n const shape = getShapeAtPoint(e.clientX, e.clientY)\n\n // Also check if there's a currentShape selected\n const current = window.currentShape || null\n\n setTargetShape(shape || current)\n setPosition({ x: e.clientX, y: e.clientY })\n setVisible(true)\n }\n\n const handleClick = () => close()\n const handleKeyDown = (e) => { if (e.key === 'Escape') close() }\n\n document.addEventListener('contextmenu', handleContextMenu)\n document.addEventListener('click', handleClick)\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('contextmenu', handleContextMenu)\n document.removeEventListener('click', handleClick)\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [close])\n\n // Adjust position so menu doesn't overflow viewport\n useEffect(() => {\n if (!visible || !menuRef.current) return\n const rect = menuRef.current.getBoundingClientRect()\n const vw = window.innerWidth\n const vh = window.innerHeight\n let { x, y } = position\n if (x + rect.width > vw - 8) x = vw - rect.width - 8\n if (y + rect.height > vh - 8) y = vh - rect.height - 8\n if (x !== position.x || y !== position.y) setPosition({ x, y })\n }, [visible, position])\n\n if (!visible) return null\n\n // \u2500\u2500 Action handlers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const handlePaste = () => {\n if (typeof window.pasteClipboard === 'function') window.pasteClipboard()\n else document.dispatchEvent(new KeyboardEvent('keydown', { key: 'v', ctrlKey: true }))\n close()\n }\n\n const handleCopy = () => {\n if (typeof window.copySelected === 'function') window.copySelected()\n else document.dispatchEvent(new KeyboardEvent('keydown', { key: 'c', ctrlKey: true }))\n close()\n }\n\n const handleCut = () => {\n handleCopy()\n handleDeleteShape()\n }\n\n const handleSelectAll = () => {\n useSketchStore.getState().setActiveTool('select')\n if (window.multiSelection && window.shapes) {\n window.multiSelection.clearSelection()\n window.shapes.forEach((s) => window.multiSelection.addShape(s))\n }\n close()\n }\n\n const handleCopyPNG = async () => {\n const clone = getCleanSVG()\n if (!clone) { close(); return }\n const canvas = await renderToCanvas(clone, 2, '#121212')\n if (!canvas) { close(); return }\n canvas.toBlob((blob) => {\n if (blob) navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]).catch(() => {})\n }, 'image/png')\n close()\n }\n\n const handleCopySVG = () => {\n const clone = getCleanSVG()\n if (!clone) { close(); return }\n const svgData = new XMLSerializer().serializeToString(clone)\n navigator.clipboard.writeText(svgData).catch(() => {})\n close()\n }\n\n const handleToggleGrid = () => {\n useSketchStore.getState().toggleGrid()\n close()\n }\n\n const handleToggleSnap = () => {\n useSketchStore.getState().toggleSnapToObjects()\n close()\n }\n\n const handleZenMode = () => {\n useSketchStore.getState().toggleZenMode()\n close()\n }\n\n const handleViewMode = () => {\n useSketchStore.getState().toggleViewMode()\n close()\n }\n\n const handleDeleteShape = () => {\n // Multi-selection delete\n if (window.multiSelection?.selectedShapes?.size > 0) {\n if (typeof window.deleteSelectedShapes === 'function') window.deleteSelectedShapes()\n close()\n return\n }\n const shape = targetShape || window.currentShape\n if (!shape) { close(); return }\n const shapes = window.shapes\n\n // Issue #24 bug #7: frame \u2192 orphan children + snapshot for undo\n // (mirrors deleteSelectedShapes / EngineShortcuts).\n const isFrame = shape.shapeName === 'frame'\n const isDiagramFrame = isFrame && !!shape._diagramType\n let childSnapshot = null\n if (isFrame && !isDiagramFrame) {\n childSnapshot = [...(shape.containedShapes || [])]\n for (const child of childSnapshot) {\n if (!child || child === shape) continue\n const el = child.group || child.element\n if (el) {\n if (shape.clipGroup && el.parentNode === shape.clipGroup) shape.clipGroup.removeChild(el)\n if (window.svg && el.parentNode !== window.svg) window.svg.appendChild(el)\n }\n child.parentFrame = null\n delete child.isBeingMovedByFrame\n }\n shape.containedShapes = []\n }\n\n if (shapes) {\n const idx = shapes.indexOf(shape)\n if (idx !== -1) shapes.splice(idx, 1)\n }\n if (typeof window.cleanupAttachments === 'function') window.cleanupAttachments(shape)\n if (shape.parentFrame && typeof shape.parentFrame.removeShapeFromFrame === 'function') {\n shape.parentFrame.removeShapeFromFrame(shape)\n }\n\n if (isFrame && !isDiagramFrame) {\n if (shape.group && shape.group.parentNode) shape.group.parentNode.removeChild(shape.group)\n if (shape.clipGroup && shape.clipGroup.parentNode) shape.clipGroup.parentNode.removeChild(shape.clipGroup)\n if (shape.clipPath && shape.clipPath.parentNode) shape.clipPath.parentNode.removeChild(shape.clipPath)\n } else {\n const el = shape.group || shape.element\n if (el && el.parentNode) el.parentNode.removeChild(el)\n }\n\n if (typeof window.pushDeleteAction === 'function') {\n if (childSnapshot) window.pushDeleteAction(shape, { childSnapshot })\n else window.pushDeleteAction(shape)\n }\n window.currentShape = null\n if (typeof window.disableAllSideBars === 'function') window.disableAllSideBars()\n close()\n }\n\n const handleDuplicate = () => {\n // Copy then paste\n if (typeof window.copySelected === 'function') window.copySelected()\n setTimeout(() => {\n if (typeof window.pasteClipboard === 'function') window.pasteClipboard()\n }, 50)\n close()\n }\n\n // Layer order\n const handleLayerAction = (action) => {\n const shape = targetShape || window.currentShape\n if (!shape || !window.__layerOrder) { close(); return }\n window.__layerOrder[action](shape)\n close()\n }\n\n // Flip (transform via scale)\n const handleFlip = (axis) => {\n const shape = targetShape || window.currentShape\n if (!shape) { close(); return }\n const el = shape.group || shape.element\n if (!el) { close(); return }\n const current = el.getAttribute('transform') || ''\n const bbox = el.getBBox()\n const cx = bbox.x + bbox.width / 2\n const cy = bbox.y + bbox.height / 2\n const scaleStr = axis === 'h'\n ? `translate(${cx * 2}, 0) scale(-1, 1)`\n : `translate(0, ${cy * 2}) scale(1, -1)`\n el.setAttribute('transform', current + ' ' + scaleStr)\n close()\n }\n\n // Wrap selection in frame\n const handleWrapInFrame = () => {\n // Simulate the frame wrap if engine supports it\n close()\n }\n\n // \u2500\u2500 Group / ungroup helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Mirror the Ctrl+G / Ctrl+Shift+G behavior so the right-click menu\n // is a discoverable alternative.\n const handleGroup = () => {\n const ms = window.multiSelection\n const sel = ms?.selectedShapes\n const targets = sel && sel.size > 1\n ? Array.from(sel)\n : (window.currentShape ? [window.currentShape] : [])\n if (targets.length > 1) {\n const newId = `g-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\n for (const s of targets) s.groupId = newId\n if (typeof ms?.updateControls === 'function') ms.updateControls()\n showToast(`Grouped ${targets.length} shapes`, { tone: 'success' })\n }\n close()\n }\n\n const handleUngroup = () => {\n const ms = window.multiSelection\n const sel = ms?.selectedShapes\n const targets = sel && sel.size > 0\n ? Array.from(sel)\n : (window.currentShape ? [window.currentShape] : [])\n const groupIds = new Set(targets.map(s => s.groupId).filter(Boolean))\n if (groupIds.size > 0 && Array.isArray(window.shapes)) {\n let cleared = 0\n for (const s of window.shapes) {\n if (s.groupId && groupIds.has(s.groupId)) { s.groupId = null; cleared++ }\n }\n if (typeof ms?.updateControls === 'function') ms.updateControls()\n showToast(`Ungrouped ${cleared} shapes`, { tone: 'success' })\n }\n close()\n }\n\n // Compute selection state for the menu rendering below.\n const selectionShapes = (() => {\n const sel = window.multiSelection?.selectedShapes\n if (sel && sel.size > 0) return Array.from(sel)\n if (targetShape) return [targetShape]\n return []\n })()\n const canGroup = selectionShapes.length > 1\n const groupIdsInSelection = new Set(selectionShapes.map(s => s.groupId).filter(Boolean))\n const canUngroup = groupIdsInSelection.size > 0\n const fullyGrouped = selectionShapes.length > 1 &&\n selectionShapes.every(s => s.groupId) &&\n groupIdsInSelection.size === 1\n\n const handleCanvasProperties = () => {\n // Toggle shape sidebar / properties via Alt+/\n close()\n }\n\n // \u2500\u2500 Render \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const isShape = !!targetShape\n\n return (\n <div\n ref={menuRef}\n className=\"fixed z-9999 min-w-[220px] py-1.5 bg-surface/90 backdrop-blur-xl rounded-xl border border-border-light shadow-2xl font-[lixFont] select-none\"\n style={{ left: position.x, top: position.y }}\n onClick={(e) => e.stopPropagation()}\n >\n {isShape ? (\n /* \u2500\u2500 Shape context menu \u2500\u2500 */\n <>\n <MenuItem label=\"Cut\" shortcut=\"Ctrl+X\" onClick={handleCut} />\n <MenuItem label=\"Copy\" shortcut=\"Ctrl+C\" onClick={handleCopy} />\n <MenuItem label=\"Paste\" shortcut=\"Ctrl+V\" onClick={handlePaste} />\n\n <Separator />\n {/* Frame wrap doesn't make sense when the selection is already\n grouped \u2014 the group itself is the implicit container. */}\n {!fullyGrouped && (\n <MenuItem label=\"Wrap selection in frame\" onClick={handleWrapInFrame} />\n )}\n {canGroup && !fullyGrouped && (\n <MenuItem label=\"Group\" shortcut=\"Ctrl+G\" onClick={handleGroup} />\n )}\n {canUngroup && (\n <MenuItem label=\"Ungroup\" shortcut=\"Ctrl+Shift+G\" onClick={handleUngroup} />\n )}\n\n <Separator />\n <MenuItem label=\"Copy to clipboard as PNG\" shortcut=\"Shift+Alt+C\" onClick={handleCopyPNG} />\n <MenuItem label=\"Copy to clipboard as SVG\" onClick={handleCopySVG} />\n\n <Separator />\n <MenuItem label=\"Send backward\" shortcut=\"Ctrl+[\" onClick={() => handleLayerAction('sendBackward')} />\n <MenuItem label=\"Bring forward\" shortcut=\"Ctrl+]\" onClick={() => handleLayerAction('bringForward')} />\n <MenuItem label=\"Send to back\" shortcut=\"Ctrl+Shift+[\" onClick={() => handleLayerAction('sendToBack')} />\n <MenuItem label=\"Bring to front\" shortcut=\"Ctrl+Shift+]\" onClick={() => handleLayerAction('bringToFront')} />\n\n <Separator />\n <MenuItem label=\"Flip horizontal\" shortcut=\"Shift+H\" onClick={() => handleFlip('h')} />\n <MenuItem label=\"Flip vertical\" shortcut=\"Shift+V\" onClick={() => handleFlip('v')} />\n\n <Separator />\n <MenuItem label=\"Duplicate\" shortcut=\"Ctrl+D\" onClick={handleDuplicate} />\n <MenuItem label=\"Delete\" danger onClick={handleDeleteShape} />\n </>\n ) : (\n /* \u2500\u2500 Canvas context menu \u2500\u2500 */\n <>\n <MenuItem label=\"Paste\" shortcut=\"Ctrl+V\" onClick={handlePaste} />\n <MenuItem label=\"Copy to clipboard as PNG\" shortcut=\"Shift+Alt+C\" onClick={handleCopyPNG} />\n <MenuItem label=\"Copy to clipboard as SVG\" onClick={handleCopySVG} />\n\n <Separator />\n <MenuItem label=\"Select all\" shortcut=\"Ctrl+A\" onClick={handleSelectAll} />\n\n <Separator />\n <CheckMenuItem label=\"Toggle grid\" shortcut=\"Ctrl+'\" checked={gridEnabled} onClick={handleToggleGrid} />\n <CheckMenuItem label=\"Snap to objects\" shortcut=\"Alt+S\" checked={snapToObjects} onClick={handleToggleSnap} />\n\n <Separator />\n <MenuItem label=\"Find on canvas\" shortcut=\"Ctrl+F\" onClick={() => { useUIStore.getState().toggleFindBar(); close() }} />\n <MenuItem label=\"Zen mode\" shortcut=\"Alt+Z\" onClick={handleZenMode} />\n <MenuItem label=\"View mode\" shortcut=\"Alt+R\" onClick={handleViewMode} />\n\n <Separator />\n <MenuItem label=\"Reset canvas\" danger onClick={() => {\n const serializer = window.__sceneSerializer\n if (serializer?.resetCanvas) serializer.resetCanvas()\n close()\n }} />\n </>\n )}\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState, useEffect, useRef, useCallback } from 'react'\nimport useUIStore from '../../store/useUIStore'\n\nexport default function FindBar() {\n const open = useUIStore((s) => s.findBarOpen)\n const closeFindBar = useUIStore((s) => s.closeFindBar)\n const [query, setQuery] = useState('')\n const [results, setResults] = useState([])\n const [activeIndex, setActiveIndex] = useState(-1)\n const inputRef = useRef(null)\n const highlightRef = useRef(null)\n\n useEffect(() => {\n if (open) {\n setQuery('')\n setResults([])\n setActiveIndex(-1)\n setTimeout(() => inputRef.current?.focus(), 50)\n } else {\n // Clean up highlight when closing\n removeHighlight()\n }\n }, [open])\n\n const removeHighlight = useCallback(() => {\n if (highlightRef.current && highlightRef.current.parentNode) {\n highlightRef.current.parentNode.removeChild(highlightRef.current)\n highlightRef.current = null\n }\n }, [])\n\n const highlightShape = useCallback((result) => {\n removeHighlight()\n if (!result || !window.svg) return\n\n const shape = result.shape\n const x = shape.x || 0\n const y = shape.y || 0\n const w = shape.width || 100\n const h = shape.height || 30\n\n // Create highlight rect\n const ns = 'http://www.w3.org/2000/svg'\n const rect = document.createElementNS(ns, 'rect')\n rect.setAttribute('x', x - 4)\n rect.setAttribute('y', y - 4)\n rect.setAttribute('width', w + 8)\n rect.setAttribute('height', h + 8)\n rect.setAttribute('fill', 'rgba(91, 87, 209, 0.15)')\n rect.setAttribute('stroke', '#5B57D1')\n rect.setAttribute('stroke-width', '2')\n rect.setAttribute('stroke-dasharray', '4,2')\n rect.setAttribute('rx', '4')\n rect.setAttribute('pointer-events', 'none')\n rect.classList.add('find-highlight')\n window.svg.appendChild(rect)\n highlightRef.current = rect\n\n // Pan to the shape\n const svgEl = window.svg\n const vb = svgEl.viewBox.baseVal\n const centerX = x + w / 2\n const centerY = y + h / 2\n const newX = centerX - vb.width / 2\n const newY = centerY - vb.height / 2\n svgEl.setAttribute('viewBox', `${newX} ${newY} ${vb.width} ${vb.height}`)\n if (window.currentViewBox) {\n window.currentViewBox.x = newX\n window.currentViewBox.y = newY\n }\n }, [removeHighlight])\n\n const doSearch = useCallback((q) => {\n const finder = window.__sceneSerializer?.findText\n if (!finder || !q.trim()) {\n setResults([])\n setActiveIndex(-1)\n removeHighlight()\n return\n }\n const found = finder(q)\n setResults(found)\n if (found.length > 0) {\n setActiveIndex(0)\n highlightShape(found[0])\n } else {\n setActiveIndex(-1)\n removeHighlight()\n }\n }, [highlightShape, removeHighlight])\n\n const goToResult = useCallback((idx) => {\n if (idx < 0 || idx >= results.length) return\n setActiveIndex(idx)\n highlightShape(results[idx])\n }, [results, highlightShape])\n\n const handleKeyDown = (e) => {\n if (e.key === 'Escape') {\n closeFindBar()\n return\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n if (results.length === 0) {\n doSearch(query)\n } else {\n // Go to next result\n const next = (activeIndex + 1) % results.length\n goToResult(next)\n }\n return\n }\n }\n\n const handleChange = (e) => {\n const q = e.target.value\n setQuery(q)\n doSearch(q)\n }\n\n if (!open) return null\n\n return (\n <div className=\"fixed top-14 right-4 z-[1000] font-[lixFont]\">\n <div className=\"flex items-center gap-2 bg-surface-card/95 backdrop-blur-lg border border-border-light rounded-xl px-3 py-2 shadow-xl min-w-[300px]\">\n <i className=\"bx bx-search text-text-muted text-sm\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder=\"Find text on canvas...\"\n className=\"flex-1 bg-transparent text-text-primary text-xs outline-none placeholder:text-text-dim font-[lixFont]\"\n />\n\n {results.length > 0 && (\n <span className=\"text-text-dim text-xs whitespace-nowrap\">\n {activeIndex + 1}/{results.length}\n </span>\n )}\n {query && results.length === 0 && (\n <span className=\"text-red-400/70 text-xs whitespace-nowrap\">\n No results\n </span>\n )}\n\n {results.length > 1 && (\n <div className=\"flex items-center gap-0.5\">\n <button\n onClick={() => goToResult((activeIndex - 1 + results.length) % results.length)}\n className=\"w-5 h-5 flex items-center justify-center rounded text-text-muted hover:text-white hover:bg-white/10 transition-colors\"\n >\n <i className=\"bx bx-chevron-up text-sm\" />\n </button>\n <button\n onClick={() => goToResult((activeIndex + 1) % results.length)}\n className=\"w-5 h-5 flex items-center justify-center rounded text-text-muted hover:text-white hover:bg-white/10 transition-colors\"\n >\n <i className=\"bx bx-chevron-down text-sm\" />\n </button>\n </div>\n )}\n\n <button\n onClick={closeFindBar}\n className=\"w-5 h-5 flex items-center justify-center rounded text-text-muted hover:text-white hover:bg-white/10 transition-colors\"\n >\n <i className=\"bx bx-x text-sm\" />\n </button>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\nimport useUIStore from '../../store/useUIStore'\nimport useSketchStore from '../../store/useSketchStore'\n\nexport default function ImageSourcePicker() {\n const ref = useRef(null)\n const toggleImageGenerateModal = useUIStore((s) => s.toggleImageGenerateModal)\n const activeTool = useSketchStore((s) => s.activeTool)\n const setActiveTool = useSketchStore((s) => s.setActiveTool)\n\n // Derive visibility directly from Zustand \u2014 no intermediate state\n const visible = activeTool === 'image'\n\n const handleGenerateAI = useCallback(() => {\n setActiveTool('select')\n toggleImageGenerateModal()\n }, [setActiveTool, toggleImageGenerateModal])\n\n const handleUpload = useCallback(() => {\n setActiveTool('select')\n if (window.openImageFilePicker) {\n window.openImageFilePicker()\n }\n }, [setActiveTool])\n\n // Keep the global bridge for engine calls\n useEffect(() => {\n window.__showImageSourcePicker = () => {\n // The picker now shows automatically via Zustand activeTool,\n // but keep this bridge so the engine call doesn't error\n }\n return () => {\n delete window.__showImageSourcePicker\n }\n }, [])\n\n // Close on outside click & keybinds\n useEffect(() => {\n if (!visible) return\n\n const handleClick = (e) => {\n if (ref.current && !ref.current.contains(e.target)) {\n setActiveTool('select')\n }\n }\n\n const handleKeyDown = (e) => {\n if (e.key === 'Escape') {\n setActiveTool('select')\n }\n if (e.key === 'g' || e.key === 'G') {\n e.preventDefault()\n e.stopPropagation()\n handleGenerateAI()\n }\n if (e.key === 'u' || e.key === 'U') {\n e.preventDefault()\n e.stopPropagation()\n handleUpload()\n }\n }\n\n // Delay to avoid catching the click that opened it\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClick)\n document.addEventListener('keydown', handleKeyDown, true)\n }, 100)\n return () => {\n clearTimeout(timer)\n document.removeEventListener('mousedown', handleClick)\n document.removeEventListener('keydown', handleKeyDown, true)\n }\n }, [visible, setActiveTool, handleGenerateAI, handleUpload])\n\n if (!visible) return null\n\n // Compute position on each render when visible\n let posX = 65\n let posY = typeof window !== 'undefined' ? window.innerHeight / 2 - 50 : 300\n if (typeof document !== 'undefined') {\n const imageBtn = document.querySelector('button[title=\"Image (9)\"]')\n if (imageBtn) {\n const rect = imageBtn.getBoundingClientRect()\n posX = rect.right + 10\n posY = rect.top - 10\n }\n }\n\n return (\n <div\n ref={ref}\n className=\"fixed z-[1100] font-[lixFont]\"\n style={{ left: posX, top: posY }}\n >\n <div className=\"bg-surface-card border border-border-light rounded-xl p-1.5 shadow-2xl shadow-black/40 flex flex-col gap-1 min-w-[200px]\">\n <button\n onClick={handleGenerateAI}\n className=\"flex items-center gap-3 px-3 py-2.5 rounded-lg text-text-muted hover:text-accent-blue hover:bg-surface-hover transition-all group\"\n >\n <div className=\"w-8 h-8 rounded-lg bg-accent-blue/10 flex items-center justify-center group-hover:bg-accent-blue/20 transition-all\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-accent-blue\">\n <path d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z\" />\n <path d=\"M18 14l1 3 3 1-3 1-1 3-1-3-3-1 3-1 1-3z\" />\n </svg>\n </div>\n <div className=\"flex-1 text-left\">\n <div className=\"text-sm font-medium\">Generate with AI</div>\n <div className=\"text-[10px] text-text-dim\">10 generations · 5 edits free</div>\n </div>\n <kbd className=\"text-[10px] text-text-dim bg-surface-dark px-1.5 py-0.5 rounded\">G</kbd>\n </button>\n\n <div className=\"h-px bg-white/[0.06] mx-2\" />\n\n <button\n onClick={handleUpload}\n className=\"flex items-center gap-3 px-3 py-2.5 rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all group\"\n >\n <div className=\"w-8 h-8 rounded-lg bg-surface-hover flex items-center justify-center group-hover:bg-surface-active transition-all\">\n <i className=\"bx bx-upload text-lg\" />\n </div>\n <div className=\"flex-1 text-left\">\n <div className=\"text-sm font-medium\">Upload from device</div>\n <div className=\"text-[10px] text-text-dim\">PNG, JPG, SVG, WebP</div>\n </div>\n <kbd className=\"text-[10px] text-text-dim bg-surface-dark px-1.5 py-0.5 rounded\">U</kbd>\n </button>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport useUIStore from '../../store/useUIStore'\n\nexport default function CanvasLoadingOverlay() {\n const loading = useUIStore((s) => s.canvasLoading)\n const message = useUIStore((s) => s.canvasLoadingMessage)\n\n if (!loading) return null\n\n return (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center bg-black/80 backdrop-blur-sm font-[lixFont] pointer-events-all\">\n <div className=\"flex flex-col items-center gap-5\">\n <style>{`\n @keyframes cl-glob {\n 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.7; }\n 25% { transform: translate(10px, -6px) scale(1.12); opacity: 0.9; }\n 50% { transform: translate(-5px, 8px) scale(0.9); opacity: 0.6; }\n 75% { transform: translate(-8px, -4px) scale(1.08); opacity: 0.85; }\n }\n @keyframes cl-glob-2 {\n 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.6; }\n 25% { transform: translate(-8px, 5px) scale(1.1); opacity: 0.85; }\n 50% { transform: translate(6px, -8px) scale(0.95); opacity: 0.7; }\n 75% { transform: translate(5px, 6px) scale(1.12); opacity: 0.9; }\n }\n @keyframes cl-float {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-3px); }\n }\n `}</style>\n\n <div className=\"relative w-20 h-20\">\n <div className=\"absolute rounded-full\" style={{\n width: 38, height: 38, top: 2, left: 4,\n background: 'radial-gradient(circle, rgba(59,130,246,0.5) 0%, transparent 70%)',\n filter: 'blur(10px)',\n animation: 'cl-glob 3.5s ease-in-out infinite',\n willChange: 'transform, opacity',\n }} />\n <div className=\"absolute rounded-full\" style={{\n width: 34, height: 34, top: 14, right: 2,\n background: 'radial-gradient(circle, rgba(168,85,247,0.45) 0%, transparent 70%)',\n filter: 'blur(10px)',\n animation: 'cl-glob-2 4s ease-in-out infinite',\n willChange: 'transform, opacity',\n }} />\n <div className=\"absolute rounded-full\" style={{\n width: 30, height: 30, bottom: 2, left: 12,\n background: 'radial-gradient(circle, rgba(52,211,153,0.4) 0%, transparent 70%)',\n filter: 'blur(10px)',\n animation: 'cl-glob 4.2s ease-in-out infinite reverse',\n willChange: 'transform, opacity',\n }} />\n <div className=\"absolute inset-0 flex items-center justify-center\" style={{ animation: 'cl-float 2.5s ease-in-out infinite' }}>\n <div className=\"w-9 h-9 rounded-lg bg-white/[0.06] backdrop-blur-sm border border-white/[0.08] flex items-center justify-center\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"opacity-70\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n </svg>\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-blue-400 animate-bounce\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-1.5 h-1.5 rounded-full bg-purple-400 animate-bounce\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-400 animate-bounce\" style={{ animationDelay: '300ms' }} />\n </div>\n <p className=\"text-text-dim text-sm\">{message}</p>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport useUIStore from '../../store/useUIStore'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useMemo } from 'react'\n\nfunction ShortcutRow({ keys, action }) {\n return (\n <div className=\"flex items-center justify-between py-1.5\">\n <span className=\"text-text-secondary text-xs\">{action}</span>\n <div className=\"flex items-center gap-1\">\n {keys.split('+').map((key, i) => (\n <span key={i}>\n {i > 0 && <span className=\"text-text-dim text-xs mx-0.5\">+</span>}\n <kbd className=\"px-1.5 py-0.5 bg-surface-dark rounded text-text-muted text-xs border border-border font-[lixFont]\">\n {key.trim()}\n </kbd>\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction ShortcutSection({ title, shortcuts }) {\n return (\n <div>\n <h3 className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">{title}</h3>\n {shortcuts.map((s) => (\n <ShortcutRow key={s.action} keys={s.keys} action={s.action} />\n ))}\n </div>\n )\n}\n\nexport default function ShortcutsModal() {\n const { t } = useTranslation()\n const shortcutsModalOpen = useUIStore((s) => s.shortcutsModalOpen)\n const toggleShortcutsModal = useUIStore((s) => s.toggleShortcutsModal)\n\n const TOOL_SHORTCUTS = useMemo(() => [\n { keys: 'H', action: t('shortcuts.pan') },\n { keys: 'V / 1', action: t('shortcuts.selection') },\n { keys: 'R / 2', action: t('shortcuts.rectangle') },\n { keys: '3', action: t('shortcuts.diamond') },\n { keys: 'O / 4', action: t('shortcuts.circle') },\n { keys: 'A / 5', action: t('shortcuts.arrow') },\n { keys: 'L / 6', action: t('shortcuts.line') },\n { keys: 'P / 7', action: t('shortcuts.freehand') },\n { keys: 'T / 8', action: t('shortcuts.text') },\n { keys: '9', action: t('shortcuts.image') },\n { keys: 'E / 0', action: t('shortcuts.eraser') },\n { keys: 'F', action: t('shortcuts.frame') },\n { keys: 'K', action: t('shortcuts.laser') },\n ], [t])\n\n const ACTION_SHORTCUTS = useMemo(() => [\n { keys: 'Ctrl+A', action: t('shortcuts.selectAll') },\n { keys: 'Ctrl+G', action: t('shortcuts.group') },\n { keys: 'Ctrl+Shift+G', action: t('shortcuts.ungroup') },\n { keys: 'Ctrl+D', action: t('shortcuts.duplicate') },\n { keys: 'Ctrl+S', action: t('shortcuts.quickSave') },\n { keys: 'Ctrl+Shift+S', action: t('shortcuts.saveShare') },\n { keys: 'Ctrl+F', action: t('shortcuts.findOnCanvas') },\n { keys: 'Ctrl+C', action: t('shortcuts.copy') },\n { keys: 'Ctrl+V', action: t('shortcuts.paste') },\n { keys: 'Ctrl+Z', action: t('shortcuts.undo') },\n { keys: 'Ctrl+Shift+Z', action: t('shortcuts.redo') },\n { keys: 'Esc', action: t('shortcuts.deselect') },\n { keys: 'Del', action: t('shortcuts.delete') },\n { keys: 'Space', action: t('shortcuts.holdToPan') },\n { keys: 'Shift', action: t('shortcuts.straightDraw') },\n ], [t])\n\n const VIEW_SHORTCUTS = useMemo(() => [\n { keys: 'Ctrl++', action: t('shortcuts.zoomIn') },\n { keys: 'Ctrl+-', action: t('shortcuts.zoomOut') },\n { keys: 'Ctrl+0', action: t('shortcuts.resetZoom') },\n { keys: \"Ctrl+'\", action: t('shortcuts.toggleGrid') },\n { keys: 'Ctrl+/', action: t('shortcuts.shortcutsHelp') },\n ], [t])\n\n if (!shortcutsModalOpen) return null\n\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex items-center justify-center font-[lixFont]\"\n onClick={toggleShortcutsModal}\n >\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" />\n\n {/* Modal */}\n <div\n className=\"relative bg-surface-card border border-border-light rounded-2xl p-6 max-w-[600px] w-full mx-4 max-h-[80vh] overflow-y-auto no-scrollbar\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between mb-5\">\n <h2 className=\"text-text-primary text-base font-medium\">\n {t('shortcuts.title')}\n </h2>\n <button\n onClick={toggleShortcutsModal}\n className=\"w-7 h-7 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-x text-xl\" />\n </button>\n </div>\n\n {/* Two columns */}\n <div className=\"grid grid-cols-2 gap-6\">\n {/* Left column - Tools */}\n <ShortcutSection title={t('shortcuts.tools')} shortcuts={TOOL_SHORTCUTS} />\n\n {/* Right column - Actions + View */}\n <div className=\"flex flex-col gap-4\">\n <ShortcutSection title={t('shortcuts.actions')} shortcuts={ACTION_SHORTCUTS} />\n <ShortcutSection title={t('shortcuts.view')} shortcuts={VIEW_SHORTCUTS} />\n </div>\n </div>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState, useEffect, useRef } from 'react'\nimport useUIStore from '../../store/useUIStore'\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\n\nconst COMMANDS = [\n // --- App ---\n { label: 'Library', icon: 'bx-library', section: 'App' },\n { label: 'Find on canvas', icon: 'bx-search', section: 'App', shortcut: 'Ctrl+F', action: 'findOnCanvas' },\n { label: 'Live collaboration...', icon: 'bx-group', section: 'App' },\n { label: 'Share', icon: 'bx-share-alt', section: 'App' },\n { label: 'Toggle theme', icon: 'bx-sun', section: 'App', action: 'toggleTheme' },\n\n // --- Export ---\n { label: 'Export image...', icon: 'bx-image', section: 'Export', shortcut: 'Ctrl+Shift+E', action: 'exportImage' },\n { label: 'Save to disk', icon: 'bx-download', section: 'Export', shortcut: 'Ctrl+S', action: 'save' },\n { label: 'Copy to clipboard as PNG', icon: 'bx-clipboard', section: 'Export', shortcut: 'Shift+Alt+C', action: 'copyPNG' },\n { label: 'Copy to clipboard as SVG', icon: 'bx-code-alt', section: 'Export', shortcut: null, action: 'copySVG' },\n { label: 'Open scene file', icon: 'bx-folder-open', section: 'Export', shortcut: 'Ctrl+O', action: 'load' },\n\n // --- Editor ---\n { label: 'Undo', icon: 'bx-undo', section: 'Editor', action: 'undo' },\n { label: 'Redo', icon: 'bx-redo', section: 'Editor', action: 'redo' },\n { label: 'Zoom in', icon: 'bx-plus', section: 'Editor', shortcut: 'Ctrl++' },\n { label: 'Zoom out', icon: 'bx-minus', section: 'Editor', shortcut: 'Ctrl+-' },\n { label: 'Reset zoom', icon: 'bx-reset', section: 'Editor', shortcut: 'Ctrl+0' },\n { label: 'Zoom to fit all elements', icon: 'bx-fullscreen', section: 'Editor', shortcut: 'Shift+1' },\n { label: 'Toggle grid', icon: 'bx-grid-alt', section: 'Editor', shortcut: \"Ctrl+'\", action: 'toggleGrid' },\n { label: 'Shortcuts & help', icon: 'bx-help-circle', section: 'Editor', shortcut: '?', action: 'help' },\n { label: 'Select all', icon: 'bx-select-multiple', section: 'Editor', shortcut: 'Ctrl+A', action: 'selectAll' },\n { label: 'Reset canvas', icon: 'bx-trash', section: 'Editor', shortcut: 'Ctrl+Delete', action: 'resetCanvas' },\n { label: 'Canvas background', icon: 'bx-palette', section: 'Editor', action: 'openMenu' },\n\n // --- Tools ---\n { label: 'Hand (panning tool)', icon: 'bx-hand', section: 'Tools', shortcut: 'H', action: 'tool:pan' },\n { label: 'Selection', icon: 'bx-pointer', section: 'Tools', shortcut: 'V', action: 'tool:select' },\n { label: 'Rectangle', icon: 'bx-rectangle', section: 'Tools', shortcut: 'R', action: 'tool:rectangle' },\n { label: 'Diamond', icon: 'bx-diamond', section: 'Tools', shortcut: 'D', action: 'tool:diamond' },\n { label: 'Circle', icon: 'bx-circle', section: 'Tools', shortcut: 'O', action: 'tool:circle' },\n { label: 'Arrow', icon: 'bx-right-arrow-alt', section: 'Tools', shortcut: 'A', action: 'tool:arrow' },\n { label: 'Line', icon: 'bx-minus', section: 'Tools', shortcut: 'L', action: 'tool:line' },\n { label: 'Draw', icon: 'bx-pencil', section: 'Tools', shortcut: 'P', action: 'tool:freehand' },\n { label: 'Text', icon: 'bx-text', section: 'Tools', shortcut: 'T', action: 'tool:text' },\n { label: 'Insert image', icon: 'bx-image-add', section: 'Tools', shortcut: '9', action: 'tool:image' },\n { label: 'Eraser', icon: 'bx-eraser', section: 'Tools', shortcut: 'E', action: 'tool:eraser' },\n { label: 'Laser pointer', icon: 'bxs-magic-wand', section: 'Tools', shortcut: 'K', action: 'tool:laser' },\n { label: 'Frame tool', icon: 'bx-border-all', section: 'Tools', shortcut: 'F', action: 'tool:frame' },\n // AI entries removed \u2014 feature is hidden behind a coming-soon screen.\n // Restore \"Text to diagram...\" / \"Mermaid to diagram...\" here when the\n // assistant ships.\n\n // --- Links ---\n { label: 'GitHub', icon: 'bxl-github', section: 'Links', action: 'link:github' },\n { label: 'Report an issue', icon: 'bx-bug', section: 'Links', action: 'link:issues' },\n]\n\nconst TOOL_ACTION_MAP = {\n 'tool:pan': TOOLS.PAN,\n 'tool:select': TOOLS.SELECT,\n 'tool:rectangle': TOOLS.RECTANGLE,\n 'tool:diamond': TOOLS.RECTANGLE, // diamond is a rectangle variant\n 'tool:circle': TOOLS.CIRCLE,\n 'tool:arrow': TOOLS.ARROW,\n 'tool:line': TOOLS.LINE,\n 'tool:freehand': TOOLS.FREEHAND,\n 'tool:text': TOOLS.TEXT,\n 'tool:image': TOOLS.IMAGE,\n 'tool:eraser': TOOLS.ERASER,\n 'tool:laser': TOOLS.LASER,\n 'tool:frame': TOOLS.FRAME,\n}\n\nexport default function CommandPalette() {\n const open = useUIStore((s) => s.commandPaletteOpen)\n const toggleCommandPalette = useUIStore((s) => s.toggleCommandPalette)\n const [query, setQuery] = useState('')\n const [selectedIndex, setSelectedIndex] = useState(0)\n const inputRef = useRef(null)\n const listRef = useRef(null)\n\n useEffect(() => {\n if (open) {\n setQuery('')\n setSelectedIndex(0)\n setTimeout(() => inputRef.current?.focus(), 50)\n }\n }, [open])\n\n // Scroll selected item into view\n useEffect(() => {\n if (!open) return\n const el = listRef.current?.querySelector(`[data-index=\"${selectedIndex}\"]`)\n if (el) el.scrollIntoView({ block: 'nearest' })\n }, [selectedIndex, open])\n\n // Reset selection on query change\n useEffect(() => {\n setSelectedIndex(0)\n }, [query])\n\n if (!open) return null\n\n const filtered = query\n ? COMMANDS.filter((c) =>\n c.label.toLowerCase().includes(query.toLowerCase())\n )\n : COMMANDS\n\n // Group into sections preserving order\n const sectionOrder = []\n const sections = {}\n filtered.forEach((c) => {\n if (!sections[c.section]) {\n sections[c.section] = []\n sectionOrder.push(c.section)\n }\n sections[c.section].push(c)\n })\n\n const handleCommand = (cmd) => {\n toggleCommandPalette()\n const action = cmd.action\n\n if (!action) return\n\n // Tool switching\n if (action.startsWith('tool:')) {\n const tool = TOOL_ACTION_MAP[action]\n if (tool) useSketchStore.getState().setActiveTool(tool)\n return\n }\n\n // Links\n if (action === 'link:github') {\n window.open('https://github.com/elixpo/sketch.elixpo', '_blank')\n return\n }\n if (action === 'link:issues') {\n window.open('https://github.com/elixpo/sketch.elixpo/issues', '_blank')\n return\n }\n\n const serializer = window.__sceneSerializer\n\n switch (action) {\n case 'toggleTheme': {\n const store = useUIStore.getState()\n store.setTheme(store.theme === 'dark' ? 'light' : 'dark')\n break\n }\n case 'toggleGrid':\n useSketchStore.getState().toggleGrid()\n break\n case 'save': {\n const name = useUIStore.getState().workspaceName || 'Untitled'\n serializer?.download(name)\n break\n }\n case 'load':\n serializer?.upload()\n break\n case 'exportImage':\n useUIStore.getState().toggleExportImageModal()\n break\n case 'copyPNG':\n serializer?.copyAsPNG()\n break\n case 'copySVG':\n serializer?.copyAsSVG()\n break\n case 'undo':\n if (typeof window.undo === 'function') window.undo()\n break\n case 'redo':\n if (typeof window.redo === 'function') window.redo()\n break\n case 'selectAll':\n useSketchStore.getState().setActiveTool(TOOLS.SELECT)\n if (window.multiSelection && window.shapes) {\n window.multiSelection.clearSelection()\n window.shapes.forEach(shape => window.multiSelection.addShape(shape))\n }\n break\n case 'resetCanvas': {\n const serializer = window.__sceneSerializer\n if (serializer?.resetCanvas) {\n serializer.resetCanvas()\n }\n useSketchStore.getState().clearShapes()\n useSketchStore.getState().clearHistory()\n break\n }\n case 'findOnCanvas':\n useUIStore.getState().toggleFindBar()\n break\n case 'help':\n useUIStore.getState().toggleHelpModal()\n break\n case 'aiModal':\n useUIStore.getState().toggleAIModal()\n break\n case 'openMenu':\n useUIStore.getState().toggleMenu()\n break\n }\n }\n\n const handleKeyDown = (e) => {\n if (e.key === 'Escape') {\n toggleCommandPalette()\n return\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setSelectedIndex((i) => Math.min(i + 1, filtered.length - 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setSelectedIndex((i) => Math.max(i - 1, 0))\n } else if (e.key === 'Enter' && filtered[selectedIndex]) {\n e.preventDefault()\n handleCommand(filtered[selectedIndex])\n }\n }\n\n let flatIndex = -1\n\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex items-start justify-center pt-[12vh] font-[lixFont]\"\n onClick={toggleCommandPalette}\n >\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" />\n\n <div\n className=\"relative bg-surface-card border border-border-light rounded-2xl w-full max-w-[540px] mx-4 overflow-hidden\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Search */}\n <div className=\"flex items-center gap-3 px-4 py-3 border-b border-border-light\">\n <i className=\"bx bx-search text-text-muted text-lg\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search commands...\"\n className=\"flex-1 bg-transparent text-text-primary text-sm outline-none placeholder:text-text-dim font-[lixFont]\"\n onKeyDown={handleKeyDown}\n />\n </div>\n\n {/* Results */}\n <div ref={listRef} className=\"max-h-[55vh] overflow-y-auto no-scrollbar py-2\">\n {filtered.length === 0 && (\n <div className=\"px-4 py-6 text-center text-text-dim text-xs\">\n No commands found\n </div>\n )}\n\n {sectionOrder.map((section) => (\n <div key={section}>\n <div className=\"px-4 pt-3 pb-1\">\n <span className=\"text-text-dim text-xs uppercase tracking-wider\">\n {section}\n </span>\n </div>\n {sections[section].map((cmd) => {\n flatIndex++\n const idx = flatIndex\n return (\n <button\n key={cmd.label}\n data-index={idx}\n onClick={() => handleCommand(cmd)}\n className={`w-full flex items-center justify-between px-4 py-2 text-text-secondary text-xs transition-all duration-100 ${\n idx === selectedIndex\n ? 'bg-surface-hover text-text-primary'\n : 'hover:bg-surface-hover/60'\n }`}\n >\n <span className=\"flex items-center gap-3\">\n <i className={`bx ${cmd.icon} text-base text-text-muted`} />\n {cmd.label}\n </span>\n {cmd.shortcut && (\n <div className=\"flex items-center gap-0.5\">\n {cmd.shortcut.split('+').map((key, i) => (\n <span key={i}>\n {i > 0 && <span className=\"text-text-dim text-xs mx-0.5\">+</span>}\n <kbd className=\"px-1.5 py-0.5 bg-surface-dark rounded text-text-dim text-xs border border-border\">\n {key.trim()}\n </kbd>\n </span>\n ))}\n </div>\n )}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState, useEffect, useRef, useCallback } from 'react'\nimport useUIStore from '../../store/useUIStore'\n\nconst SCALES = [1, 2, 3]\n\nfunction getCleanSVG() {\n const svgEl = window.svg\n if (!svgEl) return null\n const clone = svgEl.cloneNode(true)\n clone.querySelectorAll(\n '[data-selection], .selection-handle, .resize-handle, .rotation-handle, .anchor, .rotate-anchor'\n ).forEach((el) => el.remove())\n return clone\n}\n\nfunction renderToCanvas(clone, scale, bgColor) {\n return new Promise((resolve) => {\n const svgData = new XMLSerializer().serializeToString(clone)\n const vb = window.svg.viewBox.baseVal\n const canvas = document.createElement('canvas')\n canvas.width = vb.width * scale\n canvas.height = vb.height * scale\n const ctx = canvas.getContext('2d')\n ctx.scale(scale, scale)\n\n const img = new Image()\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n\n img.onload = () => {\n if (bgColor) {\n ctx.fillStyle = bgColor\n ctx.fillRect(0, 0, vb.width, vb.height)\n }\n ctx.drawImage(img, 0, 0, vb.width, vb.height)\n URL.revokeObjectURL(url)\n resolve(canvas)\n }\n img.onerror = () => {\n URL.revokeObjectURL(url)\n resolve(null)\n }\n img.src = url\n })\n}\n\nexport default function ExportImageModal() {\n const open = useUIStore((s) => s.exportImageModalOpen)\n const toggleModal = useUIStore((s) => s.toggleExportImageModal)\n\n const [scale, setScale] = useState(2)\n const [bgMode, setBgMode] = useState('dark') // 'dark' | 'light' | 'none'\n const [previewUrl, setPreviewUrl] = useState(null)\n const previewRef = useRef(null)\n\n const getBgColor = useCallback(() => {\n if (bgMode === 'dark') return '#121212'\n if (bgMode === 'light') return '#ffffff'\n return null // transparent\n }, [bgMode])\n\n // Generate preview whenever settings change\n useEffect(() => {\n if (!open) return\n let cancelled = false\n\n const generate = async () => {\n const clone = getCleanSVG()\n if (!clone) return\n // Preview at 1x for speed\n const canvas = await renderToCanvas(clone, 1, getBgColor())\n if (cancelled || !canvas) return\n setPreviewUrl(canvas.toDataURL('image/png'))\n }\n generate()\n\n return () => { cancelled = true }\n }, [open, bgMode, getBgColor])\n\n if (!open) return null\n\n const handleExportPNG = async () => {\n const clone = getCleanSVG()\n if (!clone) return\n const canvas = await renderToCanvas(clone, scale, getBgColor())\n if (!canvas) return\n\n canvas.toBlob((blob) => {\n const a = document.createElement('a')\n a.href = URL.createObjectURL(blob)\n a.download = `lixsketch-export-${scale}x.png`\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n }, 'image/png')\n toggleModal()\n }\n\n const handleExportSVG = () => {\n const clone = getCleanSVG()\n if (!clone) return\n // Apply background as a rect if needed\n const bg = getBgColor()\n if (bg) {\n const ns = 'http://www.w3.org/2000/svg'\n const rect = document.createElementNS(ns, 'rect')\n const vb = window.svg.viewBox.baseVal\n rect.setAttribute('width', vb.width)\n rect.setAttribute('height', vb.height)\n rect.setAttribute('fill', bg)\n clone.insertBefore(rect, clone.firstChild)\n }\n const svgData = new XMLSerializer().serializeToString(clone)\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' })\n const a = document.createElement('a')\n a.href = URL.createObjectURL(blob)\n a.download = 'lixsketch-export.svg'\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n toggleModal()\n }\n\n const handleCopyPNG = async () => {\n const clone = getCleanSVG()\n if (!clone) return\n const canvas = await renderToCanvas(clone, scale, getBgColor())\n if (!canvas) return\n\n canvas.toBlob((blob) => {\n if (!blob) return\n navigator.clipboard\n .write([new ClipboardItem({ 'image/png': blob })])\n .catch((err) => console.warn('Clipboard write failed:', err))\n }, 'image/png')\n toggleModal()\n }\n\n const handleCopySVG = () => {\n const clone = getCleanSVG()\n if (!clone) return\n const svgData = new XMLSerializer().serializeToString(clone)\n navigator.clipboard.writeText(svgData).catch((err) =>\n console.warn('Clipboard write failed:', err)\n )\n toggleModal()\n }\n\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex items-center justify-center font-[lixFont]\"\n onClick={toggleModal}\n >\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" />\n\n <div\n className=\"relative bg-surface-card border border-border-light rounded-2xl w-full max-w-[720px] mx-4 overflow-hidden\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 pt-5 pb-3\">\n <h2 className=\"text-text-primary text-base font-medium\">Export Image</h2>\n <button\n onClick={toggleModal}\n className=\"w-7 h-7 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-x text-xl\" />\n </button>\n </div>\n\n <hr className=\"border-border-light mx-6\" />\n\n {/* Body - two columns */}\n <div className=\"flex gap-0\">\n {/* Left - Preview */}\n <div className=\"flex-1 p-6 flex items-center justify-center min-h-[300px]\">\n <div\n ref={previewRef}\n className=\"w-full max-h-[320px] rounded-xl overflow-hidden border border-border-light flex items-center justify-center\"\n style={{ background: bgMode === 'none' ? 'repeating-conic-gradient(#2a2a35 0% 25%, #1e1e28 0% 50%) 0 0 / 16px 16px' : getBgColor() }}\n >\n {previewUrl ? (\n <img\n src={previewUrl}\n alt=\"Export preview\"\n className=\"w-full h-full object-contain max-h-[320px]\"\n />\n ) : (\n <span className=\"text-text-dim text-xs\">Generating preview...</span>\n )}\n </div>\n </div>\n\n {/* Right - Controls */}\n <div className=\"w-[240px] border-l border-border-light p-5 flex flex-col gap-5\">\n {/* Background */}\n <div>\n <p className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">Background</p>\n <div className=\"flex items-center gap-1\">\n {[\n { value: 'dark', label: 'Dark', icon: 'bxs-moon' },\n { value: 'light', label: 'Light', icon: 'bxs-sun' },\n { value: 'none', label: 'None', icon: 'bx-hide' },\n ].map((opt) => (\n <button\n key={opt.value}\n onClick={() => setBgMode(opt.value)}\n className={`flex-1 flex items-center justify-center gap-1 py-1.5 rounded-lg text-xs transition-all duration-200 ${\n bgMode === opt.value\n ? 'bg-accent text-text-primary'\n : 'text-text-muted hover:bg-surface-hover'\n }`}\n >\n <i className={`bx ${opt.icon} text-xs`} />\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Scale */}\n <div>\n <p className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">Scale</p>\n <div className=\"flex items-center gap-1\">\n {SCALES.map((s) => (\n <button\n key={s}\n onClick={() => setScale(s)}\n className={`flex-1 py-1.5 rounded-lg text-xs transition-all duration-200 ${\n scale === s\n ? 'bg-accent text-text-primary'\n : 'text-text-muted hover:bg-surface-hover'\n }`}\n >\n {s}x\n </button>\n ))}\n </div>\n </div>\n\n <hr className=\"border-border-light\" />\n\n {/* Export buttons */}\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={handleExportPNG}\n className=\"w-full flex items-center gap-2 px-3 py-2.5 rounded-lg bg-accent-blue hover:bg-accent-blue-hover text-text-primary text-xs transition-all duration-200\"\n >\n <i className=\"bx bx-image text-sm\" />\n Export as PNG\n </button>\n <button\n onClick={handleExportSVG}\n className=\"w-full flex items-center gap-2 px-3 py-2.5 rounded-lg bg-surface hover:bg-surface-hover border border-border text-text-secondary text-xs transition-all duration-200\"\n >\n <i className=\"bx bx-code-alt text-sm\" />\n Export as SVG\n </button>\n </div>\n\n <hr className=\"border-border-light\" />\n\n {/* Clipboard buttons */}\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={handleCopyPNG}\n className=\"w-full flex items-center gap-2 px-3 py-2 rounded-lg text-text-secondary text-xs hover:bg-surface-hover border border-border transition-all duration-200\"\n >\n <i className=\"bx bx-clipboard text-sm\" />\n Copy as PNG\n </button>\n <button\n onClick={handleCopySVG}\n className=\"w-full flex items-center gap-2 px-3 py-2 rounded-lg text-text-secondary text-xs hover:bg-surface-hover border border-border transition-all duration-200\"\n >\n <i className=\"bx bx-copy text-sm\" />\n Copy as SVG\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState } from 'react'\nimport useUIStore from '../../store/useUIStore'\n\nconst TOOL_SHORTCUTS = [\n { keys: 'H', action: 'Pan' },\n { keys: 'V / 1', action: 'Selection' },\n { keys: 'R / 2', action: 'Rectangle' },\n { keys: '3', action: 'Diamond' },\n { keys: 'O / 4', action: 'Circle' },\n { keys: 'A / 5', action: 'Arrow' },\n { keys: 'L / 6', action: 'Line' },\n { keys: 'P / 7', action: 'Freehand' },\n { keys: 'T / 8', action: 'Text' },\n { keys: '9', action: 'Image' },\n { keys: 'E / 0', action: 'Eraser' },\n { keys: 'F', action: 'Frame' },\n { keys: 'K', action: 'Laser' },\n]\n\nconst ACTION_SHORTCUTS = [\n { keys: 'Ctrl+A', action: 'Select All' },\n { keys: 'Ctrl+G', action: 'Group' },\n { keys: 'Ctrl+Shift+G', action: 'Ungroup' },\n { keys: 'Ctrl+D', action: 'Duplicate' },\n { keys: 'Ctrl+S', action: 'Quick Save (canvas + doc)' },\n { keys: 'Ctrl+C', action: 'Copy' },\n { keys: 'Ctrl+V', action: 'Paste' },\n { keys: 'Ctrl+Z', action: 'Undo' },\n { keys: 'Ctrl+Shift+Z', action: 'Redo' },\n { keys: 'Esc', action: 'Deselect' },\n { keys: 'Del / Backspace', action: 'Delete' },\n { keys: 'Space (hold)', action: 'Pan' },\n { keys: 'Shift (hold)', action: 'Straight Draw' },\n]\n\nconst VIEW_SHORTCUTS = [\n { keys: 'Ctrl++', action: 'Zoom In' },\n { keys: 'Ctrl+-', action: 'Zoom Out' },\n { keys: 'Ctrl+0', action: 'Reset Zoom' },\n { keys: \"Ctrl+'\", action: 'Toggle Grid' },\n { keys: 'Ctrl+/', action: 'Command Palette' },\n]\n\n// \u2500\u2500 Doc editor shortcuts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Markdown shortcuts auto-convert when typed at the start of a line.\nconst DOC_BLOCK_SHORTCUTS = [\n { keys: '# Space', action: 'Heading 1' },\n { keys: '## Space', action: 'Heading 2' },\n { keys: '### Space', action: 'Heading 3' },\n { keys: '> Space', action: 'Quote' },\n { keys: '- Space', action: 'Bulleted list' },\n { keys: '1. Space', action: 'Numbered list' },\n { keys: '[] Space', action: 'Checklist' },\n { keys: '``` Space', action: 'Code block' },\n { keys: '--- Enter', action: 'Divider' },\n { keys: '/', action: 'Block menu' },\n]\n\nconst DOC_INLINE_SHORTCUTS = [\n { keys: 'Ctrl+B', action: 'Bold' },\n { keys: 'Ctrl+I', action: 'Italic' },\n { keys: 'Ctrl+U', action: 'Underline' },\n { keys: 'Ctrl+Shift+S', action: 'Strikethrough' },\n { keys: 'Ctrl+E', action: 'Inline code' },\n { keys: 'Tab', action: 'Indent block' },\n { keys: 'Shift+Tab', action: 'Outdent block' },\n { keys: 'Ctrl+Z', action: 'Undo' },\n { keys: 'Ctrl+Shift+Z', action: 'Redo' },\n]\n\nconst TABS = [\n { id: 'canvas', label: 'Canvas', icon: 'bx-pen' },\n { id: 'docs', label: 'Document', icon: 'bxs-notepad' },\n]\n\nfunction ShortcutRow({ keys, action }) {\n return (\n <div className=\"flex items-center justify-between py-1.5\">\n <span className=\"text-text-secondary text-xs\">{action}</span>\n <div className=\"flex items-center gap-1\">\n {keys.split('+').map((key, i) => (\n <span key={i}>\n {i > 0 && <span className=\"text-text-dim text-xs mx-0.5\">+</span>}\n <kbd className=\"px-1.5 py-0.5 bg-surface-dark rounded text-text-muted text-xs border border-border font-[lixFont]\">\n {key.trim()}\n </kbd>\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction ShortcutSection({ title, shortcuts }) {\n return (\n <div>\n <h3 className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">{title}</h3>\n {shortcuts.map((s) => (\n <ShortcutRow key={s.action} keys={s.keys} action={s.action} />\n ))}\n </div>\n )\n}\n\nexport default function HelpModal() {\n const open = useUIStore((s) => s.helpModalOpen)\n const toggleHelpModal = useUIStore((s) => s.toggleHelpModal)\n const [activeTab, setActiveTab] = useState('canvas')\n\n if (!open) return null\n\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex items-center justify-center font-[lixFont]\"\n onClick={toggleHelpModal}\n >\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" />\n\n <div\n className=\"relative bg-surface-card border border-border-light rounded-2xl w-full max-w-[800px] mx-4 max-h-[85vh] flex flex-col\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 pt-5 pb-3\">\n <h2 className=\"text-text-primary text-base font-medium\">Shortcuts</h2>\n <button\n onClick={toggleHelpModal}\n className=\"w-7 h-7 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-x text-xl\" />\n </button>\n </div>\n\n {/* Tabs */}\n <div className=\"flex items-center gap-1 px-6 pb-3\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={`px-3 py-1.5 rounded-lg text-xs flex items-center gap-1.5 transition-all duration-200 ${\n activeTab === tab.id\n ? 'bg-surface-hover text-text-primary'\n : 'text-text-muted hover:text-text-secondary hover:bg-surface-hover/50'\n }`}\n >\n <i className={`bx ${tab.icon} text-sm`} />\n {tab.label}\n </button>\n ))}\n </div>\n\n <hr className=\"border-border-light mx-6\" />\n\n {/* Content - scrollable */}\n <div className=\"flex-1 overflow-y-auto no-scrollbar px-6 py-4\">\n {activeTab === 'canvas' && (\n <div className=\"grid grid-cols-2 gap-6\">\n <ShortcutSection title=\"Tools\" shortcuts={TOOL_SHORTCUTS} />\n <div className=\"flex flex-col gap-4\">\n <ShortcutSection title=\"Actions\" shortcuts={ACTION_SHORTCUTS} />\n <ShortcutSection title=\"View\" shortcuts={VIEW_SHORTCUTS} />\n </div>\n </div>\n )}\n\n {activeTab === 'docs' && (\n <div className=\"grid grid-cols-2 gap-6\">\n <ShortcutSection title=\"Block markdown\" shortcuts={DOC_BLOCK_SHORTCUTS} />\n <ShortcutSection title=\"Formatting\" shortcuts={DOC_INLINE_SHORTCUTS} />\n </div>\n )}\n </div>\n\n {/* Footer links */}\n <hr className=\"border-border-light mx-6\" />\n <div className=\"flex items-center gap-3 px-6 py-4 flex-wrap\">\n <a\n href=\"/docs\"\n className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-accent-blue/10 hover:bg-accent-blue/20 border border-accent-blue/20 text-accent-blue text-xs transition-all duration-200\"\n >\n <i className=\"bx bx-book-open text-sm\" />\n Documentation\n </a>\n <a\n href=\"https://github.com/elixpo/sketch.elixpo\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-surface hover:bg-surface-hover border border-border text-text-secondary text-xs transition-all duration-200\"\n >\n <i className=\"bx bxl-github text-sm\" />\n View Repository\n </a>\n <a\n href=\"https://github.com/elixpo/sketch.elixpo/issues\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-surface hover:bg-surface-hover border border-border text-text-secondary text-xs transition-all duration-200\"\n >\n <i className=\"bx bx-bug text-sm\" />\n Report An Issue\n </a>\n </div>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport useUIStore from '../../store/useUIStore'\n\nconst SAMPLE = `# LixScript \u2014 paste shapes / arrows in a simple DSL.\n# Hit Cmd/Ctrl+Enter to render onto the canvas.\n\nrect A \"Idea\" 100 100 220 90\nrect B \"Plan\" 400 100 220 90\nrect C \"Ship\" 700 100 220 90\n\narrow A -> B\narrow B -> C\n`\n\n/**\n * LixScript modal \u2014 takes a script the user types and parses it directly\n * into engine shapes via @elixpo/lixsketch's LixScriptParser. No AI\n * inference, no worker round-trip. Strictly client-side parsing.\n */\nexport default function LixScriptModal() {\n const open = useUIStore((s) => s.aiModalOpen)\n const toggle = useUIStore((s) => s.toggleAIModal)\n const [source, setSource] = useState(SAMPLE)\n const [busy, setBusy] = useState(false)\n const [status, setStatus] = useState(null) // { tone, message }\n const taRef = useRef(null)\n\n useEffect(() => {\n if (!open) return\n requestAnimationFrame(() => taRef.current?.focus())\n const onKey = (e) => {\n if (e.key === 'Escape') toggle()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, toggle])\n\n const render = useCallback(async () => {\n if (busy) return\n setBusy(true)\n setStatus(null)\n try {\n // Lazy-import the parser. Pulling it eagerly would bring the whole\n // shape graph into the entry chunk (see SceneSerializer comment\n // in LixSketchCanvas) and crash with \"svg is not defined\" before\n // engine.init() has wired the engine globals.\n const mod = await import('../../../core/LixScriptParser.js')\n const parsed = mod.parseLixScript(source)\n const resolved = mod.resolveShapeRefs ? mod.resolveShapeRefs(parsed) : parsed\n mod.renderLixScript(resolved)\n setStatus({ tone: 'success', message: `Rendered ${Array.isArray(resolved) ? resolved.length : '?'} elements.` })\n // Auto-close shortly after a successful render.\n setTimeout(() => { toggle() }, 700)\n } catch (err) {\n console.warn('[LixScriptModal] parse failed:', err)\n setStatus({ tone: 'error', message: err?.message || 'Parse failed.' })\n } finally {\n setBusy(false)\n }\n }, [source, busy, toggle])\n\n const handleKeyDown = useCallback((e) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault()\n render()\n }\n }, [render])\n\n if (!open) return null\n\n return (\n <div\n className=\"fixed inset-0 z-[1100] flex items-center justify-center bg-black/60 backdrop-blur-sm font-[lixFont]\"\n onClick={toggle}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div\n onClick={(e) => e.stopPropagation()}\n className=\"relative w-[560px] max-w-[94vw] bg-surface border border-border-light rounded-2xl p-5 shadow-2xl flex flex-col gap-3\"\n >\n <button\n onClick={toggle}\n className=\"absolute top-3 right-3 w-7 h-7 flex items-center justify-center rounded-md text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n title=\"Close (Esc)\"\n >\n <i className=\"bx bx-x text-lg\" />\n </button>\n\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-lg bg-accent-blue/10 border border-accent-blue/30 flex items-center justify-center\">\n <i className=\"bx bx-code-alt text-accent-blue\" />\n </div>\n <div className=\"flex-1\">\n <h2 className=\"text-text-primary text-sm font-medium\">LixScript</h2>\n <p className=\"text-text-dim text-[11px]\">Type shapes + arrows, render directly. No AI involved.</p>\n </div>\n </div>\n\n <textarea\n ref={taRef}\n value={source}\n onChange={(e) => setSource(e.target.value)}\n onKeyDown={handleKeyDown}\n spellCheck={false}\n className=\"w-full h-[260px] resize-none bg-surface-card border border-border-light rounded-lg px-3 py-2 text-[12px] text-text-primary font-[lixCode] outline-none focus:border-accent-blue/50\"\n />\n\n <div className=\"flex items-center justify-between\">\n {status ? (\n <span className={`text-[11px] ${status.tone === 'error' ? 'text-red-400' : 'text-green-400'}`}>\n {status.message}\n </span>\n ) : (\n <span className=\"text-text-dim text-[11px]\">Cmd/Ctrl+Enter to render \u00B7 Esc to close</span>\n )}\n <button\n onClick={render}\n disabled={busy}\n className=\"px-3 py-1.5 rounded-lg bg-accent-blue text-text-primary text-[12px] font-medium hover:bg-accent-blue-hover transition-colors disabled:opacity-50 disabled:pointer-events-none\"\n >\n {busy ? 'Rendering\u2026' : 'Render'}\n </button>\n </div>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport useUIStore from '../../store/useUIStore'\n\nconst SAMPLE = `# One equation per line. Comments start with #.\n# Hit Cmd/Ctrl+Enter to render onto the canvas.\n\ny = x^2\ny = sin(x) * 3\ny = -x + 2\n`\n\nconst DEFAULT_SETTINGS = { xMin: -10, xMax: 10, yMin: -10, yMax: 10, showGrid: true }\n\nfunction parseEquations(text) {\n return text\n .split(/\\r?\\n/)\n .map((s) => s.trim())\n .filter((s) => s && !s.startsWith('#'))\n}\n\n/**\n * Graph modal \u2014 plots client-side via the engine's GraphRenderer. No\n * inference; the math is parsed by GraphMathParser.parseExpression.\n * Inserts the rendered graph onto the canvas through the bridge\n * SketchEngine.init() exposes as `window.__graphRenderer`.\n */\nexport default function GraphModal() {\n const open = useUIStore((s) => s.graphModalOpen)\n const toggle = useUIStore((s) => s.toggleGraphModal)\n const [source, setSource] = useState(SAMPLE)\n const [settings, setSettings] = useState(DEFAULT_SETTINGS)\n const [busy, setBusy] = useState(false)\n const [status, setStatus] = useState(null)\n const taRef = useRef(null)\n\n useEffect(() => {\n if (!open) return\n requestAnimationFrame(() => taRef.current?.focus())\n const onKey = (e) => {\n if (e.key === 'Escape') toggle()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, toggle])\n\n const render = useCallback(async () => {\n if (busy) return\n setBusy(true)\n setStatus(null)\n try {\n const equations = parseEquations(source)\n if (equations.length === 0) {\n setStatus({ tone: 'error', message: 'Add at least one equation.' })\n return\n }\n // Validate via the engine's parser before handing to the renderer.\n const { parseExpression } = await import('../../../core/GraphMathParser.js')\n const bad = equations.find((eq) => !parseExpression(eq))\n if (bad) {\n setStatus({ tone: 'error', message: `Could not parse: ${bad}` })\n return\n }\n if (typeof window.__graphRenderer === 'function') {\n window.__graphRenderer(equations, settings)\n setStatus({ tone: 'success', message: `Plotted ${equations.length} equation(s).` })\n setTimeout(() => { toggle() }, 700)\n } else {\n setStatus({ tone: 'error', message: 'Graph engine not ready yet \u2014 wait a moment and retry.' })\n }\n } catch (err) {\n console.warn('[GraphModal] render failed:', err)\n setStatus({ tone: 'error', message: err?.message || 'Render failed.' })\n } finally {\n setBusy(false)\n }\n }, [source, settings, busy, toggle])\n\n const handleKeyDown = useCallback((e) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault()\n render()\n }\n }, [render])\n\n const setRange = (key) => (e) => {\n const v = parseFloat(e.target.value)\n if (Number.isFinite(v)) setSettings((s) => ({ ...s, [key]: v }))\n }\n\n if (!open) return null\n\n return (\n <div\n className=\"fixed inset-0 z-[1100] flex items-center justify-center bg-black/60 backdrop-blur-sm font-[lixFont]\"\n onClick={toggle}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div\n onClick={(e) => e.stopPropagation()}\n className=\"relative w-[560px] max-w-[94vw] bg-surface border border-border-light rounded-2xl p-5 shadow-2xl flex flex-col gap-3\"\n >\n <button\n onClick={toggle}\n className=\"absolute top-3 right-3 w-7 h-7 flex items-center justify-center rounded-md text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n title=\"Close (Esc)\"\n >\n <i className=\"bx bx-x text-lg\" />\n </button>\n\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-lg bg-accent-blue/10 border border-accent-blue/30 flex items-center justify-center\">\n <i className=\"bx bx-line-chart text-accent-blue\" />\n </div>\n <div className=\"flex-1\">\n <h2 className=\"text-text-primary text-sm font-medium\">Graph</h2>\n <p className=\"text-text-dim text-[11px]\">One equation per line \u2014 plotted on the canvas. No AI involved.</p>\n </div>\n </div>\n\n <textarea\n ref={taRef}\n value={source}\n onChange={(e) => setSource(e.target.value)}\n onKeyDown={handleKeyDown}\n spellCheck={false}\n className=\"w-full h-[200px] resize-none bg-surface-card border border-border-light rounded-lg px-3 py-2 text-[12px] text-text-primary font-[lixCode] outline-none focus:border-accent-blue/50\"\n />\n\n <div className=\"grid grid-cols-4 gap-2 text-[11px]\">\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-text-dim\">xMin</span>\n <input type=\"number\" value={settings.xMin} onChange={setRange('xMin')}\n className=\"bg-surface-card border border-border-light rounded px-2 py-1 text-text-primary outline-none focus:border-accent-blue/50\" />\n </label>\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-text-dim\">xMax</span>\n <input type=\"number\" value={settings.xMax} onChange={setRange('xMax')}\n className=\"bg-surface-card border border-border-light rounded px-2 py-1 text-text-primary outline-none focus:border-accent-blue/50\" />\n </label>\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-text-dim\">yMin</span>\n <input type=\"number\" value={settings.yMin} onChange={setRange('yMin')}\n className=\"bg-surface-card border border-border-light rounded px-2 py-1 text-text-primary outline-none focus:border-accent-blue/50\" />\n </label>\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-text-dim\">yMax</span>\n <input type=\"number\" value={settings.yMax} onChange={setRange('yMax')}\n className=\"bg-surface-card border border-border-light rounded px-2 py-1 text-text-primary outline-none focus:border-accent-blue/50\" />\n </label>\n </div>\n\n <div className=\"flex items-center justify-between\">\n {status ? (\n <span className={`text-[11px] ${status.tone === 'error' ? 'text-red-400' : 'text-green-400'}`}>\n {status.message}\n </span>\n ) : (\n <span className=\"text-text-dim text-[11px]\">Cmd/Ctrl+Enter to render \u00B7 Esc to close</span>\n )}\n <button\n onClick={render}\n disabled={busy}\n className=\"px-3 py-1.5 rounded-lg bg-accent-blue text-text-primary text-[12px] font-medium hover:bg-accent-blue-hover transition-colors disabled:opacity-50 disabled:pointer-events-none\"\n >\n {busy ? 'Plotting\u2026' : 'Plot'}\n </button>\n </div>\n </div>\n </div>\n )\n}\n", "// Standalone TOOLS enum re-export. The engine's index.js also exports\n// TOOLS but doing it from here lets the React subpath avoid pulling\n// in side-effectful modules (SceneSerializer, shape graph) just to read\n// a constants map. Keep these values in lockstep with src/index.js.\nexport const TOOLS = {\n SELECT: 'select',\n PAN: 'pan',\n RECTANGLE: 'rectangle',\n CIRCLE: 'circle',\n LINE: 'line',\n ARROW: 'arrow',\n FREEHAND: 'freehand',\n TEXT: 'text',\n CODE: 'code',\n ERASER: 'eraser',\n LASER: 'laser',\n IMAGE: 'image',\n FRAME: 'frame',\n ICON: 'icon',\n};\n", "/* eslint-disable */\n/**\n * Engine-local keyboard shortcuts.\n *\n * These are the shortcuts that operate purely on engine state (tool switching,\n * shape deletion, selection, grouping, space-to-pan, escape-deselect). They\n * intentionally do NOT include product-level shortcuts (cloud save, modal\n * toggles, theme switches) \u2014 those belong to the consumer app.\n *\n * Usage:\n * import { installEngineShortcuts } from '@elixpo/lixsketch';\n * const uninstall = installEngineShortcuts(engine);\n * // later:\n * uninstall();\n *\n * Hosts can pass `options.onToast(message, tone)` to surface group/ungroup\n * confirmations, and `options.skipWhen(event)` to suppress shortcuts in\n * specific contexts (e.g. when the host's overlay is focused).\n */\n\n// NB: tool names are inlined as string literals below (rather than imported\n// from `./index.js`) to avoid a module-init cycle. EngineShortcuts.js and\n// index.js import each other; if SHORTCUT_MAP read TOOLS.PAN at the top\n// level, it would evaluate before index.js had populated TOOLS, throwing\n// \"TOOLS is undefined\" once esbuild splits this into a chunk.\n//\n// The values still match TOOLS.* exactly. If you change one, change both.\nexport const SHORTCUT_MAP = {\n h: 'pan',\n v: 'select',\n 1: 'select',\n r: 'rectangle',\n 2: 'rectangle',\n o: 'circle',\n 4: 'circle',\n a: 'arrow',\n 5: 'arrow',\n l: 'line',\n 6: 'line',\n p: 'freehand',\n 7: 'freehand',\n t: 'text',\n 8: 'text',\n 9: 'image',\n e: 'eraser',\n 0: 'eraser',\n i: 'icon',\n f: 'frame',\n k: 'laser',\n};\n\n// Mirror of TOOLS used inside this module's function bodies. Local copy\n// avoids the same module-init cycle while still letting callers compare\n// engine state against named constants instead of magic strings.\nconst TOOLS = {\n SELECT: 'select',\n PAN: 'pan',\n RECTANGLE: 'rectangle',\n CIRCLE: 'circle',\n LINE: 'line',\n ARROW: 'arrow',\n FREEHAND: 'freehand',\n TEXT: 'text',\n CODE: 'code',\n ERASER: 'eraser',\n LASER: 'laser',\n IMAGE: 'image',\n FRAME: 'frame',\n ICON: 'icon',\n};\n\nfunction isTypingTarget(target) {\n if (!target) return false;\n const tag = (target.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea') return true;\n if (target.isContentEditable) return true;\n return false;\n}\n\n/**\n * Install engine-local keyboard shortcuts on `document`.\n *\n * @param {object} engine - The SketchEngine instance (must have `setActiveTool`).\n * @param {object} [options]\n * @param {function} [options.onToast] - (message, { tone }) => void; called\n * for group/ungroup confirmations. No-op by default.\n * @param {function} [options.skipWhen] - (event) => boolean; return true to\n * skip shortcut handling for an event. Use to defer to your own\n * editor overlays. Default skips inputs/contenteditable only.\n * @param {function} [options.setActiveTool] - (tool) => void; override how\n * tool switching is dispatched. Useful when the consumer has its\n * own state store driving the engine \u2014 calling this keeps the UI\n * in sync without polling. Defaults to engine.setActiveTool.\n * @returns {function} uninstall function\n */\nexport function installEngineShortcuts(engine, options = {}) {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return () => { };\n }\n\n const onToast = typeof options.onToast === 'function' ? options.onToast : () => { };\n const skipWhen = typeof options.skipWhen === 'function' ? options.skipWhen : null;\n const customSetTool = typeof options.setActiveTool === 'function' ? options.setActiveTool : null;\n\n function setTool(tool) {\n if (customSetTool) { customSetTool(tool); return; }\n if (engine?.setActiveTool) engine.setActiveTool(tool);\n }\n\n function getActiveTool() {\n return engine?.activeTool || engine?.getActiveTool?.() || null;\n }\n\n function handleKeyDown(e) {\n const key = (e.key || '').toLowerCase();\n\n // Always check ctrl/cmd shortcuts first \u2014 they should fire even when\n // selection is empty, but skip when the user is typing.\n const isMod = e.ctrlKey || e.metaKey;\n\n if (isTypingTarget(e.target)) return;\n if (document.querySelector('.text-edit-overlay:not(.hidden)')) return;\n if (skipWhen && skipWhen(e)) return;\n\n if (isMod) {\n if (key === 'a' && !e.shiftKey) {\n e.preventDefault();\n setTool(TOOLS.SELECT);\n if (window.multiSelection && Array.isArray(window.shapes)) {\n window.multiSelection.clearSelection();\n window.shapes.forEach((shape) => window.multiSelection.addShape(shape));\n }\n return;\n }\n if (key === 'g' && !e.shiftKey) {\n e.preventDefault();\n try {\n const ms = window.multiSelection;\n const sel = ms?.selectedShapes;\n const targets = sel && sel.size > 1\n ? Array.from(sel)\n : (window.currentShape ? [window.currentShape] : []);\n if (targets.length > 1) {\n const newId = `g-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`;\n for (const s of targets) s.groupId = newId;\n if (typeof ms?.updateControls === 'function') ms.updateControls();\n onToast(`Grouped ${targets.length} shapes`, { tone: 'success' });\n }\n } catch (err) { console.warn('[EngineShortcuts] group failed:', err); }\n return;\n }\n if (key === 'g' && e.shiftKey) {\n e.preventDefault();\n try {\n const ms = window.multiSelection;\n const sel = ms?.selectedShapes;\n const targets = sel && sel.size > 0\n ? Array.from(sel)\n : (window.currentShape ? [window.currentShape] : []);\n const groupIds = new Set(targets.map((s) => s.groupId).filter(Boolean));\n if (groupIds.size > 0 && Array.isArray(window.shapes)) {\n let cleared = 0;\n for (const s of window.shapes) {\n if (s.groupId && groupIds.has(s.groupId)) { s.groupId = null; cleared++; }\n }\n if (typeof ms?.updateControls === 'function') ms.updateControls();\n onToast(`Ungrouped ${cleared} shapes`, { tone: 'success' });\n }\n } catch (err) { console.warn('[EngineShortcuts] ungroup failed:', err); }\n return;\n }\n // Ctrl+D = duplicate (engine-handled elsewhere \u2014 just preventDefault to\n // stop the browser's bookmark dialog).\n if (key === 'd') { e.preventDefault(); return; }\n return; // Other Ctrl combos are app-level; let the consumer handle them.\n }\n\n // Shift+1 = Fit to content\n if (e.shiftKey && (key === '1' || key === '!')) {\n e.preventDefault();\n if (typeof window.zoomFit === 'function') window.zoomFit();\n return;\n }\n\n // Delete / Backspace \u2014 remove selected shapes.\n if (e.key === 'Delete' || e.key === 'Backspace') {\n e.preventDefault();\n\n if (window.multiSelection?.selectedShapes?.size > 0) {\n if (typeof window.deleteSelectedShapes === 'function') {\n window.deleteSelectedShapes();\n }\n return;\n }\n\n if (window.currentShape) {\n const shape = window.currentShape;\n const shapes = window.shapes;\n const isFrame = shape.shapeName === 'frame';\n const isDiagramFrame = isFrame && !!shape._diagramType;\n\n // Issue #24 bug #7: regular frame \u2192 orphan children +\n // snapshot for undo (mirrors deleteSelectedShapes).\n let childSnapshot = null;\n if (isFrame && !isDiagramFrame) {\n childSnapshot = [...(shape.containedShapes || [])];\n for (const child of childSnapshot) {\n if (!child || child === shape) continue;\n const el = child.group || child.element;\n if (el) {\n if (shape.clipGroup && el.parentNode === shape.clipGroup) {\n shape.clipGroup.removeChild(el);\n }\n if (window.svg && el.parentNode !== window.svg) window.svg.appendChild(el);\n }\n child.parentFrame = null;\n delete child.isBeingMovedByFrame;\n }\n }\n\n if (shapes) {\n const idx = shapes.indexOf(shape);\n if (idx !== -1) shapes.splice(idx, 1);\n }\n if (typeof window.cleanupAttachments === 'function') {\n window.cleanupAttachments(shape);\n }\n if (shape.parentFrame && typeof shape.parentFrame.removeShapeFromFrame === 'function') {\n shape.parentFrame.removeShapeFromFrame(shape);\n }\n\n if (isFrame && !isDiagramFrame) {\n shape.containedShapes = [];\n if (shape.group && shape.group.parentNode) shape.group.parentNode.removeChild(shape.group);\n if (shape.clipGroup && shape.clipGroup.parentNode) shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n if (shape.clipPath && shape.clipPath.parentNode) shape.clipPath.parentNode.removeChild(shape.clipPath);\n } else {\n const el = shape.group || shape.element;\n if (el && el.parentNode) el.parentNode.removeChild(el);\n }\n\n if (typeof window.pushDeleteAction === 'function') {\n if (childSnapshot) window.pushDeleteAction(shape, { childSnapshot });\n else window.pushDeleteAction(shape);\n }\n window.currentShape = null;\n if (typeof window.disableAllSideBars === 'function') {\n window.disableAllSideBars();\n }\n }\n return;\n }\n\n // Tool-switching shortcuts (no modifier).\n if (!e.shiftKey && !e.altKey) {\n const tool = SHORTCUT_MAP[key];\n if (tool) {\n e.preventDefault();\n setTool(tool);\n return;\n }\n\n if (e.key === 'Escape') {\n // Engine-level deselect; consumer handles modal-close ordering.\n window.currentShape = null;\n if (typeof window.disableAllSideBars === 'function') {\n window.disableAllSideBars();\n }\n return;\n }\n }\n }\n\n // Space held = temporary pan. Releasing restores the previous tool.\n let spaceHeld = false;\n let toolBeforeSpace = null;\n\n function handleSpaceDown(e) {\n if (e.code !== 'Space' || spaceHeld) return;\n if (isTypingTarget(e.target)) return;\n if (skipWhen && skipWhen(e)) return;\n e.preventDefault();\n spaceHeld = true;\n const active = getActiveTool();\n if (active && active !== TOOLS.PAN) {\n toolBeforeSpace = active;\n setTool(TOOLS.PAN);\n }\n }\n\n function handleKeyUp(e) {\n if (e.code === 'Space' && spaceHeld) {\n spaceHeld = false;\n if (toolBeforeSpace) {\n setTool(toolBeforeSpace);\n toolBeforeSpace = null;\n }\n }\n }\n\n // Block browser zoom on Ctrl+wheel \u2014 engine's ZoomPan handles real zoom.\n function handleWheel(e) {\n if (e.ctrlKey || e.metaKey) e.preventDefault();\n }\n\n document.addEventListener('keydown', handleKeyDown);\n document.addEventListener('keydown', handleSpaceDown);\n document.addEventListener('keyup', handleKeyUp);\n document.addEventListener('wheel', handleWheel, { passive: false });\n\n return function uninstall() {\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('keydown', handleSpaceDown);\n document.removeEventListener('keyup', handleKeyUp);\n document.removeEventListener('wheel', handleWheel);\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["useCallback", "useEffect", "useRef", "useState", "create", "useRef", "useEffect", "useRef", "useEffect", "jsx", "jsxs", "jsx", "jsxs", "useState", "Fragment", "jsx", "jsxs", "useState", "t", "useState", "useRef", "useEffect", "jsx", "jsxs", "useState", "useRef", "useEffect", "useState", "useCallback", "jsx", "jsxs", "useState", "useCallback", "useState", "useCallback", "jsx", "jsxs", "STROKE_COLORS", "BG_COLORS", "FILLS", "ColorGrid", "useState", "useCallback", "useState", "useCallback", "jsx", "jsxs", "STROKE_COLORS", "ColorGrid", "useState", "useCallback", "useState", "useCallback", "Fragment", "jsx", "jsxs", "STROKE_COLORS", "ColorGrid", "useState", "useCallback", "useState", "useCallback", "jsx", "jsxs", "STROKE_COLORS", "ColorGrid", "useState", "useCallback", "t", "useState", "useCallback", "useEffect", "Fragment", "jsx", "jsxs", "useState", "useEffect", "useCallback", "useState", "useCallback", "useEffect", "Fragment", "jsx", "jsxs", "useState", "useEffect", "useCallback", "useState", "useEffect", "useCallback", "useRef", "jsx", "jsxs", "useState", "useRef", "useEffect", "useCallback", "useCallback", "jsx", "jsxs", "useCallback", "useState", "useEffect", "jsx", "jsxs", "useState", "useEffect", "useState", "useEffect", "useCallback", "useRef", "Fragment", "jsx", "jsxs", "useState", "useRef", "useCallback", "useEffect", "useState", "useEffect", "useRef", "useCallback", "jsx", "jsxs", "useState", "useRef", "useEffect", "useCallback", "useState", "useEffect", "useCallback", "useRef", "jsx", "jsxs", "useRef", "useCallback", "useEffect", "jsx", "jsxs", "jsx", "jsxs", "TOOL_SHORTCUTS", "ACTION_SHORTCUTS", "VIEW_SHORTCUTS", "useState", "useEffect", "useRef", "jsx", "jsxs", "useState", "useRef", "useEffect", "serializer", "useState", "useEffect", "useRef", "useCallback", "jsx", "jsxs", "getCleanSVG", "renderToCanvas", "useState", "useRef", "useCallback", "useEffect", "useState", "jsx", "jsxs", "ShortcutRow", "ShortcutSection", "useState", "
|
|
4
|
+
"sourcesContent": ["'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { compressImage } from '../utils/imageCompressor.js';\nlet _saveScene = null;\nlet _loadScene = null;\nasync function ensureSceneSerializer() {\n if (_saveScene && _loadScene) return;\n const m = await import('../core/SceneSerializer.js');\n _saveScene = m.saveScene;\n _loadScene = m.loadScene;\n}\n\nimport useSketchStore, { TOOLS } from './store/useSketchStore.js';\nimport useUIStore from './store/useUIStore.js';\nimport SVGCanvas from './components/canvas/SVGCanvas.jsx';\nimport Toolbar from './components/Toolbar.jsx';\nimport Footer from './components/Footer.jsx';\nimport AppMenu from './components/AppMenu.jsx';\nimport RectangleSidebar from './components/sidebars/RectangleSidebar.jsx';\nimport CircleSidebar from './components/sidebars/CircleSidebar.jsx';\nimport LineSidebar from './components/sidebars/LineSidebar.jsx';\nimport ArrowSidebar from './components/sidebars/ArrowSidebar.jsx';\nimport PaintbrushSidebar from './components/sidebars/PaintbrushSidebar.jsx';\nimport TextSidebar from './components/sidebars/TextSidebar.jsx';\nimport FrameSidebar from './components/sidebars/FrameSidebar.jsx';\nimport IconSidebar from './components/sidebars/IconSidebar.jsx';\nimport ImageSidebar from './components/sidebars/ImageSidebar.jsx';\nimport MultiSelectActions from './components/canvas/MultiSelectActions.jsx';\nimport ContextMenu from './components/canvas/ContextMenu.jsx';\nimport FindBar from './components/canvas/FindBar.jsx';\nimport ImageSourcePicker from './components/canvas/ImageSourcePicker.jsx';\nimport CanvasLoadingOverlay from './components/canvas/CanvasLoadingOverlay.jsx';\nimport ShortcutsModal from './components/modals/ShortcutsModal.jsx';\nimport CommandPalette from './components/modals/CommandPalette.jsx';\nimport ExportImageModal from './components/modals/ExportImageModal.jsx';\nimport HelpModal from './components/modals/HelpModal.jsx';\nimport LixScriptModal from './components/modals/LixScriptModal.jsx';\nimport GraphModal from './components/modals/GraphModal.jsx';\n\nconst SAVE_DEBOUNCE_MS = 1500;\n\n/**\n * Self-contained canvas component. Mounts the SketchEngine on an internal\n * <svg>, renders the full toolbar + per-shape sidebars + offline modals,\n * and surfaces scene changes + image uploads to the host.\n *\n * Offline-first: no cloud sync, AI, or auth code paths reach this build.\n * The host owns persistence and image upload via the two callbacks.\n */\nexport default function LixSketchCanvas({\n initialScene = null,\n onSceneChange = null,\n onUploadImage = null,\n onExit = null,\n className = '',\n style = null,\n}) {\n const wrapperRef = useRef(null);\n const lastSceneJsonRef = useRef('');\n const debounceRef = useRef(null);\n const [bootstrapped, setBootstrapped] = useState(false);\n\n // Re-route engine image uploads through the host before any user action.\n useEffect(() => {\n installImageUploadBridge(onUploadImage);\n }, [onUploadImage]);\n\n // Eager-load lixFont / lixCode so the textarea overlay used while a user\n // types into a text shape uses the same font as the final rendered text.\n // Without this, the first text edit shows in a system font and snaps to\n // lixFont only after the SVG re-renders.\n useEffect(() => {\n if (typeof document === 'undefined' || !document.fonts?.load) return;\n Promise.allSettled([\n document.fonts.load('1em lixFont'),\n document.fonts.load('1em lixCode'),\n ]).catch(() => {});\n }, []);\n\n // Apply initialScene once the engine reports ready (via window.__sketchEngine).\n useEffect(() => {\n if (!initialScene || bootstrapped) return;\n let cancelled = false;\n async function tryLoad() {\n if (cancelled) return;\n const serializer = window.__sceneSerializer;\n if (!serializer) {\n setTimeout(tryLoad, 200);\n return;\n }\n try {\n await ensureSceneSerializer();\n if (cancelled) return;\n const data = typeof initialScene === 'string' ? JSON.parse(initialScene) : initialScene;\n if (data && data.format === 'lixsketch') {\n _loadScene(data);\n lastSceneJsonRef.current = JSON.stringify(data);\n }\n } catch (err) {\n console.warn('[LixSketchCanvas] initialScene load failed:', err);\n }\n setBootstrapped(true);\n }\n tryLoad();\n return () => { cancelled = true; };\n }, [initialScene, bootstrapped]);\n\n // Ctrl+S \u2192 flush + show toast. Same UX as the standalone product but\n // with no cloud round-trip \u2014 onSceneChange (passed by the host) is the\n // real persistence layer.\n useEffect(() => {\n function handleKey(e) {\n if (!(e.ctrlKey || e.metaKey)) return;\n const key = (e.key || '').toLowerCase();\n if (key !== 's' || e.shiftKey) return;\n e.preventDefault();\n (async () => {\n try {\n await ensureSceneSerializer();\n const scene = _saveScene('Untitled');\n const json = JSON.stringify(scene);\n lastSceneJsonRef.current = json;\n if (onSceneChange) {\n const metadata = {\n shapeCount: Array.isArray(scene.shapes) ? scene.shapes.length : 0,\n viewport: scene.viewport || null,\n zoom: scene.zoom || 1,\n sizeBytes: json.length,\n savedAt: Date.now(),\n };\n onSceneChange(scene, metadata);\n }\n // Show the in-canvas save toast (rendered below).\n const toast = document.getElementById('lixsketch-save-toast');\n if (toast) {\n toast.classList.remove('hidden');\n clearTimeout(toast._hideTimer);\n toast._hideTimer = setTimeout(() => toast.classList.add('hidden'), 1800);\n }\n useUIStore.getState().setSaveStatus?.('cloud');\n } catch (err) {\n console.warn('[LixSketchCanvas] Ctrl+S save failed:', err);\n }\n })();\n }\n window.addEventListener('keydown', handleKey);\n return () => window.removeEventListener('keydown', handleKey);\n }, [onSceneChange]);\n\n // Scene-change autosave \u2014 MutationObserver + mouseup, debounced.\n useEffect(() => {\n if (!onSceneChange) return;\n let svg = null;\n let observer = null;\n\n const flush = async () => {\n try {\n await ensureSceneSerializer();\n const scene = _saveScene('Untitled');\n const json = JSON.stringify(scene);\n if (json === lastSceneJsonRef.current) return;\n lastSceneJsonRef.current = json;\n const metadata = {\n shapeCount: Array.isArray(scene.shapes) ? scene.shapes.length : 0,\n viewport: scene.viewport || null,\n zoom: scene.zoom || 1,\n sizeBytes: json.length,\n savedAt: Date.now(),\n };\n onSceneChange(scene, metadata);\n } catch (err) {\n console.warn('[LixSketchCanvas] save failed:', err);\n }\n };\n const debounced = () => {\n clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(flush, SAVE_DEBOUNCE_MS);\n };\n\n function attach() {\n svg = window.svg;\n if (!svg) {\n setTimeout(attach, 200);\n return;\n }\n observer = new MutationObserver(debounced);\n observer.observe(svg, { childList: true, subtree: true, attributes: true });\n svg.addEventListener('mouseup', debounced);\n }\n attach();\n window.addEventListener('beforeunload', flush);\n\n return () => {\n if (observer) observer.disconnect();\n if (svg) svg.removeEventListener('mouseup', debounced);\n window.removeEventListener('beforeunload', flush);\n clearTimeout(debounceRef.current);\n };\n }, [onSceneChange]);\n\n return (\n <div\n ref={wrapperRef}\n className={`lixsketch-canvas-root canvas-mode ${className}`}\n style={style}\n >\n <SVGCanvas />\n <Toolbar />\n <Footer />\n <AppMenu />\n <RectangleSidebar />\n <CircleSidebar />\n <LineSidebar />\n <ArrowSidebar />\n <PaintbrushSidebar />\n <TextSidebar />\n <FrameSidebar />\n <IconSidebar />\n <ImageSidebar />\n <MultiSelectActions />\n <ShortcutsModal />\n <CommandPalette />\n <ExportImageModal />\n <HelpModal />\n <LixScriptModal />\n <GraphModal />\n <ContextMenu />\n <FindBar />\n <ImageSourcePicker />\n <CanvasLoadingOverlay />\n\n {/* Floating header \u2014 menu trigger + help / shortcuts. Hosts can\n hide this strip by setting CSS `.lixsketch-floating-header { display: none }`\n if they render their own chrome (blogs.elixpo's CanvasSubpage does). */}\n <div className=\"lixsketch-floating-header absolute top-2 right-2 z-[1000] flex items-center gap-1.5 font-[lixFont]\">\n <button\n type=\"button\"\n title=\"LixScript MCP \u2014 coming soon\"\n onClick={() => useUIStore.getState().toggleAIModal?.()}\n className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-surface border border-border-light text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <i className=\"bx bx-code-alt text-base\" />\n </button>\n <button\n type=\"button\"\n title=\"Graph \u2014 plot equations\"\n onClick={() => useUIStore.getState().toggleGraphModal?.()}\n className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-surface border border-border-light text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <i className=\"bx bx-line-chart text-base\" />\n </button>\n <button\n type=\"button\"\n title=\"Help (?)\"\n onClick={() => useUIStore.getState().toggleHelpModal?.()}\n className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-surface border border-border-light text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <i className=\"bx bx-help-circle text-base\" />\n </button>\n <button\n type=\"button\"\n title=\"Shortcuts (Ctrl+/)\"\n onClick={() => useUIStore.getState().toggleShortcutsModal?.()}\n className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-surface border border-border-light text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <i className=\"bx bx-command text-base\" />\n </button>\n <button\n type=\"button\"\n title=\"Menu\"\n onClick={() => useUIStore.getState().toggleMenu?.()}\n className=\"w-9 h-9 flex items-center justify-center rounded-lg bg-surface border border-border-light text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n >\n <i className=\"bx bx-menu text-base\" />\n </button>\n </div>\n\n {/* Save toast \u2014 same look as the standalone product. Hidden by\n default; Ctrl+S flips the `hidden` class on/off. */}\n <div\n id=\"lixsketch-save-toast\"\n className=\"hidden fixed bottom-20 left-1/2 -translate-x-1/2 z-[9999] px-4 py-2 rounded-xl bg-surface/85 backdrop-blur-md border border-border-light text-text-secondary text-xs font-[lixFont] pointer-events-none\"\n >\n <i className=\"bx bx-check text-green-400 mr-1.5\" />\n Saved\n </div>\n </div>\n );\n}\n\n// \u2500\u2500 Image upload bridge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction installImageUploadBridge(onUploadImage) {\n if (typeof window === 'undefined') return;\n if (!onUploadImage) {\n // Offline mode (no host upload pipeline): leave the engine's\n // compressed-data-URL placement as the final state.\n window.uploadImageToCloudinary = async () => {};\n return;\n }\n\n window.uploadImageToCloudinary = async function bridgedUpload(imageShape) {\n const href = imageShape?.element?.getAttribute('href') || '';\n if (!href.startsWith('data:')) return;\n\n imageShape.uploadStatus = 'uploading';\n imageShape.uploadAbortController = new AbortController();\n const signal = imageShape.uploadAbortController.signal;\n imageShape.showUploadIndicator?.();\n\n try {\n let payloadDataUrl = href;\n try {\n const compressed = await compressImage(href);\n if (compressed?.dataUrl) payloadDataUrl = compressed.dataUrl;\n } catch (err) {\n console.warn('[LixSketchCanvas] compression failed, sending raw:', err);\n }\n if (signal.aborted) return;\n\n const result = await onUploadImage(payloadDataUrl);\n if (signal.aborted) return;\n if (!result?.url) throw new Error(result?.error || 'Upload failed');\n\n imageShape.element.setAttribute('href', result.url);\n imageShape.element.setAttribute('data-href', result.url);\n if (result.publicId) imageShape.element.setAttribute('data-cloudinary-id', result.publicId);\n if (typeof result.sizeBytes === 'number') {\n const oldSize = imageShape.element.__fileSize || 0;\n imageShape.element.__fileSize = result.sizeBytes;\n window.__roomImageBytesUsed = Math.max(\n 0,\n (window.__roomImageBytesUsed || 0) - oldSize + result.sizeBytes\n );\n }\n imageShape.uploadStatus = 'done';\n } catch (err) {\n if (!signal.aborted) {\n console.warn('[LixSketchCanvas] upload failed:', err);\n imageShape.uploadStatus = 'failed';\n }\n } finally {\n imageShape.removeUploadIndicator?.();\n imageShape.uploadAbortController = null;\n }\n };\n}\n", "import { create } from 'zustand'\n\n// Tool enum replaces 15 boolean flags\nexport const TOOLS = {\n SELECT: 'select',\n PAN: 'pan',\n RECTANGLE: 'rectangle',\n CIRCLE: 'circle',\n LINE: 'line',\n ARROW: 'arrow',\n FREEHAND: 'freehand',\n TEXT: 'text',\n CODE: 'code',\n ERASER: 'eraser',\n LASER: 'laser',\n IMAGE: 'image',\n FRAME: 'frame',\n ICON: 'icon',\n}\n\n// Action types for undo/redo\nexport const ACTION = {\n CREATE: 'create',\n DELETE: 'delete',\n MODIFY: 'modify',\n PASTE: 'paste',\n}\n\n// Tool -> cursor mapping\nconst TOOL_CURSORS = {\n [TOOLS.SELECT]: 'default',\n [TOOLS.PAN]: 'grab',\n [TOOLS.RECTANGLE]: 'crosshair',\n [TOOLS.CIRCLE]: 'crosshair',\n [TOOLS.LINE]: 'crosshair',\n [TOOLS.ARROW]: 'crosshair',\n [TOOLS.FREEHAND]: 'crosshair',\n [TOOLS.TEXT]: 'text',\n [TOOLS.CODE]: 'text',\n [TOOLS.LASER]: 'crosshair',\n [TOOLS.IMAGE]: 'crosshair',\n [TOOLS.FRAME]: 'crosshair',\n [TOOLS.ICON]: 'crosshair',\n}\n\n// Tool -> sidebar mapping\nconst TOOL_SIDEBARS = {\n [TOOLS.FREEHAND]: 'paintbrush',\n [TOOLS.RECTANGLE]: 'rectangle',\n [TOOLS.CIRCLE]: 'circle',\n [TOOLS.LINE]: 'line',\n [TOOLS.ARROW]: 'arrow',\n [TOOLS.TEXT]: 'text',\n [TOOLS.CODE]: 'text',\n [TOOLS.FRAME]: 'frame',\n}\n\n// Keyboard shortcut -> tool mapping\nexport const SHORTCUT_MAP = {\n h: TOOLS.PAN,\n v: TOOLS.SELECT,\n 1: TOOLS.SELECT,\n r: TOOLS.RECTANGLE,\n 2: TOOLS.RECTANGLE,\n o: TOOLS.CIRCLE,\n 4: TOOLS.CIRCLE,\n a: TOOLS.ARROW,\n 5: TOOLS.ARROW,\n l: TOOLS.LINE,\n 6: TOOLS.LINE,\n p: TOOLS.FREEHAND,\n 7: TOOLS.FREEHAND,\n t: TOOLS.TEXT,\n 8: TOOLS.TEXT,\n 9: TOOLS.IMAGE,\n e: TOOLS.ERASER,\n 0: TOOLS.ERASER,\n i: TOOLS.ICON,\n f: TOOLS.FRAME,\n k: TOOLS.LASER,\n}\n\nconst useSketchStore = create((set, get) => ({\n // --- Active tool (replaces 15 boolean flags) ---\n activeTool: TOOLS.SELECT,\n activeSidebar: null, // which sidebar to show\n selectedShapeSidebar: null, // sidebar shown when a shape is selected (overrides activeSidebar)\n\n setActiveTool: (tool, { afterDraw } = {}) => {\n // In view mode, only pan is allowed\n if (get().viewMode && tool !== TOOLS.PAN) return\n // Tool lock: don't switch to SELECT after drawing\n if (afterDraw && tool === TOOLS.SELECT && get().toolLock) return\n set({\n activeTool: tool,\n activeSidebar: TOOL_SIDEBARS[tool] || null,\n selectedShapeSidebar: null,\n })\n },\n\n // Called by engine when a shape is selected/deselected\n setSelectedShapeSidebar: (sidebar) => set({ selectedShapeSidebar: sidebar }),\n clearSelectedShapeSidebar: () => set({ selectedShapeSidebar: null }),\n\n getCursor: () => {\n const tool = get().activeTool\n if (tool === TOOLS.ERASER) {\n return `url(\"data:image/svg+xml;base64,${typeof btoa !== 'undefined' ? btoa('<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"><circle cx=\"10\" cy=\"10\" r=\"7\" fill=\"#222\" stroke=\"white\" stroke-width=\"2\"/></svg>') : ''}\") 10 10, auto`\n }\n if (tool === TOOLS.LASER) {\n return `url(\"data:image/svg+xml;base64,${typeof btoa !== 'undefined' ? btoa('<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#1971c2\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"></path><polyline points=\"15 3 21 3 21 9\"></polyline><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"></line></svg>') : ''}\") 0 0, auto`\n }\n return TOOL_CURSORS[tool] || 'crosshair'\n },\n\n // --- Shapes ---\n shapes: [],\n currentShape: null,\n lastMousePos: null,\n\n addShape: (shape) =>\n set((s) => ({ shapes: [...s.shapes, shape] })),\n\n removeShape: (shape) =>\n set((s) => ({ shapes: s.shapes.filter((sh) => sh !== shape) })),\n\n setCurrentShape: (shape) => set({ currentShape: shape }),\n setLastMousePos: (pos) => set({ lastMousePos: pos }),\n\n clearShapes: () => set({ shapes: [], currentShape: null }),\n\n // --- Undo/Redo ---\n undoStack: [],\n redoStack: [],\n\n pushUndo: (action) =>\n set((s) => ({\n undoStack: [...s.undoStack, action],\n redoStack: [], // clear redo on new action\n })),\n\n popUndo: () => {\n const { undoStack } = get()\n if (undoStack.length === 0) return null\n const action = undoStack[undoStack.length - 1]\n set((s) => ({\n undoStack: s.undoStack.slice(0, -1),\n redoStack: [...s.redoStack, action],\n }))\n return action\n },\n\n popRedo: () => {\n const { redoStack } = get()\n if (redoStack.length === 0) return null\n const action = redoStack[redoStack.length - 1]\n set((s) => ({\n redoStack: s.redoStack.slice(0, -1),\n undoStack: [...s.undoStack, action],\n }))\n return action\n },\n\n clearHistory: () => set({ undoStack: [], redoStack: [] }),\n\n // --- Viewport / Zoom ---\n zoom: 1,\n viewBox: { x: 0, y: 0, width: 0, height: 0 },\n translation: { x: 0, y: 0 },\n isPanning: false,\n panStart: null,\n\n setZoom: (zoom) => set({ zoom: Math.max(0.4, Math.min(30, zoom)) }),\n setViewBox: (vb) => set({ viewBox: vb }),\n setTranslation: (t) => set({ translation: t }),\n setIsPanning: (v) => set({ isPanning: v }),\n setPanStart: (p) => set({ panStart: p }),\n\n // --- Canvas background ---\n canvasBackground: 'var(--lixsketch-bg, #ffffff)',\n setCanvasBackground: (color) => set({ canvasBackground: color }),\n\n // --- Grid ---\n gridEnabled: false,\n toggleGrid: () => set((s) => ({ gridEnabled: !s.gridEnabled })),\n\n // --- Modes ---\n viewMode: false,\n zenMode: false,\n toolLock: false,\n snapToObjects: false,\n\n toggleViewMode: () => {\n const entering = !get().viewMode\n if (entering) {\n set({ viewMode: true, zenMode: false, activeTool: TOOLS.PAN, activeSidebar: null, selectedShapeSidebar: null })\n } else {\n set({ viewMode: false, activeTool: TOOLS.SELECT, activeSidebar: null })\n }\n },\n toggleZenMode: () => set((s) => ({ zenMode: !s.zenMode, viewMode: false })),\n\n // --- Canvas/Docs split layout ---\n // 'canvas' = sketch only, 'split' = side-by-side, 'docs' = doc only\n // Hydrated from localStorage on first store consumption (see\n // hydrateLayoutMode below). Persisted on every change.\n layoutMode: 'canvas',\n setLayoutMode: (mode) => {\n if (!['canvas', 'split', 'docs'].includes(mode)) return\n set({ layoutMode: mode })\n if (typeof window !== 'undefined') {\n try { localStorage.setItem('lixsketch-layout-mode', mode) } catch {}\n }\n },\n hydrateLayoutMode: () => {\n if (typeof window === 'undefined') return\n try {\n const saved = localStorage.getItem('lixsketch-layout-mode')\n if (saved && ['canvas', 'split', 'docs'].includes(saved)) {\n set({ layoutMode: saved })\n }\n } catch {}\n },\n toggleToolLock: () => set((s) => ({ toolLock: !s.toolLock })),\n toggleSnapToObjects: () => set((s) => ({ snapToObjects: !s.snapToObjects })),\n\n // --- RoughJS refs (set once after mount) ---\n roughCanvas: null,\n roughGenerator: null,\n setRoughRefs: (canvas, generator) =>\n set({ roughCanvas: canvas, roughGenerator: generator }),\n}))\n\nexport default useSketchStore\n", "import { create } from 'zustand'\n\n/**\n * Swap black\u2194white colors on all shapes when theme changes.\n * prevTheme / nextTheme are resolved ('dark' | 'light').\n */\nfunction invertShapeColors(prevResolved, nextResolved) {\n if (prevResolved === nextResolved) return\n const shapes = window.shapes\n if (!shapes || shapes.length === 0) return\n\n // Going light \u2192 dark: #000 \u2192 #fff. Going dark \u2192 light: #fff \u2192 #000.\n const from = nextResolved === 'light' ? '#ffffff' : '#000000'\n const to = nextResolved === 'light' ? '#000000' : '#ffffff'\n\n const normalize = (c) => {\n if (!c || c === 'transparent' || c === 'none') return c\n const lower = c.toLowerCase().trim()\n if (lower === '#fff' || lower === '#ffffff' || lower === 'white') return '#ffffff'\n if (lower === '#000' || lower === '#000000' || lower === 'black') return '#000000'\n return lower\n }\n\n for (const shape of shapes) {\n let changed = false\n if (shape.options) {\n if (normalize(shape.options.stroke) === from) {\n shape.options.stroke = to\n changed = true\n }\n if (normalize(shape.options.fill) === from) {\n shape.options.fill = to\n changed = true\n }\n }\n // Text shapes store color directly\n if (shape.color !== undefined && normalize(shape.color) === from) {\n shape.color = to\n changed = true\n }\n if (shape.strokeColor !== undefined && normalize(shape.strokeColor) === from) {\n shape.strokeColor = to\n changed = true\n }\n if (changed && typeof shape.draw === 'function') {\n shape.draw()\n }\n }\n}\n\nfunction applyTheme(theme) {\n // Issue #38 bug #1: scope theme to body classes so light mode only\n // affects the canvas, not the landing/blog pages. Token values live\n // in `body.canvas-mode` (light default) and `body.canvas-mode.theme-\n // dark` (toggle) rules in src/app/globals.css.\n const body = document.body\n if (!body) return\n const resolved = theme === 'system'\n ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n : theme\n body.classList.remove('theme-dark', 'theme-light')\n if (resolved === 'dark') body.classList.add('theme-dark')\n\n const svgEl = window.svg\n if (svgEl) svgEl.style.background = resolved === 'light' ? '#f4f3ee' : ''\n}\n\nconst useUIStore = create((set, get) => ({\n // --- Modals ---\n shortcutsModalOpen: false,\n saveModalOpen: false,\n aiModalOpen: false,\n graphModalOpen: false,\n commandPaletteOpen: false,\n helpModalOpen: false,\n exportImageModalOpen: false,\n findBarOpen: false,\n canvasPropertiesOpen: false,\n imageGenerateModalOpen: false,\n\n toggleShortcutsModal: () =>\n set((s) => ({ shortcutsModalOpen: !s.shortcutsModalOpen })),\n toggleSaveModal: () =>\n set((s) => ({ saveModalOpen: !s.saveModalOpen })),\n toggleAIModal: () =>\n set((s) => ({ aiModalOpen: !s.aiModalOpen })),\n toggleGraphModal: () =>\n set((s) => ({ graphModalOpen: !s.graphModalOpen })),\n toggleCommandPalette: () =>\n set((s) => ({ commandPaletteOpen: !s.commandPaletteOpen })),\n toggleHelpModal: () =>\n set((s) => ({ helpModalOpen: !s.helpModalOpen })),\n toggleExportImageModal: () =>\n set((s) => ({ exportImageModalOpen: !s.exportImageModalOpen })),\n toggleFindBar: () =>\n set((s) => ({ findBarOpen: !s.findBarOpen })),\n closeFindBar: () =>\n set({ findBarOpen: false }),\n toggleCanvasProperties: () =>\n set((s) => ({ canvasPropertiesOpen: !s.canvasPropertiesOpen })),\n toggleImageGenerateModal: () =>\n set((s) => ({ imageGenerateModalOpen: !s.imageGenerateModalOpen })),\n closeImageGenerateModal: () =>\n set({ imageGenerateModalOpen: false }),\n closeAllModals: () =>\n set({ shortcutsModalOpen: false, saveModalOpen: false, aiModalOpen: false, graphModalOpen: false, commandPaletteOpen: false, helpModalOpen: false, exportImageModalOpen: false, findBarOpen: false, canvasPropertiesOpen: false, imageGenerateModalOpen: false }),\n\n // --- Menu ---\n menuOpen: false,\n toggleMenu: () => set((s) => ({ menuOpen: !s.menuOpen })),\n closeMenu: () => set({ menuOpen: false }),\n\n // --- Workspace ---\n workspaceName: '',\n setWorkspaceName: (name) => {\n if (typeof window !== 'undefined') {\n localStorage.setItem('lixsketch-workspace-name', name)\n }\n set({ workspaceName: name })\n },\n\n // --- Save Status ---\n // 'idle' | 'local' | 'cloud' | 'failed'\n saveStatus: 'idle',\n setSaveStatus: (status) => set({ saveStatus: status }),\n\n // --- Session / Encryption ---\n // Key is persisted in localStorage keyed by session ID so it survives page refreshes.\n // This ensures re-saving a workspace uses the same key, keeping old share links valid.\n sessionEncryptionKey: null,\n setSessionEncryptionKey: (key, sessionId) => {\n if (typeof window !== 'undefined' && sessionId) {\n localStorage.setItem(`lixsketch-enc-key-${sessionId}`, key)\n }\n set({ sessionEncryptionKey: key })\n },\n loadEncryptionKeyForSession: (sessionId) => {\n if (typeof window !== 'undefined' && sessionId) {\n const stored = localStorage.getItem(`lixsketch-enc-key-${sessionId}`)\n if (stored) {\n set({ sessionEncryptionKey: stored })\n return stored\n }\n }\n return null\n },\n clearEncryptionKeyForSession: (sessionId) => {\n if (typeof window !== 'undefined' && sessionId) {\n localStorage.removeItem(`lixsketch-enc-key-${sessionId}`)\n }\n set({ sessionEncryptionKey: null })\n },\n\n // --- Canvas Loading ---\n canvasLoading: false,\n canvasLoadingMessage: 'Loading canvas...',\n setCanvasLoading: (loading, message) => set({ canvasLoading: loading, canvasLoadingMessage: message || 'Loading canvas...' }),\n\n // --- Theme ---\n // Issue #38 bug #1: light by default. Dark stays available via toggle.\n theme: 'light',\n setTheme: (newTheme) => {\n const prev = get().theme\n const resolve = (t) => t === 'system'\n ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n : t\n invertShapeColors(resolve(prev), resolve(newTheme))\n applyTheme(newTheme)\n set({ theme: newTheme })\n },\n\n // --- Language / i18n ---\n language: 'en',\n setLanguage: (lang) => {\n set({ language: lang })\n },\n persistUIPrefs: (prefs) => {\n if (typeof window !== 'undefined') {\n const existing = localStorage.getItem('lix_ui_prefs')\n let parsed = {}\n try {\n if (existing) parsed = JSON.parse(existing)\n } catch (e) {}\n \n const updated = { ...parsed, ...prefs }\n localStorage.setItem('lix_ui_prefs', JSON.stringify(updated))\n \n if (prefs.language) {\n set({ language: prefs.language })\n window.dispatchEvent(new CustomEvent('lix-language-changed', { detail: { language: prefs.language } }))\n }\n }\n }\n}))\n\nexport default useUIStore\n", "\"use client\"\n\nimport { useRef, useState, useEffect } from 'react'\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport useSketchEngine from '../../hooks/useSketchEngine'\n\nconst GRID_SIZE = 20\n\nexport default function SVGCanvas() {\n const [svgReady, setSvgReady] = useState(false)\n const svgRef = useRef(null)\n const canvasBackground = useSketchStore((s) => s.canvasBackground)\n const gridEnabled = useSketchStore((s) => s.gridEnabled)\n const getCursor = useSketchStore((s) => s.getCursor)\n const cursor = getCursor()\n\n // viewBox is owned imperatively by the lixsketch engine (zoom/pan call\n // svg.setAttribute('viewBox', \u2026) directly). React must NOT re-render\n // the viewBox prop or it'll snap back over engine writes \u2014 which is\n // what was causing zoom deformity and the pan-release jump in split\n // mode. The initial value is set in the effect below; React never\n // rewrites it after that.\n useEffect(() => {\n const applyImperative = (w, h) => {\n const zoom = window.currentZoom || 1\n const cv = window.currentViewBox || { x: 0, y: 0 }\n const vbW = w / zoom\n const vbH = h / zoom\n const x = cv.x || 0\n const y = cv.y || 0\n window.currentViewBox = { x, y, width: vbW, height: vbH }\n const el = svgRef.current\n if (el) el.setAttribute('viewBox', `${x} ${y} ${vbW} ${vbH}`)\n }\n\n const sync = () => {\n const el = svgRef.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n const w = Math.max(1, Math.round(rect.width))\n const h = Math.max(1, Math.round(rect.height))\n applyImperative(w, h)\n }\n\n sync()\n setSvgReady(true)\n\n window.addEventListener('resize', sync)\n\n let ro\n if (typeof ResizeObserver !== 'undefined' && svgRef.current) {\n ro = new ResizeObserver(sync)\n ro.observe(svgRef.current)\n }\n\n return () => {\n window.removeEventListener('resize', sync)\n if (ro) ro.disconnect()\n }\n }, [])\n\n // Close icon sidebar when clicking on canvas without an icon ready to place\n useEffect(() => {\n const svg = svgRef.current\n if (!svg) return\n\n const handleCanvasClick = () => {\n const activeTool = useSketchStore.getState().activeTool\n // If icon tool is active but no icon is queued for placement, close the sidebar\n if (activeTool === TOOLS.ICON && !window.isIconToolActive) {\n useSketchStore.getState().setActiveTool(TOOLS.SELECT)\n }\n }\n\n svg.addEventListener('pointerdown', handleCanvasClick)\n return () => svg.removeEventListener('pointerdown', handleCanvasClick)\n }, [svgReady])\n\n // Initialize the imperative sketch engine on this SVG element\n useSketchEngine(svgRef, svgReady)\n\n // Expose grid state to engine\n useEffect(() => {\n window.__gridEnabled = gridEnabled\n }, [gridEnabled])\n\n return (\n <svg\n id=\"freehand-canvas\"\n ref={svgRef}\n className=\"absolute inset-0 w-full h-full\"\n style={{\n background: canvasBackground,\n cursor,\n userSelect: 'none',\n WebkitUserSelect: 'none',\n touchAction: 'none',\n }}\n preserveAspectRatio=\"none\"\n suppressHydrationWarning\n >\n {gridEnabled && (\n <defs>\n <pattern\n id=\"grid-small\"\n width={GRID_SIZE}\n height={GRID_SIZE}\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d={`M ${GRID_SIZE} 0 L 0 0 0 ${GRID_SIZE}`}\n fill=\"none\"\n stroke=\"rgba(255,255,255,0.06)\"\n strokeWidth=\"0.5\"\n />\n </pattern>\n <pattern\n id=\"grid-large\"\n width={GRID_SIZE * 5}\n height={GRID_SIZE * 5}\n patternUnits=\"userSpaceOnUse\"\n >\n <rect width={GRID_SIZE * 5} height={GRID_SIZE * 5} fill=\"url(#grid-small)\" />\n <path\n d={`M ${GRID_SIZE * 5} 0 L 0 0 0 ${GRID_SIZE * 5}`}\n fill=\"none\"\n stroke=\"rgba(255,255,255,0.12)\"\n strokeWidth=\"0.8\"\n />\n </pattern>\n </defs>\n )}\n {gridEnabled && (\n <rect\n x=\"-100000\"\n y=\"-100000\"\n width=\"200000\"\n height=\"200000\"\n fill=\"url(#grid-large)\"\n style={{ pointerEvents: 'none' }}\n />\n )}\n </svg>\n )\n}\n", "\"use client\"\n\nimport { useEffect, useRef } from 'react'\nimport useSketchStore from '../store/useSketchStore'\nimport { WORKER_URL } from './inertStores'\n\n/**\n * Hook that initializes the SketchEngine on the provided SVG element\n * and bridges Zustand activeTool changes to the engine's window flags.\n */\nexport default function useSketchEngine(svgRef, ready = true) {\n const engineRef = useRef(null)\n\n useEffect(() => {\n if (!ready || !svgRef.current) return\n\n let cancelled = false\n\n async function initEngine() {\n try {\n // Expose Zustand store API on window BEFORE engine init\n // so SketchEngine globals can call into React state\n const storeState = useSketchStore.getState()\n window.__sketchStoreApi = {\n setSelectedShapeSidebar: (sidebar) => useSketchStore.getState().setSelectedShapeSidebar(sidebar),\n clearSelectedShapeSidebar: () => useSketchStore.getState().clearSelectedShapeSidebar(),\n setActiveTool: (tool, opts) => useSketchStore.getState().setActiveTool(tool, opts),\n setZoom: (zoom) => useSketchStore.setState({ zoom }),\n getState: () => useSketchStore.getState(),\n }\n\n // Import the engine class directly (not via ../../index.js) so the\n // chunk doesn't pull SceneSerializer + the shape graph in before\n // engine.init() has had a chance to wire window.svg / window.rough.\n const { SketchEngine } = await import('../../SketchEngine.js')\n if (cancelled) return\n\n const engine = new SketchEngine(svgRef.current)\n await engine.init()\n engineRef.current = engine\n window.__sketchEngine = engine\n window.__WORKER_URL = WORKER_URL\n\n // Sync current tool immediately after init\n const currentTool = useSketchStore.getState().activeTool\n engine.setActiveTool(currentTool)\n } catch (err) {\n console.error('[useSketchEngine] Failed to initialize:', err)\n }\n }\n\n initEngine()\n\n return () => {\n cancelled = true\n if (engineRef.current) {\n engineRef.current.cleanup()\n engineRef.current = null\n }\n }\n }, [svgRef, ready])\n\n // Subscribe to Zustand activeTool changes and bridge to engine\n useEffect(() => {\n const unsub = useSketchStore.subscribe(\n (state, prevState) => {\n if (state.activeTool !== prevState?.activeTool && engineRef.current) {\n engineRef.current.setActiveTool(state.activeTool)\n }\n }\n )\n return unsub\n }, [])\n\n return engineRef\n}\n", "// Inert replacements for the standalone product's auth / cloud / collab\n// state. These let us copy components that reference cloud-coupled hooks\n// without hauling the whole product backend along. Each export mirrors\n// the shape the consumer expects but with no-op implementations.\n\nconst noop = () => {};\n\nconst inertAuth = {\n isAuthenticated: false,\n user: null,\n setUser: noop,\n setAuthenticated: noop,\n logout: noop,\n};\n\nconst inertCollab = {\n roomId: null,\n connected: false,\n setRoom: noop,\n setConnected: noop,\n};\n\nconst inertProfile = {\n profile: null,\n setProfile: noop,\n};\n\nfunction makeStore(state) {\n // Match the zustand call signature used in selectors:\n // const x = useStore((s) => s.foo)\n // const x = useStore.getState().foo\n function useStore(selector) {\n return typeof selector === 'function' ? selector(state) : state;\n }\n useStore.getState = () => state;\n useStore.setState = noop;\n useStore.subscribe = () => () => {};\n return useStore;\n}\n\nexport const useAuthStore = makeStore(inertAuth);\nexport const useCollabStore = makeStore(inertCollab);\nexport const useProfileStore = makeStore(inertProfile);\n\nexport const WORKER_URL = '';\nexport function getSessionID() {\n if (typeof window !== 'undefined' && window.__sessionID) return window.__sessionID;\n return null;\n}\n\nexport async function triggerDocCloudSync() { /* offline mode: no-op */ }\nexport function persistLayoutMode() { /* offline mode: no-op */ }\n\n// Cloud-sync trigger used by the standalone product's AppMenu / keyboard\n// shortcuts. The package's offline build should never hit a server, so we\n// resolve immediately. The host's onSceneChange callback (passed to\n// LixSketchCanvas) handles real persistence.\nexport async function triggerCloudSync() { return false; }\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../store/useSketchStore'\nimport useUIStore from '../store/useUIStore'\n\n// Items are built lazily inside the component body so esbuild's lazy ESM\n// wrapper can't evaluate them before the store module finishes init.\nfunction getViewModeItems() {\n return [\n { tool: TOOLS.PAN, icon: 'bxs-hand', title: 'Pan (H)', key: 'H' },\n ]\n}\n\nfunction getToolItems() {\n return [\n { tool: TOOLS.PAN, icon: 'bxs-hand', title: 'Pan (H)', key: 'H' },\n { tool: TOOLS.SELECT, icon: 'bxs-pointer', title: 'Select (V)', key: 'V' },\n 'spacer',\n { tool: TOOLS.RECTANGLE, icon: 'bx-square', title: 'Rectangle (R)', key: 'R' },\n { tool: TOOLS.CIRCLE, icon: 'bx-circle', title: 'Circle (O)', key: 'O' },\n { tool: TOOLS.LINE, icon: 'bx-minus', title: 'Line (L)', key: 'L' },\n { tool: TOOLS.ARROW, icon: 'bx-right-arrow-alt', title: 'Arrow (A)', rotate: true, key: 'A' },\n { tool: TOOLS.TEXT, icon: 'bx-text', title: 'Text (T)', key: 'T' },\n { tool: TOOLS.FREEHAND, icon: 'bx-pen', title: 'Freehand (P)', key: 'P' },\n { tool: TOOLS.IMAGE, icon: 'bx-image-alt', title: 'Image (9)', key: '9' },\n { tool: TOOLS.ICON, icon: 'bx-wink-smile', title: 'Icon (I)', key: 'I' },\n 'spacer',\n { tool: TOOLS.FRAME, icon: 'bx-crop', title: 'Frame (F)', key: 'F' },\n { tool: TOOLS.LASER, icon: 'bxs-magic-wand', title: 'Laser (K)', key: 'K' },\n { tool: TOOLS.ERASER, icon: 'bxs-eraser', title: 'Eraser (E)', key: 'E' },\n // AI tool entry removed while the assistant is coming-soon.\n // Restore `{ tool: 'ai', icon: null, title: 'AI', isAI: true }` here\n // when the modal becomes a real feature again.\n ]\n}\n\nexport default function Toolbar() {\n const activeTool = useSketchStore((s) => s.activeTool)\n const setActiveTool = useSketchStore((s) => s.setActiveTool)\n const viewMode = useSketchStore((s) => s.viewMode)\n const toolLock = useSketchStore((s) => s.toolLock)\n const toggleToolLock = useSketchStore((s) => s.toggleToolLock)\n const toggleAIModal = useUIStore((s) => s.toggleAIModal)\n\n const items = viewMode ? getViewModeItems() : getToolItems()\n\n return (\n <>\n <div className={`absolute left-2.5 top-1/2 -translate-y-1/2 w-[46px] rounded-xl bg-surface z-[1000] flex flex-col items-center py-1.5 gap-0.5 font-[lixFont] max-h-[calc(100vh-120px)] overflow-y-auto no-scrollbar`}>\n {/* Tool lock button at the top */}\n {!viewMode && (\n <>\n <button\n title=\"Tool Lock (Q)\"\n onClick={toggleToolLock}\n className={`relative w-[33px] h-[30px] flex items-center justify-center rounded-lg transition-all duration-200 ${\n toolLock\n ? 'bg-accent-blue/20 text-accent-blue'\n : 'text-text-dim hover:text-text-muted hover:bg-surface-hover'\n }`}\n >\n <i className={`bx ${toolLock ? 'bxs-lock-alt' : 'bx-lock-alt'} text-lg`} />\n <span className=\"absolute bottom-0.5 right-[-1px] text-[10px] leading-none opacity-50\">Q</span>\n </button>\n <div className=\"w-6 h-px bg-border-light my-0.5\" />\n </>\n )}\n\n {items.map((item, idx) => {\n if (item === 'spacer') {\n return (\n <div\n key={`spacer-${idx}`}\n className=\"w-6 h-px bg-border-light my-0.5\"\n />\n )\n }\n\n const isActive = activeTool === item.tool\n\n if (item.isAI) {\n return (\n <button\n key=\"ai\"\n title={item.title}\n onClick={toggleAIModal}\n className=\"w-[33px] h-[31px] flex items-center justify-center rounded-lg text-text-muted hover:text-accent hover:bg-surface-hover transition-all duration-200\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z\" />\n <path d=\"M18 14l1 3 3 1-3 1-1 3-1-3-3-1 3-1 1-3z\" />\n </svg>\n </button>\n )\n }\n\n return (\n <button\n key={item.tool}\n title={item.title}\n onClick={() => setActiveTool(item.tool)}\n className={`relative w-[33px] h-[31px] flex items-center justify-center rounded-lg transition-all duration-200 ${\n isActive\n ? 'bg-surface-active text-text-primary'\n : 'text-text-muted hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <i\n className={`bx ${item.icon} text-xl`}\n style={item.rotate ? { transform: 'rotate(-45deg)' } : undefined}\n />\n {item.key && (\n <span className={`absolute bottom-0.5 right-[-1px] text-[10px] leading-none ${isActive ? 'opacity-60' : 'opacity-35'}`}>\n {item.key}\n </span>\n )}\n </button>\n )\n })}\n </div>\n {viewMode && (\n <div className=\"absolute top-16 left-2.5 w-[46px] z-[1000] flex justify-center font-[lixFont]\">\n <span className=\"text-text-dim text-[9px] text-center leading-tight\">\n View<br/>Mode<br/>\n <kbd className=\"text-[8px] text-text-muted\">Esc</kbd>\n </span>\n </div>\n )}\n </>\n )\n}\n", "\"use client\"\n\nimport useSketchStore from '../store/useSketchStore'\nimport { useCallback } from 'react'\n\nexport default function Footer() {\n const zoom = useSketchStore((s) => s.zoom)\n const setZoom = useSketchStore((s) => s.setZoom)\n const viewMode = useSketchStore((s) => s.viewMode)\n const zenMode = useSketchStore((s) => s.zenMode)\n\n const zoomPercent = Math.round(zoom * 100)\n\n const handleZoomIn = useCallback(() => {\n if (window.zoomFromCenter) window.zoomFromCenter(1)\n }, [])\n\n const handleZoomOut = useCallback(() => {\n if (window.zoomFromCenter) window.zoomFromCenter(-1)\n }, [])\n\n const handleZoomReset = useCallback(() => {\n if (window.zoomReset) window.zoomReset()\n }, [])\n\n const handleZoomFit = useCallback(() => {\n if (window.zoomFit) window.zoomFit()\n }, [])\n\n const handleUndo = useCallback(() => {\n if (window.undo) window.undo()\n }, [])\n\n const handleRedo = useCallback(() => {\n if (window.redo) window.redo()\n }, [])\n\n if (viewMode || zenMode) return null\n\n return (\n <div className=\"absolute bottom-1 right-5 flex items-center gap-2.5 z-[1000] font-[lixFont]\">\n {/* Undo/Redo */}\n <div className=\"flex items-center bg-surface rounded-lg overflow-hidden\">\n <button\n onClick={handleUndo}\n title=\"Undo (Ctrl+Z)\"\n className=\"w-9 h-9 flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-undo text-lg\" />\n </button>\n <div className=\"w-px h-5 bg-border-light\" />\n <button\n onClick={handleRedo}\n title=\"Redo (Ctrl+Shift+Z)\"\n className=\"w-9 h-9 flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-redo text-lg\" />\n </button>\n </div>\n\n {/* Zoom controls */}\n <div className=\"flex items-center bg-surface rounded-lg overflow-hidden\">\n <button\n onClick={handleZoomFit}\n aria-label=\"Fit canvas to content\"\n title=\"Fit to Content (Shift+1)\"\n className=\"w-9 h-9 flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-target-lock text-lg\" />\n </button>\n <div className=\"w-px h-5 bg-border-light\" />\n <button\n onClick={handleZoomOut}\n title=\"Zoom Out (Ctrl+-)\"\n className=\"w-9 h-9 flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-minus text-lg\" />\n </button>\n <div className=\"w-px h-5 bg-border-light\" />\n <button\n onClick={handleZoomReset}\n title=\"Reset Zoom (Ctrl+0)\"\n className=\"min-w-[52px] h-9 flex items-center justify-center text-text-secondary text-sm px-2 hover:bg-surface-hover transition-all duration-200\"\n >\n {zoomPercent}%\n </button>\n <div className=\"w-px h-5 bg-border-light\" />\n <button\n onClick={handleZoomIn}\n title=\"Zoom In (Ctrl++)\"\n className=\"w-9 h-9 flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-plus text-lg\" />\n </button>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState } from 'react'\nimport useUIStore from '../store/useUIStore'\nimport useSketchStore from '../store/useSketchStore'\nimport { useAuthStore } from '../hooks/inertStores'\nimport { triggerCloudSync } from '../hooks/inertStores'\nimport { triggerDocCloudSync, persistLayoutMode } from '../hooks/inertStores'\nimport { useTranslation } from '../hooks/useTranslation'\n\n// Issue #38 follow-up: theme-paired swatches. The menu picks the\n// matching list at render time based on the active theme.\nconst CANVAS_BACKGROUNDS_LIGHT = [\n { color: '#ffffff', label: 'menu.canvasBg.white' },\n { color: '#faf9f5', label: 'menu.canvasBg.cream' },\n { color: '#f5f3ed', label: 'menu.canvasBg.paper' },\n { color: '#f0f5fb', label: 'menu.canvasBg.skyTint' },\n { color: '#f0f5ef', label: 'menu.canvasBg.sageTint' },\n]\nconst CANVAS_BACKGROUNDS_DARK = [\n { color: '#000000', label: 'menu.canvasBg.black' },\n { color: '#161718', label: 'menu.canvasBg.darkGray' },\n { color: '#13171C', label: 'menu.canvasBg.blueBlack' },\n { color: '#181605', label: 'menu.canvasBg.darkYellow' },\n { color: '#1B1615', label: 'menu.canvasBg.darkBrown' },\n]\n\nexport default function AppMenu() {\n const { t, language } = useTranslation()\n\n const LINKS = [\n { label: t('links.documentation'), icon: 'bx-book-open', href: '/docs' },\n { label: t('links.github'), icon: 'bxl-github', href: 'https://github.com/elixpo/sketch.elixpo' },\n { label: t('links.reportIssue'), icon: 'bx-bug', href: 'https://github.com/elixpo/sketch.elixpo/issues' },\n ]\n\n const PREFERENCE_ITEMS = [\n { label: t('prefs.toolLock'), shortcut: 'Q', id: 'toolLock' },\n { label: t('prefs.snapObjects'), shortcut: 'Alt+S', id: 'snapObjects' },\n { label: t('prefs.toggleGrid'), shortcut: \"Ctrl+'\", id: 'toggleGrid' },\n { label: t('prefs.zenMode'), shortcut: 'Alt+Z', id: 'zenMode' },\n { label: t('prefs.viewMode'), shortcut: 'Alt+R', id: 'viewMode' },\n { label: t('prefs.canvasShapeProps'), shortcut: 'Alt+/', id: 'properties' },\n { label: t('prefs.arrowBinding'), id: 'arrowBinding', toggle: true },\n { label: t('prefs.snapMidpoints'), id: 'snapMidpoints', toggle: true },\n ]\n\n const menuOpen = useUIStore((s) => s.menuOpen)\n const closeMenu = useUIStore((s) => s.closeMenu)\n const toggleSaveModal = useUIStore((s) => s.toggleSaveModal)\n const toggleCommandPalette = useUIStore((s) => s.toggleCommandPalette)\n const toggleHelpModal = useUIStore((s) => s.toggleHelpModal)\n const toggleExportImageModal = useUIStore((s) => s.toggleExportImageModal)\n const theme = useUIStore((s) => s.theme)\n const setTheme = useUIStore((s) => s.setTheme)\n const persistUIPrefs = useUIStore((s) => s.persistUIPrefs)\n const canvasBackground = useSketchStore((s) => s.canvasBackground)\n const setCanvasBackground = useSketchStore((s) => s.setCanvasBackground)\n const clearShapes = useSketchStore((s) => s.clearShapes)\n const clearHistory = useSketchStore((s) => s.clearHistory)\n const gridEnabled = useSketchStore((s) => s.gridEnabled)\n const toggleGrid = useSketchStore((s) => s.toggleGrid)\n\n const viewMode = useSketchStore((s) => s.viewMode)\n const zenMode = useSketchStore((s) => s.zenMode)\n const toolLock = useSketchStore((s) => s.toolLock)\n const snapToObjects = useSketchStore((s) => s.snapToObjects)\n const toggleViewMode = useSketchStore((s) => s.toggleViewMode)\n const toggleZenMode = useSketchStore((s) => s.toggleZenMode)\n const toggleToolLock = useSketchStore((s) => s.toggleToolLock)\n const toggleSnapToObjects = useSketchStore((s) => s.toggleSnapToObjects)\n\n const layoutMode = useSketchStore((s) => s.layoutMode)\n const setLayoutMode = useSketchStore((s) => s.setLayoutMode)\n const handleSetLayout = (mode) => {\n if (mode === layoutMode) return\n setLayoutMode(mode)\n persistLayoutMode(mode)\n }\n\n const isAuthenticated = useAuthStore((s) => s.isAuthenticated)\n const authUser = useAuthStore((s) => s.user)\n const login = useAuthStore((s) => s.login)\n const logout = useAuthStore((s) => s.logout)\n\n const [prefsOpen, setPrefsOpen] = useState(false)\n\n // Menu is always accessible (via floating button in view/zen mode)\n\n const handleOpen = () => {\n const serializer = window.__sceneSerializer\n if (serializer) {\n serializer.upload().then((result) => {\n if (result && result.success) closeMenu()\n else if (result && result.error) {\n console.warn('[Open] Invalid scene file:', result.error)\n }\n })\n }\n closeMenu()\n }\n\n return (\n <>\n {menuOpen && (\n <div\n className=\"fixed inset-0 z-[999]\"\n onClick={() => { closeMenu(); setPrefsOpen(false) }}\n />\n )}\n <div\n className={`absolute top-14 right-4 w-[230px] max-h-[calc(100vh-140px)] overflow-y-auto no-scrollbar bg-surface/75 backdrop-blur-lg rounded-2xl z-[1000] border border-border-light p-1.5 font-[lixFont] text-[13px] transition-all duration-200 ${\n menuOpen\n ? 'opacity-100 blur-0 pointer-events-auto'\n : 'opacity-0 blur-[20px] pointer-events-none'\n }`}\n >\n {/* Open */}\n <button\n onClick={handleOpen}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-folder-open text-sm\" />\n {t('menu.open')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+O</span>\n </button>\n\n {/* Quick Save */}\n <button\n onClick={() => {\n const serializer = window.__sceneSerializer\n if (serializer) {\n const workspaceName = useUIStore.getState().workspaceName || 'Untitled'\n const sceneData = serializer.save(workspaceName)\n const sessionId = window.__sessionID\n const key = sessionId ? `lixsketch-autosave-${sessionId}` : 'lixsketch-autosave'\n localStorage.setItem(key, JSON.stringify(sceneData))\n useUIStore.getState().setSaveStatus('local')\n triggerCloudSync()\n }\n closeMenu()\n }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-check-circle text-sm\" />\n {t('menu.quickSave')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+S</span>\n </button>\n\n {/* Save & Share */}\n <button\n onClick={() => { toggleSaveModal(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-save text-sm\" />\n {t('menu.saveShare')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+Shift+S</span>\n </button>\n\n {/* Export Image */}\n <button\n onClick={() => { toggleExportImageModal(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-image text-sm\" />\n {t('menu.exportImage')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+Shift+E</span>\n </button>\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Commands - highlighted */}\n <button\n onClick={() => { toggleCommandPalette(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-2 rounded-lg text-xs transition-all duration-200 text-accent-blue bg-accent-blue/10 hover:bg-accent-blue/20 cursor-pointer\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-command text-sm\" />\n {t('menu.commands')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+/</span>\n </button>\n\n {/* Find Text */}\n <button\n onClick={() => { useUIStore.getState().toggleFindBar(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-search text-sm\" />\n {t('menu.findText')}\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+F</span>\n </button>\n\n {/* Canvas Properties */}\n <button\n onClick={() => { useUIStore.getState().toggleCanvasProperties(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-info-circle text-sm\" />\n {t('menu.canvasProperties')}\n </span>\n </button>\n\n {/* Help */}\n <button\n onClick={() => { toggleHelpModal(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-help-circle text-sm\" />\n {t('menu.help')}\n </span>\n </button>\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Document layout */}\n <div className=\"px-3 py-1.5\">\n <p className=\"text-text-dim text-[10px] uppercase tracking-wider mb-1.5 flex items-center gap-1.5\">\n <i className=\"bx bx-file-blank text-[11px]\" />\n Document\n </p>\n <div className=\"flex items-center gap-1 bg-surface/60 border border-border-light rounded-lg p-0.5\">\n {[\n { key: 'canvas', icon: 'bx-pen', label: 'Canvas' },\n { key: 'split', icon: 'bx-layout', label: 'Split' },\n { key: 'docs', icon: 'bxs-notepad', label: 'Docs' },\n ].map((m) => {\n const active = layoutMode === m.key\n return (\n <button\n key={m.key}\n onClick={() => handleSetLayout(m.key)}\n title={m.label}\n className={`flex-1 flex items-center justify-center gap-1 h-6 rounded-md text-[10.5px] transition-all duration-150 ${\n active\n ? 'bg-accent-blue text-text-primary'\n : 'text-text-muted hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n <i className={`bx ${m.icon} text-[11px]`} />\n {m.label}\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Sync doc now (Ctrl+S triggers both, but explicit action is useful from menu) */}\n <button\n onClick={() => {\n triggerCloudSync()\n triggerDocCloudSync()\n closeMenu()\n }}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-cloud-upload text-sm\" />\n Sync canvas + doc\n </span>\n <span className=\"text-text-dim text-xs\">Ctrl+S</span>\n </button>\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Preferences - inline expandable */}\n <button\n onClick={() => setPrefsOpen((p) => !p)}\n className={`w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200 ${prefsOpen ? 'bg-surface-hover' : ''}`}\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-cog text-sm\" />\n {t('menu.preferences')}\n </span>\n <i className={`bx bx-chevron-down text-sm text-text-dim transition-transform duration-150 ${prefsOpen ? 'rotate-180' : ''}`} />\n </button>\n\n {prefsOpen && (\n <div className=\"ml-2 border-l border-border-light pl-1\">\n {/* Language Switcher */}\n <div className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[11px] transition-all duration-200\">\n <span className=\"flex items-center gap-2\">\n {t('prefs.language')}\n </span>\n <select \n className=\"bg-surface-hover text-text-primary text-[10px] rounded px-1 outline-none border border-border-light\"\n value={language}\n onChange={(e) => persistUIPrefs({ language: e.target.value })}\n >\n <option value=\"en\">English</option>\n <option value=\"bg\">\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438</option>\n <option value=\"de\">Deutsch</option>\n </select>\n </div>\n \n {PREFERENCE_ITEMS.map((item) => {\n const isActive =\n (item.id === 'toolLock' && toolLock) ||\n (item.id === 'snapObjects' && snapToObjects) ||\n (item.id === 'toggleGrid' && gridEnabled) ||\n (item.id === 'zenMode' && zenMode) ||\n (item.id === 'viewMode' && viewMode) ||\n (item.toggle) // arrow binding, snap midpoints default on\n\n const handleClick = () => {\n if (item.id === 'toolLock') toggleToolLock()\n else if (item.id === 'snapObjects') toggleSnapToObjects()\n else if (item.id === 'toggleGrid') toggleGrid()\n else if (item.id === 'zenMode') { toggleZenMode(); closeMenu() }\n else if (item.id === 'viewMode') { toggleViewMode(); closeMenu() }\n }\n\n return (\n <button\n key={item.id}\n onClick={handleClick}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[11px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n {isActive && (\n <i className=\"bx bx-check text-sm text-accent-blue\" />\n )}\n {item.label}\n </span>\n {item.shortcut && (\n <span className=\"text-text-dim text-[10px]\">{item.shortcut}</span>\n )}\n </button>\n )\n })}\n </div>\n )}\n\n {/* Grid toggle */}\n <button\n onClick={toggleGrid}\n className=\"w-full flex items-center justify-between px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-grid-alt text-sm\" />\n {t('menu.showGrid')}\n </span>\n <div className={`w-7 h-4 rounded-full transition-all duration-150 relative ${gridEnabled ? 'bg-accent-blue' : 'bg-white/10'}`}>\n <div className={`absolute top-0.5 w-3 h-3 rounded-full bg-white transition-all duration-150 ${gridEnabled ? 'left-3.5' : 'left-0.5'}`} />\n </div>\n </button>\n\n {/* Reset The Canvas */}\n <button\n onClick={() => {\n const serializer = window.__sceneSerializer\n if (serializer?.resetCanvas) serializer.resetCanvas()\n clearShapes(); clearHistory(); closeMenu()\n }}\n className=\"w-full flex items-center justify-between px-3 py-2 rounded-lg text-red-400 text-xs hover:bg-red-500/10 cursor-pointer transition-all duration-200\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-reset text-sm\" />\n {t('menu.resetCanvas')}\n </span>\n </button>\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Links */}\n {LINKS.map((link) => {\n const isExternal = link.href.startsWith('http')\n return (\n <a\n key={link.label}\n href={link.href}\n {...(isExternal ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n onClick={closeMenu}\n className=\"w-full flex items-center gap-2 px-3 py-1.5 rounded-lg text-text-secondary text-[12.5px] hover:bg-surface-hover cursor-pointer transition-all duration-200\"\n >\n <i className={`bx ${link.icon} text-sm`} />\n {link.label}\n </a>\n )\n })}\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Sign In / Sign Out */}\n {isAuthenticated ? (\n <>\n <div className=\"px-3 py-2 flex items-center gap-2\">\n {authUser?.avatar ? (\n <img src={authUser.avatar} alt=\"\" className=\"w-5 h-5 rounded-full\" />\n ) : (\n <i className=\"bx bx-user-circle text-sm text-accent-blue\" />\n )}\n <span className=\"text-text-secondary text-xs truncate flex-1\">{authUser?.displayName || authUser?.email}</span>\n </div>\n <button\n onClick={() => { logout(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-2 rounded-lg text-xs transition-all duration-200 text-red-400 hover:bg-red-500/10 cursor-pointer\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-log-out text-sm\" />\n {t('menu.signOut')}\n </span>\n </button>\n </>\n ) : (\n <button\n onClick={() => { login(); closeMenu() }}\n className=\"w-full flex items-center justify-between px-3 py-2 rounded-lg text-xs transition-all duration-200 text-text-secondary hover:bg-surface-hover\"\n >\n <span className=\"flex items-center gap-2\">\n <i className=\"bx bx-log-in text-sm\" />\n {t('menu.signIn')}\n </span>\n <span className=\"text-text-dim text-[10px] px-1.5 py-0.5 rounded bg-accent-blue/15 text-accent-blue\">Elixpo</span>\n </button>\n )}\n\n <hr className=\"border-border-light my-1\" />\n\n {/* Theme toggle */}\n <div className=\"px-3 py-2\">\n <p className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">\n {t('menu.theme')}\n </p>\n <div className=\"flex items-center gap-1\">\n {[\n { value: 'light', icon: 'bxs-sun' },\n { value: 'dark', icon: 'bxs-moon' },\n { value: 'system', icon: 'bx-laptop' },\n ].map((t) => (\n <button\n key={t.value}\n onClick={() => setTheme(t.value)}\n className={`flex-1 flex items-center justify-center py-1.5 rounded-lg text-xs cursor-pointer transition-all duration-200 ${\n theme === t.value\n ? 'bg-accent text-text-primary'\n : 'text-text-muted hover:bg-surface-hover'\n }`}\n >\n <i className={`bx ${t.icon} text-sm`} />\n </button>\n ))}\n </div>\n </div>\n\n {/* Canvas background */}\n <div className=\"px-3 py-2\">\n <p className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">\n {t('menu.canvasBackground')}\n </p>\n <div className=\"flex items-center gap-1.5\">\n {(theme === 'dark' ? CANVAS_BACKGROUNDS_DARK : CANVAS_BACKGROUNDS_LIGHT).map((bg) => (\n <button\n key={bg.color}\n onClick={() => setCanvasBackground(bg.color)}\n title={t(bg.label)}\n className={`w-7 h-7 rounded-full border-2 cursor-pointer transition-all duration-200 ${\n canvasBackground === bg.color\n ? 'border-accent scale-110'\n : 'border-border hover:border-border-light'\n }`}\n style={{ backgroundColor: bg.color }}\n />\n ))}\n </div>\n </div>\n </div>\n </>\n )\n}\n", "// Lightweight i18n stub for the offline package. Converts dotted keys\n// into readable labels so consumers don't have to ship a full translation\n// table just to get nice button names. A real `t()` from the host can be\n// passed in via `options.t` if needed (LixSketchCanvas can wire it up\n// later).\n//\n// t('sidebar.sectionHeader.stroke') \u2192 'Stroke'\n// t('sidebar.bringForward') \u2192 'Bring forward'\n// t('menu.canvasBackground') \u2192 'Canvas background'\n// t('shortcuts.deselect', 'Deselect') \u2192 'Deselect' (fallback wins)\n\n// Hand-written overrides for keys that don't reduce cleanly from the\n// last segment alone (acronyms, hyphens, multi-word phrases).\nconst OVERRIDES = {\n 'sidebar.sectionHeader.stroke': 'Stroke',\n 'sidebar.sectionHeader.fill': 'Fill',\n 'sidebar.sectionHeader.background': 'Background',\n 'sidebar.sectionHeader.backgroundImage': 'Background image',\n 'sidebar.sectionHeader.width': 'Width',\n 'sidebar.sectionHeader.edge': 'Edge style',\n 'sidebar.sectionHeader.head': 'Arrow head',\n 'sidebar.sectionHeader.type': 'Type',\n 'sidebar.sectionHeader.name': 'Name',\n 'sidebar.sectionHeader.color': 'Color',\n 'sidebar.sectionHeader.fit': 'Fit',\n 'sidebar.sectionHeader.roughness': 'Roughness',\n 'sidebar.sectionHeader.sloppiness': 'Sloppiness',\n 'sidebar.sectionHeader.taper': 'Taper',\n 'menu.canvasBackground': 'Canvas background',\n 'menu.canvasProperties': 'Canvas properties',\n 'menu.exportImage': 'Export as image',\n 'menu.findText': 'Find text',\n 'menu.quickSave': 'Quick save',\n 'menu.resetCanvas': 'Reset canvas',\n 'menu.saveShare': 'Save & share',\n 'menu.showGrid': 'Show grid',\n 'menu.signIn': 'Sign in',\n 'menu.signOut': 'Sign out',\n 'prefs.toolLock': 'Tool lock',\n 'prefs.toggleGrid': 'Toggle grid',\n 'prefs.snapObjects': 'Snap to objects',\n 'prefs.snapMidpoints': 'Snap to midpoints',\n 'prefs.zenMode': 'Zen mode',\n 'prefs.viewMode': 'View mode',\n 'prefs.canvasShapeProps': 'Canvas & shape properties',\n 'prefs.arrowBinding': 'Arrow binding',\n 'prefs.language': 'Language',\n 'sidebar.bringForward': 'Bring forward',\n 'sidebar.bringToFront': 'Bring to front',\n 'sidebar.sendBackward': 'Send backward',\n 'sidebar.sendToBack': 'Send to back',\n 'sidebar.fillColor': 'Fill color',\n 'sidebar.strokeColor': 'Stroke color',\n 'sidebar.codeMode': 'Code mode',\n 'sidebar.renderText': 'Render text',\n 'sidebar.newLine': 'New line',\n};\n\nfunction camelToWords(s) {\n return s.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/-/g, ' ');\n}\n\nfunction autoFormat(key) {\n const last = key.split('.').pop() || key;\n const words = camelToWords(last);\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\nfunction tImpl(key, fallbackOrOpts) {\n if (typeof key !== 'string') return fallbackOrOpts ?? '';\n // The product calls t() with various signatures: (key), (key, fallback),\n // (key, { defaultValue }). Handle all of them.\n let fallback = '';\n if (typeof fallbackOrOpts === 'string') {\n fallback = fallbackOrOpts;\n } else if (fallbackOrOpts && typeof fallbackOrOpts === 'object') {\n fallback = fallbackOrOpts.defaultValue || '';\n }\n if (fallback) return fallback;\n if (OVERRIDES[key]) return OVERRIDES[key];\n return autoFormat(key);\n}\n\nexport function useTranslation() {\n return {\n t: tImpl,\n locale: 'en',\n setLocale: () => {},\n };\n}\n\nexport default useTranslation;\n", "\"use client\"\n\nimport { useState, useRef, useEffect } from 'react'\nimport useSketchStore from '../../store/useSketchStore'\n\n/**\n * A toolbar button that opens a popover panel above it on click.\n * Shows an icon (or custom preview) in the bar, popover shows full options.\n */\nexport function ToolbarButton({ icon, preview, children, tooltip }) {\n const [open, setOpen] = useState(false)\n const ref = useRef(null)\n\n // Close on outside click\n useEffect(() => {\n if (!open) return\n const handler = (e) => {\n if (ref.current && !ref.current.contains(e.target)) setOpen(false)\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative flex items-center\">\n <button\n onClick={() => setOpen(!open)}\n title={tooltip}\n className={`h-9 flex items-center gap-1.5 px-3 rounded-lg transition-all duration-100 ${\n open\n ? 'bg-surface-active text-text-primary'\n : 'text-text-muted hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {preview || (icon && <i className={`bx ${icon} text-base`} />)}\n <svg className={`w-2 h-2 opacity-40 transition-transform duration-100 ${open ? 'rotate-180' : ''}`} viewBox=\"0 0 8 5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M1 1l3 3 3-3\" />\n </svg>\n </button>\n\n {open && (\n <div className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-3 z-20\">\n <div className=\"bg-surface-card border border-border-light rounded-xl p-3 shadow-xl shadow-black/10 min-w-max\">\n {children}\n </div>\n {/* Arrow pointer */}\n <div className=\"absolute -bottom-[5px] left-1/2 -translate-x-1/2 w-2.5 h-2.5 rotate-45 bg-surface-card border-r border-b border-border-light\" />\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Simple toolbar divider\n */\nfunction Divider() {\n return <div className=\"w-px h-5 bg-surface-hover mx-0.5 shrink-0\" />\n}\n\n/**\n * Bottom toolbar container - appears when tool/shape is active\n */\nexport default function ShapeSidebar({ visible, children }) {\n const viewMode = useSketchStore((s) => s.viewMode)\n const show = visible && !viewMode\n\n return (\n <div\n className={`absolute bottom-14 left-1/2 -translate-x-1/2 bg-surface border border-border-light rounded-xl px-2 py-1.5 z-[999] font-[lixFont] transition-all duration-200 ${\n show\n ? 'opacity-100 pointer-events-auto translate-y-0'\n : 'opacity-0 pointer-events-none translate-y-2'\n }`}\n >\n <div className=\"flex items-center gap-0.5\">\n {children}\n </div>\n </div>\n )\n}\n\n/**\n * Layer ordering controls - add to any shape sidebar\n */\nimport { useTranslation } from '../../hooks/useTranslation'\n\nfunction LayerControls() {\n const { t } = useTranslation()\n const doLayer = (method) => {\n const shape = window.currentShape\n if (!shape || !window.__layerOrder) return\n window.__layerOrder[method](shape)\n }\n\n return (\n <div className=\"flex items-center gap-0.5\">\n <button\n onClick={() => doLayer('sendToBack')}\n title={t('sidebar.sendToBack', { defaultValue: 'Send to back' })}\n className=\"h-9 w-8 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-100\"\n >\n <i className=\"bx bx-chevrons-down text-base\" />\n </button>\n <button\n onClick={() => doLayer('sendBackward')}\n title={t('sidebar.sendBackward')}\n className=\"h-9 w-8 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-100\"\n >\n <i className=\"bx bx-chevron-down text-base\" />\n </button>\n <button\n onClick={() => doLayer('bringForward')}\n title={t('sidebar.bringForward')}\n className=\"h-9 w-8 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-100\"\n >\n <i className=\"bx bx-chevron-up text-base\" />\n </button>\n <button\n onClick={() => doLayer('bringToFront')}\n title={t('sidebar.bringToFront', { defaultValue: 'Bring to front' })}\n className=\"h-9 w-8 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-100\"\n >\n <i className=\"bx bx-chevrons-up text-base\" />\n </button>\n </div>\n )\n}\n\nexport { Divider, LayerControls }\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst STROKE_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\nconst BG_COLORS = ['transparent', '#f0f0f0', '#ffcccb', '#90ee90', '#add8e6', '#FFE4B5', '#DDA0DD', '#2d2d2d']\n\nconst FILLS = [\n { value: 'hachure', label: 'sidebar.fill.hachure' },\n { value: 'solid', label: 'sidebar.fill.solid' },\n { value: 'dots', label: 'sidebar.fill.dots' },\n { value: 'cross-hatch', label: 'sidebar.fill.cross' },\n { value: 'transparent', label: 'sidebar.fill.none' },\n]\n\nfunction ColorGrid({ colors, selected, onSelect }) {\n return (\n <div className=\"grid grid-cols-4 gap-1.5\">\n {colors.map((c) => {\n const isTrans = c === 'transparent'\n return (\n <button\n key={c}\n onClick={() => onSelect(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${\n selected === c ? 'border-[#5B57D1] scale-110' : 'border-white/[0.08] hover:border-white/20'\n }`}\n style={!isTrans ? { backgroundColor: c } : undefined}\n >\n {isTrans && (\n <svg className=\"w-full h-full text-text-dim\" viewBox=\"0 0 20 20\">\n <line x1=\"4\" y1=\"16\" x2=\"16\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n )}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport default function RectangleSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [strokeColor, setStrokeColor] = useState('#fff')\n const [bgColor, setBgColor] = useState('transparent')\n const [thickness, setThickness] = useState(2)\n const [lineStyle, setLineStyle] = useState('solid')\n const [fillStyle, setFillStyle] = useState('hachure')\n\n const update = useCallback((changes, localSetters) => {\n Object.entries(localSetters).forEach(([, fn]) => fn())\n if (window.updateSelectedRectStyle) window.updateSelectedRectStyle(changes)\n }, [])\n\n const updateStroke = useCallback((v) => { setStrokeColor(v); if (window.updateSelectedRectStyle) window.updateSelectedRectStyle({ stroke: v }) }, [])\n const updateBg = useCallback((v) => { setBgColor(v); if (window.updateSelectedRectStyle) window.updateSelectedRectStyle({ fill: v }) }, [])\n const updateThickness = useCallback((v) => { setThickness(v); if (window.updateSelectedRectStyle) window.updateSelectedRectStyle({ strokeWidth: v }) }, [])\n const updateStyle = useCallback((v) => { setLineStyle(v); if (window.updateSelectedRectStyle) window.updateSelectedRectStyle({ outlineStyle: v }) }, [])\n const updateFill = useCallback((v) => { setFillStyle(v); if (window.updateSelectedRectStyle) window.updateSelectedRectStyle({ fillStyle: v }) }, [])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.RECTANGLE || selectedShapeSidebar === 'rectangle'}>\n {/* Stroke color */}\n <ToolbarButton\n tooltip={t('sidebar.strokeColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: strokeColor }} />}\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.stroke')}</p>\n <ColorGrid colors={STROKE_COLORS} selected={strokeColor} onSelect={updateStroke} />\n </ToolbarButton>\n\n <Divider />\n\n {/* Background */}\n <ToolbarButton\n tooltip={t('sidebar.fillColor')}\n preview={\n <span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: bgColor === 'transparent' ? 'transparent' : bgColor }}>\n {bgColor === 'transparent' && (\n <svg className=\"w-full h-full text-text-dim\" viewBox=\"0 0 16 16\"><line x1=\"2\" y1=\"14\" x2=\"14\" y2=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" /></svg>\n )}\n </span>\n }\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.background')}</p>\n <ColorGrid colors={BG_COLORS} selected={bgColor} onSelect={updateBg} />\n </ToolbarButton>\n\n <Divider />\n\n {/* Thickness */}\n <ToolbarButton icon=\"bxs-edit-alt\" tooltip={t('sidebar.strokeWidth')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.width')}</p>\n <div className=\"flex items-center gap-1\">\n {[1, 2, 4, 7].map((w) => (\n <button\n key={w}\n onClick={() => updateThickness(w)}\n className={`w-9 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${\n thickness === w ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-muted hover:bg-white/[0.06]'\n }`}\n >\n <div className=\"w-5 rounded-full bg-current\" style={{ height: Math.max(1, w) }} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n {/* Stroke style */}\n <ToolbarButton icon=\"bxs-minus-circle\" tooltip=\"Stroke style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.style')}</p>\n <div className=\"flex items-center gap-1\">\n {[\n { v: 'solid', d: '' },\n { v: 'dashed', d: '6 4' },\n { v: 'dotted', d: '2 3' },\n ].map((s) => (\n <button\n key={s.v}\n onClick={() => updateStyle(s.v)}\n className={`w-11 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${\n lineStyle === s.v ? 'bg-[#5B57D1]/20' : 'hover:bg-white/[0.06]'\n }`}\n >\n <svg width=\"28\" height=\"4\" viewBox=\"0 0 28 4\">\n <line x1=\"0\" y1=\"2\" x2=\"28\" y2=\"2\" stroke=\"#fff\" strokeWidth=\"2\" strokeDasharray={s.d} strokeLinecap=\"round\" />\n </svg>\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n {/* Fill pattern */}\n <ToolbarButton icon=\"bxs-brush\" tooltip=\"Fill style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.fill')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {FILLS.map((f) => (\n <button\n key={f.value}\n onClick={() => updateFill(f.value)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${\n fillStyle === f.value ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'\n }`}\n >\n <span className=\"w-1.5 h-1.5 rounded-full bg-current\" />\n {t(f.label)}\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst STROKE_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\nconst BG_COLORS = ['transparent', '#f0f0f0', '#ffcccb', '#90ee90', '#add8e6', '#FFE4B5', '#DDA0DD', '#2d2d2d']\n\nconst FILLS = [\n { value: 'hachure', label: 'sidebar.fill.hachure' },\n { value: 'solid', label: 'sidebar.fill.solid' },\n { value: 'dots', label: 'sidebar.fill.dots' },\n { value: 'cross-hatch', label: 'sidebar.fill.cross' },\n { value: 'transparent', label: 'sidebar.fill.none' },\n]\n\nfunction ColorGrid({ colors, selected, onSelect }) {\n return (\n <div className=\"grid grid-cols-4 gap-1.5\">\n {colors.map((c) => {\n const isTrans = c === 'transparent'\n return (\n <button\n key={c}\n onClick={() => onSelect(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${\n selected === c ? 'border-accent-blue scale-110' : 'border-white/[0.08] hover:border-white/20'\n }`}\n style={!isTrans ? { backgroundColor: c } : undefined}\n >\n {isTrans && (\n <svg className=\"w-full h-full text-text-dim\" viewBox=\"0 0 20 20\">\n <line x1=\"4\" y1=\"16\" x2=\"16\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n )}\n </button>\n )\n })}\n </div>\n )\n}\n\nexport default function CircleSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [strokeColor, setStrokeColor] = useState('#fff')\n const [bgColor, setBgColor] = useState('transparent')\n const [thickness, setThickness] = useState(2)\n const [lineStyle, setLineStyle] = useState('solid')\n const [fillStyle, setFillStyle] = useState('hachure')\n\n const updateStroke = useCallback((v) => { setStrokeColor(v); if (window.updateSelectedCircleStyle) window.updateSelectedCircleStyle({ stroke: v }) }, [])\n const updateBg = useCallback((v) => { setBgColor(v); if (window.updateSelectedCircleStyle) window.updateSelectedCircleStyle({ fill: v }) }, [])\n const updateThickness = useCallback((v) => { setThickness(v); if (window.updateSelectedCircleStyle) window.updateSelectedCircleStyle({ strokeWidth: v }) }, [])\n const updateStyle = useCallback((v) => { setLineStyle(v); if (window.updateSelectedCircleStyle) window.updateSelectedCircleStyle({ outlineStyle: v }) }, [])\n const updateFill = useCallback((v) => { setFillStyle(v); if (window.updateSelectedCircleStyle) window.updateSelectedCircleStyle({ fillStyle: v }) }, [])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.CIRCLE || selectedShapeSidebar === 'circle'}>\n <ToolbarButton\n tooltip={t('sidebar.strokeColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: strokeColor }} />}\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.stroke')}</p>\n <ColorGrid colors={STROKE_COLORS} selected={strokeColor} onSelect={updateStroke} />\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton\n tooltip={t('sidebar.fillColor')}\n preview={\n <span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: bgColor === 'transparent' ? 'transparent' : bgColor }}>\n {bgColor === 'transparent' && <svg className=\"w-full h-full text-text-dim\" viewBox=\"0 0 16 16\"><line x1=\"2\" y1=\"14\" x2=\"14\" y2=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" /></svg>}\n </span>\n }\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.background')}</p>\n <ColorGrid colors={BG_COLORS} selected={bgColor} onSelect={updateBg} />\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-edit-alt\" tooltip={t('sidebar.strokeWidth')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.width')}</p>\n <div className=\"flex items-center gap-1\">\n {[1, 2, 4, 7].map((w) => (\n <button key={w} onClick={() => updateThickness(w)}\n className={`w-9 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${thickness === w ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-muted hover:bg-white/[0.06]'}`}\n >\n <div className=\"w-5 rounded-full bg-current\" style={{ height: Math.max(1, w) }} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-minus-circle\" tooltip=\"Stroke style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.style')}</p>\n <div className=\"flex items-center gap-1\">\n {[{ v: 'solid', d: '' }, { v: 'dashed', d: '6 4' }, { v: 'dotted', d: '2 3' }].map((s) => (\n <button key={s.v} onClick={() => updateStyle(s.v)}\n className={`w-11 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${lineStyle === s.v ? 'bg-[#5B57D1]/20' : 'hover:bg-white/[0.06]'}`}\n >\n <svg width=\"28\" height=\"4\" viewBox=\"0 0 28 4\"><line x1=\"0\" y1=\"2\" x2=\"28\" y2=\"2\" stroke=\"#fff\" strokeWidth=\"2\" strokeDasharray={s.d} strokeLinecap=\"round\" /></svg>\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-brush\" tooltip=\"Fill style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.fill')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {FILLS.map((f) => (\n <button key={f.value} onClick={() => updateFill(f.value)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${fillStyle === f.value ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <span className=\"w-1.5 h-1.5 rounded-full bg-current\" />\n {t(f.label)}\n </button>\n ))}\n </div>\n </ToolbarButton>\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst STROKE_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\n\nfunction ColorGrid({ colors, selected, onSelect }) {\n return (\n <div className=\"grid grid-cols-4 gap-1.5\">\n {colors.map((c) => (\n <button key={c} onClick={() => onSelect(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${selected === c ? 'border-[#5B57D1] scale-110' : 'border-white/[0.08] hover:border-white/20'}`}\n style={{ backgroundColor: c }}\n />\n ))}\n </div>\n )\n}\n\nexport default function LineSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [strokeColor, setStrokeColor] = useState('#fff')\n const [thickness, setThickness] = useState(2)\n const [lineStyle, setLineStyle] = useState('solid')\n const [sloppiness, setSloppiness] = useState(0)\n const [edge, setEdge] = useState('smooth')\n\n const updateStroke = useCallback((v) => { setStrokeColor(v); if (window.updateSelectedLineStyle) window.updateSelectedLineStyle({ stroke: v }) }, [])\n const updateThickness = useCallback((v) => { setThickness(v); if (window.updateSelectedLineStyle) window.updateSelectedLineStyle({ strokeWidth: v }) }, [])\n const updateStyle = useCallback((v) => { setLineStyle(v); if (window.updateSelectedLineStyle) window.updateSelectedLineStyle({ strokeStyle: v }) }, [])\n const updateSloppiness = useCallback((v) => { setSloppiness(v); if (window.updateSelectedLineStyle) window.updateSelectedLineStyle({ sloppiness: v }) }, [])\n const updateEdge = useCallback((v) => { setEdge(v); if (window.updateSelectedLineStyle) window.updateSelectedLineStyle({ edge: v === 'smooth' ? 1 : 5 }) }, [])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.LINE || selectedShapeSidebar === 'line'}>\n <ToolbarButton tooltip={t('sidebar.strokeColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: strokeColor }} />}\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.stroke')}</p>\n <ColorGrid colors={STROKE_COLORS} selected={strokeColor} onSelect={updateStroke} />\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-edit-alt\" tooltip={t('sidebar.strokeWidth')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.width')}</p>\n <div className=\"flex items-center gap-1\">\n {[1, 2, 4, 7].map((w) => (\n <button key={w} onClick={() => updateThickness(w)}\n className={`w-9 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${thickness === w ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-muted hover:bg-white/[0.06]'}`}\n >\n <div className=\"w-5 rounded-full bg-current\" style={{ height: Math.max(1, w) }} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-minus-circle\" tooltip=\"Stroke style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.style')}</p>\n <div className=\"flex items-center gap-1\">\n {[{ v: 'solid', d: '' }, { v: 'dashed', d: '6 4' }, { v: 'dotted', d: '2 3' }].map((s) => (\n <button key={s.v} onClick={() => updateStyle(s.v)}\n className={`w-11 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${lineStyle === s.v ? 'bg-[#5B57D1]/20' : 'hover:bg-white/[0.06]'}`}\n >\n <svg width=\"28\" height=\"4\" viewBox=\"0 0 28 4\"><line x1=\"0\" y1=\"2\" x2=\"28\" y2=\"2\" stroke=\"#fff\" strokeWidth=\"2\" strokeDasharray={s.d} strokeLinecap=\"round\" /></svg>\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-shape-polygon\" tooltip=\"Sloppiness\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.sloppiness')}</p>\n <div className=\"flex items-center gap-1\">\n {[{ v: 0, l: '0' }, { v: 2, l: '2' }, { v: 4, l: '4' }].map((s) => (\n <button key={s.v} onClick={() => updateSloppiness(s.v)}\n className={`w-8 h-8 flex items-center justify-center rounded-lg text-xs transition-all duration-100 ${sloppiness === s.v ? 'bg-[#5B57D1]/20 text-accent-blue' : 'text-text-muted hover:bg-white/6'}`}\n >{s.l}</button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-landscape\" tooltip=\"Edge\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.edge')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {[{ v: 'smooth', i: 'bxs-droplet', l: 'Smooth' }, { v: 'rough', i: 'bxs-bolt', l: 'Rough' }].map((e) => (\n <button key={e.v} onClick={() => updateEdge(e.v)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${edge === e.v ? 'bg-accent-blue text-white' : 'text-text-secondary hover:bg-white/6'}`}\n >\n <i className={`bx ${e.i} text-sm`} /> {e.l}\n </button>\n ))}\n </div>\n </ToolbarButton>\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst STROKE_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\n\nconst HEAD_STYLES = [\n { value: 'default', svg: '<svg width=\"22\" height=\"12\" viewBox=\"0 0 24 14\"><line x1=\"2\" y1=\"7\" x2=\"16\" y2=\"7\" stroke=\"#fff\" stroke-width=\"2\"/><polyline points=\"13,2 19,7 13,12\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2\" stroke-linejoin=\"round\"/></svg>' },\n { value: 'square', svg: '<svg width=\"22\" height=\"12\" viewBox=\"0 0 24 14\"><line x1=\"2\" y1=\"7\" x2=\"14\" y2=\"7\" stroke=\"#fff\" stroke-width=\"2\"/><rect x=\"14\" y=\"3\" width=\"6\" height=\"8\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.5\"/></svg>' },\n { value: 'outline', svg: '<svg width=\"22\" height=\"12\" viewBox=\"0 0 24 14\"><line x1=\"2\" y1=\"7\" x2=\"13\" y2=\"7\" stroke=\"#fff\" stroke-width=\"2\"/><polygon points=\"13,2 21,7 13,12\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.5\"/></svg>' },\n { value: 'solid', svg: '<svg width=\"22\" height=\"12\" viewBox=\"0 0 24 14\"><line x1=\"2\" y1=\"7\" x2=\"13\" y2=\"7\" stroke=\"#fff\" stroke-width=\"2\"/><polygon points=\"13,2 21,7 13,12\" fill=\"#fff\"/></svg>' },\n]\n\nfunction SvgIcon({ svg }) {\n return <span dangerouslySetInnerHTML={{ __html: svg }} />\n}\n\nfunction ColorGrid({ colors, selected, onSelect }) {\n return (\n <div className=\"grid grid-cols-4 gap-1.5\">\n {colors.map((c) => (\n <button key={c} onClick={() => onSelect(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${selected === c ? 'border-[#5B57D1] scale-110' : 'border-white/[0.08] hover:border-white/20'}`}\n style={{ backgroundColor: c }}\n />\n ))}\n </div>\n )\n}\n\nexport default function ArrowSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [headStyle, setHeadStyle] = useState('default')\n const [strokeColor, setStrokeColor] = useState('#fff')\n const [thickness, setThickness] = useState(2)\n const [outlineStyle, setOutlineStyle] = useState('solid')\n const [arrowType, setArrowType] = useState('straight')\n const [curvature, setCurvature] = useState(20)\n\n // Bridge helpers: update React state + engine state + selected arrow\n const updateHead = useCallback((v) => {\n setHeadStyle(v)\n if (window.arrowToolSettings) window.arrowToolSettings.headStyle = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ arrowHeadStyle: v })\n }, [])\n\n const updateStroke = useCallback((v) => {\n setStrokeColor(v)\n if (window.arrowToolSettings) window.arrowToolSettings.strokeColor = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ stroke: v })\n }, [])\n\n const updateThickness = useCallback((v) => {\n setThickness(v)\n if (window.arrowToolSettings) window.arrowToolSettings.strokeWidth = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ strokeWidth: v })\n }, [])\n\n const updateOutline = useCallback((v) => {\n setOutlineStyle(v)\n if (window.arrowToolSettings) window.arrowToolSettings.outlineStyle = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ arrowOutlineStyle: v })\n }, [])\n\n const updateType = useCallback((v) => {\n setArrowType(v)\n if (window.arrowToolSettings) window.arrowToolSettings.arrowCurved = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ arrowCurved: v })\n }, [])\n\n const updateCurvature = useCallback((v) => {\n setCurvature(v)\n if (window.arrowToolSettings) window.arrowToolSettings.curveAmount = v\n if (window.updateSelectedArrowStyle) window.updateSelectedArrowStyle({ arrowCurveAmount: v })\n }, [])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.ARROW || selectedShapeSidebar === 'arrow'}>\n {/* Head style */}\n <ToolbarButton icon=\"bxs-right-arrow\" tooltip=\"Arrow head\">\n <p className=\"text-xs text-text-secondary uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.head')}</p>\n <div className=\"flex items-center gap-1\">\n {HEAD_STYLES.map((h) => (\n <button key={h.value} onClick={() => updateHead(h.value)}\n className={`w-10 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${headStyle === h.value ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <SvgIcon svg={h.svg} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton tooltip={t('sidebar.strokeColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: strokeColor }} />}\n >\n <p className=\"text-xs text-text-secondary uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.stroke')}</p>\n <ColorGrid colors={STROKE_COLORS} selected={strokeColor} onSelect={updateStroke} />\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-edit-alt\" tooltip={t('sidebar.strokeWidth')}>\n <p className=\"text-xs text-text-secondary uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.width')}</p>\n <div className=\"flex items-center gap-1\">\n {[1, 2, 4, 7].map((w) => (\n <button key={w} onClick={() => updateThickness(w)}\n className={`w-9 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${thickness === w ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <div className=\"w-5 rounded-full bg-current\" style={{ height: Math.max(1, w) }} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-minus-circle\" tooltip=\"Stroke style\">\n <p className=\"text-xs text-text-secondary uppercase tracking-wider mb-2\">{t('sidebar.style')}</p>\n <div className=\"flex items-center gap-1\">\n {[{ v: 'solid', d: '' }, { v: 'dashed', d: '6 4' }, { v: 'dotted', d: '2 3' }].map((s) => (\n <button key={s.v} onClick={() => updateOutline(s.v)}\n className={`w-11 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${outlineStyle === s.v ? 'bg-[#5B57D1]/20' : 'hover:bg-white/[0.06]'}`}\n >\n <svg width=\"28\" height=\"4\" viewBox=\"0 0 28 4\"><line x1=\"0\" y1=\"2\" x2=\"28\" y2=\"2\" stroke=\"#fff\" strokeWidth=\"2\" strokeDasharray={s.d} strokeLinecap=\"round\" /></svg>\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n {/* Arrow type */}\n <ToolbarButton icon=\"bxs-share-alt\" tooltip=\"Arrow type\">\n <p className=\"text-xs text-text-secondary uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.type')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {[\n { v: 'straight', i: 'bxs-right-arrow-alt', l: 'Straight' },\n { v: 'curved', i: 'bxs-analyse', l: 'Curved' },\n { v: 'elbow', i: 'bxs-network-chart', l: 'Elbow' },\n ].map((a) => (\n <button key={a.v} onClick={() => updateType(a.v)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${arrowType === a.v ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <i className={`bx ${a.i} text-sm`} /> {a.l}\n </button>\n ))}\n {arrowType === 'curved' && (\n <>\n <div className=\"w-full h-px bg-white/[0.08] my-1\" />\n <p className=\"text-[9px] text-text-dim uppercase tracking-wider mb-1\">Curvature</p>\n <div className=\"flex items-center gap-1\">\n {[{ v: 8, l: 'Lo' }, { v: 20, l: 'Md' }, { v: 40, l: 'Hi' }].map((c) => (\n <button key={c.v} onClick={() => updateCurvature(c.v)}\n className={`flex-1 py-1 rounded-md text-xs text-center transition-all duration-100 ${curvature === c.v ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >{c.l}</button>\n ))}\n </div>\n </>\n )}\n </div>\n </ToolbarButton>\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst STROKE_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\n\n// Map taper UI values to perfect-freehand thinning values\nconst TAPER_MAP = { uniform: 0, pen: 0.5, brush: 0.8 }\n\nfunction ColorGrid({ colors, selected, onSelect }) {\n return (\n <div className=\"grid grid-cols-4 gap-1.5\">\n {colors.map((c) => (\n <button key={c} onClick={() => onSelect(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${selected === c ? 'border-[#5B57D1] scale-110' : 'border-white/[0.08] hover:border-white/20'}`}\n style={{ backgroundColor: c }}\n />\n ))}\n </div>\n )\n}\n\nexport default function PaintbrushSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [strokeColor, setStrokeColor] = useState('#fff')\n const [thickness, setThickness] = useState(2)\n const [lineStyle, setLineStyle] = useState('solid')\n const [taper, setTaper] = useState('uniform')\n const [roughness, setRoughness] = useState('smooth')\n const [opacity, setOpacity] = useState(1)\n\n const updateStroke = useCallback((v) => { setStrokeColor(v); if (window.updateSelectedFreehandStyle) window.updateSelectedFreehandStyle({ stroke: v }) }, [])\n const updateThickness = useCallback((v) => { setThickness(v); if (window.updateSelectedFreehandStyle) window.updateSelectedFreehandStyle({ strokeWidth: v }) }, [])\n const updateTaper = useCallback((v) => { setTaper(v); if (window.updateSelectedFreehandStyle) window.updateSelectedFreehandStyle({ thinning: TAPER_MAP[v] }) }, [])\n const updateRoughness = useCallback((v) => { setRoughness(v); if (window.updateSelectedFreehandStyle) window.updateSelectedFreehandStyle({ roughness: v }) }, [])\n const updateOpacity = useCallback((v) => { setOpacity(v); if (window.updateSelectedFreehandStyle) window.updateSelectedFreehandStyle({ opacity: v }) }, [])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.FREEHAND || selectedShapeSidebar === 'paintbrush'}>\n <ToolbarButton tooltip={t('sidebar.strokeColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: strokeColor }} />}\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.stroke')}</p>\n <ColorGrid colors={STROKE_COLORS} selected={strokeColor} onSelect={updateStroke} />\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-edit-alt\" tooltip={t('sidebar.strokeWidth')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.width')}</p>\n <div className=\"flex items-center gap-1\">\n {[1, 2, 4, 7].map((w) => (\n <button key={w} onClick={() => updateThickness(w)}\n className={`w-9 h-8 flex items-center justify-center rounded-lg transition-all duration-100 ${thickness === w ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-muted hover:bg-white/[0.06]'}`}\n >\n <div className=\"w-5 rounded-full bg-current\" style={{ height: Math.max(1, w) }} />\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-pen\" tooltip=\"Taper\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.taper')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {[\n { v: 'uniform', i: 'bxs-minus-circle', l: 'Uniform' },\n { v: 'pen', i: 'bxs-pen', l: 'Pen' },\n { v: 'brush', i: 'bxs-brush', l: 'Brush' },\n ].map((t) => (\n <button key={t.v} onClick={() => updateTaper(t.v)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${taper === t.v ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <i className={`bx ${t.i} text-sm`} /> {t.l}\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-shape-polygon\" tooltip=\"Roughness\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.roughness')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {[\n { v: 'smooth', i: 'bxs-droplet', l: 'Smooth' },\n { v: 'medium', i: 'bxs-leaf', l: 'Medium' },\n { v: 'rough', i: 'bxs-bolt', l: 'Rough' },\n ].map((r) => (\n <button key={r.v} onClick={() => updateRoughness(r.v)}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${roughness === r.v ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <i className={`bx ${r.i} text-sm`} /> {r.l}\n </button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-sun\" tooltip={t('sidebar.opacity')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">Opacity {Math.round(opacity * 100)}%</p>\n <input\n type=\"range\" min=\"0\" max=\"1\" step=\"0.05\" value={opacity}\n onChange={(e) => updateOpacity(parseFloat(e.target.value))}\n className=\"w-28 h-1 bg-white/10 rounded-full appearance-none cursor-pointer accent-[#5B57D1]\"\n />\n </ToolbarButton>\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback, useEffect } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nconst TEXT_COLORS = ['#1a1a20', '#ffffff', '#FF8383', '#3A994C', '#56A2E8', '#FFD700', '#FF69B4', '#A855F7']\n\nconst FONTS = [\n { value: 'lixFont', label: 'Lix' },\n { value: 'lixCode', label: 'Code' },\n { value: 'lixDefault', label: 'Default' },\n { value: 'lixFancy', label: 'Fancy' },\n]\n\nconst SIZE_MAP = { S: '20px', M: '30px', L: '48px', XL: '72px' }\n\nconst LANGUAGES = [\n 'javascript', 'typescript', 'python', 'java', 'c', 'cpp', 'csharp',\n 'go', 'rust', 'ruby', 'php', 'swift', 'kotlin', 'html', 'css',\n 'sql', 'bash', 'json', 'yaml', 'markdown',\n]\n\nexport default function TextSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const [textColor, setTextColor] = useState('#fff')\n const [fontSize, setFontSize] = useState('S')\n const [font, setFont] = useState('lixFont')\n const [codeMode, setCodeMode] = useState(false)\n const [language, setLanguage] = useState('javascript')\n\n // Sync code mode state from engine when a shape is selected\n useEffect(() => {\n window.__onCodeModeChanged = (isCode) => {\n setCodeMode(isCode)\n window.isTextInCodeMode = isCode\n }\n return () => { window.__onCodeModeChanged = null }\n }, [])\n\n const updateColor = useCallback((c) => {\n setTextColor(c)\n if (window.updateSelectedTextStyle) window.updateSelectedTextStyle({ color: c })\n }, [])\n\n const updateFont = useCallback((f) => {\n setFont(f)\n if (window.updateSelectedTextStyle) window.updateSelectedTextStyle({ font: f })\n }, [])\n\n const updateSize = useCallback((s) => {\n setFontSize(s)\n if (window.updateSelectedTextStyle) window.updateSelectedTextStyle({ fontSize: SIZE_MAP[s] })\n }, [])\n\n const toggleCodeMode = useCallback(() => {\n const next = !codeMode\n setCodeMode(next)\n window.isTextInCodeMode = next\n if (next) {\n // Convert selected text \u2192 code\n if (window.__convertTextToCode) window.__convertTextToCode()\n } else {\n // Convert selected code \u2192 text\n if (window.__convertCodeToText) window.__convertCodeToText()\n }\n }, [codeMode])\n\n const updateLanguage = useCallback((lang) => {\n setLanguage(lang)\n if (window.__setCodeLanguage) window.__setCodeLanguage(lang)\n }, [])\n\n const visible = activeTool === TOOLS.TEXT || activeTool === TOOLS.CODE || selectedShapeSidebar === 'text'\n\n return (\n <>\n <ShapeSidebar visible={visible}>\n {/* Color */}\n <ToolbarButton tooltip={t('sidebar.textColor')}\n preview={<span className=\"w-4 h-4 rounded-md border border-white/20\" style={{ backgroundColor: textColor }} />}\n >\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.color')}</p>\n <div className=\"grid grid-cols-4 gap-1.5\">\n {TEXT_COLORS.map((c) => (\n <button key={c} onClick={() => updateColor(c)}\n className={`w-7 h-7 rounded-md border-[1.5px] transition-all duration-100 ${textColor === c ? 'border-[#5B57D1] scale-110' : 'border-white/[0.08] hover:border-white/20'}`}\n style={{ backgroundColor: c }}\n />\n ))}\n </div>\n </ToolbarButton>\n\n {!codeMode && (\n <>\n <Divider />\n\n {/* Font */}\n <ToolbarButton icon=\"bxs-font-family\" tooltip={t('sidebar.font')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.font')}</p>\n <div className=\"flex flex-col gap-0.5\">\n {FONTS.map((f) => (\n <button key={f.value} onClick={() => updateFont(f.value)}\n className={`flex items-center px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${font === f.value ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n style={{ fontFamily: f.value }}\n >\n {f.label}\n </button>\n ))}\n </div>\n </ToolbarButton>\n </>\n )}\n\n <Divider />\n\n {/* Size */}\n <ToolbarButton icon=\"bxs-chevrons-up\" tooltip={t('sidebar.size')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.size')}</p>\n <div className=\"flex items-center gap-1\">\n {['S', 'M', 'L', 'XL'].map((s) => (\n <button key={s} onClick={() => updateSize(s)}\n className={`w-8 h-8 flex items-center justify-center rounded-lg text-xs transition-all duration-100 ${fontSize === s ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-muted hover:bg-white/[0.06]'}`}\n >{s}</button>\n ))}\n </div>\n </ToolbarButton>\n\n <Divider />\n\n {/* Code mode */}\n <ToolbarButton icon=\"bxs-terminal\" tooltip={t('sidebar.codeMode')}>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.code')}</p>\n <div className=\"flex flex-col gap-2\">\n <button onClick={toggleCodeMode}\n className={`flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${codeMode ? 'bg-[#5B57D1] text-white' : 'text-text-secondary hover:bg-white/[0.06]'}`}\n >\n <div className={`w-6 h-3 rounded-full transition-all duration-150 relative ${codeMode ? 'bg-white/30' : 'bg-white/10'}`}>\n <div className={`absolute top-0.5 w-2 h-2 rounded-full bg-white transition-all duration-150 ${codeMode ? 'left-3.5' : 'left-0.5'}`} />\n </div>\n {codeMode ? t('sidebar.on') : t('sidebar.off')}\n </button>\n {codeMode && (\n <div className=\"flex flex-wrap gap-1 max-w-[180px]\">\n {LANGUAGES.map((lang) => (\n <button key={lang} onClick={() => updateLanguage(lang)}\n className={`px-1.5 py-0.5 rounded text-[9px] transition-all duration-100 ${language === lang ? 'bg-[#5B57D1]/20 text-[#5B57D1]' : 'text-text-dim hover:bg-white/[0.06] hover:text-text-secondary'}`}\n >{lang}</button>\n ))}\n </div>\n )}\n </div>\n </ToolbarButton>\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n\n {/* Keyboard shortcut hint \u2014 positioned below the property bar */}\n <div\n className={`absolute bottom-7 left-1/2 -translate-x-1/2 z-[998] font-[lixFont] transition-all duration-200 ${\n visible ? 'opacity-100 translate-y-0' : 'opacity-0 pointer-events-none translate-y-2'\n }`}\n >\n <p className=\"text-[10px] text-white/30 leading-relaxed text-center whitespace-nowrap\">\n <span className=\"text-white/50\">Ctrl+Enter</span> / <span className=\"text-white/50\">Enter</span> \u2014 {t('sidebar.renderText')} \n <span className=\"text-white/50\">Shift+Enter</span> \u2014 {t('sidebar.newLine')}\n </p>\n </div>\n </>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport useUIStore from '../../store/useUIStore'\nimport ShapeSidebar, { ToolbarButton, Divider, LayerControls } from './ShapeSidebar'\nimport { useState, useCallback, useEffect } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { compressImage } from '../../../utils/imageCompressor.js'\nimport { IMAGE_ACCEPT_ATTR, isAllowedImage } from '../../../utils/allowedImageTypes.js'\n\nconst FILL_STYLES = [\n { id: 'transparent', label: 'None', icon: 'bx-x' },\n { id: 'solid', label: 'Solid', icon: 'bxs-square' },\n { id: 'grid', label: 'Grid', icon: 'bx-grid-alt' },\n]\n\nconst FILL_COLORS = [\n '#1e1e28',\n '#13171C',\n '#1a1a2e',\n '#0d1117',\n '#2d2d3a',\n '#ffffff',\n]\n\nexport default function FrameSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const toggleAIModal = useUIStore((s) => s.toggleAIModal)\n const [frameName, setFrameName] = useState('Frame 1')\n const [isGraph, setIsGraph] = useState(false)\n const [fillStyle, setFillStyle] = useState('transparent')\n const [fillColor, setFillColor] = useState('#1e1e28')\n\n // Sync state from the actual selected frame when sidebar opens\n useEffect(() => {\n if (selectedShapeSidebar === 'frame' || activeTool === TOOLS.FRAME) {\n const shape = typeof window !== 'undefined' ? window.currentShape : null\n if (shape && shape.shapeName === 'frame') {\n if (shape.frameName) setFrameName(shape.frameName)\n setIsGraph(shape._frameType === 'graph')\n setFillStyle(shape.fillStyle || 'transparent')\n setFillColor(shape.fillColor || '#1e1e28')\n } else {\n setIsGraph(false)\n setFillStyle('transparent')\n setFillColor('#1e1e28')\n }\n }\n }, [selectedShapeSidebar, activeTool])\n\n const updateName = useCallback((e) => {\n const name = e.target.value\n setFrameName(name)\n const shape = window.currentShape\n if (shape && shape.shapeName === 'frame') {\n shape.frameName = name\n shape.draw()\n }\n }, [])\n\n const updateFillStyle = useCallback((style) => {\n setFillStyle(style)\n const shape = window.currentShape\n if (shape && shape.shapeName === 'frame') {\n shape.fillStyle = style\n shape.draw()\n }\n }, [])\n\n const updateFillColor = useCallback((color) => {\n setFillColor(color)\n const shape = window.currentShape\n if (shape && shape.shapeName === 'frame') {\n shape.fillColor = color\n shape.draw()\n }\n }, [])\n\n const resizeToFit = useCallback(() => {\n const shape = window.currentShape\n if (shape && shape.shapeName === 'frame' && typeof shape.resizeToFitContents === 'function') {\n shape.resizeToFitContents()\n }\n }, [])\n\n const handleAIEdit = useCallback(() => {\n const shape = window.currentShape\n if (shape && shape.shapeName === 'frame') {\n window.__aiEditTargetFrame = shape\n toggleAIModal()\n }\n }, [toggleAIModal])\n\n return (\n <ShapeSidebar visible={activeTool === TOOLS.FRAME || selectedShapeSidebar === 'frame'}>\n <ToolbarButton icon=\"bxs-rename\" tooltip=\"Frame name\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.name')}</p>\n <input\n type=\"text\"\n value={frameName}\n onChange={updateName}\n className=\"w-32 px-2.5 py-1.5 bg-white/[0.05] border border-white/[0.1] rounded-lg text-white text-xs outline-none focus:border-[#5B57D1]/50 transition-all duration-150 font-[lixFont]\"\n spellCheck={false}\n />\n </ToolbarButton>\n\n <Divider />\n\n {/* Fill style */}\n <ToolbarButton icon=\"bxs-palette\" tooltip=\"Fill style\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.background')}</p>\n <div className=\"flex gap-1 mb-2.5\">\n {FILL_STYLES.map((s) => (\n <button\n key={s.id}\n onClick={() => updateFillStyle(s.id)}\n title={s.label}\n className={`flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg text-xs transition-all duration-100 ${\n fillStyle === s.id\n ? 'bg-white/[0.12] text-white'\n : 'text-text-muted hover:text-white hover:bg-white/[0.06]'\n }`}\n >\n <i className={`bx ${s.icon} text-sm`} />\n {s.label}\n </button>\n ))}\n </div>\n\n {/* Color picker \u2014 only show for solid/grid */}\n {fillStyle !== 'transparent' && (\n <>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-1.5\">{t('sidebar.sectionHeader.color')}</p>\n <div className=\"flex items-center gap-1.5\">\n {FILL_COLORS.map((c) => (\n <button\n key={c}\n onClick={() => updateFillColor(c)}\n title={c}\n className={`w-6 h-6 rounded-md border-2 transition-all duration-100 ${\n fillColor === c ? 'border-accent-blue scale-110' : 'border-white/10 hover:border-white/30'\n }`}\n style={{ backgroundColor: c }}\n />\n ))}\n <label className=\"w-6 h-6 rounded-md border-2 border-white/10 hover:border-white/30 cursor-pointer overflow-hidden relative transition-all duration-100\" title=\"Custom color\">\n <input\n type=\"color\"\n value={fillColor}\n onChange={(e) => updateFillColor(e.target.value)}\n className=\"absolute inset-0 opacity-0 cursor-pointer\"\n />\n <i className=\"bx bx-palette text-xs text-text-muted absolute inset-0 flex items-center justify-center\" />\n </label>\n </div>\n </>\n )}\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bx-image-alt\" tooltip=\"Background image\">\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-2\">{t('sidebar.sectionHeader.backgroundImage')}</p>\n <div className=\"flex gap-1.5 mb-2\">\n <button\n onClick={() => {\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = IMAGE_ACCEPT_ATTR\n input.onchange = async (e) => {\n const file = e.target.files?.[0]\n if (!file) return\n if (!isAllowedImage(file)) {\n console.warn('[FrameSidebar] Rejected file type:', file.type)\n return\n }\n const reader = new FileReader()\n reader.onload = async (ev) => {\n const shape = window.currentShape\n if (!shape?.shapeName === 'frame' || !shape.setImageFromURL) return\n // Compress heavily before setting\n try {\n const compressed = await compressImage(ev.target.result, { maxWidth: 1280, quality: 0.5 })\n shape.setImageFromURL(compressed.dataUrl, shape._frameImageFit || 'cover')\n } catch {\n shape.setImageFromURL(ev.target.result, shape._frameImageFit || 'cover')\n }\n }\n reader.readAsDataURL(file)\n }\n input.click()\n }}\n className=\"flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg text-text-secondary text-xs hover:bg-white/[0.06] hover:text-white transition-all duration-100\"\n >\n <i className=\"bx bx-upload text-sm\" />\n Set Image\n </button>\n <button\n onClick={() => {\n const shape = window.currentShape\n if (shape?.shapeName === 'frame' && shape.setImageFromURL) {\n shape.setImageFromURL(null)\n shape.draw()\n }\n }}\n className=\"flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg text-text-secondary text-xs hover:bg-white/[0.06] hover:text-red-400 transition-all duration-100\"\n >\n <i className=\"bx bx-x text-sm\" />\n Remove\n </button>\n </div>\n {/* Fit controls \u2014 only show when frame has an image */}\n {(() => {\n const shape = typeof window !== 'undefined' ? window.currentShape : null\n if (!shape?.shapeName === 'frame' || !shape?._frameImageURL) return null\n return (\n <>\n <p className=\"text-xs text-text-muted uppercase tracking-wider mb-1.5\">{t('sidebar.sectionHeader.fit')}</p>\n <div className=\"flex gap-1\">\n {[\n { id: 'cover', label: 'Cover' },\n { id: 'contain', label: 'Contain' },\n { id: 'fill', label: 'Stretch' },\n ].map((f) => (\n <button\n key={f.id}\n onClick={() => {\n const s = window.currentShape\n if (s?.shapeName === 'frame' && s.setImageFromURL && s._frameImageURL) {\n s.setImageFromURL(s._frameImageURL, f.id)\n }\n }}\n className={`px-2 py-1 rounded-md text-[10px] transition-all ${\n shape._frameImageFit === f.id\n ? 'bg-white/[0.12] text-white'\n : 'text-text-muted hover:text-white hover:bg-white/[0.06]'\n }`}\n >{f.label}</button>\n ))}\n </div>\n </>\n )\n })()}\n </ToolbarButton>\n\n <Divider />\n\n <ToolbarButton icon=\"bxs-expand\" tooltip=\"Actions\">\n <button onClick={resizeToFit} className=\"flex items-center gap-2 px-2.5 py-1.5 rounded-lg text-text-secondary text-xs hover:bg-white/[0.06] hover:text-white transition-all duration-100\">\n <i className=\"bx bxs-expand text-sm\" />\n Resize to Fit\n </button>\n </ToolbarButton>\n\n {/* AI Edit / Graph Edit removed while AI is coming-soon. Restore the\n button + handleAIEdit wiring when the assistant ships. */}\n <Divider />\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\nimport { useState, useEffect, useCallback, useRef } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\n// Origin of the icons API. When the package runs same-origin with\n// sketch.elixpo this stays empty (relative path). External hosts (e.g.\n// blogs.elixpo) point at the public sketch.elixpo deploy via\n// window.__lixsketchIconsOrigin = 'https://sketch.elixpo.com'\n// The endpoints are CORS-enabled so any origin can fetch.\nconst DEFAULT_ICONS_ORIGIN = 'https://sketch.elixpo.com';\nfunction getIconsBaseUrl() {\n if (typeof window === 'undefined') return '';\n if (window.__lixsketchIconsOrigin) return window.__lixsketchIconsOrigin;\n // Same-origin if the host is sketch.elixpo itself; otherwise default to prod.\n if (typeof location !== 'undefined' && /sketch\\.elixpo/.test(location.host)) return '';\n return DEFAULT_ICONS_ORIGIN;\n}\n\nconst iconResultCache = new Map()\n\nconst CATEGORIES = [\n { value: null, label: 'All', icon: 'bxs-grid-alt' },\n { value: 'tech', label: 'Tech', icon: 'bxs-chip' },\n { value: 'devops', label: 'DevOps', icon: 'bxs-server' },\n { value: 'design', label: 'Design', icon: 'bxs-palette' },\n { value: 'social media', label: 'Social', icon: 'bxs-share-alt' },\n { value: 'navigation', label: 'Nav', icon: 'bxs-navigation' },\n { value: 'business', label: 'Business', icon: 'bxs-briefcase' },\n { value: 'media', label: 'Media', icon: 'bxs-videos' },\n]\n\n// Normalize an SVG string so it renders fully within a fixed box.\n// Ensures the inner <svg> has width/height=\"100%\" and a viewBox.\nfunction normalizeSvg(raw) {\n if (!raw) return raw\n // Parse to a temp element so we can inspect attributes\n const tmp = document.createElement('div')\n tmp.innerHTML = raw\n const svgEl = tmp.querySelector('svg')\n if (!svgEl) return raw\n\n // Ensure viewBox exists \u2014 derive from width/height if missing\n if (!svgEl.getAttribute('viewBox')) {\n const w = parseFloat(svgEl.getAttribute('width')) || 24\n const h = parseFloat(svgEl.getAttribute('height')) || 24\n svgEl.setAttribute('viewBox', `0 0 ${w} ${h}`)\n }\n // Force the SVG to fill its container\n svgEl.setAttribute('width', '100%')\n svgEl.setAttribute('height', '100%')\n return tmp.innerHTML\n}\n\nfunction IconCell({ icon, onClick }) {\n const name = icon.filename?.replace('.svg', '').replace(/_/g, ' ') || ''\n const normalizedSvg = typeof document !== 'undefined' && icon.svg ? normalizeSvg(icon.svg) : icon.svg\n return (\n <button\n onClick={onClick}\n title={name}\n style={{ width: '44px', height: '44px', overflow: 'hidden', flexShrink: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', borderRadius: '8px', cursor: 'pointer', background: 'transparent', border: 'none', padding: 0 }}\n className=\"hover:bg-surface-hover transition-colors duration-100\"\n >\n {normalizedSvg ? (\n <div\n style={{ width: '24px', height: '24px', overflow: 'visible', flexShrink: 0, pointerEvents: 'none', filter: 'brightness(0) invert(1)' }}\n dangerouslySetInnerHTML={{ __html: normalizedSvg }}\n />\n ) : (\n <img\n src={`/icons/${encodeURIComponent(icon.filename)}`}\n alt=\"\"\n style={{ width: '24px', height: '24px', pointerEvents: 'none', filter: 'invert(1)' }}\n loading=\"lazy\"\n />\n )}\n </button>\n )\n}\n\nexport default function IconSidebar() {\n const { t } = useTranslation()\n const activeTool = useSketchStore((s) => s.activeTool)\n const setActiveTool = useSketchStore((s) => s.setActiveTool)\n const visible = activeTool === TOOLS.ICON\n const [query, setQuery] = useState('')\n const [category, setCategory] = useState(null)\n const [icons, setIcons] = useState([])\n const [loading, setLoading] = useState(false)\n const debounceRef = useRef(null)\n\n // Close on Escape\n useEffect(() => {\n if (!visible) return\n const handler = (e) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n setActiveTool(TOOLS.SELECT)\n }\n }\n document.addEventListener('keydown', handler, true)\n return () => document.removeEventListener('keydown', handler, true)\n }, [visible, setActiveTool])\n\n // Close when clicking on the canvas (outside the sidebar)\n useEffect(() => {\n if (!visible) return\n const svgEl = document.getElementById('freehand-canvas')\n if (!svgEl) return\n const handleCanvasClick = () => setActiveTool(TOOLS.SELECT)\n svgEl.addEventListener('mousedown', handleCanvasClick)\n return () => svgEl.removeEventListener('mousedown', handleCanvasClick)\n }, [visible, setActiveTool])\n\n const fetchIcons = useCallback(async (searchQuery, cat) => {\n const params = new URLSearchParams()\n if (searchQuery) params.set('q', searchQuery)\n if (cat) params.set('category', cat)\n params.set('inline', '1')\n const cacheKey = params.toString()\n\n // Return cached results instantly if available\n if (iconResultCache.has(cacheKey)) {\n setIcons(iconResultCache.get(cacheKey))\n return\n }\n\n setLoading(true)\n try {\n const res = await fetch(`${getIconsBaseUrl()}/api/icons/search?${cacheKey}`)\n if (res.ok) {\n const data = await res.json()\n const results = data.results || []\n iconResultCache.set(cacheKey, results)\n setIcons(results)\n }\n } catch (err) {\n console.error('Icon fetch failed:', err)\n }\n setLoading(false)\n }, [])\n\n // Fetch icons when visibility, query, or category changes (debounced for query typing)\n useEffect(() => {\n if (!visible) return\n if (debounceRef.current) clearTimeout(debounceRef.current)\n debounceRef.current = setTimeout(() => {\n fetchIcons(query, category)\n }, query ? 300 : 0)\n return () => clearTimeout(debounceRef.current)\n }, [query, visible, category, fetchIcons])\n\n // Preload all categories in background on first sidebar open\n const hasPreloaded = useRef(false)\n useEffect(() => {\n if (!visible || hasPreloaded.current) return\n hasPreloaded.current = true\n // Fire-and-forget: preload each category so switching is instant\n CATEGORIES.forEach((cat) => {\n const params = new URLSearchParams()\n if (cat.value) params.set('category', cat.value)\n params.set('inline', '1')\n const key = params.toString()\n if (!iconResultCache.has(key)) {\n fetch(`${getIconsBaseUrl()}/api/icons/search?${key}`)\n .then((r) => r.ok ? r.json() : null)\n .then((data) => { if (data?.results) iconResultCache.set(key, data.results) })\n .catch(() => {})\n }\n })\n }, [visible])\n\n const handleIconClick = useCallback((icon) => {\n if (typeof window === 'undefined') return\n const place = (svgContent) => {\n if (window.prepareIconPlacement) {\n window.prepareIconPlacement(svgContent)\n } else {\n window.iconToPlace = svgContent\n }\n }\n if (icon.svg) {\n place(icon.svg)\n } else {\n fetch(`${getIconsBaseUrl()}/api/icons/serve?name=${encodeURIComponent(icon.filename)}`)\n .then((r) => r.text())\n .then(place)\n .catch(() => {})\n }\n }, [])\n\n return (\n <div\n className={`absolute top-[60px] right-2 bottom-[56px] w-[300px] bg-surface border border-border-light rounded-2xl z-[999] font-[lixFont] flex flex-col transition-transform duration-200 ${\n visible ? 'translate-x-0' : 'translate-x-full'\n }`}\n >\n {/* Header */}\n <div className=\"px-3.5 pt-3.5 pb-2 shrink-0\">\n <div className=\"flex items-center justify-between mb-2.5\">\n <h3 className=\"text-text-primary text-sm font-medium\">Icons</h3>\n <button\n onClick={() => setActiveTool(TOOLS.SELECT)}\n className=\"w-6 h-6 flex items-center justify-center rounded-md text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors duration-100\"\n title=\"Close (Esc)\"\n >\n <i className=\"bx bx-x text-lg\" />\n </button>\n </div>\n\n {/* Search */}\n <div className=\"flex items-center gap-2 bg-surface-hover border border-border-light rounded-lg px-2.5 py-2\">\n <i className=\"bx bxs-search text-text-muted text-sm\" />\n <input\n id=\"iconSearchInput\"\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search icons...\"\n className=\"flex-1 bg-transparent text-text-primary text-sm outline-none placeholder:text-text-dim\"\n spellCheck={false}\n />\n {query && (\n <button onClick={() => setQuery('')} className=\"text-text-dim hover:text-text-secondary\">\n <i className=\"bx bxs-x-circle text-sm\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Categories */}\n <div className=\"flex flex-wrap gap-1 px-3.5 pb-2.5 shrink-0\">\n {CATEGORIES.map((cat) => (\n <button\n key={cat.value || 'all'}\n onClick={() => setCategory(cat.value)}\n className={`flex items-center gap-1 px-2 py-1 rounded-md text-xs whitespace-nowrap transition-colors duration-100 ${\n category === cat.value\n ? 'bg-accent-blue/20 text-accent-blue-hover'\n : 'text-text-muted hover:bg-surface-hover hover:text-text-primary'\n }`}\n >\n <i className={`bx ${cat.icon} text-xs`} />\n {cat.label}\n </button>\n ))}\n </div>\n\n {/* Divider */}\n <div className=\"h-px bg-surface-hover mx-3.5 shrink-0\" />\n\n {/* Icon grid \u2014 scrollable */}\n <div className=\"flex-1 overflow-y-auto no-scrollbar px-3 py-2.5\" id=\"iconsContainer\">\n {loading ? (\n <div className=\"flex items-center justify-center py-12 text-text-muted text-sm\">\n <i className=\"bx bxs-hourglass bx-spin text-lg mr-2\" />\n Loading...\n </div>\n ) : icons.length === 0 ? (\n <div className=\"flex items-center justify-center py-12 text-text-muted text-sm\">\n No icons found\n </div>\n ) : (\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(6, minmax(0, 1fr))', gap: '2px' }}>\n {icons.map((icon, i) => (\n <IconCell\n key={icon.filename || i}\n icon={icon}\n onClick={() => handleIconClick(icon)}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport useSketchStore from '../../store/useSketchStore'\nimport useUIStore from '../../store/useUIStore'\nimport ShapeSidebar, { Divider, LayerControls } from './ShapeSidebar'\nimport { useCallback } from 'react'\nimport { useTranslation } from '../../hooks/useTranslation'\n\nexport default function ImageSidebar() {\n const { t } = useTranslation()\n const selectedShapeSidebar = useSketchStore((s) => s.selectedShapeSidebar)\n const toggleImageGenerateModal = useUIStore((s) => s.toggleImageGenerateModal)\n\n const handleEditWithAI = useCallback(() => {\n const shape = window.currentShape\n if (!shape || shape.shapeName !== 'image') return\n\n // Get the image URL from the element\n const el = shape.element\n const href = el?.getAttribute('href') || el?.getAttributeNS('http://www.w3.org/1999/xlink', 'href') || ''\n const w = parseFloat(el?.getAttribute('width')) || 512\n const h = parseFloat(el?.getAttribute('height')) || 512\n\n // Store reference for the modal to pick up\n window.__editImageRef = { imageUrl: href, width: w, height: h, shape }\n toggleImageGenerateModal()\n }, [toggleImageGenerateModal])\n\n const handleReplace = useCallback(() => {\n if (window.openImageFilePicker) {\n // Store current shape so the new image replaces it\n window.__replaceImageShape = window.currentShape\n window.openImageFilePicker()\n }\n }, [])\n\n return (\n <ShapeSidebar visible={selectedShapeSidebar === 'image'}>\n {/* Edit with AI */}\n <button\n onClick={handleEditWithAI}\n title=\"Edit with AI\"\n className=\"h-9 flex items-center gap-1.5 px-3 rounded-lg text-text-muted hover:text-purple-400 hover:bg-purple-500/10 transition-all duration-100\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\">\n <path d=\"M12 2l2.4 7.2L22 12l-7.6 2.8L12 22l-2.4-7.2L2 12l7.6-2.8L12 2z\" />\n </svg>\n <span className=\"text-xs\">AI Edit</span>\n </button>\n\n <Divider />\n\n {/* Replace image */}\n <button\n onClick={handleReplace}\n title=\"Replace image\"\n className=\"h-9 flex items-center gap-1.5 px-3 rounded-lg text-text-muted hover:text-white hover:bg-white/[0.06] transition-all duration-100\"\n >\n <i className=\"bx bx-upload text-base\" />\n <span className=\"text-xs\">Replace</span>\n </button>\n\n <Divider />\n\n {/* Layer controls */}\n <LayerControls />\n </ShapeSidebar>\n )\n}\n", "\"use client\"\n\nimport { useState, useEffect } from 'react'\nimport { showToast } from '../../utils/toast'\n\nexport default function MultiSelectActions() {\n const [count, setCount] = useState(0)\n const [groupState, setGroupState] = useState('none') // 'none' | 'partial' | 'all'\n\n useEffect(() => {\n // Poll multi-selection state. Cheap \u2014 Set size + a single\n // groupId pass over selectedShapes.\n const interval = setInterval(() => {\n const ms = window.multiSelection\n const sel = ms?.selectedShapes\n const n = sel ? sel.size : 0\n setCount((prev) => (prev !== n ? n : prev))\n\n if (n < 2) {\n setGroupState('none')\n return\n }\n let withId = 0\n let groupIds = new Set()\n sel.forEach((s) => {\n if (s.groupId) {\n withId++\n groupIds.add(s.groupId)\n }\n })\n // \"all\" = every shape has a groupId AND they all share the same one\n if (withId === n && groupIds.size === 1) setGroupState('all')\n else if (withId > 0) setGroupState('partial')\n else setGroupState('none')\n }, 200)\n return () => clearInterval(interval)\n }, [])\n\n if (count < 2) return null\n\n const handleFrame = () => {\n if (window.frameSelectedShapes) {\n window.frameSelectedShapes()\n setCount(0)\n }\n }\n\n const handleGroup = () => {\n const ms = window.multiSelection\n const sel = ms?.selectedShapes\n if (!sel || sel.size < 2) return\n const newId = `g-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\n sel.forEach((s) => { s.groupId = newId })\n if (typeof ms.updateControls === 'function') ms.updateControls()\n showToast(`Grouped ${sel.size} shapes`, { tone: 'success' })\n }\n\n const handleUngroup = () => {\n const ms = window.multiSelection\n const sel = ms?.selectedShapes\n if (!sel || sel.size === 0) return\n const groupIds = new Set()\n sel.forEach((s) => { if (s.groupId) groupIds.add(s.groupId) })\n if (groupIds.size === 0 || !Array.isArray(window.shapes)) return\n let cleared = 0\n for (const s of window.shapes) {\n if (s.groupId && groupIds.has(s.groupId)) { s.groupId = null; cleared++ }\n }\n if (typeof ms.updateControls === 'function') ms.updateControls()\n showToast(`Ungrouped ${cleared} shapes`, { tone: 'success' })\n }\n\n const grouped = groupState === 'all'\n\n return (\n <div className=\"absolute top-14 left-1/2 -translate-x-1/2 z-[1000] font-[lixFont]\">\n <div className=\"flex items-center gap-2 bg-surface/90 backdrop-blur-lg border border-border-light rounded-xl px-3 py-1.5 shadow-lg\">\n <span className=\"text-text-muted text-xs\">\n {count} selected{grouped && <span className=\"ml-1 text-accent-blue\">\u00B7 grouped</span>}\n </span>\n <div className=\"w-px h-4 bg-border-light\" />\n\n {/* Frame is only useful when shapes aren't already grouped \u2014 a\n grouped set is conceptually a \"frameless frame\" already. */}\n {!grouped && (\n <button\n onClick={handleFrame}\n className=\"flex items-center gap-1.5 px-2.5 py-1 rounded-lg text-xs text-accent-blue hover:bg-accent-blue/10 transition-all duration-150\"\n title=\"Wrap selection in a frame\"\n >\n <i className=\"bx bx-crop text-sm\" />\n Frame it\n </button>\n )}\n\n {/* Group / Ungroup toggle. Group is shown when nothing in the\n selection is grouped yet; Ungroup once they're a single group. */}\n {grouped ? (\n <button\n onClick={handleUngroup}\n className=\"flex items-center gap-1.5 px-2.5 py-1 rounded-lg text-xs text-yellow-400 hover:bg-yellow-500/10 transition-all duration-150\"\n title=\"Ungroup (Ctrl+Shift+G)\"\n >\n <i className=\"bx bx-unlink text-sm\" />\n Ungroup\n </button>\n ) : (\n <button\n onClick={handleGroup}\n className=\"flex items-center gap-1.5 px-2.5 py-1 rounded-lg text-xs text-text-secondary hover:bg-surface-hover transition-all duration-150\"\n title=\"Group (Ctrl+G)\"\n >\n <i className=\"bx bx-link text-sm\" />\n Group\n </button>\n )}\n </div>\n </div>\n )\n}\n", "// Lightweight toast stub for offline mode. Hosts can override by mounting\n// a #lixsketch-toast container; otherwise we fall back to a console log.\nexport function showToast(message, options = {}) {\n const tone = options.tone || 'info';\n const root = typeof document !== 'undefined' ? document.getElementById('lixsketch-toast') : null;\n if (!root) {\n console.log(`[lixsketch:${tone}]`, message);\n return;\n }\n const el = document.createElement('div');\n el.className = `lixsketch-toast-item is-${tone}`;\n el.textContent = message;\n root.appendChild(el);\n setTimeout(() => { el.classList.add('is-leaving'); }, 1800);\n setTimeout(() => { try { root.removeChild(el); } catch {} }, 2200);\n}\n\nexport default { showToast };\n", "\"use client\"\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\nimport useSketchStore from '../../store/useSketchStore'\nimport useUIStore from '../../store/useUIStore'\nimport { showToast } from '../../utils/toast'\n\n// \u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction getCleanSVG() {\n const svgEl = window.svg\n if (!svgEl) return null\n const clone = svgEl.cloneNode(true)\n clone.querySelectorAll(\n '[data-selection], .selection-handle, .resize-handle, .rotation-handle, .anchor, .rotate-anchor, .resize-anchor, .rotation-anchor, .selection-outline'\n ).forEach((el) => el.remove())\n return clone\n}\n\nfunction renderToCanvas(clone, scale, bgColor) {\n return new Promise((resolve) => {\n const svgData = new XMLSerializer().serializeToString(clone)\n const vb = window.svg.viewBox.baseVal\n const canvas = document.createElement('canvas')\n canvas.width = vb.width * scale\n canvas.height = vb.height * scale\n const ctx = canvas.getContext('2d')\n ctx.scale(scale, scale)\n const img = new Image()\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n img.onload = () => {\n if (bgColor) {\n ctx.fillStyle = bgColor\n ctx.fillRect(0, 0, vb.width, vb.height)\n }\n ctx.drawImage(img, 0, 0, vb.width, vb.height)\n URL.revokeObjectURL(url)\n resolve(canvas)\n }\n img.onerror = () => { URL.revokeObjectURL(url); resolve(null) }\n img.src = url\n })\n}\n\nfunction getShapeAtPoint(x, y) {\n const shapes = window.shapes\n if (!shapes) return null\n // Walk backwards (topmost first)\n for (let i = shapes.length - 1; i >= 0; i--) {\n const shape = shapes[i]\n const el = shape.group || shape.element\n if (!el) continue\n const rect = el.getBoundingClientRect()\n if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) {\n return shape\n }\n }\n return null\n}\n\n// \u2500\u2500 Menu item components \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction MenuItem({ label, shortcut, onClick, disabled, danger }) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`w-full flex items-center justify-between px-3 py-1.5 text-xs transition-colors duration-100 ${\n disabled\n ? 'text-text-dim cursor-default'\n : danger\n ? 'text-red-400 hover:bg-red-500/15 cursor-pointer'\n : 'text-text-secondary hover:bg-surface-hover cursor-pointer'\n }`}\n >\n <span>{label}</span>\n {shortcut && <span className=\"text-text-dim text-[10px] ml-6\">{shortcut}</span>}\n </button>\n )\n}\n\nfunction CheckMenuItem({ label, shortcut, checked, onClick }) {\n return (\n <button\n onClick={onClick}\n className=\"w-full flex items-center justify-between px-3 py-1.5 text-xs text-text-secondary hover:bg-surface-hover cursor-pointer transition-colors duration-100\"\n >\n <span className=\"flex items-center gap-2\">\n {checked && <i className=\"bx bx-check text-sm text-accent-blue -ml-0.5\" />}\n {!checked && <span className=\"w-[14px]\" />}\n {label}\n </span>\n {shortcut && <span className=\"text-text-dim text-[10px] ml-6\">{shortcut}</span>}\n </button>\n )\n}\n\nfunction Separator() {\n return <hr className=\"border-border-light my-1\" />\n}\n\n// \u2500\u2500 Main component \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport default function ContextMenu() {\n const [visible, setVisible] = useState(false)\n const [position, setPosition] = useState({ x: 0, y: 0 })\n const [targetShape, setTargetShape] = useState(null)\n const menuRef = useRef(null)\n\n const gridEnabled = useSketchStore((s) => s.gridEnabled)\n const snapToObjects = useSketchStore((s) => s.snapToObjects)\n const zenMode = useSketchStore((s) => s.zenMode)\n const viewMode = useSketchStore((s) => s.viewMode)\n\n const close = useCallback(() => {\n setVisible(false)\n setTargetShape(null)\n }, [])\n\n // Context menu handler\n useEffect(() => {\n const handleContextMenu = (e) => {\n const svg = document.getElementById('freehand-canvas')\n if (!svg) return\n\n // Only handle right-clicks on or within the SVG canvas\n if (!svg.contains(e.target) && e.target !== svg) return\n\n e.preventDefault()\n const shape = getShapeAtPoint(e.clientX, e.clientY)\n\n // Also check if there's a currentShape selected\n const current = window.currentShape || null\n\n setTargetShape(shape || current)\n setPosition({ x: e.clientX, y: e.clientY })\n setVisible(true)\n }\n\n const handleClick = () => close()\n const handleKeyDown = (e) => { if (e.key === 'Escape') close() }\n\n document.addEventListener('contextmenu', handleContextMenu)\n document.addEventListener('click', handleClick)\n document.addEventListener('keydown', handleKeyDown)\n return () => {\n document.removeEventListener('contextmenu', handleContextMenu)\n document.removeEventListener('click', handleClick)\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [close])\n\n // Adjust position so menu doesn't overflow viewport\n useEffect(() => {\n if (!visible || !menuRef.current) return\n const rect = menuRef.current.getBoundingClientRect()\n const vw = window.innerWidth\n const vh = window.innerHeight\n let { x, y } = position\n if (x + rect.width > vw - 8) x = vw - rect.width - 8\n if (y + rect.height > vh - 8) y = vh - rect.height - 8\n if (x !== position.x || y !== position.y) setPosition({ x, y })\n }, [visible, position])\n\n if (!visible) return null\n\n // \u2500\u2500 Action handlers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const handlePaste = () => {\n if (typeof window.pasteClipboard === 'function') window.pasteClipboard()\n else document.dispatchEvent(new KeyboardEvent('keydown', { key: 'v', ctrlKey: true }))\n close()\n }\n\n const handleCopy = () => {\n if (typeof window.copySelected === 'function') window.copySelected()\n else document.dispatchEvent(new KeyboardEvent('keydown', { key: 'c', ctrlKey: true }))\n close()\n }\n\n const handleCut = () => {\n handleCopy()\n handleDeleteShape()\n }\n\n const handleSelectAll = () => {\n useSketchStore.getState().setActiveTool('select')\n if (window.multiSelection && window.shapes) {\n window.multiSelection.clearSelection()\n window.shapes.forEach((s) => window.multiSelection.addShape(s))\n }\n close()\n }\n\n const handleCopyPNG = async () => {\n const clone = getCleanSVG()\n if (!clone) { close(); return }\n const canvas = await renderToCanvas(clone, 2, '#121212')\n if (!canvas) { close(); return }\n canvas.toBlob((blob) => {\n if (blob) navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]).catch(() => {})\n }, 'image/png')\n close()\n }\n\n const handleCopySVG = () => {\n const clone = getCleanSVG()\n if (!clone) { close(); return }\n const svgData = new XMLSerializer().serializeToString(clone)\n navigator.clipboard.writeText(svgData).catch(() => {})\n close()\n }\n\n const handleToggleGrid = () => {\n useSketchStore.getState().toggleGrid()\n close()\n }\n\n const handleToggleSnap = () => {\n useSketchStore.getState().toggleSnapToObjects()\n close()\n }\n\n const handleZenMode = () => {\n useSketchStore.getState().toggleZenMode()\n close()\n }\n\n const handleViewMode = () => {\n useSketchStore.getState().toggleViewMode()\n close()\n }\n\n const handleDeleteShape = () => {\n // Multi-selection delete\n if (window.multiSelection?.selectedShapes?.size > 0) {\n if (typeof window.deleteSelectedShapes === 'function') window.deleteSelectedShapes()\n close()\n return\n }\n const shape = targetShape || window.currentShape\n if (!shape) { close(); return }\n const shapes = window.shapes\n\n // Issue #24 bug #7: frame \u2192 orphan children + snapshot for undo\n // (mirrors deleteSelectedShapes / EngineShortcuts).\n const isFrame = shape.shapeName === 'frame'\n const isDiagramFrame = isFrame && !!shape._diagramType\n let childSnapshot = null\n if (isFrame && !isDiagramFrame) {\n childSnapshot = [...(shape.containedShapes || [])]\n for (const child of childSnapshot) {\n if (!child || child === shape) continue\n const el = child.group || child.element\n if (el) {\n if (shape.clipGroup && el.parentNode === shape.clipGroup) shape.clipGroup.removeChild(el)\n if (window.svg && el.parentNode !== window.svg) window.svg.appendChild(el)\n }\n child.parentFrame = null\n delete child.isBeingMovedByFrame\n }\n shape.containedShapes = []\n }\n\n if (shapes) {\n const idx = shapes.indexOf(shape)\n if (idx !== -1) shapes.splice(idx, 1)\n }\n if (typeof window.cleanupAttachments === 'function') window.cleanupAttachments(shape)\n if (shape.parentFrame && typeof shape.parentFrame.removeShapeFromFrame === 'function') {\n shape.parentFrame.removeShapeFromFrame(shape)\n }\n\n if (isFrame && !isDiagramFrame) {\n if (shape.group && shape.group.parentNode) shape.group.parentNode.removeChild(shape.group)\n if (shape.clipGroup && shape.clipGroup.parentNode) shape.clipGroup.parentNode.removeChild(shape.clipGroup)\n if (shape.clipPath && shape.clipPath.parentNode) shape.clipPath.parentNode.removeChild(shape.clipPath)\n } else {\n const el = shape.group || shape.element\n if (el && el.parentNode) el.parentNode.removeChild(el)\n }\n\n if (typeof window.pushDeleteAction === 'function') {\n if (childSnapshot) window.pushDeleteAction(shape, { childSnapshot })\n else window.pushDeleteAction(shape)\n }\n window.currentShape = null\n if (typeof window.disableAllSideBars === 'function') window.disableAllSideBars()\n close()\n }\n\n const handleDuplicate = () => {\n // Copy then paste\n if (typeof window.copySelected === 'function') window.copySelected()\n setTimeout(() => {\n if (typeof window.pasteClipboard === 'function') window.pasteClipboard()\n }, 50)\n close()\n }\n\n // Layer order\n const handleLayerAction = (action) => {\n const shape = targetShape || window.currentShape\n if (!shape || !window.__layerOrder) { close(); return }\n window.__layerOrder[action](shape)\n close()\n }\n\n // Flip (transform via scale)\n const handleFlip = (axis) => {\n const shape = targetShape || window.currentShape\n if (!shape) { close(); return }\n const el = shape.group || shape.element\n if (!el) { close(); return }\n const current = el.getAttribute('transform') || ''\n const bbox = el.getBBox()\n const cx = bbox.x + bbox.width / 2\n const cy = bbox.y + bbox.height / 2\n const scaleStr = axis === 'h'\n ? `translate(${cx * 2}, 0) scale(-1, 1)`\n : `translate(0, ${cy * 2}) scale(1, -1)`\n el.setAttribute('transform', current + ' ' + scaleStr)\n close()\n }\n\n // Wrap selection in frame\n const handleWrapInFrame = () => {\n // Simulate the frame wrap if engine supports it\n close()\n }\n\n // \u2500\u2500 Group / ungroup helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Mirror the Ctrl+G / Ctrl+Shift+G behavior so the right-click menu\n // is a discoverable alternative.\n const handleGroup = () => {\n const ms = window.multiSelection\n const sel = ms?.selectedShapes\n const targets = sel && sel.size > 1\n ? Array.from(sel)\n : (window.currentShape ? [window.currentShape] : [])\n if (targets.length > 1) {\n const newId = `g-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\n for (const s of targets) s.groupId = newId\n if (typeof ms?.updateControls === 'function') ms.updateControls()\n showToast(`Grouped ${targets.length} shapes`, { tone: 'success' })\n }\n close()\n }\n\n const handleUngroup = () => {\n const ms = window.multiSelection\n const sel = ms?.selectedShapes\n const targets = sel && sel.size > 0\n ? Array.from(sel)\n : (window.currentShape ? [window.currentShape] : [])\n const groupIds = new Set(targets.map(s => s.groupId).filter(Boolean))\n if (groupIds.size > 0 && Array.isArray(window.shapes)) {\n let cleared = 0\n for (const s of window.shapes) {\n if (s.groupId && groupIds.has(s.groupId)) { s.groupId = null; cleared++ }\n }\n if (typeof ms?.updateControls === 'function') ms.updateControls()\n showToast(`Ungrouped ${cleared} shapes`, { tone: 'success' })\n }\n close()\n }\n\n // Compute selection state for the menu rendering below.\n const selectionShapes = (() => {\n const sel = window.multiSelection?.selectedShapes\n if (sel && sel.size > 0) return Array.from(sel)\n if (targetShape) return [targetShape]\n return []\n })()\n const canGroup = selectionShapes.length > 1\n const groupIdsInSelection = new Set(selectionShapes.map(s => s.groupId).filter(Boolean))\n const canUngroup = groupIdsInSelection.size > 0\n const fullyGrouped = selectionShapes.length > 1 &&\n selectionShapes.every(s => s.groupId) &&\n groupIdsInSelection.size === 1\n\n const handleCanvasProperties = () => {\n // Toggle shape sidebar / properties via Alt+/\n close()\n }\n\n // \u2500\u2500 Render \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n const isShape = !!targetShape\n\n return (\n <div\n ref={menuRef}\n className=\"fixed z-9999 min-w-[220px] py-1.5 bg-surface/90 backdrop-blur-xl rounded-xl border border-border-light shadow-2xl font-[lixFont] select-none\"\n style={{ left: position.x, top: position.y }}\n onClick={(e) => e.stopPropagation()}\n >\n {isShape ? (\n /* \u2500\u2500 Shape context menu \u2500\u2500 */\n <>\n <MenuItem label=\"Cut\" shortcut=\"Ctrl+X\" onClick={handleCut} />\n <MenuItem label=\"Copy\" shortcut=\"Ctrl+C\" onClick={handleCopy} />\n <MenuItem label=\"Paste\" shortcut=\"Ctrl+V\" onClick={handlePaste} />\n\n <Separator />\n {/* Frame wrap doesn't make sense when the selection is already\n grouped \u2014 the group itself is the implicit container. */}\n {!fullyGrouped && (\n <MenuItem label=\"Wrap selection in frame\" onClick={handleWrapInFrame} />\n )}\n {canGroup && !fullyGrouped && (\n <MenuItem label=\"Group\" shortcut=\"Ctrl+G\" onClick={handleGroup} />\n )}\n {canUngroup && (\n <MenuItem label=\"Ungroup\" shortcut=\"Ctrl+Shift+G\" onClick={handleUngroup} />\n )}\n\n <Separator />\n <MenuItem label=\"Copy to clipboard as PNG\" shortcut=\"Shift+Alt+C\" onClick={handleCopyPNG} />\n <MenuItem label=\"Copy to clipboard as SVG\" onClick={handleCopySVG} />\n\n <Separator />\n <MenuItem label=\"Send backward\" shortcut=\"Ctrl+[\" onClick={() => handleLayerAction('sendBackward')} />\n <MenuItem label=\"Bring forward\" shortcut=\"Ctrl+]\" onClick={() => handleLayerAction('bringForward')} />\n <MenuItem label=\"Send to back\" shortcut=\"Ctrl+Shift+[\" onClick={() => handleLayerAction('sendToBack')} />\n <MenuItem label=\"Bring to front\" shortcut=\"Ctrl+Shift+]\" onClick={() => handleLayerAction('bringToFront')} />\n\n <Separator />\n <MenuItem label=\"Flip horizontal\" shortcut=\"Shift+H\" onClick={() => handleFlip('h')} />\n <MenuItem label=\"Flip vertical\" shortcut=\"Shift+V\" onClick={() => handleFlip('v')} />\n\n <Separator />\n <MenuItem label=\"Duplicate\" shortcut=\"Ctrl+D\" onClick={handleDuplicate} />\n <MenuItem label=\"Delete\" danger onClick={handleDeleteShape} />\n </>\n ) : (\n /* \u2500\u2500 Canvas context menu \u2500\u2500 */\n <>\n <MenuItem label=\"Paste\" shortcut=\"Ctrl+V\" onClick={handlePaste} />\n <MenuItem label=\"Copy to clipboard as PNG\" shortcut=\"Shift+Alt+C\" onClick={handleCopyPNG} />\n <MenuItem label=\"Copy to clipboard as SVG\" onClick={handleCopySVG} />\n\n <Separator />\n <MenuItem label=\"Select all\" shortcut=\"Ctrl+A\" onClick={handleSelectAll} />\n\n <Separator />\n <CheckMenuItem label=\"Toggle grid\" shortcut=\"Ctrl+'\" checked={gridEnabled} onClick={handleToggleGrid} />\n <CheckMenuItem label=\"Snap to objects\" shortcut=\"Alt+S\" checked={snapToObjects} onClick={handleToggleSnap} />\n\n <Separator />\n <MenuItem label=\"Find on canvas\" shortcut=\"Ctrl+F\" onClick={() => { useUIStore.getState().toggleFindBar(); close() }} />\n <MenuItem label=\"Zen mode\" shortcut=\"Alt+Z\" onClick={handleZenMode} />\n <MenuItem label=\"View mode\" shortcut=\"Alt+R\" onClick={handleViewMode} />\n\n <Separator />\n <MenuItem label=\"Reset canvas\" danger onClick={() => {\n const serializer = window.__sceneSerializer\n if (serializer?.resetCanvas) serializer.resetCanvas()\n close()\n }} />\n </>\n )}\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState, useEffect, useRef, useCallback } from 'react'\nimport useUIStore from '../../store/useUIStore'\n\nexport default function FindBar() {\n const open = useUIStore((s) => s.findBarOpen)\n const closeFindBar = useUIStore((s) => s.closeFindBar)\n const [query, setQuery] = useState('')\n const [results, setResults] = useState([])\n const [activeIndex, setActiveIndex] = useState(-1)\n const inputRef = useRef(null)\n const highlightRef = useRef(null)\n\n useEffect(() => {\n if (open) {\n setQuery('')\n setResults([])\n setActiveIndex(-1)\n setTimeout(() => inputRef.current?.focus(), 50)\n } else {\n // Clean up highlight when closing\n removeHighlight()\n }\n }, [open])\n\n const removeHighlight = useCallback(() => {\n if (highlightRef.current && highlightRef.current.parentNode) {\n highlightRef.current.parentNode.removeChild(highlightRef.current)\n highlightRef.current = null\n }\n }, [])\n\n const highlightShape = useCallback((result) => {\n removeHighlight()\n if (!result || !window.svg) return\n\n const shape = result.shape\n const x = shape.x || 0\n const y = shape.y || 0\n const w = shape.width || 100\n const h = shape.height || 30\n\n // Create highlight rect\n const ns = 'http://www.w3.org/2000/svg'\n const rect = document.createElementNS(ns, 'rect')\n rect.setAttribute('x', x - 4)\n rect.setAttribute('y', y - 4)\n rect.setAttribute('width', w + 8)\n rect.setAttribute('height', h + 8)\n rect.setAttribute('fill', 'rgba(91, 87, 209, 0.15)')\n rect.setAttribute('stroke', '#5B57D1')\n rect.setAttribute('stroke-width', '2')\n rect.setAttribute('stroke-dasharray', '4,2')\n rect.setAttribute('rx', '4')\n rect.setAttribute('pointer-events', 'none')\n rect.classList.add('find-highlight')\n window.svg.appendChild(rect)\n highlightRef.current = rect\n\n // Pan to the shape\n const svgEl = window.svg\n const vb = svgEl.viewBox.baseVal\n const centerX = x + w / 2\n const centerY = y + h / 2\n const newX = centerX - vb.width / 2\n const newY = centerY - vb.height / 2\n svgEl.setAttribute('viewBox', `${newX} ${newY} ${vb.width} ${vb.height}`)\n if (window.currentViewBox) {\n window.currentViewBox.x = newX\n window.currentViewBox.y = newY\n }\n }, [removeHighlight])\n\n const doSearch = useCallback((q) => {\n const finder = window.__sceneSerializer?.findText\n if (!finder || !q.trim()) {\n setResults([])\n setActiveIndex(-1)\n removeHighlight()\n return\n }\n const found = finder(q)\n setResults(found)\n if (found.length > 0) {\n setActiveIndex(0)\n highlightShape(found[0])\n } else {\n setActiveIndex(-1)\n removeHighlight()\n }\n }, [highlightShape, removeHighlight])\n\n const goToResult = useCallback((idx) => {\n if (idx < 0 || idx >= results.length) return\n setActiveIndex(idx)\n highlightShape(results[idx])\n }, [results, highlightShape])\n\n const handleKeyDown = (e) => {\n if (e.key === 'Escape') {\n closeFindBar()\n return\n }\n if (e.key === 'Enter') {\n e.preventDefault()\n if (results.length === 0) {\n doSearch(query)\n } else {\n // Go to next result\n const next = (activeIndex + 1) % results.length\n goToResult(next)\n }\n return\n }\n }\n\n const handleChange = (e) => {\n const q = e.target.value\n setQuery(q)\n doSearch(q)\n }\n\n if (!open) return null\n\n return (\n <div className=\"fixed top-14 right-4 z-[1000] font-[lixFont]\">\n <div className=\"flex items-center gap-2 bg-surface-card/95 backdrop-blur-lg border border-border-light rounded-xl px-3 py-2 shadow-xl min-w-[300px]\">\n <i className=\"bx bx-search text-text-muted text-sm\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder=\"Find text on canvas...\"\n className=\"flex-1 bg-transparent text-text-primary text-xs outline-none placeholder:text-text-dim font-[lixFont]\"\n />\n\n {results.length > 0 && (\n <span className=\"text-text-dim text-xs whitespace-nowrap\">\n {activeIndex + 1}/{results.length}\n </span>\n )}\n {query && results.length === 0 && (\n <span className=\"text-red-400/70 text-xs whitespace-nowrap\">\n No results\n </span>\n )}\n\n {results.length > 1 && (\n <div className=\"flex items-center gap-0.5\">\n <button\n onClick={() => goToResult((activeIndex - 1 + results.length) % results.length)}\n className=\"w-5 h-5 flex items-center justify-center rounded text-text-muted hover:text-white hover:bg-white/10 transition-colors\"\n >\n <i className=\"bx bx-chevron-up text-sm\" />\n </button>\n <button\n onClick={() => goToResult((activeIndex + 1) % results.length)}\n className=\"w-5 h-5 flex items-center justify-center rounded text-text-muted hover:text-white hover:bg-white/10 transition-colors\"\n >\n <i className=\"bx bx-chevron-down text-sm\" />\n </button>\n </div>\n )}\n\n <button\n onClick={closeFindBar}\n className=\"w-5 h-5 flex items-center justify-center rounded text-text-muted hover:text-white hover:bg-white/10 transition-colors\"\n >\n <i className=\"bx bx-x text-sm\" />\n </button>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\nimport useUIStore from '../../store/useUIStore'\nimport useSketchStore from '../../store/useSketchStore'\n\nexport default function ImageSourcePicker() {\n const ref = useRef(null)\n const toggleImageGenerateModal = useUIStore((s) => s.toggleImageGenerateModal)\n const activeTool = useSketchStore((s) => s.activeTool)\n const setActiveTool = useSketchStore((s) => s.setActiveTool)\n\n // Derive visibility directly from Zustand \u2014 no intermediate state\n const visible = activeTool === 'image'\n\n const handleGenerateAI = useCallback(() => {\n setActiveTool('select')\n toggleImageGenerateModal()\n }, [setActiveTool, toggleImageGenerateModal])\n\n const handleUpload = useCallback(() => {\n setActiveTool('select')\n if (window.openImageFilePicker) {\n window.openImageFilePicker()\n }\n }, [setActiveTool])\n\n // Keep the global bridge for engine calls\n useEffect(() => {\n window.__showImageSourcePicker = () => {\n // The picker now shows automatically via Zustand activeTool,\n // but keep this bridge so the engine call doesn't error\n }\n return () => {\n delete window.__showImageSourcePicker\n }\n }, [])\n\n // Close on outside click & keybinds\n useEffect(() => {\n if (!visible) return\n\n const handleClick = (e) => {\n if (ref.current && !ref.current.contains(e.target)) {\n setActiveTool('select')\n }\n }\n\n const handleKeyDown = (e) => {\n if (e.key === 'Escape') {\n setActiveTool('select')\n }\n if (e.key === 'g' || e.key === 'G') {\n e.preventDefault()\n e.stopPropagation()\n handleGenerateAI()\n }\n if (e.key === 'u' || e.key === 'U') {\n e.preventDefault()\n e.stopPropagation()\n handleUpload()\n }\n }\n\n // Delay to avoid catching the click that opened it\n const timer = setTimeout(() => {\n document.addEventListener('mousedown', handleClick)\n document.addEventListener('keydown', handleKeyDown, true)\n }, 100)\n return () => {\n clearTimeout(timer)\n document.removeEventListener('mousedown', handleClick)\n document.removeEventListener('keydown', handleKeyDown, true)\n }\n }, [visible, setActiveTool, handleGenerateAI, handleUpload])\n\n if (!visible) return null\n\n // Compute position on each render when visible\n let posX = 65\n let posY = typeof window !== 'undefined' ? window.innerHeight / 2 - 50 : 300\n if (typeof document !== 'undefined') {\n const imageBtn = document.querySelector('button[title=\"Image (9)\"]')\n if (imageBtn) {\n const rect = imageBtn.getBoundingClientRect()\n posX = rect.right + 10\n posY = rect.top - 10\n }\n }\n\n return (\n <div\n ref={ref}\n className=\"fixed z-[1100] font-[lixFont]\"\n style={{ left: posX, top: posY }}\n >\n <div className=\"bg-surface-card border border-border-light rounded-xl p-1.5 shadow-2xl shadow-black/40 flex flex-col gap-1 min-w-[200px]\">\n <button\n onClick={handleGenerateAI}\n className=\"flex items-center gap-3 px-3 py-2.5 rounded-lg text-text-muted hover:text-accent-blue hover:bg-surface-hover transition-all group\"\n >\n <div className=\"w-8 h-8 rounded-lg bg-accent-blue/10 flex items-center justify-center group-hover:bg-accent-blue/20 transition-all\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-accent-blue\">\n <path d=\"M12 3l1.5 4.5L18 9l-4.5 1.5L12 15l-1.5-4.5L6 9l4.5-1.5L12 3z\" />\n <path d=\"M18 14l1 3 3 1-3 1-1 3-1-3-3-1 3-1 1-3z\" />\n </svg>\n </div>\n <div className=\"flex-1 text-left\">\n <div className=\"text-sm font-medium\">Generate with AI</div>\n <div className=\"text-[10px] text-text-dim\">10 generations · 5 edits free</div>\n </div>\n <kbd className=\"text-[10px] text-text-dim bg-surface-dark px-1.5 py-0.5 rounded\">G</kbd>\n </button>\n\n <div className=\"h-px bg-white/[0.06] mx-2\" />\n\n <button\n onClick={handleUpload}\n className=\"flex items-center gap-3 px-3 py-2.5 rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all group\"\n >\n <div className=\"w-8 h-8 rounded-lg bg-surface-hover flex items-center justify-center group-hover:bg-surface-active transition-all\">\n <i className=\"bx bx-upload text-lg\" />\n </div>\n <div className=\"flex-1 text-left\">\n <div className=\"text-sm font-medium\">Upload from device</div>\n <div className=\"text-[10px] text-text-dim\">PNG, JPG, SVG, WebP</div>\n </div>\n <kbd className=\"text-[10px] text-text-dim bg-surface-dark px-1.5 py-0.5 rounded\">U</kbd>\n </button>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport useUIStore from '../../store/useUIStore'\n\nexport default function CanvasLoadingOverlay() {\n const loading = useUIStore((s) => s.canvasLoading)\n const message = useUIStore((s) => s.canvasLoadingMessage)\n\n if (!loading) return null\n\n return (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center bg-black/80 backdrop-blur-sm font-[lixFont] pointer-events-all\">\n <div className=\"flex flex-col items-center gap-5\">\n <style>{`\n @keyframes cl-glob {\n 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.7; }\n 25% { transform: translate(10px, -6px) scale(1.12); opacity: 0.9; }\n 50% { transform: translate(-5px, 8px) scale(0.9); opacity: 0.6; }\n 75% { transform: translate(-8px, -4px) scale(1.08); opacity: 0.85; }\n }\n @keyframes cl-glob-2 {\n 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.6; }\n 25% { transform: translate(-8px, 5px) scale(1.1); opacity: 0.85; }\n 50% { transform: translate(6px, -8px) scale(0.95); opacity: 0.7; }\n 75% { transform: translate(5px, 6px) scale(1.12); opacity: 0.9; }\n }\n @keyframes cl-float {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-3px); }\n }\n `}</style>\n\n <div className=\"relative w-20 h-20\">\n <div className=\"absolute rounded-full\" style={{\n width: 38, height: 38, top: 2, left: 4,\n background: 'radial-gradient(circle, rgba(59,130,246,0.5) 0%, transparent 70%)',\n filter: 'blur(10px)',\n animation: 'cl-glob 3.5s ease-in-out infinite',\n willChange: 'transform, opacity',\n }} />\n <div className=\"absolute rounded-full\" style={{\n width: 34, height: 34, top: 14, right: 2,\n background: 'radial-gradient(circle, rgba(168,85,247,0.45) 0%, transparent 70%)',\n filter: 'blur(10px)',\n animation: 'cl-glob-2 4s ease-in-out infinite',\n willChange: 'transform, opacity',\n }} />\n <div className=\"absolute rounded-full\" style={{\n width: 30, height: 30, bottom: 2, left: 12,\n background: 'radial-gradient(circle, rgba(52,211,153,0.4) 0%, transparent 70%)',\n filter: 'blur(10px)',\n animation: 'cl-glob 4.2s ease-in-out infinite reverse',\n willChange: 'transform, opacity',\n }} />\n <div className=\"absolute inset-0 flex items-center justify-center\" style={{ animation: 'cl-float 2.5s ease-in-out infinite' }}>\n <div className=\"w-9 h-9 rounded-lg bg-white/[0.06] backdrop-blur-sm border border-white/[0.08] flex items-center justify-center\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"opacity-70\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\" />\n </svg>\n </div>\n </div>\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-blue-400 animate-bounce\" style={{ animationDelay: '0ms' }} />\n <span className=\"w-1.5 h-1.5 rounded-full bg-purple-400 animate-bounce\" style={{ animationDelay: '150ms' }} />\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-400 animate-bounce\" style={{ animationDelay: '300ms' }} />\n </div>\n <p className=\"text-text-dim text-sm\">{message}</p>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport useUIStore from '../../store/useUIStore'\nimport { useTranslation } from '../../hooks/useTranslation'\nimport { useMemo } from 'react'\n\nfunction ShortcutRow({ keys, action }) {\n return (\n <div className=\"flex items-center justify-between py-1.5\">\n <span className=\"text-text-secondary text-xs\">{action}</span>\n <div className=\"flex items-center gap-1\">\n {keys.split('+').map((key, i) => (\n <span key={i}>\n {i > 0 && <span className=\"text-text-dim text-xs mx-0.5\">+</span>}\n <kbd className=\"px-1.5 py-0.5 bg-surface-dark rounded text-text-muted text-xs border border-border font-[lixFont]\">\n {key.trim()}\n </kbd>\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction ShortcutSection({ title, shortcuts }) {\n return (\n <div>\n <h3 className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">{title}</h3>\n {shortcuts.map((s) => (\n <ShortcutRow key={s.action} keys={s.keys} action={s.action} />\n ))}\n </div>\n )\n}\n\nexport default function ShortcutsModal() {\n const { t } = useTranslation()\n const shortcutsModalOpen = useUIStore((s) => s.shortcutsModalOpen)\n const toggleShortcutsModal = useUIStore((s) => s.toggleShortcutsModal)\n\n const TOOL_SHORTCUTS = useMemo(() => [\n { keys: 'H', action: t('shortcuts.pan') },\n { keys: 'V / 1', action: t('shortcuts.selection') },\n { keys: 'R / 2', action: t('shortcuts.rectangle') },\n { keys: '3', action: t('shortcuts.diamond') },\n { keys: 'O / 4', action: t('shortcuts.circle') },\n { keys: 'A / 5', action: t('shortcuts.arrow') },\n { keys: 'L / 6', action: t('shortcuts.line') },\n { keys: 'P / 7', action: t('shortcuts.freehand') },\n { keys: 'T / 8', action: t('shortcuts.text') },\n { keys: '9', action: t('shortcuts.image') },\n { keys: 'E / 0', action: t('shortcuts.eraser') },\n { keys: 'F', action: t('shortcuts.frame') },\n { keys: 'K', action: t('shortcuts.laser') },\n ], [t])\n\n const ACTION_SHORTCUTS = useMemo(() => [\n { keys: 'Ctrl+A', action: t('shortcuts.selectAll') },\n { keys: 'Ctrl+G', action: t('shortcuts.group') },\n { keys: 'Ctrl+Shift+G', action: t('shortcuts.ungroup') },\n { keys: 'Ctrl+D', action: t('shortcuts.duplicate') },\n { keys: 'Ctrl+S', action: t('shortcuts.quickSave') },\n { keys: 'Ctrl+Shift+S', action: t('shortcuts.saveShare') },\n { keys: 'Ctrl+F', action: t('shortcuts.findOnCanvas') },\n { keys: 'Ctrl+C', action: t('shortcuts.copy') },\n { keys: 'Ctrl+V', action: t('shortcuts.paste') },\n { keys: 'Ctrl+Z', action: t('shortcuts.undo') },\n { keys: 'Ctrl+Shift+Z', action: t('shortcuts.redo') },\n { keys: 'Esc', action: t('shortcuts.deselect') },\n { keys: 'Del', action: t('shortcuts.delete') },\n { keys: 'Space', action: t('shortcuts.holdToPan') },\n { keys: 'Shift', action: t('shortcuts.straightDraw') },\n ], [t])\n\n const VIEW_SHORTCUTS = useMemo(() => [\n { keys: 'Ctrl++', action: t('shortcuts.zoomIn') },\n { keys: 'Ctrl+-', action: t('shortcuts.zoomOut') },\n { keys: 'Ctrl+0', action: t('shortcuts.resetZoom') },\n { keys: \"Ctrl+'\", action: t('shortcuts.toggleGrid') },\n { keys: 'Ctrl+/', action: t('shortcuts.shortcutsHelp') },\n ], [t])\n\n if (!shortcutsModalOpen) return null\n\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex items-center justify-center font-[lixFont]\"\n onClick={toggleShortcutsModal}\n >\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" />\n\n {/* Modal */}\n <div\n className=\"relative bg-surface-card border border-border-light rounded-2xl p-6 max-w-[600px] w-full mx-4 max-h-[80vh] overflow-y-auto no-scrollbar\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between mb-5\">\n <h2 className=\"text-text-primary text-base font-medium\">\n {t('shortcuts.title')}\n </h2>\n <button\n onClick={toggleShortcutsModal}\n className=\"w-7 h-7 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-x text-xl\" />\n </button>\n </div>\n\n {/* Two columns */}\n <div className=\"grid grid-cols-2 gap-6\">\n {/* Left column - Tools */}\n <ShortcutSection title={t('shortcuts.tools')} shortcuts={TOOL_SHORTCUTS} />\n\n {/* Right column - Actions + View */}\n <div className=\"flex flex-col gap-4\">\n <ShortcutSection title={t('shortcuts.actions')} shortcuts={ACTION_SHORTCUTS} />\n <ShortcutSection title={t('shortcuts.view')} shortcuts={VIEW_SHORTCUTS} />\n </div>\n </div>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState, useEffect, useRef } from 'react'\nimport useUIStore from '../../store/useUIStore'\nimport useSketchStore, { TOOLS } from '../../store/useSketchStore'\n\nconst COMMANDS = [\n // --- App ---\n { label: 'Library', icon: 'bx-library', section: 'App' },\n { label: 'Find on canvas', icon: 'bx-search', section: 'App', shortcut: 'Ctrl+F', action: 'findOnCanvas' },\n { label: 'Live collaboration...', icon: 'bx-group', section: 'App' },\n { label: 'Share', icon: 'bx-share-alt', section: 'App' },\n { label: 'Toggle theme', icon: 'bx-sun', section: 'App', action: 'toggleTheme' },\n\n // --- Export ---\n { label: 'Export image...', icon: 'bx-image', section: 'Export', shortcut: 'Ctrl+Shift+E', action: 'exportImage' },\n { label: 'Save to disk', icon: 'bx-download', section: 'Export', shortcut: 'Ctrl+S', action: 'save' },\n { label: 'Copy to clipboard as PNG', icon: 'bx-clipboard', section: 'Export', shortcut: 'Shift+Alt+C', action: 'copyPNG' },\n { label: 'Copy to clipboard as SVG', icon: 'bx-code-alt', section: 'Export', shortcut: null, action: 'copySVG' },\n { label: 'Open scene file', icon: 'bx-folder-open', section: 'Export', shortcut: 'Ctrl+O', action: 'load' },\n\n // --- Editor ---\n { label: 'Undo', icon: 'bx-undo', section: 'Editor', action: 'undo' },\n { label: 'Redo', icon: 'bx-redo', section: 'Editor', action: 'redo' },\n { label: 'Zoom in', icon: 'bx-plus', section: 'Editor', shortcut: 'Ctrl++' },\n { label: 'Zoom out', icon: 'bx-minus', section: 'Editor', shortcut: 'Ctrl+-' },\n { label: 'Reset zoom', icon: 'bx-reset', section: 'Editor', shortcut: 'Ctrl+0' },\n { label: 'Zoom to fit all elements', icon: 'bx-fullscreen', section: 'Editor', shortcut: 'Shift+1' },\n { label: 'Toggle grid', icon: 'bx-grid-alt', section: 'Editor', shortcut: \"Ctrl+'\", action: 'toggleGrid' },\n { label: 'Shortcuts & help', icon: 'bx-help-circle', section: 'Editor', shortcut: '?', action: 'help' },\n { label: 'Select all', icon: 'bx-select-multiple', section: 'Editor', shortcut: 'Ctrl+A', action: 'selectAll' },\n { label: 'Reset canvas', icon: 'bx-trash', section: 'Editor', shortcut: 'Ctrl+Delete', action: 'resetCanvas' },\n { label: 'Canvas background', icon: 'bx-palette', section: 'Editor', action: 'openMenu' },\n\n // --- Tools ---\n { label: 'Hand (panning tool)', icon: 'bx-hand', section: 'Tools', shortcut: 'H', action: 'tool:pan' },\n { label: 'Selection', icon: 'bx-pointer', section: 'Tools', shortcut: 'V', action: 'tool:select' },\n { label: 'Rectangle', icon: 'bx-rectangle', section: 'Tools', shortcut: 'R', action: 'tool:rectangle' },\n { label: 'Diamond', icon: 'bx-diamond', section: 'Tools', shortcut: 'D', action: 'tool:diamond' },\n { label: 'Circle', icon: 'bx-circle', section: 'Tools', shortcut: 'O', action: 'tool:circle' },\n { label: 'Arrow', icon: 'bx-right-arrow-alt', section: 'Tools', shortcut: 'A', action: 'tool:arrow' },\n { label: 'Line', icon: 'bx-minus', section: 'Tools', shortcut: 'L', action: 'tool:line' },\n { label: 'Draw', icon: 'bx-pencil', section: 'Tools', shortcut: 'P', action: 'tool:freehand' },\n { label: 'Text', icon: 'bx-text', section: 'Tools', shortcut: 'T', action: 'tool:text' },\n { label: 'Insert image', icon: 'bx-image-add', section: 'Tools', shortcut: '9', action: 'tool:image' },\n { label: 'Eraser', icon: 'bx-eraser', section: 'Tools', shortcut: 'E', action: 'tool:eraser' },\n { label: 'Laser pointer', icon: 'bxs-magic-wand', section: 'Tools', shortcut: 'K', action: 'tool:laser' },\n { label: 'Frame tool', icon: 'bx-border-all', section: 'Tools', shortcut: 'F', action: 'tool:frame' },\n // AI entries removed \u2014 feature is hidden behind a coming-soon screen.\n // Restore \"Text to diagram...\" / \"Mermaid to diagram...\" here when the\n // assistant ships.\n\n // --- Links ---\n { label: 'GitHub', icon: 'bxl-github', section: 'Links', action: 'link:github' },\n { label: 'Report an issue', icon: 'bx-bug', section: 'Links', action: 'link:issues' },\n]\n\nconst TOOL_ACTION_MAP = {\n 'tool:pan': TOOLS.PAN,\n 'tool:select': TOOLS.SELECT,\n 'tool:rectangle': TOOLS.RECTANGLE,\n 'tool:diamond': TOOLS.RECTANGLE, // diamond is a rectangle variant\n 'tool:circle': TOOLS.CIRCLE,\n 'tool:arrow': TOOLS.ARROW,\n 'tool:line': TOOLS.LINE,\n 'tool:freehand': TOOLS.FREEHAND,\n 'tool:text': TOOLS.TEXT,\n 'tool:image': TOOLS.IMAGE,\n 'tool:eraser': TOOLS.ERASER,\n 'tool:laser': TOOLS.LASER,\n 'tool:frame': TOOLS.FRAME,\n}\n\nexport default function CommandPalette() {\n const open = useUIStore((s) => s.commandPaletteOpen)\n const toggleCommandPalette = useUIStore((s) => s.toggleCommandPalette)\n const [query, setQuery] = useState('')\n const [selectedIndex, setSelectedIndex] = useState(0)\n const inputRef = useRef(null)\n const listRef = useRef(null)\n\n useEffect(() => {\n if (open) {\n setQuery('')\n setSelectedIndex(0)\n setTimeout(() => inputRef.current?.focus(), 50)\n }\n }, [open])\n\n // Scroll selected item into view\n useEffect(() => {\n if (!open) return\n const el = listRef.current?.querySelector(`[data-index=\"${selectedIndex}\"]`)\n if (el) el.scrollIntoView({ block: 'nearest' })\n }, [selectedIndex, open])\n\n // Reset selection on query change\n useEffect(() => {\n setSelectedIndex(0)\n }, [query])\n\n if (!open) return null\n\n const filtered = query\n ? COMMANDS.filter((c) =>\n c.label.toLowerCase().includes(query.toLowerCase())\n )\n : COMMANDS\n\n // Group into sections preserving order\n const sectionOrder = []\n const sections = {}\n filtered.forEach((c) => {\n if (!sections[c.section]) {\n sections[c.section] = []\n sectionOrder.push(c.section)\n }\n sections[c.section].push(c)\n })\n\n const handleCommand = (cmd) => {\n toggleCommandPalette()\n const action = cmd.action\n\n if (!action) return\n\n // Tool switching\n if (action.startsWith('tool:')) {\n const tool = TOOL_ACTION_MAP[action]\n if (tool) useSketchStore.getState().setActiveTool(tool)\n return\n }\n\n // Links\n if (action === 'link:github') {\n window.open('https://github.com/elixpo/sketch.elixpo', '_blank')\n return\n }\n if (action === 'link:issues') {\n window.open('https://github.com/elixpo/sketch.elixpo/issues', '_blank')\n return\n }\n\n const serializer = window.__sceneSerializer\n\n switch (action) {\n case 'toggleTheme': {\n const store = useUIStore.getState()\n store.setTheme(store.theme === 'dark' ? 'light' : 'dark')\n break\n }\n case 'toggleGrid':\n useSketchStore.getState().toggleGrid()\n break\n case 'save': {\n const name = useUIStore.getState().workspaceName || 'Untitled'\n serializer?.download(name)\n break\n }\n case 'load':\n serializer?.upload()\n break\n case 'exportImage':\n useUIStore.getState().toggleExportImageModal()\n break\n case 'copyPNG':\n serializer?.copyAsPNG()\n break\n case 'copySVG':\n serializer?.copyAsSVG()\n break\n case 'undo':\n if (typeof window.undo === 'function') window.undo()\n break\n case 'redo':\n if (typeof window.redo === 'function') window.redo()\n break\n case 'selectAll':\n useSketchStore.getState().setActiveTool(TOOLS.SELECT)\n if (window.multiSelection && window.shapes) {\n window.multiSelection.clearSelection()\n window.shapes.forEach(shape => window.multiSelection.addShape(shape))\n }\n break\n case 'resetCanvas': {\n const serializer = window.__sceneSerializer\n if (serializer?.resetCanvas) {\n serializer.resetCanvas()\n }\n useSketchStore.getState().clearShapes()\n useSketchStore.getState().clearHistory()\n break\n }\n case 'findOnCanvas':\n useUIStore.getState().toggleFindBar()\n break\n case 'help':\n useUIStore.getState().toggleHelpModal()\n break\n case 'aiModal':\n useUIStore.getState().toggleAIModal()\n break\n case 'openMenu':\n useUIStore.getState().toggleMenu()\n break\n }\n }\n\n const handleKeyDown = (e) => {\n if (e.key === 'Escape') {\n toggleCommandPalette()\n return\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setSelectedIndex((i) => Math.min(i + 1, filtered.length - 1))\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setSelectedIndex((i) => Math.max(i - 1, 0))\n } else if (e.key === 'Enter' && filtered[selectedIndex]) {\n e.preventDefault()\n handleCommand(filtered[selectedIndex])\n }\n }\n\n let flatIndex = -1\n\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex items-start justify-center pt-[12vh] font-[lixFont]\"\n onClick={toggleCommandPalette}\n >\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" />\n\n <div\n className=\"relative bg-surface-card border border-border-light rounded-2xl w-full max-w-[540px] mx-4 overflow-hidden\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Search */}\n <div className=\"flex items-center gap-3 px-4 py-3 border-b border-border-light\">\n <i className=\"bx bx-search text-text-muted text-lg\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search commands...\"\n className=\"flex-1 bg-transparent text-text-primary text-sm outline-none placeholder:text-text-dim font-[lixFont]\"\n onKeyDown={handleKeyDown}\n />\n </div>\n\n {/* Results */}\n <div ref={listRef} className=\"max-h-[55vh] overflow-y-auto no-scrollbar py-2\">\n {filtered.length === 0 && (\n <div className=\"px-4 py-6 text-center text-text-dim text-xs\">\n No commands found\n </div>\n )}\n\n {sectionOrder.map((section) => (\n <div key={section}>\n <div className=\"px-4 pt-3 pb-1\">\n <span className=\"text-text-dim text-xs uppercase tracking-wider\">\n {section}\n </span>\n </div>\n {sections[section].map((cmd) => {\n flatIndex++\n const idx = flatIndex\n return (\n <button\n key={cmd.label}\n data-index={idx}\n onClick={() => handleCommand(cmd)}\n className={`w-full flex items-center justify-between px-4 py-2 text-text-secondary text-xs transition-all duration-100 ${\n idx === selectedIndex\n ? 'bg-surface-hover text-text-primary'\n : 'hover:bg-surface-hover/60'\n }`}\n >\n <span className=\"flex items-center gap-3\">\n <i className={`bx ${cmd.icon} text-base text-text-muted`} />\n {cmd.label}\n </span>\n {cmd.shortcut && (\n <div className=\"flex items-center gap-0.5\">\n {cmd.shortcut.split('+').map((key, i) => (\n <span key={i}>\n {i > 0 && <span className=\"text-text-dim text-xs mx-0.5\">+</span>}\n <kbd className=\"px-1.5 py-0.5 bg-surface-dark rounded text-text-dim text-xs border border-border\">\n {key.trim()}\n </kbd>\n </span>\n ))}\n </div>\n )}\n </button>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState, useEffect, useRef, useCallback } from 'react'\nimport useUIStore from '../../store/useUIStore'\n\nconst SCALES = [1, 2, 3]\n\nfunction getCleanSVG() {\n const svgEl = window.svg\n if (!svgEl) return null\n const clone = svgEl.cloneNode(true)\n clone.querySelectorAll(\n '[data-selection], .selection-handle, .resize-handle, .rotation-handle, .anchor, .rotate-anchor'\n ).forEach((el) => el.remove())\n return clone\n}\n\nfunction renderToCanvas(clone, scale, bgColor) {\n return new Promise((resolve) => {\n const svgData = new XMLSerializer().serializeToString(clone)\n const vb = window.svg.viewBox.baseVal\n const canvas = document.createElement('canvas')\n canvas.width = vb.width * scale\n canvas.height = vb.height * scale\n const ctx = canvas.getContext('2d')\n ctx.scale(scale, scale)\n\n const img = new Image()\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n\n img.onload = () => {\n if (bgColor) {\n ctx.fillStyle = bgColor\n ctx.fillRect(0, 0, vb.width, vb.height)\n }\n ctx.drawImage(img, 0, 0, vb.width, vb.height)\n URL.revokeObjectURL(url)\n resolve(canvas)\n }\n img.onerror = () => {\n URL.revokeObjectURL(url)\n resolve(null)\n }\n img.src = url\n })\n}\n\nexport default function ExportImageModal() {\n const open = useUIStore((s) => s.exportImageModalOpen)\n const toggleModal = useUIStore((s) => s.toggleExportImageModal)\n\n const [scale, setScale] = useState(2)\n const [bgMode, setBgMode] = useState('dark') // 'dark' | 'light' | 'none'\n const [previewUrl, setPreviewUrl] = useState(null)\n const previewRef = useRef(null)\n\n const getBgColor = useCallback(() => {\n if (bgMode === 'dark') return '#121212'\n if (bgMode === 'light') return '#ffffff'\n return null // transparent\n }, [bgMode])\n\n // Generate preview whenever settings change\n useEffect(() => {\n if (!open) return\n let cancelled = false\n\n const generate = async () => {\n const clone = getCleanSVG()\n if (!clone) return\n // Preview at 1x for speed\n const canvas = await renderToCanvas(clone, 1, getBgColor())\n if (cancelled || !canvas) return\n setPreviewUrl(canvas.toDataURL('image/png'))\n }\n generate()\n\n return () => { cancelled = true }\n }, [open, bgMode, getBgColor])\n\n if (!open) return null\n\n const handleExportPNG = async () => {\n const clone = getCleanSVG()\n if (!clone) return\n const canvas = await renderToCanvas(clone, scale, getBgColor())\n if (!canvas) return\n\n canvas.toBlob((blob) => {\n const a = document.createElement('a')\n a.href = URL.createObjectURL(blob)\n a.download = `lixsketch-export-${scale}x.png`\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n }, 'image/png')\n toggleModal()\n }\n\n const handleExportSVG = () => {\n const clone = getCleanSVG()\n if (!clone) return\n // Apply background as a rect if needed\n const bg = getBgColor()\n if (bg) {\n const ns = 'http://www.w3.org/2000/svg'\n const rect = document.createElementNS(ns, 'rect')\n const vb = window.svg.viewBox.baseVal\n rect.setAttribute('width', vb.width)\n rect.setAttribute('height', vb.height)\n rect.setAttribute('fill', bg)\n clone.insertBefore(rect, clone.firstChild)\n }\n const svgData = new XMLSerializer().serializeToString(clone)\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' })\n const a = document.createElement('a')\n a.href = URL.createObjectURL(blob)\n a.download = 'lixsketch-export.svg'\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n toggleModal()\n }\n\n const handleCopyPNG = async () => {\n const clone = getCleanSVG()\n if (!clone) return\n const canvas = await renderToCanvas(clone, scale, getBgColor())\n if (!canvas) return\n\n canvas.toBlob((blob) => {\n if (!blob) return\n navigator.clipboard\n .write([new ClipboardItem({ 'image/png': blob })])\n .catch((err) => console.warn('Clipboard write failed:', err))\n }, 'image/png')\n toggleModal()\n }\n\n const handleCopySVG = () => {\n const clone = getCleanSVG()\n if (!clone) return\n const svgData = new XMLSerializer().serializeToString(clone)\n navigator.clipboard.writeText(svgData).catch((err) =>\n console.warn('Clipboard write failed:', err)\n )\n toggleModal()\n }\n\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex items-center justify-center font-[lixFont]\"\n onClick={toggleModal}\n >\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" />\n\n <div\n className=\"relative bg-surface-card border border-border-light rounded-2xl w-full max-w-[720px] mx-4 overflow-hidden\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 pt-5 pb-3\">\n <h2 className=\"text-text-primary text-base font-medium\">Export Image</h2>\n <button\n onClick={toggleModal}\n className=\"w-7 h-7 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-x text-xl\" />\n </button>\n </div>\n\n <hr className=\"border-border-light mx-6\" />\n\n {/* Body - two columns */}\n <div className=\"flex gap-0\">\n {/* Left - Preview */}\n <div className=\"flex-1 p-6 flex items-center justify-center min-h-[300px]\">\n <div\n ref={previewRef}\n className=\"w-full max-h-[320px] rounded-xl overflow-hidden border border-border-light flex items-center justify-center\"\n style={{ background: bgMode === 'none' ? 'repeating-conic-gradient(#2a2a35 0% 25%, #1e1e28 0% 50%) 0 0 / 16px 16px' : getBgColor() }}\n >\n {previewUrl ? (\n <img\n src={previewUrl}\n alt=\"Export preview\"\n className=\"w-full h-full object-contain max-h-[320px]\"\n />\n ) : (\n <span className=\"text-text-dim text-xs\">Generating preview...</span>\n )}\n </div>\n </div>\n\n {/* Right - Controls */}\n <div className=\"w-[240px] border-l border-border-light p-5 flex flex-col gap-5\">\n {/* Background */}\n <div>\n <p className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">Background</p>\n <div className=\"flex items-center gap-1\">\n {[\n { value: 'dark', label: 'Dark', icon: 'bxs-moon' },\n { value: 'light', label: 'Light', icon: 'bxs-sun' },\n { value: 'none', label: 'None', icon: 'bx-hide' },\n ].map((opt) => (\n <button\n key={opt.value}\n onClick={() => setBgMode(opt.value)}\n className={`flex-1 flex items-center justify-center gap-1 py-1.5 rounded-lg text-xs transition-all duration-200 ${\n bgMode === opt.value\n ? 'bg-accent text-text-primary'\n : 'text-text-muted hover:bg-surface-hover'\n }`}\n >\n <i className={`bx ${opt.icon} text-xs`} />\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Scale */}\n <div>\n <p className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">Scale</p>\n <div className=\"flex items-center gap-1\">\n {SCALES.map((s) => (\n <button\n key={s}\n onClick={() => setScale(s)}\n className={`flex-1 py-1.5 rounded-lg text-xs transition-all duration-200 ${\n scale === s\n ? 'bg-accent text-text-primary'\n : 'text-text-muted hover:bg-surface-hover'\n }`}\n >\n {s}x\n </button>\n ))}\n </div>\n </div>\n\n <hr className=\"border-border-light\" />\n\n {/* Export buttons */}\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={handleExportPNG}\n className=\"w-full flex items-center gap-2 px-3 py-2.5 rounded-lg bg-accent-blue hover:bg-accent-blue-hover text-text-primary text-xs transition-all duration-200\"\n >\n <i className=\"bx bx-image text-sm\" />\n Export as PNG\n </button>\n <button\n onClick={handleExportSVG}\n className=\"w-full flex items-center gap-2 px-3 py-2.5 rounded-lg bg-surface hover:bg-surface-hover border border-border text-text-secondary text-xs transition-all duration-200\"\n >\n <i className=\"bx bx-code-alt text-sm\" />\n Export as SVG\n </button>\n </div>\n\n <hr className=\"border-border-light\" />\n\n {/* Clipboard buttons */}\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={handleCopyPNG}\n className=\"w-full flex items-center gap-2 px-3 py-2 rounded-lg text-text-secondary text-xs hover:bg-surface-hover border border-border transition-all duration-200\"\n >\n <i className=\"bx bx-clipboard text-sm\" />\n Copy as PNG\n </button>\n <button\n onClick={handleCopySVG}\n className=\"w-full flex items-center gap-2 px-3 py-2 rounded-lg text-text-secondary text-xs hover:bg-surface-hover border border-border transition-all duration-200\"\n >\n <i className=\"bx bx-copy text-sm\" />\n Copy as SVG\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useState } from 'react'\nimport useUIStore from '../../store/useUIStore'\n\nconst TOOL_SHORTCUTS = [\n { keys: 'H', action: 'Pan' },\n { keys: 'V / 1', action: 'Selection' },\n { keys: 'R / 2', action: 'Rectangle' },\n { keys: '3', action: 'Diamond' },\n { keys: 'O / 4', action: 'Circle' },\n { keys: 'A / 5', action: 'Arrow' },\n { keys: 'L / 6', action: 'Line' },\n { keys: 'P / 7', action: 'Freehand' },\n { keys: 'T / 8', action: 'Text' },\n { keys: '9', action: 'Image' },\n { keys: 'E / 0', action: 'Eraser' },\n { keys: 'F', action: 'Frame' },\n { keys: 'K', action: 'Laser' },\n]\n\nconst ACTION_SHORTCUTS = [\n { keys: 'Ctrl+A', action: 'Select All' },\n { keys: 'Ctrl+G', action: 'Group' },\n { keys: 'Ctrl+Shift+G', action: 'Ungroup' },\n { keys: 'Ctrl+D', action: 'Duplicate' },\n { keys: 'Ctrl+S', action: 'Quick Save (canvas + doc)' },\n { keys: 'Ctrl+C', action: 'Copy' },\n { keys: 'Ctrl+V', action: 'Paste' },\n { keys: 'Ctrl+Z', action: 'Undo' },\n { keys: 'Ctrl+Shift+Z', action: 'Redo' },\n { keys: 'Esc', action: 'Deselect' },\n { keys: 'Del / Backspace', action: 'Delete' },\n { keys: 'Space (hold)', action: 'Pan' },\n { keys: 'Shift (hold)', action: 'Straight Draw' },\n]\n\nconst VIEW_SHORTCUTS = [\n { keys: 'Ctrl++', action: 'Zoom In' },\n { keys: 'Ctrl+-', action: 'Zoom Out' },\n { keys: 'Ctrl+0', action: 'Reset Zoom' },\n { keys: \"Ctrl+'\", action: 'Toggle Grid' },\n { keys: 'Ctrl+/', action: 'Command Palette' },\n]\n\n// \u2500\u2500 Doc editor shortcuts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Markdown shortcuts auto-convert when typed at the start of a line.\nconst DOC_BLOCK_SHORTCUTS = [\n { keys: '# Space', action: 'Heading 1' },\n { keys: '## Space', action: 'Heading 2' },\n { keys: '### Space', action: 'Heading 3' },\n { keys: '> Space', action: 'Quote' },\n { keys: '- Space', action: 'Bulleted list' },\n { keys: '1. Space', action: 'Numbered list' },\n { keys: '[] Space', action: 'Checklist' },\n { keys: '``` Space', action: 'Code block' },\n { keys: '--- Enter', action: 'Divider' },\n { keys: '/', action: 'Block menu' },\n]\n\nconst DOC_INLINE_SHORTCUTS = [\n { keys: 'Ctrl+B', action: 'Bold' },\n { keys: 'Ctrl+I', action: 'Italic' },\n { keys: 'Ctrl+U', action: 'Underline' },\n { keys: 'Ctrl+Shift+S', action: 'Strikethrough' },\n { keys: 'Ctrl+E', action: 'Inline code' },\n { keys: 'Tab', action: 'Indent block' },\n { keys: 'Shift+Tab', action: 'Outdent block' },\n { keys: 'Ctrl+Z', action: 'Undo' },\n { keys: 'Ctrl+Shift+Z', action: 'Redo' },\n]\n\nconst TABS = [\n { id: 'canvas', label: 'Canvas', icon: 'bx-pen' },\n { id: 'docs', label: 'Document', icon: 'bxs-notepad' },\n]\n\nfunction ShortcutRow({ keys, action }) {\n return (\n <div className=\"flex items-center justify-between py-1.5\">\n <span className=\"text-text-secondary text-xs\">{action}</span>\n <div className=\"flex items-center gap-1\">\n {keys.split('+').map((key, i) => (\n <span key={i}>\n {i > 0 && <span className=\"text-text-dim text-xs mx-0.5\">+</span>}\n <kbd className=\"px-1.5 py-0.5 bg-surface-dark rounded text-text-muted text-xs border border-border font-[lixFont]\">\n {key.trim()}\n </kbd>\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction ShortcutSection({ title, shortcuts }) {\n return (\n <div>\n <h3 className=\"text-text-dim text-xs uppercase tracking-wider mb-2\">{title}</h3>\n {shortcuts.map((s) => (\n <ShortcutRow key={s.action} keys={s.keys} action={s.action} />\n ))}\n </div>\n )\n}\n\nexport default function HelpModal() {\n const open = useUIStore((s) => s.helpModalOpen)\n const toggleHelpModal = useUIStore((s) => s.toggleHelpModal)\n const [activeTab, setActiveTab] = useState('canvas')\n\n if (!open) return null\n\n return (\n <div\n className=\"fixed inset-0 z-[9999] flex items-center justify-center font-[lixFont]\"\n onClick={toggleHelpModal}\n >\n <div className=\"absolute inset-0 bg-black/60 backdrop-blur-sm\" />\n\n <div\n className=\"relative bg-surface-card border border-border-light rounded-2xl w-full max-w-[800px] mx-4 max-h-[85vh] flex flex-col\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 pt-5 pb-3\">\n <h2 className=\"text-text-primary text-base font-medium\">Shortcuts</h2>\n <button\n onClick={toggleHelpModal}\n className=\"w-7 h-7 flex items-center justify-center rounded-lg text-text-muted hover:text-text-primary hover:bg-surface-hover transition-all duration-200\"\n >\n <i className=\"bx bx-x text-xl\" />\n </button>\n </div>\n\n {/* Tabs */}\n <div className=\"flex items-center gap-1 px-6 pb-3\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={`px-3 py-1.5 rounded-lg text-xs flex items-center gap-1.5 transition-all duration-200 ${\n activeTab === tab.id\n ? 'bg-surface-hover text-text-primary'\n : 'text-text-muted hover:text-text-secondary hover:bg-surface-hover/50'\n }`}\n >\n <i className={`bx ${tab.icon} text-sm`} />\n {tab.label}\n </button>\n ))}\n </div>\n\n <hr className=\"border-border-light mx-6\" />\n\n {/* Content - scrollable */}\n <div className=\"flex-1 overflow-y-auto no-scrollbar px-6 py-4\">\n {activeTab === 'canvas' && (\n <div className=\"grid grid-cols-2 gap-6\">\n <ShortcutSection title=\"Tools\" shortcuts={TOOL_SHORTCUTS} />\n <div className=\"flex flex-col gap-4\">\n <ShortcutSection title=\"Actions\" shortcuts={ACTION_SHORTCUTS} />\n <ShortcutSection title=\"View\" shortcuts={VIEW_SHORTCUTS} />\n </div>\n </div>\n )}\n\n {activeTab === 'docs' && (\n <div className=\"grid grid-cols-2 gap-6\">\n <ShortcutSection title=\"Block markdown\" shortcuts={DOC_BLOCK_SHORTCUTS} />\n <ShortcutSection title=\"Formatting\" shortcuts={DOC_INLINE_SHORTCUTS} />\n </div>\n )}\n </div>\n\n {/* Footer links */}\n <hr className=\"border-border-light mx-6\" />\n <div className=\"flex items-center gap-3 px-6 py-4 flex-wrap\">\n <a\n href=\"/docs\"\n className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-accent-blue/10 hover:bg-accent-blue/20 border border-accent-blue/20 text-accent-blue text-xs transition-all duration-200\"\n >\n <i className=\"bx bx-book-open text-sm\" />\n Documentation\n </a>\n <a\n href=\"https://github.com/elixpo/sketch.elixpo\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-surface hover:bg-surface-hover border border-border text-text-secondary text-xs transition-all duration-200\"\n >\n <i className=\"bx bxl-github text-sm\" />\n View Repository\n </a>\n <a\n href=\"https://github.com/elixpo/sketch.elixpo/issues\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-surface hover:bg-surface-hover border border-border text-text-secondary text-xs transition-all duration-200\"\n >\n <i className=\"bx bx-bug text-sm\" />\n Report An Issue\n </a>\n </div>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useEffect } from 'react'\nimport useUIStore from '../../store/useUIStore'\n\n/** Keep the workspace entry point visible while the supported MCP-backed\n * LixScript workflow is being prepared. No parser execution is exposed. */\nexport default function LixScriptModal() {\n const open = useUIStore((state) => state.aiModalOpen)\n const toggle = useUIStore((state) => state.toggleAIModal)\n\n useEffect(() => {\n if (!open) return\n const onKeyDown = (event) => {\n if (event.key === 'Escape') toggle()\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [open, toggle])\n\n if (!open) return null\n\n return (\n <div\n className=\"fixed inset-0 z-[1100] flex items-center justify-center bg-black/40 backdrop-blur-sm font-[lixFont]\"\n onClick={toggle}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"lixscript-coming-soon-title\"\n >\n <div\n onClick={(event) => event.stopPropagation()}\n className=\"relative w-[520px] max-w-[94vw] bg-surface border border-border-light rounded-2xl px-8 py-10 shadow-2xl text-center\"\n >\n <button\n onClick={toggle}\n className=\"absolute top-3 right-3 w-7 h-7 flex items-center justify-center rounded-md text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n title=\"Close (Esc)\"\n >\n <i className=\"bx bx-x text-lg\" />\n </button>\n\n <div className=\"mx-auto mb-5 w-12 h-12 rounded-xl bg-accent-blue/10 border border-accent-blue/25 flex items-center justify-center\">\n <i className=\"bx bx-plug text-2xl text-accent-blue\" />\n </div>\n <span className=\"inline-flex px-2.5 py-1 rounded-full bg-[#a97852]/15 text-[#8f6244] text-[10px] font-semibold uppercase tracking-wider\">\n Coming soon\n </span>\n <h2 id=\"lixscript-coming-soon-title\" className=\"mt-4 text-text-primary text-xl font-medium\">LixScript MCP</h2>\n <p className=\"mt-2 text-text-muted text-sm leading-relaxed\">\n LixScript is being prepared as the programmable MCP interface for LixSketch. This workspace panel will become available with the supported platform integration.\n </p>\n </div>\n </div>\n )\n}\n", "\"use client\"\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport useUIStore from '../../store/useUIStore'\n\nconst SAMPLE = `# One equation per line. Comments start with #.\n# Hit Cmd/Ctrl+Enter to render onto the canvas.\n\ny = x^2\ny = sin(x) * 3\ny = -x + 2\n`\n\nconst DEFAULT_SETTINGS = { xMin: -10, xMax: 10, yMin: -10, yMax: 10, showGrid: true }\n\nfunction parseEquations(text) {\n return text\n .split(/\\r?\\n/)\n .map((s) => s.trim())\n .filter((s) => s && !s.startsWith('#'))\n}\n\n/**\n * Graph modal \u2014 plots client-side via the engine's GraphRenderer. No\n * inference; the math is parsed by GraphMathParser.parseExpression.\n * Inserts the rendered graph onto the canvas through the bridge\n * SketchEngine.init() exposes as `window.__graphRenderer`.\n */\nexport default function GraphModal() {\n const open = useUIStore((s) => s.graphModalOpen)\n const toggle = useUIStore((s) => s.toggleGraphModal)\n const [source, setSource] = useState(SAMPLE)\n const [settings, setSettings] = useState(DEFAULT_SETTINGS)\n const [busy, setBusy] = useState(false)\n const [status, setStatus] = useState(null)\n const taRef = useRef(null)\n\n useEffect(() => {\n if (!open) return\n requestAnimationFrame(() => taRef.current?.focus())\n const onKey = (e) => {\n if (e.key === 'Escape') toggle()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, toggle])\n\n const render = useCallback(async () => {\n if (busy) return\n setBusy(true)\n setStatus(null)\n try {\n const equations = parseEquations(source)\n if (equations.length === 0) {\n setStatus({ tone: 'error', message: 'Add at least one equation.' })\n return\n }\n // Validate via the engine's parser before handing to the renderer.\n const { parseExpression } = await import('../../../core/GraphMathParser.js')\n const bad = equations.find((eq) => !parseExpression(eq))\n if (bad) {\n setStatus({ tone: 'error', message: `Could not parse: ${bad}` })\n return\n }\n if (typeof window.__graphRenderer === 'function') {\n window.__graphRenderer(equations, settings)\n setStatus({ tone: 'success', message: `Plotted ${equations.length} equation(s).` })\n setTimeout(() => { toggle() }, 700)\n } else {\n setStatus({ tone: 'error', message: 'Graph engine not ready yet \u2014 wait a moment and retry.' })\n }\n } catch (err) {\n console.warn('[GraphModal] render failed:', err)\n setStatus({ tone: 'error', message: err?.message || 'Render failed.' })\n } finally {\n setBusy(false)\n }\n }, [source, settings, busy, toggle])\n\n const handleKeyDown = useCallback((e) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\n e.preventDefault()\n render()\n }\n }, [render])\n\n const setRange = (key) => (e) => {\n const v = parseFloat(e.target.value)\n if (Number.isFinite(v)) setSettings((s) => ({ ...s, [key]: v }))\n }\n\n if (!open) return null\n\n return (\n <div\n className=\"fixed inset-0 z-[1100] flex items-center justify-center bg-black/60 backdrop-blur-sm font-[lixFont]\"\n onClick={toggle}\n role=\"dialog\"\n aria-modal=\"true\"\n >\n <div\n onClick={(e) => e.stopPropagation()}\n className=\"relative w-[560px] max-w-[94vw] bg-surface border border-border-light rounded-2xl p-5 shadow-2xl flex flex-col gap-3\"\n >\n <button\n onClick={toggle}\n className=\"absolute top-3 right-3 w-7 h-7 flex items-center justify-center rounded-md text-text-muted hover:text-text-primary hover:bg-surface-hover transition-colors\"\n title=\"Close (Esc)\"\n >\n <i className=\"bx bx-x text-lg\" />\n </button>\n\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-lg bg-accent-blue/10 border border-accent-blue/30 flex items-center justify-center\">\n <i className=\"bx bx-line-chart text-accent-blue\" />\n </div>\n <div className=\"flex-1\">\n <h2 className=\"text-text-primary text-sm font-medium\">Graph</h2>\n <p className=\"text-text-dim text-[11px]\">One equation per line \u2014 plotted on the canvas. No AI involved.</p>\n </div>\n </div>\n\n <textarea\n ref={taRef}\n value={source}\n onChange={(e) => setSource(e.target.value)}\n onKeyDown={handleKeyDown}\n spellCheck={false}\n className=\"w-full h-[200px] resize-none bg-surface-card border border-border-light rounded-lg px-3 py-2 text-[12px] text-text-primary font-[lixCode] outline-none focus:border-accent-blue/50\"\n />\n\n <div className=\"grid grid-cols-4 gap-2 text-[11px]\">\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-text-dim\">xMin</span>\n <input type=\"number\" value={settings.xMin} onChange={setRange('xMin')}\n className=\"bg-surface-card border border-border-light rounded px-2 py-1 text-text-primary outline-none focus:border-accent-blue/50\" />\n </label>\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-text-dim\">xMax</span>\n <input type=\"number\" value={settings.xMax} onChange={setRange('xMax')}\n className=\"bg-surface-card border border-border-light rounded px-2 py-1 text-text-primary outline-none focus:border-accent-blue/50\" />\n </label>\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-text-dim\">yMin</span>\n <input type=\"number\" value={settings.yMin} onChange={setRange('yMin')}\n className=\"bg-surface-card border border-border-light rounded px-2 py-1 text-text-primary outline-none focus:border-accent-blue/50\" />\n </label>\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-text-dim\">yMax</span>\n <input type=\"number\" value={settings.yMax} onChange={setRange('yMax')}\n className=\"bg-surface-card border border-border-light rounded px-2 py-1 text-text-primary outline-none focus:border-accent-blue/50\" />\n </label>\n </div>\n\n <div className=\"flex items-center justify-between\">\n {status ? (\n <span className={`text-[11px] ${status.tone === 'error' ? 'text-red-400' : 'text-green-400'}`}>\n {status.message}\n </span>\n ) : (\n <span className=\"text-text-dim text-[11px]\">Cmd/Ctrl+Enter to render \u00B7 Esc to close</span>\n )}\n <button\n onClick={render}\n disabled={busy}\n className=\"px-3 py-1.5 rounded-lg bg-accent-blue text-text-primary text-[12px] font-medium hover:bg-accent-blue-hover transition-colors disabled:opacity-50 disabled:pointer-events-none\"\n >\n {busy ? 'Plotting\u2026' : 'Plot'}\n </button>\n </div>\n </div>\n </div>\n )\n}\n", "// Standalone TOOLS enum re-export. The engine's index.js also exports\n// TOOLS but doing it from here lets the React subpath avoid pulling\n// in side-effectful modules (SceneSerializer, shape graph) just to read\n// a constants map. Keep these values in lockstep with src/index.js.\nexport const TOOLS = {\n SELECT: 'select',\n PAN: 'pan',\n RECTANGLE: 'rectangle',\n CIRCLE: 'circle',\n LINE: 'line',\n ARROW: 'arrow',\n FREEHAND: 'freehand',\n TEXT: 'text',\n CODE: 'code',\n ERASER: 'eraser',\n LASER: 'laser',\n IMAGE: 'image',\n FRAME: 'frame',\n ICON: 'icon',\n};\n", "/* eslint-disable */\n/**\n * Engine-local keyboard shortcuts.\n *\n * These are the shortcuts that operate purely on engine state (tool switching,\n * shape deletion, selection, grouping, space-to-pan, escape-deselect). They\n * intentionally do NOT include product-level shortcuts (cloud save, modal\n * toggles, theme switches) \u2014 those belong to the consumer app.\n *\n * Usage:\n * import { installEngineShortcuts } from '@elixpo/lixsketch';\n * const uninstall = installEngineShortcuts(engine);\n * // later:\n * uninstall();\n *\n * Hosts can pass `options.onToast(message, tone)` to surface group/ungroup\n * confirmations, and `options.skipWhen(event)` to suppress shortcuts in\n * specific contexts (e.g. when the host's overlay is focused).\n */\n\n// NB: tool names are inlined as string literals below (rather than imported\n// from `./index.js`) to avoid a module-init cycle. EngineShortcuts.js and\n// index.js import each other; if SHORTCUT_MAP read TOOLS.PAN at the top\n// level, it would evaluate before index.js had populated TOOLS, throwing\n// \"TOOLS is undefined\" once esbuild splits this into a chunk.\n//\n// The values still match TOOLS.* exactly. If you change one, change both.\nexport const SHORTCUT_MAP = {\n h: 'pan',\n v: 'select',\n 1: 'select',\n r: 'rectangle',\n 2: 'rectangle',\n o: 'circle',\n 4: 'circle',\n a: 'arrow',\n 5: 'arrow',\n l: 'line',\n 6: 'line',\n p: 'freehand',\n 7: 'freehand',\n t: 'text',\n 8: 'text',\n 9: 'image',\n e: 'eraser',\n 0: 'eraser',\n i: 'icon',\n f: 'frame',\n k: 'laser',\n};\n\n// Mirror of TOOLS used inside this module's function bodies. Local copy\n// avoids the same module-init cycle while still letting callers compare\n// engine state against named constants instead of magic strings.\nconst TOOLS = {\n SELECT: 'select',\n PAN: 'pan',\n RECTANGLE: 'rectangle',\n CIRCLE: 'circle',\n LINE: 'line',\n ARROW: 'arrow',\n FREEHAND: 'freehand',\n TEXT: 'text',\n CODE: 'code',\n ERASER: 'eraser',\n LASER: 'laser',\n IMAGE: 'image',\n FRAME: 'frame',\n ICON: 'icon',\n};\n\nfunction isTypingTarget(target) {\n if (!target) return false;\n const tag = (target.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea') return true;\n if (target.isContentEditable) return true;\n return false;\n}\n\n/**\n * Install engine-local keyboard shortcuts on `document`.\n *\n * @param {object} engine - The SketchEngine instance (must have `setActiveTool`).\n * @param {object} [options]\n * @param {function} [options.onToast] - (message, { tone }) => void; called\n * for group/ungroup confirmations. No-op by default.\n * @param {function} [options.skipWhen] - (event) => boolean; return true to\n * skip shortcut handling for an event. Use to defer to your own\n * editor overlays. Default skips inputs/contenteditable only.\n * @param {function} [options.setActiveTool] - (tool) => void; override how\n * tool switching is dispatched. Useful when the consumer has its\n * own state store driving the engine \u2014 calling this keeps the UI\n * in sync without polling. Defaults to engine.setActiveTool.\n * @returns {function} uninstall function\n */\nexport function installEngineShortcuts(engine, options = {}) {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return () => { };\n }\n\n const onToast = typeof options.onToast === 'function' ? options.onToast : () => { };\n const skipWhen = typeof options.skipWhen === 'function' ? options.skipWhen : null;\n const customSetTool = typeof options.setActiveTool === 'function' ? options.setActiveTool : null;\n\n function setTool(tool) {\n if (customSetTool) { customSetTool(tool); return; }\n if (engine?.setActiveTool) engine.setActiveTool(tool);\n }\n\n function getActiveTool() {\n return engine?.activeTool || engine?.getActiveTool?.() || null;\n }\n\n function handleKeyDown(e) {\n const key = (e.key || '').toLowerCase();\n\n // Always check ctrl/cmd shortcuts first \u2014 they should fire even when\n // selection is empty, but skip when the user is typing.\n const isMod = e.ctrlKey || e.metaKey;\n\n if (isTypingTarget(e.target)) return;\n if (document.querySelector('.text-edit-overlay:not(.hidden)')) return;\n if (skipWhen && skipWhen(e)) return;\n\n if (isMod) {\n if (key === 'a' && !e.shiftKey) {\n e.preventDefault();\n setTool(TOOLS.SELECT);\n if (window.multiSelection && Array.isArray(window.shapes)) {\n window.multiSelection.clearSelection();\n window.shapes.forEach((shape) => window.multiSelection.addShape(shape));\n }\n return;\n }\n if (key === 'g' && !e.shiftKey) {\n e.preventDefault();\n try {\n const ms = window.multiSelection;\n const sel = ms?.selectedShapes;\n const targets = sel && sel.size > 1\n ? Array.from(sel)\n : (window.currentShape ? [window.currentShape] : []);\n if (targets.length > 1) {\n const newId = `g-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`;\n for (const s of targets) s.groupId = newId;\n if (typeof ms?.updateControls === 'function') ms.updateControls();\n onToast(`Grouped ${targets.length} shapes`, { tone: 'success' });\n }\n } catch (err) { console.warn('[EngineShortcuts] group failed:', err); }\n return;\n }\n if (key === 'g' && e.shiftKey) {\n e.preventDefault();\n try {\n const ms = window.multiSelection;\n const sel = ms?.selectedShapes;\n const targets = sel && sel.size > 0\n ? Array.from(sel)\n : (window.currentShape ? [window.currentShape] : []);\n const groupIds = new Set(targets.map((s) => s.groupId).filter(Boolean));\n if (groupIds.size > 0 && Array.isArray(window.shapes)) {\n let cleared = 0;\n for (const s of window.shapes) {\n if (s.groupId && groupIds.has(s.groupId)) { s.groupId = null; cleared++; }\n }\n if (typeof ms?.updateControls === 'function') ms.updateControls();\n onToast(`Ungrouped ${cleared} shapes`, { tone: 'success' });\n }\n } catch (err) { console.warn('[EngineShortcuts] ungroup failed:', err); }\n return;\n }\n // Ctrl+D = duplicate (engine-handled elsewhere \u2014 just preventDefault to\n // stop the browser's bookmark dialog).\n if (key === 'd') { e.preventDefault(); return; }\n return; // Other Ctrl combos are app-level; let the consumer handle them.\n }\n\n // Shift+1 = Fit to content\n if (e.shiftKey && (key === '1' || key === '!')) {\n e.preventDefault();\n if (typeof window.zoomFit === 'function') window.zoomFit();\n return;\n }\n\n // Delete / Backspace \u2014 remove selected shapes.\n if (e.key === 'Delete' || e.key === 'Backspace') {\n e.preventDefault();\n\n if (window.multiSelection?.selectedShapes?.size > 0) {\n if (typeof window.deleteSelectedShapes === 'function') {\n window.deleteSelectedShapes();\n }\n return;\n }\n\n if (window.currentShape) {\n const shape = window.currentShape;\n const shapes = window.shapes;\n const isFrame = shape.shapeName === 'frame';\n const isDiagramFrame = isFrame && !!shape._diagramType;\n\n // Issue #24 bug #7: regular frame \u2192 orphan children +\n // snapshot for undo (mirrors deleteSelectedShapes).\n let childSnapshot = null;\n if (isFrame && !isDiagramFrame) {\n childSnapshot = [...(shape.containedShapes || [])];\n for (const child of childSnapshot) {\n if (!child || child === shape) continue;\n const el = child.group || child.element;\n if (el) {\n if (shape.clipGroup && el.parentNode === shape.clipGroup) {\n shape.clipGroup.removeChild(el);\n }\n if (window.svg && el.parentNode !== window.svg) window.svg.appendChild(el);\n }\n child.parentFrame = null;\n delete child.isBeingMovedByFrame;\n }\n }\n\n if (shapes) {\n const idx = shapes.indexOf(shape);\n if (idx !== -1) shapes.splice(idx, 1);\n }\n if (typeof window.cleanupAttachments === 'function') {\n window.cleanupAttachments(shape);\n }\n if (shape.parentFrame && typeof shape.parentFrame.removeShapeFromFrame === 'function') {\n shape.parentFrame.removeShapeFromFrame(shape);\n }\n\n if (isFrame && !isDiagramFrame) {\n shape.containedShapes = [];\n if (shape.group && shape.group.parentNode) shape.group.parentNode.removeChild(shape.group);\n if (shape.clipGroup && shape.clipGroup.parentNode) shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n if (shape.clipPath && shape.clipPath.parentNode) shape.clipPath.parentNode.removeChild(shape.clipPath);\n } else {\n const el = shape.group || shape.element;\n if (el && el.parentNode) el.parentNode.removeChild(el);\n }\n\n if (typeof window.pushDeleteAction === 'function') {\n if (childSnapshot) window.pushDeleteAction(shape, { childSnapshot });\n else window.pushDeleteAction(shape);\n }\n window.currentShape = null;\n if (typeof window.disableAllSideBars === 'function') {\n window.disableAllSideBars();\n }\n }\n return;\n }\n\n // Tool-switching shortcuts (no modifier).\n if (!e.shiftKey && !e.altKey) {\n const tool = SHORTCUT_MAP[key];\n if (tool) {\n e.preventDefault();\n setTool(tool);\n return;\n }\n\n if (e.key === 'Escape') {\n // Engine-level deselect; consumer handles modal-close ordering.\n window.currentShape = null;\n if (typeof window.disableAllSideBars === 'function') {\n window.disableAllSideBars();\n }\n return;\n }\n }\n }\n\n // Space held = temporary pan. Releasing restores the previous tool.\n let spaceHeld = false;\n let toolBeforeSpace = null;\n\n function handleSpaceDown(e) {\n if (e.code !== 'Space' || spaceHeld) return;\n if (isTypingTarget(e.target)) return;\n if (skipWhen && skipWhen(e)) return;\n e.preventDefault();\n spaceHeld = true;\n const active = getActiveTool();\n if (active && active !== TOOLS.PAN) {\n toolBeforeSpace = active;\n setTool(TOOLS.PAN);\n }\n }\n\n function handleKeyUp(e) {\n if (e.code === 'Space' && spaceHeld) {\n spaceHeld = false;\n if (toolBeforeSpace) {\n setTool(toolBeforeSpace);\n toolBeforeSpace = null;\n }\n }\n }\n\n // Block browser zoom on Ctrl+wheel \u2014 engine's ZoomPan handles real zoom.\n function handleWheel(e) {\n if (e.ctrlKey || e.metaKey) e.preventDefault();\n }\n\n document.addEventListener('keydown', handleKeyDown);\n document.addEventListener('keydown', handleSpaceDown);\n document.addEventListener('keyup', handleKeyUp);\n document.addEventListener('wheel', handleWheel, { passive: false });\n\n return function uninstall() {\n document.removeEventListener('keydown', handleKeyDown);\n document.removeEventListener('keydown', handleSpaceDown);\n document.removeEventListener('keyup', handleKeyUp);\n document.removeEventListener('wheel', handleWheel);\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useCallback", "useEffect", "useRef", "useState", "create", "useRef", "useEffect", "useRef", "useEffect", "jsx", "jsxs", "jsx", "jsxs", "useState", "Fragment", "jsx", "jsxs", "useState", "t", "useState", "useRef", "useEffect", "jsx", "jsxs", "useState", "useRef", "useEffect", "useState", "useCallback", "jsx", "jsxs", "useState", "useCallback", "useState", "useCallback", "jsx", "jsxs", "STROKE_COLORS", "BG_COLORS", "FILLS", "ColorGrid", "useState", "useCallback", "useState", "useCallback", "jsx", "jsxs", "STROKE_COLORS", "ColorGrid", "useState", "useCallback", "useState", "useCallback", "Fragment", "jsx", "jsxs", "STROKE_COLORS", "ColorGrid", "useState", "useCallback", "useState", "useCallback", "jsx", "jsxs", "STROKE_COLORS", "ColorGrid", "useState", "useCallback", "t", "useState", "useCallback", "useEffect", "Fragment", "jsx", "jsxs", "useState", "useEffect", "useCallback", "useState", "useCallback", "useEffect", "Fragment", "jsx", "jsxs", "useState", "useEffect", "useCallback", "useState", "useEffect", "useCallback", "useRef", "jsx", "jsxs", "useState", "useRef", "useEffect", "useCallback", "useCallback", "jsx", "jsxs", "useCallback", "useState", "useEffect", "jsx", "jsxs", "useState", "useEffect", "useState", "useEffect", "useCallback", "useRef", "Fragment", "jsx", "jsxs", "useState", "useRef", "useCallback", "useEffect", "useState", "useEffect", "useRef", "useCallback", "jsx", "jsxs", "useState", "useRef", "useEffect", "useCallback", "useState", "useEffect", "useCallback", "useRef", "jsx", "jsxs", "useRef", "useCallback", "useEffect", "jsx", "jsxs", "jsx", "jsxs", "TOOL_SHORTCUTS", "ACTION_SHORTCUTS", "VIEW_SHORTCUTS", "useState", "useEffect", "useRef", "jsx", "jsxs", "useState", "useRef", "useEffect", "serializer", "useState", "useEffect", "useRef", "useCallback", "jsx", "jsxs", "getCleanSVG", "renderToCanvas", "useState", "useRef", "useCallback", "useEffect", "useState", "jsx", "jsxs", "ShortcutRow", "ShortcutSection", "useState", "useEffect", "jsx", "jsxs", "useEffect", "useCallback", "useEffect", "useRef", "useState", "jsx", "jsxs", "useState", "useRef", "useEffect", "useCallback", "jsx", "jsxs", "useRef", "useState", "useEffect", "TOOLS", "SHORTCUT_MAP", "TOOLS"]
|
|
7
7
|
}
|