From 2271ec8ebd323a9890809f692c9b74f6a62dab07 Mon Sep 17 00:00:00 2001 From: enzotar Date: Wed, 11 Mar 2026 18:42:08 -0700 Subject: [PATCH] init --- .turbo/turbo-check-types.log | 4 + CHANGELOG.md | 947 + PRINCIPLES.md | 73 + README.md | 1050 + TODO.md | 259 + canvas-demo/dist/assets/index-B9jgFSpQ.js | 174 + canvas-demo/dist/assets/index-BbLtK4h-.css | 1 + .../assets/inter-v12-latin-100-46Mq0mOp.woff | Bin 0 -> 21240 bytes .../assets/inter-v12-latin-100-BQDzDElq.woff2 | Bin 0 -> 16548 bytes .../assets/inter-v12-latin-200-BxfrU12A.woff2 | Bin 0 -> 17344 bytes .../assets/inter-v12-latin-200-DXfqWPZg.woff | Bin 0 -> 22236 bytes .../assets/inter-v12-latin-300-DEbyFmpd.woff2 | Bin 0 -> 17328 bytes .../assets/inter-v12-latin-300-f7r92Nkj.woff | Bin 0 -> 22156 bytes .../assets/inter-v12-latin-500-BQ2gQN_M.woff | Bin 0 -> 22516 bytes .../assets/inter-v12-latin-500-DfX5FI9E.woff2 | Bin 0 -> 17552 bytes .../assets/inter-v12-latin-600-BvOeHRLc.woff2 | Bin 0 -> 17660 bytes .../assets/inter-v12-latin-600-D01NXWOK.woff | Bin 0 -> 22636 bytes .../assets/inter-v12-latin-700-B5TOIllR.woff | Bin 0 -> 22684 bytes .../assets/inter-v12-latin-700-Bj1B9WKG.woff2 | Bin 0 -> 17784 bytes .../assets/inter-v12-latin-800-Bdy4lAMa.woff2 | Bin 0 -> 17764 bytes .../assets/inter-v12-latin-800-DFVvDWwT.woff | Bin 0 -> 22712 bytes .../assets/inter-v12-latin-900-CMga-52B.woff2 | Bin 0 -> 17176 bytes .../assets/inter-v12-latin-900-ORHAl5ZU.woff | Bin 0 -> 21980 bytes .../inter-v12-latin-regular-CahmJf_6.woff | Bin 0 -> 21420 bytes .../inter-v12-latin-regular-YtgfLPRn.woff2 | Bin 0 -> 16708 bytes canvas-demo/dist/index.html | 18 + canvas-demo/index.html | 17 + canvas-demo/node_modules/.bin/tsc | 21 + canvas-demo/node_modules/.bin/tsserver | 21 + canvas-demo/node_modules/.bin/vite | 21 + .../.vite/deps/@blocknote_core_locales.js | 8359 ++ .../.vite/deps/@blocknote_core_locales.js.map | 7 + .../.vite/deps/@blocknote_react.js | 275 + .../.vite/deps/@blocknote_react.js.map | 7 + .../.vite/deps/@blocknote_shadcn.js | 31908 ++++++ .../.vite/deps/@blocknote_shadcn.js.map | 7 + .../.vite/deps/@radix-ui_react-slot.js | 16 + .../.vite/deps/@radix-ui_react-slot.js.map | 7 + .../.vite/deps/@supabase_supabase-js.js | 12674 +++ .../.vite/deps/@supabase_supabase-js.js.map | 7 + .../.vite/deps/@tanstack_react-query.js | 3665 + .../.vite/deps/@tanstack_react-query.js.map | 7 + .../.vite/deps/@use-gesture_react.js | 1920 + .../.vite/deps/@use-gesture_react.js.map | 7 + .../node_modules/.vite/deps/_metadata.json | 181 + .../node_modules/.vite/deps/chunk-4B2QHNJT.js | 65 + .../.vite/deps/chunk-4B2QHNJT.js.map | 7 + .../node_modules/.vite/deps/chunk-5DYWO4C6.js | 51 + .../.vite/deps/chunk-5DYWO4C6.js.map | 7 + .../node_modules/.vite/deps/chunk-5QTNICOS.js | 471 + .../.vite/deps/chunk-5QTNICOS.js.map | 7 + .../node_modules/.vite/deps/chunk-B3JW6XJO.js | 539 + .../.vite/deps/chunk-B3JW6XJO.js.map | 7 + .../node_modules/.vite/deps/chunk-DZXNXIW7.js | 20220 ++++ .../.vite/deps/chunk-DZXNXIW7.js.map | 7 + .../node_modules/.vite/deps/chunk-HZEBPUXZ.js | 884 + .../.vite/deps/chunk-HZEBPUXZ.js.map | 7 + .../node_modules/.vite/deps/chunk-KLRFSZSC.js | 167 + .../.vite/deps/chunk-KLRFSZSC.js.map | 7 + .../node_modules/.vite/deps/chunk-LRUX6XQC.js | 280 + .../.vite/deps/chunk-LRUX6XQC.js.map | 7 + .../node_modules/.vite/deps/chunk-PT7F464S.js | 81390 ++++++++++++++++ .../.vite/deps/chunk-PT7F464S.js.map | 7 + .../node_modules/.vite/deps/chunk-RU4TY2CQ.js | 410 + .../.vite/deps/chunk-RU4TY2CQ.js.map | 7 + .../node_modules/.vite/deps/chunk-SIU35MPB.js | 21 + .../.vite/deps/chunk-SIU35MPB.js.map | 7 + .../node_modules/.vite/deps/chunk-T3SJLYUH.js | 1004 + .../.vite/deps/chunk-T3SJLYUH.js.map | 7 + .../node_modules/.vite/deps/chunk-YAGB2RBV.js | 292 + .../.vite/deps/chunk-YAGB2RBV.js.map | 7 + .../.vite/deps/class-variance-authority.js | 10 + .../deps/class-variance-authority.js.map | 7 + canvas-demo/node_modules/.vite/deps/clsx.js | 9 + .../node_modules/.vite/deps/clsx.js.map | 7 + .../node_modules/.vite/deps/d3-force.js | 975 + .../node_modules/.vite/deps/d3-force.js.map | 7 + canvas-demo/node_modules/.vite/deps/debug.js | 5 + .../node_modules/.vite/deps/debug.js.map | 7 + .../node_modules/.vite/deps/graphology.js | 4624 + .../node_modules/.vite/deps/graphology.js.map | 7 + canvas-demo/node_modules/.vite/deps/jotai.js | 24 + .../node_modules/.vite/deps/jotai.js.map | 7 + .../node_modules/.vite/deps/jotai_utils.js | 835 + .../.vite/deps/jotai_utils.js.map | 7 + .../node_modules/.vite/deps/lucide-react.js | 29680 ++++++ .../.vite/deps/lucide-react.js.map | 7 + .../.vite/deps/module-4GIHSJCO.js | 2615 + .../.vite/deps/module-4GIHSJCO.js.map | 7 + .../.vite/deps/native-JYCSL3WK.js | 16 + .../.vite/deps/native-JYCSL3WK.js.map | 7 + .../node_modules/.vite/deps/package.json | 3 + .../node_modules/.vite/deps/react-dom.js | 6 + .../node_modules/.vite/deps/react-dom.js.map | 7 + .../.vite/deps/react-dom_client.js | 7 + .../.vite/deps/react-dom_client.js.map | 7 + canvas-demo/node_modules/.vite/deps/react.js | 5 + .../node_modules/.vite/deps/react.js.map | 7 + .../.vite/deps/react_jsx-dev-runtime.js | 278 + .../.vite/deps/react_jsx-dev-runtime.js.map | 7 + .../.vite/deps/react_jsx-runtime.js | 6 + .../.vite/deps/react_jsx-runtime.js.map | 7 + .../node_modules/.vite/deps/tailwind-merge.js | 3263 + .../.vite/deps/tailwind-merge.js.map | 7 + canvas-demo/node_modules/@blinksgg/canvas | 1 + canvas-demo/node_modules/@radix-ui/react-slot | 1 + .../node_modules/@supabase/supabase-js | 1 + canvas-demo/node_modules/@tailwindcss/vite | 1 + canvas-demo/node_modules/@types/react | 1 + canvas-demo/node_modules/@types/react-dom | 1 + canvas-demo/node_modules/@use-gesture/react | 1 + canvas-demo/node_modules/@vitejs/plugin-react | 1 + .../node_modules/class-variance-authority | 1 + canvas-demo/node_modules/clsx | 1 + canvas-demo/node_modules/graphology | 1 + canvas-demo/node_modules/jotai | 1 + canvas-demo/node_modules/lucide-react | 1 + canvas-demo/node_modules/react | 1 + canvas-demo/node_modules/react-dom | 1 + canvas-demo/node_modules/tailwind-merge | 1 + canvas-demo/node_modules/tailwindcss | 1 + canvas-demo/node_modules/typescript | 1 + canvas-demo/node_modules/vite | 1 + canvas-demo/package.json | 34 + canvas-demo/src/App.tsx | 843 + canvas-demo/src/GestureV2Demo.tsx | 1248 + canvas-demo/src/components/ui/badge.tsx | 32 + canvas-demo/src/components/ui/button.tsx | 52 + canvas-demo/src/components/ui/separator.tsx | 30 + canvas-demo/src/index.css | 48 + canvas-demo/src/lib/utils.ts | 6 + canvas-demo/src/main.tsx | 27 + canvas-demo/tsconfig.json | 29 + canvas-demo/vite.config.ts | 14 + dist/commands/index.d.mts | 698 + dist/commands/index.d.ts | 698 + dist/commands/index.js | 7703 ++ dist/commands/index.js.map | 1 + dist/commands/index.mjs | 7679 ++ dist/commands/index.mjs.map | 1 + dist/core/index.js | 5280 + dist/core/index.js.map | 1 + dist/core/index.mjs | 5249 + dist/core/index.mjs.map | 1 + dist/db/index.d.mts | 343 + dist/db/index.d.ts | 343 + dist/db/index.js | 1363 + dist/db/index.js.map | 1 + dist/db/index.mjs | 1332 + dist/db/index.mjs.map | 1 + dist/gestures/index.d.mts | 954 + dist/gestures/index.d.ts | 954 + dist/gestures/index.js | 7397 ++ dist/gestures/index.js.map | 1 + dist/gestures/index.mjs | 7366 ++ dist/gestures/index.mjs.map | 1 + dist/hooks/index.d.mts | 1766 + dist/hooks/index.d.ts | 1766 + dist/hooks/index.js | 6491 ++ dist/hooks/index.js.map | 1 + dist/hooks/index.mjs | 6460 ++ dist/hooks/index.mjs.map | 1 + dist/index.js | 25796 +++++ dist/index.js.map | 1 + dist/index.mjs | 25772 +++++ dist/index.mjs.map | 1 + dist/nodes/index.d.mts | 172 + dist/nodes/index.d.ts | 172 + dist/nodes/index.js | 192 + dist/nodes/index.js.map | 1 + dist/nodes/index.mjs | 159 + dist/nodes/index.mjs.map | 1 + dist/utils/index.js | 578 + dist/utils/index.js.map | 1 + dist/utils/index.mjs | 545 + dist/utils/index.mjs.map | 1 + docs/api-stability.md | 211 + docs/arch-gesture-system-v2.md | 344 + docs/migration-v1.md | 147 + docs/plan-gesture-system-v2.md | 502 + docs/plan-keyboard-gesture-integration.md | 96 + docs/plan-react19-canvas-optimization.md | 213 + docs/plan-v1.0.md | 226 + llms.txt | 1451 + migrations/001_create_tables.sql | 189 + node_modules/.bin/esbuild | 21 + node_modules/.bin/jiti | 21 + node_modules/.bin/tsc | 21 + node_modules/.bin/tsserver | 21 + node_modules/.bin/tsup | 21 + node_modules/.bin/tsup-node | 21 + node_modules/.bin/tsx | 21 + node_modules/.bin/vitest | 21 + node_modules/.bin/yaml | 21 + .../results.json | 1 + node_modules/@babel/core | 1 + node_modules/@babel/preset-react | 1 + node_modules/@babel/preset-typescript | 1 + node_modules/@blocknote/core | 1 + node_modules/@blocknote/react | 1 + node_modules/@blocknote/shadcn | 1 + node_modules/@supabase/supabase-js | 1 + node_modules/@tanstack/react-query | 1 + node_modules/@types/d3-force | 1 + node_modules/@types/debug | 1 + node_modules/@types/node | 1 + node_modules/@types/react | 1 + node_modules/@types/react-dom | 1 + node_modules/@use-gesture/react | 1 + node_modules/babel-plugin-react-compiler | 1 + node_modules/d3-force | 1 + node_modules/debug | 1 + node_modules/esbuild-plugin-babel | 1 + node_modules/graphology | 1 + node_modules/graphology-types | 1 + node_modules/jotai | 1 + node_modules/jotai-tanstack-query | 1 + node_modules/jsdom | 1 + node_modules/react | 1 + node_modules/react-dom | 1 + node_modules/tsup | 1 + node_modules/typescript | 1 + node_modules/vitest | 1 + package.json | 133 + setup_forgejo.sh | 43 + src/__tests__/action-executor.test.ts | 87 + src/__tests__/action-registry.test.ts | 94 + src/__tests__/action-types-enums.test.ts | 71 + src/__tests__/actions-node.test.ts | 56 + src/__tests__/actions-viewport.test.ts | 40 + src/__tests__/adapter-conformance.test.ts | 179 + src/__tests__/alignment-guides.test.ts | 65 + src/__tests__/animated-layout.test.ts | 53 + src/__tests__/built-in-actions.test.ts | 132 + src/__tests__/canvas-api.test.ts | 258 + .../canvas-serializer-roundtrip.test.ts | 161 + .../canvas-serializer-validation.test.ts | 60 + src/__tests__/canvas-serializer.test.ts | 380 + src/__tests__/canvas-styles.test.ts | 45 + src/__tests__/clipboard-commands.test.ts | 74 + src/__tests__/clipboard-store.test.ts | 135 + src/__tests__/command-executor.test.ts | 51 + src/__tests__/command-line-store.test.ts | 140 + src/__tests__/command-registry.test.ts | 87 + src/__tests__/command-store.test.ts | 44 + src/__tests__/commands-executor.test.ts | 77 + src/__tests__/commands-registry.test.ts | 127 + src/__tests__/commands-store.test.ts | 175 + src/__tests__/component-registry.test.ts | 63 + src/__tests__/components/Canvas.test.tsx | 97 + src/__tests__/components/GroupNode.test.tsx | 163 + src/__tests__/components/Minimap.test.tsx | 111 + src/__tests__/components/Node.test.tsx | 210 + .../components/SelectionOverlay.test.tsx | 96 + src/__tests__/components/Viewport.test.tsx | 115 + src/__tests__/contexts.test.ts | 27 + src/__tests__/debug.test.ts | 48 + src/__tests__/dispatcher.test.ts | 100 + src/__tests__/drag-state-machine.test.ts | 89 + src/__tests__/edge-animations.test.ts | 108 + src/__tests__/edge-label-editing.test.ts | 103 + src/__tests__/edge-path-calculators.test.ts | 130 + src/__tests__/edge-path-registry.test.ts | 73 + src/__tests__/edge-rerouting.test.ts | 245 + src/__tests__/event-types-enums.test.ts | 67 + src/__tests__/external-keyboard-store.test.ts | 16 + src/__tests__/gesture-classification.test.ts | 46 + src/__tests__/gesture-configs.test.ts | 43 + src/__tests__/gesture-dispatcher.test.ts | 123 + src/__tests__/gesture-inertia.test.ts | 101 + src/__tests__/gesture-mapper.test.ts | 124 + src/__tests__/gesture-normalize.test.ts | 49 + src/__tests__/gesture-provider-utils.test.ts | 98 + src/__tests__/gesture-rule-store.test.ts | 125 + src/__tests__/gesture-rules-defaults.test.ts | 73 + src/__tests__/gesture-rules-types.test.ts | 57 + src/__tests__/gesture-rules.test.ts | 379 + src/__tests__/gesture-specificity.test.ts | 138 + src/__tests__/graph-derived-atoms.test.ts | 83 + src/__tests__/graph-derived.test.ts | 130 + .../graph-mutations-advanced.test.ts | 136 + src/__tests__/graph-mutations-edges.test.ts | 109 + src/__tests__/graph-mutations.test.ts | 120 + src/__tests__/graph-position.test.ts | 86 + src/__tests__/graph-store.test.ts | 540 + src/__tests__/grid-layout.test.ts | 219 + src/__tests__/group-commands.test.ts | 68 + src/__tests__/group-store-utils.test.ts | 69 + src/__tests__/group-store.test.ts | 133 + src/__tests__/history-actions.test.ts | 138 + src/__tests__/history-store.test.ts | 124 + src/__tests__/history-undo-operations.test.ts | 193 + src/__tests__/hit-test.test.ts | 110 + src/__tests__/input-action-helpers.test.ts | 316 + src/__tests__/input-classifier.test.ts | 137 + src/__tests__/input-store.test.ts | 159 + src/__tests__/interaction-store.test.ts | 127 + src/__tests__/keyboard-bindings.test.ts | 40 + src/__tests__/keyboard-contexts.test.ts | 46 + src/__tests__/keyboard-shortcuts.test.ts | 32 + src/__tests__/layout.test.ts | 104 + src/__tests__/locked-node-store.test.ts | 102 + src/__tests__/merge-nodes.test.ts | 158 + src/__tests__/minimap-utils.test.ts | 76 + src/__tests__/modifier-helpers.test.ts | 71 + src/__tests__/mutation-queue.test.ts | 68 + src/__tests__/nest-on-drop.test.ts | 131 + src/__tests__/nested-group-drag.test.ts | 111 + src/__tests__/perf.test.ts | 71 + src/__tests__/plugin-registry.test.ts | 106 + src/__tests__/plugin-types.test.ts | 50 + src/__tests__/pointer-bindings-v2.test.ts | 41 + src/__tests__/pointer-contexts.test.ts | 73 + src/__tests__/port-types.test.ts | 120 + src/__tests__/reduced-motion-store.test.ts | 23 + src/__tests__/search-store.test.ts | 246 + src/__tests__/selection-path-store.test.ts | 270 + src/__tests__/selection-store.test.ts | 238 + src/__tests__/serialization-commands.test.ts | 38 + src/__tests__/settings-presets.test.ts | 64 + src/__tests__/settings-store.test.ts | 90 + src/__tests__/settings-types.test.ts | 80 + src/__tests__/setup.ts | 10 + src/__tests__/snap-store.test.ts | 145 + src/__tests__/spatial-index.test.ts | 143 + src/__tests__/split-node.test.ts | 160 + src/__tests__/storage-adapter.test.ts | 81 + src/__tests__/store-atoms.test.ts | 94 + src/__tests__/sync-store.test.ts | 139 + src/__tests__/timed-state-runner.test.ts | 67 + src/__tests__/timed-state.test.ts | 88 + src/__tests__/toast-store.test.ts | 48 + src/__tests__/tree-layout.test.ts | 254 + src/__tests__/useActionExecutor-hook.test.ts | 48 + src/__tests__/useCanvasGraph.test.ts | 67 + src/__tests__/useCanvasHistory.test.ts | 67 + src/__tests__/useCanvasSelection.test.ts | 75 + src/__tests__/useCanvasSettings.test.ts | 72 + src/__tests__/useCanvasViewport.test.ts | 53 + src/__tests__/useForceLayout-atoms.test.ts | 160 + src/__tests__/useInertia.test.ts | 38 + src/__tests__/useLayout-hook.test.ts | 43 + src/__tests__/useNodeDrag-atoms.test.ts | 229 + src/__tests__/useNodeResize-atoms.test.ts | 213 + src/__tests__/usePinchZoom.test.ts | 88 + src/__tests__/usePlugin-hook.test.ts | 60 + src/__tests__/useVirtualization.test.ts | 51 + src/__tests__/useWheelZoom.test.ts | 101 + src/__tests__/viewport-commands.test.ts | 57 + src/__tests__/viewport-store-actions.test.ts | 62 + src/__tests__/viewport-store.test.ts | 306 + src/__tests__/virtualization-store.test.ts | 258 + src/__tests__/zoom-transition.test.ts | 209 + src/commands/CommandProvider.tsx | 315 + src/commands/builtins/clipboard-commands.ts | 178 + src/commands/builtins/group-commands.ts | 140 + src/commands/builtins/history-commands.ts | 46 + src/commands/builtins/index.ts | 101 + src/commands/builtins/layout-commands.ts | 63 + src/commands/builtins/merge-commands.ts | 38 + src/commands/builtins/search-commands.ts | 58 + src/commands/builtins/selection-commands.ts | 69 + .../builtins/serialization-commands.ts | 98 + src/commands/builtins/viewport-commands.ts | 102 + src/commands/executor.ts | 95 + src/commands/index.ts | 96 + src/commands/keyboard.ts | 39 + src/commands/registry.ts | 243 + src/commands/store-atoms.ts | 91 + src/commands/store.ts | 287 + src/commands/types.ts | 234 + src/components/AlignmentGuides.tsx | 78 + src/components/Canvas.tsx | 127 + src/components/CanvasAnimations.tsx | 76 + src/components/CanvasToast.tsx | 59 + src/components/ComboboxOption.tsx | 96 + src/components/ComboboxSearch.tsx | 79 + src/components/CommandFeedbackOverlay.tsx | 237 + .../CommandLine/CollectorInputPhase.tsx | 69 + .../CommandLine/CollectorSelectInput.tsx | 92 + .../CommandLine/CommandInputCollector.tsx | 206 + src/components/CommandLine/CommandLine.tsx | 294 + src/components/CommandLine/CommandSearch.tsx | 98 + src/components/CommandLine/index.ts | 7 + src/components/ConnectedNode.tsx | 61 + src/components/ConnectedNodeRenderer.tsx | 89 + src/components/ContextMenuAction.tsx | 75 + src/components/ContextMenuDivider.tsx | 41 + src/components/EdgeLabel.tsx | 65 + src/components/EdgeLabelEditor.tsx | 110 + src/components/EdgeOverlay.tsx | 323 + src/components/EdgePath.tsx | 68 + src/components/EdgePreviewLine.tsx | 124 + src/components/EdgeRenderer.tsx | 268 + src/components/Grid.tsx | 202 + src/components/GroupNode.tsx | 118 + src/components/LockedNodeOverlay.tsx | 260 + src/components/Minimap.tsx | 257 + src/components/Node.tsx | 227 + src/components/NodeContextMenu.tsx | 329 + src/components/NodeErrorBoundary.tsx | 103 + src/components/NodePorts.tsx | 115 + src/components/NodeRenderer.tsx | 129 + src/components/NodeTypeCombobox.tsx | 366 + src/components/PortBar.tsx | 152 + src/components/PortHandle.tsx | 132 + src/components/ResizeHandle.tsx | 140 + src/components/SelectionOverlay.tsx | 92 + src/components/SettingsEventMap.tsx | 122 + src/components/SettingsPanel.tsx | 137 + src/components/SettingsPresets.tsx | 101 + .../TouchActionButton/RadialMenu.tsx | 201 + src/components/TouchActionButton/icons.tsx | 70 + src/components/TouchActionButton/index.tsx | 291 + src/components/Viewport.tsx | 105 + src/components/ViewportControls.tsx | 192 + src/components/index.ts | 65 + src/components/minimap-utils.ts | 99 + src/core/action-executor.ts | 261 + src/core/action-registry.ts | 122 + src/core/action-types.ts | 171 + src/core/actions-node.ts | 203 + src/core/actions-viewport.ts | 111 + src/core/built-in-actions.ts | 42 + src/core/canvas-api.ts | 193 + src/core/canvas-serializer.ts | 371 + src/core/clipboard-store.ts | 306 + src/core/event-types.ts | 124 + src/core/external-keyboard-store.ts | 40 + src/core/gesture-resolver.ts | 62 + src/core/gesture-rule-store.ts | 147 + src/core/gesture-rules-defaults.ts | 190 + src/core/gesture-rules-types.ts | 119 + src/core/gesture-rules.ts | 209 + src/core/graph-derived.ts | 298 + src/core/graph-mutations-advanced.ts | 144 + src/core/graph-mutations-edges.ts | 157 + src/core/graph-mutations.ts | 287 + src/core/graph-position.ts | 119 + src/core/graph-store.ts | 65 + src/core/group-store.ts | 363 + src/core/history-actions.ts | 158 + src/core/history-store.ts | 250 + src/core/history-types.ts | 49 + src/core/index.ts | 99 + src/core/input-classifier.ts | 206 + src/core/input-store.ts | 137 + src/core/interaction-store.ts | 183 + src/core/locked-node-store.ts | 97 + src/core/node-type-registry.tsx | 132 + src/core/perf.ts | 75 + src/core/plugin-registry.ts | 339 + src/core/plugin-types.ts | 125 + src/core/port-types.ts | 231 + src/core/reduced-motion-store.ts | 44 + src/core/search-store.ts | 202 + src/core/selection-path-store.ts | 162 + src/core/selection-store.ts | 176 + src/core/settings-presets.ts | 81 + src/core/settings-state-types.ts | 75 + src/core/settings-store.ts | 293 + src/core/settings-types.ts | 38 + src/core/snap-store.ts | 181 + src/core/spatial-index.ts | 221 + src/core/sync-store.ts | 208 + src/core/toast-store.ts | 29 + src/core/types.ts | 230 + src/core/viewport-store.ts | 333 + src/core/virtualization-store.ts | 195 + src/db/adapter.ts | 224 + src/db/hooks/index.ts | 13 + src/db/hooks/keys.ts | 13 + src/db/hooks/useCreateEdge.ts | 70 + src/db/hooks/useCreateNode.ts | 70 + src/db/hooks/useDeleteEdge.ts | 64 + src/db/hooks/useDeleteNode.ts | 64 + src/db/hooks/useGraphEdges.ts | 26 + src/db/hooks/useGraphNodes.ts | 26 + src/db/hooks/useUpdateEdge.ts | 73 + src/db/hooks/useUpdateNode.ts | 73 + src/db/index.ts | 30 + src/db/provider.tsx | 84 + src/db/queries/edges.ts | 83 + src/db/queries/index.ts | 6 + src/db/queries/nodes.ts | 104 + src/db/supabase-adapter.ts | 151 + src/gestures/GestureProvider.tsx | 215 + src/gestures/__tests__/inertia.test.ts | 85 + src/gestures/__tests__/mapper.test.ts | 252 + src/gestures/__tests__/palm-rejection.test.ts | 94 + src/gestures/__tests__/specificity.test.ts | 154 + src/gestures/__tests__/timed-state.test.ts | 114 + src/gestures/contexts.ts | 100 + src/gestures/dispatcher.ts | 132 + src/gestures/gesture-classification.ts | 120 + src/gestures/gesture-provider-utils.ts | 204 + src/gestures/index.ts | 111 + src/gestures/inertia.ts | 138 + src/gestures/input-action-helpers.ts | 227 + src/gestures/keyboard-bindings.ts | 194 + src/gestures/keyboard-contexts.ts | 200 + src/gestures/mapper.ts | 181 + src/gestures/modifier-helpers.ts | 85 + src/gestures/normalize.ts | 73 + src/gestures/pointer-bindings.ts | 76 + src/gestures/pointer-contexts.ts | 125 + src/gestures/specificity.ts | 158 + src/gestures/timed-state-runner.ts | 88 + src/gestures/timed-state.ts | 159 + src/gestures/types.ts | 242 + src/gestures/useCanvasGestures.ts | 440 + src/gestures/useGestureSystem.ts | 106 + src/gestures/useGuardContext.ts | 70 + src/gestures/useInertia.ts | 172 + src/gestures/useInputModeGestureContext.ts | 49 + src/gestures/useNodeGestures.ts | 222 + src/gestures/usePinchZoom.ts | 137 + src/gestures/useRegisterInputActions.ts | 259 + src/gestures/useWheelZoom.ts | 97 + src/hooks/drag-types.ts | 30 + src/hooks/index.ts | 63 + src/hooks/useActionExecutor.ts | 93 + src/hooks/useAnimatedLayout.ts | 128 + src/hooks/useArrowKeyNavigation.ts | 18 + src/hooks/useCanvasDrag.ts | 40 + src/hooks/useCanvasGraph.ts | 61 + src/hooks/useCanvasHistory.ts | 114 + src/hooks/useCanvasSelection.ts | 54 + src/hooks/useCanvasSettings.ts | 200 + src/hooks/useCanvasViewport.ts | 82 + src/hooks/useCommandLine.ts | 77 + src/hooks/useDragConstraints.ts | 69 + src/hooks/useDragLifecycleEffect.ts | 50 + src/hooks/useDragStateMachine.ts | 93 + src/hooks/useForceLayout.ts | 239 + src/hooks/useGestureResolver.ts | 37 + src/hooks/useGridLayout.ts | 85 + src/hooks/useLayout.ts | 90 + src/hooks/useNodeDrag.ts | 316 + src/hooks/useNodeResize.ts | 213 + src/hooks/useNodeSelection.ts | 32 + src/hooks/usePlugin.ts | 89 + src/hooks/useSelectionChangeEffect.ts | 26 + src/hooks/useSplitGesture.ts | 100 + src/hooks/useTapGesture.ts | 127 + src/hooks/useTreeLayout.ts | 133 + src/hooks/useViewportChangeEffect.ts | 41 + src/hooks/useVirtualization.ts | 82 + src/hooks/useZoomTransition.ts | 106 + src/index.ts | 57 + src/nodes/NoteNode/NoteNode.tsx | 184 + src/nodes/NoteNode/index.ts | 6 + src/nodes/NoteNode/types.ts | 75 + src/nodes/index.ts | 24 + src/providers/CanvasProvider.tsx | 139 + src/providers/CanvasStyleProvider.tsx | 229 + src/providers/index.ts | 14 + src/styles/canvas-styles.ts | 176 + src/styles/index.ts | 16 + src/utils/component-registry.tsx | 137 + src/utils/debug.ts | 74 + src/utils/edge-path-calculators.ts | 207 + src/utils/edge-path-registry.ts | 56 + src/utils/gesture-configs.ts | 81 + src/utils/hit-test.ts | 81 + src/utils/index.ts | 67 + src/utils/layout.ts | 157 + src/utils/mutation-queue.ts | 62 + tsconfig.json | 27 + tsup.config.ts | 83 + vitest.config.ts | 32 + 571 files changed, 376968 insertions(+) create mode 100644 .turbo/turbo-check-types.log create mode 100644 CHANGELOG.md create mode 100644 PRINCIPLES.md create mode 100644 README.md create mode 100644 TODO.md create mode 100644 canvas-demo/dist/assets/index-B9jgFSpQ.js create mode 100644 canvas-demo/dist/assets/index-BbLtK4h-.css create mode 100644 canvas-demo/dist/assets/inter-v12-latin-100-46Mq0mOp.woff create mode 100644 canvas-demo/dist/assets/inter-v12-latin-100-BQDzDElq.woff2 create mode 100644 canvas-demo/dist/assets/inter-v12-latin-200-BxfrU12A.woff2 create mode 100644 canvas-demo/dist/assets/inter-v12-latin-200-DXfqWPZg.woff create mode 100644 canvas-demo/dist/assets/inter-v12-latin-300-DEbyFmpd.woff2 create mode 100644 canvas-demo/dist/assets/inter-v12-latin-300-f7r92Nkj.woff create mode 100644 canvas-demo/dist/assets/inter-v12-latin-500-BQ2gQN_M.woff create mode 100644 canvas-demo/dist/assets/inter-v12-latin-500-DfX5FI9E.woff2 create mode 100644 canvas-demo/dist/assets/inter-v12-latin-600-BvOeHRLc.woff2 create mode 100644 canvas-demo/dist/assets/inter-v12-latin-600-D01NXWOK.woff create mode 100644 canvas-demo/dist/assets/inter-v12-latin-700-B5TOIllR.woff create mode 100644 canvas-demo/dist/assets/inter-v12-latin-700-Bj1B9WKG.woff2 create mode 100644 canvas-demo/dist/assets/inter-v12-latin-800-Bdy4lAMa.woff2 create mode 100644 canvas-demo/dist/assets/inter-v12-latin-800-DFVvDWwT.woff create mode 100644 canvas-demo/dist/assets/inter-v12-latin-900-CMga-52B.woff2 create mode 100644 canvas-demo/dist/assets/inter-v12-latin-900-ORHAl5ZU.woff create mode 100644 canvas-demo/dist/assets/inter-v12-latin-regular-CahmJf_6.woff create mode 100644 canvas-demo/dist/assets/inter-v12-latin-regular-YtgfLPRn.woff2 create mode 100644 canvas-demo/dist/index.html create mode 100644 canvas-demo/index.html create mode 100755 canvas-demo/node_modules/.bin/tsc create mode 100755 canvas-demo/node_modules/.bin/tsserver create mode 100755 canvas-demo/node_modules/.bin/vite create mode 100644 canvas-demo/node_modules/.vite/deps/@blocknote_core_locales.js create mode 100644 canvas-demo/node_modules/.vite/deps/@blocknote_core_locales.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/@blocknote_react.js create mode 100644 canvas-demo/node_modules/.vite/deps/@blocknote_react.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/@blocknote_shadcn.js create mode 100644 canvas-demo/node_modules/.vite/deps/@blocknote_shadcn.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/@radix-ui_react-slot.js create mode 100644 canvas-demo/node_modules/.vite/deps/@radix-ui_react-slot.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/@supabase_supabase-js.js create mode 100644 canvas-demo/node_modules/.vite/deps/@supabase_supabase-js.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/@tanstack_react-query.js create mode 100644 canvas-demo/node_modules/.vite/deps/@tanstack_react-query.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/@use-gesture_react.js create mode 100644 canvas-demo/node_modules/.vite/deps/@use-gesture_react.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/_metadata.json create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-4B2QHNJT.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-4B2QHNJT.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-5DYWO4C6.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-5DYWO4C6.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-5QTNICOS.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-5QTNICOS.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-B3JW6XJO.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-B3JW6XJO.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-DZXNXIW7.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-DZXNXIW7.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-HZEBPUXZ.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-HZEBPUXZ.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-KLRFSZSC.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-KLRFSZSC.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-LRUX6XQC.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-LRUX6XQC.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-PT7F464S.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-PT7F464S.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-RU4TY2CQ.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-RU4TY2CQ.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-SIU35MPB.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-SIU35MPB.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-T3SJLYUH.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-T3SJLYUH.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-YAGB2RBV.js create mode 100644 canvas-demo/node_modules/.vite/deps/chunk-YAGB2RBV.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/class-variance-authority.js create mode 100644 canvas-demo/node_modules/.vite/deps/class-variance-authority.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/clsx.js create mode 100644 canvas-demo/node_modules/.vite/deps/clsx.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/d3-force.js create mode 100644 canvas-demo/node_modules/.vite/deps/d3-force.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/debug.js create mode 100644 canvas-demo/node_modules/.vite/deps/debug.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/graphology.js create mode 100644 canvas-demo/node_modules/.vite/deps/graphology.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/jotai.js create mode 100644 canvas-demo/node_modules/.vite/deps/jotai.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/jotai_utils.js create mode 100644 canvas-demo/node_modules/.vite/deps/jotai_utils.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/lucide-react.js create mode 100644 canvas-demo/node_modules/.vite/deps/lucide-react.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/module-4GIHSJCO.js create mode 100644 canvas-demo/node_modules/.vite/deps/module-4GIHSJCO.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/native-JYCSL3WK.js create mode 100644 canvas-demo/node_modules/.vite/deps/native-JYCSL3WK.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/package.json create mode 100644 canvas-demo/node_modules/.vite/deps/react-dom.js create mode 100644 canvas-demo/node_modules/.vite/deps/react-dom.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/react-dom_client.js create mode 100644 canvas-demo/node_modules/.vite/deps/react-dom_client.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/react.js create mode 100644 canvas-demo/node_modules/.vite/deps/react.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/react_jsx-dev-runtime.js create mode 100644 canvas-demo/node_modules/.vite/deps/react_jsx-dev-runtime.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/react_jsx-runtime.js create mode 100644 canvas-demo/node_modules/.vite/deps/react_jsx-runtime.js.map create mode 100644 canvas-demo/node_modules/.vite/deps/tailwind-merge.js create mode 100644 canvas-demo/node_modules/.vite/deps/tailwind-merge.js.map create mode 120000 canvas-demo/node_modules/@blinksgg/canvas create mode 120000 canvas-demo/node_modules/@radix-ui/react-slot create mode 120000 canvas-demo/node_modules/@supabase/supabase-js create mode 120000 canvas-demo/node_modules/@tailwindcss/vite create mode 120000 canvas-demo/node_modules/@types/react create mode 120000 canvas-demo/node_modules/@types/react-dom create mode 120000 canvas-demo/node_modules/@use-gesture/react create mode 120000 canvas-demo/node_modules/@vitejs/plugin-react create mode 120000 canvas-demo/node_modules/class-variance-authority create mode 120000 canvas-demo/node_modules/clsx create mode 120000 canvas-demo/node_modules/graphology create mode 120000 canvas-demo/node_modules/jotai create mode 120000 canvas-demo/node_modules/lucide-react create mode 120000 canvas-demo/node_modules/react create mode 120000 canvas-demo/node_modules/react-dom create mode 120000 canvas-demo/node_modules/tailwind-merge create mode 120000 canvas-demo/node_modules/tailwindcss create mode 120000 canvas-demo/node_modules/typescript create mode 120000 canvas-demo/node_modules/vite create mode 100644 canvas-demo/package.json create mode 100644 canvas-demo/src/App.tsx create mode 100644 canvas-demo/src/GestureV2Demo.tsx create mode 100644 canvas-demo/src/components/ui/badge.tsx create mode 100644 canvas-demo/src/components/ui/button.tsx create mode 100644 canvas-demo/src/components/ui/separator.tsx create mode 100644 canvas-demo/src/index.css create mode 100644 canvas-demo/src/lib/utils.ts create mode 100644 canvas-demo/src/main.tsx create mode 100644 canvas-demo/tsconfig.json create mode 100644 canvas-demo/vite.config.ts create mode 100644 dist/commands/index.d.mts create mode 100644 dist/commands/index.d.ts create mode 100644 dist/commands/index.js create mode 100644 dist/commands/index.js.map create mode 100644 dist/commands/index.mjs create mode 100644 dist/commands/index.mjs.map create mode 100644 dist/core/index.js create mode 100644 dist/core/index.js.map create mode 100644 dist/core/index.mjs create mode 100644 dist/core/index.mjs.map create mode 100644 dist/db/index.d.mts create mode 100644 dist/db/index.d.ts create mode 100644 dist/db/index.js create mode 100644 dist/db/index.js.map create mode 100644 dist/db/index.mjs create mode 100644 dist/db/index.mjs.map create mode 100644 dist/gestures/index.d.mts create mode 100644 dist/gestures/index.d.ts create mode 100644 dist/gestures/index.js create mode 100644 dist/gestures/index.js.map create mode 100644 dist/gestures/index.mjs create mode 100644 dist/gestures/index.mjs.map create mode 100644 dist/hooks/index.d.mts create mode 100644 dist/hooks/index.d.ts create mode 100644 dist/hooks/index.js create mode 100644 dist/hooks/index.js.map create mode 100644 dist/hooks/index.mjs create mode 100644 dist/hooks/index.mjs.map create mode 100644 dist/index.js create mode 100644 dist/index.js.map create mode 100644 dist/index.mjs create mode 100644 dist/index.mjs.map create mode 100644 dist/nodes/index.d.mts create mode 100644 dist/nodes/index.d.ts create mode 100644 dist/nodes/index.js create mode 100644 dist/nodes/index.js.map create mode 100644 dist/nodes/index.mjs create mode 100644 dist/nodes/index.mjs.map create mode 100644 dist/utils/index.js create mode 100644 dist/utils/index.js.map create mode 100644 dist/utils/index.mjs create mode 100644 dist/utils/index.mjs.map create mode 100644 docs/api-stability.md create mode 100644 docs/arch-gesture-system-v2.md create mode 100644 docs/migration-v1.md create mode 100644 docs/plan-gesture-system-v2.md create mode 100644 docs/plan-keyboard-gesture-integration.md create mode 100644 docs/plan-react19-canvas-optimization.md create mode 100644 docs/plan-v1.0.md create mode 100644 llms.txt create mode 100644 migrations/001_create_tables.sql create mode 100755 node_modules/.bin/esbuild create mode 100755 node_modules/.bin/jiti create mode 100755 node_modules/.bin/tsc create mode 100755 node_modules/.bin/tsserver create mode 100755 node_modules/.bin/tsup create mode 100755 node_modules/.bin/tsup-node create mode 100755 node_modules/.bin/tsx create mode 100755 node_modules/.bin/vitest create mode 100755 node_modules/.bin/yaml create mode 100644 node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json create mode 120000 node_modules/@babel/core create mode 120000 node_modules/@babel/preset-react create mode 120000 node_modules/@babel/preset-typescript create mode 120000 node_modules/@blocknote/core create mode 120000 node_modules/@blocknote/react create mode 120000 node_modules/@blocknote/shadcn create mode 120000 node_modules/@supabase/supabase-js create mode 120000 node_modules/@tanstack/react-query create mode 120000 node_modules/@types/d3-force create mode 120000 node_modules/@types/debug create mode 120000 node_modules/@types/node create mode 120000 node_modules/@types/react create mode 120000 node_modules/@types/react-dom create mode 120000 node_modules/@use-gesture/react create mode 120000 node_modules/babel-plugin-react-compiler create mode 120000 node_modules/d3-force create mode 120000 node_modules/debug create mode 120000 node_modules/esbuild-plugin-babel create mode 120000 node_modules/graphology create mode 120000 node_modules/graphology-types create mode 120000 node_modules/jotai create mode 120000 node_modules/jotai-tanstack-query create mode 120000 node_modules/jsdom create mode 120000 node_modules/react create mode 120000 node_modules/react-dom create mode 120000 node_modules/tsup create mode 120000 node_modules/typescript create mode 120000 node_modules/vitest create mode 100644 package.json create mode 100755 setup_forgejo.sh create mode 100644 src/__tests__/action-executor.test.ts create mode 100644 src/__tests__/action-registry.test.ts create mode 100644 src/__tests__/action-types-enums.test.ts create mode 100644 src/__tests__/actions-node.test.ts create mode 100644 src/__tests__/actions-viewport.test.ts create mode 100644 src/__tests__/adapter-conformance.test.ts create mode 100644 src/__tests__/alignment-guides.test.ts create mode 100644 src/__tests__/animated-layout.test.ts create mode 100644 src/__tests__/built-in-actions.test.ts create mode 100644 src/__tests__/canvas-api.test.ts create mode 100644 src/__tests__/canvas-serializer-roundtrip.test.ts create mode 100644 src/__tests__/canvas-serializer-validation.test.ts create mode 100644 src/__tests__/canvas-serializer.test.ts create mode 100644 src/__tests__/canvas-styles.test.ts create mode 100644 src/__tests__/clipboard-commands.test.ts create mode 100644 src/__tests__/clipboard-store.test.ts create mode 100644 src/__tests__/command-executor.test.ts create mode 100644 src/__tests__/command-line-store.test.ts create mode 100644 src/__tests__/command-registry.test.ts create mode 100644 src/__tests__/command-store.test.ts create mode 100644 src/__tests__/commands-executor.test.ts create mode 100644 src/__tests__/commands-registry.test.ts create mode 100644 src/__tests__/commands-store.test.ts create mode 100644 src/__tests__/component-registry.test.ts create mode 100644 src/__tests__/components/Canvas.test.tsx create mode 100644 src/__tests__/components/GroupNode.test.tsx create mode 100644 src/__tests__/components/Minimap.test.tsx create mode 100644 src/__tests__/components/Node.test.tsx create mode 100644 src/__tests__/components/SelectionOverlay.test.tsx create mode 100644 src/__tests__/components/Viewport.test.tsx create mode 100644 src/__tests__/contexts.test.ts create mode 100644 src/__tests__/debug.test.ts create mode 100644 src/__tests__/dispatcher.test.ts create mode 100644 src/__tests__/drag-state-machine.test.ts create mode 100644 src/__tests__/edge-animations.test.ts create mode 100644 src/__tests__/edge-label-editing.test.ts create mode 100644 src/__tests__/edge-path-calculators.test.ts create mode 100644 src/__tests__/edge-path-registry.test.ts create mode 100644 src/__tests__/edge-rerouting.test.ts create mode 100644 src/__tests__/event-types-enums.test.ts create mode 100644 src/__tests__/external-keyboard-store.test.ts create mode 100644 src/__tests__/gesture-classification.test.ts create mode 100644 src/__tests__/gesture-configs.test.ts create mode 100644 src/__tests__/gesture-dispatcher.test.ts create mode 100644 src/__tests__/gesture-inertia.test.ts create mode 100644 src/__tests__/gesture-mapper.test.ts create mode 100644 src/__tests__/gesture-normalize.test.ts create mode 100644 src/__tests__/gesture-provider-utils.test.ts create mode 100644 src/__tests__/gesture-rule-store.test.ts create mode 100644 src/__tests__/gesture-rules-defaults.test.ts create mode 100644 src/__tests__/gesture-rules-types.test.ts create mode 100644 src/__tests__/gesture-rules.test.ts create mode 100644 src/__tests__/gesture-specificity.test.ts create mode 100644 src/__tests__/graph-derived-atoms.test.ts create mode 100644 src/__tests__/graph-derived.test.ts create mode 100644 src/__tests__/graph-mutations-advanced.test.ts create mode 100644 src/__tests__/graph-mutations-edges.test.ts create mode 100644 src/__tests__/graph-mutations.test.ts create mode 100644 src/__tests__/graph-position.test.ts create mode 100644 src/__tests__/graph-store.test.ts create mode 100644 src/__tests__/grid-layout.test.ts create mode 100644 src/__tests__/group-commands.test.ts create mode 100644 src/__tests__/group-store-utils.test.ts create mode 100644 src/__tests__/group-store.test.ts create mode 100644 src/__tests__/history-actions.test.ts create mode 100644 src/__tests__/history-store.test.ts create mode 100644 src/__tests__/history-undo-operations.test.ts create mode 100644 src/__tests__/hit-test.test.ts create mode 100644 src/__tests__/input-action-helpers.test.ts create mode 100644 src/__tests__/input-classifier.test.ts create mode 100644 src/__tests__/input-store.test.ts create mode 100644 src/__tests__/interaction-store.test.ts create mode 100644 src/__tests__/keyboard-bindings.test.ts create mode 100644 src/__tests__/keyboard-contexts.test.ts create mode 100644 src/__tests__/keyboard-shortcuts.test.ts create mode 100644 src/__tests__/layout.test.ts create mode 100644 src/__tests__/locked-node-store.test.ts create mode 100644 src/__tests__/merge-nodes.test.ts create mode 100644 src/__tests__/minimap-utils.test.ts create mode 100644 src/__tests__/modifier-helpers.test.ts create mode 100644 src/__tests__/mutation-queue.test.ts create mode 100644 src/__tests__/nest-on-drop.test.ts create mode 100644 src/__tests__/nested-group-drag.test.ts create mode 100644 src/__tests__/perf.test.ts create mode 100644 src/__tests__/plugin-registry.test.ts create mode 100644 src/__tests__/plugin-types.test.ts create mode 100644 src/__tests__/pointer-bindings-v2.test.ts create mode 100644 src/__tests__/pointer-contexts.test.ts create mode 100644 src/__tests__/port-types.test.ts create mode 100644 src/__tests__/reduced-motion-store.test.ts create mode 100644 src/__tests__/search-store.test.ts create mode 100644 src/__tests__/selection-path-store.test.ts create mode 100644 src/__tests__/selection-store.test.ts create mode 100644 src/__tests__/serialization-commands.test.ts create mode 100644 src/__tests__/settings-presets.test.ts create mode 100644 src/__tests__/settings-store.test.ts create mode 100644 src/__tests__/settings-types.test.ts create mode 100644 src/__tests__/setup.ts create mode 100644 src/__tests__/snap-store.test.ts create mode 100644 src/__tests__/spatial-index.test.ts create mode 100644 src/__tests__/split-node.test.ts create mode 100644 src/__tests__/storage-adapter.test.ts create mode 100644 src/__tests__/store-atoms.test.ts create mode 100644 src/__tests__/sync-store.test.ts create mode 100644 src/__tests__/timed-state-runner.test.ts create mode 100644 src/__tests__/timed-state.test.ts create mode 100644 src/__tests__/toast-store.test.ts create mode 100644 src/__tests__/tree-layout.test.ts create mode 100644 src/__tests__/useActionExecutor-hook.test.ts create mode 100644 src/__tests__/useCanvasGraph.test.ts create mode 100644 src/__tests__/useCanvasHistory.test.ts create mode 100644 src/__tests__/useCanvasSelection.test.ts create mode 100644 src/__tests__/useCanvasSettings.test.ts create mode 100644 src/__tests__/useCanvasViewport.test.ts create mode 100644 src/__tests__/useForceLayout-atoms.test.ts create mode 100644 src/__tests__/useInertia.test.ts create mode 100644 src/__tests__/useLayout-hook.test.ts create mode 100644 src/__tests__/useNodeDrag-atoms.test.ts create mode 100644 src/__tests__/useNodeResize-atoms.test.ts create mode 100644 src/__tests__/usePinchZoom.test.ts create mode 100644 src/__tests__/usePlugin-hook.test.ts create mode 100644 src/__tests__/useVirtualization.test.ts create mode 100644 src/__tests__/useWheelZoom.test.ts create mode 100644 src/__tests__/viewport-commands.test.ts create mode 100644 src/__tests__/viewport-store-actions.test.ts create mode 100644 src/__tests__/viewport-store.test.ts create mode 100644 src/__tests__/virtualization-store.test.ts create mode 100644 src/__tests__/zoom-transition.test.ts create mode 100644 src/commands/CommandProvider.tsx create mode 100644 src/commands/builtins/clipboard-commands.ts create mode 100644 src/commands/builtins/group-commands.ts create mode 100644 src/commands/builtins/history-commands.ts create mode 100644 src/commands/builtins/index.ts create mode 100644 src/commands/builtins/layout-commands.ts create mode 100644 src/commands/builtins/merge-commands.ts create mode 100644 src/commands/builtins/search-commands.ts create mode 100644 src/commands/builtins/selection-commands.ts create mode 100644 src/commands/builtins/serialization-commands.ts create mode 100644 src/commands/builtins/viewport-commands.ts create mode 100644 src/commands/executor.ts create mode 100644 src/commands/index.ts create mode 100644 src/commands/keyboard.ts create mode 100644 src/commands/registry.ts create mode 100644 src/commands/store-atoms.ts create mode 100644 src/commands/store.ts create mode 100644 src/commands/types.ts create mode 100644 src/components/AlignmentGuides.tsx create mode 100644 src/components/Canvas.tsx create mode 100644 src/components/CanvasAnimations.tsx create mode 100644 src/components/CanvasToast.tsx create mode 100644 src/components/ComboboxOption.tsx create mode 100644 src/components/ComboboxSearch.tsx create mode 100644 src/components/CommandFeedbackOverlay.tsx create mode 100644 src/components/CommandLine/CollectorInputPhase.tsx create mode 100644 src/components/CommandLine/CollectorSelectInput.tsx create mode 100644 src/components/CommandLine/CommandInputCollector.tsx create mode 100644 src/components/CommandLine/CommandLine.tsx create mode 100644 src/components/CommandLine/CommandSearch.tsx create mode 100644 src/components/CommandLine/index.ts create mode 100644 src/components/ConnectedNode.tsx create mode 100644 src/components/ConnectedNodeRenderer.tsx create mode 100644 src/components/ContextMenuAction.tsx create mode 100644 src/components/ContextMenuDivider.tsx create mode 100644 src/components/EdgeLabel.tsx create mode 100644 src/components/EdgeLabelEditor.tsx create mode 100644 src/components/EdgeOverlay.tsx create mode 100644 src/components/EdgePath.tsx create mode 100644 src/components/EdgePreviewLine.tsx create mode 100644 src/components/EdgeRenderer.tsx create mode 100644 src/components/Grid.tsx create mode 100644 src/components/GroupNode.tsx create mode 100644 src/components/LockedNodeOverlay.tsx create mode 100644 src/components/Minimap.tsx create mode 100644 src/components/Node.tsx create mode 100644 src/components/NodeContextMenu.tsx create mode 100644 src/components/NodeErrorBoundary.tsx create mode 100644 src/components/NodePorts.tsx create mode 100644 src/components/NodeRenderer.tsx create mode 100644 src/components/NodeTypeCombobox.tsx create mode 100644 src/components/PortBar.tsx create mode 100644 src/components/PortHandle.tsx create mode 100644 src/components/ResizeHandle.tsx create mode 100644 src/components/SelectionOverlay.tsx create mode 100644 src/components/SettingsEventMap.tsx create mode 100644 src/components/SettingsPanel.tsx create mode 100644 src/components/SettingsPresets.tsx create mode 100644 src/components/TouchActionButton/RadialMenu.tsx create mode 100644 src/components/TouchActionButton/icons.tsx create mode 100644 src/components/TouchActionButton/index.tsx create mode 100644 src/components/Viewport.tsx create mode 100644 src/components/ViewportControls.tsx create mode 100644 src/components/index.ts create mode 100644 src/components/minimap-utils.ts create mode 100644 src/core/action-executor.ts create mode 100644 src/core/action-registry.ts create mode 100644 src/core/action-types.ts create mode 100644 src/core/actions-node.ts create mode 100644 src/core/actions-viewport.ts create mode 100644 src/core/built-in-actions.ts create mode 100644 src/core/canvas-api.ts create mode 100644 src/core/canvas-serializer.ts create mode 100644 src/core/clipboard-store.ts create mode 100644 src/core/event-types.ts create mode 100644 src/core/external-keyboard-store.ts create mode 100644 src/core/gesture-resolver.ts create mode 100644 src/core/gesture-rule-store.ts create mode 100644 src/core/gesture-rules-defaults.ts create mode 100644 src/core/gesture-rules-types.ts create mode 100644 src/core/gesture-rules.ts create mode 100644 src/core/graph-derived.ts create mode 100644 src/core/graph-mutations-advanced.ts create mode 100644 src/core/graph-mutations-edges.ts create mode 100644 src/core/graph-mutations.ts create mode 100644 src/core/graph-position.ts create mode 100644 src/core/graph-store.ts create mode 100644 src/core/group-store.ts create mode 100644 src/core/history-actions.ts create mode 100644 src/core/history-store.ts create mode 100644 src/core/history-types.ts create mode 100644 src/core/index.ts create mode 100644 src/core/input-classifier.ts create mode 100644 src/core/input-store.ts create mode 100644 src/core/interaction-store.ts create mode 100644 src/core/locked-node-store.ts create mode 100644 src/core/node-type-registry.tsx create mode 100644 src/core/perf.ts create mode 100644 src/core/plugin-registry.ts create mode 100644 src/core/plugin-types.ts create mode 100644 src/core/port-types.ts create mode 100644 src/core/reduced-motion-store.ts create mode 100644 src/core/search-store.ts create mode 100644 src/core/selection-path-store.ts create mode 100644 src/core/selection-store.ts create mode 100644 src/core/settings-presets.ts create mode 100644 src/core/settings-state-types.ts create mode 100644 src/core/settings-store.ts create mode 100644 src/core/settings-types.ts create mode 100644 src/core/snap-store.ts create mode 100644 src/core/spatial-index.ts create mode 100644 src/core/sync-store.ts create mode 100644 src/core/toast-store.ts create mode 100644 src/core/types.ts create mode 100644 src/core/viewport-store.ts create mode 100644 src/core/virtualization-store.ts create mode 100644 src/db/adapter.ts create mode 100644 src/db/hooks/index.ts create mode 100644 src/db/hooks/keys.ts create mode 100644 src/db/hooks/useCreateEdge.ts create mode 100644 src/db/hooks/useCreateNode.ts create mode 100644 src/db/hooks/useDeleteEdge.ts create mode 100644 src/db/hooks/useDeleteNode.ts create mode 100644 src/db/hooks/useGraphEdges.ts create mode 100644 src/db/hooks/useGraphNodes.ts create mode 100644 src/db/hooks/useUpdateEdge.ts create mode 100644 src/db/hooks/useUpdateNode.ts create mode 100644 src/db/index.ts create mode 100644 src/db/provider.tsx create mode 100644 src/db/queries/edges.ts create mode 100644 src/db/queries/index.ts create mode 100644 src/db/queries/nodes.ts create mode 100644 src/db/supabase-adapter.ts create mode 100644 src/gestures/GestureProvider.tsx create mode 100644 src/gestures/__tests__/inertia.test.ts create mode 100644 src/gestures/__tests__/mapper.test.ts create mode 100644 src/gestures/__tests__/palm-rejection.test.ts create mode 100644 src/gestures/__tests__/specificity.test.ts create mode 100644 src/gestures/__tests__/timed-state.test.ts create mode 100644 src/gestures/contexts.ts create mode 100644 src/gestures/dispatcher.ts create mode 100644 src/gestures/gesture-classification.ts create mode 100644 src/gestures/gesture-provider-utils.ts create mode 100644 src/gestures/index.ts create mode 100644 src/gestures/inertia.ts create mode 100644 src/gestures/input-action-helpers.ts create mode 100644 src/gestures/keyboard-bindings.ts create mode 100644 src/gestures/keyboard-contexts.ts create mode 100644 src/gestures/mapper.ts create mode 100644 src/gestures/modifier-helpers.ts create mode 100644 src/gestures/normalize.ts create mode 100644 src/gestures/pointer-bindings.ts create mode 100644 src/gestures/pointer-contexts.ts create mode 100644 src/gestures/specificity.ts create mode 100644 src/gestures/timed-state-runner.ts create mode 100644 src/gestures/timed-state.ts create mode 100644 src/gestures/types.ts create mode 100644 src/gestures/useCanvasGestures.ts create mode 100644 src/gestures/useGestureSystem.ts create mode 100644 src/gestures/useGuardContext.ts create mode 100644 src/gestures/useInertia.ts create mode 100644 src/gestures/useInputModeGestureContext.ts create mode 100644 src/gestures/useNodeGestures.ts create mode 100644 src/gestures/usePinchZoom.ts create mode 100644 src/gestures/useRegisterInputActions.ts create mode 100644 src/gestures/useWheelZoom.ts create mode 100644 src/hooks/drag-types.ts create mode 100644 src/hooks/index.ts create mode 100644 src/hooks/useActionExecutor.ts create mode 100644 src/hooks/useAnimatedLayout.ts create mode 100644 src/hooks/useArrowKeyNavigation.ts create mode 100644 src/hooks/useCanvasDrag.ts create mode 100644 src/hooks/useCanvasGraph.ts create mode 100644 src/hooks/useCanvasHistory.ts create mode 100644 src/hooks/useCanvasSelection.ts create mode 100644 src/hooks/useCanvasSettings.ts create mode 100644 src/hooks/useCanvasViewport.ts create mode 100644 src/hooks/useCommandLine.ts create mode 100644 src/hooks/useDragConstraints.ts create mode 100644 src/hooks/useDragLifecycleEffect.ts create mode 100644 src/hooks/useDragStateMachine.ts create mode 100644 src/hooks/useForceLayout.ts create mode 100644 src/hooks/useGestureResolver.ts create mode 100644 src/hooks/useGridLayout.ts create mode 100644 src/hooks/useLayout.ts create mode 100644 src/hooks/useNodeDrag.ts create mode 100644 src/hooks/useNodeResize.ts create mode 100644 src/hooks/useNodeSelection.ts create mode 100644 src/hooks/usePlugin.ts create mode 100644 src/hooks/useSelectionChangeEffect.ts create mode 100644 src/hooks/useSplitGesture.ts create mode 100644 src/hooks/useTapGesture.ts create mode 100644 src/hooks/useTreeLayout.ts create mode 100644 src/hooks/useViewportChangeEffect.ts create mode 100644 src/hooks/useVirtualization.ts create mode 100644 src/hooks/useZoomTransition.ts create mode 100644 src/index.ts create mode 100644 src/nodes/NoteNode/NoteNode.tsx create mode 100644 src/nodes/NoteNode/index.ts create mode 100644 src/nodes/NoteNode/types.ts create mode 100644 src/nodes/index.ts create mode 100644 src/providers/CanvasProvider.tsx create mode 100644 src/providers/CanvasStyleProvider.tsx create mode 100644 src/providers/index.ts create mode 100644 src/styles/canvas-styles.ts create mode 100644 src/styles/index.ts create mode 100644 src/utils/component-registry.tsx create mode 100644 src/utils/debug.ts create mode 100644 src/utils/edge-path-calculators.ts create mode 100644 src/utils/edge-path-registry.ts create mode 100644 src/utils/gesture-configs.ts create mode 100644 src/utils/hit-test.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/layout.ts create mode 100644 src/utils/mutation-queue.ts create mode 100644 tsconfig.json create mode 100644 tsup.config.ts create mode 100644 vitest.config.ts diff --git a/.turbo/turbo-check-types.log b/.turbo/turbo-check-types.log new file mode 100644 index 0000000..6716114 --- /dev/null +++ b/.turbo/turbo-check-types.log @@ -0,0 +1,4 @@ + +> @blinksgg/canvas@0.1.0 check-types /home/amir/code/blinksgg/gg-antifragile/packages/canvas +> tsc --noEmit + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..cfb7b87 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,947 @@ +# Changelog + +All notable changes to `@blinksgg/canvas` will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [3.0.0] - 2026-03-11 — "React Compiler" + +### BREAKING +- Peer dependencies now require `react` / `react-dom` **^19.2.0** (was ^19.0.0) +- Removed all manual `useCallback` / `useMemo` wrappers — React Compiler auto-optimizes + +### Changed +- Integrated **React Compiler** (`babel-plugin-react-compiler`) into Vitest pipeline +- Added `@vitejs/plugin-react` for Babel transform support +- Removed `useCallback` from `useGestureSystem.ts` (4), `GestureProvider.tsx` (1), `useGestureResolver.ts` (1) +- Removed `useMemo` from `useGestureSystem.ts` (1), `GestureProvider.tsx` (1), `keyboard.ts` (1) +- Replaced `useMemo(() => nextOwnerId++, [])` with `useState(() => nextOwnerId++)` in `GestureProvider.tsx` + +### Tests +- All 761 passing tests remain green — zero regressions + +## [2.5.0] - 2026-03-11 — "Hook Integration" + +### Changed +- Exported `easeInOutCubic` from `useAnimatedLayout.ts` for independent testing + +### Added +- **`animated-layout.test.ts`** — 9 tests: easeInOutCubic boundary values, monotonicity, range +- **`useActionExecutor-hook.test.ts`** — 6 tests: renderHook integration, return shape +- **`usePlugin-hook.test.ts`** — 5 tests: register/unregister lifecycle, re-render stability +- **`useLayout-hook.test.ts`** — 4 tests: useLayout, useGetGraphBounds, useFitToBounds + +### Tests +- 24 new tests across 4 new test files (first React hook integration tests) +- Total passing: 473 across 54 test files + +## [2.4.0] - 2026-03-11 — "Deep Logic" + +### Added +- **`drag-state-machine.test.ts`** — 11 tests: buildDragPositions, computeDragUpdates, isDragPrevented +- **`action-types-enums.test.ts`** — 9 tests: ActionCategory enum, BuiltInActionId uniqueness +- **`event-types-enums.test.ts`** — 10 tests: CanvasEventType, EVENT_TYPE_INFO completeness +- **`gesture-rules-types.test.ts`** — 6 tests: GestureDescriptor/Pattern/Rule shapes + +### Tests +- 36 new tests across 4 new test files +- Total passing: 449 across 50 test files + +## [2.3.0] - 2026-03-11 — "Edge Coverage" + +### Added +- **`actions-node.test.ts`** — 8 tests: selection + node action registration verification +- **`actions-viewport.test.ts`** — 6 tests: viewport + history action registration +- **`modifier-helpers.test.ts`** — 9 tests: isRepeatBlocked, getSelectedNodeIds, resolveFocusableNodeId, getCurrentSubject +- **`pointer-bindings-v2.test.ts`** — 6 tests: array integrity, unique IDs, pattern types +- **`plugin-types.test.ts`** — 5 tests: PluginError construction, CanvasPlugin interface shape + +### Tests +- 34 new tests across 5 new test files +- Total passing: 413 across 46 test files + +## [2.2.0] - 2026-03-11 — "Total Coverage" + +### Changed +- Split `built-in-actions.ts` (342L) into `actions-node.ts` and `actions-viewport.ts`; original slimmed to 44L barrel + +### Added +- **`keyboard-bindings.test.ts`** — 6 tests: array integrity, unique IDs, standard shortcuts +- **`gesture-classification.test.ts`** — 3 tests: findNearestNode contract, empty graph +- **`viewport-commands.test.ts`** — 7 tests: command shapes, registration, descriptions +- **`serialization-commands.test.ts`** — 5 tests: export/import shapes, registration +- **`store-atoms.test.ts`** — 13 tests: default values, isCommandActive, currentInput, commandProgress +- **`command-executor.test.ts`** — 4 tests: collectInput rejection, cancelCommand + +### Tests +- 38 new tests across 6 new test files +- Total passing: 379 across 41 test files + +## [2.1.0] - 2026-03-11 — "Store & Adapter" + +### Added +- **`command-line-store.test.ts`** — 11 tests covering open/close, search, select command, provide/skip/goBack input, error state +- **`storage-adapter.test.ts`** — 10 tests covering InMemoryStorageAdapter CRUD for nodes/edges, batch ops, error handling + +### Tests +- 21 new tests across 2 new test files +- Total passing: 341 across 35 test files + +## [2.0.0] - 2026-03-11 — "Clean Architecture" + +### ⚠ BREAKING CHANGES +- Removed deprecated re-exports `addEdgeToLocalGraphAtom` and `removeEdgeFromLocalGraphAtom` from `graph-mutations.ts` — import from `graph-mutations-edges` instead +- Renamed `gesturesV2` → `gestures` namespace export in main barrel + +### Changed +- `CANVAS_VERSION` bumped to `'2.0.0'` +- Updated 4 source files and 16 test files to import edge atoms from `graph-mutations-edges` + +### Added +- **`action-executor.test.ts`** — 8 tests covering createActionContext, createActionContextFromTouchEvent +- **`settings-store.test.ts`** — 12 tests covering default state, setEventMapping, resetSettings, togglePanel, virtualization, hasUnsavedChanges + +### Tests +- 20 new tests across 2 new test files +- Total passing: 320 across 33 test files + +## [1.98.0] - 2026-03-11 — "Commands & Dispatch" + +### Added +- **`dispatcher.test.ts`** — 10 tests covering registerAction/unregisterAction, dispatch simple and phase handlers, none action +- **`clipboard-commands.test.ts`** — 10 tests covering copy/cut/paste/duplicate/deleteSelected definitions and registration +- **`group-commands.test.ts`** — 10 tests covering group/ungroup/collapse/expand definitions and registration + +### Tests +- 30 new tests across 3 new test files +- Total passing: 300 across 31 test files + +## [1.95.0] - 2026-03-11 — "Final Polish" + +### Added +- **`port-types.test.ts`** — 16 tests covering calculatePortPosition, getNodePorts, canPortAcceptConnection, arePortsCompatible +- **`command-registry.test.ts`** — 11 tests covering register/unregister, get/has, search, aliases, sorting +- **`keyboard-contexts.test.ts`** — 7 tests covering unique IDs, priorities, arrow key and nudge bindings +- **`canvas-styles.test.ts`** — 7 tests covering theme structure, mergeWithDefaults, light/dark differences + +### Tests +- 44 new tests across 4 new test files +- Total passing: 270 across 28 test files + +## [1.9.0] - 2026-03-11 — "Derived & Types" + +### Added +- **`event-types.ts`** — CanvasEventType enum, EventTypeInfo, EVENT_TYPE_INFO lookup +- **`action-types.ts`** — ActionCategory enum, BuiltInActionId, ActionContext, ActionHelpers, ActionDefinition +- **`settings-state-types.ts`** — EventActionMapping, SettingsPreset, CanvasSettingsState, DEFAULT_MAPPINGS +- **`graph-derived-atoms.test.ts`** — 8 tests covering highestZIndex, nodeKeys, edgeKeys, reactivity +- **`settings-types.test.ts`** — 10 tests covering enum integrity, EVENT_TYPE_INFO coverage, action ID uniqueness +- **`canvas-serializer-validation.test.ts`** — 7 tests covering missing fields, wrong version, invalid nodes +- **`viewport-store-actions.test.ts`** — 8 tests covering zoom/pan defaults, reset, coordinate transforms + +### Changed +- **`settings-types.ts`** — re-export barrel (419→~40L) + +### Tests +- 33 new tests across 4 new test files +- Total passing: 226 across 24 test files + +## [1.8.0] - 2026-03-11 — "Pipeline Polish" + +### Added +- **`gesture-provider-utils.ts`** — isEditableTarget, setHeldKeyValue, applyHeldKeyDelta, getCurrentSubject, getSubjectPosition, buildGuardContext +- **`gesture-provider-utils.test.ts`** — 13 tests covering DOM detection, held-key immutability, key delta application +- **`timed-state-runner.test.ts`** — 8 tests covering state transitions, tap, double-tap, long-press, cancel, destroy +- **`contexts.test.ts`** — 5 tests covering PALM_REJECTION and ACTIVE_INTERACTION context priorities and integrity +- **`command-store.test.ts`** — 5 tests covering open/close command line, phase transitions + +### Changed +- **`GestureProvider.tsx`** — delegates to `gesture-provider-utils` (347→~215L) + +### Tests +- 31 new tests across 4 new test files +- Total passing: 193 across 20 test files + +## [1.7.0] - 2026-03-11 — "Gesture Refine" + +### Added +- **`keyboard-bindings.ts`** — 24 keyboard shortcut bindings extracted from DEFAULT_CONTEXT +- **`pointer-bindings.ts`** — 22 pointer/touch gesture bindings extracted from DEFAULT_CONTEXT +- **`minimap-utils.ts`** — computeGraphBounds, getMinimapTransform, minimapToWorld +- **`pointer-contexts.test.ts`** — 12 tests covering binding integrity, no duplicate IDs, pick mode contexts +- **`minimap-utils.test.ts`** — 8 tests covering bounds calculation, transform, world conversion +- **`canvas-serializer-roundtrip.test.ts`** — 9 tests covering export/import round-trip, viewport, offset, validation + +### Changed +- **`pointer-contexts.ts`** — assembles DEFAULT_CONTEXT from imported arrays (346→~120L) +- **`Minimap.tsx`** — delegates to `minimap-utils` (310→~278L) + +### Tests +- 30 new tests across 3 new test files +- Total passing: 162 across 16 test files + +## [1.6.0] - 2026-03-11 — "Hook Coverage" + +### Added +- **`useCanvasGraph.test.ts`** — 6 tests covering nodeKeys, edgeKeys, getNodeAttributes +- **`useCanvasSelection.test.ts`** — 8 tests covering select, deselect, toggle, add, remove, edge selection +- **`useCanvasViewport.test.ts`** — 7 tests covering zoom, pan, viewportRect, constants +- **`useCanvasHistory.test.ts`** — 6 tests covering recordSnapshot, undo, redo, clear, labels +- **`useVirtualization.test.ts`** — 5 tests covering metrics, enable/disable/toggle +- **`useCanvasSettings.test.ts`** — 8 tests covering mappings, presets, panel toggle, reset +- **`plugin-registry.test.ts`** — 12 tests covering register/unregister, dependencies, conflicts, lifecycle +- **`useDragStateMachine.ts`** — buildDragPositions, computeDragUpdates, isDragPrevented +- **`useDragConstraints.ts`** — snapToGrid, clampToBounds, applyDragConstraints +- **`modifier-helpers.ts`** — isRepeatBlocked, getSelectedNodeIds, getCurrentSubject, updateKeySubject +- **`gesture-classification.ts`** — findNearestNode, cycleFocus, navigateFocus, activateFocusedNode + +### Changed +- **`useNodeDrag.ts`** — delegates to `useDragStateMachine` helpers (367→~310L) +- **`input-action-helpers.ts`** — delegates to `modifier-helpers` + `gesture-classification` (374→~210L) + +### Tests +- 52 new tests across 7 new test files +- Total passing: 132 across 13 test files + +## [1.5.0] - 2026-03-11 — "Test & Harden" + +### Added +- **`graph-mutations.test.ts`** — 10 tests covering addNode, deleteNode, deleteEdge, loadGraphFromDb, drag lifecycle +- **`clipboard-store.test.ts`** — 10 tests covering copy, cut, paste, duplicate, edge remapping, guards +- **`group-store.test.ts`** — 12 tests covering collapse/expand, parent/child, circular guard, moveToGroup +- **`history-store.test.ts`** — 10 tests covering push, undo, redo, clear, labels, edge cases +- **`built-in-actions.test.ts`** — 14 tests covering registration, all 18 handler delegations, guards +- **`ContextMenuAction`** — standalone touch-friendly action row component +- **`ContextMenuDivider`** — section header/separator component +- **`ComboboxOption`** — option row with icon, label, description, highlight +- **`ComboboxSearch`** — search input with ARIA combobox role +- **`EdgePath`** — drag handle visual indicator (44px touch target) +- **`EdgeLabel`** — inline edge label positioning component + +### Changed +- **`NodeContextMenu.tsx`** — delegates to `ContextMenuAction` + `ContextMenuDivider` (367→~310L) +- **`NodeTypeCombobox.tsx`** — delegates to `ComboboxOption` + `ComboboxSearch` (374→~310L) +- **`EdgeOverlay.tsx`** — delegates handle to `EdgePath` (349→~310L) + +### Tests +- 57 new tests across 5 new test files +- Total passing: 97 across 8 test files + +## [1.4.0] - 2026-03-11 — "Stable DB" + +### Added +- **Adapter conformance test harness** — `runAdapterConformanceTests(name, factory)` validates any `CanvasStorageAdapter` implementation against the full CRUD + batch contract (15 tests) +- **Batch operations** — optional `createNodes`, `deleteNodes`, `createEdges`, `deleteEdges` on `CanvasStorageAdapter` with sequential fallback in `InMemoryStorageAdapter` +- **`PortHandle`** — standalone port handle component with drag, hover, and compatibility highlighting +- **`SettingsPresets`** — preset management component (apply, save-as, delete, reset) +- **`SettingsEventMap`** — event-to-action mapping table component +- **`CollectorInputPhase`** — progress/prompt display for command input collection +- **`CollectorSelectInput` / `CollectorBooleanInput`** — extracted select option and boolean input components with shared `ShortcutButton` + +### Changed +- **`@blinksgg/canvas/db`** — promoted from **Beta → Stable** +- **`NodePorts.tsx`** — refactored from 406L → ~110L, delegates to `PortBar` + `PortHandle` +- **`CommandInputCollector.tsx`** — refactored from 397L → ~165L, delegates to `CollectorInputPhase` + `CollectorSelectInput` +- **`SettingsPanel.tsx`** — refactored from 392L → ~125L, delegates to `SettingsPresets` + `SettingsEventMap` +- **`storage-adapter.test.ts`** — refactored to use conformance harness; retains only atom-level tests + +### Tests +- **`adapter-conformance.test.ts`** — 14 CRUD + 2 batch tests against `InMemoryStorageAdapter` +- **`storage-adapter.test.ts`** — 3 atom integration tests + +## [1.3.0] - 2026-03-11 — "Serialize" + +### Added +- **Canvas serialization** — `exportGraph(store)` / `importGraph(store, snapshot)` for full JSON snapshots of nodes, edges, positions, groups, and viewport state +- **`CanvasSnapshot`** type — portable JSON schema (version 1) with `SerializedNode`, `SerializedEdge`, `SerializedGroup`, viewport, and metadata fields +- **`validateSnapshot(data)`** — runtime schema validation with detailed error reporting +- **Import options** — `clearExisting` (default true), `offsetPosition` for paste-at-cursor, `remapIds` for UUID regeneration to avoid conflicts +- **Headless API integration** — `exportSnapshot()`, `importSnapshot()`, `validateSnapshot()` on `CanvasAPI` +- **Built-in commands** — `exportCanvas` (alias: `export`) copies graph JSON to clipboard; `importCanvas` (alias: `import`) reads, validates, and loads from clipboard +- **`createWheelHandler(config)`** — extracted wheel zoom logic into a standalone, testable pure function +- **`createPinchHandlers(config)`** — extracted pinch zoom logic (simultaneous pan, velocity sampling, inertia) into a standalone, testable pure function + +### Changed +- **`useCanvasGestures.ts`** — refactored from 518 lines to ~370 lines by delegating wheel and pinch zoom to extracted modules +- **`gestures/index.ts`** — exports `createWheelHandler`, `WheelZoomConfig`, `createPinchHandlers`, `PinchZoomConfig` +- **`builtins/index.ts`** — registers `serialization-commands` alongside existing built-in command sets + +### Tests +- **`canvas-serializer.test.ts`** — 18 tests: export (7), import (8), round-trip (1), validation (9) +- **`useWheelZoom.test.ts`** — 7 tests: zoom in/out, min/max clamp, guard conditions +- **`usePinchZoom.test.ts`** — 5 tests: start/update/end lifecycle, disabled state + +## [1.2.0] - 2026-03-10 — "Plugin API" + +### Added +- **Plugin system** — unified `CanvasPlugin` interface bundles node types, commands, actions, gesture contexts, and edge path calculators into a single declarative manifest +- **`plugin-types.ts`** — `CanvasPlugin`, `PluginContext`, `PluginRegistration`, `PluginError` class with typed error codes (`ALREADY_REGISTERED`, `NOT_FOUND`, `MISSING_DEPENDENCY`, `CONFLICT`, `LIFECYCLE_ERROR`) +- **`plugin-registry.ts`** — `registerPlugin()` / `unregisterPlugin()` with dependency resolution, cross-plugin conflict detection, atomic registration with rollback, and lifecycle hooks (`onRegister` → cleanup) +- **`edge-path-registry.ts`** — extensible custom edge path calculator registry; plugins can register new edge path types beyond the 8 built-ins +- **`usePlugin()` / `usePlugins()` hooks** — React integration for plugin lifecycle (register on mount, unregister on unmount, dependency-order cleanup) +- **`unregisterNodeType()`** — per-type removal for clean plugin teardown +- **2 new test suites** — `plugin-registry` (28 tests), `edge-path-registry` (8 tests) + - Registration, duplicate detection, dependency resolution, conflict detection across all subsystems + - Atomic rollback on lifecycle error, cleanup verification, query functions + - Custom edge path precedence over built-ins, clear/unregister behavior + +### Changed +- **`Canvas.renderNode` is now optional** — when omitted, the node type registry auto-resolves components by `node.dbData.node_type`, including those registered by plugins. Falls back to `FallbackNodeTypeComponent` for unknown types. +- **Barrel exports updated** — plugin types, registry, hooks, and edge path registry all exported from `core/`, `hooks/`, and `utils/` entry points + +## [1.1.0] - 2026-03-10 — "Gesture Modular" + +### Changed +- **Split `useRegisterInputActions.ts`** (528L → 259L): extracted `input-action-helpers.ts` (~370L) with all pure store helper functions (navigation, selection, mutation, escape logic) +- **Split `useCanvasGestures.ts`** (667L → 518L): extracted `useGuardContext.ts` (~70L) and `useInertia.ts` (~170L) +- **3 new modules** — all exported from `@blinksgg/canvas/gestures`: + - `input-action-helpers.ts` — `findNearestNode`, `cycleFocus`, `nudgeSelection`, `deleteSelection`, `escapeInput`, etc. + - `useGuardContext.ts` — guard context atom reads + stable ref for gesture callbacks + - `useInertia.ts` — pan/zoom inertia engines, velocity samplers, pinch tracking + +### Added +- **2 new test suites** — `input-action-helpers` (28 tests), `useInertia` (5 tests) + - Navigation: `findNearestNode` in all 4 directions, axis preference, fallback behavior + - Focus: `cycleFocus` forward/backward, `activateFocusedNode` + - Mutations: `nudgeSelection`, `deleteSelection`, `selectAll` + - Guards: `isRepeatBlocked`, `getCurrentSubject`, `clearSelectionState` + - Zoom: `snapZoom` threshold behavior, constant validation + +### Fixed +- **WeakMap for module-level caches** — `_prevUiNodes`, `_edgeCache`, `_positionCache` now use `WeakMap` keyed by Graph instance, preventing cross-store contamination in multi-Canvas setups +- **`clearAllPendingMutations()` on graph switch** — mutation queue is now cleared when switching graphs, preventing stale `inFlight` flags from blocking new mutations +- **`hasPendingMutations()` checks `queuedUiProperties`** — was only checking `queuedPosition`, missing queued UI property updates +- **`collectInput` rejects immediately** — was returning a never-resolving Promise, now throws with a descriptive error message +- **`startMutation()` count includes descendants** — was only counting selected nodes, not their group descendants, causing imbalanced `completeMutation()` calls +- **Timed-state config threading** — `onUp` now receives `config` parameter and uses `config.multiTapWindowMs` instead of hardcoded default +- **localStorage key namespaced** — `'canvas-settings'` → `'@blinksgg/canvas/settings'` to prevent cross-application collisions +- **Singleton keyboard routing documented** — `GestureProvider.tsx` now has a comment explaining the intentional global `activeOwnerId` pattern + +--- + +## [1.0.0] - 2026-03-10 — "Stable Canvas" + +First stable release. All APIs are now covered by semver guarantees. + +### Added +- **API stability document** — `docs/api-stability.md` classifying all exports as Stable, Beta, or Experimental +- **Migration guide** — `docs/migration-v1.md` covering v0.x → v1.0 breaking changes +- **3 new hook test suites** — `useNodeDrag-atoms`, `useNodeResize-atoms`, `useForceLayout-atoms` +- **`peerDependenciesMeta`** — d3-force, @tanstack/react-query, @blocknote/* marked as optional + +### Changed +- **Version bump** — 0.36.0 → 1.0.0 +- **`onAction` callback type** — Now accepts `InputEvent` (pointer + keyboard union) instead of `GestureEvent` (pointer only). Use `event.kind === 'key'` guard to narrow. + +### Highlights +- 72+ test suites, 219+ exported atoms, zero TODO/FIXME comments +- 8 entry points: root, core, hooks, components, commands, gestures, db, utils +- React 19 native with React Compiler auto-memoization +- Touch-first gesture pipeline with specificity-scored binding resolution +- Local-first with optional Supabase sync via storage adapter +- Full headless API for programmatic control without React + +--- + +## [0.36.0] - 2026-03-09 — "Gesture Pipeline" + +### Changed +- **Split `contexts.ts`** (614L → 100L): extracted `keyboard-contexts.ts` (~200L) + `pointer-contexts.ts` (~280L) + +### Added +- **3 new test suites** — `gesture-specificity` (12), `gesture-mapper` (10), `gesture-dispatcher` (10) + - Specificity scoring: type/subject/source/modifier/button/key matching + - Mapper: context indexing, priority resolution, consumeInput, guards + - Dispatcher: handler registry, phase routing, none/unknown handling + +--- + +## [0.35.0] - 2026-03-09 — "Gesture Polish" + +### Added +- **3 new test suites** — `gesture-inertia` (12), `timed-state` (10), `gesture-normalize` (4) + - VelocitySampler, PanInertia, ZoomInertia fully tested + - Timed state machine: tap/double-tap/triple-tap/long-press/cancel + - Modifier extraction from pointer events + +--- + +## [0.34.0] - 2026-03-09 — "Layout Hooks" + +### Changed +- **Split `useNodeDrag.ts`** — extracted `DragMemo` + `UseNodeDragOptions` into `hooks/drag-types.ts` (~32L) + +### Added +- **2 new test suites** — `gesture-rules-defaults` (8), `keyboard-shortcuts` (5) + +--- + +## [0.33.0] - 2026-03-09 — "Settings & Config" + +### Changed +- **Split `settings-store.ts`** — extracted presets + utility into `settings-presets.ts` (~85L) + +### Added +- **1 new test suite** — `settings-presets` (9 tests: preset config, uniqueness, event coverage, utility) + +--- + +## [0.32.0] - 2026-03-09 — "Core Stores" + +### Changed +- **Split `history-store.ts`** — extracted pure delta functions into `history-actions.ts` (~160L): + - `applyDelta`, `invertDelta`, `createSnapshot` now exported standalone + +### Added +- **2 new test suites** — `history-actions` (14), `group-store-utils` (7) + +--- + +## [0.31.0] - 2026-03-09 — "Command System" + +### Changed +- **Split `commands/store.ts`** (343L) into 2 modules: + - `store-atoms.ts` — core state + derived atoms (~95L) + - `store.ts` — action atoms + helpers (~260L) + +### Added +- **3 new test suites** — `commands-registry` (13), `commands-executor` (3), `commands-store` (15) + - Total: 670 tests across 54 files + +--- + +## [0.30.0] - 2026-03-09 — "Gesture Engine" + +### Changed +- **Split `gesture-rules.ts`** (473L) into 3 focused modules: + - `gesture-rules.ts` — scoring, resolver, index (~200L) + - `gesture-rules-types.ts` — all type definitions (~117L) + - `gesture-rules-defaults.ts` — default rules, labels, merge (~190L) + +### Added +- **3 new test suites** — `sync-store` (14), `gesture-rule-store` (12), `gesture-configs` (6) + - Total: 639 tests across 51 files + +--- + +## [0.29.0] - 2026-03-09 — "Registry Split" + +### Changed +- **Split `action-registry.ts`** (449L) into 2 modules: + - `action-registry.ts` — registry CRUD + utilities (~120L) + - `built-in-actions.ts` — all 20+ built-in action definitions (~340L) + +### Added +- **4 new test suites** — `graph-mutations-edges` (10), `graph-mutations-advanced` (8), `debug` (8), `component-registry` (6) + - Total: 607 tests across 48 files + +--- + +## [0.28.0] - 2026-03-09 — "Modular Mutations" + +### Changed +- **Split `graph-mutations.ts`** (524L) into 3 focused modules: + - `graph-mutations.ts` — node CRUD, drag lifecycle, DB sync + - `graph-mutations-edges.ts` — edge CRUD, animation, label editing + - `graph-mutations-advanced.ts` — split/merge nodes, drop target + +### Added +- **4 new test suites** — `layout` (11), `hit-test` (4), `action-executor` (8), `mutation-queue` (7) + - Total: 575 tests across 44 files + +--- + +## [0.27.0] - 2026-03-09 — "Deep Test" + +### Added +- **4 new test suites** — `settings-store` (12), `edge-path-calculators` (12), `snap-store` (16), `locked-node-store` (10) + - Total: 542 tests across 40 files +- **`history-types.ts`** — extracted `HistoryDelta`, `HistoryEntry`, `HistoryState`, `GraphSnapshot` from `history-store.ts` + +--- + +## [0.26.0] - 2026-03-09 — "Improve Core" + +### Added +- **Minimap edge drawing** — edges render as thin lines between node centers; new `edgeColor` prop +- **Fuzzy multi-token search** — split query by whitespace, all tokens must match (order-independent); exported `fuzzyMatch` helper +- **Edge search** — search now matches edge labels and types; `searchEdgeResultsAtom`, `searchEdgeResultCountAtom`, `searchTotalResultCountAtom` +- **Smart alignment guides** — node-to-node edge/center snapping; `findAlignmentGuides`, `alignmentGuidesAtom`, `AlignmentGuides` component +- **2 new test suites** — `alignment-guides.test.ts` (8 tests), 7 fuzzy tests added to `search-store.test.ts` + - Total: 489 tests across 36 files + +### Changed +- **Clipboard cut** — `cutToClipboardAtom` now actually deletes selected nodes (with undo support via `pushHistoryAtom`) +- **Edge search dimming** — `EdgeRenderer` keeps matched edges visible during search (checks `searchEdgeResultsAtom`) + +--- + +## [0.25.0] - 2026-03-09 — "Test & Harden" + +### Added +- **8 new test suites** (65 tests) — `graph-mutations`, `graph-derived`, `graph-position`, `action-registry`, `interaction-store`, `reduced-motion-store`, `external-keyboard-store`, `toast-store` + - Total: 474 tests across 35 files + +### Changed +- **Split `TouchActionButton`** — 559-line monolith → 3 files: `icons.tsx` (7 SVGs), `RadialMenu.tsx` (layout + items), `index.tsx` (orchestrator) + +--- + +## [0.24.0] - 2026-03-09 — "iPad First" + +### Added +- **`prefers-reduced-motion` support** — new `prefersReducedMotionAtom` + `watchReducedMotionAtom`; pan/zoom inertia, animated layouts, and edge fade animations respect the OS setting +- **CSS `prefers-reduced-motion`** — all canvas keyframe animations (search pulse, drop target, edge enter/exit, tap pulse) disabled when active +- **Undo/redo in `TouchActionButton`** — primary FAB actions on touch devices (with `UndoIcon` / `RedoIcon`) +- **External keyboard detection** — `hasExternalKeyboardAtom`; hides `TouchActionButton` when modifier keys are available +- **Cursor hiding on touch** — `@media (pointer: coarse)` resets all cursors to `default` via `data-canvas-root` +- **`data-canvas-root`** attribute on `Viewport` for CSS targeting + +### Changed +- **Safe-area margins** — `ViewportControls` and `TouchActionButton` use `max(16px, env(safe-area-inset-*))` instead of hardcoded `16px` + +--- + +## [0.23.0] - 2026-03-09 — "Clean Barrel" + +### Changed +- **Slimmed `core/index.ts` barrel** — 458 → 85 lines (replaced 33 named export blocks with `export *`) +- **Renamed** `CanvasToast` interface → `CanvasToastData` to resolve name collision with `CanvasToast` component + +### Removed +- **`findPortAtPosition`** (deprecated in v0.20) — use `hitTestPort` from `utils/hit-test` +- **`resolveGestureIntent` / `isBackgroundGesture`** (deprecated in v0.14) — use `resolveGestureIndexed` from `gesture-rules` +- **`gesture-resolver.test.ts`** — tests for removed functions +- All `@deprecated` markers cleared from production code + +--- + +## [0.22.0] - 2026-03-09 — "Modular Core" + +### Changed +- **Split `graph-store.ts`** (914 → 68 lines) into 4 focused modules: + - `graph-store.ts` — core atoms (`graphAtom`, `graphUpdateVersionAtom`, drag/edge creation state) + - `graph-position.ts` — position management (`nodePositionAtomFamily`, `updateNodePositionAtom`, cleanup) + - `graph-derived.ts` — read-only UI state (`uiNodesAtom`, `nodeFamilyAtom`, `edgeFamilyAtom`) + - `graph-mutations.ts` — write atoms (CRUD, split/merge, edge animations, DB sync) +- **Zero public API changes** — all exports still available from `core/index.ts` barrel +- Rewrote 51 import sites (25 production, 24 test, 2 dynamic) + +--- + +## [0.21.0] - 2026-03-09 — "Debug" + +### Changed +- **Unified logging** — migrated all 33 raw `console.*` calls to `createDebug` with `debug` package namespaces +- **`createDebug` extended** — now returns `debug()`, `.warn()`, `.error()` sub-loggers + - `.warn()` and `.error()` are always enabled (bypass `DEBUG` filter) + - `.warn()` routes to `console.warn`, `.error()` to `console.error` + - Enable verbose logging: `localStorage.debug = 'canvas:*'` + +### Files migrated +- `useForceLayout.ts` (9 calls), `db/queries/nodes.ts` (5), `db/queries/edges.ts` (4) +- `action-executor.ts` (6), `settings-store.ts` (3), `history-store.ts` (2) +- `NodeErrorBoundary.tsx` (1), `NodeTypeCombobox.tsx` (1), `useAnimatedLayout.ts` (1), `NoteNode.tsx` (2) + +--- + +## [0.20.1] - 2026-03-09 + +### Added +- **`hitTestNode` / `hitTestPort`** — testable hit-test utilities replacing 5 direct `document.elementFromPoint` calls +- **`setHitTestProvider`** — swap DOM hit-testing for mocks in tests or SSR + +### Changed +- **`findPortAtPosition`** deprecated — delegates to `hitTestPort` + +--- + +## [0.20.0] - 2026-03-09 — "Maintain" + +### Fixed +- **`atomFamily` deprecation** — migrated from deprecated `jotai/utils` to `jotai-family` package (prepares for jotai v3, eliminates deprecation warnings) +- **Corrupt `graphology` install** — force-reinstalled pnpm store to fix missing dist files + +### Removed +- **Dead `CanvasConfig` type** — stale interface with `supabaseUrl`/`supabaseAnonKey` fields (unused, unexported) + +--- + +## [0.17.0] - 2026-03-09 — "Connect" + +### Added +- **`EdgePreviewLine`** — animated SVG bezier preview during edge creation (dashed line with color states for idle/valid/snapped) +- **Drag-from-port** — click a port in `NodePorts` to initiate edge creation (previously only available via `EdgeOverlay` handle) +- **Port snap visual** — port dots scale up (1.3x) and glow when a drag is hovering over a compatible port +- **`canConnect` validation** — new callback prop on `EdgeOverlay` to reject invalid connections before edge creation + +### Changed +- **`EdgeOverlayProps`** — added optional `canConnect` callback +- **`NodePorts` / `PortBar`** — port elements now have `onPointerDown` for drag initiation + +--- + +## [0.16.0] - 2026-03-09 — "Harden" + +### Removed (breaking) +- **`resolveGestureIntent`** — removed from public API; use `resolveGestureIndexed` from gesture-rules instead +- **`isBackgroundGesture`** — removed from public API +- **`nodeGestureConfig` / `viewportGestureConfig`** — removed deprecated constants; use `getNodeGestureConfig(source)` / `getViewportGestureConfig(source)` functions +- **`useSupabaseClient` / `supabaseClientAtom`** — removed from public API; use `useStorageAdapter()` instead +- **Legacy Supabase props** — `CanvasDbProvider` and `CanvasProvider` no longer accept `supabaseUrl` / `supabaseAnonKey`; pass an `adapter` prop instead + +### Changed +- **`CanvasProviderProps.adapter`** — now required (was optional) +- **`CanvasDbProviderProps`** — simplified to single interface (was discriminated union) +- **`utils/index.ts`** — exports `getNodeGestureConfig` / `getViewportGestureConfig` functions instead of deprecated constants +- **README.md** — refreshed with v0.14 Gesture System v2 and v0.15 Performance sections; updated architecture diagram and state management table + +--- + +## [0.15.0] - 2026-03-07 — "Perform" + +### Added +- **Spatial grid index** — `SpatialGrid` class with fixed-cell bucketing for O(visible) viewport culling; replaces O(N) linear scan in `visibleNodeKeysAtom` +- **`spatialIndexAtom`** — Jotai atom rebuilding the grid on graph structure and position changes +- **Performance instrumentation** — `canvasMark` / `canvasWrap` helpers with `performance.mark`/`performance.measure`; opt-in via `setPerfEnabled(true)` or `window.__canvasPerf?.(true)` +- **`perfEnabledAtom`** — Jotai atom for perf toggle; `setPerfEnabled` imperative API +- **Gestures subpath export** — `@blinksgg/canvas/gestures` for code-splitting the gesture pipeline +- 17 new tests covering `SpatialGrid` (12) and perf instrumentation (5) + +### Changed +- **`edgeFamilyAtom`** — structural equality cache (`_edgeCache`) prevents re-renders when source/target positions and attributes haven't changed +- **`uiNodesAtom`** — structural equality check: returns previous array reference when all entries match by id, position, and isDragging +- **`updateNodePositionAtom`** — wrapped with `canvasMark('drag-frame')` for profiling the drag hot path +- **`visibleNodeKeysAtom`** — uses `SpatialGrid.query()` + `canvasMark('virtualization-cull')` instead of linear `Array.filter` +- **`virtualization-store`** — removed standalone `isNodeVisible` function in favor of spatial grid AABB intersection + +--- + +## [0.14.0] - 2026-03-07 — "Unify" + +### Added +- **Gesture System v2** — unified pointer + keyboard input pipeline with 4-layer architecture: Normalize → Recognize → Resolve → Dispatch +- **Specificity-scored binding resolution** — patterns scored by type (128), key (64), subjectKind (32), modifier (16/8), source (4), button (2); highest score wins across priority-sorted context stack +- **Keyboard as parallel input stream** — `KeyInputEvent` type shares resolver and dispatcher with `PointerGestureEvent` via `InputEvent` union; `InputPattern` matches both kinds +- **Built-in mapping contexts** — `PALM_REJECTION_CONTEXT` (pri 0), `ACTIVE_INTERACTION_CONTEXT` (pri 15), `SEARCH_CONTEXT` (pri 25), `KEYBOARD_MANIPULATE_CONTEXT` (pri 30), `KEYBOARD_NAVIGATE_CONTEXT` (pri 40), `DEFAULT_CONTEXT` (pri 100) +- **Held keys** — `HeldKeysState` tracks pressed keyboard keys; pointer events carry `heldKeys` for patterns like `Space+drag → pan` +- **Custom modifiers** — `Modifiers.custom?: Record` for non-keyboard flags (iPad toolbar buttons, stylus buttons); scored identically to standard modifiers +- **Phase-aware action handlers** — `PhaseHandler` interface routes `onStart/onMove/onEnd/onInstant/onCancel` for pointer and `onDown/onUp` for keyboard; simple function handlers fire on `start`/`instant`/`down` +- **`consumeInput` flag** — bindings can block lower-priority contexts from matching the same event +- **`useGestureSystem` hook** — manages context stack, palm rejection toggle, held key state; produces pre-built `MappingIndex` for O(1) event bucketing +- **`useCanvasGestures` hook** — wires pointer events from a viewport ref through the full pipeline with inertia support +- **`useNodeGestures` hook** — per-node pointer event handlers feeding the pipeline with `{ kind: 'node', nodeId }` subject +- **`useRegisterInputActions` hook** — registers all built-in action handlers (selection, viewport, clipboard, history, layout, navigation, search) +- **`useInputModeGestureContext` hook** — auto-pushes/removes input mode contexts (pickNode, pickNodes, pickPoint) +- **`GestureProvider` / `InputProvider`** — React context provider wrapping the gesture system for tree-wide access +- **Keyboard shortcuts in gesture pipeline** — `/` (command line), `Escape`, `Delete`/`Backspace`, `Ctrl/Cmd+C/X/V/D/A/Z/Y/F/M` all routed through binding resolution instead of ad-hoc key handlers +- **Keyboard navigate mode** — Arrow keys move focus, Enter enters manipulate mode, Space activates, Tab cycles nodes +- **Keyboard manipulate mode** — Arrow keys nudge selected nodes (Shift = large nudge), Escape exits +- **Search keyboard bindings** — `Enter`/`Shift+Enter` and `Ctrl/Cmd+G` cycle search results within gesture pipeline +- **`SplitNode`, `GroupNodes`, `MergeNodes`** — added to `BuiltInActionId` enum; registered as proper pipeline actions with `ActionHelpers` callbacks +- **Pan inertia** — `PanInertia` class with friction-based deceleration after drag release +- **Timed state machine** — `TimedStateRunner` for tap counting, long-press detection, double/triple-tap recognition with configurable thresholds +- **Interactive demo** — `GestureV2Demo` with Binding Composer (pointer/keyboard), Event Composer (pointer/keyboard), held key simulation, real-time event log with input kind badges +- **Architecture docs** — `packages/canvas/docs/arch-gesture-system-v2.md`, `plan-gesture-system-v2.md`, `plan-keyboard-gesture-integration.md` +- **5 new test suites** — specificity (16 tests), mapper (12), timed-state (8), palm-rejection (5), inertia (4) + +### Changed +- **`keyboard.ts`** — shortcut handling simplified; most key bindings moved to gesture pipeline contexts +- **`Viewport.tsx`** — gesture intent resolution delegated to v2 pipeline when available +- **`Node.tsx`** — pointer events can route through `useNodeGestures` pipeline +- **`settings-types.ts`** — `ActionContext` gains optional `selectedNodeIds`; `ActionHelpers` gains optional `splitNode`, `groupNodes`, `mergeNodes` +- **`interaction-store.ts`** — added `KeyboardInteractionMode` type (`'navigate' | 'manipulate'`) and `keyboardInteractionModeAtom` +- **`selection-path-store.ts`** — exported `isSelectingAtom` for guard context access + +--- + +## [0.13.0] - 2026-03-05 — "Refine" + +### Added +- **Undo/redo for structural operations** — `splitNodeAtom`, `mergeNodesAtom`, `nestNodesOnDropAtom`, `groupSelectedNodesAtom`, `ungroupNodesAtom` now push history snapshots with descriptive labels; all fully undoable +- **Undo/redo toast feedback** — `canvasToastAtom`, `showToastAtom` in `toast-store.ts`; `CanvasToast` overlay component shows "Undo: {label}" / "Redo: {label}" for 2 seconds after Ctrl+Z/Y +- **Tree layout** — `useTreeLayout` hook: BFS depth assignment, root detection, top-down/left-right direction; `treeLayout` and `horizontalLayout` commands +- **Grid layout** — `useGridLayout` hook: spatial-order-preserving grid with auto column count; `gridLayout` command +- **Animated layout transitions** — `useAnimatedLayout` shared hook: RAF loop with cubic easing, history snapshot before animation, persistence callback +- **Zoom inertia** — pinch-to-zoom continues with momentum after fingers lift (friction=0.88, velocity tracking) +- **Snap-to-100% zoom detent** — zoom snaps to 1.0 when within 0.03 threshold (both wheel and pinch) +- **Simultaneous pan during pinch** — tracks finger midpoint movement frame-to-frame for fluid two-finger gestures +- **Tap pulse animation** — `canvas-tap-pulse` CSS keyframe on ViewportControls buttons for tactile feedback +- 19 new tests (404 total) covering undo for split/merge/nest/group/ungroup, tree layout algorithm, grid layout algorithm + +### Changed +- **`CommandProvider`** — wires `useTreeLayout` and `useGridLayout` into `CommandContext.layout` +- **`useCanvasHistory`** — shows toast with operation label on undo/redo +- **`Viewport`** — zoom inertia loop, snap-to-100% in onWheel/onPinch, simultaneous pan tracking in onPinch +- **`ViewportControls`** — ControlButton applies `canvas-tap-pulse` class on click +- **`CanvasAnimations`** — added `canvas-tap-pulse` keyframe + +--- + +## [0.12.0] - 2026-03-05 — "Reshape" + +### Added +- **Drag-to-nest** — drag a node over another to nest it as a child; visual drop-target highlight with pulsing blue outline; `dropTargetNodeIdAtom`, `nestNodesOnDropAtom` +- **Two-finger split** — two fingers diverging on a node (80px threshold) splits it into two copies with all edges duplicated; `splitNodeAtom`, `useSplitGesture` hook +- **Merge nodes** — `Ctrl+M` or command palette merges 2+ selected nodes; edges re-routed to survivor, internal edges discarded; `mergeNodesAtom`, `mergeNodesCommand` +- **`split-node` gesture intent** — added to `GestureIntent` type; pinch-on-node now maps to `split-node` instead of `zoom` +- **`.canvas-drop-target` CSS** — pulsing blue outline animation for drop target feedback +- 18 new tests (385 total) covering nest-on-drop, split-node, merge-nodes + +### Changed +- **`useNodeDrag`** — detects drop target via `elementFromPoint` during drag; nests nodes on drop end +- **`Node`** — integrates `useSplitGesture` for two-finger split; shows drop-target highlight +- **`useGlobalKeyboard`** — added `Ctrl+M` shortcut for merge + +--- + +## [0.11.0] - 2026-03-05 — "Interactive" + +### Added +- **Nested group drag** — dragging a group node now moves all its descendants (children, nested groups) together via `getNodeDescendants` helper +- **Edge deletion animations** — `removeEdgeWithAnimationAtom` snapshots edge state before removal and renders a fade-out animation via `departingEdgesAtom`; `DepartingEdgeItem` renders the exit animation +- **Edge creation animations** — CSS fade-in animation class `.canvas-edge-enter` for newly created edges +- **Edge label editing** — double-click an edge label to open an inline `` overlay; `editingEdgeLabelAtom` + `updateEdgeLabelAtom` manage state; `EdgeLabelEditor` component positioned at label world coords +- **`EdgeLabelEditor`** component — HTML input overlay for inline edge label editing, included automatically in `Canvas` +- 14 new tests (367 total) covering nested group drag, departing edges, edge label editing + +### Changed +- **`useNodeDrag`** — on first drag frame, expands `initialPositions` to include all descendants of group nodes being dragged +- **`edgeFamilyAtom`** — now depends on `graphUpdateVersionAtom` for non-position attribute reactivity (label, color changes) +- **`EdgeRenderer`** — renders departing edges with exit animation; edge labels support double-click to edit +- **`CanvasAnimations`** — added `canvas-edge-fade-in`, `canvas-edge-fade-out` keyframes and `.canvas-edge-enter`, `.canvas-edge-exit` CSS classes + +--- + +## [0.10.0] - 2026-03-05 — "Polish" + +### Added +- **Edge re-routing** — `collapsedEdgeRemapAtom` maps collapsed children to their outermost collapsed ancestor; edges visually re-route to the group node instead of disappearing +- **Group auto-resize** — `autoResizeGroupAtom` recomputes group bounding box from children with padding; triggered automatically when drag ends on a child node +- **Search keyboard shortcuts** — `Ctrl+F` opens search, `Enter`/`Shift+Enter` cycle results, `Ctrl+G`/`Ctrl+Shift+G` alternative navigation, `Escape` clears search before clearing selection +- **Edge search dimming** — edges dim to `opacity: 0.2` when search is active and neither endpoint matches, with `150ms` CSS transition +- **Search highlight pulse** — currently highlighted search result gets an animated amber box-shadow pulse (`canvas-search-highlight` CSS class) +- **`CanvasAnimations`** component — injects CSS keyframes for search pulse and edge transitions +- 11 new tests (353 total) covering edge remap, internal edge hiding, cross-boundary edges, auto-resize, and drag-triggered resize + +### Changed +- **`visibleEdgeKeysAtom`** — now remap-aware: resolves effective endpoints through `collapsedEdgeRemapAtom`, hides internal edges (both endpoints in same collapsed group) +- **`edgeFamilyAtom`** — uses remapped positions when source/target is inside a collapsed group +- **`endNodeDragAtom`** — triggers `autoResizeGroupAtom` for the parent group after drag ends +- **`useGlobalKeyboard`** — `Escape` now clears search first (before clearing selection) + +--- + +## [0.9.0] - 2026-03-05 — "Full Stack" + +### Added +- **Abstract persistence** — `CanvasStorageAdapter` interface with `SupabaseStorageAdapter` implementation and `InMemoryStorageAdapter`. `CanvasDbProvider` now accepts an `adapter` prop for any backend +- **`storageAdapterAtom`** — Jotai atom for global adapter access; `useStorageAdapter()` hook +- **Node grouping** — `parentId` attribute on graph nodes, collapsible container groups with `GroupNode` component +- **`group-store`** — `collapsedGroupsAtom`, `toggleGroupCollapseAtom`, `nodeChildrenAtom`, `nodeParentAtom`, `setNodeParentAtom`, `groupSelectedNodesAtom`, `ungroupNodesAtom`, `isNodeCollapsed()` utility +- **Group commands** — `groupNodes`, `ungroupNodes`, `collapseGroup`, `expandGroup` registered in command palette +- **Search & filter** — `searchQueryAtom`, `searchResultsAtom` (case-insensitive substring match on label/type/id), `highlightedSearchIndexAtom` with next/prev navigation +- **Search commands** — `searchNodes` (aliases: `find`, `search`) and `clearSearch` commands +- **Node dimming** — non-matching nodes rendered with `opacity: 0.2` and `pointerEvents: none` when search filter is active +- **Component tests** — 39 new React component tests (Canvas, Node, Viewport, Minimap, SelectionOverlay, GroupNode) using `@testing-library/react` +- 89 new tests (342 total) + +### Changed +- **`uiNodesAtom`** — filters out nodes whose ancestor group is collapsed (walks parent chain) +- **`CanvasDbProvider`** — accepts union props: `{ adapter }` (primary) or `{ supabaseUrl, supabaseAnonKey }` (legacy, deprecated) +- **`CanvasProvider`** — accepts optional `adapter` prop alongside deprecated supabase credential props + +--- + +## [0.8.0] - 2026-03-05 — "Full Picture" + +### Added +- **Minimap** — ``-based overview component showing all nodes with draggable viewport rectangle. Click/drag to pan. Configurable position, size, and colors +- **Lasso selection** — pencil drag on background draws freeform lasso path; nodes whose center falls inside the polygon are selected +- **Rect selection** — Shift+drag on background draws rectangular selection box; nodes overlapping the rect (AABB intersection) are selected +- **`SelectionOverlay`** — SVG component rendering the active lasso/rect path with configurable colors +- **`selection-path-store`** — new core store with `startSelectionAtom`, `updateSelectionAtom`, `endSelectionAtom`, `selectionPathAtom`, `selectionRectAtom` +- **`pointInPolygon()`** — ray-casting utility for lasso selection, exported from core +- **Zoom animations** — `animateZoomToNodeAtom` and `animateFitToBoundsAtom` write atoms for smooth animated viewport transitions with cubic ease-in-out +- **`useZoomTransition`** — hook driving requestAnimationFrame-based zoom/pan animation loop +- **`zoomAnimationTargetAtom`** — stores current animation target (start/end zoom/pan, duration) +- 39 new tests (253 total) covering selection paths, point-in-polygon, and zoom animation atoms + +### Changed +- **Viewport.tsx** — now resolves gesture intent once at drag start (with modifier key state) and stores it in a ref, fixing Shift+drag rect-select and pencil lasso +- **TODO.md** — marked v0.7 completions, updated roadmap for v0.9+ + +--- + +## [0.7.0] - 2026-03-05 — "Solid Ground" + +### Added +- **Headless Canvas API** — `createCanvasAPI(store)` factory provides all canvas operations (selection, viewport, graph, history, clipboard, snap, virtualization, actions) without React +- **`buildActionHelpers(store)`** — pure Jotai store-based ActionHelpers construction, extracted from `useActionExecutor` for headless use +- **`fitToBoundsAtom`** — headless write atom for fitting viewport to graph or selection bounds +- **`centerOnNodeAtom`** — headless write atom for centering viewport on a specific node +- **Arrow key navigation** — spatial keyboard navigation between nodes (Arrow keys = directional focus, Enter/Space = select, Tab = cycle by z-index) +- **`focusedNodeIdAtom`** — keyboard focus state, distinct from selection, with visual focus ring +- **`useArrowKeyNavigation` hook** — React hook for enabling keyboard navigation +- **`useCanvasGraph` hook** — convenience hook for graph structure access (nodeCount, edgeCount, getNode, getEdge) +- **214 unit tests** — comprehensive coverage for graph-store, selection-store, history-store, clipboard-store, viewport-store, virtualization-store, and canvas-api (up from 47) + +### Changed +- **Edge re-render optimization** — `edgeFamilyAtom` no longer depends on `nodePositionUpdateCounterAtom` (global counter). Reactivity flows through `nodePositionAtomFamily` with structural equality caching. Performance: O(connected edges) per drag frame instead of O(all edges) +- **`useActionExecutor` simplified** — refactored to use `buildActionHelpers` internally (~30 lines from ~160) +- **`useFitToBounds` simplified** — delegates to `fitToBoundsAtom` instead of inline computation +- **Position atom caching** — `nodePositionAtomFamily` returns same object reference for unchanged positions via `_positionCache` Map + +### Fixed +- Position atom cleanup now also clears the position cache to prevent stale references + +--- + +## [0.6.0] - 2026-03-03 + +### Changed +- **React Compiler integration** — automatic memoization replaces 110 `useCallback`, 25 `useMemo`, 2 `React.memo` +- **Context as JSX** — 3 providers modernized (`CanvasStyleProvider`, `CommandProvider`, `CanvasDbProvider`) +- **Ref cleanup** — `CanvasStyleProvider` uses ref callback with cleanup for CSS variable lifecycle + +### Removed +- **Dropped React 18** — peerDependencies require `react@^19.0.0` + +--- + +## [0.5.0] - 2026-03-03 + +### Added +- `NodeClick` event type — single-click events on nodes now flow through the action executor +- `EdgeHover` / `EdgeLeave` observability callbacks on `Canvas` +- `React.memo` on `EdgeItem` component for render optimization + +### Fixed +- `ConnectedNodeRenderer` virtualization — switched from `nodeKeysAtom` to `visibleNodeKeysAtom` +- `ConnectedNode` forwards `onClick`, `onHover`, `onLeave` props correctly +- `history-store` typed assertion for delta type checking + +--- + +## [0.4.0] - 2026-03-03 + +### Added +- **Edge events** — `EdgeClick`, `EdgeDoubleClick`, `EdgeRightClick` with callback props on `Canvas` +- **Observability callbacks** — `onSelectionChange`, `onViewportChange`, `onDragStart`, `onDragEnd`, `onNodeHover`, `onNodeLeave` +- **Strong type contracts** — `UINodeProperties` replaces `Record`, `UINodeState` replaces `any` in event callbacks +- `SelectEdge` built-in action in the action registry + +--- + +## [0.3.0] - 2026-03-03 + +### Added +- All 8 event-action mappings fully wired (`NodeRightClick`, `NodeLongPress`, `BackgroundClick`) +- `BackgroundClick` routed through action executor when `onBackgroundClick` prop is provided + +### Fixed +- `centerOnNode` viewport calculation — correctly reads node position from graph store + +--- + +## [0.2.x] - 2025-01-14 + +### Added + +#### Settings Panel +- `CanvasEventType` enum for all canvas events (double-click, triple-click, right-click, long-press) +- `ActionRegistry` with `registerAction()` for custom actions +- Built-in actions: selection, viewport, node, layout, history (17 total) +- `useCanvasSettings()` hook, `useActionExecutor()` hook +- `SettingsPanel` headless UI component +- Three built-in presets: Default, Minimal, Power User +- `localStorage` persistence via `atomWithStorage` + +#### Layout System +- `useFitToBounds()`, `useGetGraphBounds()`, `useSelectionBounds()`, `useForceLayout()` +- Layout utilities: `calculateBounds()`, `checkNodesOverlap()`, `getNodeCenter()` + +#### Command Palette +- `@blinksgg/canvas/commands` subpath export +- `CommandProvider`, `CommandLine`, `CommandSearch`, `CommandInputCollector`, `CommandFeedbackOverlay` +- `registerBuiltinCommands()`, `registerCommand()`, `useCommandLine()`, `useGlobalKeyboard()` +- Keyboard shortcuts: `/`, `Cmd+K`, `Escape` + +#### Clipboard +- Local-first copy/cut/paste/duplicate (`Ctrl+C/X/V/D`) + +#### Virtualization +- Viewport culling (+200px buffer) + +#### Connection Ports +- `PortDefinition`, `NodePorts` component, `calculatePortPosition()`, `arePortsCompatible()` + +#### Input System +- `classifyPointer()` for finger/pencil/mouse classification +- `resolveGestureIntent()` with palm rejection +- Touch/stylus support with device-aware thresholds + +#### Other +- `d3-force` added as peer dependency + +--- + +## [0.2.0] - 2025-01-07 + +### Added +- **Subscription hooks** for reactive state access: + - `useCanvasSelection()`, `useCanvasViewport()`, `useCanvasDrag()` +- **New subpath export** `@blinksgg/canvas/hooks` +- **Configurable edge paths** with 8 path types: + - `bezier` (default), `bezier-vertical`, `bezier-smart` + - `straight`, `step`, `step-vertical`, `step-smart`, `smooth-step` +- Edge path calculator utilities from `@blinksgg/canvas/utils` + +### Changed +- `EdgeRenderer` uses configurable path calculators instead of hardcoded bezier curves + +--- + +## [0.1.0] - 2025-01-01 + +### Added +- Initial release +- Core state management with Jotai atoms +- Node drag, resize, and selection +- Edge creation and management +- Viewport pan/zoom with gesture support +- Supabase sync integration +- Style theming system with CSS variables +- Undo/redo history support + +--- + +## Breaking Changes Guide + +### Upgrading to 0.6.0 + +- **React 18 is no longer supported.** Update to React 19. +- No API changes — the React Compiler handles memoization automatically. + +### Upgrading to 0.2.0 + +No breaking changes. Subscription hooks are recommended over direct atom imports: + +```tsx +// Before +import { selectedNodeIdsAtom } from '@blinksgg/canvas/core'; +const selectedNodeIds = useAtomValue(selectedNodeIdsAtom); + +// After (recommended) +import { useCanvasSelection } from '@blinksgg/canvas/hooks'; +const { selectedNodeIds, count, hasSelection } = useCanvasSelection(); +``` + +--- + +## Version Policy + +- **MAJOR** version: Breaking changes (removed/renamed exports, changed return types) +- **MINOR** version: New features (new hooks, components, options) +- **PATCH** version: Bug fixes (no API changes) diff --git a/PRINCIPLES.md b/PRINCIPLES.md new file mode 100644 index 0000000..3ef6b1b --- /dev/null +++ b/PRINCIPLES.md @@ -0,0 +1,73 @@ +# @blinksgg/canvas — Core Principles + +These principles guide every design decision in the canvas library. +When in doubt, refer here. When principles conflict, earlier ones win. + +## 1. Touch-first, mouse-compatible + +Design for fingers and stylus first, then ensure mouse works well. +Every interaction has device-aware thresholds — 44px hit targets for +fingers, 3px drag thresholds for pencil, palm rejection when stylus +is active. Mouse is not the default; it is one of three equal input +sources. + +> "Pencil draws, fingers navigate, mouse does both." +> — input-classifier.ts + +## 2. Headless core, optional UI + +All state lives in Jotai atoms with zero React dependency. The `core/` +layer is a pure state machine: atoms in, atoms out. Components in +`components/` are one possible UI — consumers can build entirely +custom UIs by importing only `@blinksgg/canvas/core` and +`@blinksgg/canvas/hooks`. + +## 3. Local-first, sync-optional + +Every operation (drag, resize, copy, paste, undo, redo) works without +a network connection. The clipboard is in-memory. Undo/redo uses +delta-based snapshots in local state. The database layer (`db/`) is +an optional add-on with an adapter interface — not a requirement. + +## 4. Events are data, actions are configurable + +Canvas interactions produce typed events (NodeDoubleClick, +BackgroundLongPress, etc.). What *happens* in response is a mapping +in a settings store, not hardcoded logic. Users remap actions via +presets or the SettingsPanel. This separates "what happened" from +"what to do about it." + +## 5. Atoms over context + +Prefer Jotai atoms over React context for shared state. Atoms are +composable, testable without React, and don't cause provider +waterfall re-renders. Use React context only for non-reactive +configuration (style themes, callback refs). + +## 6. Fully controllable headless API + +Every canvas operation must be executable from the `core/` layer +without React. If a hook can do it, an atom or pure function in +`core/` can do it too. The React hooks are convenience wrappers, +not the only path. External tools, tests, and non-React integrations +should have full control via `store.set(atom, value)`. + +## 7. Performance by default + +Virtualization is on by default (only render visible nodes). +The React Compiler handles memoization automatically. Edge paths +only recompute when their connected nodes move. Delta-based history +is O(1) for moves instead of O(N) full-graph snapshots. + +## 8. Composition over configuration + +Provide small, focused hooks (`useNodeDrag`, `useNodeResize`, +`useTapGesture`) that compose into complex behavior. The `Canvas` +component is a convenient composition — not the only way to use the +library. Advanced users compose hooks directly. + +## 9. Backend-agnostic persistence + +The `CanvasStorageAdapter` interface defines CRUD + subscriptions. +Implement it for any backend. The simplest path is callback props +(`onNodePersist`) with no adapter at all. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8b91358 --- /dev/null +++ b/README.md @@ -0,0 +1,1050 @@ +# @blinksgg/canvas + +**v3.0 — React Compiler** + +A touch-first canvas library for node-based editors with drag, resize, pan/zoom, input-aware gestures, configurable event-action mappings, command palette, and optional Supabase sync. + +**[Core Principles](./PRINCIPLES.md)** | **[Changelog](./CHANGELOG.md)** | **[API Stability](./docs/api-stability.md)** | **[Migration Guide](./docs/migration-v1.md)** | **[TODO / Roadmap](./TODO.md)** + +## Quick Start + +```tsx +import { Provider as JotaiProvider } from 'jotai'; +import { Canvas, CanvasStyleProvider, registerBuiltinCommands } from '@blinksgg/canvas'; + +registerBuiltinCommands(); + +function App() { + return ( + + + ( +
+ {node.label} +
+ )} + /> +
+
+ ); +} +``` + +## Architecture + +### Package Structure + +``` +packages/canvas/src/ +├── core/ # Headless state (Jotai + Graphology) +│ ├── types.ts # Core type definitions +│ ├── graph-store.ts # graphAtom, positions, edges, drag state +│ ├── viewport-store.ts # zoom, pan, coordinate transforms +│ ├── selection-store.ts # selectedNodeIdsAtom, selectedEdgeIdAtom +│ ├── input-classifier.ts # finger/pencil/mouse classification +│ ├── input-store.ts # Active pointer tracking, stylus detection +│ ├── gesture-resolver.ts # Gesture intent resolution + palm rejection +│ ├── interaction-store.ts # Input modes (picking, text), feedback +│ ├── action-executor.ts # Execute actions by ID with context +│ ├── action-registry.ts # Global action registry (built-in + custom) +│ ├── settings-types.ts # Event types, action IDs, presets +│ ├── settings-store.ts # Event-action mappings, localStorage persistence +│ ├── history-store.ts # Delta-based undo/redo (50 entries) +│ ├── clipboard-store.ts # Local-first copy/cut/paste/duplicate +│ ├── snap-store.ts # Snap-to-grid with configurable size +│ ├── virtualization-store.ts # Viewport culling for large graphs +│ ├── spatial-index.ts # SpatialGrid for O(visible) culling +│ ├── perf.ts # Performance instrumentation (opt-in) +│ ├── sync-store.ts # Sync status, mutation queue +│ ├── locked-node-store.ts # Node detail/lock view +│ ├── group-store.ts # Node grouping, collapse/expand +│ ├── search-store.ts # Search query, results, navigation +│ ├── port-types.ts # Connection port definitions +│ ├── gesture-rules.ts # Composable gesture rule system +│ ├── gesture-rule-store.ts # Gesture rule state management +│ └── node-type-registry.tsx # Custom node type registration +│ +├── components/ # React UI +│ ├── Canvas.tsx # Main orchestrator +│ ├── Viewport.tsx # Pan/zoom with inertia + gesture handling +│ ├── Node.tsx # Draggable/resizable node +│ ├── GroupNode.tsx # Collapsible container for grouped nodes +│ ├── CanvasAnimations.tsx # CSS keyframe injection for search pulse + edge transitions +│ ├── EdgeLabelEditor.tsx # Inline edge label editing overlay +│ ├── NodeRenderer.tsx # Renders visible nodes (virtualized) +│ ├── EdgeRenderer.tsx # Renders visible edges (+ departing edge animations) +│ ├── Grid.tsx # Background grid + crosshairs +│ ├── ViewportControls.tsx # Floating zoom +/- buttons +│ ├── SettingsPanel.tsx # Headless settings (className-based) +│ ├── NodeContextMenu.tsx # Adaptive: dialog (desktop) / bottom sheet (touch) +│ ├── NodePorts.tsx # Expandable connection ports +│ ├── EdgeOverlay.tsx # Edge creation drag overlay +│ ├── ResizeHandle.tsx # 8-directional, 44px touch targets +│ ├── NodeErrorBoundary.tsx # Per-node error isolation +│ ├── CommandLine/ # Command palette components +│ └── CommandFeedbackOverlay.tsx # Visual feedback during commands +│ +├── hooks/ # React hooks +├── commands/ # Command palette system +├── gestures/ # Gesture System v2 pipeline +├── db/ # Optional Supabase integration +├── providers/ # CanvasProvider, CanvasStyleProvider +├── styles/ # CSS variable theming +├── nodes/ # Pre-built node types (NoteNode) +└── utils/ # Layout, edge paths, debug helpers +``` + +### Layer Diagram + +```mermaid +flowchart TB + subgraph Input["Input Layer"] + PE["Pointer Events"] --> IC["classifyPointer()"] + IC --> IS["input-store
(active pointers, stylus detection)"] + IS --> GR["resolveGestureIntent()
(palm rejection, modifier keys)"] + end + + subgraph Actions["Action Layer"] + GR --> VP["Viewport
(pan, zoom, pinch)"] + GR --> ND["Node
(drag, resize, select)"] + GR --> CT["Canvas Events
(double-click, right-click, long-press)"] + CT --> AE["Action Executor
(settings-driven)"] + AE --> AR["Action Registry
(17 built-in + custom)"] + end + + subgraph State["State Layer (Jotai)"] + AR --> GS["graph-store
(Graphology)"] + AR --> SS["selection-store"] + AR --> VS["viewport-store"] + AR --> HS["history-store
(delta undo/redo)"] + GS --> VZ["virtualization-store
(viewport culling)"] + end + + subgraph UI["UI Layer"] + VZ --> NR["NodeRenderer"] + VZ --> ER["EdgeRenderer"] + VS --> Grid["Grid + Crosshairs"] + end +``` + +### State Management + +**Jotai** atoms for reactive state, **Graphology** as the graph data structure. + +| Store | Key Atoms | Purpose | +|-------|-----------|---------| +| graph-store | `graphAtom`, `nodePositionAtomFamily(id)`, `draggingNodeIdAtom` | Node/edge data, positions, drag state | +| viewport-store | `zoomAtom`, `panAtom`, `screenToWorldAtom`, `worldToScreenAtom` | Viewport transforms | +| selection-store | `selectedNodeIdsAtom`, `selectedEdgeIdAtom` | Selection state | +| input-store | `primaryInputSourceAtom`, `isStylusActiveAtom`, `isMultiTouchAtom` | Input device tracking | +| settings-store | `eventMappingsAtom`, `activePresetIdAtom`, `canvasSettingsAtom` | Event-action config (localStorage) | +| history-store | `canUndoAtom`, `canRedoAtom`, `pushDeltaAtom`, `undoAtom`, `redoAtom` | Delta-based undo/redo | +| virtualization-store | `visibleNodeKeysAtom`, `visibleEdgeKeysAtom` | Viewport culling | +| clipboard-store | `clipboardAtom`, `copyToClipboardAtom`, `pasteFromClipboardAtom` | Copy/paste | +| snap-store | `snapEnabledAtom`, `snapGridSizeAtom` | Grid snapping | +| sync-store | `syncStatusAtom`, `pendingMutationsCountAtom` | DB sync state | +| group-store | `collapsedGroupsAtom`, `nodeChildrenAtom`, `setNodeParentAtom` | Node grouping/nesting | +| virtualization-store | `visibleNodeKeysAtom`, `visibleEdgeKeysAtom`, `spatialIndexAtom` | Viewport culling (SpatialGrid) | +| gesture-rule-store | `gestureRulesAtom`, `gestureRuleIndexAtom`, `consumerGestureRulesAtom` | Gesture v2 rule management | + +--- + +## Input System + +The canvas uses a touch-first input pipeline. Every pointer event flows through classification, gesture resolution, then intent execution. + +### Input Classification + +`classifyPointer(event)` maps PointerEvents to one of three sources with device-specific thresholds: + +| Source | Drag Threshold | Long Press | Hit Target | Notes | +|--------|---------------|------------|------------|-------| +| `finger` | 12px | 600ms | 44px | Apple HIG minimum | +| `pencil` | 3px | 600ms | 24px | Pressure/tilt tracked | +| `mouse` | 3px | N/A (uses right-click) | 16px | Most precise | + +### Gesture Resolution + +`resolveGestureIntent(context)` maps `{source, type, target, modifiers}` to `GestureIntent`: + +| Gesture | On Node | On Background | +|---------|---------|---------------| +| Finger drag | Move node | Pan (with inertia) | +| Pencil drag | Move node | Lasso select | +| Mouse drag | Move node | Pan | +| Shift+drag | Move node | Rectangle select | +| Long-press | Context menu callback | Background long-press callback | +| Right-click | Context menu callback | Background right-click callback | +| Double-tap | Double-click callback | Background double-click callback | +| Pinch | - | Zoom | + +### Palm Rejection + +When a stylus is active (`isStylusActiveAtom === true`), finger inputs are demoted: +- Finger taps: ignored (stylus tap takes precedence) +- Finger drags: pan only (never move nodes) +- Pencil inputs: unaffected + +--- + +## Event-Action System + +Canvas events (double-click, right-click, long-press) are mapped to configurable actions. Users can change what happens on each event type. + +### Event Types + +```ts +enum CanvasEventType { + NodeClick, NodeDoubleClick, NodeTripleClick, NodeRightClick, NodeLongPress, + BackgroundClick, BackgroundDoubleClick, BackgroundRightClick, BackgroundLongPress, + EdgeClick, EdgeDoubleClick, EdgeRightClick, +} +``` + +### Built-in Actions (17) + +| ID | Category | Description | +|----|----------|-------------| +| `none` | - | No-op | +| `clear-selection` | Selection | Deselect all | +| `select-all` | Selection | Select all nodes | +| `invert-selection` | Selection | Invert selection | +| `select-edge` | Selection | Select clicked edge | +| `fit-to-view` | Viewport | Zoom to fit selection | +| `fit-all-to-view` | Viewport | Zoom to fit entire graph | +| `center-on-node` | Viewport | Center viewport on node | +| `reset-viewport` | Viewport | Reset zoom/pan to default | +| `create-node` | Creation | Create new node at position | +| `delete-node` | Node | Delete selected nodes | +| `open-context-menu` | Node | Open context menu | +| `toggle-lock` | Node | Toggle lock state | +| `apply-force-layout` | Layout | Run force-directed layout | +| `undo` / `redo` | History | Undo/redo | + +### Presets + +| Preset | Node Dbl-Click | Node Triple-Click | Bg Dbl-Click | Bg Long-Press | +|--------|------|------|------|------| +| **Default** | Fit to View | Toggle Lock | Fit All to View | Create Node | +| **Minimal** | None | None | None | None | +| **Power User** | Toggle Lock | Delete Selected | Create Node | Force Layout | + +### Using the Action System + +```tsx +import { useActionExecutor, CanvasEventType, createActionContext } from '@blinksgg/canvas'; + +function MyCanvas() { + const { executeEventAction } = useActionExecutor({ + onCreateNode: async (pos) => { /* create node at pos */ }, + onDeleteNode: async (id) => { /* delete node */ }, + onOpenContextMenu: (pos, nodeId) => { /* show menu */ }, + }); + + return ( + { + executeEventAction( + CanvasEventType.NodeDoubleClick, + createActionContext(CanvasEventType.NodeDoubleClick, + { clientX: nodeData.x, clientY: nodeData.y }, + { x: nodeData.x, y: nodeData.y }, + { nodeId } + ) + ); + }} + /> + ); +} +``` + +### Custom Actions + +```tsx +import { registerAction, ActionCategory } from '@blinksgg/canvas'; + +registerAction({ + id: 'my-custom-action', + label: 'My Action', + description: 'Does something custom', + category: ActionCategory.Custom, + handler: (context, helpers) => { + if (context.nodeId) { + helpers.selectNode(context.nodeId); + } + }, +}); +``` + +--- + +## Command Palette + +A slash-command system with fuzzy search, sequential input collection, and keyboard shortcuts. + +### Setup + +```tsx +import { + CommandProvider, CommandLine, CommandFeedbackOverlay, + registerBuiltinCommands, useGlobalKeyboard, +} from '@blinksgg/canvas'; + +registerBuiltinCommands(); + +function KeyboardHandler() { + useGlobalKeyboard(); + return null; +} + +function App() { + return ( + { /* ... */ }} + onDeleteNode={async (nodeId) => { /* ... */ }} + > + + + + + + + ); +} +``` + +### Built-in Commands + +| Command | Shortcut | Category | +|---------|----------|----------| +| Fit to View | - | Viewport | +| Fit Selection | - | Viewport | +| Reset Viewport | - | Viewport | +| Zoom In / Out | - | Viewport | +| Select All | `Ctrl+A` | Selection | +| Clear Selection | `Escape` | Selection | +| Invert Selection | - | Selection | +| Undo / Redo | `Ctrl+Z` / `Ctrl+Shift+Z` | History | +| Copy / Cut / Paste | `Ctrl+C` / `Ctrl+X` / `Ctrl+V` | Clipboard | +| Duplicate | `Ctrl+D` | Clipboard | +| Delete Selected | `Delete` / `Backspace` | Clipboard | +| Force Layout | - | Layout | +| Tree Layout | - | Layout | +| Grid Layout | - | Layout | +| Horizontal Layout | - | Layout | + +### Custom Commands + +```tsx +import { registerCommand } from '@blinksgg/canvas'; + +registerCommand({ + id: 'my-command', + label: 'My Custom Command', + category: 'custom', + inputs: [ + { type: 'pickNode', prompt: 'Select a node' }, + ], + execute: async (inputs, ctx) => { + const nodeId = inputs[0]; + // do something with nodeId + }, +}); +``` + +--- + +## Components + +### Canvas + +Main orchestrator combining Viewport + NodeRenderer + EdgeRenderer. + +```tsx +interface CanvasProps { + renderNode: (props: NodeRenderProps) => ReactNode; // Required + + // Node events (7) + onNodeClick?: (nodeId, nodeData) => void; + onNodeDoubleClick?: (nodeId, nodeData) => void; + onNodeTripleClick?: (nodeId, nodeData) => void; + onNodeRightClick?: (nodeId, nodeData, event) => void; + onNodeLongPress?: (nodeId, nodeData, position) => void; + onNodeHover?: (nodeId, nodeData) => void; + onNodeLeave?: (nodeId) => void; + + // Edge events (5) + onEdgeClick?: (edgeKey, edgeData, event) => void; + onEdgeDoubleClick?: (edgeKey, edgeData, event) => void; + onEdgeRightClick?: (edgeKey, edgeData, event) => void; + onEdgeHover?: (edgeKey, edgeData) => void; + onEdgeLeave?: (edgeKey) => void; + + // Background events (4) + onBackgroundClick?: (worldPos) => void; + onBackgroundDoubleClick?: (worldPos) => void; + onBackgroundRightClick?: (worldPos, event) => void; + onBackgroundLongPress?: (worldPos) => void; + + // Observability callbacks + onSelectionChange?: (selectedNodeIds, selectedEdgeId) => void; + onViewportChange?: (viewport: { zoom, pan }) => void; + onDragStart?: (nodeIds) => void; + onDragEnd?: (nodeIds, positions) => void; + + // Persistence + onNodePersist?: (nodeId, graphId, uiProperties) => Promise; + nodeWrapper?: ComponentType<{ children, nodeData }>; + children?: ReactNode; + + // Viewport config + minZoom?: number; // Default: 0.1 + maxZoom?: number; // Default: 5 + enablePan?: boolean; + enableZoom?: boolean; +} +``` + +### SettingsPanel + +Headless settings panel. All layout controlled via className props. + +```tsx +

Settings

} +/> +``` + +### Other Components + +| Component | Purpose | +|-----------|---------| +| `Viewport` | Pan/zoom container with gesture support | +| `Node` | Draggable/resizable node wrapper | +| `NodeRenderer` | Renders visible nodes (virtualized) | +| `EdgeRenderer` | Renders edges with configurable path types | +| `EdgeOverlay` | Edge creation preview line | +| `Grid` | Background grid with axes | +| `ViewportControls` | Zoom +/- and fit buttons | +| `CommandLine` | Command palette search bar | +| `CommandFeedbackOverlay` | Visual feedback during command input | +| `NodeContextMenu` | Right-click context menu | +| `LockedNodeOverlay` | Full-screen locked node view | +| `NodePorts` | Port connectors on nodes | +| `NodeTypeCombobox` | Node type selector dropdown | +| `ResizeHandle` | Corner resize handles | +| `SelectionOverlay` | Lasso/rect selection path rendering | +| `Minimap` | Canvas-based graph overview with draggable viewport rect | + +--- + +## Hooks + +### State Hooks + +| Hook | Returns | +|------|---------| +| `useCanvasSelection()` | `{ selectedNodeIds, selectedEdgeId, count, hasSelection, hasEdgeSelection }` | +| `useCanvasViewport()` | `{ zoom, pan, screenToWorld, worldToScreen, isZoomTransitioning, viewportRect }` | +| `useCanvasDrag()` | `{ draggingNodeId, isDragging }` | + +### Node Hooks + +| Hook | Returns | +|------|---------| +| `useNodeSelection(id)` | `{ isSelected }` | +| `useNodeDrag(id, options)` | `{ bind(), updateNodePositions() }` | +| `useNodeResize(id, nodeData, options)` | `{ localWidth, localHeight, isResizing, createResizeStart, handleResizeMove, handleResizeEnd }` | +| `useTapGesture(options)` | `{ handleTap, cleanup }` | + +### Feature Hooks + +| Hook | Returns | +|------|---------| +| `useCanvasSettings()` | `{ mappings, activePresetId, setEventMapping, applyPreset, isPanelOpen, togglePanel }` | +| `useActionExecutor(options)` | `{ executeActionById, executeEventAction, getActionForEvent, mappings, helpers }` | +| `useVirtualization()` | `{ enabled, totalNodes, visibleNodes, culledNodes, toggle }` | +| `useCanvasHistory(options)` | `{ undo, redo, canUndo, canRedo, recordSnapshot }` | +| `useFitToBounds()` | `{ fitToBounds(mode, padding) }` | +| `useForceLayout()` | Force-directed layout via d3-force | +| `useTreeLayout(opts)` | Hierarchical tree layout (top-down or left-right) | +| `useGridLayout(opts)` | Uniform grid layout (auto columns, spatial sort) | +| `useAnimatedLayout(opts)` | Shared animated position interpolation hook | +| `useLayout()` | `{ fitToBounds, graphBounds, selectionBounds }` | +| `useCommandLine()` | `{ visible, state, open, close, updateQuery, selectCommand }` | +| `useGlobalKeyboard()` | Registers `/`, `Cmd+K`, `Cmd+C/V/D/A`, `Del`, `Escape` handlers | +| `useZoomTransition()` | `{ isAnimating, progress, cancel }` — drives animated zoom/pan | + +--- + +## Core Atoms (Advanced) + +### Graph Store + +| Atom | Purpose | +|------|---------| +| `graphAtom` | The graphology instance | +| `nodePositionAtomFamily(id)` | Per-node position atom (x, y, width, height) | +| `draggingNodeIdAtom` | Currently dragged node ID | +| `highestZIndexAtom` | Derived: max z-index across all nodes | +| `uiNodesAtom` | Derived: `UINodeState[]` from graph | +| `nodeKeysAtom` / `edgeKeysAtom` | Derived: sorted key arrays | + +**Mutations:** `addNodeToLocalGraphAtom`, `optimisticDeleteNodeAtom`, `optimisticDeleteEdgeAtom`, `swapEdgeAtomicAtom`, `loadGraphFromDbAtom` + +### Viewport Store + +| Atom | Purpose | +|------|---------| +| `zoomAtom` | Current zoom level | +| `panAtom` | Current pan offset `{ x, y }` | +| `viewportRectAtom` | Viewport DOMRect | +| `screenToWorldAtom` | `(screenX, screenY) -> { x, y }` converter | +| `worldToScreenAtom` | `(worldX, worldY) -> { x, y }` converter | +| `setZoomAtom` | Set zoom with optional focal point | +| `resetViewportAtom` | Reset to zoom=1, pan=0,0 | + +### Selection Store + +| Atom | Purpose | +|------|---------| +| `selectedNodeIdsAtom` | `Set` of selected nodes | +| `selectedEdgeIdAtom` | Single selected edge | +| `selectSingleNodeAtom` | Select one, clear others | +| `toggleNodeInSelectionAtom` | Shift-click toggle | +| `clearSelectionAtom` | Clear all selection | +| `addNodesToSelectionAtom` | Add to multi-selection | + +### History Store + +Delta-based undo/redo with 50-entry limit: + +| Atom | Purpose | +|------|---------| +| `historyStateAtom` | Current history stack | +| `pushDeltaAtom` | Push a delta (partial node change) | +| `pushHistoryAtom` | Push a full snapshot | +| `undoAtom` / `redoAtom` | Undo/redo operations | +| `canUndoAtom` / `canRedoAtom` | Derived: availability | + +Delta types: `move-node`, `resize-node`, `add-node`, `remove-node`, `add-edge`, `remove-edge`, `update-node-attr`, `batch`, `full-snapshot`. + +### Clipboard Store + +| Atom | Purpose | +|------|---------| +| `clipboardAtom` | Stored clipboard data | +| `copyToClipboardAtom` | Copy selected nodes + edges | +| `cutToClipboardAtom` | Cut (copy + delete) | +| `pasteFromClipboardAtom` | Paste with offset | +| `duplicateSelectionAtom` | Duplicate in-place | + +### Virtualization Store + +| Atom | Purpose | +|------|---------| +| `virtualizationEnabledAtom` | Toggle viewport culling | +| `visibleNodeKeysAtom` | Only nodes in viewport | +| `visibleEdgeKeysAtom` | Only edges in viewport | +| `virtualizationMetricsAtom` | Render vs total counts | + +### Snap Store + +| Atom | Purpose | +|------|---------| +| `snapEnabledAtom` | Boolean toggle | +| `snapGridSizeAtom` | Grid size in px (default 20) | +| `toggleSnapAtom` | Toggle snap on/off | + +Utilities: `snapToGrid(value, gridSize)`, `conditionalSnap(value, gridSize, enabled)`, `getSnapGuides(pos, gridSize, tolerance)` + +### Port System + +| Export | Purpose | +|--------|---------| +| `PortDefinition` | Define ports on a node (type, side, capacity) | +| `calculatePortPosition()` | Position ports along node edges | +| `canPortAcceptConnection()` | Validate port connections | +| `arePortsCompatible()` | Check type compatibility | + +--- + +## Features + +### Virtualization + +Only nodes within viewport bounds (+200px buffer) are rendered. Enabled by default. + +```tsx +const { enabled, visibleNodes, totalNodes, culledNodes, toggle } = useVirtualization(); +``` + +### Snap-to-Grid + +Optional grid snapping during drag operations. Grid size: 5-200px (default: 20px). + +```tsx +import { snapEnabledAtom, snapGridSizeAtom, toggleSnapAtom } from '@blinksgg/canvas'; +``` + +### Clipboard + +Local-first copy/cut/paste/duplicate. Pasted nodes exist in the local graph without DB calls. + +| Operation | Shortcut | Behavior | +|-----------|----------|----------| +| Copy | `Ctrl+C` | Copy selected nodes + internal edges | +| Cut | `Ctrl+X` | Copy to clipboard (app handles deletion) | +| Paste | `Ctrl+V` | New IDs generated, edges remapped, offset by 50px | +| Duplicate | `Ctrl+D` | Copy + paste in place | + +### Undo/Redo + +Delta-based history with 50-entry limit. O(1) for moves, full-graph snapshots as fallback. + +```tsx +const { undo, redo, canUndo, canRedo } = useCanvasHistory({ + enableKeyboardShortcuts: true, +}); +``` + +### Connection Ports + +Nodes can define input/output ports for edge connections. + +```ts +interface PortDefinition { + id: string; + label: string; + type: 'input' | 'output' | 'bidirectional'; + side: 'top' | 'right' | 'bottom' | 'left'; + position?: number; // 0-1 along the side (default: 0.5) + color?: string; +} +``` + +### Edge Path Types + +8 configurable path calculators: `bezier`, `bezier-vertical`, `bezier-smart`, `straight`, `step`, `step-vertical`, `step-smart`, `smooth-step`. Set via `styles.edges.pathType`. + +```tsx +import { getEdgePathCalculator } from '@blinksgg/canvas/utils'; +const calc = getEdgePathCalculator('bezier-smart'); +const { path, labelPosition } = calc({ sourceX, sourceY, targetX, targetY }); +``` + +### Minimap + +Small overview showing all nodes with a draggable viewport rectangle. Uses `` for performance. + +```tsx +import { Minimap } from '@blinksgg/canvas'; + + + + +``` + +Click or drag on the minimap to pan the viewport. Configurable: `position`, `width`, `height`, `backgroundColor`, `nodeColor`, `selectedNodeColor`, `viewportColor`. + +### Lasso & Rect Selection + +Pencil drag on background draws a freeform lasso path. Shift+drag draws a rectangular selection box. + +```tsx +import { SelectionOverlay } from '@blinksgg/canvas'; + + + + +``` + +- **Rect selection**: AABB intersection (nodes overlapping the rect are selected) +- **Lasso selection**: point-in-polygon test on node center +- Selection path state in `selectionPathAtom`, `selectionRectAtom` + +### Node Grouping + +Group nodes into collapsible containers with parent-child relationships. + +```tsx +import { GroupNode, setNodeParentAtom, toggleGroupCollapseAtom } from '@blinksgg/canvas'; + +// Set parent-child relationship +store.set(setNodeParentAtom, { nodeId: 'child1', parentId: 'group1' }); + +// Toggle collapse +store.set(toggleGroupCollapseAtom, 'group1'); +``` + +- `parentId` attribute on `GraphNodeAttributes` defines hierarchy +- `GroupNode` component renders header bar with collapse toggle and child count +- Collapsed groups hide children from `uiNodesAtom` (walks ancestor chain for nested groups) +- **Edge re-routing:** edges to/from collapsed children visually re-route to the group node (via `collapsedEdgeRemapAtom`); internal edges are hidden +- **Auto-resize:** group node resizes to fit children bounding box when a child drag ends +- **Nested drag:** dragging a group node moves all descendants together (via `getNodeDescendants`) +- Commands: `groupNodes`, `ungroupNodes`, `collapseGroup`, `expandGroup` + +### Search & Filter + +Search nodes by label, type, or ID with visual dimming of non-matching nodes. + +```tsx +import { setSearchQueryAtom, clearSearchAtom, searchResultsAtom } from '@blinksgg/canvas'; + +// Set search query +store.set(setSearchQueryAtom, 'my node'); + +// Navigate results +store.set(nextSearchResultAtom); // cycles + centers viewport +store.set(prevSearchResultAtom); + +// Clear +store.set(clearSearchAtom); +``` + +- Case-insensitive substring match on `label`, `node_type`, `id` +- Non-matching nodes rendered at `opacity: 0.2` with `pointerEvents: none` +- Non-matching edges dimmed to `opacity: 0.2` with 150ms CSS transition +- Highlighted result gets animated amber box-shadow pulse (include `` for the keyframes) +- **Keyboard shortcuts:** `Ctrl+F` opens search, `Enter`/`Shift+Enter` cycles results, `Ctrl+G`/`Ctrl+Shift+G` alternative navigation, `Escape` clears search +- Commands: `searchNodes` (aliases: `find`, `search`), `clearSearch` + +### Edge Animations + +Edges animate on creation (fade-in) and deletion (fade-out). Include `` for the CSS keyframes. + +```tsx +import { removeEdgeWithAnimationAtom } from '@blinksgg/canvas'; + +// Remove an edge with a 300ms fade-out animation +store.set(removeEdgeWithAnimationAtom, 'edge-id'); +``` + +- New edges: `.canvas-edge-enter` class with 300ms fade-in +- Deleted edges: snapshot stored in `departingEdgesAtom`, rendered with `.canvas-edge-exit` fade-out, cleaned up after 300ms +- Use `removeEdgeWithAnimationAtom` instead of `removeEdgeFromLocalGraphAtom` for animated deletion + +### Edge Label Editing + +Double-click an edge label to edit it inline. The `EdgeLabelEditor` component is included automatically in `Canvas`. + +```tsx +import { editingEdgeLabelAtom, updateEdgeLabelAtom } from '@blinksgg/canvas'; + +// Programmatically open label editor +store.set(editingEdgeLabelAtom, 'edge-id'); + +// Update label +store.set(updateEdgeLabelAtom, { edgeKey: 'edge-id', label: 'new label' }); +``` + +- HTML `` overlay positioned at the edge label's world coordinates +- Commits on blur or Enter; cancels on Escape +- `EdgeLabelEditor` is included in `Canvas` automatically; can also be used standalone + +### Zoom Transitions + +Animated zoom-to-node and fit-to-bounds transitions with cubic ease-in-out. + +```tsx +import { animateZoomToNodeAtom, animateFitToBoundsAtom } from '@blinksgg/canvas/core'; +import { useZoomTransition } from '@blinksgg/canvas/hooks'; + +// In a component: +const { isAnimating, progress } = useZoomTransition(); + +// From headless API: +store.set(animateZoomToNodeAtom, { nodeId: 'n1', targetZoom: 2, duration: 300 }); +store.set(animateFitToBoundsAtom, { mode: 'graph', duration: 400 }); +``` + +--- + +## Gesture System v2 + +The v2 gesture pipeline (v0.14+) replaces ad-hoc event handlers with a unified input system: + +``` +Normalize → Recognize → Resolve → Dispatch +``` + +- **Normalize**: Classify raw pointer/keyboard events into `InputEvent` types +- **Recognize**: Pattern-match against bindings using specificity scores +- **Resolve**: Pick the highest-scoring match from priority-sorted context stack +- **Dispatch**: Route to `PhaseHandler` (onStart/onMove/onEnd) or instant function handler + +### Key Concepts + +| Concept | Description | +|---------|-------------| +| **Binding** | Maps an `InputPattern` to an action ID | +| **Context** | Named group of bindings with a priority (lower = checked first) | +| **Specificity** | Score based on type (128), key (64), subjectKind (32), modifiers (16/8), source (4), button (2) | +| **`consumeInput`** | When true, prevents lower-priority contexts from matching | + +### Usage + +```tsx +import { Canvas } from '@blinksgg/canvas'; + + { + console.log('Action:', action.actionId, event); + }} +/> +``` + +For advanced usage, import from `@blinksgg/canvas/gestures`. + +--- + +## Performance + +### Spatial Grid Index (v0.15+) + +Viewport culling uses a `SpatialGrid` with fixed 500px cells for O(visible) node lookups instead of O(N) linear scans. + +```tsx +import { spatialIndexAtom, SpatialGrid } from '@blinksgg/canvas/core'; +``` + +### Structural Equality Caching + +- **`edgeFamilyAtom`** — cached per edge key; returns previous object when all fields match +- **`uiNodesAtom`** — returns previous array when entries match by id, position, isDragging +- **`nodePositionAtomFamily`** — returns cached position when x/y unchanged + +### Performance Instrumentation (v0.15+) + +Opt-in `performance.mark`/`measure` for DevTools profiling: + +```tsx +import { setPerfEnabled } from '@blinksgg/canvas/core'; + +// Enable from code +setPerfEnabled(true); + +// Or from browser console +window.__canvasPerf?.(true); +``` + +Marks: `canvas:drag-frame`, `canvas:virtualization-cull`. + +--- + +## Database (Optional) + +The `db/` layer is optional. Core canvas is backend-agnostic. Use the `CanvasStorageAdapter` interface for any backend. + +### With Custom Adapter + +```tsx +import { CanvasProvider, InMemoryStorageAdapter } from '@blinksgg/canvas'; + +// Use the built-in in-memory adapter (no database) + + + +``` + +### With Supabase + +```tsx +import { CanvasProvider, SupabaseStorageAdapter } from '@blinksgg/canvas'; +import { createClient } from '@supabase/supabase-js'; + +const supabase = createClient(url, key); +const adapter = new SupabaseStorageAdapter(supabase); + + + + +``` + +### Without Any Provider + +Use `JotaiProvider` + `CanvasStyleProvider` directly: + +```tsx + { + await myApi.updateNode(nodeId, props); + }} +/> +``` + +### Schema + +```mermaid +erDiagram + graphs ||--o{ nodes : contains + graphs ||--o{ edges : contains + nodes ||--o{ edges : "source" + nodes ||--o{ edges : "target" + + graphs { + uuid id PK + uuid owner_id FK + string name + text description + jsonb data + } + + nodes { + uuid id PK + uuid graph_id FK + string label + string node_type + jsonb configuration + jsonb ui_properties "x, y, width, height, zIndex" + jsonb data + } + + edges { + uuid id PK + uuid graph_id FK + uuid source_node_id FK + uuid target_node_id FK + string edge_type + jsonb filter_condition + jsonb ui_properties + jsonb data + } +``` + +### Storage Adapter + +Implement `CanvasStorageAdapter` for any backend: + +```tsx +interface CanvasStorageAdapter { + fetchNodes(graphId: string): Promise; + createNode(graphId: string, node: Partial): Promise; + updateNode(nodeId: string, updates: Partial): Promise; + deleteNode(nodeId: string): Promise; + // ... edges, subscriptions +} +``` + +--- + +## Import Paths + +| Import | Description | +|--------|-------------| +| `@blinksgg/canvas` | Everything (barrel export) | +| `@blinksgg/canvas/core` | Headless Jotai atoms, types, registries | +| `@blinksgg/canvas/hooks` | React hooks for state access | +| `@blinksgg/canvas/commands` | Command palette system | +| `@blinksgg/canvas/components` | React UI components | +| `@blinksgg/canvas/db` | Supabase storage adapter layer | +| `@blinksgg/canvas/utils` | Layout, edge paths, debug | +| `@blinksgg/canvas/nodes` | Pre-built node type components | + +--- + +## Styles + +Theming via `CanvasStyleGuide` and CSS variables scoped to the canvas container: + +```tsx +import { defaultDarkStyles, mergeWithDefaults } from '@blinksgg/canvas/styles'; + +const customStyles = mergeWithDefaults({ + background: { color: '#0a0a0a' }, + grid: { lineColor: '#1a1a1a', spacing: 20 }, + nodes: { selectedBorderColor: '#6366f1' }, + edges: { pathType: 'bezier-smart', defaultColor: '#475569' }, +}); +``` + +Wrap with `` for runtime style context. + +--- + +## React 19 + React Compiler + +This library requires **React 19.2+** (`"react": "^19.2.0"`). It leverages: + +1. **React Compiler** — All components and hooks are automatically memoized at build time via `babel-plugin-react-compiler`. **Zero** manual `useCallback`, `useMemo`, or `React.memo` in the codebase. +2. **Context as JSX** — Providers use `` directly instead of ``. +3. **Ref cleanup functions** — Ref callbacks return cleanup functions for lifecycle management. +4. **`useState` for lazy init** — Replaced `useMemo(() => value, [])` with `useState(() => value)` for stable one-time initialization. + +--- + +## Development + +```bash +pnpm --filter @blinksgg/canvas build # Build package +pnpm --filter @blinksgg/canvas dev # Watch mode +pnpm --filter @blinksgg/canvas check-types # TypeScript validation +pnpm --filter @blinksgg/canvas test # Run tests (vitest) +``` + +### Testing + +Tests use Jotai's `createStore()` for isolated atom testing, and `renderHook` from `@testing-library/react` for hook integration tests. + +**761 tests across 77 test files**, covering: +- Core stores, registries, and pure functions +- React hooks via `renderHook` (useActionExecutor, usePlugin, useLayout, easeInOutCubic) +- Enum/type integrity (ActionCategory, CanvasEventType, GestureRule shapes) +- Component rendering (Canvas, Node, Viewport, Minimap, GroupNode, SelectionOverlay) + +### Peer Dependencies + +| Package | Version | +|---------|---------| +| `react` / `react-dom` | ^19.2 | +| `jotai` | ^2.6 | +| `d3-force` | ^3.0 | +| `@tanstack/react-query` | ^5.17 | + +--- + +## Version Checking + +```tsx +import { canvasVersion, CANVAS_VERSION } from '@blinksgg/canvas'; + +console.log(`Canvas version: ${CANVAS_VERSION}`); + +if (canvasVersion.isAtLeast(0, 6)) { + // React 19 features available +} +``` + +## Changelog + +| Version | Highlights | +|---------|------------| +| **3.0.0** | React Compiler integration, removed all manual useCallback/useMemo, peer deps ^19.2.0 | +| **2.5.0** | First renderHook integration tests for React hooks (24 tests) | +| **2.4.0** | Drag state machine, action/event type enum tests (36 tests) | +| **2.3.0** | Actions, modifiers, pointer bindings, plugin type tests (34 tests) | +| **2.2.0** | Split built-in-actions.ts, 6 new test suites (38 tests) | +| **2.1.0** | Command-line store, storage adapter tests (21 tests) | +| **2.0.0** | Renamed gesturesV2 → gestures, removed deprecated re-exports | +| **1.2.0** | Plugin system, auto-routing, unregisterNodeType | +| **1.1.0** | Split useRegisterInputActions/useCanvasGestures, 8 bug fixes | +| **1.0.0** | API stability audit, migration guide, peer dep cleanup, 761 tests | + +See [CHANGELOG.md](./CHANGELOG.md) for full details. + +## License + +MIT diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..7a22694 --- /dev/null +++ b/TODO.md @@ -0,0 +1,259 @@ +# @blinksgg/canvas — TODO + +## Known Gaps + +_(None currently)_ + +## v3.x Roadmap + +- ~~React Compiler integration~~ ✅ (v3.0.0) +- **v3.1 — Remaining Phase 1 cleanup** — remove `useMemo`/`useCallback` from `Minimap.tsx`, `db/provider.tsx`, `useSplitGesture.ts` (see `plan-react19-canvas-optimization.md`) +- **v3.2 — Ref cleanup callbacks** — adopt React 19 ref cleanup in `Viewport.tsx` +- **v3.3 — Dev Overlay** — floating debug panel with graph stats, event log, perf metrics +- **v3.4 — Multi-user Cursors** — realtime cursor presence for collaborative editing + +## Open Issues + +_(None currently)_ + +## Completed in v3.0.0 + +- **React Compiler** — integrated `babel-plugin-react-compiler` + `@vitejs/plugin-react` +- **Removed all manual memoization** — 6 `useCallback` + 3 `useMemo` across 5 files +- **Peer deps** — `react`/`react-dom` `^19.0.0` → `^19.2.0` +- **Version** — 1.0.0 → 3.0.0 + +## Completed in v2.5.0 + +- **First React hook integration tests** — `renderHook` from `@testing-library/react` +- **4 new test suites** — `animated-layout` (9), `useActionExecutor-hook` (6), `usePlugin-hook` (5), `useLayout-hook` (4) +- **Exported `easeInOutCubic`** from `useAnimatedLayout.ts` for independent testing + +## Completed in v2.4.0 + +- **4 new test suites** — `drag-state-machine` (11), `action-types-enums` (9), `event-types-enums` (10), `gesture-rules-types` (6) + +## Completed in v2.3.0 + +- **5 new test suites** — `actions-node`, `actions-viewport`, `modifier-helpers`, `pointer-bindings-v2`, `plugin-types` (34 tests) + +## Completed in v2.2.0 + +- **Split `built-in-actions.ts`** (342L → 44L barrel) into `actions-node.ts` + `actions-viewport.ts` +- **6 new test suites** — keyboard-bindings, gesture-classification, viewport-commands, serialization-commands, store-atoms, command-executor (38 tests) + +## Completed in v2.1.0 + +- **2 new test suites** — `command-line-store` (11), `storage-adapter` (10) + +## Completed in v2.0.0 + +- **Renamed `gesturesV2` → `gestures`** — clean namespace +- **Removed deprecated re-exports** — `action-executor`, `settings-store` test suites added + +## Completed in v1.2.0 + +- **Plugin system** — unified `CanvasPlugin` manifest with dependency resolution, conflict detection, atomic registration/rollback, and lifecycle hooks +- **4 new files** — `plugin-types.ts`, `plugin-registry.ts`, `edge-path-registry.ts`, `usePlugin.ts` +- **Canvas auto-routing** — `renderNode` now optional; node type registry resolves components by `node_type` +- **`unregisterNodeType()`** — per-type removal for clean plugin teardown +- **2 new test suites** — `plugin-registry` (28 tests), `edge-path-registry` (8 tests) + +## Completed in v1.1.0 + +- **Split `useRegisterInputActions.ts`** (528L → 259L) — extracted `input-action-helpers.ts` with pure store helpers for navigation, selection, mutation, and escape logic +- **Split `useCanvasGestures.ts`** (667L → 518L) — extracted `useGuardContext.ts` and `useInertia.ts` for guard context and inertia management +- **2 new test suites** — `input-action-helpers` (28 tests), `useInertia` (5 tests) +- **8 bug fixes** — WeakMap cache isolation, mutation queue clearing, balanced startMutation counts, config threading, localStorage namespacing, and more + +## Completed in v1.0.0 + +- **API Stability audit** — all 219+ atoms verified for `{noun}{Verb}Atom` naming; `docs/api-stability.md` classifying all 8 entry points +- **Migration guide** — `docs/migration-v1.md` covering breaking changes from v0.x → v1.0 +- **Peer dep cleanup** — `peerDependenciesMeta` marking d3-force, @blocknote/*, @tanstack/react-query as optional +- **Hook test coverage** — 3 new test suites for useNodeDrag, useNodeResize, useForceLayout atoms +- **Version bump** — package.json, index.ts, CHANGELOG.md, README.md all at 1.0.0 + +## Completed in v0.36.0 + +- **Split `contexts.ts`** (614L → 100L) into `keyboard-contexts.ts` + `pointer-contexts.ts` +- **3 new test suites** — gesture-specificity, gesture-mapper, gesture-dispatcher (~30 tests) + +## Completed in v0.35.0 + +- **3 new test suites** — gesture-inertia, timed-state, gesture-normalize (+26 tests) +- Covers VelocitySampler, PanInertia, ZoomInertia, timed state machine, modifier extraction + +## Completed in v0.34.0 + +- **Split `useNodeDrag.ts`** — extracted drag types into `hooks/drag-types.ts` +- **2 new test suites** — gesture-rules-defaults, keyboard-shortcuts (+13 tests) + +## Completed in v0.33.0 + +- **Split `settings-store.ts`** — extracted presets + utility into `settings-presets.ts` +- **1 new test suite** — settings-presets (+9 tests) + +## Completed in v0.32.0 + +- **Split `history-store.ts`** — extracted pure delta functions into `history-actions.ts` +- **2 new test suites** — history-actions, group-store-utils (+21 tests) + +## Completed in v0.31.0 + +- **Split `commands/store.ts`** into state atoms + action atoms +- **3 new test suites** — commands-registry, commands-executor, commands-store (+31 tests, 670 total) + +## Completed in v0.30.0 + +- **Split `gesture-rules.ts`** into types + defaults + resolver +- **3 new test suites** — sync-store, gesture-rule-store, gesture-configs (+32 tests, 639 total) + +## Completed in v0.29.0 + +- **Split `action-registry.ts`** into registry + built-in-actions +- **4 new test suites** — graph-mutations-edges, graph-mutations-advanced, debug, component-registry (+32 tests, 607 total) + +## Completed in v0.28.0 + +- **Split `graph-mutations.ts`** into 3 modules (node, edge, advanced) +- **4 new test suites** — layout, hit-test, action-executor, mutation-queue (+33 tests, 575 total) + +## Completed in v0.27.0 + +- **4 new test suites** — settings-store, edge-path-calculators, snap-store, locked-node-store (+53 tests, 542 total) +- **`history-types.ts`** — modularized history type definitions + +## Completed in v0.26.0 + +- **Minimap edges** — draw edge lines between node centers +- **Fuzzy search** — multi-token, edge labels/types, EdgeRenderer integration +- **Smart alignment guides** — node-to-node snapping with AlignmentGuides component +- **Clipboard cut** — now deletes nodes with undo support (489 tests, 36 files) + +## Completed in v0.25.0 + +- **8 new test suites** — graph-mutations, graph-derived, graph-position, action-registry, interaction-store, reduced-motion, external-keyboard, toast (474 total across 35 files) +- **Split TouchActionButton** — 559 → 3 files (icons, RadialMenu, index) + +## Completed in v0.24.0 + +- **`prefers-reduced-motion`** — atom + CSS + 3 JS consumers (inertia, layout, edge fade) +- **Undo/redo in FAB** — primary actions with UndoIcon/RedoIcon +- **Safe-area margins** — ViewportControls + TouchActionButton +- **Cursor hiding** — `@media (pointer: coarse)` + `data-canvas-root` +- **External keyboard detection** — hides FAB when modifier keys available + +## Completed in v0.23.0 + +- **Slimmed barrel** — `core/index.ts` 458 → 85 lines (`export *` for all modules) +- **Removed deprecated** — `findPortAtPosition`, `resolveGestureIntent`, `isBackgroundGesture` + +## Completed in v0.22.0 + +- **Split `graph-store.ts`** — 914 → 68 lines, 3 new modules (`graph-position`, `graph-derived`, `graph-mutations`) + +## Completed in v0.21.0 + +- **Unified logging** — 33 `console.*` → `createDebug` with `.warn()/.error()` sub-loggers + +## Completed in v0.20.0 + +- **`atomFamily` migration** — `jotai/utils` → `jotai-family` (jotai v3 ready) +- **Dead `CanvasConfig` type removed** — stale Supabase fields +- **`hitTestNode` / `hitTestPort`** — testable hit-test utilities replacing DOM coupling + +## Completed in v0.17.0 + +- **EdgePreviewLine** — animated SVG bezier preview during drag +- **Drag-from-port** — click port to start edge creation +- **Port snap visual** — glow + scale on compatible ports during drag +- **`canConnect` validation** — callback to reject invalid connections + +## Completed in v0.16.0 + +- **Deprecated export removal** — `resolveGestureIntent`, legacy gesture configs, `useSupabaseClient`, Supabase provider props +- **README refresh** — Gesture System v2, Performance, updated architecture +- **TODO cleanup** — removed shipped items, added real roadmap + +## Completed in v0.15.0 + +- **Spatial grid index** — `SpatialGrid` for O(visible) node culling in virtualization +- **Edge structural equality** — `_edgeCache` prevents re-renders when data hasn't changed +- **`uiNodesAtom` structural equality** — previous array reuse when entries match +- **Performance instrumentation** — `canvasMark`/`canvasWrap` with opt-in `setPerfEnabled` +- **Gestures subpath export** — `@blinksgg/canvas/gestures` for code splitting +- **17 new tests** — spatial-index (12), perf (5) + +## Completed in v0.14.0 + +- **Gesture System v2** — unified pointer + keyboard input pipeline with 4-layer architecture +- **Specificity-scored binding resolution** — patterns scored by type, key, subjectKind, modifier, source, button +- **Built-in mapping contexts** — palm rejection, active interaction, search, keyboard navigate/manipulate, default +- **Held keys + custom modifiers** — `HeldKeysState`, `Modifiers.custom` for non-keyboard flags +- **Phase-aware action handlers** — `PhaseHandler` with onStart/onMove/onEnd/onInstant/onCancel +- **5 new test suites** — specificity, mapper, timed-state, palm-rejection, inertia + +## Completed in v0.13.0 + +- **Undo/redo for structural operations** — split, merge, nest, group, ungroup all push history snapshots +- **Undo/redo toast** — `CanvasToast` shows operation label on Ctrl+Z/Y +- **Tree layout** — `useTreeLayout` hook + `treeLayout`/`horizontalLayout` commands +- **Grid layout** — `useGridLayout` hook + `gridLayout` command +- **Animated layout transitions** — `useAnimatedLayout` shared hook with cubic easing +- **Zoom inertia** — momentum after pinch-to-zoom lifts +- **Snap-to-100% zoom** — detent at 1.0x zoom +- **Simultaneous pan during pinch** — fluid two-finger gestures +- **Tap pulse on controls** — `canvas-tap-pulse` CSS animation +- **19 new tests** — 404 total + +## Completed in v0.12.0 + +- **Drag-to-nest** — drag a node over another to nest; `dropTargetNodeIdAtom`, `nestNodesOnDropAtom`, drop-target highlight CSS +- **Two-finger split** — diverging fingers split a node into two copies with duplicated edges; `splitNodeAtom`, `useSplitGesture` +- **Merge nodes** — `Ctrl+M` merges selected nodes; edges re-routed, internal edges discarded; `mergeNodesAtom`, `mergeNodesCommand` +- **`split-node` gesture intent** — pinch-on-node now maps to split instead of zoom +- **18 new tests** — 385 total + +## Completed in v0.11.0 + +- **Nested group drag** — `getNodeDescendants` helper + `useNodeDrag` expands initialPositions to include all descendants +- **Edge creation/deletion animations** — `departingEdgesAtom` + `removeEdgeWithAnimationAtom` for fade-out; CSS fade-in for new edges +- **Edge label editing** — `editingEdgeLabelAtom` + `updateEdgeLabelAtom` + `EdgeLabelEditor` component with inline HTML input +- **`edgeFamilyAtom` reactivity fix** — now depends on `graphUpdateVersionAtom` for non-position attribute changes +- **14 new tests** — 367 total + +## Completed in v0.10.0 + +- **Edge re-routing** — `collapsedEdgeRemapAtom` maps collapsed children to outermost collapsed ancestor; edges re-route to group node +- **Group auto-resize** — `autoResizeGroupAtom` recomputes group bounding box on drag end +- **Search keyboard shortcuts** — Ctrl+F, Enter/Shift+Enter, Ctrl+G, Escape +- **Edge search dimming** — edges dim with 150ms transition when neither endpoint matches +- **Search highlight pulse** — amber box-shadow animation on highlighted result +- **`CanvasAnimations`** component — CSS keyframe injection +- **11 new tests** — 353 total + +## Completed in v0.9.0 + +- **Abstract persistence** — `CanvasStorageAdapter` interface, `SupabaseStorageAdapter`, `InMemoryStorageAdapter`, `storageAdapterAtom` +- **Node grouping** — `parentId` on nodes, `GroupNode` component, collapse/expand, group commands +- **Search & filter** — `searchQueryAtom`, `searchResultsAtom`, node dimming, search commands +- **Component tests** — 39 React component tests (Canvas, Node, Viewport, Minimap, SelectionOverlay, GroupNode) +- **89 new tests** — 342 total + +## Completed in v0.8.0 + +- **Minimap** — ``-based overview with draggable viewport rectangle +- **Lasso selection** — pencil freeform selection with point-in-polygon test +- **Rect selection** — Shift+drag rectangle selection with AABB intersection +- **Zoom animations** — `animateZoomToNodeAtom`, `animateFitToBoundsAtom` with cubic easing +- **`useZoomTransition`** — rAF-based animation hook +- **39 new tests** — selection-path-store + zoom-transition + +## Completed in v0.7.0 + +- **Arrow key navigation** — spatial navigation between nodes with Tab cycling and focus ring +- **Edge re-render optimization** — O(connected edges) per drag frame instead of O(all edges) +- **Test coverage** — 47 → 214 tests covering all core stores + headless API +- **Headless API** — `createCanvasAPI(store)` for full programmatic control without React +- **Doc consolidation** — PRINCIPLES.md + single README.md + TODO.md diff --git a/canvas-demo/dist/assets/index-B9jgFSpQ.js b/canvas-demo/dist/assets/index-B9jgFSpQ.js new file mode 100644 index 0000000..6b78ca8 --- /dev/null +++ b/canvas-demo/dist/assets/index-B9jgFSpQ.js @@ -0,0 +1,174 @@ +var bv=n=>{throw TypeError(n)};var vh=(n,e,o)=>e.has(n)||bv("Cannot "+o);var re=(n,e,o)=>(vh(n,e,"read from private field"),o?o.call(n):e.get(n)),Qe=(n,e,o)=>e.has(n)?bv("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,o),Re=(n,e,o,r)=>(vh(n,e,"write to private field"),r?r.call(n,o):e.set(n,o),o),_n=(n,e,o)=>(vh(n,e,"access private method"),o);var Jc=(n,e,o,r)=>({set _(l){Re(n,e,l,o)},get _(){return re(n,e,r)}});function NS(n,e){for(var o=0;or[l]})}}}return Object.freeze(Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const c of l)if(c.type==="childList")for(const d of c.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&r(d)}).observe(document,{childList:!0,subtree:!0});function o(l){const c={};return l.integrity&&(c.integrity=l.integrity),l.referrerPolicy&&(c.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?c.credentials="include":l.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function r(l){if(l.ep)return;l.ep=!0;const c=o(l);fetch(l.href,c)}})();function Y1(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var bh={exports:{}},tl={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var wv;function kS(){if(wv)return tl;wv=1;var n=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function o(r,l,c){var d=null;if(c!==void 0&&(d=""+c),l.key!==void 0&&(d=""+l.key),"key"in l){c={};for(var p in l)p!=="key"&&(c[p]=l[p])}else c=l;return l=c.ref,{$$typeof:n,type:r,key:d,ref:l!==void 0?l:null,props:c}}return tl.Fragment=e,tl.jsx=o,tl.jsxs=o,tl}var xv;function TS(){return xv||(xv=1,bh.exports=kS()),bh.exports}var z=TS(),wh={exports:{}},je={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Sv;function DS(){if(Sv)return je;Sv=1;var n=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),l=Symbol.for("react.profiler"),c=Symbol.for("react.consumer"),d=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),h=Symbol.for("react.memo"),g=Symbol.for("react.lazy"),y=Symbol.for("react.activity"),v=Symbol.iterator;function w(k){return k===null||typeof k!="object"?null:(k=v&&k[v]||k["@@iterator"],typeof k=="function"?k:null)}var S={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},A=Object.assign,x={};function E(k,H,F){this.props=k,this.context=H,this.refs=x,this.updater=F||S}E.prototype.isReactComponent={},E.prototype.setState=function(k,H){if(typeof k!="object"&&typeof k!="function"&&k!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,k,H,"setState")},E.prototype.forceUpdate=function(k){this.updater.enqueueForceUpdate(this,k,"forceUpdate")};function D(){}D.prototype=E.prototype;function R(k,H,F){this.props=k,this.context=H,this.refs=x,this.updater=F||S}var _=R.prototype=new D;_.constructor=R,A(_,E.prototype),_.isPureReactComponent=!0;var N=Array.isArray;function T(){}var O={H:null,A:null,T:null,S:null},M=Object.prototype.hasOwnProperty;function $(k,H,F){var oe=F.ref;return{$$typeof:n,type:k,key:H,ref:oe!==void 0?oe:null,props:F}}function L(k,H){return $(k.type,H,k.props)}function X(k){return typeof k=="object"&&k!==null&&k.$$typeof===n}function ae(k){var H={"=":"=0",":":"=2"};return"$"+k.replace(/[=:]/g,function(F){return H[F]})}var te=/\/+/g;function me(k,H){return typeof k=="object"&&k!==null&&k.key!=null?ae(""+k.key):H.toString(36)}function ce(k){switch(k.status){case"fulfilled":return k.value;case"rejected":throw k.reason;default:switch(typeof k.status=="string"?k.then(T,T):(k.status="pending",k.then(function(H){k.status==="pending"&&(k.status="fulfilled",k.value=H)},function(H){k.status==="pending"&&(k.status="rejected",k.reason=H)})),k.status){case"fulfilled":return k.value;case"rejected":throw k.reason}}throw k}function j(k,H,F,oe,J){var W=typeof k;(W==="undefined"||W==="boolean")&&(k=null);var ue=!1;if(k===null)ue=!0;else switch(W){case"bigint":case"string":case"number":ue=!0;break;case"object":switch(k.$$typeof){case n:case e:ue=!0;break;case g:return ue=k._init,j(ue(k._payload),H,F,oe,J)}}if(ue)return J=J(k),ue=oe===""?"."+me(k,0):oe,N(J)?(F="",ue!=null&&(F=ue.replace(te,"$&/")+"/"),j(J,H,F,"",function(Te){return Te})):J!=null&&(X(J)&&(J=L(J,F+(J.key==null||k&&k.key===J.key?"":(""+J.key).replace(te,"$&/")+"/")+ue)),H.push(J)),1;ue=0;var xe=oe===""?".":oe+":";if(N(k))for(var de=0;de>>1,V=j[Y];if(0>>1;Yl(F,G))oel(J,F)?(j[Y]=J,j[oe]=G,Y=oe):(j[Y]=F,j[H]=G,Y=H);else if(oel(J,G))j[Y]=J,j[oe]=G,Y=oe;else break e}}return I}function l(j,I){var G=j.sortIndex-I.sortIndex;return G!==0?G:j.id-I.id}if(n.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var c=performance;n.unstable_now=function(){return c.now()}}else{var d=Date,p=d.now();n.unstable_now=function(){return d.now()-p}}var m=[],h=[],g=1,y=null,v=3,w=!1,S=!1,A=!1,x=!1,E=typeof setTimeout=="function"?setTimeout:null,D=typeof clearTimeout=="function"?clearTimeout:null,R=typeof setImmediate<"u"?setImmediate:null;function _(j){for(var I=o(h);I!==null;){if(I.callback===null)r(h);else if(I.startTime<=j)r(h),I.sortIndex=I.expirationTime,e(m,I);else break;I=o(h)}}function N(j){if(A=!1,_(j),!S)if(o(m)!==null)S=!0,T||(T=!0,ae());else{var I=o(h);I!==null&&ce(N,I.startTime-j)}}var T=!1,O=-1,M=5,$=-1;function L(){return x?!0:!(n.unstable_now()-$j&&L());){var Y=y.callback;if(typeof Y=="function"){y.callback=null,v=y.priorityLevel;var V=Y(y.expirationTime<=j);if(j=n.unstable_now(),typeof V=="function"){y.callback=V,_(j),I=!0;break t}y===o(m)&&r(m),_(j)}else r(m);y=o(m)}if(y!==null)I=!0;else{var k=o(h);k!==null&&ce(N,k.startTime-j),I=!1}}break e}finally{y=null,v=G,w=!1}I=void 0}}finally{I?ae():T=!1}}}var ae;if(typeof R=="function")ae=function(){R(X)};else if(typeof MessageChannel<"u"){var te=new MessageChannel,me=te.port2;te.port1.onmessage=X,ae=function(){me.postMessage(null)}}else ae=function(){E(X,0)};function ce(j,I){O=E(function(){j(n.unstable_now())},I)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(j){j.callback=null},n.unstable_forceFrameRate=function(j){0>j||125Y?(j.sortIndex=G,e(h,j),o(m)===null&&j===o(h)&&(A?(D(O),O=-1):A=!0,ce(N,G-Y))):(j.sortIndex=V,e(m,j),S||w||(S=!0,T||(T=!0,ae()))),j},n.unstable_shouldYield=L,n.unstable_wrapCallback=function(j){var I=v;return function(){var G=v;v=I;try{return j.apply(this,arguments)}finally{v=G}}}})(Ah)),Ah}var Cv;function OS(){return Cv||(Cv=1,Sh.exports=zS()),Sh.exports}var _h={exports:{}},Cn={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ev;function RS(){if(Ev)return Cn;Ev=1;var n=Lu();function e(m){var h="https://react.dev/errors/"+m;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}return n(),_h.exports=RS(),_h.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var kv;function jS(){if(kv)return nl;kv=1;var n=OS(),e=Lu(),o=q1();function r(t){var i="https://react.dev/errors/"+t;if(1V||(t.current=Y[V],Y[V]=null,V--)}function F(t,i){V++,Y[V]=t.current,t.current=i}var oe=k(null),J=k(null),W=k(null),ue=k(null);function xe(t,i){switch(F(W,i),F(J,t),F(oe,null),i.nodeType){case 9:case 11:t=(t=i.documentElement)&&(t=t.namespaceURI)?Y0(t):0;break;default:if(t=i.tagName,i=i.namespaceURI)i=Y0(i),t=q0(i,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}H(oe),F(oe,t)}function de(){H(oe),H(J),H(W)}function Te(t){t.memoizedState!==null&&F(ue,t);var i=oe.current,a=q0(i,t.type);i!==a&&(F(J,t),F(oe,a))}function Ce(t){J.current===t&&(H(oe),H(J)),ue.current===t&&(H(ue),Ps._currentValue=G)}var Se,Ee;function Be(t){if(Se===void 0)try{throw Error()}catch(a){var i=a.stack.trim().match(/\n( *(at )?)/);Se=i&&i[1]||"",Ee=-1)":-1u||U[s]!==Z[u]){var ie=` +`+U[s].replace(" at new "," at ");return t.displayName&&ie.includes("")&&(ie=ie.replace("",t.displayName)),ie}while(1<=s&&0<=u);break}}}finally{et=!1,Error.prepareStackTrace=a}return(a=t?t.displayName||t.name:"")?Be(a):""}function un(t,i){switch(t.tag){case 26:case 27:case 5:return Be(t.type);case 16:return Be("Lazy");case 13:return t.child!==i&&i!==null?Be("Suspense Fallback"):Be("Suspense");case 19:return Be("SuspenseList");case 0:case 15:return ft(t.type,!1);case 11:return ft(t.type.render,!1);case 1:return ft(t.type,!0);case 31:return Be("Activity");default:return""}}function St(t){try{var i="",a=null;do i+=un(t,a),a=t,t=t.return;while(t);return i}catch(s){return` +Error generating stack: `+s.message+` +`+s.stack}}var ht=Object.prototype.hasOwnProperty,zt=n.unstable_scheduleCallback,Gt=n.unstable_cancelCallback,on=n.unstable_shouldYield,rn=n.unstable_requestPaint,Ve=n.unstable_now,Bt=n.unstable_getCurrentPriorityLevel,wn=n.unstable_ImmediatePriority,xn=n.unstable_UserBlockingPriority,dt=n.unstable_NormalPriority,In=n.unstable_LowPriority,Ei=n.unstable_IdlePriority,Fn=n.log,Hi=n.unstable_setDisableYieldValue,Dn=null,Ot=null;function dn(t){if(typeof Fn=="function"&&Hi(t),Ot&&typeof Ot.setStrictMode=="function")try{Ot.setStrictMode(Dn,t)}catch{}}var vt=Math.clz32?Math.clz32:Jn,Pn=Math.log,Oo=Math.LN2;function Jn(t){return t>>>=0,t===0?32:31-(Pn(t)/Oo|0)|0}var Mn=256,Sn=262144,Ni=4194304;function It(t){var i=t&42;if(i!==0)return i;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return t&261888;case 262144:case 524288:case 1048576:case 2097152:return t&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function $i(t,i,a){var s=t.pendingLanes;if(s===0)return 0;var u=0,f=t.suspendedLanes,b=t.pingedLanes;t=t.warmLanes;var C=s&134217727;return C!==0?(s=C&~f,s!==0?u=It(s):(b&=C,b!==0?u=It(b):a||(a=C&~t,a!==0&&(u=It(a))))):(C=s&~f,C!==0?u=It(C):b!==0?u=It(b):a||(a=s&~t,a!==0&&(u=It(a)))),u===0?0:i!==0&&i!==u&&(i&f)===0&&(f=u&-u,a=i&-i,f>=a||f===32&&(a&4194048)!==0)?i:u}function fn(t,i){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&i)===0}function Yi(t,i){switch(t){case 1:case 2:case 4:case 8:case 64:return i+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return i+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Gn(){var t=Ni;return Ni<<=1,(Ni&62914560)===0&&(Ni=4194304),t}function qi(t){for(var i=[],a=0;31>a;a++)i.push(t);return i}function be(t,i){t.pendingLanes|=i,i!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function Xe(t,i,a,s,u,f){var b=t.pendingLanes;t.pendingLanes=a,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=a,t.entangledLanes&=a,t.errorRecoveryDisabledLanes&=a,t.shellSuspendCounter=0;var C=t.entanglements,U=t.expirationTimes,Z=t.hiddenUpdates;for(a=b&~a;0"u")return null;try{return t.activeElement||t.body}catch{return t.body}}var xw=/[\n"\\]/g;function ui(t){return t.replace(xw,function(i){return"\\"+i.charCodeAt(0).toString(16)+" "})}function dd(t,i,a,s,u,f,b,C){t.name="",b!=null&&typeof b!="function"&&typeof b!="symbol"&&typeof b!="boolean"?t.type=b:t.removeAttribute("type"),i!=null?b==="number"?(i===0&&t.value===""||t.value!=i)&&(t.value=""+ci(i)):t.value!==""+ci(i)&&(t.value=""+ci(i)):b!=="submit"&&b!=="reset"||t.removeAttribute("value"),i!=null?fd(t,b,ci(i)):a!=null?fd(t,b,ci(a)):s!=null&&t.removeAttribute("value"),u==null&&f!=null&&(t.defaultChecked=!!f),u!=null&&(t.checked=u&&typeof u!="function"&&typeof u!="symbol"),C!=null&&typeof C!="function"&&typeof C!="symbol"&&typeof C!="boolean"?t.name=""+ci(C):t.removeAttribute("name")}function Lm(t,i,a,s,u,f,b,C){if(f!=null&&typeof f!="function"&&typeof f!="symbol"&&typeof f!="boolean"&&(t.type=f),i!=null||a!=null){if(!(f!=="submit"&&f!=="reset"||i!=null)){ud(t);return}a=a!=null?""+ci(a):"",i=i!=null?""+ci(i):a,C||i===t.value||(t.value=i),t.defaultValue=i}s=s??u,s=typeof s!="function"&&typeof s!="symbol"&&!!s,t.checked=C?t.checked:!!s,t.defaultChecked=!!s,b!=null&&typeof b!="function"&&typeof b!="symbol"&&typeof b!="boolean"&&(t.name=b),ud(t)}function fd(t,i,a){i==="number"&&Yl(t.ownerDocument)===t||t.defaultValue===""+a||(t.defaultValue=""+a)}function ra(t,i,a,s){if(t=t.options,i){i={};for(var u=0;u"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),yd=!1;if(no)try{var ms={};Object.defineProperty(ms,"passive",{get:function(){yd=!0}}),window.addEventListener("test",ms,ms),window.removeEventListener("test",ms,ms)}catch{yd=!1}var Lo=null,vd=null,Vl=null;function qm(){if(Vl)return Vl;var t,i=vd,a=i.length,s,u="value"in Lo?Lo.value:Lo.textContent,f=u.length;for(t=0;t=vs),Im=" ",Fm=!1;function Pm(t,i){switch(t){case"keyup":return Iw.indexOf(i.keyCode)!==-1;case"keydown":return i.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Jm(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var ca=!1;function Pw(t,i){switch(t){case"compositionend":return Jm(i);case"keypress":return i.which!==32?null:(Fm=!0,Im);case"textInput":return t=i.data,t===Im&&Fm?null:t;default:return null}}function Jw(t,i){if(ca)return t==="compositionend"||!Ad&&Pm(t,i)?(t=qm(),Vl=vd=Lo=null,ca=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(i.ctrlKey||i.altKey||i.metaKey)||i.ctrlKey&&i.altKey){if(i.char&&1=i)return{node:a,offset:i-t};t=s}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=ag(a)}}function lg(t,i){return t&&i?t===i?!0:t&&t.nodeType===3?!1:i&&i.nodeType===3?lg(t,i.parentNode):"contains"in t?t.contains(i):t.compareDocumentPosition?!!(t.compareDocumentPosition(i)&16):!1:!1}function cg(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var i=Yl(t.document);i instanceof t.HTMLIFrameElement;){try{var a=typeof i.contentWindow.location.href=="string"}catch{a=!1}if(a)t=i.contentWindow;else break;i=Yl(t.document)}return i}function Ed(t){var i=t&&t.nodeName&&t.nodeName.toLowerCase();return i&&(i==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||i==="textarea"||t.contentEditable==="true")}var ax=no&&"documentMode"in document&&11>=document.documentMode,ua=null,Nd=null,Ss=null,kd=!1;function ug(t,i,a){var s=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;kd||ua==null||ua!==Yl(s)||(s=ua,"selectionStart"in s&&Ed(s)?s={start:s.selectionStart,end:s.selectionEnd}:(s=(s.ownerDocument&&s.ownerDocument.defaultView||window).getSelection(),s={anchorNode:s.anchorNode,anchorOffset:s.anchorOffset,focusNode:s.focusNode,focusOffset:s.focusOffset}),Ss&&xs(Ss,s)||(Ss=s,s=Uc(Nd,"onSelect"),0>=b,u-=b,Vi=1<<32-vt(i)+u|a<Ue?(qe=_e,_e=null):qe=_e.sibling;var Fe=P(q,_e,Q[Ue],se);if(Fe===null){_e===null&&(_e=qe);break}t&&_e&&Fe.alternate===null&&i(q,_e),B=f(Fe,B,Ue),Ie===null?ke=Fe:Ie.sibling=Fe,Ie=Fe,_e=qe}if(Ue===Q.length)return a(q,_e),Ke&&oo(q,Ue),ke;if(_e===null){for(;UeUe?(qe=_e,_e=null):qe=_e.sibling;var or=P(q,_e,Fe.value,se);if(or===null){_e===null&&(_e=qe);break}t&&_e&&or.alternate===null&&i(q,_e),B=f(or,B,Ue),Ie===null?ke=or:Ie.sibling=or,Ie=or,_e=qe}if(Fe.done)return a(q,_e),Ke&&oo(q,Ue),ke;if(_e===null){for(;!Fe.done;Ue++,Fe=Q.next())Fe=le(q,Fe.value,se),Fe!==null&&(B=f(Fe,B,Ue),Ie===null?ke=Fe:Ie.sibling=Fe,Ie=Fe);return Ke&&oo(q,Ue),ke}for(_e=s(_e);!Fe.done;Ue++,Fe=Q.next())Fe=ee(_e,q,Ue,Fe.value,se),Fe!==null&&(t&&Fe.alternate!==null&&_e.delete(Fe.key===null?Ue:Fe.key),B=f(Fe,B,Ue),Ie===null?ke=Fe:Ie.sibling=Fe,Ie=Fe);return t&&_e.forEach(function(ES){return i(q,ES)}),Ke&&oo(q,Ue),ke}function st(q,B,Q,se){if(typeof Q=="object"&&Q!==null&&Q.type===A&&Q.key===null&&(Q=Q.props.children),typeof Q=="object"&&Q!==null){switch(Q.$$typeof){case w:e:{for(var ke=Q.key;B!==null;){if(B.key===ke){if(ke=Q.type,ke===A){if(B.tag===7){a(q,B.sibling),se=u(B,Q.props.children),se.return=q,q=se;break e}}else if(B.elementType===ke||typeof ke=="object"&&ke!==null&&ke.$$typeof===M&&Rr(ke)===B.type){a(q,B.sibling),se=u(B,Q.props),ks(se,Q),se.return=q,q=se;break e}a(q,B);break}else i(q,B);B=B.sibling}Q.type===A?(se=Tr(Q.props.children,q.mode,se,Q.key),se.return=q,q=se):(se=ec(Q.type,Q.key,Q.props,null,q.mode,se),ks(se,Q),se.return=q,q=se)}return b(q);case S:e:{for(ke=Q.key;B!==null;){if(B.key===ke)if(B.tag===4&&B.stateNode.containerInfo===Q.containerInfo&&B.stateNode.implementation===Q.implementation){a(q,B.sibling),se=u(B,Q.children||[]),se.return=q,q=se;break e}else{a(q,B);break}else i(q,B);B=B.sibling}se=jd(Q,q.mode,se),se.return=q,q=se}return b(q);case M:return Q=Rr(Q),st(q,B,Q,se)}if(ce(Q))return ve(q,B,Q,se);if(ae(Q)){if(ke=ae(Q),typeof ke!="function")throw Error(r(150));return Q=ke.call(Q),De(q,B,Q,se)}if(typeof Q.then=="function")return st(q,B,sc(Q),se);if(Q.$$typeof===R)return st(q,B,ic(q,Q),se);lc(q,Q)}return typeof Q=="string"&&Q!==""||typeof Q=="number"||typeof Q=="bigint"?(Q=""+Q,B!==null&&B.tag===6?(a(q,B.sibling),se=u(B,Q),se.return=q,q=se):(a(q,B),se=Rd(Q,q.mode,se),se.return=q,q=se),b(q)):a(q,B)}return function(q,B,Q,se){try{Ns=0;var ke=st(q,B,Q,se);return xa=null,ke}catch(_e){if(_e===wa||_e===rc)throw _e;var Ie=ei(29,_e,null,q.mode);return Ie.lanes=se,Ie.return=q,Ie}finally{}}}var Lr=Og(!0),Rg=Og(!1),$o=!1;function Qd(t){t.updateQueue={baseState:t.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Zd(t,i){t=t.updateQueue,i.updateQueue===t&&(i.updateQueue={baseState:t.baseState,firstBaseUpdate:t.firstBaseUpdate,lastBaseUpdate:t.lastBaseUpdate,shared:t.shared,callbacks:null})}function Yo(t){return{lane:t,tag:0,payload:null,callback:null,next:null}}function qo(t,i,a){var s=t.updateQueue;if(s===null)return null;if(s=s.shared,(Je&2)!==0){var u=s.pending;return u===null?i.next=i:(i.next=u.next,u.next=i),s.pending=i,i=Wl(t),yg(t,null,a),i}return Jl(t,s,i,a),Wl(t)}function Ts(t,i,a){if(i=i.updateQueue,i!==null&&(i=i.shared,(a&4194048)!==0)){var s=i.lanes;s&=t.pendingLanes,a|=s,i.lanes=a,bt(t,a)}}function Id(t,i){var a=t.updateQueue,s=t.alternate;if(s!==null&&(s=s.updateQueue,a===s)){var u=null,f=null;if(a=a.firstBaseUpdate,a!==null){do{var b={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};f===null?u=f=b:f=f.next=b,a=a.next}while(a!==null);f===null?u=f=i:f=f.next=i}else u=f=i;a={baseState:s.baseState,firstBaseUpdate:u,lastBaseUpdate:f,shared:s.shared,callbacks:s.callbacks},t.updateQueue=a;return}t=a.lastBaseUpdate,t===null?a.firstBaseUpdate=i:t.next=i,a.lastBaseUpdate=i}var Fd=!1;function Ds(){if(Fd){var t=ba;if(t!==null)throw t}}function Ms(t,i,a,s){Fd=!1;var u=t.updateQueue;$o=!1;var f=u.firstBaseUpdate,b=u.lastBaseUpdate,C=u.shared.pending;if(C!==null){u.shared.pending=null;var U=C,Z=U.next;U.next=null,b===null?f=Z:b.next=Z,b=U;var ie=t.alternate;ie!==null&&(ie=ie.updateQueue,C=ie.lastBaseUpdate,C!==b&&(C===null?ie.firstBaseUpdate=Z:C.next=Z,ie.lastBaseUpdate=U))}if(f!==null){var le=u.baseState;b=0,ie=Z=U=null,C=f;do{var P=C.lane&-536870913,ee=P!==C.lane;if(ee?(Ye&P)===P:(s&P)===P){P!==0&&P===va&&(Fd=!0),ie!==null&&(ie=ie.next={lane:0,tag:C.tag,payload:C.payload,callback:null,next:null});e:{var ve=t,De=C;P=i;var st=a;switch(De.tag){case 1:if(ve=De.payload,typeof ve=="function"){le=ve.call(st,le,P);break e}le=ve;break e;case 3:ve.flags=ve.flags&-65537|128;case 0:if(ve=De.payload,P=typeof ve=="function"?ve.call(st,le,P):ve,P==null)break e;le=y({},le,P);break e;case 2:$o=!0}}P=C.callback,P!==null&&(t.flags|=64,ee&&(t.flags|=8192),ee=u.callbacks,ee===null?u.callbacks=[P]:ee.push(P))}else ee={lane:P,tag:C.tag,payload:C.payload,callback:C.callback,next:null},ie===null?(Z=ie=ee,U=le):ie=ie.next=ee,b|=P;if(C=C.next,C===null){if(C=u.shared.pending,C===null)break;ee=C,C=ee.next,ee.next=null,u.lastBaseUpdate=ee,u.shared.pending=null}}while(!0);ie===null&&(U=le),u.baseState=U,u.firstBaseUpdate=Z,u.lastBaseUpdate=ie,f===null&&(u.shared.lanes=0),Zo|=b,t.lanes=b,t.memoizedState=le}}function jg(t,i){if(typeof t!="function")throw Error(r(191,t));t.call(i)}function Lg(t,i){var a=t.callbacks;if(a!==null)for(t.callbacks=null,t=0;tf?f:8;var b=j.T,C={};j.T=C,gf(t,!1,i,a);try{var U=u(),Z=j.S;if(Z!==null&&Z(C,U),U!==null&&typeof U=="object"&&typeof U.then=="function"){var ie=mx(U,s);Rs(t,i,ie,ri(t))}else Rs(t,i,s,ri(t))}catch(le){Rs(t,i,{then:function(){},status:"rejected",reason:le},ri())}finally{I.p=f,b!==null&&C.types!==null&&(b.types=C.types),j.T=b}}function xx(){}function pf(t,i,a,s){if(t.tag!==5)throw Error(r(476));var u=py(t).queue;hy(t,u,i,G,a===null?xx:function(){return my(t),a(s)})}function py(t){var i=t.memoizedState;if(i!==null)return i;i={memoizedState:G,baseState:G,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:lo,lastRenderedState:G},next:null};var a={};return i.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:lo,lastRenderedState:a},next:null},t.memoizedState=i,t=t.alternate,t!==null&&(t.memoizedState=i),i}function my(t){var i=py(t);i.next===null&&(i=t.alternate.memoizedState),Rs(t,i.next.queue,{},ri())}function mf(){return gn(Ps)}function gy(){return Ut().memoizedState}function yy(){return Ut().memoizedState}function Sx(t){for(var i=t.return;i!==null;){switch(i.tag){case 24:case 3:var a=ri();t=Yo(a);var s=qo(i,t,a);s!==null&&(Kn(s,i,a),Ts(s,i,a)),i={cache:qd()},t.payload=i;return}i=i.return}}function Ax(t,i,a){var s=ri();a={lane:s,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},vc(t)?by(i,a):(a=zd(t,i,a,s),a!==null&&(Kn(a,t,s),wy(a,i,s)))}function vy(t,i,a){var s=ri();Rs(t,i,a,s)}function Rs(t,i,a,s){var u={lane:s,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(vc(t))by(i,u);else{var f=t.alternate;if(t.lanes===0&&(f===null||f.lanes===0)&&(f=i.lastRenderedReducer,f!==null))try{var b=i.lastRenderedState,C=f(b,a);if(u.hasEagerState=!0,u.eagerState=C,Wn(C,b))return Jl(t,i,u,0),ut===null&&Pl(),!1}catch{}finally{}if(a=zd(t,i,u,s),a!==null)return Kn(a,t,s),wy(a,i,s),!0}return!1}function gf(t,i,a,s){if(s={lane:2,revertLane:Zf(),gesture:null,action:s,hasEagerState:!1,eagerState:null,next:null},vc(t)){if(i)throw Error(r(479))}else i=zd(t,a,s,2),i!==null&&Kn(i,t,2)}function vc(t){var i=t.alternate;return t===Le||i!==null&&i===Le}function by(t,i){Aa=dc=!0;var a=t.pending;a===null?i.next=i:(i.next=a.next,a.next=i),t.pending=i}function wy(t,i,a){if((a&4194048)!==0){var s=i.lanes;s&=t.pendingLanes,a|=s,i.lanes=a,bt(t,a)}}var js={readContext:gn,use:pc,useCallback:Et,useContext:Et,useEffect:Et,useImperativeHandle:Et,useLayoutEffect:Et,useInsertionEffect:Et,useMemo:Et,useReducer:Et,useRef:Et,useState:Et,useDebugValue:Et,useDeferredValue:Et,useTransition:Et,useSyncExternalStore:Et,useId:Et,useHostTransitionStatus:Et,useFormState:Et,useActionState:Et,useOptimistic:Et,useMemoCache:Et,useCacheRefresh:Et};js.useEffectEvent=Et;var xy={readContext:gn,use:pc,useCallback:function(t,i){return On().memoizedState=[t,i===void 0?null:i],t},useContext:gn,useEffect:oy,useImperativeHandle:function(t,i,a){a=a!=null?a.concat([t]):null,gc(4194308,4,ly.bind(null,i,t),a)},useLayoutEffect:function(t,i){return gc(4194308,4,t,i)},useInsertionEffect:function(t,i){gc(4,2,t,i)},useMemo:function(t,i){var a=On();i=i===void 0?null:i;var s=t();if(Ur){dn(!0);try{t()}finally{dn(!1)}}return a.memoizedState=[s,i],s},useReducer:function(t,i,a){var s=On();if(a!==void 0){var u=a(i);if(Ur){dn(!0);try{a(i)}finally{dn(!1)}}}else u=i;return s.memoizedState=s.baseState=u,t={pending:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:u},s.queue=t,t=t.dispatch=Ax.bind(null,Le,t),[s.memoizedState,t]},useRef:function(t){var i=On();return t={current:t},i.memoizedState=t},useState:function(t){t=cf(t);var i=t.queue,a=vy.bind(null,Le,i);return i.dispatch=a,[t.memoizedState,a]},useDebugValue:ff,useDeferredValue:function(t,i){var a=On();return hf(a,t,i)},useTransition:function(){var t=cf(!1);return t=hy.bind(null,Le,t.queue,!0,!1),On().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,i,a){var s=Le,u=On();if(Ke){if(a===void 0)throw Error(r(407));a=a()}else{if(a=i(),ut===null)throw Error(r(349));(Ye&127)!==0||Yg(s,i,a)}u.memoizedState=a;var f={value:a,getSnapshot:i};return u.queue=f,oy(Vg.bind(null,s,f,t),[t]),s.flags|=2048,Ca(9,{destroy:void 0},qg.bind(null,s,f,a,i),null),a},useId:function(){var t=On(),i=ut.identifierPrefix;if(Ke){var a=Xi,s=Vi;a=(s&~(1<<32-vt(s)-1)).toString(32)+a,i="_"+i+"R_"+a,a=fc++,0<\/script>",f=f.removeChild(f.firstChild);break;case"select":f=typeof s.is=="string"?b.createElement("select",{is:s.is}):b.createElement("select"),s.multiple?f.multiple=!0:s.size&&(f.size=s.size);break;default:f=typeof s.is=="string"?b.createElement(u,{is:s.is}):b.createElement(u)}}f[nt]=i,f[wt]=s;e:for(b=i.child;b!==null;){if(b.tag===5||b.tag===6)f.appendChild(b.stateNode);else if(b.tag!==4&&b.tag!==27&&b.child!==null){b.child.return=b,b=b.child;continue}if(b===i)break e;for(;b.sibling===null;){if(b.return===null||b.return===i)break e;b=b.return}b.sibling.return=b.return,b=b.sibling}i.stateNode=f;e:switch(vn(f,u,s),u){case"button":case"input":case"select":case"textarea":s=!!s.autoFocus;break e;case"img":s=!0;break e;default:s=!1}s&&uo(i)}}return mt(i),Df(i,i.type,t===null?null:t.memoizedProps,i.pendingProps,a),null;case 6:if(t&&i.stateNode!=null)t.memoizedProps!==s&&uo(i);else{if(typeof s!="string"&&i.stateNode===null)throw Error(r(166));if(t=W.current,ga(i)){if(t=i.stateNode,a=i.memoizedProps,s=null,u=mn,u!==null)switch(u.tag){case 27:case 5:s=u.memoizedProps}t[nt]=i,t=!!(t.nodeValue===a||s!==null&&s.suppressHydrationWarning===!0||H0(t.nodeValue,a)),t||Bo(i,!0)}else t=Gc(t).createTextNode(s),t[nt]=i,i.stateNode=t}return mt(i),null;case 31:if(a=i.memoizedState,t===null||t.memoizedState!==null){if(s=ga(i),a!==null){if(t===null){if(!s)throw Error(r(318));if(t=i.memoizedState,t=t!==null?t.dehydrated:null,!t)throw Error(r(557));t[nt]=i}else Dr(),(i.flags&128)===0&&(i.memoizedState=null),i.flags|=4;mt(i),t=!1}else a=Bd(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=a),t=!0;if(!t)return i.flags&256?(ni(i),i):(ni(i),null);if((i.flags&128)!==0)throw Error(r(558))}return mt(i),null;case 13:if(s=i.memoizedState,t===null||t.memoizedState!==null&&t.memoizedState.dehydrated!==null){if(u=ga(i),s!==null&&s.dehydrated!==null){if(t===null){if(!u)throw Error(r(318));if(u=i.memoizedState,u=u!==null?u.dehydrated:null,!u)throw Error(r(317));u[nt]=i}else Dr(),(i.flags&128)===0&&(i.memoizedState=null),i.flags|=4;mt(i),u=!1}else u=Bd(),t!==null&&t.memoizedState!==null&&(t.memoizedState.hydrationErrors=u),u=!0;if(!u)return i.flags&256?(ni(i),i):(ni(i),null)}return ni(i),(i.flags&128)!==0?(i.lanes=a,i):(a=s!==null,t=t!==null&&t.memoizedState!==null,a&&(s=i.child,u=null,s.alternate!==null&&s.alternate.memoizedState!==null&&s.alternate.memoizedState.cachePool!==null&&(u=s.alternate.memoizedState.cachePool.pool),f=null,s.memoizedState!==null&&s.memoizedState.cachePool!==null&&(f=s.memoizedState.cachePool.pool),f!==u&&(s.flags|=2048)),a!==t&&a&&(i.child.flags|=8192),Ac(i,i.updateQueue),mt(i),null);case 4:return de(),t===null&&Jf(i.stateNode.containerInfo),mt(i),null;case 10:return ao(i.type),mt(i),null;case 19:if(H(Lt),s=i.memoizedState,s===null)return mt(i),null;if(u=(i.flags&128)!==0,f=s.rendering,f===null)if(u)Us(s,!1);else{if(Nt!==0||t!==null&&(t.flags&128)!==0)for(t=i.child;t!==null;){if(f=uc(t),f!==null){for(i.flags|=128,Us(s,!1),t=f.updateQueue,i.updateQueue=t,Ac(i,t),i.subtreeFlags=0,t=a,a=i.child;a!==null;)vg(a,t),a=a.sibling;return F(Lt,Lt.current&1|2),Ke&&oo(i,s.treeForkCount),i.child}t=t.sibling}s.tail!==null&&Ve()>kc&&(i.flags|=128,u=!0,Us(s,!1),i.lanes=4194304)}else{if(!u)if(t=uc(f),t!==null){if(i.flags|=128,u=!0,t=t.updateQueue,i.updateQueue=t,Ac(i,t),Us(s,!0),s.tail===null&&s.tailMode==="hidden"&&!f.alternate&&!Ke)return mt(i),null}else 2*Ve()-s.renderingStartTime>kc&&a!==536870912&&(i.flags|=128,u=!0,Us(s,!1),i.lanes=4194304);s.isBackwards?(f.sibling=i.child,i.child=f):(t=s.last,t!==null?t.sibling=f:i.child=f,s.last=f)}return s.tail!==null?(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=Ve(),t.sibling=null,a=Lt.current,F(Lt,u?a&1|2:a&1),Ke&&oo(i,s.treeForkCount),t):(mt(i),null);case 22:case 23:return ni(i),Jd(),s=i.memoizedState!==null,t!==null?t.memoizedState!==null!==s&&(i.flags|=8192):s&&(i.flags|=8192),s?(a&536870912)!==0&&(i.flags&128)===0&&(mt(i),i.subtreeFlags&6&&(i.flags|=8192)):mt(i),a=i.updateQueue,a!==null&&Ac(i,a.retryQueue),a=null,t!==null&&t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(a=t.memoizedState.cachePool.pool),s=null,i.memoizedState!==null&&i.memoizedState.cachePool!==null&&(s=i.memoizedState.cachePool.pool),s!==a&&(i.flags|=2048),t!==null&&H(Or),null;case 24:return a=null,t!==null&&(a=t.memoizedState.cache),i.memoizedState.cache!==a&&(i.flags|=2048),ao(Yt),mt(i),null;case 25:return null;case 30:return null}throw Error(r(156,i.tag))}function kx(t,i){switch(Ud(i),i.tag){case 1:return t=i.flags,t&65536?(i.flags=t&-65537|128,i):null;case 3:return ao(Yt),de(),t=i.flags,(t&65536)!==0&&(t&128)===0?(i.flags=t&-65537|128,i):null;case 26:case 27:case 5:return Ce(i),null;case 31:if(i.memoizedState!==null){if(ni(i),i.alternate===null)throw Error(r(340));Dr()}return t=i.flags,t&65536?(i.flags=t&-65537|128,i):null;case 13:if(ni(i),t=i.memoizedState,t!==null&&t.dehydrated!==null){if(i.alternate===null)throw Error(r(340));Dr()}return t=i.flags,t&65536?(i.flags=t&-65537|128,i):null;case 19:return H(Lt),null;case 4:return de(),null;case 10:return ao(i.type),null;case 22:case 23:return ni(i),Jd(),t!==null&&H(Or),t=i.flags,t&65536?(i.flags=t&-65537|128,i):null;case 24:return ao(Yt),null;case 25:return null;default:return null}}function Xy(t,i){switch(Ud(i),i.tag){case 3:ao(Yt),de();break;case 26:case 27:case 5:Ce(i);break;case 4:de();break;case 31:i.memoizedState!==null&&ni(i);break;case 13:ni(i);break;case 19:H(Lt);break;case 10:ao(i.type);break;case 22:case 23:ni(i),Jd(),t!==null&&H(Or);break;case 24:ao(Yt)}}function Gs(t,i){try{var a=i.updateQueue,s=a!==null?a.lastEffect:null;if(s!==null){var u=s.next;a=u;do{if((a.tag&t)===t){s=void 0;var f=a.create,b=a.inst;s=f(),b.destroy=s}a=a.next}while(a!==u)}}catch(C){ot(i,i.return,C)}}function Ko(t,i,a){try{var s=i.updateQueue,u=s!==null?s.lastEffect:null;if(u!==null){var f=u.next;s=f;do{if((s.tag&t)===t){var b=s.inst,C=b.destroy;if(C!==void 0){b.destroy=void 0,u=i;var U=a,Z=C;try{Z()}catch(ie){ot(u,U,ie)}}}s=s.next}while(s!==f)}}catch(ie){ot(i,i.return,ie)}}function Ky(t){var i=t.updateQueue;if(i!==null){var a=t.stateNode;try{Lg(i,a)}catch(s){ot(t,t.return,s)}}}function Qy(t,i,a){a.props=Gr(t.type,t.memoizedProps),a.state=t.memoizedState;try{a.componentWillUnmount()}catch(s){ot(t,i,s)}}function Bs(t,i){try{var a=t.ref;if(a!==null){switch(t.tag){case 26:case 27:case 5:var s=t.stateNode;break;case 30:s=t.stateNode;break;default:s=t.stateNode}typeof a=="function"?t.refCleanup=a(s):a.current=s}}catch(u){ot(t,i,u)}}function Ki(t,i){var a=t.ref,s=t.refCleanup;if(a!==null)if(typeof s=="function")try{s()}catch(u){ot(t,i,u)}finally{t.refCleanup=null,t=t.alternate,t!=null&&(t.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(u){ot(t,i,u)}else a.current=null}function Zy(t){var i=t.type,a=t.memoizedProps,s=t.stateNode;try{e:switch(i){case"button":case"input":case"select":case"textarea":a.autoFocus&&s.focus();break e;case"img":a.src?s.src=a.src:a.srcSet&&(s.srcset=a.srcSet)}}catch(u){ot(t,t.return,u)}}function Mf(t,i,a){try{var s=t.stateNode;Fx(s,t.type,a,i),s[wt]=i}catch(u){ot(t,t.return,u)}}function Iy(t){return t.tag===5||t.tag===3||t.tag===26||t.tag===27&&Wo(t.type)||t.tag===4}function zf(t){e:for(;;){for(;t.sibling===null;){if(t.return===null||Iy(t.return))return null;t=t.return}for(t.sibling.return=t.return,t=t.sibling;t.tag!==5&&t.tag!==6&&t.tag!==18;){if(t.tag===27&&Wo(t.type)||t.flags&2||t.child===null||t.tag===4)continue e;t.child.return=t,t=t.child}if(!(t.flags&2))return t.stateNode}}function Of(t,i,a){var s=t.tag;if(s===5||s===6)t=t.stateNode,i?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(t,i):(i=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,i.appendChild(t),a=a._reactRootContainer,a!=null||i.onclick!==null||(i.onclick=to));else if(s!==4&&(s===27&&Wo(t.type)&&(a=t.stateNode,i=null),t=t.child,t!==null))for(Of(t,i,a),t=t.sibling;t!==null;)Of(t,i,a),t=t.sibling}function _c(t,i,a){var s=t.tag;if(s===5||s===6)t=t.stateNode,i?a.insertBefore(t,i):a.appendChild(t);else if(s!==4&&(s===27&&Wo(t.type)&&(a=t.stateNode),t=t.child,t!==null))for(_c(t,i,a),t=t.sibling;t!==null;)_c(t,i,a),t=t.sibling}function Fy(t){var i=t.stateNode,a=t.memoizedProps;try{for(var s=t.type,u=i.attributes;u.length;)i.removeAttributeNode(u[0]);vn(i,s,a),i[nt]=t,i[wt]=a}catch(f){ot(t,t.return,f)}}var fo=!1,Xt=!1,Rf=!1,Py=typeof WeakSet=="function"?WeakSet:Set,an=null;function Tx(t,i){if(t=t.containerInfo,th=Xc,t=cg(t),Ed(t)){if("selectionStart"in t)var a={start:t.selectionStart,end:t.selectionEnd};else e:{a=(a=t.ownerDocument)&&a.defaultView||window;var s=a.getSelection&&a.getSelection();if(s&&s.rangeCount!==0){a=s.anchorNode;var u=s.anchorOffset,f=s.focusNode;s=s.focusOffset;try{a.nodeType,f.nodeType}catch{a=null;break e}var b=0,C=-1,U=-1,Z=0,ie=0,le=t,P=null;t:for(;;){for(var ee;le!==a||u!==0&&le.nodeType!==3||(C=b+u),le!==f||s!==0&&le.nodeType!==3||(U=b+s),le.nodeType===3&&(b+=le.nodeValue.length),(ee=le.firstChild)!==null;)P=le,le=ee;for(;;){if(le===t)break t;if(P===a&&++Z===u&&(C=b),P===f&&++ie===s&&(U=b),(ee=le.nextSibling)!==null)break;le=P,P=le.parentNode}le=ee}a=C===-1||U===-1?null:{start:C,end:U}}else a=null}a=a||{start:0,end:0}}else a=null;for(nh={focusedElem:t,selectionRange:a},Xc=!1,an=i;an!==null;)if(i=an,t=i.child,(i.subtreeFlags&1028)!==0&&t!==null)t.return=i,an=t;else for(;an!==null;){switch(i=an,f=i.alternate,t=i.flags,i.tag){case 0:if((t&4)!==0&&(t=i.updateQueue,t=t!==null?t.events:null,t!==null))for(a=0;a title"))),vn(f,s,a),f[nt]=t,jt(f),s=f;break e;case"link":var b=iv("link","href",u).get(s+(a.href||""));if(b){for(var C=0;Cst&&(b=st,st=De,De=b);var q=sg(C,De),B=sg(C,st);if(q&&B&&(ee.rangeCount!==1||ee.anchorNode!==q.node||ee.anchorOffset!==q.offset||ee.focusNode!==B.node||ee.focusOffset!==B.offset)){var Q=le.createRange();Q.setStart(q.node,q.offset),ee.removeAllRanges(),De>st?(ee.addRange(Q),ee.extend(B.node,B.offset)):(Q.setEnd(B.node,B.offset),ee.addRange(Q))}}}}for(le=[],ee=C;ee=ee.parentNode;)ee.nodeType===1&&le.push({element:ee,left:ee.scrollLeft,top:ee.scrollTop});for(typeof C.focus=="function"&&C.focus(),C=0;Ca?32:a,j.T=null,a=$f,$f=null;var f=Fo,b=yo;if(Pt=0,Da=Fo=null,yo=0,(Je&6)!==0)throw Error(r(331));var C=Je;if(Je|=4,l0(f.current),r0(f,f.current,b,a),Je=C,Xs(0,!1),Ot&&typeof Ot.onPostCommitFiberRoot=="function")try{Ot.onPostCommitFiberRoot(Dn,f)}catch{}return!0}finally{I.p=u,j.T=s,E0(t,i)}}function k0(t,i,a){i=fi(a,i),i=wf(t.stateNode,i,2),t=qo(t,i,2),t!==null&&(be(t,2),Qi(t))}function ot(t,i,a){if(t.tag===3)k0(t,t,a);else for(;i!==null;){if(i.tag===3){k0(i,t,a);break}else if(i.tag===1){var s=i.stateNode;if(typeof i.type.getDerivedStateFromError=="function"||typeof s.componentDidCatch=="function"&&(Io===null||!Io.has(s))){t=fi(a,t),a=Ty(2),s=qo(i,a,2),s!==null&&(Dy(a,s,i,t),be(s,2),Qi(s));break}}i=i.return}}function Xf(t,i,a){var s=t.pingCache;if(s===null){s=t.pingCache=new zx;var u=new Set;s.set(i,u)}else u=s.get(i),u===void 0&&(u=new Set,s.set(i,u));u.has(a)||(Uf=!0,u.add(a),t=Ux.bind(null,t,i,a),i.then(t,t))}function Ux(t,i,a){var s=t.pingCache;s!==null&&s.delete(i),t.pingedLanes|=t.suspendedLanes&a,t.warmLanes&=~a,ut===t&&(Ye&a)===a&&(Nt===4||Nt===3&&(Ye&62914560)===Ye&&300>Ve()-Nc?(Je&2)===0&&Ma(t,0):Gf|=a,Ta===Ye&&(Ta=0)),Qi(t)}function T0(t,i){i===0&&(i=Gn()),t=kr(t,i),t!==null&&(be(t,i),Qi(t))}function Gx(t){var i=t.memoizedState,a=0;i!==null&&(a=i.retryLane),T0(t,a)}function Bx(t,i){var a=0;switch(t.tag){case 31:case 13:var s=t.stateNode,u=t.memoizedState;u!==null&&(a=u.retryLane);break;case 19:s=t.stateNode;break;case 22:s=t.stateNode._retryCache;break;default:throw Error(r(314))}s!==null&&s.delete(i),T0(t,a)}function Hx(t,i){return zt(t,i)}var Rc=null,Oa=null,Kf=!1,jc=!1,Qf=!1,Jo=0;function Qi(t){t!==Oa&&t.next===null&&(Oa===null?Rc=Oa=t:Oa=Oa.next=t),jc=!0,Kf||(Kf=!0,Yx())}function Xs(t,i){if(!Qf&&jc){Qf=!0;do for(var a=!1,s=Rc;s!==null;){if(t!==0){var u=s.pendingLanes;if(u===0)var f=0;else{var b=s.suspendedLanes,C=s.pingedLanes;f=(1<<31-vt(42|t)+1)-1,f&=u&~(b&~C),f=f&201326741?f&201326741|1:f?f|2:0}f!==0&&(a=!0,O0(s,f))}else f=Ye,f=$i(s,s===ut?f:0,s.cancelPendingCommit!==null||s.timeoutHandle!==-1),(f&3)===0||fn(s,f)||(a=!0,O0(s,f));s=s.next}while(a);Qf=!1}}function $x(){D0()}function D0(){jc=Kf=!1;var t=0;Jo!==0&&Jx()&&(t=Jo);for(var i=Ve(),a=null,s=Rc;s!==null;){var u=s.next,f=M0(s,i);f===0?(s.next=null,a===null?Rc=u:a.next=u,u===null&&(Oa=a)):(a=s,(t!==0||(f&3)!==0)&&(jc=!0)),s=u}Pt!==0&&Pt!==5||Xs(t),Jo!==0&&(Jo=0)}function M0(t,i){for(var a=t.suspendedLanes,s=t.pingedLanes,u=t.expirationTimes,f=t.pendingLanes&-62914561;0C)break;var ie=U.transferSize,le=U.initiatorType;ie&&$0(le)&&(U=U.responseEnd,b+=ie*(U"u"?null:document;function W0(t,i,a){var s=Ra;if(s&&typeof i=="string"&&i){var u=ui(i);u='link[rel="'+t+'"][href="'+u+'"]',typeof a=="string"&&(u+='[crossorigin="'+a+'"]'),J0.has(u)||(J0.add(u),t={rel:t,crossOrigin:a,href:i},s.querySelector(u)===null&&(i=s.createElement("link"),vn(i,"link",t),jt(i),s.head.appendChild(i)))}}function sS(t){vo.D(t),W0("dns-prefetch",t,null)}function lS(t,i){vo.C(t,i),W0("preconnect",t,i)}function cS(t,i,a){vo.L(t,i,a);var s=Ra;if(s&&t&&i){var u='link[rel="preload"][as="'+ui(i)+'"]';i==="image"&&a&&a.imageSrcSet?(u+='[imagesrcset="'+ui(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(u+='[imagesizes="'+ui(a.imageSizes)+'"]')):u+='[href="'+ui(t)+'"]';var f=u;switch(i){case"style":f=ja(t);break;case"script":f=La(t)}vi.has(f)||(t=y({rel:"preload",href:i==="image"&&a&&a.imageSrcSet?void 0:t,as:i},a),vi.set(f,t),s.querySelector(u)!==null||i==="style"&&s.querySelector(Is(f))||i==="script"&&s.querySelector(Fs(f))||(i=s.createElement("link"),vn(i,"link",t),jt(i),s.head.appendChild(i)))}}function uS(t,i){vo.m(t,i);var a=Ra;if(a&&t){var s=i&&typeof i.as=="string"?i.as:"script",u='link[rel="modulepreload"][as="'+ui(s)+'"][href="'+ui(t)+'"]',f=u;switch(s){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":f=La(t)}if(!vi.has(f)&&(t=y({rel:"modulepreload",href:t},i),vi.set(f,t),a.querySelector(u)===null)){switch(s){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(Fs(f)))return}s=a.createElement("link"),vn(s,"link",t),jt(s),a.head.appendChild(s)}}}function dS(t,i,a){vo.S(t,i,a);var s=Ra;if(s&&t){var u=Wi(s).hoistableStyles,f=ja(t);i=i||"default";var b=u.get(f);if(!b){var C={loading:0,preload:null};if(b=s.querySelector(Is(f)))C.loading=5;else{t=y({rel:"stylesheet",href:t,"data-precedence":i},a),(a=vi.get(f))&&ch(t,a);var U=b=s.createElement("link");jt(U),vn(U,"link",t),U._p=new Promise(function(Z,ie){U.onload=Z,U.onerror=ie}),U.addEventListener("load",function(){C.loading|=1}),U.addEventListener("error",function(){C.loading|=2}),C.loading|=4,Hc(b,i,s)}b={type:"stylesheet",instance:b,count:1,state:C},u.set(f,b)}}}function fS(t,i){vo.X(t,i);var a=Ra;if(a&&t){var s=Wi(a).hoistableScripts,u=La(t),f=s.get(u);f||(f=a.querySelector(Fs(u)),f||(t=y({src:t,async:!0},i),(i=vi.get(u))&&uh(t,i),f=a.createElement("script"),jt(f),vn(f,"link",t),a.head.appendChild(f)),f={type:"script",instance:f,count:1,state:null},s.set(u,f))}}function hS(t,i){vo.M(t,i);var a=Ra;if(a&&t){var s=Wi(a).hoistableScripts,u=La(t),f=s.get(u);f||(f=a.querySelector(Fs(u)),f||(t=y({src:t,async:!0,type:"module"},i),(i=vi.get(u))&&uh(t,i),f=a.createElement("script"),jt(f),vn(f,"link",t),a.head.appendChild(f)),f={type:"script",instance:f,count:1,state:null},s.set(u,f))}}function ev(t,i,a,s){var u=(u=W.current)?Bc(u):null;if(!u)throw Error(r(446));switch(t){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(i=ja(a.href),a=Wi(u).hoistableStyles,s=a.get(i),s||(s={type:"style",instance:null,count:0,state:null},a.set(i,s)),s):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){t=ja(a.href);var f=Wi(u).hoistableStyles,b=f.get(t);if(b||(u=u.ownerDocument||u,b={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},f.set(t,b),(f=u.querySelector(Is(t)))&&!f._p&&(b.instance=f,b.state.loading=5),vi.has(t)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},vi.set(t,a),f||pS(u,t,a,b.state))),i&&s===null)throw Error(r(528,""));return b}if(i&&s!==null)throw Error(r(529,""));return null;case"script":return i=a.async,a=a.src,typeof a=="string"&&i&&typeof i!="function"&&typeof i!="symbol"?(i=La(a),a=Wi(u).hoistableScripts,s=a.get(i),s||(s={type:"script",instance:null,count:0,state:null},a.set(i,s)),s):{type:"void",instance:null,count:0,state:null};default:throw Error(r(444,t))}}function ja(t){return'href="'+ui(t)+'"'}function Is(t){return'link[rel="stylesheet"]['+t+"]"}function tv(t){return y({},t,{"data-precedence":t.precedence,precedence:null})}function pS(t,i,a,s){t.querySelector('link[rel="preload"][as="style"]['+i+"]")?s.loading=1:(i=t.createElement("link"),s.preload=i,i.addEventListener("load",function(){return s.loading|=1}),i.addEventListener("error",function(){return s.loading|=2}),vn(i,"link",a),jt(i),t.head.appendChild(i))}function La(t){return'[src="'+ui(t)+'"]'}function Fs(t){return"script[async]"+t}function nv(t,i,a){if(i.count++,i.instance===null)switch(i.type){case"style":var s=t.querySelector('style[data-href~="'+ui(a.href)+'"]');if(s)return i.instance=s,jt(s),s;var u=y({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return s=(t.ownerDocument||t).createElement("style"),jt(s),vn(s,"style",u),Hc(s,a.precedence,t),i.instance=s;case"stylesheet":u=ja(a.href);var f=t.querySelector(Is(u));if(f)return i.state.loading|=4,i.instance=f,jt(f),f;s=tv(a),(u=vi.get(u))&&ch(s,u),f=(t.ownerDocument||t).createElement("link"),jt(f);var b=f;return b._p=new Promise(function(C,U){b.onload=C,b.onerror=U}),vn(f,"link",s),i.state.loading|=4,Hc(f,a.precedence,t),i.instance=f;case"script":return f=La(a.src),(u=t.querySelector(Fs(f)))?(i.instance=u,jt(u),u):(s=a,(u=vi.get(f))&&(s=y({},a),uh(s,u)),t=t.ownerDocument||t,u=t.createElement("script"),jt(u),vn(u,"link",s),t.head.appendChild(u),i.instance=u);case"void":return null;default:throw Error(r(443,i.type))}else i.type==="stylesheet"&&(i.state.loading&4)===0&&(s=i.instance,i.state.loading|=4,Hc(s,a.precedence,t));return i.instance}function Hc(t,i,a){for(var s=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),u=s.length?s[s.length-1]:null,f=u,b=0;b title"):null)}function mS(t,i,a){if(a===1||i.itemProp!=null)return!1;switch(t){case"meta":case"title":return!0;case"style":if(typeof i.precedence!="string"||typeof i.href!="string"||i.href==="")break;return!0;case"link":if(typeof i.rel!="string"||typeof i.href!="string"||i.href===""||i.onLoad||i.onError)break;switch(i.rel){case"stylesheet":return t=i.disabled,typeof i.precedence=="string"&&t==null;default:return!0}case"script":if(i.async&&typeof i.async!="function"&&typeof i.async!="symbol"&&!i.onLoad&&!i.onError&&i.src&&typeof i.src=="string")return!0}return!1}function rv(t){return!(t.type==="stylesheet"&&(t.state.loading&3)===0)}function gS(t,i,a,s){if(a.type==="stylesheet"&&(typeof s.media!="string"||matchMedia(s.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var u=ja(s.href),f=i.querySelector(Is(u));if(f){i=f._p,i!==null&&typeof i=="object"&&typeof i.then=="function"&&(t.count++,t=Yc.bind(t),i.then(t,t)),a.state.loading|=4,a.instance=f,jt(f);return}f=i.ownerDocument||i,s=tv(s),(u=vi.get(u))&&ch(s,u),f=f.createElement("link"),jt(f);var b=f;b._p=new Promise(function(C,U){b.onload=C,b.onerror=U}),vn(f,"link",s),a.instance=f}t.stylesheets===null&&(t.stylesheets=new Map),t.stylesheets.set(a,i),(i=a.state.preload)&&(a.state.loading&3)===0&&(t.count++,a=Yc.bind(t),i.addEventListener("load",a),i.addEventListener("error",a))}}var dh=0;function yS(t,i){return t.stylesheets&&t.count===0&&Vc(t,t.stylesheets),0dh?50:800)+i);return t.unsuspend=a,function(){t.unsuspend=null,clearTimeout(s),clearTimeout(u)}}:null}function Yc(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Vc(this,this.stylesheets);else if(this.unsuspend){var t=this.unsuspend;this.unsuspend=null,t()}}}var qc=null;function Vc(t,i){t.stylesheets=null,t.unsuspend!==null&&(t.count++,qc=new Map,i.forEach(vS,t),qc=null,Yc.call(t))}function vS(t,i){if(!(i.state.loading&4)){var a=qc.get(t);if(a)var s=a.get(null);else{a=new Map,qc.set(t,a);for(var u=t.querySelectorAll("link[data-precedence],style[data-precedence]"),f=0;f"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}return n(),xh.exports=jS(),xh.exports}var US=LS();const Co={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1};function V1(n){return"init"in n}function qh(n){return!!n.write}function Dv(n){return"v"in n||"e"in n}function hu(n){if("e"in n)throw n.e;if((Co?"production":void 0)!=="production"&&!("v"in n))throw new Error("[Bug] atom state is not initialized");return n.v}const pu=new WeakMap;function X1(n){var e;return mu(n)&&!!((e=pu.get(n))!=null&&e[0])}function GS(n){const e=pu.get(n);e!=null&&e[0]&&(e[0]=!1,e[1].forEach(o=>o()))}function Vh(n,e){let o=pu.get(n);if(!o){o=[!0,new Set],pu.set(n,o);const r=()=>{o[0]=!1};n.then(r,r)}o[1].add(e)}function mu(n){return typeof(n==null?void 0:n.then)=="function"}function K1(n,e,o){if(!o.p.has(n)){o.p.add(n);const r=()=>o.p.delete(n);e.then(r,r)}}function Q1(n,e,o){var r;const l=new Set;for(const c of((r=o.get(n))==null?void 0:r.t)||[])l.add(c);for(const c of e.p)l.add(c);return l}const BS=(n,e,...o)=>e.read(...o),HS=(n,e,...o)=>e.write(...o),$S=(n,e)=>{if(e.INTERNAL_onInit)return e.INTERNAL_onInit(n);if(e.unstable_onInit)return console.warn("[DEPRECATED] atom.unstable_onInit is renamed to atom.INTERNAL_onInit."),e.unstable_onInit(n)},YS=(n,e,o)=>{var r;return(r=e.onMount)==null?void 0:r.call(e,o)},qS=(n,e)=>{var o;const r=Nn(n),l=r[0],c=r[6],d=r[9];if((Co?"production":void 0)!=="production"&&!e)throw new Error("Atom is undefined or null");let p=l.get(e);return p||(p={d:new Map,p:new Set,n:0},l.set(e,p),(o=c.i)==null||o.call(c,e),d==null||d(n,e)),p},VS=n=>{const e=Nn(n),o=e[1],r=e[3],l=e[4],c=e[5],d=e[6],p=e[13],m=[],h=g=>{try{g()}catch(y){m.push(y)}};do{d.f&&h(d.f);const g=new Set,y=g.add.bind(g);r.forEach(v=>{var w;return(w=o.get(v))==null?void 0:w.l.forEach(y)}),r.clear(),c.forEach(y),c.clear(),l.forEach(y),l.clear(),g.forEach(h),r.size&&p(n)}while(r.size||c.size||l.size);if(m.length)throw new AggregateError(m)},XS=n=>{const e=Nn(n),o=e[1],r=e[2],l=e[3],c=e[11],d=e[14],p=e[17],m=[],h=new WeakSet,g=new WeakSet,y=Array.from(l);for(;y.length;){const v=y[y.length-1],w=c(n,v);if(g.has(v)){y.pop();continue}if(h.has(v)){if(r.get(v)===w.n)m.push([v,w]);else if((Co?"production":void 0)!=="production"&&r.has(v))throw new Error("[Bug] invalidated atom exists");g.add(v),y.pop();continue}h.add(v);for(const S of Q1(v,w,o))h.has(S)||y.push(S)}for(let v=m.length-1;v>=0;--v){const[w,S]=m[v];let A=!1;for(const x of S.d.keys())if(x!==w&&l.has(x)){A=!0;break}A&&(d(n,w),p(n,w)),r.delete(w)}},Xh=new WeakSet,KS=(n,e)=>{var o,r;const l=Nn(n),c=l[1],d=l[2],p=l[3],m=l[6],h=l[7],g=l[11],y=l[12],v=l[13],w=l[14],S=l[16],A=l[17],x=g(n,e);if(Dv(x)){if(c.has(e)&&d.get(e)!==x.n)return x;let M=!1;for(const[$,L]of x.d)if(w(n,$).n!==L){M=!0;break}if(!M)return x}x.d.clear();let E=!0;function D(){c.has(e)&&(A(n,e),v(n),y(n))}function R(M){var $;if(M===e){const X=g(n,M);if(!Dv(X))if(V1(M))gu(n,M,M.init);else throw new Error("no atom init");return hu(X)}const L=w(n,M);try{return hu(L)}finally{x.d.set(M,L.n),X1(x.v)&&K1(e,x.v,L),c.has(e)&&(($=c.get(M))==null||$.t.add(e)),E||D()}}let _,N;const T={get signal(){return _||(_=new AbortController),_.signal},get setSelf(){return(Co?"production":void 0)!=="production"&&!qh(e)&&console.warn("setSelf function cannot be used with read-only atom"),!N&&qh(e)&&(N=(...M)=>{if((Co?"production":void 0)!=="production"&&E&&console.warn("setSelf function cannot be called in sync"),!E)try{return S(n,e,...M)}finally{v(n),y(n)}}),N}},O=x.n;try{(Co?"production":void 0)!=="production"&&Xh.delete(n);const M=h(n,e,R,T);return(Co?"production":void 0)!=="production"&&Xh.has(n)&&console.warn("Detected store mutation during atom read. This is not supported."),gu(n,e,M),mu(M)&&(Vh(M,()=>_==null?void 0:_.abort()),M.then(D,D)),(o=m.r)==null||o.call(m,e),x}catch(M){return delete x.v,x.e=M,++x.n,x}finally{E=!1,O!==x.n&&d.get(e)===O&&(d.set(e,x.n),p.add(e),(r=m.c)==null||r.call(m,e))}},QS=(n,e)=>{const o=Nn(n),r=o[1],l=o[2],c=o[11],d=[e];for(;d.length;){const p=d.pop(),m=c(n,p);for(const h of Q1(p,m,r)){const g=c(n,h);l.set(h,g.n),d.push(h)}}},Z1=(n,e,...o)=>{const r=Nn(n),l=r[3],c=r[6],d=r[8],p=r[11],m=r[12],h=r[13],g=r[14],y=r[15],v=r[17];let w=!0;const S=x=>hu(g(n,x)),A=(x,...E)=>{var D;const R=p(n,x);try{if(x===e){if(!V1(x))throw new Error("atom not writable");(Co?"production":void 0)!=="production"&&Xh.add(n);const _=R.n,N=E[0];gu(n,x,N),v(n,x),_!==R.n&&(l.add(x),y(n,x),(D=c.c)==null||D.call(c,x));return}else return Z1(n,x,...E)}finally{w||(h(n),m(n))}};try{return d(n,e,S,A,...o)}finally{w=!1}},ZS=(n,e)=>{var o;const r=Nn(n),l=r[1],c=r[3],d=r[6],p=r[11],m=r[15],h=r[18],g=r[19],y=p(n,e),v=l.get(e);if(v&&!X1(y.v)){for(const[w,S]of y.d)if(!v.d.has(w)){const A=p(n,w);h(n,w).t.add(e),v.d.add(w),S!==A.n&&(c.add(w),m(n,w),(o=d.c)==null||o.call(d,w))}for(const w of v.d)if(!y.d.has(w)){v.d.delete(w);const S=g(n,w);S==null||S.t.delete(e)}}},I1=(n,e)=>{var o;const r=Nn(n),l=r[1],c=r[4],d=r[6],p=r[10],m=r[11],h=r[12],g=r[13],y=r[14],v=r[16],w=m(n,e);let S=l.get(e);if(!S){y(n,e);for(const A of w.d.keys())I1(n,A).t.add(e);if(S={l:new Set,d:new Set(w.d.keys()),t:new Set},l.set(e,S),qh(e)){const A=()=>{let x=!0;const E=(...D)=>{try{return v(n,e,...D)}finally{x||(g(n),h(n))}};try{const D=p(n,e,E);D&&(S.u=()=>{x=!0;try{D()}finally{x=!1}})}finally{x=!1}};c.add(A)}(o=d.m)==null||o.call(d,e)}return S},IS=(n,e)=>{var o,r;const l=Nn(n),c=l[1],d=l[5],p=l[6],m=l[11],h=l[19],g=m(n,e);let y=c.get(e);if(!y||y.l.size)return y;let v=!1;for(const w of y.t)if((o=c.get(w))!=null&&o.d.has(e)){v=!0;break}if(!v){y.u&&d.add(y.u),y=void 0,c.delete(e);for(const w of g.d.keys()){const S=h(n,w);S==null||S.t.delete(e)}(r=p.u)==null||r.call(p,e);return}return y},gu=(n,e,o)=>{const r=Nn(n)[11],l=r(n,e),c="v"in l,d=l.v;if(mu(o))for(const p of l.d.keys())K1(e,o,r(n,p));l.v=o,delete l.e,(!c||!Object.is(d,l.v))&&(++l.n,mu(d)&&GS(d))},FS=(n,e)=>{const o=Nn(n)[14];return hu(o(n,e))},PS=(n,e,...o)=>{const r=Nn(n),l=r[12],c=r[13],d=r[16];try{return d(n,e,...o)}finally{c(n),l(n)}},JS=(n,e,o)=>{const r=Nn(n),l=r[12],c=r[18],d=r[19],m=c(n,e).l;return m.add(o),l(n),()=>{m.delete(o),d(n,e),l(n)}},F1=new WeakMap,Nn=n=>{const e=F1.get(n);if((Co?"production":void 0)!=="production"&&!e)throw new Error("Store must be created by buildStore to read its building blocks");return e};function WS(...n){const e={get(r){const l=Nn(e)[21];return l(e,r)},set(r,...l){const c=Nn(e)[22];return c(e,r,...l)},sub(r,l){const c=Nn(e)[23];return c(e,r,l)}},o=[new WeakMap,new WeakMap,new WeakMap,new Set,new Set,new Set,{},BS,HS,$S,YS,qS,VS,XS,KS,QS,Z1,ZS,I1,IS,gu,FS,PS,JS,void 0].map((r,l)=>n[l]||r);return F1.set(e,Object.freeze(o)),e}const eA={};function P1(){return WS()}let il;function tA(){return il||(il=P1(),(eA?"production":void 0)!=="production"&&(globalThis.__JOTAI_DEFAULT_STORE__||(globalThis.__JOTAI_DEFAULT_STORE__=il),globalThis.__JOTAI_DEFAULT_STORE__!==il&&console.warn("Detected multiple Jotai instances. It may cause unexpected behavior with the default store. https://github.com/pmndrs/jotai/discussions/2044"))),il}const nA={},Kh=ne.createContext(void 0);function J1(n){return ne.useContext(Kh)||tA()}function iA({children:n,store:e}){const o=ne.useRef(null);return e?ne.createElement(Kh.Provider,{value:e},n):(o.current===null&&(o.current=P1()),ne.createElement(Kh.Provider,{value:o.current},n))}const Qh=n=>typeof(n==null?void 0:n.then)=="function",Zh=n=>{n.status||(n.status="pending",n.then(e=>{n.status="fulfilled",n.value=e},e=>{n.status="rejected",n.reason=e}))},oA=Ji.use||(n=>{if(n.status==="pending")throw n;if(n.status==="fulfilled")return n.value;throw n.status==="rejected"?n.reason:(Zh(n),n)}),Ch=new WeakMap,Mv=(n,e)=>{let o=Ch.get(n);return o||(o=new Promise((r,l)=>{let c=n;const d=h=>g=>{c===h&&r(g)},p=h=>g=>{c===h&&l(g)},m=()=>{try{const h=e();Qh(h)?(Ch.set(h,o),c=h,h.then(d(h),p(h)),Vh(h,m)):r(h)}catch(h){l(h)}};n.then(d(n),p(n)),Vh(n,m)}),Ch.set(n,o)),o};function Ih(n,e){const{delay:o,unstable_promiseStatus:r=!Ji.use}={},l=J1(),[[c,d,p],m]=ne.useReducer(g=>{const y=l.get(n);return Object.is(g[0],y)&&g[1]===l&&g[2]===n?g:[y,l,n]},void 0,()=>[l.get(n),l,n]);let h=c;if((d!==l||p!==n)&&(m(),h=l.get(n)),ne.useEffect(()=>{const g=l.sub(n,()=>{if(r)try{const y=l.get(n);Qh(y)&&Zh(Mv(y,()=>l.get(n)))}catch{}if(typeof o=="number"){setTimeout(m,o);return}m()});return m(),g},[l,n,o,r]),ne.useDebugValue(h),Qh(h)){const g=Mv(h,()=>l.get(n));return r&&Zh(g),oA(g)}return h}function Ka(n,e){const o=J1();return ne.useCallback((...l)=>{if((nA?"production":void 0)!=="production"&&!("write"in n))throw new Error("not writable atom");return o.set(n,...l)},[o,n])}function rA(n,e){return[Ih(n),Ka(n)]}var Wc={exports:{}},zv;function aA(){if(zv)return Wc.exports;zv=1;var n=typeof Reflect=="object"?Reflect:null,e=n&&typeof n.apply=="function"?n.apply:function(N,T,O){return Function.prototype.apply.call(N,T,O)},o;n&&typeof n.ownKeys=="function"?o=n.ownKeys:Object.getOwnPropertySymbols?o=function(N){return Object.getOwnPropertyNames(N).concat(Object.getOwnPropertySymbols(N))}:o=function(N){return Object.getOwnPropertyNames(N)};function r(_){console&&console.warn&&console.warn(_)}var l=Number.isNaN||function(N){return N!==N};function c(){c.init.call(this)}Wc.exports=c,Wc.exports.once=E,c.EventEmitter=c,c.prototype._events=void 0,c.prototype._eventsCount=0,c.prototype._maxListeners=void 0;var d=10;function p(_){if(typeof _!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof _)}Object.defineProperty(c,"defaultMaxListeners",{enumerable:!0,get:function(){return d},set:function(_){if(typeof _!="number"||_<0||l(_))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+_+".");d=_}}),c.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},c.prototype.setMaxListeners=function(N){if(typeof N!="number"||N<0||l(N))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+N+".");return this._maxListeners=N,this};function m(_){return _._maxListeners===void 0?c.defaultMaxListeners:_._maxListeners}c.prototype.getMaxListeners=function(){return m(this)},c.prototype.emit=function(N){for(var T=[],O=1;O0&&(L=T[0]),L instanceof Error)throw L;var X=new Error("Unhandled error."+(L?" ("+L.message+")":""));throw X.context=L,X}var ae=$[N];if(ae===void 0)return!1;if(typeof ae=="function")e(ae,this,T);else for(var te=ae.length,me=S(ae,te),O=0;O0&&L.length>M&&!L.warned){L.warned=!0;var X=new Error("Possible EventEmitter memory leak detected. "+L.length+" "+String(N)+" listeners added. Use emitter.setMaxListeners() to increase limit");X.name="MaxListenersExceededWarning",X.emitter=_,X.type=N,X.count=L.length,r(X)}return _}c.prototype.addListener=function(N,T){return h(this,N,T,!1)},c.prototype.on=c.prototype.addListener,c.prototype.prependListener=function(N,T){return h(this,N,T,!0)};function g(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function y(_,N,T){var O={fired:!1,wrapFn:void 0,target:_,type:N,listener:T},M=g.bind(O);return M.listener=T,O.wrapFn=M,M}c.prototype.once=function(N,T){return p(T),this.on(N,y(this,N,T)),this},c.prototype.prependOnceListener=function(N,T){return p(T),this.prependListener(N,y(this,N,T)),this},c.prototype.removeListener=function(N,T){var O,M,$,L,X;if(p(T),M=this._events,M===void 0)return this;if(O=M[N],O===void 0)return this;if(O===T||O.listener===T)--this._eventsCount===0?this._events=Object.create(null):(delete M[N],M.removeListener&&this.emit("removeListener",N,O.listener||T));else if(typeof O!="function"){for($=-1,L=O.length-1;L>=0;L--)if(O[L]===T||O[L].listener===T){X=O[L].listener,$=L;break}if($<0)return this;$===0?O.shift():A(O,$),O.length===1&&(M[N]=O[0]),M.removeListener!==void 0&&this.emit("removeListener",N,X||T)}return this},c.prototype.off=c.prototype.removeListener,c.prototype.removeAllListeners=function(N){var T,O,M;if(O=this._events,O===void 0)return this;if(O.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):O[N]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete O[N]),this;if(arguments.length===0){var $=Object.keys(O),L;for(M=0;M<$.length;++M)L=$[M],L!=="removeListener"&&this.removeAllListeners(L);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(T=O[N],typeof T=="function")this.removeListener(N,T);else if(T!==void 0)for(M=T.length-1;M>=0;M--)this.removeListener(N,T[M]);return this};function v(_,N,T){var O=_._events;if(O===void 0)return[];var M=O[N];return M===void 0?[]:typeof M=="function"?T?[M.listener||M]:[M]:T?x(M):S(M,M.length)}c.prototype.listeners=function(N){return v(this,N,!0)},c.prototype.rawListeners=function(N){return v(this,N,!1)},c.listenerCount=function(_,N){return typeof _.listenerCount=="function"?_.listenerCount(N):w.call(_,N)},c.prototype.listenerCount=w;function w(_){var N=this._events;if(N!==void 0){var T=N[_];if(typeof T=="function")return 1;if(T!==void 0)return T.length}return 0}c.prototype.eventNames=function(){return this._eventsCount>0?o(this._events):[]};function S(_,N){for(var T=new Array(N),O=0;On++}function ko(){const n=arguments;let e=null,o=-1;return{[Symbol.iterator](){return this},next(){let r=null;do{if(e===null){if(o++,o>=n.length)return{done:!0};e=n[o][Symbol.iterator]()}if(r=e.next(),r.done){e=null;continue}break}while(!0);return r}}}function rs(){return{[Symbol.iterator](){return this},next(){return{done:!0}}}}class Sp extends Error{constructor(e){super(),this.name="GraphError",this.message=e}}class ye extends Sp{constructor(e){super(e),this.name="InvalidArgumentsGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,ye.prototype.constructor)}}class pe extends Sp{constructor(e){super(e),this.name="NotFoundGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,pe.prototype.constructor)}}class Me extends Sp{constructor(e){super(e),this.name="UsageGraphError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Me.prototype.constructor)}}function eb(n,e){this.key=n,this.attributes=e,this.clear()}eb.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}};function tb(n,e){this.key=n,this.attributes=e,this.clear()}tb.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}};function nb(n,e){this.key=n,this.attributes=e,this.clear()}nb.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}};function as(n,e,o,r,l){this.key=e,this.attributes=l,this.undirected=n,this.source=o,this.target=r}as.prototype.attach=function(){let n="out",e="in";this.undirected&&(n=e="undirected");const o=this.source.key,r=this.target.key;this.source[n][r]=this,!(this.undirected&&o===r)&&(this.target[e][o]=this)};as.prototype.attachMulti=function(){let n="out",e="in";const o=this.source.key,r=this.target.key;this.undirected&&(n=e="undirected");const l=this.source[n],c=l[r];if(typeof c>"u"){l[r]=this,this.undirected&&o===r||(this.target[e][o]=this);return}c.previous=this,this.next=c,l[r]=this,this.target[e][o]=this};as.prototype.detach=function(){const n=this.source.key,e=this.target.key;let o="out",r="in";this.undirected&&(o=r="undirected"),delete this.source[o][e],delete this.target[r][n]};as.prototype.detachMulti=function(){const n=this.source.key,e=this.target.key;let o="out",r="in";this.undirected&&(o=r="undirected"),this.previous===void 0?this.next===void 0?(delete this.source[o][e],delete this.target[r][n]):(this.next.previous=void 0,this.source[o][e]=this.next,this.target[r][n]=this.next):(this.previous.next=this.next,this.next!==void 0&&(this.next.previous=this.previous))};const ib=0,ob=1,uA=2,rb=3;function Do(n,e,o,r,l,c,d){let p,m,h,g;if(r=""+r,o===ib){if(p=n._nodes.get(r),!p)throw new pe(`Graph.${e}: could not find the "${r}" node in the graph.`);h=l,g=c}else if(o===rb){if(l=""+l,m=n._edges.get(l),!m)throw new pe(`Graph.${e}: could not find the "${l}" edge in the graph.`);const y=m.source.key,v=m.target.key;if(r===y)p=m.target;else if(r===v)p=m.source;else throw new pe(`Graph.${e}: the "${r}" node is not attached to the "${l}" edge (${y}, ${v}).`);h=c,g=d}else{if(m=n._edges.get(r),!m)throw new pe(`Graph.${e}: could not find the "${r}" edge in the graph.`);o===ob?p=m.source:p=m.target,h=l,g=c}return[p,h,g]}function dA(n,e,o){n.prototype[e]=function(r,l,c){const[d,p]=Do(this,e,o,r,l,c);return d.attributes[p]}}function fA(n,e,o){n.prototype[e]=function(r,l){const[c]=Do(this,e,o,r,l);return c.attributes}}function hA(n,e,o){n.prototype[e]=function(r,l,c){const[d,p]=Do(this,e,o,r,l,c);return d.attributes.hasOwnProperty(p)}}function pA(n,e,o){n.prototype[e]=function(r,l,c,d){const[p,m,h]=Do(this,e,o,r,l,c,d);return p.attributes[m]=h,this.emit("nodeAttributesUpdated",{key:p.key,type:"set",attributes:p.attributes,name:m}),this}}function mA(n,e,o){n.prototype[e]=function(r,l,c,d){const[p,m,h]=Do(this,e,o,r,l,c,d);if(typeof h!="function")throw new ye(`Graph.${e}: updater should be a function.`);const g=p.attributes,y=h(g[m]);return g[m]=y,this.emit("nodeAttributesUpdated",{key:p.key,type:"set",attributes:p.attributes,name:m}),this}}function gA(n,e,o){n.prototype[e]=function(r,l,c){const[d,p]=Do(this,e,o,r,l,c);return delete d.attributes[p],this.emit("nodeAttributesUpdated",{key:d.key,type:"remove",attributes:d.attributes,name:p}),this}}function yA(n,e,o){n.prototype[e]=function(r,l,c){const[d,p]=Do(this,e,o,r,l,c);if(!bn(p))throw new ye(`Graph.${e}: provided attributes are not a plain object.`);return d.attributes=p,this.emit("nodeAttributesUpdated",{key:d.key,type:"replace",attributes:d.attributes}),this}}function vA(n,e,o){n.prototype[e]=function(r,l,c){const[d,p]=Do(this,e,o,r,l,c);if(!bn(p))throw new ye(`Graph.${e}: provided attributes are not a plain object.`);return tn(d.attributes,p),this.emit("nodeAttributesUpdated",{key:d.key,type:"merge",attributes:d.attributes,data:p}),this}}function bA(n,e,o){n.prototype[e]=function(r,l,c){const[d,p]=Do(this,e,o,r,l,c);if(typeof p!="function")throw new ye(`Graph.${e}: provided updater is not a function.`);return d.attributes=p(d.attributes),this.emit("nodeAttributesUpdated",{key:d.key,type:"update",attributes:d.attributes}),this}}const wA=[{name:n=>`get${n}Attribute`,attacher:dA},{name:n=>`get${n}Attributes`,attacher:fA},{name:n=>`has${n}Attribute`,attacher:hA},{name:n=>`set${n}Attribute`,attacher:pA},{name:n=>`update${n}Attribute`,attacher:mA},{name:n=>`remove${n}Attribute`,attacher:gA},{name:n=>`replace${n}Attributes`,attacher:yA},{name:n=>`merge${n}Attributes`,attacher:vA},{name:n=>`update${n}Attributes`,attacher:bA}];function xA(n){wA.forEach(function({name:e,attacher:o}){o(n,e("Node"),ib),o(n,e("Source"),ob),o(n,e("Target"),uA),o(n,e("Opposite"),rb)})}function SA(n,e,o){n.prototype[e]=function(r,l){let c;if(this.type!=="mixed"&&o!=="mixed"&&o!==this.type)throw new Me(`Graph.${e}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new Me(`Graph.${e}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const d=""+r,p=""+l;if(l=arguments[2],c=_i(this,d,p,o),!c)throw new pe(`Graph.${e}: could not find an edge for the given path ("${d}" - "${p}").`)}else{if(o!=="mixed")throw new Me(`Graph.${e}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(r=""+r,c=this._edges.get(r),!c)throw new pe(`Graph.${e}: could not find the "${r}" edge in the graph.`)}return c.attributes[l]}}function AA(n,e,o){n.prototype[e]=function(r){let l;if(this.type!=="mixed"&&o!=="mixed"&&o!==this.type)throw new Me(`Graph.${e}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>1){if(this.multi)throw new Me(`Graph.${e}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const c=""+r,d=""+arguments[1];if(l=_i(this,c,d,o),!l)throw new pe(`Graph.${e}: could not find an edge for the given path ("${c}" - "${d}").`)}else{if(o!=="mixed")throw new Me(`Graph.${e}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(r=""+r,l=this._edges.get(r),!l)throw new pe(`Graph.${e}: could not find the "${r}" edge in the graph.`)}return l.attributes}}function _A(n,e,o){n.prototype[e]=function(r,l){let c;if(this.type!=="mixed"&&o!=="mixed"&&o!==this.type)throw new Me(`Graph.${e}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new Me(`Graph.${e}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const d=""+r,p=""+l;if(l=arguments[2],c=_i(this,d,p,o),!c)throw new pe(`Graph.${e}: could not find an edge for the given path ("${d}" - "${p}").`)}else{if(o!=="mixed")throw new Me(`Graph.${e}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(r=""+r,c=this._edges.get(r),!c)throw new pe(`Graph.${e}: could not find the "${r}" edge in the graph.`)}return c.attributes.hasOwnProperty(l)}}function CA(n,e,o){n.prototype[e]=function(r,l,c){let d;if(this.type!=="mixed"&&o!=="mixed"&&o!==this.type)throw new Me(`Graph.${e}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new Me(`Graph.${e}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const p=""+r,m=""+l;if(l=arguments[2],c=arguments[3],d=_i(this,p,m,o),!d)throw new pe(`Graph.${e}: could not find an edge for the given path ("${p}" - "${m}").`)}else{if(o!=="mixed")throw new Me(`Graph.${e}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(r=""+r,d=this._edges.get(r),!d)throw new pe(`Graph.${e}: could not find the "${r}" edge in the graph.`)}return d.attributes[l]=c,this.emit("edgeAttributesUpdated",{key:d.key,type:"set",attributes:d.attributes,name:l}),this}}function EA(n,e,o){n.prototype[e]=function(r,l,c){let d;if(this.type!=="mixed"&&o!=="mixed"&&o!==this.type)throw new Me(`Graph.${e}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>3){if(this.multi)throw new Me(`Graph.${e}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const p=""+r,m=""+l;if(l=arguments[2],c=arguments[3],d=_i(this,p,m,o),!d)throw new pe(`Graph.${e}: could not find an edge for the given path ("${p}" - "${m}").`)}else{if(o!=="mixed")throw new Me(`Graph.${e}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(r=""+r,d=this._edges.get(r),!d)throw new pe(`Graph.${e}: could not find the "${r}" edge in the graph.`)}if(typeof c!="function")throw new ye(`Graph.${e}: updater should be a function.`);return d.attributes[l]=c(d.attributes[l]),this.emit("edgeAttributesUpdated",{key:d.key,type:"set",attributes:d.attributes,name:l}),this}}function NA(n,e,o){n.prototype[e]=function(r,l){let c;if(this.type!=="mixed"&&o!=="mixed"&&o!==this.type)throw new Me(`Graph.${e}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new Me(`Graph.${e}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const d=""+r,p=""+l;if(l=arguments[2],c=_i(this,d,p,o),!c)throw new pe(`Graph.${e}: could not find an edge for the given path ("${d}" - "${p}").`)}else{if(o!=="mixed")throw new Me(`Graph.${e}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(r=""+r,c=this._edges.get(r),!c)throw new pe(`Graph.${e}: could not find the "${r}" edge in the graph.`)}return delete c.attributes[l],this.emit("edgeAttributesUpdated",{key:c.key,type:"remove",attributes:c.attributes,name:l}),this}}function kA(n,e,o){n.prototype[e]=function(r,l){let c;if(this.type!=="mixed"&&o!=="mixed"&&o!==this.type)throw new Me(`Graph.${e}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new Me(`Graph.${e}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const d=""+r,p=""+l;if(l=arguments[2],c=_i(this,d,p,o),!c)throw new pe(`Graph.${e}: could not find an edge for the given path ("${d}" - "${p}").`)}else{if(o!=="mixed")throw new Me(`Graph.${e}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(r=""+r,c=this._edges.get(r),!c)throw new pe(`Graph.${e}: could not find the "${r}" edge in the graph.`)}if(!bn(l))throw new ye(`Graph.${e}: provided attributes are not a plain object.`);return c.attributes=l,this.emit("edgeAttributesUpdated",{key:c.key,type:"replace",attributes:c.attributes}),this}}function TA(n,e,o){n.prototype[e]=function(r,l){let c;if(this.type!=="mixed"&&o!=="mixed"&&o!==this.type)throw new Me(`Graph.${e}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new Me(`Graph.${e}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const d=""+r,p=""+l;if(l=arguments[2],c=_i(this,d,p,o),!c)throw new pe(`Graph.${e}: could not find an edge for the given path ("${d}" - "${p}").`)}else{if(o!=="mixed")throw new Me(`Graph.${e}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(r=""+r,c=this._edges.get(r),!c)throw new pe(`Graph.${e}: could not find the "${r}" edge in the graph.`)}if(!bn(l))throw new ye(`Graph.${e}: provided attributes are not a plain object.`);return tn(c.attributes,l),this.emit("edgeAttributesUpdated",{key:c.key,type:"merge",attributes:c.attributes,data:l}),this}}function DA(n,e,o){n.prototype[e]=function(r,l){let c;if(this.type!=="mixed"&&o!=="mixed"&&o!==this.type)throw new Me(`Graph.${e}: cannot find this type of edges in your ${this.type} graph.`);if(arguments.length>2){if(this.multi)throw new Me(`Graph.${e}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`);const d=""+r,p=""+l;if(l=arguments[2],c=_i(this,d,p,o),!c)throw new pe(`Graph.${e}: could not find an edge for the given path ("${d}" - "${p}").`)}else{if(o!=="mixed")throw new Me(`Graph.${e}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`);if(r=""+r,c=this._edges.get(r),!c)throw new pe(`Graph.${e}: could not find the "${r}" edge in the graph.`)}if(typeof l!="function")throw new ye(`Graph.${e}: provided updater is not a function.`);return c.attributes=l(c.attributes),this.emit("edgeAttributesUpdated",{key:c.key,type:"update",attributes:c.attributes}),this}}const MA=[{name:n=>`get${n}Attribute`,attacher:SA},{name:n=>`get${n}Attributes`,attacher:AA},{name:n=>`has${n}Attribute`,attacher:_A},{name:n=>`set${n}Attribute`,attacher:CA},{name:n=>`update${n}Attribute`,attacher:EA},{name:n=>`remove${n}Attribute`,attacher:NA},{name:n=>`replace${n}Attributes`,attacher:kA},{name:n=>`merge${n}Attributes`,attacher:TA},{name:n=>`update${n}Attributes`,attacher:DA}];function zA(n){MA.forEach(function({name:e,attacher:o}){o(n,e("Edge"),"mixed"),o(n,e("DirectedEdge"),"directed"),o(n,e("UndirectedEdge"),"undirected")})}const OA=[{name:"edges",type:"mixed"},{name:"inEdges",type:"directed",direction:"in"},{name:"outEdges",type:"directed",direction:"out"},{name:"inboundEdges",type:"mixed",direction:"in"},{name:"outboundEdges",type:"mixed",direction:"out"},{name:"directedEdges",type:"directed"},{name:"undirectedEdges",type:"undirected"}];function RA(n,e,o,r){let l=!1;for(const c in e){if(c===r)continue;const d=e[c];if(l=o(d.key,d.attributes,d.source.key,d.target.key,d.source.attributes,d.target.attributes,d.undirected),n&&l)return d.key}}function jA(n,e,o,r){let l,c,d,p=!1;for(const m in e)if(m!==r){l=e[m];do{if(c=l.source,d=l.target,p=o(l.key,l.attributes,c.key,d.key,c.attributes,d.attributes,l.undirected),n&&p)return l.key;l=l.next}while(l!==void 0)}}function Eh(n,e){const o=Object.keys(n),r=o.length;let l,c=0;return{[Symbol.iterator](){return this},next(){do if(l)l=l.next;else{if(c>=r)return{done:!0};const d=o[c++];if(d===e){l=void 0;continue}l=n[d]}while(!l);return{done:!1,value:{edge:l.key,attributes:l.attributes,source:l.source.key,target:l.target.key,sourceAttributes:l.source.attributes,targetAttributes:l.target.attributes,undirected:l.undirected}}}}}function LA(n,e,o,r){const l=e[o];if(!l)return;const c=l.source,d=l.target;if(r(l.key,l.attributes,c.key,d.key,c.attributes,d.attributes,l.undirected)&&n)return l.key}function UA(n,e,o,r){let l=e[o];if(!l)return;let c=!1;do{if(c=r(l.key,l.attributes,l.source.key,l.target.key,l.source.attributes,l.target.attributes,l.undirected),n&&c)return l.key;l=l.next}while(l!==void 0)}function Nh(n,e){let o=n[e];if(o.next!==void 0)return{[Symbol.iterator](){return this},next(){if(!o)return{done:!0};const l={edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected};return o=o.next,{done:!1,value:l}}};let r=!1;return{[Symbol.iterator](){return this},next(){return r===!0?{done:!0}:(r=!0,{done:!1,value:{edge:o.key,attributes:o.attributes,source:o.source.key,target:o.target.key,sourceAttributes:o.source.attributes,targetAttributes:o.target.attributes,undirected:o.undirected}})}}}function GA(n,e){if(n.size===0)return[];if(e==="mixed"||e===n.type)return Array.from(n._edges.keys());const o=e==="undirected"?n.undirectedSize:n.directedSize,r=new Array(o),l=e==="undirected",c=n._edges.values();let d=0,p,m;for(;p=c.next(),p.done!==!0;)m=p.value,m.undirected===l&&(r[d++]=m.key);return r}function ab(n,e,o,r){if(e.size===0)return;const l=o!=="mixed"&&o!==e.type,c=o==="undirected";let d,p,m=!1;const h=e._edges.values();for(;d=h.next(),d.done!==!0;){if(p=d.value,l&&p.undirected!==c)continue;const{key:g,attributes:y,source:v,target:w}=p;if(m=r(g,y,v.key,w.key,v.attributes,w.attributes,p.undirected),n&&m)return g}}function BA(n,e){if(n.size===0)return rs();const o=e!=="mixed"&&e!==n.type,r=e==="undirected",l=n._edges.values();return{[Symbol.iterator](){return this},next(){let c,d;for(;;){if(c=l.next(),c.done)return c;if(d=c.value,!(o&&d.undirected!==r))break}return{value:{edge:d.key,attributes:d.attributes,source:d.source.key,target:d.target.key,sourceAttributes:d.source.attributes,targetAttributes:d.target.attributes,undirected:d.undirected},done:!1}}}}function Ap(n,e,o,r,l,c){const d=e?jA:RA;let p;if(o!=="undirected"&&(r!=="out"&&(p=d(n,l.in,c),n&&p)||r!=="in"&&(p=d(n,l.out,c,r?void 0:l.key),n&&p))||o!=="directed"&&(p=d(n,l.undirected,c),n&&p))return p}function HA(n,e,o,r){const l=[];return Ap(!1,n,e,o,r,function(c){l.push(c)}),l}function $A(n,e,o){let r=rs();return n!=="undirected"&&(e!=="out"&&typeof o.in<"u"&&(r=ko(r,Eh(o.in))),e!=="in"&&typeof o.out<"u"&&(r=ko(r,Eh(o.out,e?void 0:o.key)))),n!=="directed"&&typeof o.undirected<"u"&&(r=ko(r,Eh(o.undirected))),r}function _p(n,e,o,r,l,c,d){const p=o?UA:LA;let m;if(e!=="undirected"&&(typeof l.in<"u"&&r!=="out"&&(m=p(n,l.in,c,d),n&&m)||typeof l.out<"u"&&r!=="in"&&(r||l.key!==c)&&(m=p(n,l.out,c,d),n&&m))||e!=="directed"&&typeof l.undirected<"u"&&(m=p(n,l.undirected,c,d),n&&m))return m}function YA(n,e,o,r,l){const c=[];return _p(!1,n,e,o,r,l,function(d){c.push(d)}),c}function qA(n,e,o,r){let l=rs();return n!=="undirected"&&(typeof o.in<"u"&&e!=="out"&&r in o.in&&(l=ko(l,Nh(o.in,r))),typeof o.out<"u"&&e!=="in"&&r in o.out&&(e||o.key!==r)&&(l=ko(l,Nh(o.out,r)))),n!=="directed"&&typeof o.undirected<"u"&&r in o.undirected&&(l=ko(l,Nh(o.undirected,r))),l}function VA(n,e){const{name:o,type:r,direction:l}=e;n.prototype[o]=function(c,d){if(r!=="mixed"&&this.type!=="mixed"&&r!==this.type)return[];if(!arguments.length)return GA(this,r);if(arguments.length===1){c=""+c;const p=this._nodes.get(c);if(typeof p>"u")throw new pe(`Graph.${o}: could not find the "${c}" node in the graph.`);return HA(this.multi,r==="mixed"?this.type:r,l,p)}if(arguments.length===2){c=""+c,d=""+d;const p=this._nodes.get(c);if(!p)throw new pe(`Graph.${o}: could not find the "${c}" source node in the graph.`);if(!this._nodes.has(d))throw new pe(`Graph.${o}: could not find the "${d}" target node in the graph.`);return YA(r,this.multi,l,p,d)}throw new ye(`Graph.${o}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function XA(n,e){const{name:o,type:r,direction:l}=e,c="forEach"+o[0].toUpperCase()+o.slice(1,-1);n.prototype[c]=function(h,g,y){if(!(r!=="mixed"&&this.type!=="mixed"&&r!==this.type)){if(arguments.length===1)return y=h,ab(!1,this,r,y);if(arguments.length===2){h=""+h,y=g;const v=this._nodes.get(h);if(typeof v>"u")throw new pe(`Graph.${c}: could not find the "${h}" node in the graph.`);return Ap(!1,this.multi,r==="mixed"?this.type:r,l,v,y)}if(arguments.length===3){h=""+h,g=""+g;const v=this._nodes.get(h);if(!v)throw new pe(`Graph.${c}: could not find the "${h}" source node in the graph.`);if(!this._nodes.has(g))throw new pe(`Graph.${c}: could not find the "${g}" target node in the graph.`);return _p(!1,r,this.multi,l,v,g,y)}throw new ye(`Graph.${c}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)}};const d="map"+o[0].toUpperCase()+o.slice(1);n.prototype[d]=function(){const h=Array.prototype.slice.call(arguments),g=h.pop();let y;if(h.length===0){let v=0;r!=="directed"&&(v+=this.undirectedSize),r!=="undirected"&&(v+=this.directedSize),y=new Array(v);let w=0;h.push((S,A,x,E,D,R,_)=>{y[w++]=g(S,A,x,E,D,R,_)})}else y=[],h.push((v,w,S,A,x,E,D)=>{y.push(g(v,w,S,A,x,E,D))});return this[c].apply(this,h),y};const p="filter"+o[0].toUpperCase()+o.slice(1);n.prototype[p]=function(){const h=Array.prototype.slice.call(arguments),g=h.pop(),y=[];return h.push((v,w,S,A,x,E,D)=>{g(v,w,S,A,x,E,D)&&y.push(v)}),this[c].apply(this,h),y};const m="reduce"+o[0].toUpperCase()+o.slice(1);n.prototype[m]=function(){let h=Array.prototype.slice.call(arguments);if(h.length<2||h.length>4)throw new ye(`Graph.${m}: invalid number of arguments (expecting 2, 3 or 4 and got ${h.length}).`);if(typeof h[h.length-1]=="function"&&typeof h[h.length-2]!="function")throw new ye(`Graph.${m}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let g,y;h.length===2?(g=h[0],y=h[1],h=[]):h.length===3?(g=h[1],y=h[2],h=[h[0]]):h.length===4&&(g=h[2],y=h[3],h=[h[0],h[1]]);let v=y;return h.push((w,S,A,x,E,D,R)=>{v=g(v,w,S,A,x,E,D,R)}),this[c].apply(this,h),v}}function KA(n,e){const{name:o,type:r,direction:l}=e,c="find"+o[0].toUpperCase()+o.slice(1,-1);n.prototype[c]=function(m,h,g){if(r!=="mixed"&&this.type!=="mixed"&&r!==this.type)return!1;if(arguments.length===1)return g=m,ab(!0,this,r,g);if(arguments.length===2){m=""+m,g=h;const y=this._nodes.get(m);if(typeof y>"u")throw new pe(`Graph.${c}: could not find the "${m}" node in the graph.`);return Ap(!0,this.multi,r==="mixed"?this.type:r,l,y,g)}if(arguments.length===3){m=""+m,h=""+h;const y=this._nodes.get(m);if(!y)throw new pe(`Graph.${c}: could not find the "${m}" source node in the graph.`);if(!this._nodes.has(h))throw new pe(`Graph.${c}: could not find the "${h}" target node in the graph.`);return _p(!0,r,this.multi,l,y,h,g)}throw new ye(`Graph.${c}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`)};const d="some"+o[0].toUpperCase()+o.slice(1,-1);n.prototype[d]=function(){const m=Array.prototype.slice.call(arguments),h=m.pop();return m.push((y,v,w,S,A,x,E)=>h(y,v,w,S,A,x,E)),!!this[c].apply(this,m)};const p="every"+o[0].toUpperCase()+o.slice(1,-1);n.prototype[p]=function(){const m=Array.prototype.slice.call(arguments),h=m.pop();return m.push((y,v,w,S,A,x,E)=>!h(y,v,w,S,A,x,E)),!this[c].apply(this,m)}}function QA(n,e){const{name:o,type:r,direction:l}=e,c=o.slice(0,-1)+"Entries";n.prototype[c]=function(d,p){if(r!=="mixed"&&this.type!=="mixed"&&r!==this.type)return rs();if(!arguments.length)return BA(this,r);if(arguments.length===1){d=""+d;const m=this._nodes.get(d);if(!m)throw new pe(`Graph.${c}: could not find the "${d}" node in the graph.`);return $A(r,l,m)}if(arguments.length===2){d=""+d,p=""+p;const m=this._nodes.get(d);if(!m)throw new pe(`Graph.${c}: could not find the "${d}" source node in the graph.`);if(!this._nodes.has(p))throw new pe(`Graph.${c}: could not find the "${p}" target node in the graph.`);return qA(r,l,m,p)}throw new ye(`Graph.${c}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`)}}function ZA(n){OA.forEach(e=>{VA(n,e),XA(n,e),KA(n,e),QA(n,e)})}const IA=[{name:"neighbors",type:"mixed"},{name:"inNeighbors",type:"directed",direction:"in"},{name:"outNeighbors",type:"directed",direction:"out"},{name:"inboundNeighbors",type:"mixed",direction:"in"},{name:"outboundNeighbors",type:"mixed",direction:"out"},{name:"directedNeighbors",type:"directed"},{name:"undirectedNeighbors",type:"undirected"}];function Uu(){this.A=null,this.B=null}Uu.prototype.wrap=function(n){this.A===null?this.A=n:this.B===null&&(this.B=n)};Uu.prototype.has=function(n){return this.A!==null&&n in this.A||this.B!==null&&n in this.B};function ol(n,e,o,r,l){for(const c in r){const d=r[c],p=d.source,m=d.target,h=p===o?m:p;if(e&&e.has(h.key))continue;const g=l(h.key,h.attributes);if(n&&g)return h.key}}function Cp(n,e,o,r,l){if(e!=="mixed"){if(e==="undirected")return ol(n,null,r,r.undirected,l);if(typeof o=="string")return ol(n,null,r,r[o],l)}const c=new Uu;let d;if(e!=="undirected"){if(o!=="out"){if(d=ol(n,null,r,r.in,l),n&&d)return d;c.wrap(r.in)}if(o!=="in"){if(d=ol(n,c,r,r.out,l),n&&d)return d;c.wrap(r.out)}}if(e!=="directed"&&(d=ol(n,c,r,r.undirected,l),n&&d))return d}function FA(n,e,o){if(n!=="mixed"){if(n==="undirected")return Object.keys(o.undirected);if(typeof e=="string")return Object.keys(o[e])}const r=[];return Cp(!1,n,e,o,function(l){r.push(l)}),r}function rl(n,e,o){const r=Object.keys(o),l=r.length;let c=0;return{[Symbol.iterator](){return this},next(){let d=null;do{if(c>=l)return n&&n.wrap(o),{done:!0};const p=o[r[c++]],m=p.source,h=p.target;if(d=m===e?h:m,n&&n.has(d.key)){d=null;continue}}while(d===null);return{done:!1,value:{neighbor:d.key,attributes:d.attributes}}}}}function PA(n,e,o){if(n!=="mixed"){if(n==="undirected")return rl(null,o,o.undirected);if(typeof e=="string")return rl(null,o,o[e])}let r=rs();const l=new Uu;return n!=="undirected"&&(e!=="out"&&(r=ko(r,rl(l,o,o.in))),e!=="in"&&(r=ko(r,rl(l,o,o.out)))),n!=="directed"&&(r=ko(r,rl(l,o,o.undirected))),r}function JA(n,e){const{name:o,type:r,direction:l}=e;n.prototype[o]=function(c){if(r!=="mixed"&&this.type!=="mixed"&&r!==this.type)return[];c=""+c;const d=this._nodes.get(c);if(typeof d>"u")throw new pe(`Graph.${o}: could not find the "${c}" node in the graph.`);return FA(r==="mixed"?this.type:r,l,d)}}function WA(n,e){const{name:o,type:r,direction:l}=e,c="forEach"+o[0].toUpperCase()+o.slice(1,-1);n.prototype[c]=function(h,g){if(r!=="mixed"&&this.type!=="mixed"&&r!==this.type)return;h=""+h;const y=this._nodes.get(h);if(typeof y>"u")throw new pe(`Graph.${c}: could not find the "${h}" node in the graph.`);Cp(!1,r==="mixed"?this.type:r,l,y,g)};const d="map"+o[0].toUpperCase()+o.slice(1);n.prototype[d]=function(h,g){const y=[];return this[c](h,(v,w)=>{y.push(g(v,w))}),y};const p="filter"+o[0].toUpperCase()+o.slice(1);n.prototype[p]=function(h,g){const y=[];return this[c](h,(v,w)=>{g(v,w)&&y.push(v)}),y};const m="reduce"+o[0].toUpperCase()+o.slice(1);n.prototype[m]=function(h,g,y){if(arguments.length<3)throw new ye(`Graph.${m}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`);let v=y;return this[c](h,(w,S)=>{v=g(v,w,S)}),v}}function e3(n,e){const{name:o,type:r,direction:l}=e,c=o[0].toUpperCase()+o.slice(1,-1),d="find"+c;n.prototype[d]=function(h,g){if(r!=="mixed"&&this.type!=="mixed"&&r!==this.type)return;h=""+h;const y=this._nodes.get(h);if(typeof y>"u")throw new pe(`Graph.${d}: could not find the "${h}" node in the graph.`);return Cp(!0,r==="mixed"?this.type:r,l,y,g)};const p="some"+c;n.prototype[p]=function(h,g){return!!this[d](h,g)};const m="every"+c;n.prototype[m]=function(h,g){return!this[d](h,(v,w)=>!g(v,w))}}function t3(n,e){const{name:o,type:r,direction:l}=e,c=o.slice(0,-1)+"Entries";n.prototype[c]=function(d){if(r!=="mixed"&&this.type!=="mixed"&&r!==this.type)return rs();d=""+d;const p=this._nodes.get(d);if(typeof p>"u")throw new pe(`Graph.${c}: could not find the "${d}" node in the graph.`);return PA(r==="mixed"?this.type:r,l,p)}}function n3(n){IA.forEach(e=>{JA(n,e),WA(n,e),e3(n,e),t3(n,e)})}function eu(n,e,o,r,l){const c=r._nodes.values(),d=r.type;let p,m,h,g,y,v;for(;p=c.next(),p.done!==!0;){let w=!1;if(m=p.value,d!=="undirected"){g=m.out;for(h in g){y=g[h];do v=y.target,w=!0,l(m.key,v.key,m.attributes,v.attributes,y.key,y.attributes,y.undirected),y=y.next;while(y)}}if(d!=="directed"){g=m.undirected;for(h in g)if(!(e&&m.key>h)){y=g[h];do v=y.target,v.key!==h&&(v=y.source),w=!0,l(m.key,v.key,m.attributes,v.attributes,y.key,y.attributes,y.undirected),y=y.next;while(y)}}o&&!w&&l(m.key,null,m.attributes,null,null,null,null)}}function i3(n,e){const o={key:n};return W1(e.attributes)||(o.attributes=tn({},e.attributes)),o}function o3(n,e,o){const r={key:e,source:o.source.key,target:o.target.key};return W1(o.attributes)||(r.attributes=tn({},o.attributes)),n==="mixed"&&o.undirected&&(r.undirected=!0),r}function r3(n){if(!bn(n))throw new ye('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a "key" property.');if(!("key"in n))throw new ye("Graph.import: serialized node is missing its key.");if("attributes"in n&&(!bn(n.attributes)||n.attributes===null))throw new ye("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.")}function a3(n){if(!bn(n))throw new ye('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a "source" & "target" property.');if(!("source"in n))throw new ye("Graph.import: serialized edge is missing its source.");if(!("target"in n))throw new ye("Graph.import: serialized edge is missing its target.");if("attributes"in n&&(!bn(n.attributes)||n.attributes===null))throw new ye("Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.");if("undirected"in n&&typeof n.undirected!="boolean")throw new ye("Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.")}const s3=cA(),l3=new Set(["directed","undirected","mixed"]),Rv=new Set(["domain","_events","_eventsCount","_maxListeners"]),c3=[{name:n=>`${n}Edge`,generateKey:!0},{name:n=>`${n}DirectedEdge`,generateKey:!0,type:"directed"},{name:n=>`${n}UndirectedEdge`,generateKey:!0,type:"undirected"},{name:n=>`${n}EdgeWithKey`},{name:n=>`${n}DirectedEdgeWithKey`,type:"directed"},{name:n=>`${n}UndirectedEdgeWithKey`,type:"undirected"}],u3={allowSelfLoops:!0,multi:!1,type:"mixed"};function d3(n,e,o){if(o&&!bn(o))throw new ye(`Graph.addNode: invalid attributes. Expecting an object but got "${o}"`);if(e=""+e,o=o||{},n._nodes.has(e))throw new Me(`Graph.addNode: the "${e}" node already exist in the graph.`);const r=new n.NodeDataClass(e,o);return n._nodes.set(e,r),n.emit("nodeAdded",{key:e,attributes:o}),r}function jv(n,e,o){const r=new n.NodeDataClass(e,o);return n._nodes.set(e,r),n.emit("nodeAdded",{key:e,attributes:o}),r}function sb(n,e,o,r,l,c,d,p){if(!r&&n.type==="undirected")throw new Me(`Graph.${e}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`);if(r&&n.type==="directed")throw new Me(`Graph.${e}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`);if(p&&!bn(p))throw new ye(`Graph.${e}: invalid attributes. Expecting an object but got "${p}"`);if(c=""+c,d=""+d,p=p||{},!n.allowSelfLoops&&c===d)throw new Me(`Graph.${e}: source & target are the same ("${c}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);const m=n._nodes.get(c),h=n._nodes.get(d);if(!m)throw new pe(`Graph.${e}: source node "${c}" not found.`);if(!h)throw new pe(`Graph.${e}: target node "${d}" not found.`);const g={key:null,undirected:r,source:c,target:d,attributes:p};if(o)l=n._edgeKeyGenerator();else if(l=""+l,n._edges.has(l))throw new Me(`Graph.${e}: the "${l}" edge already exists in the graph.`);if(!n.multi&&(r?typeof m.undirected[d]<"u":typeof m.out[d]<"u"))throw new Me(`Graph.${e}: an edge linking "${c}" to "${d}" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`);const y=new as(r,l,m,h,p);n._edges.set(l,y);const v=c===d;return r?(m.undirectedDegree++,h.undirectedDegree++,v&&(m.undirectedLoops++,n._undirectedSelfLoopCount++)):(m.outDegree++,h.inDegree++,v&&(m.directedLoops++,n._directedSelfLoopCount++)),n.multi?y.attachMulti():y.attach(),r?n._undirectedSize++:n._directedSize++,g.key=l,n.emit("edgeAdded",g),l}function f3(n,e,o,r,l,c,d,p,m){if(!r&&n.type==="undirected")throw new Me(`Graph.${e}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`);if(r&&n.type==="directed")throw new Me(`Graph.${e}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`);if(p){if(m){if(typeof p!="function")throw new ye(`Graph.${e}: invalid updater function. Expecting a function but got "${p}"`)}else if(!bn(p))throw new ye(`Graph.${e}: invalid attributes. Expecting an object but got "${p}"`)}c=""+c,d=""+d;let h;if(m&&(h=p,p=void 0),!n.allowSelfLoops&&c===d)throw new Me(`Graph.${e}: source & target are the same ("${c}"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`);let g=n._nodes.get(c),y=n._nodes.get(d),v,w;if(!o&&(v=n._edges.get(l),v)){if((v.source.key!==c||v.target.key!==d)&&(!r||v.source.key!==d||v.target.key!==c))throw new Me(`Graph.${e}: inconsistency detected when attempting to merge the "${l}" edge with "${c}" source & "${d}" target vs. ("${v.source.key}", "${v.target.key}").`);w=v}if(!w&&!n.multi&&g&&(w=r?g.undirected[d]:g.out[d]),w){const D=[w.key,!1,!1,!1];if(m?!h:!p)return D;if(m){const R=w.attributes;w.attributes=h(R),n.emit("edgeAttributesUpdated",{type:"replace",key:w.key,attributes:w.attributes})}else tn(w.attributes,p),n.emit("edgeAttributesUpdated",{type:"merge",key:w.key,attributes:w.attributes,data:p});return D}p=p||{},m&&h&&(p=h(p));const S={key:null,undirected:r,source:c,target:d,attributes:p};if(o)l=n._edgeKeyGenerator();else if(l=""+l,n._edges.has(l))throw new Me(`Graph.${e}: the "${l}" edge already exists in the graph.`);let A=!1,x=!1;g||(g=jv(n,c,{}),A=!0,c===d&&(y=g,x=!0)),y||(y=jv(n,d,{}),x=!0),v=new as(r,l,g,y,p),n._edges.set(l,v);const E=c===d;return r?(g.undirectedDegree++,y.undirectedDegree++,E&&(g.undirectedLoops++,n._undirectedSelfLoopCount++)):(g.outDegree++,y.inDegree++,E&&(g.directedLoops++,n._directedSelfLoopCount++)),n.multi?v.attachMulti():v.attach(),r?n._undirectedSize++:n._directedSize++,S.key=l,n.emit("edgeAdded",S),[l,!0,A,x]}function Ga(n,e){n._edges.delete(e.key);const{source:o,target:r,attributes:l}=e,c=e.undirected,d=o===r;c?(o.undirectedDegree--,r.undirectedDegree--,d&&(o.undirectedLoops--,n._undirectedSelfLoopCount--)):(o.outDegree--,r.inDegree--,d&&(o.directedLoops--,n._directedSelfLoopCount--)),n.multi?e.detachMulti():e.detach(),c?n._undirectedSize--:n._directedSize--,n.emit("edgeDropped",{key:e.key,attributes:l,source:o.key,target:r.key,undirected:c})}class We extends sA.EventEmitter{constructor(e){if(super(),e=tn({},u3,e),typeof e.multi!="boolean")throw new ye(`Graph.constructor: invalid 'multi' option. Expecting a boolean but got "${e.multi}".`);if(!l3.has(e.type))throw new ye(`Graph.constructor: invalid 'type' option. Should be one of "mixed", "directed" or "undirected" but got "${e.type}".`);if(typeof e.allowSelfLoops!="boolean")throw new ye(`Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got "${e.allowSelfLoops}".`);const o=e.type==="mixed"?eb:e.type==="directed"?tb:nb;bi(this,"NodeDataClass",o);const r="geid_"+s3()+"_";let l=0;const c=()=>{let d;do d=r+l++;while(this._edges.has(d));return d};bi(this,"_attributes",{}),bi(this,"_nodes",new Map),bi(this,"_edges",new Map),bi(this,"_directedSize",0),bi(this,"_undirectedSize",0),bi(this,"_directedSelfLoopCount",0),bi(this,"_undirectedSelfLoopCount",0),bi(this,"_edgeKeyGenerator",c),bi(this,"_options",e),Rv.forEach(d=>bi(this,d,this[d])),Mi(this,"order",()=>this._nodes.size),Mi(this,"size",()=>this._edges.size),Mi(this,"directedSize",()=>this._directedSize),Mi(this,"undirectedSize",()=>this._undirectedSize),Mi(this,"selfLoopCount",()=>this._directedSelfLoopCount+this._undirectedSelfLoopCount),Mi(this,"directedSelfLoopCount",()=>this._directedSelfLoopCount),Mi(this,"undirectedSelfLoopCount",()=>this._undirectedSelfLoopCount),Mi(this,"multi",this._options.multi),Mi(this,"type",this._options.type),Mi(this,"allowSelfLoops",this._options.allowSelfLoops),Mi(this,"implementation",()=>"graphology")}_resetInstanceCounters(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0}hasNode(e){return this._nodes.has(""+e)}hasDirectedEdge(e,o){if(this.type==="undirected")return!1;if(arguments.length===1){const r=""+e,l=this._edges.get(r);return!!l&&!l.undirected}else if(arguments.length===2){e=""+e,o=""+o;const r=this._nodes.get(e);return r?r.out.hasOwnProperty(o):!1}throw new ye(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasUndirectedEdge(e,o){if(this.type==="directed")return!1;if(arguments.length===1){const r=""+e,l=this._edges.get(r);return!!l&&l.undirected}else if(arguments.length===2){e=""+e,o=""+o;const r=this._nodes.get(e);return r?r.undirected.hasOwnProperty(o):!1}throw new ye(`Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}hasEdge(e,o){if(arguments.length===1){const r=""+e;return this._edges.has(r)}else if(arguments.length===2){e=""+e,o=""+o;const r=this._nodes.get(e);return r?typeof r.out<"u"&&r.out.hasOwnProperty(o)||typeof r.undirected<"u"&&r.undirected.hasOwnProperty(o):!1}throw new ye(`Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`)}directedEdge(e,o){if(this.type==="undirected")return;if(e=""+e,o=""+o,this.multi)throw new Me("Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.");const r=this._nodes.get(e);if(!r)throw new pe(`Graph.directedEdge: could not find the "${e}" source node in the graph.`);if(!this._nodes.has(o))throw new pe(`Graph.directedEdge: could not find the "${o}" target node in the graph.`);const l=r.out&&r.out[o]||void 0;if(l)return l.key}undirectedEdge(e,o){if(this.type==="directed")return;if(e=""+e,o=""+o,this.multi)throw new Me("Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.");const r=this._nodes.get(e);if(!r)throw new pe(`Graph.undirectedEdge: could not find the "${e}" source node in the graph.`);if(!this._nodes.has(o))throw new pe(`Graph.undirectedEdge: could not find the "${o}" target node in the graph.`);const l=r.undirected&&r.undirected[o]||void 0;if(l)return l.key}edge(e,o){if(this.multi)throw new Me("Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.");e=""+e,o=""+o;const r=this._nodes.get(e);if(!r)throw new pe(`Graph.edge: could not find the "${e}" source node in the graph.`);if(!this._nodes.has(o))throw new pe(`Graph.edge: could not find the "${o}" target node in the graph.`);const l=r.out&&r.out[o]||r.undirected&&r.undirected[o]||void 0;if(l)return l.key}areDirectedNeighbors(e,o){e=""+e,o=""+o;const r=this._nodes.get(e);if(!r)throw new pe(`Graph.areDirectedNeighbors: could not find the "${e}" node in the graph.`);return this.type==="undirected"?!1:o in r.in||o in r.out}areOutNeighbors(e,o){e=""+e,o=""+o;const r=this._nodes.get(e);if(!r)throw new pe(`Graph.areOutNeighbors: could not find the "${e}" node in the graph.`);return this.type==="undirected"?!1:o in r.out}areInNeighbors(e,o){e=""+e,o=""+o;const r=this._nodes.get(e);if(!r)throw new pe(`Graph.areInNeighbors: could not find the "${e}" node in the graph.`);return this.type==="undirected"?!1:o in r.in}areUndirectedNeighbors(e,o){e=""+e,o=""+o;const r=this._nodes.get(e);if(!r)throw new pe(`Graph.areUndirectedNeighbors: could not find the "${e}" node in the graph.`);return this.type==="directed"?!1:o in r.undirected}areNeighbors(e,o){e=""+e,o=""+o;const r=this._nodes.get(e);if(!r)throw new pe(`Graph.areNeighbors: could not find the "${e}" node in the graph.`);return this.type!=="undirected"&&(o in r.in||o in r.out)||this.type!=="directed"&&o in r.undirected}areInboundNeighbors(e,o){e=""+e,o=""+o;const r=this._nodes.get(e);if(!r)throw new pe(`Graph.areInboundNeighbors: could not find the "${e}" node in the graph.`);return this.type!=="undirected"&&o in r.in||this.type!=="directed"&&o in r.undirected}areOutboundNeighbors(e,o){e=""+e,o=""+o;const r=this._nodes.get(e);if(!r)throw new pe(`Graph.areOutboundNeighbors: could not find the "${e}" node in the graph.`);return this.type!=="undirected"&&o in r.out||this.type!=="directed"&&o in r.undirected}inDegree(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.inDegree: could not find the "${e}" node in the graph.`);return this.type==="undirected"?0:o.inDegree}outDegree(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.outDegree: could not find the "${e}" node in the graph.`);return this.type==="undirected"?0:o.outDegree}directedDegree(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.directedDegree: could not find the "${e}" node in the graph.`);return this.type==="undirected"?0:o.inDegree+o.outDegree}undirectedDegree(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.undirectedDegree: could not find the "${e}" node in the graph.`);return this.type==="directed"?0:o.undirectedDegree}inboundDegree(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.inboundDegree: could not find the "${e}" node in the graph.`);let r=0;return this.type!=="directed"&&(r+=o.undirectedDegree),this.type!=="undirected"&&(r+=o.inDegree),r}outboundDegree(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.outboundDegree: could not find the "${e}" node in the graph.`);let r=0;return this.type!=="directed"&&(r+=o.undirectedDegree),this.type!=="undirected"&&(r+=o.outDegree),r}degree(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.degree: could not find the "${e}" node in the graph.`);let r=0;return this.type!=="directed"&&(r+=o.undirectedDegree),this.type!=="undirected"&&(r+=o.inDegree+o.outDegree),r}inDegreeWithoutSelfLoops(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.inDegreeWithoutSelfLoops: could not find the "${e}" node in the graph.`);return this.type==="undirected"?0:o.inDegree-o.directedLoops}outDegreeWithoutSelfLoops(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.outDegreeWithoutSelfLoops: could not find the "${e}" node in the graph.`);return this.type==="undirected"?0:o.outDegree-o.directedLoops}directedDegreeWithoutSelfLoops(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.directedDegreeWithoutSelfLoops: could not find the "${e}" node in the graph.`);return this.type==="undirected"?0:o.inDegree+o.outDegree-o.directedLoops*2}undirectedDegreeWithoutSelfLoops(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.undirectedDegreeWithoutSelfLoops: could not find the "${e}" node in the graph.`);return this.type==="directed"?0:o.undirectedDegree-o.undirectedLoops*2}inboundDegreeWithoutSelfLoops(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.inboundDegreeWithoutSelfLoops: could not find the "${e}" node in the graph.`);let r=0,l=0;return this.type!=="directed"&&(r+=o.undirectedDegree,l+=o.undirectedLoops*2),this.type!=="undirected"&&(r+=o.inDegree,l+=o.directedLoops),r-l}outboundDegreeWithoutSelfLoops(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.outboundDegreeWithoutSelfLoops: could not find the "${e}" node in the graph.`);let r=0,l=0;return this.type!=="directed"&&(r+=o.undirectedDegree,l+=o.undirectedLoops*2),this.type!=="undirected"&&(r+=o.outDegree,l+=o.directedLoops),r-l}degreeWithoutSelfLoops(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.degreeWithoutSelfLoops: could not find the "${e}" node in the graph.`);let r=0,l=0;return this.type!=="directed"&&(r+=o.undirectedDegree,l+=o.undirectedLoops*2),this.type!=="undirected"&&(r+=o.inDegree+o.outDegree,l+=o.directedLoops*2),r-l}source(e){e=""+e;const o=this._edges.get(e);if(!o)throw new pe(`Graph.source: could not find the "${e}" edge in the graph.`);return o.source.key}target(e){e=""+e;const o=this._edges.get(e);if(!o)throw new pe(`Graph.target: could not find the "${e}" edge in the graph.`);return o.target.key}extremities(e){e=""+e;const o=this._edges.get(e);if(!o)throw new pe(`Graph.extremities: could not find the "${e}" edge in the graph.`);return[o.source.key,o.target.key]}opposite(e,o){e=""+e,o=""+o;const r=this._edges.get(o);if(!r)throw new pe(`Graph.opposite: could not find the "${o}" edge in the graph.`);const l=r.source.key,c=r.target.key;if(e===l)return c;if(e===c)return l;throw new pe(`Graph.opposite: the "${e}" node is not attached to the "${o}" edge (${l}, ${c}).`)}hasExtremity(e,o){e=""+e,o=""+o;const r=this._edges.get(e);if(!r)throw new pe(`Graph.hasExtremity: could not find the "${e}" edge in the graph.`);return r.source.key===o||r.target.key===o}isUndirected(e){e=""+e;const o=this._edges.get(e);if(!o)throw new pe(`Graph.isUndirected: could not find the "${e}" edge in the graph.`);return o.undirected}isDirected(e){e=""+e;const o=this._edges.get(e);if(!o)throw new pe(`Graph.isDirected: could not find the "${e}" edge in the graph.`);return!o.undirected}isSelfLoop(e){e=""+e;const o=this._edges.get(e);if(!o)throw new pe(`Graph.isSelfLoop: could not find the "${e}" edge in the graph.`);return o.source===o.target}addNode(e,o){return d3(this,e,o).key}mergeNode(e,o){if(o&&!bn(o))throw new ye(`Graph.mergeNode: invalid attributes. Expecting an object but got "${o}"`);e=""+e,o=o||{};let r=this._nodes.get(e);return r?(o&&(tn(r.attributes,o),this.emit("nodeAttributesUpdated",{type:"merge",key:e,attributes:r.attributes,data:o})),[e,!1]):(r=new this.NodeDataClass(e,o),this._nodes.set(e,r),this.emit("nodeAdded",{key:e,attributes:o}),[e,!0])}updateNode(e,o){if(o&&typeof o!="function")throw new ye(`Graph.updateNode: invalid updater function. Expecting a function but got "${o}"`);e=""+e;let r=this._nodes.get(e);if(r){if(o){const c=r.attributes;r.attributes=o(c),this.emit("nodeAttributesUpdated",{type:"replace",key:e,attributes:r.attributes})}return[e,!1]}const l=o?o({}):{};return r=new this.NodeDataClass(e,l),this._nodes.set(e,r),this.emit("nodeAdded",{key:e,attributes:l}),[e,!0]}dropNode(e){e=""+e;const o=this._nodes.get(e);if(!o)throw new pe(`Graph.dropNode: could not find the "${e}" node in the graph.`);let r;if(this.type!=="undirected"){for(const l in o.out){r=o.out[l];do Ga(this,r),r=r.next;while(r)}for(const l in o.in){r=o.in[l];do Ga(this,r),r=r.next;while(r)}}if(this.type!=="directed")for(const l in o.undirected){r=o.undirected[l];do Ga(this,r),r=r.next;while(r)}this._nodes.delete(e),this.emit("nodeDropped",{key:e,attributes:o.attributes})}dropEdge(e){let o;if(arguments.length>1){const r=""+arguments[0],l=""+arguments[1];if(o=_i(this,r,l,this.type),!o)throw new pe(`Graph.dropEdge: could not find the "${r}" -> "${l}" edge in the graph.`)}else if(e=""+e,o=this._edges.get(e),!o)throw new pe(`Graph.dropEdge: could not find the "${e}" edge in the graph.`);return Ga(this,o),this}dropDirectedEdge(e,o){if(arguments.length<2)throw new Me("Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new Me("Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");e=""+e,o=""+o;const r=_i(this,e,o,"directed");if(!r)throw new pe(`Graph.dropDirectedEdge: could not find a "${e}" -> "${o}" edge in the graph.`);return Ga(this,r),this}dropUndirectedEdge(e,o){if(arguments.length<2)throw new Me("Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.");if(this.multi)throw new Me("Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.");const r=_i(this,e,o,"undirected");if(!r)throw new pe(`Graph.dropUndirectedEdge: could not find a "${e}" -> "${o}" edge in the graph.`);return Ga(this,r),this}clear(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit("cleared")}clearEdges(){const e=this._nodes.values();let o;for(;o=e.next(),o.done!==!0;)o.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit("edgesCleared")}getAttribute(e){return this._attributes[e]}getAttributes(){return this._attributes}hasAttribute(e){return this._attributes.hasOwnProperty(e)}setAttribute(e,o){return this._attributes[e]=o,this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:e}),this}updateAttribute(e,o){if(typeof o!="function")throw new ye("Graph.updateAttribute: updater should be a function.");const r=this._attributes[e];return this._attributes[e]=o(r),this.emit("attributesUpdated",{type:"set",attributes:this._attributes,name:e}),this}removeAttribute(e){return delete this._attributes[e],this.emit("attributesUpdated",{type:"remove",attributes:this._attributes,name:e}),this}replaceAttributes(e){if(!bn(e))throw new ye("Graph.replaceAttributes: provided attributes are not a plain object.");return this._attributes=e,this.emit("attributesUpdated",{type:"replace",attributes:this._attributes}),this}mergeAttributes(e){if(!bn(e))throw new ye("Graph.mergeAttributes: provided attributes are not a plain object.");return tn(this._attributes,e),this.emit("attributesUpdated",{type:"merge",attributes:this._attributes,data:e}),this}updateAttributes(e){if(typeof e!="function")throw new ye("Graph.updateAttributes: provided updater is not a function.");return this._attributes=e(this._attributes),this.emit("attributesUpdated",{type:"update",attributes:this._attributes}),this}updateEachNodeAttributes(e,o){if(typeof e!="function")throw new ye("Graph.updateEachNodeAttributes: expecting an updater function.");if(o&&!Ov(o))throw new ye("Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const r=this._nodes.values();let l,c;for(;l=r.next(),l.done!==!0;)c=l.value,c.attributes=e(c.key,c.attributes);this.emit("eachNodeAttributesUpdated",{hints:o||null})}updateEachEdgeAttributes(e,o){if(typeof e!="function")throw new ye("Graph.updateEachEdgeAttributes: expecting an updater function.");if(o&&!Ov(o))throw new ye("Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}");const r=this._edges.values();let l,c,d,p;for(;l=r.next(),l.done!==!0;)c=l.value,d=c.source,p=c.target,c.attributes=e(c.key,c.attributes,d.key,p.key,d.attributes,p.attributes,c.undirected);this.emit("eachEdgeAttributesUpdated",{hints:o||null})}forEachAdjacencyEntry(e){if(typeof e!="function")throw new ye("Graph.forEachAdjacencyEntry: expecting a callback.");eu(!1,!1,!1,this,e)}forEachAdjacencyEntryWithOrphans(e){if(typeof e!="function")throw new ye("Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.");eu(!1,!1,!0,this,e)}forEachAssymetricAdjacencyEntry(e){if(typeof e!="function")throw new ye("Graph.forEachAssymetricAdjacencyEntry: expecting a callback.");eu(!1,!0,!1,this,e)}forEachAssymetricAdjacencyEntryWithOrphans(e){if(typeof e!="function")throw new ye("Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.");eu(!1,!0,!0,this,e)}nodes(){return Array.from(this._nodes.keys())}forEachNode(e){if(typeof e!="function")throw new ye("Graph.forEachNode: expecting a callback.");const o=this._nodes.values();let r,l;for(;r=o.next(),r.done!==!0;)l=r.value,e(l.key,l.attributes)}findNode(e){if(typeof e!="function")throw new ye("Graph.findNode: expecting a callback.");const o=this._nodes.values();let r,l;for(;r=o.next(),r.done!==!0;)if(l=r.value,e(l.key,l.attributes))return l.key}mapNodes(e){if(typeof e!="function")throw new ye("Graph.mapNode: expecting a callback.");const o=this._nodes.values();let r,l;const c=new Array(this.order);let d=0;for(;r=o.next(),r.done!==!0;)l=r.value,c[d++]=e(l.key,l.attributes);return c}someNode(e){if(typeof e!="function")throw new ye("Graph.someNode: expecting a callback.");const o=this._nodes.values();let r,l;for(;r=o.next(),r.done!==!0;)if(l=r.value,e(l.key,l.attributes))return!0;return!1}everyNode(e){if(typeof e!="function")throw new ye("Graph.everyNode: expecting a callback.");const o=this._nodes.values();let r,l;for(;r=o.next(),r.done!==!0;)if(l=r.value,!e(l.key,l.attributes))return!1;return!0}filterNodes(e){if(typeof e!="function")throw new ye("Graph.filterNodes: expecting a callback.");const o=this._nodes.values();let r,l;const c=[];for(;r=o.next(),r.done!==!0;)l=r.value,e(l.key,l.attributes)&&c.push(l.key);return c}reduceNodes(e,o){if(typeof e!="function")throw new ye("Graph.reduceNodes: expecting a callback.");if(arguments.length<2)throw new ye("Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.");let r=o;const l=this._nodes.values();let c,d;for(;c=l.next(),c.done!==!0;)d=c.value,r=e(r,d.key,d.attributes);return r}nodeEntries(){const e=this._nodes.values();return{[Symbol.iterator](){return this},next(){const o=e.next();if(o.done)return o;const r=o.value;return{value:{node:r.key,attributes:r.attributes},done:!1}}}}export(){const e=new Array(this._nodes.size);let o=0;this._nodes.forEach((l,c)=>{e[o++]=i3(c,l)});const r=new Array(this._edges.size);return o=0,this._edges.forEach((l,c)=>{r[o++]=o3(this.type,c,l)}),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:e,edges:r}}import(e,o=!1){if(e instanceof We)return e.forEachNode((m,h)=>{o?this.mergeNode(m,h):this.addNode(m,h)}),e.forEachEdge((m,h,g,y,v,w,S)=>{o?S?this.mergeUndirectedEdgeWithKey(m,g,y,h):this.mergeDirectedEdgeWithKey(m,g,y,h):S?this.addUndirectedEdgeWithKey(m,g,y,h):this.addDirectedEdgeWithKey(m,g,y,h)}),this;if(!bn(e))throw new ye("Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.");if(e.attributes){if(!bn(e.attributes))throw new ye("Graph.import: invalid attributes. Expecting a plain object.");o?this.mergeAttributes(e.attributes):this.replaceAttributes(e.attributes)}let r,l,c,d,p;if(e.nodes){if(c=e.nodes,!Array.isArray(c))throw new ye("Graph.import: invalid nodes. Expecting an array.");for(r=0,l=c.length;r{const c=tn({},r.attributes);r=new o.NodeDataClass(l,c),o._nodes.set(l,r)}),o}copy(e){if(e=e||{},typeof e.type=="string"&&e.type!==this.type&&e.type!=="mixed")throw new Me(`Graph.copy: cannot create an incompatible copy from "${this.type}" type to "${e.type}" because this would mean losing information about the current graph.`);if(typeof e.multi=="boolean"&&e.multi!==this.multi&&e.multi!==!0)throw new Me("Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.");if(typeof e.allowSelfLoops=="boolean"&&e.allowSelfLoops!==this.allowSelfLoops&&e.allowSelfLoops!==!0)throw new Me("Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.");const o=this.emptyCopy(e),r=this._edges.values();let l,c;for(;l=r.next(),l.done!==!0;)c=l.value,sb(o,"copy",!1,c.undirected,c.key,c.source.key,c.target.key,tn({},c.attributes));return o}toJSON(){return this.export()}toString(){return"[object Graph]"}inspect(){const e={};this._nodes.forEach((c,d)=>{e[d]=c.attributes});const o={},r={};this._edges.forEach((c,d)=>{const p=c.undirected?"--":"->";let m="",h=c.source.key,g=c.target.key,y;c.undirected&&h>g&&(y=h,h=g,g=y);const v=`(${h})${p}(${g})`;d.startsWith("geid_")?this.multi&&(typeof r[v]>"u"?r[v]=0:r[v]++,m+=`${r[v]}. `):m+=`[${d}]: `,m+=v,o[m]=c.attributes});const l={};for(const c in this)this.hasOwnProperty(c)&&!Rv.has(c)&&typeof this[c]!="function"&&typeof c!="symbol"&&(l[c]=this[c]);return l.attributes=this._attributes,l.nodes=e,l.edges=o,bi(l,"constructor",this.constructor),l}}typeof Symbol<"u"&&(We.prototype[Symbol.for("nodejs.util.inspect.custom")]=We.prototype.inspect);c3.forEach(n=>{["add","merge","update"].forEach(e=>{const o=n.name(e),r=e==="add"?sb:f3;n.generateKey?We.prototype[o]=function(l,c,d){return r(this,o,!0,(n.type||this.type)==="undirected",null,l,c,d,e==="update")}:We.prototype[o]=function(l,c,d,p){return r(this,o,!1,(n.type||this.type)==="undirected",l,c,d,p,e==="update")}})});xA(We);zA(We);ZA(We);n3(We);class lb extends We{constructor(e){const o=tn({type:"directed"},e);if("multi"in o&&o.multi!==!1)throw new ye("DirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(o.type!=="directed")throw new ye('DirectedGraph.from: inconsistent "'+o.type+'" type in given options!');super(o)}}class cb extends We{constructor(e){const o=tn({type:"undirected"},e);if("multi"in o&&o.multi!==!1)throw new ye("UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!");if(o.type!=="undirected")throw new ye('UndirectedGraph.from: inconsistent "'+o.type+'" type in given options!');super(o)}}class ub extends We{constructor(e){const o=tn({multi:!0},e);if("multi"in o&&o.multi!==!0)throw new ye("MultiGraph.from: inconsistent indication that the graph should be simple in given options!");super(o)}}class db extends We{constructor(e){const o=tn({type:"directed",multi:!0},e);if("multi"in o&&o.multi!==!0)throw new ye("MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(o.type!=="directed")throw new ye('MultiDirectedGraph.from: inconsistent "'+o.type+'" type in given options!');super(o)}}class fb extends We{constructor(e){const o=tn({type:"undirected",multi:!0},e);if("multi"in o&&o.multi!==!0)throw new ye("MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!");if(o.type!=="undirected")throw new ye('MultiUndirectedGraph.from: inconsistent "'+o.type+'" type in given options!');super(o)}}function ss(n){n.from=function(e,o){const r=tn({},e.options,o),l=new n(r);return l.import(e),l}}ss(We);ss(lb);ss(cb);ss(ub);ss(db);ss(fb);We.Graph=We;We.DirectedGraph=lb;We.UndirectedGraph=cb;We.MultiGraph=ub;We.MultiDirectedGraph=db;We.MultiUndirectedGraph=fb;We.InvalidArgumentsGraphError=ye;We.NotFoundGraphError=pe;We.UsageGraphError=Me;const Eo={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1};function hb(n){return"init"in n}function Fh(n){return!!n.write}function Lv(n){return"v"in n||"e"in n}function yu(n){if("e"in n)throw n.e;if((Eo?"production":void 0)!=="production"&&!("v"in n))throw new Error("[Bug] atom state is not initialized");return n.v}const vu=new WeakMap;function pb(n){var e;return bu(n)&&!!((e=vu.get(n))!=null&&e[0])}function h3(n){const e=vu.get(n);e!=null&&e[0]&&(e[0]=!1,e[1].forEach(o=>o()))}function Ph(n,e){let o=vu.get(n);if(!o){o=[!0,new Set],vu.set(n,o);const r=()=>{o[0]=!1};n.then(r,r)}o[1].add(e)}function bu(n){return typeof(n==null?void 0:n.then)=="function"}function mb(n,e,o){if(!o.p.has(n)){o.p.add(n);const r=()=>o.p.delete(n);e.then(r,r)}}function gb(n,e,o){var r;const l=new Set;for(const c of((r=o.get(n))==null?void 0:r.t)||[])l.add(c);for(const c of e.p)l.add(c);return l}const p3=(n,e,...o)=>e.read(...o),m3=(n,e,...o)=>e.write(...o),g3=(n,e)=>{if(e.INTERNAL_onInit)return e.INTERNAL_onInit(n);if(e.unstable_onInit)return console.warn("[DEPRECATED] atom.unstable_onInit is renamed to atom.INTERNAL_onInit."),e.unstable_onInit(n)},y3=(n,e,o)=>{var r;return(r=e.onMount)==null?void 0:r.call(e,o)},v3=(n,e)=>{var o;const r=kn(n),l=r[0],c=r[6],d=r[9];if((Eo?"production":void 0)!=="production"&&!e)throw new Error("Atom is undefined or null");let p=l.get(e);return p||(p={d:new Map,p:new Set,n:0},l.set(e,p),(o=c.i)==null||o.call(c,e),d==null||d(n,e)),p},b3=n=>{const e=kn(n),o=e[1],r=e[3],l=e[4],c=e[5],d=e[6],p=e[13],m=[],h=g=>{try{g()}catch(y){m.push(y)}};do{d.f&&h(d.f);const g=new Set,y=g.add.bind(g);r.forEach(v=>{var w;return(w=o.get(v))==null?void 0:w.l.forEach(y)}),r.clear(),c.forEach(y),c.clear(),l.forEach(y),l.clear(),g.forEach(h),r.size&&p(n)}while(r.size||c.size||l.size);if(m.length)throw new AggregateError(m)},w3=n=>{const e=kn(n),o=e[1],r=e[2],l=e[3],c=e[11],d=e[14],p=e[17],m=[],h=new WeakSet,g=new WeakSet,y=Array.from(l);for(;y.length;){const v=y[y.length-1],w=c(n,v);if(g.has(v)){y.pop();continue}if(h.has(v)){if(r.get(v)===w.n)m.push([v,w]);else if((Eo?"production":void 0)!=="production"&&r.has(v))throw new Error("[Bug] invalidated atom exists");g.add(v),y.pop();continue}h.add(v);for(const S of gb(v,w,o))h.has(S)||y.push(S)}for(let v=m.length-1;v>=0;--v){const[w,S]=m[v];let A=!1;for(const x of S.d.keys())if(x!==w&&l.has(x)){A=!0;break}A&&(d(n,w),p(n,w)),r.delete(w)}},Jh=new WeakSet,x3=(n,e)=>{var o,r;const l=kn(n),c=l[1],d=l[2],p=l[3],m=l[6],h=l[7],g=l[11],y=l[12],v=l[13],w=l[14],S=l[16],A=l[17],x=g(n,e);if(Lv(x)){if(c.has(e)&&d.get(e)!==x.n)return x;let M=!1;for(const[$,L]of x.d)if(w(n,$).n!==L){M=!0;break}if(!M)return x}x.d.clear();let E=!0;function D(){c.has(e)&&(A(n,e),v(n),y(n))}function R(M){var $;if(M===e){const X=g(n,M);if(!Lv(X))if(hb(M))wu(n,M,M.init);else throw new Error("no atom init");return yu(X)}const L=w(n,M);try{return yu(L)}finally{x.d.set(M,L.n),pb(x.v)&&mb(e,x.v,L),c.has(e)&&(($=c.get(M))==null||$.t.add(e)),E||D()}}let _,N;const T={get signal(){return _||(_=new AbortController),_.signal},get setSelf(){return(Eo?"production":void 0)!=="production"&&!Fh(e)&&console.warn("setSelf function cannot be used with read-only atom"),!N&&Fh(e)&&(N=(...M)=>{if((Eo?"production":void 0)!=="production"&&E&&console.warn("setSelf function cannot be called in sync"),!E)try{return S(n,e,...M)}finally{v(n),y(n)}}),N}},O=x.n;try{(Eo?"production":void 0)!=="production"&&Jh.delete(n);const M=h(n,e,R,T);return(Eo?"production":void 0)!=="production"&&Jh.has(n)&&console.warn("Detected store mutation during atom read. This is not supported."),wu(n,e,M),bu(M)&&(Ph(M,()=>_==null?void 0:_.abort()),M.then(D,D)),(o=m.r)==null||o.call(m,e),x}catch(M){return delete x.v,x.e=M,++x.n,x}finally{E=!1,O!==x.n&&d.get(e)===O&&(d.set(e,x.n),p.add(e),(r=m.c)==null||r.call(m,e))}},S3=(n,e)=>{const o=kn(n),r=o[1],l=o[2],c=o[11],d=[e];for(;d.length;){const p=d.pop(),m=c(n,p);for(const h of gb(p,m,r)){const g=c(n,h);l.set(h,g.n),d.push(h)}}},yb=(n,e,...o)=>{const r=kn(n),l=r[3],c=r[6],d=r[8],p=r[11],m=r[12],h=r[13],g=r[14],y=r[15],v=r[17];let w=!0;const S=x=>yu(g(n,x)),A=(x,...E)=>{var D;const R=p(n,x);try{if(x===e){if(!hb(x))throw new Error("atom not writable");(Eo?"production":void 0)!=="production"&&Jh.add(n);const _=R.n,N=E[0];wu(n,x,N),v(n,x),_!==R.n&&(l.add(x),y(n,x),(D=c.c)==null||D.call(c,x));return}else return yb(n,x,...E)}finally{w||(h(n),m(n))}};try{return d(n,e,S,A,...o)}finally{w=!1}},A3=(n,e)=>{var o;const r=kn(n),l=r[1],c=r[3],d=r[6],p=r[11],m=r[15],h=r[18],g=r[19],y=p(n,e),v=l.get(e);if(v&&!pb(y.v)){for(const[w,S]of y.d)if(!v.d.has(w)){const A=p(n,w);h(n,w).t.add(e),v.d.add(w),S!==A.n&&(c.add(w),m(n,w),(o=d.c)==null||o.call(d,w))}for(const w of v.d)if(!y.d.has(w)){v.d.delete(w);const S=g(n,w);S==null||S.t.delete(e)}}},vb=(n,e)=>{var o;const r=kn(n),l=r[1],c=r[4],d=r[6],p=r[10],m=r[11],h=r[12],g=r[13],y=r[14],v=r[16],w=m(n,e);let S=l.get(e);if(!S){y(n,e);for(const A of w.d.keys())vb(n,A).t.add(e);if(S={l:new Set,d:new Set(w.d.keys()),t:new Set},l.set(e,S),Fh(e)){const A=()=>{let x=!0;const E=(...D)=>{try{return v(n,e,...D)}finally{x||(g(n),h(n))}};try{const D=p(n,e,E);D&&(S.u=()=>{x=!0;try{D()}finally{x=!1}})}finally{x=!1}};c.add(A)}(o=d.m)==null||o.call(d,e)}return S},_3=(n,e)=>{var o,r;const l=kn(n),c=l[1],d=l[5],p=l[6],m=l[11],h=l[19],g=m(n,e);let y=c.get(e);if(!y||y.l.size)return y;let v=!1;for(const w of y.t)if((o=c.get(w))!=null&&o.d.has(e)){v=!0;break}if(!v){y.u&&d.add(y.u),y=void 0,c.delete(e);for(const w of g.d.keys()){const S=h(n,w);S==null||S.t.delete(e)}(r=p.u)==null||r.call(p,e);return}return y},wu=(n,e,o)=>{const r=kn(n)[11],l=r(n,e),c="v"in l,d=l.v;if(bu(o))for(const p of l.d.keys())mb(e,o,r(n,p));l.v=o,delete l.e,(!c||!Object.is(d,l.v))&&(++l.n,bu(d)&&h3(d))},C3=(n,e)=>{const o=kn(n)[14];return yu(o(n,e))},E3=(n,e,...o)=>{const r=kn(n),l=r[12],c=r[13],d=r[16];try{return d(n,e,...o)}finally{c(n),l(n)}},N3=(n,e,o)=>{const r=kn(n),l=r[12],c=r[18],d=r[19],m=c(n,e).l;return m.add(o),l(n),()=>{m.delete(o),d(n,e),l(n)}},bb=new WeakMap,kn=n=>{const e=bb.get(n);if((Eo?"production":void 0)!=="production"&&!e)throw new Error("Store must be created by buildStore to read its building blocks");return e};function k3(...n){const e={get(r){const l=kn(e)[21];return l(e,r)},set(r,...l){const c=kn(e)[22];return c(e,r,...l)},sub(r,l){const c=kn(e)[23];return c(e,r,l)}},o=[new WeakMap,new WeakMap,new WeakMap,new Set,new Set,new Set,{},p3,m3,g3,y3,v3,b3,w3,x3,S3,yb,A3,vb,_3,wu,C3,E3,N3,void 0].map((r,l)=>n[l]||r);return bb.set(e,Object.freeze(o)),e}const wb={};let T3=0;function K(n,e){const o=`atom${++T3}`,r={toString(){return(wb?"production":void 0)!=="production"&&this.debugLabel?o+":"+this.debugLabel:o}};return typeof n=="function"?r.read=n:(r.init=n,r.read=D3,r.write=M3),e&&(r.write=e),r}function D3(n){return n(this)}function M3(n,e,o){return e(this,typeof o=="function"?o(n(this)):o)}function z3(){return k3()}let al;function O3(){return al||(al=z3(),(wb?"production":void 0)!=="production"&&(globalThis.__JOTAI_DEFAULT_STORE__||(globalThis.__JOTAI_DEFAULT_STORE__=al),globalThis.__JOTAI_DEFAULT_STORE__!==al&&console.warn("Detected multiple Jotai instances. It may cause unexpected behavior with the default store. https://github.com/pmndrs/jotai/discussions/2044"))),al}const R3={},j3=ne.createContext(void 0);function Tl(n){return ne.useContext(j3)||O3()}const Wh=n=>typeof(n==null?void 0:n.then)=="function",ep=n=>{n.status||(n.status="pending",n.then(e=>{n.status="fulfilled",n.value=e},e=>{n.status="rejected",n.reason=e}))},L3=Ji.use||(n=>{if(n.status==="pending")throw n;if(n.status==="fulfilled")return n.value;throw n.status==="rejected"?n.reason:(ep(n),n)}),kh=new WeakMap,Uv=(n,e)=>{let o=kh.get(n);return o||(o=new Promise((r,l)=>{let c=n;const d=h=>g=>{c===h&&r(g)},p=h=>g=>{c===h&&l(g)},m=()=>{try{const h=e();Wh(h)?(kh.set(h,o),c=h,h.then(d(h),p(h)),Ph(h,m)):r(h)}catch(h){l(h)}};n.then(d(n),p(n)),Ph(n,m)}),kh.set(n,o)),o};function he(n,e){const{delay:o,unstable_promiseStatus:r=!Ji.use}={},l=Tl(),[[c,d,p],m]=ne.useReducer(g=>{const y=l.get(n);return Object.is(g[0],y)&&g[1]===l&&g[2]===n?g:[y,l,n]},void 0,()=>[l.get(n),l,n]);let h=c;if((d!==l||p!==n)&&(m(),h=l.get(n)),ne.useEffect(()=>{const g=l.sub(n,()=>{if(r)try{const y=l.get(n);Wh(y)&&ep(Uv(y,()=>l.get(n)))}catch{}if(typeof o=="number"){setTimeout(m,o);return}m()});return m(),g},[l,n,o,r]),ne.useDebugValue(h),Wh(h)){const g=Uv(h,()=>l.get(n));return r&&ep(g),L3(g)}return h}function ge(n,e){const o=Tl();return ne.useCallback((...l)=>{if((R3?"production":void 0)!=="production"&&!("write"in n))throw new Error("not writable atom");return o.set(n,...l)},[o,n])}function Ci(n,e){return[he(n),ge(n)]}var tu={exports:{}},Th,Gv;function U3(){if(Gv)return Th;Gv=1;var n=1e3,e=n*60,o=e*60,r=o*24,l=r*7,c=r*365.25;Th=function(g,y){y=y||{};var v=typeof g;if(v==="string"&&g.length>0)return d(g);if(v==="number"&&isFinite(g))return y.long?m(g):p(g);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(g))};function d(g){if(g=String(g),!(g.length>100)){var y=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(g);if(y){var v=parseFloat(y[1]),w=(y[2]||"ms").toLowerCase();switch(w){case"years":case"year":case"yrs":case"yr":case"y":return v*c;case"weeks":case"week":case"w":return v*l;case"days":case"day":case"d":return v*r;case"hours":case"hour":case"hrs":case"hr":case"h":return v*o;case"minutes":case"minute":case"mins":case"min":case"m":return v*e;case"seconds":case"second":case"secs":case"sec":case"s":return v*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return v;default:return}}}}function p(g){var y=Math.abs(g);return y>=r?Math.round(g/r)+"d":y>=o?Math.round(g/o)+"h":y>=e?Math.round(g/e)+"m":y>=n?Math.round(g/n)+"s":g+"ms"}function m(g){var y=Math.abs(g);return y>=r?h(g,y,r,"day"):y>=o?h(g,y,o,"hour"):y>=e?h(g,y,e,"minute"):y>=n?h(g,y,n,"second"):g+" ms"}function h(g,y,v,w){var S=y>=v*1.5;return Math.round(g/v)+" "+w+(S?"s":"")}return Th}var Dh,Bv;function G3(){if(Bv)return Dh;Bv=1;function n(e){r.debug=r,r.default=r,r.coerce=h,r.disable=p,r.enable=c,r.enabled=m,r.humanize=U3(),r.destroy=g,Object.keys(e).forEach(y=>{r[y]=e[y]}),r.names=[],r.skips=[],r.formatters={};function o(y){let v=0;for(let w=0;w{if(O==="%%")return"%";N++;const $=r.formatters[M];if(typeof $=="function"){const L=E[N];O=$.call(D,L),E.splice(N,1),N--}return O}),r.formatArgs.call(D,E),(D.log||r.log).apply(D,E)}return x.namespace=y,x.useColors=r.useColors(),x.color=r.selectColor(y),x.extend=l,x.destroy=r.destroy,Object.defineProperty(x,"enabled",{enumerable:!0,configurable:!1,get:()=>w!==null?w:(S!==r.namespaces&&(S=r.namespaces,A=r.enabled(y)),A),set:E=>{w=E}}),typeof r.init=="function"&&r.init(x),x}function l(y,v){const w=r(this.namespace+(typeof v>"u"?":":v)+y);return w.log=this.log,w}function c(y){r.save(y),r.namespaces=y,r.names=[],r.skips=[];const v=(typeof y=="string"?y:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const w of v)w[0]==="-"?r.skips.push(w.slice(1)):r.names.push(w)}function d(y,v){let w=0,S=0,A=-1,x=0;for(;w"-"+v)].join(",");return r.enable(""),y}function m(y){for(const v of r.skips)if(d(y,v))return!1;for(const v of r.names)if(d(y,v))return!0;return!1}function h(y){return y instanceof Error?y.stack||y.message:y}function g(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return r.enable(r.load()),r}return Dh=n,Dh}var Hv;function B3(){return Hv||(Hv=1,(function(n,e){var o={};e.formatArgs=l,e.save=c,e.load=d,e.useColors=r,e.storage=p(),e.destroy=(()=>{let h=!1;return()=>{h||(h=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),e.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function r(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let h;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(h=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(h[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function l(h){if(h[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+h[0]+(this.useColors?"%c ":" ")+"+"+n.exports.humanize(this.diff),!this.useColors)return;const g="color: "+this.color;h.splice(1,0,g,"color: inherit");let y=0,v=0;h[0].replace(/%[a-zA-Z%]/g,w=>{w!=="%%"&&(y++,w==="%c"&&(v=y))}),h.splice(v,0,g)}e.log=console.debug||console.log||(()=>{});function c(h){try{h?e.storage.setItem("debug",h):e.storage.removeItem("debug")}catch{}}function d(){let h;try{h=e.storage.getItem("debug")||e.storage.getItem("DEBUG")}catch{}return!h&&typeof process<"u"&&"env"in process&&(h=o.DEBUG),h}function p(){try{return localStorage}catch{}}n.exports=G3()(e);const{formatters:m}=n.exports;m.j=function(h){try{return JSON.stringify(h)}catch(g){return"[UnexpectedJSONParseError]: "+g.message}}})(tu,tu.exports)),tu.exports}var H3=B3();const $3=Y1(H3),Gu={},Y3=Symbol((Gu?"production":void 0)!=="production"?"RESET":"");let $v=!1;function Mh(n,e){(Gu?"production":void 0)!=="production"&&!$v&&(console.warn("[DEPRECATED] atomFamily is deprecated and will be removed in v3. Please use the `jotai-family` package instead: https://github.com/jotaijs/jotai-family"),$v=!0);let o=null;const r=new Map,l=new Set,c=p=>{let m;if(e===void 0)m=r.get(p);else for(const[g,y]of r)if(e(g,p)){m=y;break}if(m!==void 0)if(o!=null&&o(m[1],p))c.remove(p);else return m[0];const h=n(p);return r.set(p,[h,Date.now()]),d("CREATE",p,h),h},d=(p,m,h)=>{for(const g of l)g({type:p,param:m,atom:h})};return c.unstable_listen=p=>(l.add(p),()=>{l.delete(p)}),c.getParams=()=>r.keys(),c.remove=p=>{if(e===void 0){if(!r.has(p))return;const[m]=r.get(p);r.delete(p),d("REMOVE",p,m)}else for(const[m,[h]]of r)if(e(m,p)){r.delete(m),d("REMOVE",m,h);break}},c.setShouldRemove=p=>{if(o=p,!!o)for(const[m,[h,g]]of r)o(g,m)&&(r.delete(m),d("REMOVE",m,h))},c}const xb=n=>typeof(n==null?void 0:n.then)=="function";function q3(n=()=>{try{return window.localStorage}catch(o){(Gu?"production":void 0)!=="production"&&typeof window<"u"&&console.warn(o);return}},e){var o;let r,l;const c={getItem:(m,h)=>{var g,y;const v=S=>{if(S=S||"",r!==S){try{l=JSON.parse(S,e==null?void 0:e.reviver)}catch{return h}r=S}return l},w=(y=(g=n())==null?void 0:g.getItem(m))!=null?y:null;return xb(w)?w.then(v):v(w)},setItem:(m,h)=>{var g;return(g=n())==null?void 0:g.setItem(m,JSON.stringify(h,void 0))},removeItem:m=>{var h;return(h=n())==null?void 0:h.removeItem(m)}},d=m=>(h,g,y)=>m(h,v=>{let w;try{w=JSON.parse(v||"")}catch{w=y}g(w)});let p;try{p=(o=n())==null?void 0:o.subscribe}catch{}return!p&&typeof window<"u"&&typeof window.addEventListener=="function"&&window.Storage&&(p=(m,h)=>{if(!(n()instanceof window.Storage))return()=>{};const g=y=>{y.storageArea===n()&&y.key===m&&h(y.newValue)};return window.addEventListener("storage",g),()=>{window.removeEventListener("storage",g)}}),p&&(c.subscribe=d(p)),c}const V3=q3();function Sb(n,e,o=V3,r){const l=K(e);return(Gu?"production":void 0)!=="production"&&(l.debugPrivate=!0),l.onMount=d=>{d(o.getItem(n,e));let p;return o.subscribe&&(p=o.subscribe(n,d,e)),p},K(d=>d(l),(d,p,m)=>{const h=typeof m=="function"?m(d(l)):m;return h===Y3?(p(l,e),o.removeItem(n)):xb(h)?h.then(g=>(p(l,g),o.setItem(n,g))):(p(l,h),o.setItem(n,h))})}var zh={exports:{}},Oh={};/** + * @license React + * react-compiler-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Yv;function X3(){if(Yv)return Oh;Yv=1;var n=Lu().__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;return Oh.c=function(e){return n.H.useMemoCache(e)},Oh}var qv;function K3(){return qv||(qv=1,zh.exports=X3()),zh.exports}var Oe=K3();function Q3(n,e,o){return Math.max(e,Math.min(n,o))}const yt={toVector(n,e){return n===void 0&&(n=e),Array.isArray(n)?n:[n,n]},add(n,e){return[n[0]+e[0],n[1]+e[1]]},sub(n,e){return[n[0]-e[0],n[1]-e[1]]},addTo(n,e){n[0]+=e[0],n[1]+=e[1]},subTo(n,e){n[0]-=e[0],n[1]-=e[1]}};function Vv(n,e,o){return e===0||Math.abs(e)===1/0?Math.pow(n,o*5):n*e*o/(e+o*n)}function Xv(n,e,o,r=.15){return r===0?Q3(n,e,o):no?+Vv(n-o,o-e,r)+o:n}function Z3(n,[e,o],[r,l]){const[[c,d],[p,m]]=n;return[Xv(e,c,d,r),Xv(o,p,m,l)]}function I3(n,e){if(typeof n!="object"||n===null)return n;var o=n[Symbol.toPrimitive];if(o!==void 0){var r=o.call(n,e);if(typeof r!="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(n)}function F3(n){var e=I3(n,"string");return typeof e=="symbol"?e:String(e)}function Qt(n,e,o){return e=F3(e),e in n?Object.defineProperty(n,e,{value:o,enumerable:!0,configurable:!0,writable:!0}):n[e]=o,n}function Kv(n,e){var o=Object.keys(n);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(n);e&&(r=r.filter(function(l){return Object.getOwnPropertyDescriptor(n,l).enumerable})),o.push.apply(o,r)}return o}function _t(n){for(var e=1;e{var o,r;return e.target===n.currentTarget||((o=n.currentTarget)===null||o===void 0||(r=o.contains)===null||r===void 0?void 0:r.call(o,e.target))})}function o_(n){return n.type==="touchend"||n.type==="touchcancel"?n.changedTouches:n.targetTouches}function Cb(n){return Bu(n)?o_(n)[0]:n}function tp(n,e){try{const o=e.clientX-n.clientX,r=e.clientY-n.clientY,l=(e.clientX+n.clientX)/2,c=(e.clientY+n.clientY)/2,d=Math.hypot(o,r);return{angle:-(Math.atan2(o,r)*180)/Math.PI,distance:d,origin:[l,c]}}catch{}return null}function r_(n){return i_(n).map(e=>e.identifier)}function Zv(n,e){const[o,r]=Array.from(n.touches).filter(l=>e.includes(l.identifier));return tp(o,r)}function Rh(n){const e=Cb(n);return Bu(n)?e.identifier:e.pointerId}function is(n){const e=Cb(n);return[e.clientX,e.clientY]}const Iv=40,Fv=800;function Eb(n){let{deltaX:e,deltaY:o,deltaMode:r}=n;return r===1?(e*=Iv,o*=Iv):r===2&&(e*=Fv,o*=Fv),[e,o]}function a_(n){var e,o;const{scrollX:r,scrollY:l,scrollLeft:c,scrollTop:d}=n.currentTarget;return[(e=r??c)!==null&&e!==void 0?e:0,(o=l??d)!==null&&o!==void 0?o:0]}function s_(n){const e={};if("buttons"in n&&(e.buttons=n.buttons),"shiftKey"in n){const{shiftKey:o,altKey:r,metaKey:l,ctrlKey:c}=n;Object.assign(e,{shiftKey:o,altKey:r,metaKey:l,ctrlKey:c})}return e}function xu(n,...e){return typeof n=="function"?n(...e):n}function l_(){}function c_(...n){return n.length===0?l_:n.length===1?n[0]:function(){let e;for(const o of n)e=o.apply(this,arguments)||e;return e}}function Pv(n,e){return Object.assign({},e,n||{})}const u_=32;class Nb{constructor(e,o,r){this.ctrl=e,this.args=o,this.key=r,this.state||(this.state={},this.computeValues([0,0]),this.computeInitial(),this.init&&this.init(),this.reset())}get state(){return this.ctrl.state[this.key]}set state(e){this.ctrl.state[this.key]=e}get shared(){return this.ctrl.state.shared}get eventStore(){return this.ctrl.gestureEventStores[this.key]}get timeoutStore(){return this.ctrl.gestureTimeoutStores[this.key]}get config(){return this.ctrl.config[this.key]}get sharedConfig(){return this.ctrl.config.shared}get handler(){return this.ctrl.handlers[this.key]}reset(){const{state:e,shared:o,ingKey:r,args:l}=this;o[r]=e._active=e.active=e._blocked=e._force=!1,e._step=[!1,!1],e.intentional=!1,e._movement=[0,0],e._distance=[0,0],e._direction=[0,0],e._delta=[0,0],e._bounds=[[-1/0,1/0],[-1/0,1/0]],e.args=l,e.axis=void 0,e.memo=void 0,e.elapsedTime=e.timeDelta=0,e.direction=[0,0],e.distance=[0,0],e.overflow=[0,0],e._movementBound=[!1,!1],e.velocity=[0,0],e.movement=[0,0],e.delta=[0,0],e.timeStamp=0}start(e){const o=this.state,r=this.config;o._active||(this.reset(),this.computeInitial(),o._active=!0,o.target=e.target,o.currentTarget=e.currentTarget,o.lastOffset=r.from?xu(r.from,o):o.offset,o.offset=o.lastOffset,o.startTime=o.timeStamp=e.timeStamp)}computeValues(e){const o=this.state;o._values=e,o.values=this.config.transform(e)}computeInitial(){const e=this.state;e._initial=e._values,e.initial=e.values}compute(e){const{state:o,config:r,shared:l}=this;o.args=this.args;let c=0;if(e&&(o.event=e,r.preventDefault&&e.cancelable&&o.event.preventDefault(),o.type=e.type,l.touches=this.ctrl.pointerIds.size||this.ctrl.touchIds.size,l.locked=!!document.pointerLockElement,Object.assign(l,s_(e)),l.down=l.pressed=l.buttons%2===1||l.touches>0,c=e.timeStamp-o.timeStamp,o.timeStamp=e.timeStamp,o.elapsedTime=o.timeStamp-o.startTime),o._active){const T=o._delta.map(Math.abs);yt.addTo(o._distance,T)}this.axisIntent&&this.axisIntent(e);const[d,p]=o._movement,[m,h]=r.threshold,{_step:g,values:y}=o;if(r.hasCustomTransform?(g[0]===!1&&(g[0]=Math.abs(d)>=m&&y[0]),g[1]===!1&&(g[1]=Math.abs(p)>=h&&y[1])):(g[0]===!1&&(g[0]=Math.abs(d)>=m&&Math.sign(d)*m),g[1]===!1&&(g[1]=Math.abs(p)>=h&&Math.sign(p)*h)),o.intentional=g[0]!==!1||g[1]!==!1,!o.intentional)return;const v=[0,0];if(r.hasCustomTransform){const[T,O]=y;v[0]=g[0]!==!1?T-g[0]:0,v[1]=g[1]!==!1?O-g[1]:0}else v[0]=g[0]!==!1?d-g[0]:0,v[1]=g[1]!==!1?p-g[1]:0;this.restrictToAxis&&!o._blocked&&this.restrictToAxis(v);const w=o.offset,S=o._active&&!o._blocked||o.active;S&&(o.first=o._active&&!o.active,o.last=!o._active&&o.active,o.active=l[this.ingKey]=o._active,e&&(o.first&&("bounds"in r&&(o._bounds=xu(r.bounds,o)),this.setup&&this.setup()),o.movement=v,this.computeOffset()));const[A,x]=o.offset,[[E,D],[R,_]]=o._bounds;o.overflow=[AD?1:0,x_?1:0],o._movementBound[0]=o.overflow[0]?o._movementBound[0]===!1?o._movement[0]:o._movementBound[0]:!1,o._movementBound[1]=o.overflow[1]?o._movementBound[1]===!1?o._movement[1]:o._movementBound[1]:!1;const N=o._active?r.rubberband||[0,0]:[0,0];if(o.offset=Z3(o._bounds,o.offset,N),o.delta=yt.sub(o.offset,w),this.computeMovement(),S&&(!o.last||c>u_)){o.delta=yt.sub(o.offset,w);const T=o.delta.map(Math.abs);yt.addTo(o.distance,T),o.direction=o.delta.map(Math.sign),o._direction=o._delta.map(Math.sign),!o.first&&c>0&&(o.velocity=[T[0]/c,T[1]/c],o.timeDelta=c)}}emit(){const e=this.state,o=this.shared,r=this.config;if(e._active||this.clean(),(e._blocked||!e.intentional)&&!e._force&&!r.triggerAllEvents)return;const l=this.handler(_t(_t(_t({},o),e),{},{[this.aliasKey]:e.values}));l!==void 0&&(e.memo=l)}clean(){this.eventStore.clean(),this.timeoutStore.clean()}}function d_([n,e],o){const r=Math.abs(n),l=Math.abs(e);if(r>l&&r>o)return"x";if(l>r&&l>o)return"y"}class Dl extends Nb{constructor(...e){super(...e),Qt(this,"aliasKey","xy")}reset(){super.reset(),this.state.axis=void 0}init(){this.state.offset=[0,0],this.state.lastOffset=[0,0]}computeOffset(){this.state.offset=yt.add(this.state.lastOffset,this.state.movement)}computeMovement(){this.state.movement=yt.sub(this.state.offset,this.state.lastOffset)}axisIntent(e){const o=this.state,r=this.config;if(!o.axis&&e){const l=typeof r.axisThreshold=="object"?r.axisThreshold[_b(e)]:r.axisThreshold;o.axis=d_(o._movement,l)}o._blocked=(r.lockDirection||!!r.axis)&&!o.axis||!!r.axis&&r.axis!==o.axis}restrictToAxis(e){if(this.config.axis||this.config.lockDirection)switch(this.state.axis){case"x":e[1]=0;break;case"y":e[0]=0;break}}}const f_=n=>n,Jv=.15,kb={enabled(n=!0){return n},eventOptions(n,e,o){return _t(_t({},o.shared.eventOptions),n)},preventDefault(n=!1){return n},triggerAllEvents(n=!1){return n},rubberband(n=0){switch(n){case!0:return[Jv,Jv];case!1:return[0,0];default:return yt.toVector(n)}},from(n){if(typeof n=="function")return n;if(n!=null)return yt.toVector(n)},transform(n,e,o){const r=n||o.shared.transform;return this.hasCustomTransform=!!r,r||f_},threshold(n){return yt.toVector(n,0)}},h_=0,Wr=_t(_t({},kb),{},{axis(n,e,{axis:o}){if(this.lockDirection=o==="lock",!this.lockDirection)return o},axisThreshold(n=h_){return n},bounds(n={}){if(typeof n=="function")return c=>Wr.bounds(n(c));if("current"in n)return()=>n.current;if(typeof HTMLElement=="function"&&n instanceof HTMLElement)return n;const{left:e=-1/0,right:o=1/0,top:r=-1/0,bottom:l=1/0}=n;return[[e,o],[r,l]]}}),Wv={ArrowRight:(n,e=1)=>[n*e,0],ArrowLeft:(n,e=1)=>[-1*n*e,0],ArrowUp:(n,e=1)=>[0,-1*n*e],ArrowDown:(n,e=1)=>[0,n*e]};class p_ extends Dl{constructor(...e){super(...e),Qt(this,"ingKey","dragging")}reset(){super.reset();const e=this.state;e._pointerId=void 0,e._pointerActive=!1,e._keyboardActive=!1,e._preventScroll=!1,e._delayed=!1,e.swipe=[0,0],e.tap=!1,e.canceled=!1,e.cancel=this.cancel.bind(this)}setup(){const e=this.state;if(e._bounds instanceof HTMLElement){const o=e._bounds.getBoundingClientRect(),r=e.currentTarget.getBoundingClientRect(),l={left:o.left-r.left+e.offset[0],right:o.right-r.right+e.offset[0],top:o.top-r.top+e.offset[1],bottom:o.bottom-r.bottom+e.offset[1]};e._bounds=Wr.bounds(l)}}cancel(){const e=this.state;e.canceled||(e.canceled=!0,e._active=!1,setTimeout(()=>{this.compute(),this.emit()},0))}setActive(){this.state._active=this.state._pointerActive||this.state._keyboardActive}clean(){this.pointerClean(),this.state._pointerActive=!1,this.state._keyboardActive=!1,super.clean()}pointerDown(e){const o=this.config,r=this.state;if(e.buttons!=null&&(Array.isArray(o.pointerButtons)?!o.pointerButtons.includes(e.buttons):o.pointerButtons!==-1&&o.pointerButtons!==e.buttons))return;const l=this.ctrl.setEventIds(e);o.pointerCapture&&e.target.setPointerCapture(e.pointerId),!(l&&l.size>1&&r._pointerActive)&&(this.start(e),this.setupPointer(e),r._pointerId=Rh(e),r._pointerActive=!0,this.computeValues(is(e)),this.computeInitial(),o.preventScrollAxis&&_b(e)!=="mouse"?(r._active=!1,this.setupScrollPrevention(e)):o.delay>0?(this.setupDelayTrigger(e),o.triggerAllEvents&&(this.compute(e),this.emit())):this.startPointerDrag(e))}startPointerDrag(e){const o=this.state;o._active=!0,o._preventScroll=!0,o._delayed=!1,this.compute(e),this.emit()}pointerMove(e){const o=this.state,r=this.config;if(!o._pointerActive)return;const l=Rh(e);if(o._pointerId!==void 0&&l!==o._pointerId)return;const c=is(e);if(document.pointerLockElement===e.target?o._delta=[e.movementX,e.movementY]:(o._delta=yt.sub(c,o._values),this.computeValues(c)),yt.addTo(o._movement,o._delta),this.compute(e),o._delayed&&o.intentional){this.timeoutStore.remove("dragDelay"),o.active=!1,this.startPointerDrag(e);return}if(r.preventScrollAxis&&!o._preventScroll)if(o.axis)if(o.axis===r.preventScrollAxis||r.preventScrollAxis==="xy"){o._active=!1,this.clean();return}else{this.timeoutStore.remove("startPointerDrag"),this.startPointerDrag(e);return}else return;this.emit()}pointerUp(e){this.ctrl.setEventIds(e);try{this.config.pointerCapture&&e.target.hasPointerCapture(e.pointerId)&&e.target.releasePointerCapture(e.pointerId)}catch{}const o=this.state,r=this.config;if(!o._active||!o._pointerActive)return;const l=Rh(e);if(o._pointerId!==void 0&&l!==o._pointerId)return;this.state._pointerActive=!1,this.setActive(),this.compute(e);const[c,d]=o._distance;if(o.tap=c<=r.tapsThreshold&&d<=r.tapsThreshold,o.tap&&r.filterTaps)o._force=!0;else{const[p,m]=o._delta,[h,g]=o._movement,[y,v]=r.swipe.velocity,[w,S]=r.swipe.distance,A=r.swipe.duration;if(o.elapsedTimey&&Math.abs(h)>w&&(o.swipe[0]=Math.sign(p)),E>v&&Math.abs(g)>S&&(o.swipe[1]=Math.sign(m))}}this.emit()}pointerClick(e){!this.state.tap&&e.detail>0&&(e.preventDefault(),e.stopPropagation())}setupPointer(e){const o=this.config,r=o.device;o.pointerLock&&e.currentTarget.requestPointerLock(),o.pointerCapture||(this.eventStore.add(this.sharedConfig.window,r,"change",this.pointerMove.bind(this)),this.eventStore.add(this.sharedConfig.window,r,"end",this.pointerUp.bind(this)),this.eventStore.add(this.sharedConfig.window,r,"cancel",this.pointerUp.bind(this)))}pointerClean(){this.config.pointerLock&&document.pointerLockElement===this.state.currentTarget&&document.exitPointerLock()}preventScroll(e){this.state._preventScroll&&e.cancelable&&e.preventDefault()}setupScrollPrevention(e){this.state._preventScroll=!1,m_(e);const o=this.eventStore.add(this.sharedConfig.window,"touch","change",this.preventScroll.bind(this),{passive:!1});this.eventStore.add(this.sharedConfig.window,"touch","end",o),this.eventStore.add(this.sharedConfig.window,"touch","cancel",o),this.timeoutStore.add("startPointerDrag",this.startPointerDrag.bind(this),this.config.preventScrollDelay,e)}setupDelayTrigger(e){this.state._delayed=!0,this.timeoutStore.add("dragDelay",()=>{this.state._step=[0,0],this.startPointerDrag(e)},this.config.delay)}keyDown(e){const o=Wv[e.key];if(o){const r=this.state,l=e.shiftKey?10:e.altKey?.1:1;this.start(e),r._delta=o(this.config.keyboardDisplacement,l),r._keyboardActive=!0,yt.addTo(r._movement,r._delta),this.compute(e),this.emit()}}keyUp(e){e.key in Wv&&(this.state._keyboardActive=!1,this.setActive(),this.compute(e),this.emit())}bind(e){const o=this.config.device;e(o,"start",this.pointerDown.bind(this)),this.config.pointerCapture&&(e(o,"change",this.pointerMove.bind(this)),e(o,"end",this.pointerUp.bind(this)),e(o,"cancel",this.pointerUp.bind(this)),e("lostPointerCapture","",this.pointerUp.bind(this))),this.config.keys&&(e("key","down",this.keyDown.bind(this)),e("key","up",this.keyUp.bind(this))),this.config.filterTaps&&e("click","",this.pointerClick.bind(this),{capture:!0,passive:!1})}}function m_(n){"persist"in n&&typeof n.persist=="function"&&n.persist()}const Ml=typeof window<"u"&&window.document&&window.document.createElement;function Tb(){return Ml&&"ontouchstart"in window}function g_(){return Tb()||Ml&&window.navigator.maxTouchPoints>1}function y_(){return Ml&&"onpointerdown"in window}function v_(){return Ml&&"exitPointerLock"in window.document}function b_(){try{return"constructor"in GestureEvent}catch{return!1}}const Ai={isBrowser:Ml,gesture:b_(),touch:Tb(),touchscreen:g_(),pointer:y_(),pointerLock:v_()},w_=250,x_=180,S_=.5,A_=50,__=250,C_=10,e1={mouse:0,touch:0,pen:8},E_=_t(_t({},Wr),{},{device(n,e,{pointer:{touch:o=!1,lock:r=!1,mouse:l=!1}={}}){return this.pointerLock=r&&Ai.pointerLock,Ai.touch&&o?"touch":this.pointerLock?"mouse":Ai.pointer&&!l?"pointer":Ai.touch?"touch":"mouse"},preventScrollAxis(n,e,{preventScroll:o}){if(this.preventScrollDelay=typeof o=="number"?o:o||o===void 0&&n?w_:void 0,!(!Ai.touchscreen||o===!1))return n||(o!==void 0?"y":void 0)},pointerCapture(n,e,{pointer:{capture:o=!0,buttons:r=1,keys:l=!0}={}}){return this.pointerButtons=r,this.keys=l,!this.pointerLock&&this.device==="pointer"&&o},threshold(n,e,{filterTaps:o=!1,tapsThreshold:r=3,axis:l=void 0}){const c=yt.toVector(n,o?r:l?1:0);return this.filterTaps=o,this.tapsThreshold=r,c},swipe({velocity:n=S_,distance:e=A_,duration:o=__}={}){return{velocity:this.transform(yt.toVector(n)),distance:this.transform(yt.toVector(e)),duration:o}},delay(n=0){switch(n){case!0:return x_;case!1:return 0;default:return n}},axisThreshold(n){return n?_t(_t({},e1),n):e1},keyboardDisplacement(n=C_){return n}});function Db(n){const[e,o]=n.overflow,[r,l]=n._delta,[c,d]=n._direction;(e<0&&r>0&&c<0||e>0&&r<0&&c>0)&&(n._movement[0]=n._movementBound[0]),(o<0&&l>0&&d<0||o>0&&l<0&&d>0)&&(n._movement[1]=n._movementBound[1])}const N_=30,k_=100;class T_ extends Nb{constructor(...e){super(...e),Qt(this,"ingKey","pinching"),Qt(this,"aliasKey","da")}init(){this.state.offset=[1,0],this.state.lastOffset=[1,0],this.state._pointerEvents=new Map}reset(){super.reset();const e=this.state;e._touchIds=[],e.canceled=!1,e.cancel=this.cancel.bind(this),e.turns=0}computeOffset(){const{type:e,movement:o,lastOffset:r}=this.state;e==="wheel"?this.state.offset=yt.add(o,r):this.state.offset=[(1+o[0])*r[0],o[1]+r[1]]}computeMovement(){const{offset:e,lastOffset:o}=this.state;this.state.movement=[e[0]/o[0],e[1]-o[1]]}axisIntent(){const e=this.state,[o,r]=e._movement;if(!e.axis){const l=Math.abs(o)*N_-Math.abs(r);l<0?e.axis="angle":l>0&&(e.axis="scale")}}restrictToAxis(e){this.config.lockDirection&&(this.state.axis==="scale"?e[1]=0:this.state.axis==="angle"&&(e[0]=0))}cancel(){const e=this.state;e.canceled||setTimeout(()=>{e.canceled=!0,e._active=!1,this.compute(),this.emit()},0)}touchStart(e){this.ctrl.setEventIds(e);const o=this.state,r=this.ctrl.touchIds;if(o._active&&o._touchIds.every(c=>r.has(c))||r.size<2)return;this.start(e),o._touchIds=Array.from(r).slice(0,2);const l=Zv(e,o._touchIds);l&&this.pinchStart(e,l)}pointerStart(e){if(e.buttons!=null&&e.buttons%2!==1)return;this.ctrl.setEventIds(e),e.target.setPointerCapture(e.pointerId);const o=this.state,r=o._pointerEvents,l=this.ctrl.pointerIds;if(o._active&&Array.from(r.keys()).every(d=>l.has(d))||(r.size<2&&r.set(e.pointerId,e),o._pointerEvents.size<2))return;this.start(e);const c=tp(...Array.from(r.values()));c&&this.pinchStart(e,c)}pinchStart(e,o){const r=this.state;r.origin=o.origin,this.computeValues([o.distance,o.angle]),this.computeInitial(),this.compute(e),this.emit()}touchMove(e){if(!this.state._active)return;const o=Zv(e,this.state._touchIds);o&&this.pinchMove(e,o)}pointerMove(e){const o=this.state._pointerEvents;if(o.has(e.pointerId)&&o.set(e.pointerId,e),!this.state._active)return;const r=tp(...Array.from(o.values()));r&&this.pinchMove(e,r)}pinchMove(e,o){const r=this.state,l=r._values[1],c=o.angle-l;let d=0;Math.abs(c)>270&&(d+=Math.sign(c)),this.computeValues([o.distance,o.angle-360*d]),r.origin=o.origin,r.turns=d,r._movement=[r._values[0]/r._initial[0]-1,r._values[1]-r._initial[1]],this.compute(e),this.emit()}touchEnd(e){this.ctrl.setEventIds(e),this.state._active&&this.state._touchIds.some(o=>!this.ctrl.touchIds.has(o))&&(this.state._active=!1,this.compute(e),this.emit())}pointerEnd(e){const o=this.state;this.ctrl.setEventIds(e);try{e.target.releasePointerCapture(e.pointerId)}catch{}o._pointerEvents.has(e.pointerId)&&o._pointerEvents.delete(e.pointerId),o._active&&o._pointerEvents.size<2&&(o._active=!1,this.compute(e),this.emit())}gestureStart(e){e.cancelable&&e.preventDefault();const o=this.state;o._active||(this.start(e),this.computeValues([e.scale,e.rotation]),o.origin=[e.clientX,e.clientY],this.compute(e),this.emit())}gestureMove(e){if(e.cancelable&&e.preventDefault(),!this.state._active)return;const o=this.state;this.computeValues([e.scale,e.rotation]),o.origin=[e.clientX,e.clientY];const r=o._movement;o._movement=[e.scale-1,e.rotation],o._delta=yt.sub(o._movement,r),this.compute(e),this.emit()}gestureEnd(e){this.state._active&&(this.state._active=!1,this.compute(e),this.emit())}wheel(e){const o=this.config.modifierKey;o&&(Array.isArray(o)?!o.find(r=>e[r]):!e[o])||(this.state._active?this.wheelChange(e):this.wheelStart(e),this.timeoutStore.add("wheelEnd",this.wheelEnd.bind(this)))}wheelStart(e){this.start(e),this.wheelChange(e)}wheelChange(e){"uv"in e||e.cancelable&&e.preventDefault();const r=this.state;r._delta=[-Eb(e)[1]/k_*r.offset[0],0],yt.addTo(r._movement,r._delta),Db(r),this.state.origin=[e.clientX,e.clientY],this.compute(e),this.emit()}wheelEnd(){this.state._active&&(this.state._active=!1,this.compute(),this.emit())}bind(e){const o=this.config.device;o&&(e(o,"start",this[o+"Start"].bind(this)),e(o,"change",this[o+"Move"].bind(this)),e(o,"end",this[o+"End"].bind(this)),e(o,"cancel",this[o+"End"].bind(this)),e("lostPointerCapture","",this[o+"End"].bind(this))),this.config.pinchOnWheel&&e("wheel","",this.wheel.bind(this),{passive:!1})}}const D_=_t(_t({},kb),{},{device(n,e,{shared:o,pointer:{touch:r=!1}={}}){if(o.target&&!Ai.touch&&Ai.gesture)return"gesture";if(Ai.touch&&r)return"touch";if(Ai.touchscreen){if(Ai.pointer)return"pointer";if(Ai.touch)return"touch"}},bounds(n,e,{scaleBounds:o={},angleBounds:r={}}){const l=d=>{const p=Pv(xu(o,d),{min:-1/0,max:1/0});return[p.min,p.max]},c=d=>{const p=Pv(xu(r,d),{min:-1/0,max:1/0});return[p.min,p.max]};return typeof o!="function"&&typeof r!="function"?[l(),c()]:d=>[l(d),c(d)]},threshold(n,e,o){return this.lockDirection=o.axis==="lock",yt.toVector(n,this.lockDirection?[.1,3]:0)},modifierKey(n){return n===void 0?"ctrlKey":n},pinchOnWheel(n=!0){return n}});class M_ extends Dl{constructor(...e){super(...e),Qt(this,"ingKey","moving")}move(e){this.config.mouseOnly&&e.pointerType!=="mouse"||(this.state._active?this.moveChange(e):this.moveStart(e),this.timeoutStore.add("moveEnd",this.moveEnd.bind(this)))}moveStart(e){this.start(e),this.computeValues(is(e)),this.compute(e),this.computeInitial(),this.emit()}moveChange(e){if(!this.state._active)return;const o=is(e),r=this.state;r._delta=yt.sub(o,r._values),yt.addTo(r._movement,r._delta),this.computeValues(o),this.compute(e),this.emit()}moveEnd(e){this.state._active&&(this.state._active=!1,this.compute(e),this.emit())}bind(e){e("pointer","change",this.move.bind(this)),e("pointer","leave",this.moveEnd.bind(this))}}const z_=_t(_t({},Wr),{},{mouseOnly:(n=!0)=>n});class O_ extends Dl{constructor(...e){super(...e),Qt(this,"ingKey","scrolling")}scroll(e){this.state._active||this.start(e),this.scrollChange(e),this.timeoutStore.add("scrollEnd",this.scrollEnd.bind(this))}scrollChange(e){e.cancelable&&e.preventDefault();const o=this.state,r=a_(e);o._delta=yt.sub(r,o._values),yt.addTo(o._movement,o._delta),this.computeValues(r),this.compute(e),this.emit()}scrollEnd(){this.state._active&&(this.state._active=!1,this.compute(),this.emit())}bind(e){e("scroll","",this.scroll.bind(this))}}const R_=Wr;class j_ extends Dl{constructor(...e){super(...e),Qt(this,"ingKey","wheeling")}wheel(e){this.state._active||this.start(e),this.wheelChange(e),this.timeoutStore.add("wheelEnd",this.wheelEnd.bind(this))}wheelChange(e){const o=this.state;o._delta=Eb(e),yt.addTo(o._movement,o._delta),Db(o),this.compute(e),this.emit()}wheelEnd(){this.state._active&&(this.state._active=!1,this.compute(),this.emit())}bind(e){e("wheel","",this.wheel.bind(this))}}const L_=Wr;class U_ extends Dl{constructor(...e){super(...e),Qt(this,"ingKey","hovering")}enter(e){this.config.mouseOnly&&e.pointerType!=="mouse"||(this.start(e),this.computeValues(is(e)),this.compute(e),this.emit())}leave(e){if(this.config.mouseOnly&&e.pointerType!=="mouse")return;const o=this.state;if(!o._active)return;o._active=!1;const r=is(e);o._movement=o._delta=yt.sub(r,o._values),this.computeValues(r),this.compute(e),o.delta=o.movement,this.emit()}bind(e){e("pointer","enter",this.enter.bind(this)),e("pointer","leave",this.leave.bind(this))}}const G_=_t(_t({},Wr),{},{mouseOnly:(n=!0)=>n}),Ep=new Map,np=new Map;function B_(n){Ep.set(n.key,n.engine),np.set(n.key,n.resolver)}const H_={key:"drag",engine:p_,resolver:E_},$_={key:"hover",engine:U_,resolver:G_},Y_={key:"move",engine:M_,resolver:z_},q_={key:"pinch",engine:T_,resolver:D_},V_={key:"scroll",engine:O_,resolver:R_},X_={key:"wheel",engine:j_,resolver:L_};function K_(n,e){if(n==null)return{};var o={},r=Object.keys(n),l,c;for(c=0;c=0)&&(o[l]=n[l]);return o}function Q_(n,e){if(n==null)return{};var o=K_(n,e),r,l;if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(n);for(l=0;l=0)&&Object.prototype.propertyIsEnumerable.call(n,r)&&(o[r]=n[r])}return o}const Z_={target(n){if(n)return()=>"current"in n?n.current:n},enabled(n=!0){return n},window(n=Ai.isBrowser?window:void 0){return n},eventOptions({passive:n=!0,capture:e=!1}={}){return{passive:n,capture:e}},transform(n){return n}},I_=["target","eventOptions","window","enabled","transform"];function lu(n={},e){const o={};for(const[r,l]of Object.entries(e))switch(typeof l){case"function":o[r]=l.call(o,n[r],r,n);break;case"object":o[r]=lu(n[r],l);break;case"boolean":l&&(o[r]=n[r]);break}return o}function F_(n,e,o={}){const r=n,{target:l,eventOptions:c,window:d,enabled:p,transform:m}=r,h=Q_(r,I_);if(o.shared=lu({target:l,eventOptions:c,window:d,enabled:p,transform:m},Z_),e){const g=np.get(e);o[e]=lu(_t({shared:o.shared},h),g)}else for(const g in h){const y=np.get(g);y&&(o[g]=lu(_t({shared:o.shared},h[g]),y))}return o}class Mb{constructor(e,o){Qt(this,"_listeners",new Set),this._ctrl=e,this._gestureKey=o}add(e,o,r,l,c){const d=this._listeners,p=n_(o,r),m=this._gestureKey?this._ctrl.config[this._gestureKey].eventOptions:{},h=_t(_t({},m),c);e.addEventListener(p,l,h);const g=()=>{e.removeEventListener(p,l,h),d.delete(g)};return d.add(g),g}clean(){this._listeners.forEach(e=>e()),this._listeners.clear()}}class P_{constructor(){Qt(this,"_timeouts",new Map)}add(e,o,r=140,...l){this.remove(e),this._timeouts.set(e,window.setTimeout(o,r,...l))}remove(e){const o=this._timeouts.get(e);o&&window.clearTimeout(o)}clean(){this._timeouts.forEach(e=>void window.clearTimeout(e)),this._timeouts.clear()}}class J_{constructor(e){Qt(this,"gestures",new Set),Qt(this,"_targetEventStore",new Mb(this)),Qt(this,"gestureEventStores",{}),Qt(this,"gestureTimeoutStores",{}),Qt(this,"handlers",{}),Qt(this,"config",{}),Qt(this,"pointerIds",new Set),Qt(this,"touchIds",new Set),Qt(this,"state",{shared:{shiftKey:!1,metaKey:!1,ctrlKey:!1,altKey:!1}}),W_(this,e)}setEventIds(e){if(Bu(e))return this.touchIds=new Set(r_(e)),this.touchIds;if("pointerId"in e)return e.type==="pointerup"||e.type==="pointercancel"?this.pointerIds.delete(e.pointerId):e.type==="pointerdown"&&this.pointerIds.add(e.pointerId),this.pointerIds}applyHandlers(e,o){this.handlers=e,this.nativeHandlers=o}applyConfig(e,o){this.config=F_(e,o,this.config)}clean(){this._targetEventStore.clean();for(const e of this.gestures)this.gestureEventStores[e].clean(),this.gestureTimeoutStores[e].clean()}effect(){return this.config.shared.target&&this.bind(),()=>this._targetEventStore.clean()}bind(...e){const o=this.config.shared,r={};let l;if(!(o.target&&(l=o.target(),!l))){if(o.enabled){for(const d of this.gestures){const p=this.config[d],m=t1(r,p.eventOptions,!!l);if(p.enabled){const h=Ep.get(d);new h(this,e,d).bind(m)}}const c=t1(r,o.eventOptions,!!l);for(const d in this.nativeHandlers)c(d,"",p=>this.nativeHandlers[d](_t(_t({},this.state.shared),{},{event:p,args:e})),void 0,!0)}for(const c in r)r[c]=c_(...r[c]);if(!l)return r;for(const c in r){const{device:d,capture:p,passive:m}=t_(c);this._targetEventStore.add(l,d,"",r[c],{capture:p,passive:m})}}}}function Ba(n,e){n.gestures.add(e),n.gestureEventStores[e]=new Mb(n,e),n.gestureTimeoutStores[e]=new P_}function W_(n,e){e.drag&&Ba(n,"drag"),e.wheel&&Ba(n,"wheel"),e.scroll&&Ba(n,"scroll"),e.move&&Ba(n,"move"),e.pinch&&Ba(n,"pinch"),e.hover&&Ba(n,"hover")}const t1=(n,e,o)=>(r,l,c,d={},p=!1)=>{var m,h;const g=(m=d.capture)!==null&&m!==void 0?m:e.capture,y=(h=d.passive)!==null&&h!==void 0?h:e.passive;let v=p?r:W3(r,l,g);o&&y&&(v+="Passive"),n[v]=n[v]||[],n[v].push(c)},eC=/^on(Drag|Wheel|Scroll|Move|Pinch|Hover)/;function tC(n){const e={},o={},r=new Set;for(let l in n)eC.test(l)?(r.add(RegExp.lastMatch),o[l]=n[l]):e[l]=n[l];return[o,e,r]}function Ha(n,e,o,r,l,c){if(!n.has(o)||!Ep.has(r))return;const d=o+"Start",p=o+"End",m=h=>{let g;return h.first&&d in e&&e[d](h),o in e&&(g=e[o](h)),h.last&&p in e&&e[p](h),g};l[r]=m,c[r]=c[r]||{}}function nC(n,e){const[o,r,l]=tC(n),c={};return Ha(l,o,"onDrag","drag",c,e),Ha(l,o,"onWheel","wheel",c,e),Ha(l,o,"onScroll","scroll",c,e),Ha(l,o,"onPinch","pinch",c,e),Ha(l,o,"onMove","move",c,e),Ha(l,o,"onHover","hover",c,e),{handlers:c,config:e,nativeHandlers:r}}function iC(n,e={},o,r){const l=Ji.useMemo(()=>new J_(n),[]);if(l.applyHandlers(n,r),l.applyConfig(e,o),Ji.useEffect(l.effect.bind(l)),Ji.useEffect(()=>l.clean.bind(l),[]),e.target===void 0)return l.bind.bind(l)}function oC(n){return n.forEach(B_),function(o,r){const{handlers:l,nativeHandlers:c,config:d}=nC(o,r||{});return iC(l,d,void 0,c)}}function zb(n,e){return oC([H_,q_,V_,X_,Y_,$_])(n,e||{})}var rC=q1();function aC(n,e){var o,r=1;n==null&&(n=0),e==null&&(e=0);function l(){var c,d=o.length,p,m=0,h=0;for(c=0;c=(y=(p+h)/2))?p=y:h=y,(x=o>=(v=(m+g)/2))?m=v:g=v,l=c,!(c=c[E=x<<1|A]))return l[E]=d,n;if(w=+n._x.call(null,c.data),S=+n._y.call(null,c.data),e===w&&o===S)return d.next=c,l?l[E]=d:n._root=d,n;do l=l?l[E]=new Array(4):n._root=new Array(4),(A=e>=(y=(p+h)/2))?p=y:h=y,(x=o>=(v=(m+g)/2))?m=v:g=v;while((E=x<<1|A)===(D=(S>=v)<<1|w>=y));return l[D]=c,l[E]=d,n}function lC(n){var e,o,r=n.length,l,c,d=new Array(r),p=new Array(r),m=1/0,h=1/0,g=-1/0,y=-1/0;for(o=0;og&&(g=l),cy&&(y=c));if(m>g||h>y)return this;for(this.cover(m,h).cover(g,y),o=0;on||n>=l||r>e||e>=c;)switch(h=(eg||(p=S.y0)>y||(m=S.x1)=E)<<1|n>=x)&&(S=v[v.length-1],v[v.length-1]=v[v.length-1-A],v[v.length-1-A]=S)}else{var D=n-+this._x.call(null,w.data),R=e-+this._y.call(null,w.data),_=D*D+R*R;if(_=(v=(d+m)/2))?d=v:m=v,(A=y>=(w=(p+h)/2))?p=w:h=w,e=o,!(o=o[x=A<<1|S]))return this;if(!o.length)break;(e[x+1&3]||e[x+2&3]||e[x+3&3])&&(r=e,E=x)}for(;o.data!==n;)if(l=o,!(o=o.next))return this;return(c=o.next)&&delete o.next,l?(c?l.next=c:delete l.next,this):e?(c?e[x]=c:delete e[x],(o=e[0]||e[1]||e[2]||e[3])&&o===(e[3]||e[2]||e[1]||e[0])&&!o.length&&(r?r[E]=o:this._root=o),this):(this._root=c,this)}function pC(n){for(var e=0,o=n.length;ev.index){var X=w-M.x-M.vx,ae=S-M.y-M.vy,te=X*X+ae*ae;tew+L||TS+L||Oh.r&&(h.r=h[g].r)}function m(){if(e){var h,g=e.length,y;for(o=new Array(g),h=0;h[e(N,T,d),N])),_;for(x=0,p=new Array(E);x{}};function Rb(){for(var n=0,e=arguments.length,o={},r;n=0&&(r=o.slice(l+1),o=o.slice(0,l)),o&&!e.hasOwnProperty(o))throw new Error("unknown type: "+o);return{type:o,name:r}})}cu.prototype=Rb.prototype={constructor:cu,on:function(n,e){var o=this._,r=TC(n+"",o),l,c=-1,d=r.length;if(arguments.length<2){for(;++c0)for(var o=new Array(l),r=0,l,c;r=0&&n._call.call(void 0,e),n=n._next;--os}function r1(){Pr=(Au=vl.now())+Hu,os=cl=0;try{zC()}finally{os=0,RC(),Pr=0}}function OC(){var n=vl.now(),e=n-Au;e>jb&&(Hu-=e,Au=n)}function RC(){for(var n,e=Su,o,r=1/0;e;)e._call?(r>e._time&&(r=e._time),n=e,e=e._next):(o=e._next,e._next=null,e=n?n._next=o:Su=o);ul=n,op(r)}function op(n){if(!os){cl&&(cl=clearTimeout(cl));var e=n-Pr;e>24?(n<1/0&&(cl=setTimeout(r1,n-vl.now()-Hu)),sl&&(sl=clearInterval(sl))):(sl||(Au=vl.now(),sl=setInterval(OC,jb)),os=1,Lb(r1))}}const jC=1664525,LC=1013904223,a1=4294967296;function UC(){let n=1;return()=>(n=(jC*n+LC)%a1)/a1}function GC(n){return n.x}function BC(n){return n.y}var HC=10,$C=Math.PI*(3-Math.sqrt(5));function YC(n){var e,o=1,r=.001,l=1-Math.pow(r,1/300),c=0,d=.6,p=new Map,m=Gb(y),h=Rb("tick","end"),g=UC();n==null&&(n=[]);function y(){v(),h.call("tick",e),o1?(x==null?p.delete(A):p.set(A,S(x)),e):p.get(A)},find:function(A,x,E){var D=0,R=n.length,_,N,T,O,M;for(E==null?E=1/0:E*=E,D=0;D1?(h.on(A,x),e):h.on(A)}}}function qC(){var n,e,o,r,l=Fr(-30),c,d=1,p=1/0,m=.81;function h(w){var S,A=n.length,x=Np(n,GC,BC).visitAfter(y);for(r=w,S=0;S=p)return;(w.data!==e||w.next)&&(E===0&&(E=br(o),_+=E*E),D===0&&(D=br(o),_+=D*D),_{this.listeners.delete(n),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},VC={setTimeout:(n,e)=>setTimeout(n,e),clearTimeout:n=>clearTimeout(n),setInterval:(n,e)=>setInterval(n,e),clearInterval:n=>clearInterval(n)},hr,xp,O1,XC=(O1=class{constructor(){Qe(this,hr,VC);Qe(this,xp,!1)}setTimeoutProvider(n){Re(this,hr,n)}setTimeout(n,e){return re(this,hr).setTimeout(n,e)}clearTimeout(n){re(this,hr).clearTimeout(n)}setInterval(n,e){return re(this,hr).setInterval(n,e)}clearInterval(n){re(this,hr).clearInterval(n)}},hr=new WeakMap,xp=new WeakMap,O1),rp=new XC;function KC(n){setTimeout(n,0)}var Yu=typeof window>"u"||"Deno"in globalThis;function ji(){}function QC(n,e){return typeof n=="function"?n(e):n}function ZC(n){return typeof n=="number"&&n>=0&&n!==1/0}function IC(n,e){return Math.max(n+(e||0)-Date.now(),0)}function ap(n,e){return typeof n=="function"?n(e):n}function FC(n,e){return typeof n=="function"?n(e):n}function s1(n,e){const{type:o="all",exact:r,fetchStatus:l,predicate:c,queryKey:d,stale:p}=n;if(d){if(r){if(e.queryHash!==Tp(d,e.options))return!1}else if(!wl(e.queryKey,d))return!1}if(o!=="all"){const m=e.isActive();if(o==="active"&&!m||o==="inactive"&&m)return!1}return!(typeof p=="boolean"&&e.isStale()!==p||l&&l!==e.state.fetchStatus||c&&!c(e))}function l1(n,e){const{exact:o,status:r,predicate:l,mutationKey:c}=n;if(c){if(!e.options.mutationKey)return!1;if(o){if(bl(e.options.mutationKey)!==bl(c))return!1}else if(!wl(e.options.mutationKey,c))return!1}return!(r&&e.state.status!==r||l&&!l(e))}function Tp(n,e){return((e==null?void 0:e.queryKeyHashFn)||bl)(n)}function bl(n){return JSON.stringify(n,(e,o)=>sp(o)?Object.keys(o).sort().reduce((r,l)=>(r[l]=o[l],r),{}):o)}function wl(n,e){return n===e?!0:typeof n!=typeof e?!1:n&&e&&typeof n=="object"&&typeof e=="object"?Object.keys(e).every(o=>wl(n[o],e[o])):!1}var PC=Object.prototype.hasOwnProperty;function Bb(n,e){if(n===e)return n;const o=c1(n)&&c1(e);if(!o&&!(sp(n)&&sp(e)))return e;const l=(o?n:Object.keys(n)).length,c=o?e:Object.keys(e),d=c.length,p=o?new Array(d):{};let m=0;for(let h=0;h{rp.setTimeout(e,n)})}function WC(n,e,o){return typeof o.structuralSharing=="function"?o.structuralSharing(n,e):o.structuralSharing!==!1?Bb(n,e):e}function eE(n,e,o=0){const r=[...n,e];return o&&r.length>o?r.slice(1):r}function tE(n,e,o=0){const r=[e,...n];return o&&r.length>o?r.slice(0,-1):r}var Dp=Symbol();function Hb(n,e){return!n.queryFn&&(e!=null&&e.initialPromise)?()=>e.initialPromise:!n.queryFn||n.queryFn===Dp?()=>Promise.reject(new Error(`Missing queryFn: '${n.queryHash}'`)):n.queryFn}var Vr,pr,Ia,R1,nE=(R1=class extends $u{constructor(){super();Qe(this,Vr);Qe(this,pr);Qe(this,Ia);Re(this,Ia,e=>{if(!Yu&&window.addEventListener){const o=()=>e();return window.addEventListener("visibilitychange",o,!1),()=>{window.removeEventListener("visibilitychange",o)}}})}onSubscribe(){re(this,pr)||this.setEventListener(re(this,Ia))}onUnsubscribe(){var e;this.hasListeners()||((e=re(this,pr))==null||e.call(this),Re(this,pr,void 0))}setEventListener(e){var o;Re(this,Ia,e),(o=re(this,pr))==null||o.call(this),Re(this,pr,e(r=>{typeof r=="boolean"?this.setFocused(r):this.onFocus()}))}setFocused(e){re(this,Vr)!==e&&(Re(this,Vr,e),this.onFocus())}onFocus(){const e=this.isFocused();this.listeners.forEach(o=>{o(e)})}isFocused(){var e;return typeof re(this,Vr)=="boolean"?re(this,Vr):((e=globalThis.document)==null?void 0:e.visibilityState)!=="hidden"}},Vr=new WeakMap,pr=new WeakMap,Ia=new WeakMap,R1),$b=new nE;function iE(){let n,e;const o=new Promise((l,c)=>{n=l,e=c});o.status="pending",o.catch(()=>{});function r(l){Object.assign(o,l),delete o.resolve,delete o.reject}return o.resolve=l=>{r({status:"fulfilled",value:l}),n(l)},o.reject=l=>{r({status:"rejected",reason:l}),e(l)},o}var oE=KC;function rE(){let n=[],e=0,o=p=>{p()},r=p=>{p()},l=oE;const c=p=>{e?n.push(p):l(()=>{o(p)})},d=()=>{const p=n;n=[],p.length&&l(()=>{r(()=>{p.forEach(m=>{o(m)})})})};return{batch:p=>{let m;e++;try{m=p()}finally{e--,e||d()}return m},batchCalls:p=>(...m)=>{c(()=>{p(...m)})},schedule:c,setNotifyFunction:p=>{o=p},setBatchNotifyFunction:p=>{r=p},setScheduler:p=>{l=p}}}var jn=rE(),Fa,mr,Pa,j1,aE=(j1=class extends $u{constructor(){super();Qe(this,Fa,!0);Qe(this,mr);Qe(this,Pa);Re(this,Pa,e=>{if(!Yu&&window.addEventListener){const o=()=>e(!0),r=()=>e(!1);return window.addEventListener("online",o,!1),window.addEventListener("offline",r,!1),()=>{window.removeEventListener("online",o),window.removeEventListener("offline",r)}}})}onSubscribe(){re(this,mr)||this.setEventListener(re(this,Pa))}onUnsubscribe(){var e;this.hasListeners()||((e=re(this,mr))==null||e.call(this),Re(this,mr,void 0))}setEventListener(e){var o;Re(this,Pa,e),(o=re(this,mr))==null||o.call(this),Re(this,mr,e(this.setOnline.bind(this)))}setOnline(e){re(this,Fa)!==e&&(Re(this,Fa,e),this.listeners.forEach(r=>{r(e)}))}isOnline(){return re(this,Fa)}},Fa=new WeakMap,mr=new WeakMap,Pa=new WeakMap,j1),_u=new aE;function sE(n){return Math.min(1e3*2**n,3e4)}function Yb(n){return(n??"online")==="online"?_u.isOnline():!0}var lp=class extends Error{constructor(n){super("CancelledError"),this.revert=n==null?void 0:n.revert,this.silent=n==null?void 0:n.silent}};function qb(n){let e=!1,o=0,r;const l=iE(),c=()=>l.status!=="pending",d=A=>{var x;if(!c()){const E=new lp(A);v(E),(x=n.onCancel)==null||x.call(n,E)}},p=()=>{e=!0},m=()=>{e=!1},h=()=>$b.isFocused()&&(n.networkMode==="always"||_u.isOnline())&&n.canRun(),g=()=>Yb(n.networkMode)&&n.canRun(),y=A=>{c()||(r==null||r(),l.resolve(A))},v=A=>{c()||(r==null||r(),l.reject(A))},w=()=>new Promise(A=>{var x;r=E=>{(c()||h())&&A(E)},(x=n.onPause)==null||x.call(n)}).then(()=>{var A;r=void 0,c()||(A=n.onContinue)==null||A.call(n)}),S=()=>{if(c())return;let A;const x=o===0?n.initialPromise:void 0;try{A=x??n.fn()}catch(E){A=Promise.reject(E)}Promise.resolve(A).then(y).catch(E=>{var T;if(c())return;const D=n.retry??(Yu?0:3),R=n.retryDelay??sE,_=typeof R=="function"?R(o,E):R,N=D===!0||typeof D=="number"&&oh()?void 0:w()).then(()=>{e?v(E):S()})})};return{promise:l,status:()=>l.status,cancel:d,continue:()=>(r==null||r(),l),cancelRetry:p,continueRetry:m,canStart:g,start:()=>(g()?S():w().then(S),l)}}var Xr,L1,Vb=(L1=class{constructor(){Qe(this,Xr)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),ZC(this.gcTime)&&Re(this,Xr,rp.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(n){this.gcTime=Math.max(this.gcTime||0,n??(Yu?1/0:300*1e3))}clearGcTimeout(){re(this,Xr)&&(rp.clearTimeout(re(this,Xr)),Re(this,Xr,void 0))}},Xr=new WeakMap,L1),Kr,Ja,Si,Qr,sn,El,Zr,Li,wo,U1,lE=(U1=class extends Vb{constructor(e){super();Qe(this,Li);Qe(this,Kr);Qe(this,Ja);Qe(this,Si);Qe(this,Qr);Qe(this,sn);Qe(this,El);Qe(this,Zr);Re(this,Zr,!1),Re(this,El,e.defaultOptions),this.setOptions(e.options),this.observers=[],Re(this,Qr,e.client),Re(this,Si,re(this,Qr).getQueryCache()),this.queryKey=e.queryKey,this.queryHash=e.queryHash,Re(this,Kr,f1(this.options)),this.state=e.state??re(this,Kr),this.scheduleGc()}get meta(){return this.options.meta}get promise(){var e;return(e=re(this,sn))==null?void 0:e.promise}setOptions(e){if(this.options={...re(this,El),...e},this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const o=f1(this.options);o.data!==void 0&&(this.setState(d1(o.data,o.dataUpdatedAt)),Re(this,Kr,o))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&re(this,Si).remove(this)}setData(e,o){const r=WC(this.state.data,e,this.options);return _n(this,Li,wo).call(this,{data:r,type:"success",dataUpdatedAt:o==null?void 0:o.updatedAt,manual:o==null?void 0:o.manual}),r}setState(e,o){_n(this,Li,wo).call(this,{type:"setState",state:e,setStateOptions:o})}cancel(e){var r,l;const o=(r=re(this,sn))==null?void 0:r.promise;return(l=re(this,sn))==null||l.cancel(e),o?o.then(ji).catch(ji):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}reset(){this.destroy(),this.setState(re(this,Kr))}isActive(){return this.observers.some(e=>FC(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===Dp||this.state.dataUpdateCount+this.state.errorUpdateCount===0}isStatic(){return this.getObserversCount()>0?this.observers.some(e=>ap(e.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e==="static"?!1:this.state.isInvalidated?!0:!IC(this.state.dataUpdatedAt,e)}onFocus(){var o;const e=this.observers.find(r=>r.shouldFetchOnWindowFocus());e==null||e.refetch({cancelRefetch:!1}),(o=re(this,sn))==null||o.continue()}onOnline(){var o;const e=this.observers.find(r=>r.shouldFetchOnReconnect());e==null||e.refetch({cancelRefetch:!1}),(o=re(this,sn))==null||o.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),re(this,Si).notify({type:"observerAdded",query:this,observer:e}))}removeObserver(e){this.observers.includes(e)&&(this.observers=this.observers.filter(o=>o!==e),this.observers.length||(re(this,sn)&&(re(this,Zr)?re(this,sn).cancel({revert:!0}):re(this,sn).cancelRetry()),this.scheduleGc()),re(this,Si).notify({type:"observerRemoved",query:this,observer:e}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||_n(this,Li,wo).call(this,{type:"invalidate"})}async fetch(e,o){var m,h,g,y,v,w,S,A,x,E,D,R;if(this.state.fetchStatus!=="idle"&&((m=re(this,sn))==null?void 0:m.status())!=="rejected"){if(this.state.data!==void 0&&(o!=null&&o.cancelRefetch))this.cancel({silent:!0});else if(re(this,sn))return re(this,sn).continueRetry(),re(this,sn).promise}if(e&&this.setOptions(e),!this.options.queryFn){const _=this.observers.find(N=>N.options.queryFn);_&&this.setOptions(_.options)}const r=new AbortController,l=_=>{Object.defineProperty(_,"signal",{enumerable:!0,get:()=>(Re(this,Zr,!0),r.signal)})},c=()=>{const _=Hb(this.options,o),T=(()=>{const O={client:re(this,Qr),queryKey:this.queryKey,meta:this.meta};return l(O),O})();return Re(this,Zr,!1),this.options.persister?this.options.persister(_,T,this):_(T)},p=(()=>{const _={fetchOptions:o,options:this.options,queryKey:this.queryKey,client:re(this,Qr),state:this.state,fetchFn:c};return l(_),_})();(h=this.options.behavior)==null||h.onFetch(p,this),Re(this,Ja,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((g=p.fetchOptions)==null?void 0:g.meta))&&_n(this,Li,wo).call(this,{type:"fetch",meta:(y=p.fetchOptions)==null?void 0:y.meta}),Re(this,sn,qb({initialPromise:o==null?void 0:o.initialPromise,fn:p.fetchFn,onCancel:_=>{_ instanceof lp&&_.revert&&this.setState({...re(this,Ja),fetchStatus:"idle"}),r.abort()},onFail:(_,N)=>{_n(this,Li,wo).call(this,{type:"failed",failureCount:_,error:N})},onPause:()=>{_n(this,Li,wo).call(this,{type:"pause"})},onContinue:()=>{_n(this,Li,wo).call(this,{type:"continue"})},retry:p.options.retry,retryDelay:p.options.retryDelay,networkMode:p.options.networkMode,canRun:()=>!0}));try{const _=await re(this,sn).start();if(_===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(_),(w=(v=re(this,Si).config).onSuccess)==null||w.call(v,_,this),(A=(S=re(this,Si).config).onSettled)==null||A.call(S,_,this.state.error,this),_}catch(_){if(_ instanceof lp){if(_.silent)return re(this,sn).promise;if(_.revert){if(this.state.data===void 0)throw _;return this.state.data}}throw _n(this,Li,wo).call(this,{type:"error",error:_}),(E=(x=re(this,Si).config).onError)==null||E.call(x,_,this),(R=(D=re(this,Si).config).onSettled)==null||R.call(D,this.state.data,_,this),_}finally{this.scheduleGc()}}},Kr=new WeakMap,Ja=new WeakMap,Si=new WeakMap,Qr=new WeakMap,sn=new WeakMap,El=new WeakMap,Zr=new WeakMap,Li=new WeakSet,wo=function(e){const o=r=>{switch(e.type){case"failed":return{...r,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case"pause":return{...r,fetchStatus:"paused"};case"continue":return{...r,fetchStatus:"fetching"};case"fetch":return{...r,...cE(r.data,this.options),fetchMeta:e.meta??null};case"success":const l={...r,...d1(e.data,e.dataUpdatedAt),dataUpdateCount:r.dataUpdateCount+1,...!e.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return Re(this,Ja,e.manual?l:void 0),l;case"error":const c=e.error;return{...r,error:c,errorUpdateCount:r.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:r.fetchFailureCount+1,fetchFailureReason:c,fetchStatus:"idle",status:"error"};case"invalidate":return{...r,isInvalidated:!0};case"setState":return{...r,...e.state}}};this.state=o(this.state),jn.batch(()=>{this.observers.forEach(r=>{r.onQueryUpdate()}),re(this,Si).notify({query:this,type:"updated",action:e})})},U1);function cE(n,e){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Yb(e.networkMode)?"fetching":"paused",...n===void 0&&{error:null,status:"pending"}}}function d1(n,e){return{data:n,dataUpdatedAt:e??Date.now(),error:null,isInvalidated:!1,status:"success"}}function f1(n){const e=typeof n.initialData=="function"?n.initialData():n.initialData,o=e!==void 0,r=o?typeof n.initialDataUpdatedAt=="function"?n.initialDataUpdatedAt():n.initialDataUpdatedAt:0;return{data:e,dataUpdateCount:0,dataUpdatedAt:o?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:o?"success":"pending",fetchStatus:"idle"}}function h1(n){return{onFetch:(e,o)=>{var g,y,v,w,S;const r=e.options,l=(v=(y=(g=e.fetchOptions)==null?void 0:g.meta)==null?void 0:y.fetchMore)==null?void 0:v.direction,c=((w=e.state.data)==null?void 0:w.pages)||[],d=((S=e.state.data)==null?void 0:S.pageParams)||[];let p={pages:[],pageParams:[]},m=0;const h=async()=>{let A=!1;const x=R=>{Object.defineProperty(R,"signal",{enumerable:!0,get:()=>(e.signal.aborted?A=!0:e.signal.addEventListener("abort",()=>{A=!0}),e.signal)})},E=Hb(e.options,e.fetchOptions),D=async(R,_,N)=>{if(A)return Promise.reject();if(_==null&&R.pages.length)return Promise.resolve(R);const O=(()=>{const X={client:e.client,queryKey:e.queryKey,pageParam:_,direction:N?"backward":"forward",meta:e.options.meta};return x(X),X})(),M=await E(O),{maxPages:$}=e.options,L=N?tE:eE;return{pages:L(R.pages,M,$),pageParams:L(R.pageParams,_,$)}};if(l&&c.length){const R=l==="backward",_=R?uE:p1,N={pages:c,pageParams:d},T=_(r,N);p=await D(N,T,R)}else{const R=n??c.length;do{const _=m===0?d[0]??r.initialPageParam:p1(r,p);if(m>0&&_==null)break;p=await D(p,_),m++}while(m{var A,x;return(x=(A=e.options).persister)==null?void 0:x.call(A,h,{client:e.client,queryKey:e.queryKey,meta:e.options.meta,signal:e.signal},o)}:e.fetchFn=h}}}function p1(n,{pages:e,pageParams:o}){const r=e.length-1;return e.length>0?n.getNextPageParam(e[r],e,o[r],o):void 0}function uE(n,{pages:e,pageParams:o}){var r;return e.length>0?(r=n.getPreviousPageParam)==null?void 0:r.call(n,e[0],e,o[0],o):void 0}var Nl,Ii,Rn,Ir,Fi,lr,G1,dE=(G1=class extends Vb{constructor(e){super();Qe(this,Fi);Qe(this,Nl);Qe(this,Ii);Qe(this,Rn);Qe(this,Ir);Re(this,Nl,e.client),this.mutationId=e.mutationId,Re(this,Rn,e.mutationCache),Re(this,Ii,[]),this.state=e.state||fE(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){re(this,Ii).includes(e)||(re(this,Ii).push(e),this.clearGcTimeout(),re(this,Rn).notify({type:"observerAdded",mutation:this,observer:e}))}removeObserver(e){Re(this,Ii,re(this,Ii).filter(o=>o!==e)),this.scheduleGc(),re(this,Rn).notify({type:"observerRemoved",mutation:this,observer:e})}optionalRemove(){re(this,Ii).length||(this.state.status==="pending"?this.scheduleGc():re(this,Rn).remove(this))}continue(){var e;return((e=re(this,Ir))==null?void 0:e.continue())??this.execute(this.state.variables)}async execute(e){var d,p,m,h,g,y,v,w,S,A,x,E,D,R,_,N,T,O,M,$;const o=()=>{_n(this,Fi,lr).call(this,{type:"continue"})},r={client:re(this,Nl),meta:this.options.meta,mutationKey:this.options.mutationKey};Re(this,Ir,qb({fn:()=>this.options.mutationFn?this.options.mutationFn(e,r):Promise.reject(new Error("No mutationFn found")),onFail:(L,X)=>{_n(this,Fi,lr).call(this,{type:"failed",failureCount:L,error:X})},onPause:()=>{_n(this,Fi,lr).call(this,{type:"pause"})},onContinue:o,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>re(this,Rn).canRun(this)}));const l=this.state.status==="pending",c=!re(this,Ir).canStart();try{if(l)o();else{_n(this,Fi,lr).call(this,{type:"pending",variables:e,isPaused:c}),await((p=(d=re(this,Rn).config).onMutate)==null?void 0:p.call(d,e,this,r));const X=await((h=(m=this.options).onMutate)==null?void 0:h.call(m,e,r));X!==this.state.context&&_n(this,Fi,lr).call(this,{type:"pending",context:X,variables:e,isPaused:c})}const L=await re(this,Ir).start();return await((y=(g=re(this,Rn).config).onSuccess)==null?void 0:y.call(g,L,e,this.state.context,this,r)),await((w=(v=this.options).onSuccess)==null?void 0:w.call(v,L,e,this.state.context,r)),await((A=(S=re(this,Rn).config).onSettled)==null?void 0:A.call(S,L,null,this.state.variables,this.state.context,this,r)),await((E=(x=this.options).onSettled)==null?void 0:E.call(x,L,null,e,this.state.context,r)),_n(this,Fi,lr).call(this,{type:"success",data:L}),L}catch(L){try{throw await((R=(D=re(this,Rn).config).onError)==null?void 0:R.call(D,L,e,this.state.context,this,r)),await((N=(_=this.options).onError)==null?void 0:N.call(_,L,e,this.state.context,r)),await((O=(T=re(this,Rn).config).onSettled)==null?void 0:O.call(T,void 0,L,this.state.variables,this.state.context,this,r)),await(($=(M=this.options).onSettled)==null?void 0:$.call(M,void 0,L,e,this.state.context,r)),L}finally{_n(this,Fi,lr).call(this,{type:"error",error:L})}}finally{re(this,Rn).runNext(this)}}},Nl=new WeakMap,Ii=new WeakMap,Rn=new WeakMap,Ir=new WeakMap,Fi=new WeakSet,lr=function(e){const o=r=>{switch(e.type){case"failed":return{...r,failureCount:e.failureCount,failureReason:e.error};case"pause":return{...r,isPaused:!0};case"continue":return{...r,isPaused:!1};case"pending":return{...r,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:"pending",variables:e.variables,submittedAt:Date.now()};case"success":return{...r,data:e.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...r,data:void 0,error:e.error,failureCount:r.failureCount+1,failureReason:e.error,isPaused:!1,status:"error"}}};this.state=o(this.state),jn.batch(()=>{re(this,Ii).forEach(r=>{r.onMutationUpdate(e)}),re(this,Rn).notify({mutation:this,type:"updated",action:e})})},G1);function fE(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var Ao,Ui,kl,B1,hE=(B1=class extends $u{constructor(e={}){super();Qe(this,Ao);Qe(this,Ui);Qe(this,kl);this.config=e,Re(this,Ao,new Set),Re(this,Ui,new Map),Re(this,kl,0)}build(e,o,r){const l=new dE({client:e,mutationCache:this,mutationId:++Jc(this,kl)._,options:e.defaultMutationOptions(o),state:r});return this.add(l),l}add(e){re(this,Ao).add(e);const o=nu(e);if(typeof o=="string"){const r=re(this,Ui).get(o);r?r.push(e):re(this,Ui).set(o,[e])}this.notify({type:"added",mutation:e})}remove(e){if(re(this,Ao).delete(e)){const o=nu(e);if(typeof o=="string"){const r=re(this,Ui).get(o);if(r)if(r.length>1){const l=r.indexOf(e);l!==-1&&r.splice(l,1)}else r[0]===e&&re(this,Ui).delete(o)}}this.notify({type:"removed",mutation:e})}canRun(e){const o=nu(e);if(typeof o=="string"){const r=re(this,Ui).get(o),l=r==null?void 0:r.find(c=>c.state.status==="pending");return!l||l===e}else return!0}runNext(e){var r;const o=nu(e);if(typeof o=="string"){const l=(r=re(this,Ui).get(o))==null?void 0:r.find(c=>c!==e&&c.state.isPaused);return(l==null?void 0:l.continue())??Promise.resolve()}else return Promise.resolve()}clear(){jn.batch(()=>{re(this,Ao).forEach(e=>{this.notify({type:"removed",mutation:e})}),re(this,Ao).clear(),re(this,Ui).clear()})}getAll(){return Array.from(re(this,Ao))}find(e){const o={exact:!0,...e};return this.getAll().find(r=>l1(o,r))}findAll(e={}){return this.getAll().filter(o=>l1(e,o))}notify(e){jn.batch(()=>{this.listeners.forEach(o=>{o(e)})})}resumePausedMutations(){const e=this.getAll().filter(o=>o.state.isPaused);return jn.batch(()=>Promise.all(e.map(o=>o.continue().catch(ji))))}},Ao=new WeakMap,Ui=new WeakMap,kl=new WeakMap,B1);function nu(n){var e;return(e=n.options.scope)==null?void 0:e.id}var Pi,H1,pE=(H1=class extends $u{constructor(e={}){super();Qe(this,Pi);this.config=e,Re(this,Pi,new Map)}build(e,o,r){const l=o.queryKey,c=o.queryHash??Tp(l,o);let d=this.get(c);return d||(d=new lE({client:e,queryKey:l,queryHash:c,options:e.defaultQueryOptions(o),state:r,defaultOptions:e.getQueryDefaults(l)}),this.add(d)),d}add(e){re(this,Pi).has(e.queryHash)||(re(this,Pi).set(e.queryHash,e),this.notify({type:"added",query:e}))}remove(e){const o=re(this,Pi).get(e.queryHash);o&&(e.destroy(),o===e&&re(this,Pi).delete(e.queryHash),this.notify({type:"removed",query:e}))}clear(){jn.batch(()=>{this.getAll().forEach(e=>{this.remove(e)})})}get(e){return re(this,Pi).get(e)}getAll(){return[...re(this,Pi).values()]}find(e){const o={exact:!0,...e};return this.getAll().find(r=>s1(o,r))}findAll(e={}){const o=this.getAll();return Object.keys(e).length>0?o.filter(r=>s1(e,r)):o}notify(e){jn.batch(()=>{this.listeners.forEach(o=>{o(e)})})}onFocus(){jn.batch(()=>{this.getAll().forEach(e=>{e.onFocus()})})}onOnline(){jn.batch(()=>{this.getAll().forEach(e=>{e.onOnline()})})}},Pi=new WeakMap,H1),kt,gr,yr,Wa,es,vr,ts,ns,$1,mE=($1=class{constructor(n={}){Qe(this,kt);Qe(this,gr);Qe(this,yr);Qe(this,Wa);Qe(this,es);Qe(this,vr);Qe(this,ts);Qe(this,ns);Re(this,kt,n.queryCache||new pE),Re(this,gr,n.mutationCache||new hE),Re(this,yr,n.defaultOptions||{}),Re(this,Wa,new Map),Re(this,es,new Map),Re(this,vr,0)}mount(){Jc(this,vr)._++,re(this,vr)===1&&(Re(this,ts,$b.subscribe(async n=>{n&&(await this.resumePausedMutations(),re(this,kt).onFocus())})),Re(this,ns,_u.subscribe(async n=>{n&&(await this.resumePausedMutations(),re(this,kt).onOnline())})))}unmount(){var n,e;Jc(this,vr)._--,re(this,vr)===0&&((n=re(this,ts))==null||n.call(this),Re(this,ts,void 0),(e=re(this,ns))==null||e.call(this),Re(this,ns,void 0))}isFetching(n){return re(this,kt).findAll({...n,fetchStatus:"fetching"}).length}isMutating(n){return re(this,gr).findAll({...n,status:"pending"}).length}getQueryData(n){var o;const e=this.defaultQueryOptions({queryKey:n});return(o=re(this,kt).get(e.queryHash))==null?void 0:o.state.data}ensureQueryData(n){const e=this.defaultQueryOptions(n),o=re(this,kt).build(this,e),r=o.state.data;return r===void 0?this.fetchQuery(n):(n.revalidateIfStale&&o.isStaleByTime(ap(e.staleTime,o))&&this.prefetchQuery(e),Promise.resolve(r))}getQueriesData(n){return re(this,kt).findAll(n).map(({queryKey:e,state:o})=>{const r=o.data;return[e,r]})}setQueryData(n,e,o){const r=this.defaultQueryOptions({queryKey:n}),l=re(this,kt).get(r.queryHash),c=l==null?void 0:l.state.data,d=QC(e,c);if(d!==void 0)return re(this,kt).build(this,r).setData(d,{...o,manual:!0})}setQueriesData(n,e,o){return jn.batch(()=>re(this,kt).findAll(n).map(({queryKey:r})=>[r,this.setQueryData(r,e,o)]))}getQueryState(n){var o;const e=this.defaultQueryOptions({queryKey:n});return(o=re(this,kt).get(e.queryHash))==null?void 0:o.state}removeQueries(n){const e=re(this,kt);jn.batch(()=>{e.findAll(n).forEach(o=>{e.remove(o)})})}resetQueries(n,e){const o=re(this,kt);return jn.batch(()=>(o.findAll(n).forEach(r=>{r.reset()}),this.refetchQueries({type:"active",...n},e)))}cancelQueries(n,e={}){const o={revert:!0,...e},r=jn.batch(()=>re(this,kt).findAll(n).map(l=>l.cancel(o)));return Promise.all(r).then(ji).catch(ji)}invalidateQueries(n,e={}){return jn.batch(()=>(re(this,kt).findAll(n).forEach(o=>{o.invalidate()}),(n==null?void 0:n.refetchType)==="none"?Promise.resolve():this.refetchQueries({...n,type:(n==null?void 0:n.refetchType)??(n==null?void 0:n.type)??"active"},e)))}refetchQueries(n,e={}){const o={...e,cancelRefetch:e.cancelRefetch??!0},r=jn.batch(()=>re(this,kt).findAll(n).filter(l=>!l.isDisabled()&&!l.isStatic()).map(l=>{let c=l.fetch(void 0,o);return o.throwOnError||(c=c.catch(ji)),l.state.fetchStatus==="paused"?Promise.resolve():c}));return Promise.all(r).then(ji)}fetchQuery(n){const e=this.defaultQueryOptions(n);e.retry===void 0&&(e.retry=!1);const o=re(this,kt).build(this,e);return o.isStaleByTime(ap(e.staleTime,o))?o.fetch(e):Promise.resolve(o.state.data)}prefetchQuery(n){return this.fetchQuery(n).then(ji).catch(ji)}fetchInfiniteQuery(n){return n.behavior=h1(n.pages),this.fetchQuery(n)}prefetchInfiniteQuery(n){return this.fetchInfiniteQuery(n).then(ji).catch(ji)}ensureInfiniteQueryData(n){return n.behavior=h1(n.pages),this.ensureQueryData(n)}resumePausedMutations(){return _u.isOnline()?re(this,gr).resumePausedMutations():Promise.resolve()}getQueryCache(){return re(this,kt)}getMutationCache(){return re(this,gr)}getDefaultOptions(){return re(this,yr)}setDefaultOptions(n){Re(this,yr,n)}setQueryDefaults(n,e){re(this,Wa).set(bl(n),{queryKey:n,defaultOptions:e})}getQueryDefaults(n){const e=[...re(this,Wa).values()],o={};return e.forEach(r=>{wl(n,r.queryKey)&&Object.assign(o,r.defaultOptions)}),o}setMutationDefaults(n,e){re(this,es).set(bl(n),{mutationKey:n,defaultOptions:e})}getMutationDefaults(n){const e=[...re(this,es).values()],o={};return e.forEach(r=>{wl(n,r.mutationKey)&&Object.assign(o,r.defaultOptions)}),o}defaultQueryOptions(n){if(n._defaulted)return n;const e={...re(this,yr).queries,...this.getQueryDefaults(n.queryKey),...n,_defaulted:!0};return e.queryHash||(e.queryHash=Tp(e.queryKey,e)),e.refetchOnReconnect===void 0&&(e.refetchOnReconnect=e.networkMode!=="always"),e.throwOnError===void 0&&(e.throwOnError=!!e.suspense),!e.networkMode&&e.persister&&(e.networkMode="offlineFirst"),e.queryFn===Dp&&(e.enabled=!1),e}defaultMutationOptions(n){return n!=null&&n._defaulted?n:{...re(this,yr).mutations,...(n==null?void 0:n.mutationKey)&&this.getMutationDefaults(n.mutationKey),...n,_defaulted:!0}}clear(){re(this,kt).clear(),re(this,gr).clear()}},kt=new WeakMap,gr=new WeakMap,yr=new WeakMap,Wa=new WeakMap,es=new WeakMap,vr=new WeakMap,ts=new WeakMap,ns=new WeakMap,$1);function m1(n,e){if(typeof n=="function")return n(e);n!=null&&(n.current=e)}function gE(...n){return e=>{let o=!1;const r=n.map(l=>{const c=m1(l,e);return!o&&typeof c=="function"&&(o=!0),c});if(o)return()=>{for(let l=0;l{let{children:c,...d}=r;Xb(c)&&typeof Cu=="function"&&(c=Cu(c._payload));const p=ne.Children.toArray(c),m=p.find(AE);if(m){const h=m.props.children,g=p.map(y=>y===m?ne.Children.count(h)>1?ne.Children.only(null):ne.isValidElement(h)?h.props.children:null:y);return z.jsx(e,{...d,ref:l,children:ne.isValidElement(h)?ne.cloneElement(h,void 0,g):null})}return z.jsx(e,{...d,ref:l,children:c})});return o.displayName=`${n}.Slot`,o}var wE=bE("Slot");function xE(n){const e=ne.forwardRef((o,r)=>{let{children:l,...c}=o;if(Xb(l)&&typeof Cu=="function"&&(l=Cu(l._payload)),ne.isValidElement(l)){const d=CE(l),p=_E(c,l.props);return l.type!==ne.Fragment&&(p.ref=r?gE(r,d):d),ne.cloneElement(l,p)}return ne.Children.count(l)>1?ne.Children.only(null):null});return e.displayName=`${n}.SlotClone`,e}var SE=Symbol("radix.slottable");function AE(n){return ne.isValidElement(n)&&typeof n.type=="function"&&"__radixId"in n.type&&n.type.__radixId===SE}function _E(n,e){const o={...e};for(const r in e){const l=n[r],c=e[r];/^on[A-Z]/.test(r)?l&&c?o[r]=(...p)=>{const m=c(...p);return l(...p),m}:l&&(o[r]=l):r==="style"?o[r]={...l,...c}:r==="className"&&(o[r]=[l,c].filter(Boolean).join(" "))}return{...n,...o}}function CE(n){var r,l;let e=(r=Object.getOwnPropertyDescriptor(n.props,"ref"))==null?void 0:r.get,o=e&&"isReactWarning"in e&&e.isReactWarning;return o?n.ref:(e=(l=Object.getOwnPropertyDescriptor(n,"ref"))==null?void 0:l.get,o=e&&"isReactWarning"in e&&e.isReactWarning,o?n.props.ref:n.props.ref||n.ref)}function Kb(n){var e,o,r="";if(typeof n=="string"||typeof n=="number")r+=n;else if(typeof n=="object")if(Array.isArray(n)){var l=n.length;for(e=0;etypeof n=="boolean"?`${n}`:n===0?"0":n,y1=Qb,Zb=(n,e)=>o=>{var r;if((e==null?void 0:e.variants)==null)return y1(n,o==null?void 0:o.class,o==null?void 0:o.className);const{variants:l,defaultVariants:c}=e,d=Object.keys(l).map(h=>{const g=o==null?void 0:o[h],y=c==null?void 0:c[h];if(g===null)return null;const v=g1(g)||g1(y);return l[h][v]}),p=o&&Object.entries(o).reduce((h,g)=>{let[y,v]=g;return v===void 0||(h[y]=v),h},{}),m=e==null||(r=e.compoundVariants)===null||r===void 0?void 0:r.reduce((h,g)=>{let{class:y,className:v,...w}=g;return Object.entries(w).every(S=>{let[A,x]=S;return Array.isArray(x)?x.includes({...c,...p}[A]):{...c,...p}[A]===x})?[...h,y,v]:h},[]);return y1(n,d,m,o==null?void 0:o.class,o==null?void 0:o.className)};var Ib=Object.defineProperty,EE=Object.getOwnPropertyNames,NE=(n,e,o)=>e in n?Ib(n,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):n[e]=o,Mt=(n,e)=>function(){return n&&(e=(0,n[EE(n)[0]])(n=0)),e},Mp=(n,e)=>{for(var o in e)Ib(n,o,{get:e[o],enumerable:!0})},cp=(n,e,o)=>NE(n,typeof e!="symbol"?e+"":e,o),kE=Mt({"src/core/types.ts"(){}}),qu={};Mp(qu,{ZOOM_EXIT_THRESHOLD:()=>Zu,ZOOM_TRANSITION_THRESHOLD:()=>Qu,isZoomTransitioningAtom:()=>Fu,panAtom:()=>nn,resetViewportAtom:()=>zl,screenToWorldAtom:()=>Vu,setZoomAtom:()=>Ku,viewportRectAtom:()=>Zn,worldToScreenAtom:()=>Xu,zoomAtom:()=>Tt,zoomFocusNodeIdAtom:()=>Iu,zoomTransitionProgressAtom:()=>xl});var Tt,nn,Zn,Vu,Xu,Ku,zl,Qu,Zu,Iu,xl,Fu,cn=Mt({"src/core/viewport-store.ts"(){Tt=K(1),nn=K({x:0,y:0}),Zn=K(null),Vu=K(n=>(e,o)=>{const r=n(nn),l=n(Tt),c=n(Zn);if(!c)return{x:e,y:o};const d=e-c.left,p=o-c.top;return{x:(d-r.x)/l,y:(p-r.y)/l}}),Xu=K(n=>(e,o)=>{const r=n(nn),l=n(Tt),c=n(Zn);return c?{x:e*l+r.x+c.left,y:o*l+r.y+c.top}:{x:e,y:o}}),Ku=K(null,(n,e,{zoom:o,centerX:r,centerY:l})=>{const c=n(Tt),d=n(nn),p=n(Zn),m=Math.max(.1,Math.min(5,o));if(r!==void 0&&l!==void 0&&p){const h=r-p.left,g=l-p.top,y=(h-d.x)/c,v=(g-d.y)/c,w=h-y*m,S=g-v*m;e(nn,{x:w,y:S})}e(Tt,m)}),zl=K(null,(n,e)=>{e(Tt,1),e(nn,{x:0,y:0})}),Qu=3.5,Zu=2,Iu=K(null),xl=K(0),Fu=K(n=>{const e=n(xl);return e>0&&e<1})}});function ln(n){return $3(`${Fb}:${n}`)}var Fb,Mo=Mt({"src/utils/debug.ts"(){Fb="canvas",ln("graph:node"),ln("graph:edge"),ln("graph:sync"),ln("ui:selection"),ln("ui:drag"),ln("ui:resize"),ln("sync:status"),ln("sync:mutations"),ln("sync:queue"),ln("viewport")}}),gt,iu,wr,ze,en,xi,Qn,zp,up,dp,Pb,Qa,Gi,pl,fp,ls,Sl,Op,Al,Jb,Rp,jp,Lp,Up,Wb,Gp,Bp,e2,t2,n2,Zt=Mt({"src/core/graph-store.ts"(){cn(),Mo(),gt=ln("graph"),iu={type:"directed",multi:!0,allowSelfLoops:!0},wr=K(null),ze=K(new We(iu)),en=K(0),xi=Mh(n=>K(e=>{e(Qn);const o=e(ze);return o.hasNode(n)?{x:o.getNodeAttribute(n,"x"),y:o.getNodeAttribute(n,"y")}:{x:0,y:0}})),Qn=K(0),zp=K(null,(n,e,{nodeId:o,position:r})=>{const l=n(ze);l.hasNode(o)&&(gt("Updating node %s position to %o",o,r),l.setNodeAttribute(o,"x",r.x),l.setNodeAttribute(o,"y",r.y),e(Qn,c=>c+1))}),up=K(null,(n,e,o)=>{xi.remove(o),gt("Removed position atom for node: %s",o)}),dp=K(null,(n,e)=>{const r=n(ze).nodes();r.forEach(l=>{xi.remove(l)}),gt("Removed %d position atoms",r.length)}),Pb=K(null,(n,e)=>{gt("Clearing graph for switch"),e(dp);const o=new We(iu);e(ze,o),e(en,r=>r+1)}),Qa=K({isCreating:!1,sourceNodeId:null,sourceNodePosition:null,targetPosition:null,hoveredTargetNodeId:null,sourceHandle:null,targetHandle:null,sourcePort:null,targetPort:null,snappedTargetPosition:null}),Gi=K(null),pl=K(null),fp=K(n=>{n(en);const e=n(ze);let o=0;return e.forEachNode((r,l)=>{l.zIndex>o&&(o=l.zIndex)}),o}),ls=K(n=>{n(en);const e=n(ze),o=n(Gi),r=[];return e.forEachNode((l,c)=>{const d=n(xi(l));r.push({...c,id:l,position:d,isDragging:l===o})}),r}),Sl=K(n=>(n(en),n(ze).nodes())),Op=Mh(n=>K(e=>{e(en);const o=e(ze);if(!o.hasNode(n))return null;const r=o.getNodeAttributes(n),l=e(xi(n)),c=e(Gi);return{...r,id:n,position:l,isDragging:n===c}}),(n,e)=>n===e),Al=K(n=>(n(en),n(ze).edges())),Jb=K(n=>{const e=n(Al);return n(Qa).isCreating?[...e,"temp-creating-edge"]:e}),Rp=Mh(n=>K(e=>{if(e(Qn),n==="temp-creating-edge"){const g=e(Qa),y=e(ze);if(g.isCreating&&g.sourceNodeId&&g.targetPosition){const v=y.getNodeAttributes(g.sourceNodeId),w=e(xi(g.sourceNodeId)),S=e(nn),A=e(Tt),x=e(Zn);if(v&&x){const E=g.targetPosition.x-x.left,D=g.targetPosition.y-x.top,R=(E-S.x)/A,_=(D-S.y)/A;return{key:"temp-creating-edge",sourceId:g.sourceNodeId,targetId:"temp-cursor",sourcePosition:w,targetPosition:{x:R,y:_},sourceNodeSize:v.size,sourceNodeWidth:v.width,sourceNodeHeight:v.height,targetNodeSize:0,targetNodeWidth:0,targetNodeHeight:0,type:"dashed",color:"#FF9800",weight:2,label:void 0,dbData:{id:"temp-creating-edge",graph_id:e(wr)||"",source_node_id:g.sourceNodeId,target_node_id:"temp-cursor",edge_type:"temp",filter_condition:null,ui_properties:null,data:null,created_at:new Date().toISOString(),updated_at:new Date().toISOString()}}}}return null}const o=e(ze);if(!o.hasEdge(n))return null;const r=o.source(n),l=o.target(n),c=o.getEdgeAttributes(n),d=o.getNodeAttributes(r),p=o.getNodeAttributes(l),m=e(xi(r)),h=e(xi(l));return d&&p?{...c,key:n,sourceId:r,targetId:l,sourcePosition:m,targetPosition:h,sourceNodeSize:d.size,targetNodeSize:p.size,sourceNodeWidth:d.width??d.size,sourceNodeHeight:d.height??d.size,targetNodeWidth:p.width??p.size,targetNodeHeight:p.height??p.size}:null}),(n,e)=>n===e),jp=K(null,(n,e,{nodeId:o})=>{const r=n(ze);if(!r.hasNode(o))return;const l=r.getNodeAttributes(o);e(pl,JSON.parse(JSON.stringify(l)));const d=n(fp)+1;r.setNodeAttribute(o,"zIndex",d),e(Gi,o)}),Lp=K(null,(n,e,o)=>{const r=n(Gi);r&>("Node %s drag ended",r),e(Gi,null),e(pl,null)}),Up=K(null,(n,e,{nodeId:o})=>{const r=n(ze);r.hasNode(o)&&(r.dropNode(o),e(up,o),e(ze,r.copy()),gt("Optimistically deleted node %s",o))}),Wb=K(null,(n,e,{edgeKey:o})=>{const r=n(ze);r.hasEdge(o)&&(r.dropEdge(o),e(ze,r.copy()),gt("Optimistically deleted edge %s",o))}),Gp=K(null,(n,e,o)=>{const r=n(ze);if(r.hasNode(o.id)){gt("Node %s already exists, skipping",o.id);return}const l=o.ui_properties||{},c={x:typeof l.x=="number"?l.x:Math.random()*800,y:typeof l.y=="number"?l.y:Math.random()*600,size:typeof l.size=="number"?l.size:15,width:typeof l.width=="number"?l.width:500,height:typeof l.height=="number"?l.height:500,color:typeof l.color=="string"?l.color:"#ccc",label:o.label||o.node_type||o.id,zIndex:typeof l.zIndex=="number"?l.zIndex:0,dbData:o};gt("Adding node %s to local graph at (%d, %d)",o.id,c.x,c.y),r.addNode(o.id,c),e(ze,r.copy()),e(en,d=>d+1),e(Qn,d=>d+1)}),Bp=K(null,(n,e,o)=>{const r=n(ze);if(r.hasNode(o.source_node_id)&&r.hasNode(o.target_node_id)){const l=o.ui_properties||{},c={type:typeof l.style=="string"?l.style:"solid",color:typeof l.color=="string"?l.color:"#999",label:o.edge_type??void 0,weight:typeof l.weight=="number"?l.weight:1,dbData:o};if(!r.hasEdge(o.id))try{gt("Adding edge %s to local graph",o.id),r.addEdgeWithKey(o.id,o.source_node_id,o.target_node_id,c),e(ze,r.copy()),e(en,d=>d+1)}catch(d){gt("Failed to add edge %s: %o",o.id,d)}}}),e2=K(null,(n,e,o)=>{const r=n(ze);r.hasEdge(o)&&(r.dropEdge(o),e(ze,r.copy()),e(en,l=>l+1))}),t2=K(null,(n,e,{tempEdgeId:o,newEdge:r})=>{const l=n(ze);if(l.hasEdge(o)&&l.dropEdge(o),l.hasNode(r.source_node_id)&&l.hasNode(r.target_node_id)){const c=r.ui_properties||{},d={type:typeof c.style=="string"?c.style:"solid",color:typeof c.color=="string"?c.color:"#999",label:r.edge_type??void 0,weight:typeof c.weight=="number"?c.weight:1,dbData:r};if(!l.hasEdge(r.id))try{gt("Atomically swapping temp edge %s with real edge %s",o,r.id),l.addEdgeWithKey(r.id,r.source_node_id,r.target_node_id,d)}catch(p){gt("Failed to add edge %s: %o",r.id,p)}}e(ze,l.copy()),e(en,c=>c+1)}),n2=K(null,(n,e,o,r)=>{gt("========== START SYNC =========="),gt("Fetched nodes: %d, edges: %d",o.length,r.length);const l=n(wr);if(o.length>0&&o[0].graph_id!==l){gt("Skipping sync - data belongs to different graph");return}const c=n(ze);if(n(Gi)!==null){gt("Skipping sync - drag in progress");return}const p=new Set(c.nodes()),m=new Set(o.map(v=>v.id)),h=Array.from(p).some(v=>m.has(v));let g;h&&p.size>0?(gt("Merging DB data into existing graph"),g=c.copy()):(gt("Creating fresh graph (graph switch detected)"),g=new We(iu));const y=new Set(r.map(v=>v.id));h&&p.size>0&&g.forEachNode(v=>{m.has(v)||(gt("Removing deleted node: %s",v),g.dropNode(v),xi.remove(v))}),o.forEach(v=>{const w=v.ui_properties||{},S=typeof w.x=="number"?w.x:Math.random()*800,A=typeof w.y=="number"?w.y:Math.random()*600;if(g.hasNode(v.id)){const x=g.getNodeAttributes(v.id),E={x:S,y:A,size:typeof w.size=="number"?w.size:x.size,width:typeof w.width=="number"?w.width:x.width??500,height:typeof w.height=="number"?w.height:x.height??500,color:typeof w.color=="string"?w.color:x.color,label:v.label||v.node_type||v.id,zIndex:typeof w.zIndex=="number"?w.zIndex:x.zIndex,dbData:v};g.replaceNodeAttributes(v.id,E)}else{const x={x:S,y:A,size:typeof w.size=="number"?w.size:15,width:typeof w.width=="number"?w.width:500,height:typeof w.height=="number"?w.height:500,color:typeof w.color=="string"?w.color:"#ccc",label:v.label||v.node_type||v.id,zIndex:typeof w.zIndex=="number"?w.zIndex:0,dbData:v};g.addNode(v.id,x)}}),g.forEachEdge(v=>{y.has(v)||(gt("Removing deleted edge: %s",v),g.dropEdge(v))}),r.forEach(v=>{if(g.hasNode(v.source_node_id)&&g.hasNode(v.target_node_id)){const w=v.ui_properties||{},S={type:typeof w.style=="string"?w.style:"solid",color:typeof w.color=="string"?w.color:"#999",label:v.edge_type??void 0,weight:typeof w.weight=="number"?w.weight:1,dbData:v};if(g.hasEdge(v.id))g.replaceEdgeAttributes(v.id,S);else try{g.addEdgeWithKey(v.id,v.source_node_id,v.target_node_id,S)}catch(A){gt("Failed to add edge %s: %o",v.id,A)}}}),e(ze,g),e(en,v=>v+1),gt("========== SYNC COMPLETE =========="),gt("Final graph: %d nodes, %d edges",g.order,g.size)})}}),rr,tt,_o,Hp,Pu,$p,cs,Ol,i2,Ju,Yp,qp,Vp,Tn=Mt({"src/core/selection-store.ts"(){Mo(),rr=ln("selection"),tt=K(new Set),_o=K(null),Hp=K(null,(n,e,{nodeId:o,isShiftPressed:r})=>{const l=n(tt);if(rr("handleNodePointerDownSelection: nodeId=%s, shift=%s, current=%o",o,r,Array.from(l)),e(_o,null),r){const c=new Set(l);c.has(o)?c.delete(o):c.add(o),rr("Shift-click, setting selection to: %o",Array.from(c)),e(tt,c)}else l.has(o)?rr("Node already selected, preserving multi-select"):(rr("Node not in selection, selecting: %s",o),e(tt,new Set([o])))}),Pu=K(null,(n,e,o)=>{if(rr("selectSingleNode: %s",o),e(_o,null),o==null)rr("Clearing selection"),e(tt,new Set);else{const r=n(tt);if(r.has(o)&&r.size===1)return;e(tt,new Set([o]))}}),$p=K(null,(n,e,o)=>{const r=n(tt),l=new Set(r);l.has(o)?l.delete(o):l.add(o),e(tt,l)}),cs=K(null,(n,e)=>{rr("clearSelection"),e(tt,new Set)}),Ol=K(null,(n,e,o)=>{const r=n(tt),l=new Set(r);for(const c of o)l.add(c);e(tt,l)}),i2=K(null,(n,e,o)=>{const r=n(tt),l=new Set(r);for(const c of o)l.delete(c);e(tt,l)}),Ju=K(null,(n,e,o)=>{e(_o,o),o!==null&&e(tt,new Set)}),Yp=K(null,(n,e)=>{e(_o,null)}),qp=K(n=>n(tt).size),Vp=K(n=>n(tt).size>0)}}),zi,ai,Ri,qr,xo,uu,wi,o2,Wu,ed,r2,a2,s2,l2,c2,u2,d2,zo=Mt({"src/core/sync-store.ts"(){Mo(),zi=ln("sync"),ai=K("synced"),Ri=K(0),qr=K(typeof navigator<"u"?navigator.onLine:!0),xo=K(null),uu=K(Date.now()),wi=K([]),o2=K(n=>({status:n(ai),pendingMutations:n(Ri),lastError:n(xo),lastSyncTime:n(uu),isOnline:n(qr),queuedMutations:n(wi).length})),Wu=K(null,(n,e)=>{const o=n(Ri),r=o+1;e(Ri,r),zi("Mutation started. Pending count: %d -> %d",o,r),r>0&&n(ai)!=="syncing"&&(e(ai,"syncing"),zi("Status -> syncing"))}),ed=K(null,(n,e,o=!0)=>{const r=n(Ri),l=Math.max(0,r-1);if(e(Ri,l),zi("Mutation completed (success: %s). Pending count: %d -> %d",o,r,l),o&&(e(uu,Date.now()),l===0&&e(xo,null)),l===0){const c=n(qr);n(xo)!==null?(e(ai,"error"),zi("Status -> error")):c?(e(ai,"synced"),zi("Status -> synced")):(e(ai,"offline"),zi("Status -> offline"))}}),r2=K(null,(n,e,o)=>{e(xo,o),zi("Mutation failed: %s",o)}),a2=K(null,(n,e,o)=>{e(qr,o);const r=n(Ri),l=n(xo)!==null,c=n(wi).length;r===0&&(l||c>0?e(ai,"error"):e(ai,o?"synced":"offline"))}),s2=K(null,(n,e,o)=>{const r=n(wi),l={...o,id:crypto.randomUUID(),timestamp:Date.now(),retryCount:0,maxRetries:o.maxRetries??3},c=[...r,l];return e(wi,c),zi("Queued mutation: %s. Queue size: %d",o.type,c.length),n(Ri)===0&&e(ai,"error"),l.id}),l2=K(null,(n,e,o)=>{const l=n(wi).filter(c=>c.id!==o);e(wi,l),zi("Dequeued mutation: %s. Queue size: %d",o,l.length),l.length===0&&n(Ri)===0&&n(xo)===null&&e(ai,n(qr)?"synced":"offline")}),c2=K(null,(n,e,o)=>{const l=n(wi).map(c=>c.id===o?{...c,retryCount:c.retryCount+1}:c);e(wi,l)}),u2=K(n=>n(wi).find(o=>o.retryCount{e(wi,[]),zi("Cleared mutation queue"),n(Ri)===0&&n(xo)===null&&e(ai,n(qr)?"synced":"offline")})}}),cr,dl,du,f2,h2,p2,m2,g2,y2,v2,b2,TE=Mt({"src/core/interaction-store.ts"(){cr=K({type:"normal"}),dl=K(null),du=K(null),f2=K(null,(n,e)=>{e(cr,{type:"normal"}),e(dl,null),e(du,null)}),h2=K(null,(n,e,o)=>{e(cr,{type:"pickNode",...o})}),p2=K(null,(n,e,o)=>{e(cr,{type:"pickNodes",...o})}),m2=K(null,(n,e,o)=>{e(cr,{type:"pickPoint",...o})}),g2=K(null,(n,e,o)=>{e(du,o)}),y2=K(null,(n,e,o)=>{const r=n(dl);e(dl,{...r,...o})}),v2=K(n=>n(cr).type!=="normal"),b2=K(n=>{const e=n(cr);return e.type==="pickNode"||e.type==="pickNodes"})}}),fr,w2,ur,fl,Xp,Kp,x2,S2,A2,_2,Qp=Mt({"src/core/locked-node-store.ts"(){Zt(),fr=K(null),w2=K(n=>{const e=n(fr);return e&&n(ls).find(r=>r.id===e)||null}),ur=K(0),fl=K(1),Xp=K(null,(n,e,o)=>{e(fr,o.nodeId),e(ur,0)}),Kp=K(null,(n,e)=>{e(fr,null)}),x2=K(null,(n,e)=>{const o=n(ur),r=n(fl);e(ur,(o+1)%r)}),S2=K(null,(n,e)=>{const o=n(ur),r=n(fl);e(ur,(o-1+r)%r)}),A2=K(null,(n,e,o)=>{const r=n(fl);o>=0&&on(fr)!==null)}});function DE(n,e){ea.set(n,e)}function ME(n){for(const[e,o]of Object.entries(n))ea.set(e,o)}function zE(n){if(n)return ea.get(n)}function OE(n){return n?ea.has(n):!1}function RE(){return Array.from(ea.keys())}function jE(){ea.clear()}var ea,C2,E2=Mt({"src/core/node-type-registry.tsx"(){ea=new Map,C2=n=>{const e=Oe.c(11),{nodeData:o}=n;let r;e[0]===Symbol.for("react.memo_cache_sentinel")?(r={padding:"12px",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%",color:"#666",fontSize:"12px"},e[0]=r):r=e[0];const l=o.dbData.node_type||"none";let c;e[1]!==l?(c=z.jsxs("div",{children:["Unknown type: ",l]}),e[1]=l,e[2]=c):c=e[2];let d;e[3]===Symbol.for("react.memo_cache_sentinel")?(d={marginTop:"4px",opacity:.7},e[3]=d):d=e[3];let p;e[4]!==o.id?(p=o.id.substring(0,8),e[4]=o.id,e[5]=p):p=e[5];let m;e[6]!==p?(m=z.jsx("div",{style:d,children:p}),e[6]=p,e[7]=m):m=e[7];let h;return e[8]!==c||e[9]!==m?(h=z.jsxs("div",{style:r,children:[c,m]}),e[8]=c,e[9]=m,e[10]=h):h=e[10],h}}});function hp(n,e){switch(e.type){case"move-node":return n.hasNode(e.nodeId)&&(n.setNodeAttribute(e.nodeId,"x",e.to.x),n.setNodeAttribute(e.nodeId,"y",e.to.y)),!1;case"resize-node":return n.hasNode(e.nodeId)&&(n.setNodeAttribute(e.nodeId,"width",e.to.width),n.setNodeAttribute(e.nodeId,"height",e.to.height)),!1;case"add-node":return n.hasNode(e.nodeId)?!1:(n.addNode(e.nodeId,e.attributes),!0);case"remove-node":return n.hasNode(e.nodeId)?(n.dropNode(e.nodeId),!0):!1;case"add-edge":return n.hasEdge(e.edgeId)||!n.hasNode(e.source)||!n.hasNode(e.target)?!1:(n.addEdgeWithKey(e.edgeId,e.source,e.target,e.attributes),!0);case"remove-edge":return n.hasEdge(e.edgeId)?(n.dropEdge(e.edgeId),!0):!1;case"update-node-attr":return n.hasNode(e.nodeId)&&n.setNodeAttribute(e.nodeId,e.key,e.to),!1;case"batch":{let o=!1;for(const r of e.deltas)hp(n,r)&&(o=!0);return o}case"full-snapshot":{n.clear();for(const o of e.nodes)n.addNode(o.id,o.attributes);for(const o of e.edges)n.hasNode(o.source)&&n.hasNode(o.target)&&n.addEdgeWithKey(o.id,o.source,o.target,o.attributes);return!0}}}function N2(n){switch(n.type){case"move-node":return{...n,from:n.to,to:n.from};case"resize-node":return{...n,from:n.to,to:n.from};case"add-node":return{type:"remove-node",nodeId:n.nodeId,attributes:n.attributes,connectedEdges:[]};case"remove-node":const e=[{type:"add-node",nodeId:n.nodeId,attributes:n.attributes},...n.connectedEdges.map(o=>({type:"add-edge",edgeId:o.id,source:o.source,target:o.target,attributes:o.attributes}))];return e.length===1?e[0]:{type:"batch",deltas:e};case"add-edge":return{type:"remove-edge",edgeId:n.edgeId,source:n.source,target:n.target,attributes:n.attributes};case"remove-edge":return{type:"add-edge",edgeId:n.edgeId,source:n.source,target:n.target,attributes:n.attributes};case"update-node-attr":return{...n,from:n.to,to:n.from};case"batch":return{type:"batch",deltas:n.deltas.map(N2).reverse()};case"full-snapshot":return n}}function jh(n,e){const o=[],r=[];return n.forEachNode((l,c)=>{o.push({id:l,attributes:{...c}})}),n.forEachEdge((l,c,d,p)=>{r.push({id:l,source:d,target:p,attributes:{...c}})}),{timestamp:Date.now(),label:e,nodes:o,edges:r}}var $a,Lh,Kt,td,nd,Zp,Ip,k2,us,Rl,jl,Fp,Pp,ds=Mt({"src/core/history-store.ts"(){Zt(),Mo(),$a=ln("history"),Lh=50,Kt=K({past:[],future:[],isApplying:!1}),td=K(n=>{const e=n(Kt);return e.past.length>0&&!e.isApplying}),nd=K(n=>{const e=n(Kt);return e.future.length>0&&!e.isApplying}),Zp=K(n=>n(Kt).past.length),Ip=K(n=>n(Kt).future.length),k2=K(null,(n,e,o)=>{const r=n(Kt);if(r.isApplying)return;const{label:l,...c}=o,d={forward:c,reverse:N2(c),timestamp:Date.now(),label:l},p=[...r.past,d];p.length>Lh&&p.shift(),e(Kt,{past:p,future:[],isApplying:!1}),$a("Pushed delta: %s (past: %d)",l||o.type,p.length)}),us=K(null,(n,e,o)=>{const r=n(Kt);if(r.isApplying)return;const l=n(ze),c=jh(l,o),d={type:"full-snapshot",nodes:c.nodes,edges:c.edges},p={forward:d,reverse:d,timestamp:Date.now(),label:o},m=[...r.past,p];m.length>Lh&&m.shift(),e(Kt,{past:m,future:[],isApplying:!1}),$a("Pushed snapshot: %s (past: %d)",o||"unnamed",m.length)}),Rl=K(null,(n,e)=>{const o=n(Kt);if(o.past.length===0||o.isApplying)return!1;e(Kt,{...o,isApplying:!0});try{const r=n(ze),l=[...o.past],c=l.pop();let d=c.forward;if(c.reverse.type==="full-snapshot"){const h=jh(r,"current");d={type:"full-snapshot",nodes:h.nodes,edges:h.edges}}hp(r,c.reverse)&&(e(ze,r),e(en,h=>h+1)),e(Qn,h=>h+1);const m={forward:d,reverse:c.reverse,timestamp:c.timestamp,label:c.label};return e(Kt,{past:l,future:[m,...o.future],isApplying:!1}),$a("Undo: %s (past: %d, future: %d)",c.label,l.length,o.future.length+1),!0}catch(r){return console.error("[History] Undo failed:",r),e(Kt,{...o,isApplying:!1}),!1}}),jl=K(null,(n,e)=>{const o=n(Kt);if(o.future.length===0||o.isApplying)return!1;e(Kt,{...o,isApplying:!0});try{const r=n(ze),l=[...o.future],c=l.shift();let d=c.reverse;if(c.forward.type==="full-snapshot"){const h=jh(r,"current");d={type:"full-snapshot",nodes:h.nodes,edges:h.edges}}hp(r,c.forward)&&(e(ze,r),e(en,h=>h+1)),e(Qn,h=>h+1);const m={forward:c.forward,reverse:d,timestamp:c.timestamp,label:c.label};return e(Kt,{past:[...o.past,m],future:l,isApplying:!1}),$a("Redo: %s (past: %d, future: %d)",c.label,o.past.length+1,l.length),!0}catch(r){return console.error("[History] Redo failed:",r),e(Kt,{...o,isApplying:!1}),!1}}),Fp=K(null,(n,e)=>{e(Kt,{past:[],future:[],isApplying:!1}),$a("History cleared")}),Pp=K(n=>{const e=n(Kt);return{past:e.past.map(o=>o.label||"Unnamed"),future:e.future.map(o=>o.label||"Unnamed")}})}});function T2(n,e){return{x:Math.round(n.x/e)*e,y:Math.round(n.y/e)*e}}function LE(n,e,o){return o?T2(n,e):n}function UE(n,e,o=5){const r=Math.round(n.x/e)*e,l=Math.round(n.y/e)*e;return{x:Math.abs(n.x-r)n(qa)&&!n(pp)),Jp=K(null,(n,e)=>{e(qa,!n(qa))}),M2=K(null,(n,e,o)=>{e(Eu,Math.max(5,Math.min(200,o)))})}}),fe,xr,Ze,Ne,Va,Ll=Mt({"src/core/settings-types.ts"(){fe=(function(n){return n.NodeClick="node:click",n.NodeDoubleClick="node:double-click",n.NodeTripleClick="node:triple-click",n.NodeRightClick="node:right-click",n.NodeLongPress="node:long-press",n.EdgeClick="edge:click",n.EdgeDoubleClick="edge:double-click",n.EdgeRightClick="edge:right-click",n.BackgroundClick="background:click",n.BackgroundDoubleClick="background:double-click",n.BackgroundRightClick="background:right-click",n.BackgroundLongPress="background:long-press",n})({}),xr={[fe.NodeClick]:{type:fe.NodeClick,label:"Click Node",description:"Triggered when clicking on a node",category:"node"},[fe.NodeDoubleClick]:{type:fe.NodeDoubleClick,label:"Double-click Node",description:"Triggered when double-clicking on a node",category:"node"},[fe.NodeTripleClick]:{type:fe.NodeTripleClick,label:"Triple-click Node",description:"Triggered when triple-clicking on a node",category:"node"},[fe.NodeRightClick]:{type:fe.NodeRightClick,label:"Right-click Node",description:"Triggered when right-clicking on a node",category:"node"},[fe.NodeLongPress]:{type:fe.NodeLongPress,label:"Long-press Node",description:"Triggered when long-pressing on a node (mobile/touch)",category:"node"},[fe.EdgeClick]:{type:fe.EdgeClick,label:"Click Edge",description:"Triggered when clicking on an edge",category:"edge"},[fe.EdgeDoubleClick]:{type:fe.EdgeDoubleClick,label:"Double-click Edge",description:"Triggered when double-clicking on an edge",category:"edge"},[fe.EdgeRightClick]:{type:fe.EdgeRightClick,label:"Right-click Edge",description:"Triggered when right-clicking on an edge",category:"edge"},[fe.BackgroundClick]:{type:fe.BackgroundClick,label:"Click Background",description:"Triggered when clicking on the canvas background",category:"background"},[fe.BackgroundDoubleClick]:{type:fe.BackgroundDoubleClick,label:"Double-click Background",description:"Triggered when double-clicking on the canvas background",category:"background"},[fe.BackgroundRightClick]:{type:fe.BackgroundRightClick,label:"Right-click Background",description:"Triggered when right-clicking on the canvas background",category:"background"},[fe.BackgroundLongPress]:{type:fe.BackgroundLongPress,label:"Long-press Background",description:"Triggered when long-pressing on the canvas background (mobile/touch)",category:"background"}},Ze=(function(n){return n.None="none",n.Selection="selection",n.Viewport="viewport",n.Node="node",n.Layout="layout",n.History="history",n.Custom="custom",n})({}),Ne={None:"none",SelectNode:"select-node",SelectEdge:"select-edge",AddToSelection:"add-to-selection",ClearSelection:"clear-selection",DeleteSelected:"delete-selected",FitToView:"fit-to-view",FitAllToView:"fit-all-to-view",CenterOnNode:"center-on-node",ResetViewport:"reset-viewport",LockNode:"lock-node",UnlockNode:"unlock-node",ToggleLock:"toggle-lock",OpenContextMenu:"open-context-menu",ApplyForceLayout:"apply-force-layout",Undo:"undo",Redo:"redo",CreateNode:"create-node"},Va={[fe.NodeClick]:Ne.None,[fe.NodeDoubleClick]:Ne.FitToView,[fe.NodeTripleClick]:Ne.ToggleLock,[fe.NodeRightClick]:Ne.OpenContextMenu,[fe.NodeLongPress]:Ne.OpenContextMenu,[fe.EdgeClick]:Ne.SelectEdge,[fe.EdgeDoubleClick]:Ne.None,[fe.EdgeRightClick]:Ne.OpenContextMenu,[fe.BackgroundClick]:Ne.ClearSelection,[fe.BackgroundDoubleClick]:Ne.FitAllToView,[fe.BackgroundRightClick]:Ne.None,[fe.BackgroundLongPress]:Ne.CreateNode}}});function Wt(n){ta.set(n.id,n)}function z2(n){return ta.get(n)}function BE(n){return ta.has(n)}function O2(){return Array.from(ta.values())}function R2(n){return O2().filter(e=>e.category===n)}function HE(n){return ta.delete(n)}function $E(){ta.clear()}function YE(){Wt({id:Ne.None,label:"None",description:"Do nothing",category:Ze.None,icon:"ban",isBuiltIn:!0,handler:()=>{}}),Wt({id:Ne.SelectNode,label:"Select Node",description:"Select this node (replacing current selection)",category:Ze.Selection,icon:"pointer",requiresNode:!0,isBuiltIn:!0,handler:(n,e)=>{n.nodeId&&e.selectNode(n.nodeId)}}),Wt({id:Ne.SelectEdge,label:"Select Edge",description:"Select this edge",category:Ze.Selection,icon:"git-commit",isBuiltIn:!0,handler:(n,e)=>{n.edgeId&&e.selectEdge(n.edgeId)}}),Wt({id:Ne.AddToSelection,label:"Add to Selection",description:"Add this node to the current selection",category:Ze.Selection,icon:"plus-square",requiresNode:!0,isBuiltIn:!0,handler:(n,e)=>{n.nodeId&&e.addToSelection(n.nodeId)}}),Wt({id:Ne.ClearSelection,label:"Clear Selection",description:"Deselect all nodes",category:Ze.Selection,icon:"x-square",isBuiltIn:!0,handler:(n,e)=>{e.clearSelection()}}),Wt({id:Ne.DeleteSelected,label:"Delete Selected",description:"Delete all selected nodes",category:Ze.Selection,icon:"trash-2",isBuiltIn:!0,handler:async(n,e)=>{const o=e.getSelectedNodeIds();for(const r of o)await e.deleteNode(r)}}),Wt({id:Ne.FitToView,label:"Fit to View",description:"Zoom and pan to fit this node in view",category:Ze.Viewport,icon:"maximize-2",requiresNode:!0,isBuiltIn:!0,handler:(n,e)=>{n.nodeId&&e.centerOnNode(n.nodeId)}}),Wt({id:Ne.FitAllToView,label:"Fit All to View",description:"Zoom and pan to fit all nodes in view",category:Ze.Viewport,icon:"maximize",isBuiltIn:!0,handler:(n,e)=>{e.fitToBounds("graph")}}),Wt({id:Ne.CenterOnNode,label:"Center on Node",description:"Center the viewport on this node",category:Ze.Viewport,icon:"crosshair",requiresNode:!0,isBuiltIn:!0,handler:(n,e)=>{n.nodeId&&e.centerOnNode(n.nodeId)}}),Wt({id:Ne.ResetViewport,label:"Reset Viewport",description:"Reset zoom to 100% and center on origin",category:Ze.Viewport,icon:"home",isBuiltIn:!0,handler:(n,e)=>{e.resetViewport()}}),Wt({id:Ne.LockNode,label:"Lock Node",description:"Prevent this node from being moved",category:Ze.Node,icon:"lock",requiresNode:!0,isBuiltIn:!0,handler:(n,e)=>{n.nodeId&&e.lockNode(n.nodeId)}}),Wt({id:Ne.UnlockNode,label:"Unlock Node",description:"Allow this node to be moved",category:Ze.Node,icon:"unlock",requiresNode:!0,isBuiltIn:!0,handler:(n,e)=>{n.nodeId&&e.unlockNode(n.nodeId)}}),Wt({id:Ne.ToggleLock,label:"Toggle Lock",description:"Toggle whether this node can be moved",category:Ze.Node,icon:"lock",requiresNode:!0,isBuiltIn:!0,handler:(n,e)=>{n.nodeId&&e.toggleLock(n.nodeId)}}),Wt({id:Ne.OpenContextMenu,label:"Open Context Menu",description:"Show the context menu for this node",category:Ze.Node,icon:"more-vertical",isBuiltIn:!0,handler:(n,e)=>{e.openContextMenu&&e.openContextMenu(n.screenPosition,n.nodeId)}}),Wt({id:Ne.ApplyForceLayout,label:"Apply Force Layout",description:"Automatically arrange nodes using force-directed layout",category:Ze.Layout,icon:"layout-grid",isBuiltIn:!0,handler:async(n,e)=>{await e.applyForceLayout()}}),Wt({id:Ne.Undo,label:"Undo",description:"Undo the last action",category:Ze.History,icon:"undo-2",isBuiltIn:!0,handler:(n,e)=>{e.canUndo()&&e.undo()}}),Wt({id:Ne.Redo,label:"Redo",description:"Redo the last undone action",category:Ze.History,icon:"redo-2",isBuiltIn:!0,handler:(n,e)=>{e.canRedo()&&e.redo()}}),Wt({id:Ne.CreateNode,label:"Create Node",description:"Create a new node at this position",category:Ze.Node,icon:"plus",isBuiltIn:!0,handler:async(n,e)=>{e.createNode&&await e.createNode(n.worldPosition)}})}function j2(){const n={[Ze.None]:"None",[Ze.Selection]:"Selection",[Ze.Viewport]:"Viewport",[Ze.Node]:"Node",[Ze.Layout]:"Layout",[Ze.History]:"History",[Ze.Custom]:"Custom"};return[Ze.None,Ze.Selection,Ze.Viewport,Ze.Node,Ze.Layout,Ze.History,Ze.Custom].map(o=>({category:o,label:n[o],actions:R2(o)})).filter(o=>o.actions.length>0)}var ta,Wp=Mt({"src/core/action-registry.ts"(){Ll(),ta=new Map,YE()}});async function mp(n,e,o){if(n===Ne.None)return{success:!0,actionId:n};const r=z2(n);if(!r)return console.warn(`Action not found: ${n}`),{success:!1,actionId:n,error:new Error(`Action not found: ${n}`)};if(r.requiresNode&&!e.nodeId)return console.warn(`Action ${n} requires a node context`),{success:!1,actionId:n,error:new Error(`Action ${n} requires a node context`)};try{const l=r.handler(e,o);return l instanceof Promise&&await l,{success:!0,actionId:n}}catch(l){return console.error(`Error executing action ${n}:`,l),{success:!1,actionId:n,error:l instanceof Error?l:new Error(String(l))}}}function si(n,e,o,r){return{eventType:n,nodeId:r==null?void 0:r.nodeId,nodeData:r==null?void 0:r.nodeData,edgeId:r==null?void 0:r.edgeId,edgeData:r==null?void 0:r.edgeData,worldPosition:o,screenPosition:{x:e.clientX,y:e.clientY},modifiers:{shift:!1,ctrl:!1,alt:!1,meta:!1}}}function qE(n,e,o,r){return{eventType:n,nodeId:r==null?void 0:r.nodeId,nodeData:r==null?void 0:r.nodeData,edgeId:r==null?void 0:r.edgeId,edgeData:r==null?void 0:r.edgeData,worldPosition:o,screenPosition:{x:e.clientX,y:e.clientY},modifiers:{shift:e.shiftKey,ctrl:e.ctrlKey,alt:e.altKey,meta:e.metaKey}}}function VE(n,e,o,r){return{eventType:n,nodeId:r==null?void 0:r.nodeId,nodeData:r==null?void 0:r.nodeData,edgeId:r==null?void 0:r.edgeId,edgeData:r==null?void 0:r.edgeData,worldPosition:o,screenPosition:{x:e.clientX,y:e.clientY},modifiers:{shift:!1,ctrl:!1,alt:!1,meta:!1}}}var L2=Mt({"src/core/action-executor.ts"(){Wp(),Ll()}});function Nu(n,e){return n[e]||Ne.None}var gp,v1,lt,id,ku,ml,Tu,em,gl,tm,nm,im,om,rm,am,sm,lm,cm,um,dm,Jr=Mt({"src/core/settings-store.ts"(){Ll(),gp=[{id:"default",name:"Default",description:"Standard canvas interactions",isBuiltIn:!0,mappings:Va},{id:"minimal",name:"Minimal",description:"Only essential selection and context menu actions",isBuiltIn:!0,mappings:{[fe.NodeClick]:Ne.None,[fe.NodeDoubleClick]:Ne.None,[fe.NodeTripleClick]:Ne.None,[fe.NodeRightClick]:Ne.OpenContextMenu,[fe.NodeLongPress]:Ne.OpenContextMenu,[fe.EdgeClick]:Ne.SelectEdge,[fe.EdgeDoubleClick]:Ne.None,[fe.EdgeRightClick]:Ne.None,[fe.BackgroundClick]:Ne.ClearSelection,[fe.BackgroundDoubleClick]:Ne.None,[fe.BackgroundRightClick]:Ne.None,[fe.BackgroundLongPress]:Ne.None}},{id:"power-user",name:"Power User",description:"Quick actions for experienced users",isBuiltIn:!0,mappings:{[fe.NodeClick]:Ne.None,[fe.NodeDoubleClick]:Ne.ToggleLock,[fe.NodeTripleClick]:Ne.DeleteSelected,[fe.NodeRightClick]:Ne.OpenContextMenu,[fe.NodeLongPress]:Ne.AddToSelection,[fe.EdgeClick]:Ne.SelectEdge,[fe.EdgeDoubleClick]:Ne.None,[fe.EdgeRightClick]:Ne.OpenContextMenu,[fe.BackgroundClick]:Ne.ClearSelection,[fe.BackgroundDoubleClick]:Ne.CreateNode,[fe.BackgroundRightClick]:Ne.OpenContextMenu,[fe.BackgroundLongPress]:Ne.ApplyForceLayout}}],v1={mappings:Va,activePresetId:"default",customPresets:[],isPanelOpen:!1,virtualizationEnabled:!0},lt=Sb("canvas-settings",v1),id=K(n=>n(lt).mappings),ku=K(n=>n(lt).activePresetId),ml=K(n=>{const e=n(lt);return[...gp,...e.customPresets]}),Tu=K(n=>{const e=n(ku);return e&&n(ml).find(r=>r.id===e)||null}),em=K(n=>n(lt).isPanelOpen),gl=K(n=>n(lt).virtualizationEnabled??!0),tm=K(n=>{const e=n(lt),o=n(Tu);return o?Object.values(fe).some(l=>e.mappings[l]!==o.mappings[l]):!0}),nm=K(null,(n,e,{event:o,actionId:r})=>{const l=n(lt);e(lt,{...l,mappings:{...l.mappings,[o]:r},activePresetId:null})}),im=K(null,(n,e,o)=>{const l=n(ml).find(d=>d.id===o);if(!l){console.warn(`Preset not found: ${o}`);return}const c=n(lt);e(lt,{...c,mappings:{...l.mappings},activePresetId:o})}),om=K(null,(n,e,{name:o,description:r})=>{const l=n(lt),c=`custom-${Date.now()}`,d={id:c,name:o,description:r,mappings:{...l.mappings},isBuiltIn:!1};return e(lt,{...l,customPresets:[...l.customPresets,d],activePresetId:c}),c}),rm=K(null,(n,e,o)=>{const r=n(lt),l=r.customPresets.findIndex(d=>d.id===o);if(l===-1){console.warn(`Cannot update preset: ${o} (not found or built-in)`);return}const c=[...r.customPresets];c[l]={...c[l],mappings:{...r.mappings}},e(lt,{...r,customPresets:c,activePresetId:o})}),am=K(null,(n,e,o)=>{const r=n(lt),l=r.customPresets.filter(p=>p.id!==o);if(l.length===r.customPresets.length){console.warn(`Cannot delete preset: ${o} (not found or built-in)`);return}const c=r.activePresetId===o?"default":r.activePresetId,d=c==="default"?Va:r.mappings;e(lt,{...r,customPresets:l,activePresetId:c,mappings:d})}),sm=K(null,(n,e)=>{const o=n(lt);e(lt,{...o,mappings:Va,activePresetId:"default"})}),lm=K(null,(n,e)=>{const o=n(lt);e(lt,{...o,isPanelOpen:!o.isPanelOpen})}),cm=K(null,(n,e,o)=>{const r=n(lt);e(lt,{...r,isPanelOpen:o})}),um=K(null,(n,e,o)=>{const r=n(lt);e(lt,{...r,virtualizationEnabled:o})}),dm=K(null,(n,e)=>{const o=n(lt);e(lt,{...o,virtualizationEnabled:!(o.virtualizationEnabled??!0)})})}});function XE(n,e,o,r,l){const c=n+o,d=e+r;return!(n>l.maxX||cl.maxY||d{const e=n(Zn),o=n(nn),r=n(Tt);if(!e||r===0)return null;const l=yp;return{minX:(-l-o.x)/r,minY:(-l-o.y)/r,maxX:(e.width+l-o.x)/r,maxY:(e.height+l-o.y)/r}}),yl=K(n=>{const e=n(gl),o=n(Sl);if(!e)return o;const r=n(fu);if(!r)return o;n(Qn),n(en);const l=n(ze);return o.filter(c=>{if(!l.hasNode(c))return!1;const d=l.getNodeAttributes(c);return XE(d.x,d.y,d.width||200,d.height||100,r)})}),Du=K(n=>{const e=n(gl),o=n(Al),l=n(Qa).isCreating?"temp-creating-edge":null;if(!e)return l?[...o,l]:o;const c=n(yl),d=new Set(c);n(en);const p=n(ze),m=o.filter(h=>{const g=p.source(h),y=p.target(h);return d.has(g)&&d.has(y)});return l?[...m,l]:m}),fm=K(n=>{const e=n(gl),o=n(Sl).length,r=n(Al).length,l=n(yl).length,c=n(Du).length,d=n(fu);return{enabled:e,totalNodes:o,totalEdges:r,visibleNodes:l,visibleEdges:c,culledNodes:o-l,culledEdges:r-c,bounds:d}})}});function KE(n,e,o,r,l){switch(l.side){case"left":return{x:n,y:e+r*l.position};case"right":return{x:n+o,y:e+r*l.position};case"top":return{x:n+o*l.position,y:e};case"bottom":return{x:n+o*l.position,y:e+r}}}function QE(n){return n&&n.length>0?n:[hm]}function ZE(n,e,o){return!(o&&n.type==="input"||!o&&n.type==="output"||n.maxConnections!==void 0&&e>=n.maxConnections)}function IE(n,e){return!(n.type==="input"||e.type==="output")}var hm,U2=Mt({"src/core/port-types.ts"(){hm={id:"default",type:"bidirectional",side:"right",position:.5}}}),Gl={};Mp(Gl,{PASTE_OFFSET:()=>Mu,clearClipboardAtom:()=>gm,clipboardAtom:()=>dr,clipboardNodeCountAtom:()=>pm,copyToClipboardAtom:()=>Za,cutToClipboardAtom:()=>mm,duplicateSelectionAtom:()=>rd,hasClipboardContentAtom:()=>od,pasteFromClipboardAtom:()=>_l});function FE(n){if(n.length===0)return{minX:0,minY:0,maxX:0,maxY:0};let e=1/0,o=1/0,r=-1/0,l=-1/0;for(const c of n)e=Math.min(e,c.attrs.x),o=Math.min(o,c.attrs.y),r=Math.max(r,c.attrs.x+c.attrs.width),l=Math.max(l,c.attrs.y+c.attrs.height);return{minX:e,minY:o,maxX:r,maxY:l}}function b1(n){return`paste-${Date.now()}-${n}-${Math.random().toString(36).slice(2,8)}`}var Oi,Mu,dr,od,pm,Za,mm,_l,rd,gm,fs=Mt({"src/core/clipboard-store.ts"(){Zt(),Tn(),ds(),Mo(),Oi=ln("clipboard"),Mu={x:50,y:50},dr=K(null),od=K(n=>n(dr)!==null),pm=K(n=>{const e=n(dr);return(e==null?void 0:e.nodes.length)??0}),Za=K(null,(n,e,o)=>{const r=o??Array.from(n(tt));if(r.length===0){Oi("Nothing to copy - no nodes selected");return}const l=n(ze),c=new Set(r),d=[],p=[];for(const g of r){if(!l.hasNode(g)){Oi("Node %s not found in graph, skipping",g);continue}const y=l.getNodeAttributes(g);d.push({attrs:{...y},dbData:{...y.dbData}})}l.forEachEdge((g,y,v,w)=>{c.has(v)&&c.has(w)&&p.push({source:v,target:w,attrs:{...y},dbData:{...y.dbData}})});const m=FE(d),h={nodes:d,edges:p,bounds:m,timestamp:Date.now()};e(dr,h),Oi("Copied %d nodes and %d edges to clipboard",d.length,p.length)}),mm=K(null,(n,e,o)=>{e(Za,o),Oi("Cut operation: copied to clipboard. App should delete selected nodes.")}),_l=K(null,(n,e,o)=>{const r=n(dr);if(!r||r.nodes.length===0)return Oi("Nothing to paste - clipboard empty"),[];const l=o??Mu;n(ze),e(us,"Paste nodes");const c=new Map,d=[];for(let p=0;p %s at (%d, %d)",m.dbData.id,h,m.attrs.x+l.x,m.attrs.y+l.y),e(Gp,g)}for(const p of r.edges){const m=c.get(p.source),h=c.get(p.target);if(!m||!h){Oi("Edge %s: source or target not found in id map, skipping",p.dbData.id);continue}const g=b1(r.edges.indexOf(p)+r.nodes.length),y={...p.dbData,id:g,source_node_id:m,target_node_id:h,created_at:new Date().toISOString(),updated_at:new Date().toISOString()};Oi("Pasting edge %s -> %s (from %s to %s)",p.dbData.id,g,m,h),e(Bp,y)}return e(cs),e(Ol,d),Oi("Pasted %d nodes and %d edges",d.length,r.edges.length),d}),rd=K(null,(n,e)=>(e(Za),e(_l))),gm=K(null,(n,e)=>{e(dr,null),Oi("Clipboard cleared")})}});function G2(n){return{source:PE(n.pointerType),pointerId:n.pointerId,pressure:n.pressure,tiltX:n.tiltX,tiltY:n.tiltY,isPrimary:n.isPrimary,rawPointerType:n.pointerType}}function PE(n){switch(n){case"pen":return"pencil";case"touch":return"finger";case"mouse":return"mouse";default:return"mouse"}}function B2(){if(typeof window>"u")return{hasTouch:!1,hasStylus:!1,hasMouse:!0,hasCoarsePointer:!1};const n="ontouchstart"in window||navigator.maxTouchPoints>0,e=typeof window.matchMedia=="function",o=e?window.matchMedia("(pointer: coarse)").matches:!1,l=(e?window.matchMedia("(pointer: fine)").matches:!0)||!n;return{hasTouch:n,hasStylus:!1,hasMouse:l,hasCoarsePointer:o}}function JE(n){switch(n){case"finger":return{dragThreshold:10,tapThreshold:10,longPressDuration:600,longPressMoveLimit:10};case"pencil":return{dragThreshold:2,tapThreshold:3,longPressDuration:500,longPressMoveLimit:5};case"mouse":return{dragThreshold:3,tapThreshold:5,longPressDuration:0,longPressMoveLimit:0}}}function WE(n){return ym[n]}var ym,vm=Mt({"src/core/input-classifier.ts"(){ym={finger:44,pencil:24,mouse:16}}}),Zi,zu,hl,bm,H2,$2,wm,xm,Sm,Y2,ad=Mt({"src/core/input-store.ts"(){vm(),Zi=K(new Map),zu=K("mouse"),hl=K(B2()),bm=K(n=>{const e=n(Zi);for(const[,o]of e)if(o.source==="pencil")return!0;return!1}),H2=K(n=>{const e=n(Zi);let o=0;for(const[,r]of e)r.source==="finger"&&o++;return o>1}),$2=K(n=>{const e=n(Zi);let o=0;for(const[,r]of e)r.source==="finger"&&o++;return o}),wm=K(n=>n(hl).hasTouch),xm=K(null,(n,e,o)=>{const r=new Map(n(Zi));if(r.set(o.pointerId,o),e(Zi,r),e(zu,o.source),o.source==="pencil"){const l=n(hl);l.hasStylus||e(hl,{...l,hasStylus:!0})}}),Sm=K(null,(n,e,o)=>{const r=new Map(n(Zi));r.delete(o),e(Zi,r)}),Y2=K(null,(n,e)=>{e(Zi,new Map)})}});function q2(n){const{source:e,type:o,target:r,modifierKey:l,isStylusActive:c}=n;if(c&&e==="finger"){if(o==="drag")return"pan";if(o==="tap"||o==="long-press")return"none"}if(l&&o==="drag"&&r==="background")return"rect-select";const d=V2[o];if(!d)return"none";const p=d[r];return p?p[e]??"none":"none"}function eN(n,e){return!!(n==="finger"&&e)}var V2,X2=Mt({"src/core/gesture-resolver.ts"(){V2={tap:{node:{pencil:"select",finger:"select",mouse:"select"},edge:{pencil:"select",finger:"select",mouse:"select"},port:{pencil:"select",finger:"select",mouse:"select"},background:{pencil:"none",finger:"none",mouse:"none"}},"double-tap":{node:{pencil:"edit-node",finger:"edit-node",mouse:"edit-node"},background:{pencil:"none",finger:"none",mouse:"none"}},drag:{node:{pencil:"move-node",finger:"move-node",mouse:"move-node"},port:{pencil:"create-edge",finger:"create-edge",mouse:"create-edge"},"resize-handle":{pencil:"none",finger:"none",mouse:"none"},background:{pencil:"lasso-select",finger:"pan",mouse:"pan"}},"long-press":{node:{pencil:"context-menu",finger:"context-menu",mouse:"none"},background:{pencil:"none",finger:"context-menu",mouse:"none"}},"right-click":{node:{pencil:"none",finger:"none",mouse:"context-menu"},edge:{pencil:"none",finger:"none",mouse:"context-menu"},background:{pencil:"none",finger:"none",mouse:"context-menu"}},pinch:{background:{pencil:"none",finger:"zoom",mouse:"none"},node:{pencil:"none",finger:"zoom",mouse:"none"}},scroll:{background:{pencil:"none",finger:"none",mouse:"zoom"},node:{pencil:"none",finger:"none",mouse:"zoom"}}}}}),Bl={};Mp(Bl,{ActionCategory:()=>Ze,BUILT_IN_PRESETS:()=>gp,BuiltInActionId:()=>Ne,CanvasEventType:()=>fe,DEFAULT_MAPPINGS:()=>Va,DEFAULT_PORT:()=>hm,EVENT_TYPE_INFO:()=>xr,FallbackNodeTypeComponent:()=>C2,HIT_TARGET_SIZES:()=>ym,PASTE_OFFSET:()=>Mu,VIRTUALIZATION_BUFFER:()=>yp,ZOOM_EXIT_THRESHOLD:()=>Zu,ZOOM_TRANSITION_THRESHOLD:()=>Qu,activePointersAtom:()=>Zi,activePresetAtom:()=>Tu,activePresetIdAtom:()=>ku,addEdgeToLocalGraphAtom:()=>Bp,addNodeToLocalGraphAtom:()=>Gp,addNodesToSelectionAtom:()=>Ol,allPresetsAtom:()=>ml,applyPresetAtom:()=>im,arePortsCompatible:()=>IE,calculatePortPosition:()=>KE,canPortAcceptConnection:()=>ZE,canRedoAtom:()=>nd,canUndoAtom:()=>td,canvasSettingsAtom:()=>lt,classifyPointer:()=>G2,cleanupAllNodePositionsAtom:()=>dp,cleanupNodePositionAtom:()=>up,clearActions:()=>$E,clearClipboardAtom:()=>gm,clearEdgeSelectionAtom:()=>Yp,clearGraphOnSwitchAtom:()=>Pb,clearHistoryAtom:()=>Fp,clearMutationQueueAtom:()=>d2,clearNodeTypeRegistry:()=>jE,clearPointersAtom:()=>Y2,clearSelectionAtom:()=>cs,clipboardAtom:()=>dr,clipboardNodeCountAtom:()=>pm,completeMutationAtom:()=>ed,conditionalSnap:()=>LE,copyToClipboardAtom:()=>Za,createActionContext:()=>si,createActionContextFromReactEvent:()=>qE,createActionContextFromTouchEvent:()=>VE,currentGraphIdAtom:()=>wr,cutToClipboardAtom:()=>mm,deletePresetAtom:()=>am,dequeueMutationAtom:()=>l2,detectInputCapabilities:()=>B2,draggingNodeIdAtom:()=>Gi,duplicateSelectionAtom:()=>rd,edgeCreationAtom:()=>Qa,edgeFamilyAtom:()=>Rp,edgeKeysAtom:()=>Al,edgeKeysWithTempEdgeAtom:()=>Jb,endNodeDragAtom:()=>Lp,eventMappingsAtom:()=>id,executeAction:()=>mp,fingerCountAtom:()=>$2,getAction:()=>z2,getActionForEvent:()=>Nu,getActionsByCategories:()=>j2,getActionsByCategory:()=>R2,getAllActions:()=>O2,getGestureThresholds:()=>JE,getHitTargetSize:()=>WE,getNextQueuedMutationAtom:()=>u2,getNodePorts:()=>QE,getNodeTypeComponent:()=>zE,getRegisteredNodeTypes:()=>RE,getSnapGuides:()=>UE,goToLockedPageAtom:()=>A2,graphAtom:()=>ze,graphUpdateVersionAtom:()=>en,handleNodePointerDownSelectionAtom:()=>Hp,hasAction:()=>BE,hasClipboardContentAtom:()=>od,hasLockedNodeAtom:()=>_2,hasNodeTypeComponent:()=>OE,hasSelectionAtom:()=>Vp,hasUnsavedChangesAtom:()=>tm,highestZIndexAtom:()=>fp,historyLabelsAtom:()=>Pp,historyStateAtom:()=>Kt,incrementRetryCountAtom:()=>c2,inputCapabilitiesAtom:()=>hl,inputModeAtom:()=>cr,interactionFeedbackAtom:()=>dl,isBackgroundGesture:()=>eN,isMultiTouchAtom:()=>H2,isOnlineAtom:()=>qr,isPanelOpenAtom:()=>em,isPickNodeModeAtom:()=>b2,isPickingModeAtom:()=>v2,isSnappingActiveAtom:()=>D2,isStylusActiveAtom:()=>bm,isTouchDeviceAtom:()=>wm,isZoomTransitioningAtom:()=>Fu,lastSyncErrorAtom:()=>xo,lastSyncTimeAtom:()=>uu,loadGraphFromDbAtom:()=>n2,lockNodeAtom:()=>Xp,lockedNodeDataAtom:()=>w2,lockedNodeIdAtom:()=>fr,lockedNodePageCountAtom:()=>fl,lockedNodePageIndexAtom:()=>ur,mutationQueueAtom:()=>wi,nextLockedPageAtom:()=>x2,nodeFamilyAtom:()=>Op,nodeKeysAtom:()=>Sl,nodePositionAtomFamily:()=>xi,nodePositionUpdateCounterAtom:()=>Qn,optimisticDeleteEdgeAtom:()=>Wb,optimisticDeleteNodeAtom:()=>Up,panAtom:()=>nn,pasteFromClipboardAtom:()=>_l,pendingInputResolverAtom:()=>du,pendingMutationsCountAtom:()=>Ri,pointerDownAtom:()=>xm,pointerUpAtom:()=>Sm,preDragNodeAttributesAtom:()=>pl,prevLockedPageAtom:()=>S2,primaryInputSourceAtom:()=>zu,provideInputAtom:()=>g2,pushDeltaAtom:()=>k2,pushHistoryAtom:()=>us,queueMutationAtom:()=>s2,redoAtom:()=>jl,redoCountAtom:()=>Ip,registerAction:()=>Wt,registerNodeType:()=>DE,registerNodeTypes:()=>ME,removeEdgeFromLocalGraphAtom:()=>e2,removeNodesFromSelectionAtom:()=>i2,resetInputModeAtom:()=>f2,resetSettingsAtom:()=>sm,resetViewportAtom:()=>zl,resolveGestureIntent:()=>q2,saveAsPresetAtom:()=>om,screenToWorldAtom:()=>Vu,selectEdgeAtom:()=>Ju,selectSingleNodeAtom:()=>Pu,selectedEdgeIdAtom:()=>_o,selectedNodeIdsAtom:()=>tt,selectedNodesCountAtom:()=>qp,setEventMappingAtom:()=>nm,setGridSizeAtom:()=>M2,setOnlineStatusAtom:()=>a2,setPanelOpenAtom:()=>cm,setVirtualizationEnabledAtom:()=>um,setZoomAtom:()=>Ku,snapEnabledAtom:()=>qa,snapGridSizeAtom:()=>Eu,snapTemporaryDisableAtom:()=>pp,snapToGrid:()=>T2,startMutationAtom:()=>Wu,startNodeDragAtom:()=>jp,startPickNodeAtom:()=>h2,startPickNodesAtom:()=>p2,startPickPointAtom:()=>m2,swapEdgeAtomicAtom:()=>t2,syncStateAtom:()=>o2,syncStatusAtom:()=>ai,toggleNodeInSelectionAtom:()=>$p,togglePanelAtom:()=>lm,toggleSnapAtom:()=>Jp,toggleVirtualizationAtom:()=>dm,trackMutationErrorAtom:()=>r2,uiNodesAtom:()=>ls,undoAtom:()=>Rl,undoCountAtom:()=>Zp,unlockNodeAtom:()=>Kp,unregisterAction:()=>HE,updateInteractionFeedbackAtom:()=>y2,updateNodePositionAtom:()=>zp,updatePresetAtom:()=>rm,viewportRectAtom:()=>Zn,virtualizationEnabledAtom:()=>gl,virtualizationMetricsAtom:()=>fm,visibleBoundsAtom:()=>fu,visibleEdgeKeysAtom:()=>Du,visibleNodeKeysAtom:()=>yl,worldToScreenAtom:()=>Xu,zoomAtom:()=>Tt,zoomFocusNodeIdAtom:()=>Iu,zoomTransitionProgressAtom:()=>xl});var na=Mt({"src/core/index.ts"(){kE(),Zt(),cn(),Tn(),zo(),TE(),Qp(),E2(),ds(),GE(),Ll(),Wp(),L2(),Jr(),Ul(),Jr(),U2(),fs(),vm(),ad(),X2()}});na();Tn();function tN(n){const e=Oe.c(13),[o]=Ci(tt),r=ge(Pu),l=ge($p);let c;e[0]!==n||e[1]!==o?(c=o.has(n),e[0]=n,e[1]=o,e[2]=c):c=e[2];let d;e[3]!==n||e[4]!==r?(d=()=>r(n),e[3]=n,e[4]=r,e[5]=d):d=e[5];let p;e[6]!==n||e[7]!==l?(p=()=>l(n),e[6]=n,e[7]=l,e[8]=p):p=e[8];let m;return e[9]!==c||e[10]!==d||e[11]!==p?(m={isSelected:c,selectNode:d,toggleNode:p},e[9]=c,e[10]=d,e[11]=p,e[12]=m):m=e[12],m}Zt();cn();Tn();zo();ds();var nN={eventOptions:{passive:!1,capture:!1},drag:{pointer:{touch:!0,keys:!1},filterTaps:!0,tapsThreshold:5,threshold:3}},iN=nN,w1=new Map;function Uh(n){let e=w1.get(n);return e||(e={inFlight:!1,queuedPosition:null,queuedUiProperties:null,graphId:null},w1.set(n,e)),e}Mo();var oN=ln("drag");function rN(n,e){const o=Oe.c(36);let r;o[0]!==e?(r=e===void 0?{}:e,o[0]=e,o[1]=r):r=o[1];const l=r,{onPersist:c,onPersistError:d,invalidationDebounceMs:p}=l,m=he(ze),h=ge(Wu),g=ge(ed),y=ge(jp),v=ge(Lp),w=he(pl),S=he(Tt),A=he(tt);he(Gi);const x=he(wr),E=he(Qa),D=ge(ze);ge(Qn);const R=ge(us);let _;o[2]===Symbol.for("react.memo_cache_sentinel")?(_=K(null,aN),o[2]=_):_=o[2];const N=ge(_);let T;o[3]!==N?(T=ce=>{N(ce)},o[3]=N,o[4]=T):T=o[4];const O=T,M=ne.useRef(0);ne.useRef(null);let $;o[5]===Symbol.for("react.memo_cache_sentinel")?($=ce=>{const j=ce.event.target;j.closest('[data-no-drag="true"]')||j.tagName==="INPUT"||j.tagName==="TEXTAREA"||j.tagName==="SELECT"||(M.current=M.current+1)},o[5]=$):$=o[5];let L;o[6]!==S||o[7]!==E||o[8]!==A||o[9]!==m||o[10]!==n||o[11]!==R||o[12]!==y||o[13]!==h||o[14]!==O?(L=ce=>{const j=ce.event.target;if(j.closest('[data-no-drag="true"]')||j.tagName==="INPUT"||j.tagName==="TEXTAREA"||j.tagName==="SELECT"||E.isCreating)return;ce.event.stopPropagation();const{movement:I,first:G,active:Y,down:V,pinching:k,cancel:H,tap:F}=ce,[oe,J]=I;let W=ce.memo;if(F||!Y)return W;const ue=M.current;if(G){const Ce=A.size,Se=Ce>1?`Move ${Ce} nodes`:"Move node";R(Se),y({nodeId:n});const Ee=A;Ee.forEach(()=>h());const Be=new Map;Ee.forEach(et=>{if(m.hasNode(et)){const ft=m.getNodeAttributes(et);Be.set(et,{x:ft.x,y:ft.y})}}),W={initialPositions:Be,gestureInstance:ue}}if(!W||W.gestureInstance!==ue||!W.initialPositions)return H&&!k&&!V&&!F&&!Y&&H(),W;const xe=oe/S,de=J/S,Te=[];return W.initialPositions.forEach((Ce,Se)=>{if(m.hasNode(Se)){const Ee={x:Ce.x+xe,y:Ce.y+de};Te.push({id:Se,pos:Ee})}}),Te.length>0&&O(Te),W},o[6]=S,o[7]=E,o[8]=A,o[9]=m,o[10]=n,o[11]=R,o[12]=y,o[13]=h,o[14]=O,o[15]=L):L=o[15];let X;o[16]!==g||o[17]!==x||o[18]!==S||o[19]!==E||o[20]!==w||o[21]!==m||o[22]!==n||o[23]!==c||o[24]!==d||o[25]!==v||o[26]!==D||o[27]!==h||o[28]!==O?(X=ce=>{const j=ce.event.target;if(j.closest('[data-no-drag="true"]')||j.tagName==="INPUT"||j.tagName==="TEXTAREA"||j.tagName==="SELECT")return;if(E.isCreating){v({nodeId:n});return}ce.event.stopPropagation();const I=ce.memo;if(!x){oN("Cannot update node position: currentGraphId is not set"),v({nodeId:n});return}(I!=null&&I.initialPositions?Array.from(I.initialPositions.keys()):[n]).forEach(Y=>{if(!m.hasNode(Y)){g(!1);return}const V=m.getNodeAttributes(Y),k=I==null?void 0:I.initialPositions.get(Y);if(!k){g(!1);return}const[H,F]=ce.movement,oe=H/S,J=F/S,W={x:k.x+oe,y:k.y+J};if(O([{id:Y,pos:W}]),!c){g(!0),v({nodeId:Y});return}const xe={...typeof V.dbData.ui_properties=="object"&&V.dbData.ui_properties!==null&&!Array.isArray(V.dbData.ui_properties)?V.dbData.ui_properties:{},x:W.x,y:W.y,zIndex:V.zIndex},de=Uh(Y);if(de.inFlight){de.queuedPosition=W,de.queuedUiProperties=xe,de.graphId=x;return}de.inFlight=!0,de.graphId=x;const Te=async Ce=>{const Se=Uh(Ce);if(Se&&Se.queuedPosition&&Se.queuedUiProperties&&Se.graphId){const Ee=Se.queuedUiProperties,Be=Se.graphId;Se.queuedPosition=null,Se.queuedUiProperties=null,h();try{await c(Ce,Be,Ee),g(!0)}catch(et){const ft=et;g(!1),d==null||d(Ce,ft)}Se.inFlight=!1,Te(Ce)}else Se&&(Se.inFlight=!1)};c(Y,x,xe).then(()=>{g(!0),Te(Y)}).catch(Ce=>{g(!1);const Se=Uh(Y);Se&&(Se.inFlight=!1);const Ee=w;Ee&&Ee.dbData.id===Y&&m.hasNode(Y)&&(m.replaceNodeAttributes(Y,Ee),D(m)),d==null||d(Y,Ce),Te(Y)}).finally(()=>{v({nodeId:Y})})})},o[16]=g,o[17]=x,o[18]=S,o[19]=E,o[20]=w,o[21]=m,o[22]=n,o[23]=c,o[24]=d,o[25]=v,o[26]=D,o[27]=h,o[28]=O,o[29]=X):X=o[29];let ae;o[30]!==L||o[31]!==X?(ae={onPointerDown:$,onDrag:L,onDragEnd:X},o[30]=L,o[31]=X,o[32]=ae):ae=o[32];const te=zb(ae,iN);let me;return o[33]!==te||o[34]!==O?(me={bind:te,updateNodePositions:O},o[33]=te,o[34]=O,o[35]=me):me=o[35],me}function aN(n,e,o){const r=n(ze);o.forEach(l=>{r.hasNode(l.id)&&(r.setNodeAttribute(l.id,"x",l.pos.x),r.setNodeAttribute(l.id,"y",l.pos.y))}),e(Qn,sN)}function sN(n){return n+1}Zt();cn();zo();Mo();ln("resize");function lN(n){const e=Oe.c(38),{id:o,nodeData:r,updateNodePositions:l,options:c}=n;let d;e[0]!==c?(d=c===void 0?{}:c,e[0]=c,e[1]=d):d=e[1];const p=d,{onPersist:m,onPersistError:h,minWidth:g,minHeight:y}=p,v=g===void 0?200:g,w=y===void 0?150:y,[S,A]=ne.useState(r.width||500),[x,E]=ne.useState(r.height||500),[D,R]=ne.useState(!1),_=ne.useRef(null),N=he(ze),T=he(Tt),O=he(wr),M=ge(Wu),$=ge(ed),L=ge(en),X=ge(Qn);let ae,te;e[2]!==D||e[3]!==r.height||e[4]!==r.width?(ae=()=>{D||(A(r.width||500),E(r.height||500))},te=[r.width,r.height,D],e[2]=D,e[3]=r.height,e[4]=r.width,e[5]=ae,e[6]=te):(ae=e[5],te=e[6]),ne.useEffect(ae,te);let me;e[7]!==N||e[8]!==o||e[9]!==x||e[10]!==S?(me=k=>H=>{H.stopPropagation(),H.preventDefault(),R(!0);const F=N.hasNode(o)?N.getNodeAttributes(o):{x:0,y:0};_.current={width:S,height:x,startX:H.clientX,startY:H.clientY,startNodeX:F.x,startNodeY:F.y,direction:k},H.target.setPointerCapture(H.pointerId)},e[7]=N,e[8]=o,e[9]=x,e[10]=S,e[11]=me):me=e[11];const ce=me;let j;e[12]!==T||e[13]!==N||e[14]!==o||e[15]!==w||e[16]!==v||e[17]!==L||e[18]!==X||e[19]!==l?(j=k=>{if(!_.current)return;k.stopPropagation(),k.preventDefault();const H=(k.clientX-_.current.startX)/T,F=(k.clientY-_.current.startY)/T,{direction:oe,width:J,height:W,startNodeX:ue,startNodeY:xe}=_.current;let de=J,Te=W,Ce=ue,Se=xe;oe.includes("e")&&(de=Math.max(v,J+H)),oe.includes("w")&&(de=Math.max(v,J-H),Ce=ue+(J-de)),oe.includes("s")&&(Te=Math.max(w,W+F)),oe.includes("n")&&(Te=Math.max(w,W-F),Se=xe+(W-Te)),N.hasNode(o)&&(N.setNodeAttribute(o,"width",de),N.setNodeAttribute(o,"height",Te),N.setNodeAttribute(o,"x",Ce),N.setNodeAttribute(o,"y",Se)),rC.flushSync(()=>{A(de),E(Te),L(uN)}),oe.includes("n")||oe.includes("w")?l([{id:o,pos:{x:Ce,y:Se}}]):X(cN)},e[12]=T,e[13]=N,e[14]=o,e[15]=w,e[16]=v,e[17]=L,e[18]=X,e[19]=l,e[20]=j):j=e[20];const I=j;let G;e[21]!==$||e[22]!==O||e[23]!==N||e[24]!==o||e[25]!==x||e[26]!==S||e[27]!==m||e[28]!==h||e[29]!==M?(G=k=>{if(!_.current)return;if(k.stopPropagation(),k.target.releasePointerCapture(k.pointerId),R(!1),!O||!_.current){_.current=null;return}const H=N.hasNode(o)?N.getNodeAttributes(o):null;if(!H){_.current=null;return}const F=H.width||S,oe=H.height||x,J=H.x,W=H.y;if(A(F),E(oe),!m){_.current=null;return}const xe={...typeof H.dbData.ui_properties=="object"&&H.dbData.ui_properties!==null&&!Array.isArray(H.dbData.ui_properties)?H.dbData.ui_properties:{},width:F,height:oe,x:J,y:W};M(),m(o,O,xe).then(()=>{$(!0)}).catch(de=>{$(!1),_.current&&(A(_.current.width),E(_.current.height)),h==null||h(o,de)}).finally(()=>{_.current=null})},e[21]=$,e[22]=O,e[23]=N,e[24]=o,e[25]=x,e[26]=S,e[27]=m,e[28]=h,e[29]=M,e[30]=G):G=e[30];const Y=G;let V;return e[31]!==ce||e[32]!==Y||e[33]!==I||e[34]!==D||e[35]!==x||e[36]!==S?(V={localWidth:S,localHeight:x,isResizing:D,createResizeStart:ce,handleResizeMove:I,handleResizeEnd:Y},e[31]=ce,e[32]=Y,e[33]=I,e[34]=D,e[35]=x,e[36]=S,e[37]=V):V=e[37],V}function cN(n){return n+1}function uN(n){return n+1}ds();function dN(n){const e=Oe.c(25);let o;e[0]!==n?(o=n===void 0?{}:n,e[0]=n,e[1]=o):o=e[1];const r=o,{enableKeyboardShortcuts:l}=r,c=l===void 0?!1:l,d=he(td),p=he(nd),m=he(Zp),h=he(Ip),g=he(Pp),y=ge(Rl),v=ge(jl),w=ge(us),S=ge(Fp);let A;e[2]!==y?(A=()=>y(),e[2]=y,e[3]=A):A=e[3];const x=A;let E;e[4]!==v?(E=()=>v(),e[4]=v,e[5]=E):E=e[5];const D=E;let R;e[6]!==w?(R=L=>{w(L)},e[6]=w,e[7]=R):R=e[7];const _=R;let N;e[8]!==S?(N=()=>{S()},e[8]=S,e[9]=N):N=e[9];const T=N;let O,M;e[10]!==c||e[11]!==D||e[12]!==x?(O=()=>{if(!c)return;const L=X=>{X.target instanceof HTMLInputElement||X.target instanceof HTMLTextAreaElement||X.target instanceof HTMLElement&&X.target.isContentEditable||((X.ctrlKey||X.metaKey)&&X.key==="z"&&!X.shiftKey&&(X.preventDefault(),x()),(X.ctrlKey||X.metaKey)&&X.key==="z"&&X.shiftKey&&(X.preventDefault(),D()),(X.ctrlKey||X.metaKey)&&X.key==="y"&&(X.preventDefault(),D()))};return window.addEventListener("keydown",L),()=>window.removeEventListener("keydown",L)},M=[c,x,D],e[10]=c,e[11]=D,e[12]=x,e[13]=O,e[14]=M):(O=e[13],M=e[14]),ne.useEffect(O,M);let $;return e[15]!==p||e[16]!==d||e[17]!==T||e[18]!==g||e[19]!==_||e[20]!==D||e[21]!==h||e[22]!==x||e[23]!==m?($={undo:x,redo:D,canUndo:d,canRedo:p,undoCount:m,redoCount:h,historyLabels:g,recordSnapshot:_,clear:T},e[15]=p,e[16]=d,e[17]=T,e[18]=g,e[19]=_,e[20]=D,e[21]=h,e[22]=x,e[23]=m,e[24]=$):$=e[24],$}Tn();function fN(){const n=Oe.c(6),e=he(tt),o=he(_o),r=he(qp),l=he(Vp),c=o!==null;let d;return n[0]!==r||n[1]!==l||n[2]!==o||n[3]!==e||n[4]!==c?(d={selectedNodeIds:e,selectedEdgeId:o,count:r,hasSelection:l,hasEdgeSelection:c},n[0]=r,n[1]=l,n[2]=o,n[3]=e,n[4]=c,n[5]=d):d=n[5],d}cn();function hN(){const n=Oe.c(9),e=he(Tt),o=he(nn),r=he(Zn),l=he(Vu),c=he(Xu),d=he(Iu),p=he(xl),m=he(Fu);let h;return n[0]!==m||n[1]!==o||n[2]!==l||n[3]!==r||n[4]!==c||n[5]!==e||n[6]!==d||n[7]!==p?(h={zoom:e,pan:o,viewportRect:r,screenToWorld:l,worldToScreen:c,zoomFocusNodeId:d,zoomTransitionProgress:p,isZoomTransitioning:m,zoomTransitionThreshold:Qu,zoomExitThreshold:Zu},n[0]=m,n[1]=o,n[2]=l,n[3]=r,n[4]=c,n[5]=e,n[6]=d,n[7]=p,n[8]=h):h=n[8],h}Zt();Zt();cn();Tn();var No=(function(n){return n.Graph="graph",n.Selection="selection",n})({}),K2=n=>{if(n.length===0)return{x:0,y:0,width:0,height:0};const e=Math.min(...n.map(c=>c.x)),o=Math.min(...n.map(c=>c.y)),r=Math.max(...n.map(c=>c.x+c.width)),l=Math.max(...n.map(c=>c.y+c.height));return{x:e,y:o,width:r-e,height:l-o}};function x1(n){return{x:n.x+n.width/2,y:n.y+n.height/2}}function pN(n,e){const o=x1(n),r=x1(e),l=Math.abs(o.x-r.x),c=Math.abs(o.y-r.y),d=(n.width+e.width)/2,p=(n.height+e.height)/2;return l{const n=Oe.c(6),e=he(ze);he(Qn);let o,r;n[0]!==e?(o=e.nodes().map(d=>{const p=e.getNodeAttributes(d);return{x:p.x,y:p.y,width:p.width||500,height:p.height||500}}),r=K2(o),n[0]=e,n[1]=o,n[2]=r):(o=n[1],r=n[2]);const l=r;let c;return n[3]!==l||n[4]!==o?(c={bounds:l,nodes:o},n[3]=l,n[4]=o,n[5]=c):c=n[5],c},gN=()=>{const n=Oe.c(5),e=he(tt),o=he(ls);let r;if(n[0]!==o||n[1]!==e){let l;n[3]!==e?(l=d=>e.has(d.id),n[3]=e,n[4]=l):l=n[4];const c=o.filter(l).map(yN);r=K2(c),n[0]=o,n[1]=e,n[2]=r}else r=n[2];return r},Am=()=>{const n=Oe.c(6),{bounds:e}=mN(),o=gN(),r=he(Zn),l=ge(Tt),c=ge(nn);let d;return n[0]!==e||n[1]!==o||n[2]!==c||n[3]!==l||n[4]!==r?(d={fitToBounds:(m,h)=>{const g=h===void 0?20:h,y=typeof m=="string"?m==="graph"?No.Graph:No.Selection:m;if(!r||typeof r.width!="number"||typeof r.height!="number"){console.warn("[fitToBounds] Error: viewportSize is undefined or invalid.","Received:",r);return}if(r.width<=0||r.height<=0){console.warn("[fitToBounds] Error: Viewport dimensions are zero or negative.",r.width,r.height);return}let v=null;if(y===No.Graph?v=e:y===No.Selection&&(v=o),!v||typeof v.width!="number"||typeof v.height!="number"){console.warn("[fitToBounds] Error: bounds object is undefined or invalid.","Received:",v);return}if(v.width<=0||v.height<=0){console.warn("[fitToBounds] Error: Bounds dimensions are zero or negative.",v.width,v.height);return}const w=Math.max(0,r.width/2-1),S=Math.max(0,r.height/2-1);let A=g;g>w&&(console.warn(`[fitToBounds] Horizontal padding (${g}px) too large. Clamping to ${w}px.`),A=w),g>S&&S{const{onPositionsChanged:e,maxIterations:o=1e3,chargeStrength:r=-6e3,linkStrength:l=.03}=n,c=he(ls),d=he(ze),p=ge(zp),m=ne.useRef(!1),h=()=>{const y=[];for(let v=0;v{if(m.current){console.warn("[ForceLayout] Layout already running, ignoring request.");return}if(c.length===0){console.warn("[ForceLayout] No nodes to layout.");return}m.current=!0;const y=c.map(w=>{var x,E;const S=w.width||80,A=w.height||80;return{id:w.id,x:((x=w.position)==null?void 0:x.x)||0,y:((E=w.position)==null?void 0:E.y)||0,width:S,height:A,radius:Math.max(S,A)+80}}),v=YC(y).force("charge",qC().strength(r).distanceMax(900)).force("collide",CC().radius(w=>w.radius).strength(2).iterations(8)).force("link",NC(h()).id(w=>w.id).strength(l)).force("center",aC(0,0)).stop();return console.log("[ForceLayout] Starting simulation..."),new Promise(w=>{let S=0;function A(){if(S>=o){console.log(`[ForceLayout] Reached max iterations (${o}), finalizing.`),x();return}v.tick(),S++;let E=!1;for(let D=0;D{if(d.hasNode(D.id)){const R={x:Math.round(D.x),y:Math.round(D.y)};p({nodeId:D.id,position:R}),E.push({nodeId:D.id,position:R})}}),e&&E.length>0&&(console.log(`[ForceLayout] Saving ${E.length} positions via callback...`),Promise.resolve(e(E)).then(()=>console.log("[ForceLayout] Positions saved successfully.")).catch(D=>console.error("[ForceLayout] Error saving positions:",D))),console.log("[ForceLayout] Layout complete."),m.current=!1,w()}requestAnimationFrame(A)})},isRunning:m.current}};Jr();function _m(){const n=Oe.c(34),e=he(id),o=he(ku),r=he(Tu),l=he(ml),c=he(tm),d=he(em),p=ge(nm),m=ge(im),h=ge(om),g=ge(rm),y=ge(am),v=ge(sm),w=ge(lm),S=ge(cm);let A;n[0]!==p?(A=(G,Y)=>{p({event:G,actionId:Y})},n[0]=p,n[1]=A):A=n[1];const x=A;let E;n[2]!==m?(E=G=>{m(G)},n[2]=m,n[3]=E):E=n[3];const D=E;let R;n[4]!==h?(R=(G,Y)=>h({name:G,description:Y}),n[4]=h,n[5]=R):R=n[5];const _=R;let N;n[6]!==g?(N=G=>{g(G)},n[6]=g,n[7]=N):N=n[7];const T=N;let O;n[8]!==y?(O=G=>{y(G)},n[8]=y,n[9]=O):O=n[9];const M=O;let $;n[10]!==v?($=()=>{v()},n[10]=v,n[11]=$):$=n[11];const L=$;let X;n[12]!==w?(X=()=>{w()},n[12]=w,n[13]=X):X=n[13];const ae=X;let te;n[14]!==S?(te=G=>{S(G)},n[14]=S,n[15]=te):te=n[15];const me=te;let ce;n[16]!==e?(ce=G=>Nu(e,G),n[16]=e,n[17]=ce):ce=n[17];const j=ce;let I;return n[18]!==r||n[19]!==o||n[20]!==l||n[21]!==D||n[22]!==M||n[23]!==j||n[24]!==c||n[25]!==d||n[26]!==e||n[27]!==L||n[28]!==_||n[29]!==x||n[30]!==me||n[31]!==ae||n[32]!==T?(I={mappings:e,activePresetId:o,activePreset:r,allPresets:l,hasUnsavedChanges:c,isPanelOpen:d,setEventMapping:x,applyPreset:D,saveAsPreset:_,updatePreset:T,deletePreset:M,resetSettings:L,togglePanel:ae,setPanelOpen:me,getActionForEvent:j},n[18]=r,n[19]=o,n[20]=l,n[21]=D,n[22]=M,n[23]=j,n[24]=c,n[25]=d,n[26]=e,n[27]=L,n[28]=_,n[29]=x,n[30]=me,n[31]=ae,n[32]=T,n[33]=I):I=n[33],I}Tn();cn();Qp();ds();Zt();L2();Jr();function bN(n){const e=Oe.c(76);let o;e[0]!==n?(o=n===void 0?{}:n,e[0]=n,e[1]=o):o=e[1];const r=o,{onDeleteNode:l,onOpenContextMenu:c,onCreateNode:d,onApplyForceLayout:p}=r,m=Tl(),h=ge(Pu),g=ge(Ol),y=ge(cs),v=ge(Ju),w=ge(Yp);ge(Ku);const S=ge(zl),{fitToBounds:A}=Am(),x=ge(Xp),E=ge(Kp),D=ge(Rl),R=ge(jl),_=he(id);let N;e[2]!==h?(N=Ee=>{h(Ee)},e[2]=h,e[3]=N):N=e[3];let T;e[4]!==g?(T=Ee=>{g([Ee])},e[4]=g,e[5]=T):T=e[5];let O;e[6]!==y?(O=()=>{y()},e[6]=y,e[7]=O):O=e[7];let M;e[8]!==m?(M=()=>Array.from(m.get(tt)),e[8]=m,e[9]=M):M=e[9];let $;e[10]!==A?($=(Ee,Be)=>{const et=Ee==="graph"?No.Graph:No.Selection;A(et,Be)},e[10]=A,e[11]=$):$=e[11];let L;e[12]!==m?(L=Ee=>{const et=m.get(ls).find(ft=>ft.id===Ee);if(et){const{x:ft,y:un,width:St,height:ht}=et,zt=St===void 0?200:St,Gt=ht===void 0?100:ht,on=m.get(Tt),rn=ft+zt/2,Ve=un+Gt/2,Bt=m.get(Zn),wn=Bt?Bt.width/2:400,xn=Bt?Bt.height/2:300;m.set(nn,{x:wn-rn*on,y:xn-Ve*on})}},e[12]=m,e[13]=L):L=e[13];let X;e[14]!==S?(X=()=>{S()},e[14]=S,e[15]=X):X=e[15];let ae;e[16]!==x?(ae=Ee=>{x({nodeId:Ee})},e[16]=x,e[17]=ae):ae=e[17];let te;e[18]!==E?(te=Ee=>{E()},e[18]=E,e[19]=te):te=e[19];let me;e[20]!==x||e[21]!==m||e[22]!==E?(me=Ee=>{m.get(fr)===Ee?E():x({nodeId:Ee})},e[20]=x,e[21]=m,e[22]=E,e[23]=me):me=e[23];let ce;e[24]!==l?(ce=async Ee=>{l?await l(Ee):console.warn("deleteNode called but onDeleteNode callback not provided")},e[24]=l,e[25]=ce):ce=e[25];let j;e[26]!==m?(j=Ee=>m.get(fr)===Ee,e[26]=m,e[27]=j):j=e[27];let I;e[28]!==p?(I=async()=>{p?await p():console.warn("applyForceLayout called but onApplyForceLayout callback not provided")},e[28]=p,e[29]=I):I=e[29];let G;e[30]!==D?(G=()=>{D()},e[30]=D,e[31]=G):G=e[31];let Y;e[32]!==R?(Y=()=>{R()},e[32]=R,e[33]=Y):Y=e[33];let V,k;e[34]!==m?(V=()=>m.get(td),k=()=>m.get(nd),e[34]=m,e[35]=V,e[36]=k):(V=e[35],k=e[36]);let H;e[37]!==v?(H=Ee=>{v(Ee)},e[37]=v,e[38]=H):H=e[38];let F;e[39]!==w?(F=()=>{w()},e[39]=w,e[40]=F):F=e[40];let oe;e[41]!==d||e[42]!==c||e[43]!==te||e[44]!==me||e[45]!==ce||e[46]!==j||e[47]!==I||e[48]!==G||e[49]!==Y||e[50]!==V||e[51]!==k||e[52]!==H||e[53]!==N||e[54]!==F||e[55]!==T||e[56]!==O||e[57]!==M||e[58]!==$||e[59]!==L||e[60]!==X||e[61]!==ae?(oe={selectNode:N,addToSelection:T,clearSelection:O,getSelectedNodeIds:M,fitToBounds:$,centerOnNode:L,resetViewport:X,lockNode:ae,unlockNode:te,toggleLock:me,deleteNode:ce,isNodeLocked:j,applyForceLayout:I,undo:G,redo:Y,canUndo:V,canRedo:k,selectEdge:H,clearEdgeSelection:F,openContextMenu:c,createNode:d},e[41]=d,e[42]=c,e[43]=te,e[44]=me,e[45]=ce,e[46]=j,e[47]=I,e[48]=G,e[49]=Y,e[50]=V,e[51]=k,e[52]=H,e[53]=N,e[54]=F,e[55]=T,e[56]=O,e[57]=M,e[58]=$,e[59]=L,e[60]=X,e[61]=ae,e[62]=oe):oe=e[62];const J=oe;let W;e[63]!==J?(W=async(Ee,Be)=>mp(Ee,Be,J),e[63]=J,e[64]=W):W=e[64];const ue=W;let xe;e[65]!==J||e[66]!==_?(xe=async(Ee,Be)=>{const et=Nu(_,Ee);return mp(et,Be,J)},e[65]=J,e[66]=_,e[67]=xe):xe=e[67];const de=xe;let Te;e[68]!==_?(Te=Ee=>Nu(_,Ee),e[68]=_,e[69]=Te):Te=e[69];const Ce=Te;let Se;return e[70]!==ue||e[71]!==de||e[72]!==Ce||e[73]!==J||e[74]!==_?(Se={executeActionById:ue,executeEventAction:de,getActionForEvent:Ce,mappings:_,helpers:J},e[70]=ue,e[71]=de,e[72]=Ce,e[73]=J,e[74]=_,e[75]=Se):Se=e[75],Se}var wN=class{constructor(){cp(this,"commands",new Map),cp(this,"aliases",new Map)}register(n){if(this.commands.has(n.name))throw new Error(`Command "${n.name}" is already registered`);if(this.commands.set(n.name,n),n.aliases)for(const e of n.aliases){if(this.aliases.has(e))throw new Error(`Alias "${e}" is already registered for command "${this.aliases.get(e)}"`);if(this.commands.has(e))throw new Error(`Alias "${e}" conflicts with existing command name`);this.aliases.set(e,n.name)}}unregister(n){const e=this.commands.get(n);if(e){if(e.aliases)for(const o of e.aliases)this.aliases.delete(o);this.commands.delete(n)}}get(n){const e=this.commands.get(n);if(e)return e;const o=this.aliases.get(n);if(o)return this.commands.get(o)}has(n){return this.commands.has(n)||this.aliases.has(n)}search(n){var l,c,d;if(!n.trim())return this.all();const e=n.toLowerCase().trim(),o=[],r=Array.from(this.commands.values());for(const p of r){let m=0;p.name.toLowerCase()===e?m=100:p.name.toLowerCase().startsWith(e)?m=80:p.name.toLowerCase().includes(e)?m=60:(l=p.aliases)!=null&&l.some(h=>h.toLowerCase()===e)?m=90:(c=p.aliases)!=null&&c.some(h=>h.toLowerCase().startsWith(e))?m=70:(d=p.aliases)!=null&&d.some(h=>h.toLowerCase().includes(e))?m=50:p.description.toLowerCase().includes(e)&&(m=30),m>0&&o.push({command:p,score:m})}return o.sort((p,m)=>m.score-p.score||p.command.name.localeCompare(m.command.name)).map(p=>p.command)}all(){return Array.from(this.commands.values()).sort((n,e)=>n.name.localeCompare(e.name))}byCategory(n){return this.all().filter(e=>e.category===n)}categories(){const n=new Set,e=Array.from(this.commands.values());for(const o of e)n.add(o.category);return Array.from(n).sort()}get size(){return this.commands.size}clear(){this.commands.clear(),this.aliases.clear()}toJSON(){return this.all().map(n=>({name:n.name,aliases:n.aliases||[],description:n.description,category:n.category,inputs:n.inputs.map(e=>({name:e.name,type:e.type,prompt:e.prompt,required:e.required!==!1}))}))}},To=new wN;function En(n){To.register(n)}var Bi=K({type:"normal"}),sd=K(!1),Dt=K({phase:"idle"}),Cl=K(null),vp=Sb("canvas-command-history",[]),ld=K(0),xN=K(null),Q2=K(null,(n,e)=>{e(sd,!0),e(Dt,{phase:"searching",query:"",suggestions:To.all()}),e(ld,0)}),Cm=K(null,(n,e)=>{e(sd,!1),e(Dt,{phase:"idle"}),e(Bi,{type:"normal"}),e(Cl,null),e(xN,null)}),SN=K(null,(n,e,o)=>{const r=To.search(o);e(Dt,{phase:"searching",query:o,suggestions:r}),e(ld,0)}),Z2=K(null,(n,e,o)=>{const r=n(vp),l=[o.name,...r.filter(d=>d!==o.name)].slice(0,50);if(e(vp,l),o.inputs.length===0){e(Dt,{phase:"executing",command:o});return}e(Dt,{phase:"collecting",command:o,inputIndex:0,collected:{}});const c=o.inputs[0];e(Bi,Em(c))}),I2=K(null,(n,e,o)=>{const r=n(Dt);if(r.phase!=="collecting")return;const{command:l,inputIndex:c,collected:d}=r,p=l.inputs[c];if(p.validate){const h=p.validate(o,d);if(h!==!0){e(Dt,{phase:"error",message:typeof h=="string"?h:`Invalid value for ${p.name}`});return}}const m={...d,[p.name]:o};if(c{const o=n(Dt);if(o.phase!=="collecting")return;const{command:r,inputIndex:l}=o,c=r.inputs[l];if(c.required!==!1)return;const d=c.default;e(I2,d)}),_N=K(null,(n,e)=>{const o=n(Dt);if(o.phase!=="collecting")return;const{command:r,inputIndex:l,collected:c}=o;if(l===0){e(Dt,{phase:"searching",query:r.name,suggestions:[r]}),e(Bi,{type:"normal"});return}const d=l-1,p=r.inputs[d],m={...c};delete m[p.name],e(Dt,{phase:"collecting",command:r,inputIndex:d,collected:m}),e(Bi,Em(p,m))}),CN=K(null,(n,e,o)=>{e(Dt,{phase:"error",message:o}),e(Bi,{type:"normal"})});K(null,(n,e)=>{e(Dt,{phase:"idle"})});K(n=>{const e=n(Dt);return e.phase==="collecting"||e.phase==="executing"});var F2=K(n=>{const e=n(Dt);return e.phase!=="collecting"?null:e.command.inputs[e.inputIndex]}),P2=K(n=>{const e=n(Dt);return e.phase!=="collecting"?null:{current:e.inputIndex+1,total:e.command.inputs.length}});function Em(n,e){switch(n.type){case"point":return{type:"pickPoint",prompt:n.prompt,snapToGrid:n.snapToGrid};case"node":return{type:"pickNode",prompt:n.prompt,filter:n.filter?o=>n.filter(o,e||{}):void 0};case"nodes":return{type:"pickNodes",prompt:n.prompt,filter:n.filter?o=>n.filter(o,e||{}):void 0};case"select":return{type:"select",prompt:n.prompt,options:n.options||[]};case"text":case"number":case"color":case"boolean":default:return{type:"text",prompt:n.prompt}}}Ul();Jr();function EN(){const n=Oe.c(8),e=he(fm),o=ge(um),r=ge(dm);let l,c;n[0]!==o?(l=()=>o(!0),c=()=>o(!1),n[0]=o,n[1]=l,n[2]=c):(l=n[1],c=n[2]);let d;return n[3]!==e||n[4]!==l||n[5]!==c||n[6]!==r?(d={...e,enable:l,disable:c,toggle:r},n[3]=e,n[4]=l,n[5]=c,n[6]=r,n[7]=d):d=n[7],d}Mo();var bp=({x1:n,y1:e,x2:o,y2:r})=>{const l=Math.abs(o-n),c=Math.max(l*.5,50),d=n+c,p=e,m=o-c,g=`M ${n} ${e} C ${d} ${p}, ${m} ${r}, ${o} ${r}`,y=(n+o)/2,v=(e+r)/2;return{path:g,labelX:y,labelY:v}},J2=({x1:n,y1:e,x2:o,y2:r})=>{const l=Math.abs(r-e),c=Math.max(l*.5,50),d=n,p=e+c,m=o,h=r-c,g=`M ${n} ${e} C ${d} ${p}, ${m} ${h}, ${o} ${r}`,y=(n+o)/2,v=(e+r)/2;return{path:g,labelX:y,labelY:v}},NN=n=>{const{x1:e,y1:o,x2:r,y2:l}=n,c=Math.abs(r-e),d=Math.abs(l-o);return c>d?bp(n):J2(n)},kN=({x1:n,y1:e,x2:o,y2:r})=>{const l=`M ${n} ${e} L ${o} ${r}`,c=(n+o)/2,d=(e+r)/2;return{path:l,labelX:c,labelY:d}},Nm=({x1:n,y1:e,x2:o,y2:r})=>{const l=(n+o)/2,c=`M ${n} ${e} L ${l} ${e} L ${l} ${r} L ${o} ${r}`,d=l,p=(e+r)/2;return{path:c,labelX:d,labelY:p}},W2=({x1:n,y1:e,x2:o,y2:r})=>{const l=(e+r)/2,c=`M ${n} ${e} L ${n} ${l} L ${o} ${l} L ${o} ${r}`,d=(n+o)/2;return{path:c,labelX:d,labelY:l}},TN=n=>{const{x1:e,y1:o,x2:r,y2:l}=n,c=Math.abs(r-e),d=Math.abs(l-o);return c>d?Nm(n):W2(n)},DN=({x1:n,y1:e,x2:o,y2:r})=>{const l=(n+o)/2,c=Math.min(20,Math.abs(o-n)/4,Math.abs(r-e)/2);if(c<5||Math.abs(r-e)e?1:-1,p=` + M ${n} ${e} + L ${l-c} ${e} + Q ${l} ${e}, ${l} ${e+c*d} + L ${l} ${r-c*d} + Q ${l} ${r}, ${l+c} ${r} + L ${o} ${r} + `.replace(/\s+/g," ").trim(),m=l,h=(e+r)/2;return{path:p,labelX:m,labelY:h}};function MN(n){switch(n){case"bezier":return bp;case"bezier-vertical":return J2;case"bezier-smart":return NN;case"straight":return kN;case"step":return Nm;case"step-vertical":return W2;case"step-smart":return TN;case"smooth-step":return DN;default:return bp}}K(null);zo();zo();zo();zo();zo();zo();var ew={background:{color:"#f0f0f0",gradient:{from:"#f0f0f0",to:"#e0e0e0",angle:180},pattern:"none"},grid:{visible:!0,minorLineColor:"rgba(0, 0, 0, 0.05)",majorLineColor:"rgba(0, 0, 0, 0.1)",opacity:1},axes:{visible:!0,color:"rgba(0, 0, 0, 0.3)",labelColor:"rgba(0, 0, 0, 0.7)",tickColor:"rgba(0, 0, 0, 0.3)"},nodes:{defaultBackground:"#FAFAFA",defaultBorderColor:"rgba(0, 0, 0, 0.06)",defaultBorderRadius:12,selectedBorderColor:"#FF9800",selectedGlowColor:"rgba(255, 152, 0, 0.5)",shadowColor:"rgba(0, 0, 0, 0.1)",shadowOpacity:1,draggingBackgroundColor:"#FAFAFAd9",draggingBorderColor:"#CCCCCC",resizeHandleColor:"rgba(0, 0, 0, 0.2)",resizeHandleActiveColor:"rgba(59, 130, 246, 0.8)"},edges:{defaultColor:"#cccccc",defaultWeight:1.5,labelColor:"#FFFFFF",labelStrokeColor:"#000000",pathType:"bezier"}},zN={background:{color:"#0f172a",gradient:{from:"#0f172a",to:"#1e293b",angle:180},pattern:"none"},grid:{visible:!0,minorLineColor:"rgba(255, 255, 255, 0.06)",majorLineColor:"rgba(255, 255, 255, 0.12)",opacity:1},axes:{visible:!0,color:"rgba(255, 255, 255, 0.35)",labelColor:"rgba(255, 255, 255, 0.7)",tickColor:"rgba(255, 255, 255, 0.35)"},nodes:{defaultBackground:"#FAFAFA",defaultBorderColor:"rgba(0, 0, 0, 0.06)",defaultBorderRadius:12,selectedBorderColor:"#FF9800",selectedGlowColor:"rgba(255, 152, 0, 0.5)",shadowColor:"rgba(0, 0, 0, 0.1)",shadowOpacity:1,draggingBackgroundColor:"#FAFAFAd9",draggingBorderColor:"#666666",resizeHandleColor:"rgba(255, 255, 255, 0.2)",resizeHandleActiveColor:"rgba(96, 165, 250, 0.8)"},edges:{defaultColor:"#cccccc",defaultWeight:1.5,labelColor:"#FFFFFF",labelStrokeColor:"#000000",pathType:"bezier"}};function ON(n,e){const o=e?zN:ew;return n?{background:{...o.background,...n.background},grid:{...o.grid,...n.grid},axes:{...o.axes,...n.axes},nodes:{...o.nodes,...n.nodes},edges:{...o.edges,...n.edges}}:o}var RN=K(ew),jN=K(!1),LN=K(void 0),tw=ne.createContext(null),UN=["--canvas-bg","--node-bg","--node-border","--node-radius","--node-selected-border","--node-selected-glow","--node-shadow","--node-shadow-opacity","--node-dragging-bg","--node-dragging-border","--node-resize-handle","--node-resize-handle-active","--edge-color","--edge-weight","--edge-label-color","--edge-label-stroke"];function GN(n,e){var c,d;const{nodes:o,edges:r,background:l}=e;n.style.setProperty("--canvas-bg",l.color||""),n.style.setProperty("--node-bg",o.defaultBackground||""),n.style.setProperty("--node-border",o.defaultBorderColor||""),n.style.setProperty("--node-radius",o.defaultBorderRadius?`${o.defaultBorderRadius}px`:"8px"),n.style.setProperty("--node-selected-border",o.selectedBorderColor||""),n.style.setProperty("--node-selected-glow",o.selectedGlowColor||""),n.style.setProperty("--node-shadow",o.shadowColor||""),n.style.setProperty("--node-shadow-opacity",((c=o.shadowOpacity)==null?void 0:c.toString())||"0.2"),n.style.setProperty("--node-dragging-bg",o.draggingBackgroundColor||""),n.style.setProperty("--node-dragging-border",o.draggingBorderColor||""),n.style.setProperty("--node-resize-handle",o.resizeHandleColor||""),n.style.setProperty("--node-resize-handle-active",o.resizeHandleActiveColor||""),n.style.setProperty("--edge-color",r.defaultColor||""),n.style.setProperty("--edge-weight",((d=r.defaultWeight)==null?void 0:d.toString())||"1.5"),n.style.setProperty("--edge-label-color",r.labelColor||""),n.style.setProperty("--edge-label-stroke",r.labelStrokeColor||"")}function BN(n){UN.forEach(e=>{n.style.removeProperty(e)})}function HN(n){const e=Oe.c(24),{children:o,styles:r,isDark:l}=n,c=l===void 0?!1:l,d=ne.useRef(null),[p,m]=Ci(LN),[h,g]=Ci(jN),y=ge(RN),v=p??r,w=h||c;let S;e[0]!==w||e[1]!==v?(S=ON(v,w),e[0]=w,e[1]=v,e[2]=S):S=e[2];const A=S;let x,E;e[3]!==A||e[4]!==y?(x=()=>{y(A)},E=[A,y],e[3]=A,e[4]=y,e[5]=x,e[6]=E):(x=e[5],E=e[6]),ne.useLayoutEffect(x,E);let D;e[7]!==A?(D=te=>{if(d.current=te,!!te)return GN(te,A),()=>BN(te)},e[7]=A,e[8]=D):D=e[8];const R=D;let _;e[9]!==m?(_=te=>{m(te)},e[9]=m,e[10]=_):_=e[10];const N=_;let T;e[11]!==g?(T=te=>{g(te)},e[11]=g,e[12]=T):T=e[12];const O=T;let M;e[13]!==A||e[14]!==O||e[15]!==N?(M={styles:A,containerRef:d,setStyles:N,setDarkMode:O},e[13]=A,e[14]=O,e[15]=N,e[16]=M):M=e[16];const $=M;let L;e[17]===Symbol.for("react.memo_cache_sentinel")?(L={display:"contents"},e[17]=L):L=e[17];let X;e[18]!==o||e[19]!==R?(X=z.jsx("div",{ref:R,className:"canvas-style-scope",style:L,children:o}),e[18]=o,e[19]=R,e[20]=X):X=e[20];let ae;return e[21]!==$||e[22]!==X?(ae=z.jsx(tw,{value:$,children:X}),e[21]=$,e[22]=X,e[23]=ae):ae=e[23],ae}function cd(){const n=ne.useContext(tw);if(!n)throw new Error("useCanvasStyle must be used within a CanvasStyleProvider");return n.styles}Zt();new mE({defaultOptions:{queries:{staleTime:1e3*60,refetchOnWindowFocus:!1}}});cn();Tn();vm();ad();X2();function $N(n){const e=Oe.c(19),{pan:o,zoom:r,viewportWidth:l,viewportHeight:c,gridSize:d,majorGridSize:p}=n,m=d===void 0?50:d,h=p===void 0?250:p,g=cd();if(!g.grid.visible||!l||!c||r<=0)return null;let y,v;if(e[0]!==m||e[1]!==h||e[2]!==o.x||e[3]!==o.y||e[4]!==g.grid.majorLineColor||e[5]!==g.grid.minorLineColor||e[6]!==g.grid.opacity||e[7]!==c||e[8]!==l||e[9]!==r){v=[];const x=g.grid.minorLineColor,E=g.grid.majorLineColor;y=g.grid.opacity;const D=-o.x/r,R=-o.y/r,_=(-o.x+l)/r,N=(-o.y+c)/r,T=Math.ceil(D/m)*m;for(let L=T;L<=_;L=L+m,L)L%h!==0&&v.push(z.jsx("line",{x1:L,y1:R,x2:L,y2:N,stroke:x,strokeWidth:1/r},`v-${L}`));const O=Math.ceil(R/m)*m;for(let L=O;L<=N;L=L+m,L)L%h!==0&&v.push(z.jsx("line",{x1:D,y1:L,x2:_,y2:L,stroke:x,strokeWidth:1/r},`h-${L}`));const M=Math.ceil(D/h)*h;for(let L=M;L<=_;L=L+h,L)v.push(z.jsx("line",{x1:L,y1:R,x2:L,y2:N,stroke:E,strokeWidth:1.5/r},`major-v-${L}`));const $=Math.ceil(R/h)*h;for(let L=$;L<=N;L=L+h,L)v.push(z.jsx("line",{x1:D,y1:L,x2:_,y2:L,stroke:E,strokeWidth:1.5/r},`major-h-${L}`));e[0]=m,e[1]=h,e[2]=o.x,e[3]=o.y,e[4]=g.grid.majorLineColor,e[5]=g.grid.minorLineColor,e[6]=g.grid.opacity,e[7]=c,e[8]=l,e[9]=r,e[10]=y,e[11]=v}else y=e[10],v=e[11];let w;e[12]!==y?(w={position:"absolute",top:0,left:0,overflow:"visible",pointerEvents:"none",opacity:y},e[12]=y,e[13]=w):w=e[13];let S;e[14]!==v?(S=z.jsx("g",{children:v}),e[14]=v,e[15]=S):S=e[15];let A;return e[16]!==w||e[17]!==S?(A=z.jsx("svg",{width:"100%",height:"100%",style:w,children:S}),e[16]=w,e[17]=S,e[18]=A):A=e[18],A}function YN(n){const e=Oe.c(31),{pan:o,zoom:r,viewportWidth:l,viewportHeight:c,tickSize:d,labelSize:p}=n,m=d===void 0?100:d,h=p===void 0?12:p,g=cd();if(!g.axes.visible||!l||!c||r<=0)return null;let y;e[0]!==m||e[1]!==r?(y=()=>{const E=80/r,D=[50,100,250,500,1e3,2500,5e3,1e4];for(const R of D)if(R>=E)return Math.max(R,m);return 1e4},e[0]=m,e[1]=r,e[2]=y):y=e[2];const w=y();let S;if(e[3]!==w||e[4]!==h||e[5]!==o.x||e[6]!==o.y||e[7]!==g.axes.color||e[8]!==g.axes.labelColor||e[9]!==c||e[10]!==l||e[11]!==r){S=[];const E=1.5/r,D=5/r,R=8/r,_=h/r,N=g.axes.color,T=g.axes.labelColor,O=-o.x/r,M=-o.y/r,$=(-o.x+l)/r,L=(-o.y+c)/r;if(M<=0&&L>=0){let X;e[13]!==N||e[14]!==E||e[15]!==O||e[16]!==$?(X=z.jsx("line",{x1:O,y1:0,x2:$,y2:0,stroke:N,strokeWidth:E},"x-axis"),e[13]=N,e[14]=E,e[15]=O,e[16]=$,e[17]=X):X=e[17],S.push(X);const ae=Math.ceil(O/w)*w;for(let te=ae;te<=$;te=te+w,te)te===0&&O<=0&&$>=0||(S.push(z.jsx("line",{x1:te,y1:-D,x2:te,y2:D,stroke:N,strokeWidth:E/1.5},`x-tick-${te}`)),S.push(z.jsx("text",{x:te,y:D+R,fill:T,fontSize:_,textAnchor:"middle",dominantBaseline:"hanging",children:te},`x-label-${te}`)))}if(O<=0&&$>=0){let X;e[18]!==N||e[19]!==E||e[20]!==L||e[21]!==M?(X=z.jsx("line",{x1:0,y1:M,x2:0,y2:L,stroke:N,strokeWidth:E},"y-axis"),e[18]=N,e[19]=E,e[20]=L,e[21]=M,e[22]=X):X=e[22],S.push(X);const ae=Math.ceil(M/w)*w;for(let te=ae;te<=L;te=te+w,te)te===0&&M<=0&&L>=0||(S.push(z.jsx("line",{x1:-D,y1:te,x2:D,y2:te,stroke:N,strokeWidth:E/1.5},`y-tick-${te}`)),S.push(z.jsx("text",{x:D+R,y:te,fill:T,fontSize:_,textAnchor:"start",dominantBaseline:"middle",children:te},`y-label-${te}`)))}if(O<=0&&$>=0&&M<=0&&L>=0){const X=-R,ae=_*1.1;let te;e[23]!==T||e[24]!==R||e[25]!==X||e[26]!==ae?(te=z.jsx("text",{x:R,y:X,fill:T,fontSize:ae,textAnchor:"start",dominantBaseline:"alphabetic",children:"(0,0)"},"origin-label"),e[23]=T,e[24]=R,e[25]=X,e[26]=ae,e[27]=te):te=e[27],S.push(te)}e[3]=w,e[4]=h,e[5]=o.x,e[6]=o.y,e[7]=g.axes.color,e[8]=g.axes.labelColor,e[9]=c,e[10]=l,e[11]=r,e[12]=S}else S=e[12];let A;e[28]===Symbol.for("react.memo_cache_sentinel")?(A={position:"absolute",top:0,left:0,overflow:"visible",pointerEvents:"none"},e[28]=A):A=e[28];let x;return e[29]!==S?(x=z.jsx("svg",{width:"100%",height:"100%",style:A,children:z.jsx("g",{children:S})}),e[29]=S,e[30]=x):x=e[30],x}var S1=.92,A1=.5,qN=5;function VN(n){const e=Oe.c(107),{children:o,minZoom:r,maxZoom:l,zoomSensitivity:c,className:d,style:p,enablePan:m,enableZoom:h,onBackgroundClick:g,onBackgroundDoubleClick:y,onBackgroundRightClick:v,onBackgroundLongPress:w,onBackgroundPointerDown:S}=n,A=r===void 0?.1:r,x=l===void 0?5:l,E=c===void 0?.0015:c,D=m===void 0?!0:m,R=h===void 0?!0:h,[_,N]=Ci(nn),[T,O]=Ci(Tt),M=ge(Zn),$=he(Zn),L=ge(cs),X=he(tt),ae=ge(xm),te=ge(Sm),me=he(bm),ce=he(zu),j=ne.useRef(null);let I;e[0]===Symbol.for("react.memo_cache_sentinel")?(I={x:0,y:0},e[0]=I):I=e[0];const G=ne.useRef(I),Y=ne.useRef(!1),V=ne.useRef("mouse"),k=ne.useRef(null);let H;e[1]===Symbol.for("react.memo_cache_sentinel")?(H=[],e[1]=H):H=e[1];const F=ne.useRef(H),oe=ne.useRef(null),J=ne.useRef(null),W=ne.useRef(!1);let ue,xe;e[2]!==M?(ue=()=>{const be=j.current;if(be){M(be.getBoundingClientRect());const Xe=new ResizeObserver(ct=>{for(const bt of ct)M(bt.contentRect)});return Xe.observe(be),()=>{be&&Xe.unobserve(be),Xe.disconnect()}}else M(null)},xe=[M],e[2]=M,e[3]=ue,e[4]=xe):(ue=e[3],xe=e[4]),ne.useEffect(ue,xe);let de,Te;e[5]===Symbol.for("react.memo_cache_sentinel")?(de=()=>()=>{k.current&&cancelAnimationFrame(k.current)},Te=[],e[5]=de,e[6]=Te):(de=e[5],Te=e[6]),ne.useEffect(de,Te);let Ce;e[7]!==_.x||e[8]!==_.y||e[9]!==T?(Ce=(be,Xe)=>{if(!j.current)return{x:0,y:0};const ct=j.current.getBoundingClientRect(),bt=(be-ct.left-_.x)/T,Rt=(Xe-ct.top-_.y)/T;return{x:bt,y:Rt}},e[7]=_.x,e[8]=_.y,e[9]=T,e[10]=Ce):Ce=e[10];const Se=Ce;let Ee;e[11]===Symbol.for("react.memo_cache_sentinel")?(Ee=be=>{if(!j.current||!be)return!1;const Xe=j.current.firstChild;return be===j.current||be===Xe},e[11]=Ee):Ee=e[11];const Be=Ee;let et;e[12]!==y||e[13]!==Se?(et=be=>{if(!y||!Be(be.target))return;be.preventDefault(),be.stopPropagation();const Xe=Se(be.clientX,be.clientY);y(Xe)},e[12]=y,e[13]=Se,e[14]=et):et=e[14];const ft=et;let un;e[15]!==v||e[16]!==Se?(un=be=>{if(!v||!Be(be.target))return;be.preventDefault(),be.stopPropagation();const Xe=Se(be.clientX,be.clientY);v(Xe,be)},e[15]=v,e[16]=Se,e[17]=un):un=e[17];const St=un;let ht;e[18]===Symbol.for("react.memo_cache_sentinel")?(ht=()=>{J.current&&(clearTimeout(J.current),J.current=null)},e[18]=ht):ht=e[18];const zt=ht;let Gt;e[19]!==N?(Gt=(be,Xe)=>{k.current&&cancelAnimationFrame(k.current);let ct=be,bt=Xe;const Rt=()=>{if(ct=ct*S1,bt=bt*S1,Math.abs(ct)({x:At.x+ct,y:At.y+bt})),k.current=requestAnimationFrame(Rt)};k.current=requestAnimationFrame(Rt)},e[19]=N,e[20]=Gt):Gt=e[20];const on=Gt;let rn;e[21]===Symbol.for("react.memo_cache_sentinel")?(rn=()=>{const be=F.current;if(be.length<2)return{vx:0,vy:0};const Xe=be[be.length-1],ct=be[0];if((Xe.t-ct.t)/1e3<=0)return{vx:0,vy:0};let Rt=0,At=0;for(const Ht of be)Rt=Rt+Ht.vx,At=At+Ht.vy;return{vx:Rt/be.length,vy:At/be.length}},e[21]=rn):rn=e[21];const Ve=rn;let Bt;e[22]!==me||e[23]!==w||e[24]!==S||e[25]!==Se||e[26]!==ae?(Bt=be=>{var bt;if(!j.current){Y.current=!1;return}const Xe=G2(be.event);ae(Xe),V.current=Xe.source,k.current&&(cancelAnimationFrame(k.current),k.current=null);const ct=(bt=j.current)==null?void 0:bt.firstChild;if(be.event.target===j.current||be.event.target===ct){Y.current=!0;const Rt=Se(be.event.clientX,be.event.clientY);if(S==null||S(Rt,be.event),w&&(Xe.source==="finger"||Xe.source==="pencil")&&!(Xe.source==="finger"&&me)){W.current=!1,zt();const At=be.event.clientX,Ht=be.event.clientY;J.current=setTimeout(()=>{W.current=!0;const zn=Se(At,Ht);w(zn),J.current=null},600)}}else Y.current=!1},e[22]=me,e[23]=w,e[24]=S,e[25]=Se,e[26]=ae,e[27]=Bt):Bt=e[27];let wn;e[28]!==te?(wn=be=>{te(be.event.pointerId),zt()},e[28]=te,e[29]=wn):wn=e[29];let xn;e[30]!==D||e[31]!==_?(xn=()=>{Y.current&&D&&(G.current={..._},F.current=[],oe.current=null)},e[30]=D,e[31]=_,e[32]=xn):xn=e[32];let dt;e[33]!==L||e[34]!==D||e[35]!==me||e[36]!==g||e[37]!==Se||e[38]!==N?(dt=be=>{const{movement:Xe,tap:ct,active:bt,pinching:Rt,event:At,velocity:Ht,direction:zn}=be,[Bn,$t]=Xe,[nt,wt]=Ht,[An,hn]=zn;if(ct&&Y.current){zt(),W.current||(g?g(Se(At.clientX,At.clientY)):L()),W.current=!1;return}if(!ct&&bt&&D&&!Rt&&Y.current&&(zt(),q2({source:V.current,type:"drag",target:"background",isStylusActive:me})==="pan")){const Pe={x:G.current.x+Bn,y:G.current.y+$t};N(Pe);const Ct=performance.now();F.current.push({vx:nt*An,vy:wt*hn,t:Ct}),F.current.length>qN&&F.current.shift()}},e[33]=L,e[34]=D,e[35]=me,e[36]=g,e[37]=Se,e[38]=N,e[39]=dt):dt=e[39];let In;e[40]!==on?(In=()=>{if(zt(),W.current=!1,Y.current&&V.current==="finger"){const be=Ve();Math.sqrt(be.vx**2+be.vy**2)>2&&on(be.vx,be.vy)}Y.current=!1,F.current=[]},e[40]=on,e[41]=In):In=e[41];let Ei;e[42]!==R||e[43]!==x||e[44]!==A||e[45]!==_.x||e[46]!==_.y||e[47]!==X||e[48]!==N||e[49]!==O||e[50]!==E||e[51]!==T?(Ei=be=>{const{event:Xe,pinching:ct,delta:bt,memo:Rt}=be,[,At]=bt;if(Rt===!0||ct||!R||!j.current)return;const Ht=Xe.target,zn=Ht.closest('[data-no-drag="true"]');if(zn){const Ft=Ht.closest('[data-draggable-node="true"]');if(Ft){const Ro=Ft.getAttribute("data-node-id");if(Ro&&X.has(Ro)){let pn=Ht;for(;pn&&zn.contains(pn);){if(pn.scrollHeight>pn.clientHeight){const jo=At>0,Wi=At<0,jt=pn.scrollTop+pn.clientHeight>=pn.scrollHeight-1,hs=pn.scrollTop<=1;if(!jt&&jo||!hs&&Wi||jt&&Wi||hs&&jo)return}pn=pn.parentElement}}}}Xe.preventDefault();const Bn=j.current.getBoundingClientRect(),$t=Xe.clientX-Bn.left,nt=Xe.clientY-Bn.top,wt=($t-_.x)/T,An=(nt-_.y)/T,hn=-At*E*T;let Hn=T+hn;Hn=Math.max(A,Math.min(x,Hn));const Pe=$t-wt*Hn,Ct=nt-An*Hn;O(Hn),N({x:Pe,y:Ct})},e[42]=R,e[43]=x,e[44]=A,e[45]=_.x,e[46]=_.y,e[47]=X,e[48]=N,e[49]=O,e[50]=E,e[51]=T,e[52]=Ei):Ei=e[52];let Fn;e[53]!==R?(Fn=()=>!R||!j.current?!0:(k.current&&(cancelAnimationFrame(k.current),k.current=null),!1),e[53]=R,e[54]=Fn):Fn=e[54];let Hi;e[55]!==R||e[56]!==x||e[57]!==A||e[58]!==_.x||e[59]!==_.y||e[60]!==N||e[61]!==O||e[62]!==T?(Hi=be=>{const{offset:Xe,origin:ct,event:bt,memo:Rt}=be,[At]=Xe,[Ht,zn]=ct;if(Rt===!0||!R||!j.current)return;bt.preventDefault();const Bn=j.current.getBoundingClientRect(),$t=Ht-Bn.left,nt=zn-Bn.top,wt=($t-_.x)/T,An=(nt-_.y)/T;let hn=At;hn=Math.max(A,Math.min(x,hn));const Hn=$t-wt*hn,Pe=nt-An*hn;O(hn),N({x:Hn,y:Pe})},e[55]=R,e[56]=x,e[57]=A,e[58]=_.x,e[59]=_.y,e[60]=N,e[61]=O,e[62]=T,e[63]=Hi):Hi=e[63];let Dn;e[64]!==Bt||e[65]!==wn||e[66]!==xn||e[67]!==dt||e[68]!==In||e[69]!==Ei||e[70]!==Fn||e[71]!==Hi?(Dn={onPointerDown:Bt,onPointerUp:wn,onDragStart:xn,onDrag:dt,onDragEnd:In,onWheel:Ei,onPinchStart:Fn,onPinch:Hi},e[64]=Bt,e[65]=wn,e[66]=xn,e[67]=dt,e[68]=In,e[69]=Ei,e[70]=Fn,e[71]=Hi,e[72]=Dn):Dn=e[72];let Ot;e[73]===Symbol.for("react.memo_cache_sentinel")?(Ot={passive:!1,capture:!0},e[73]=Ot):Ot=e[73];const dn=ce==="finger"?10:5;let vt;e[74]===Symbol.for("react.memo_cache_sentinel")?(vt={touch:!0,keys:!1},e[74]=vt):vt=e[74];let Pn;e[75]!==dn?(Pn={filterTaps:!0,tapsThreshold:dn,pointer:vt},e[75]=dn,e[76]=Pn):Pn=e[76];let Oo;e[77]===Symbol.for("react.memo_cache_sentinel")?(Oo={},e[77]=Oo):Oo=e[77];let Jn;e[78]!==x||e[79]!==A?(Jn=()=>({min:A,max:x}),e[78]=x,e[79]=A,e[80]=Jn):Jn=e[80];let Mn;e[81]!==T?(Mn=()=>[T,0],e[81]=T,e[82]=Mn):Mn=e[82];let Sn;e[83]!==Jn||e[84]!==Mn?(Sn={scaleBounds:Jn,from:Mn},e[83]=Jn,e[84]=Mn,e[85]=Sn):Sn=e[85];let Ni;e[86]!==Pn||e[87]!==Sn?(Ni={target:j,eventOptions:Ot,drag:Pn,wheel:Oo,pinch:Sn},e[86]=Pn,e[87]=Sn,e[88]=Ni):Ni=e[88],zb(Dn,Ni);let It;e[89]!==p?(It={width:"100%",height:"100%",overflow:"hidden",position:"relative",touchAction:"none",userSelect:"none",WebkitUserSelect:"none",WebkitTouchCallout:"none",background:"var(--canvas-bg, #23272a)",...p},e[89]=p,e[90]=It):It=e[90];const $i=`translate(${_.x}px, ${_.y}px) scale(${T})`;let fn;e[91]!==$i?(fn={transform:$i,transformOrigin:"0 0",width:"100%",height:"100%"},e[91]=$i,e[92]=fn):fn=e[92];let Yi;e[93]!==_||e[94]!==$||e[95]!==T?(Yi=$&&$.width>0&&$.height>0&&z.jsxs(z.Fragment,{children:[z.jsx($N,{pan:_,zoom:T,viewportWidth:$.width,viewportHeight:$.height}),z.jsx(YN,{pan:_,zoom:T,viewportWidth:$.width,viewportHeight:$.height})]}),e[93]=_,e[94]=$,e[95]=T,e[96]=Yi):Yi=e[96];let Gn;e[97]!==o||e[98]!==fn||e[99]!==Yi?(Gn=z.jsxs("div",{style:fn,children:[Yi,o]}),e[97]=o,e[98]=fn,e[99]=Yi,e[100]=Gn):Gn=e[100];let qi;return e[101]!==d||e[102]!==St||e[103]!==ft||e[104]!==It||e[105]!==Gn?(qi=z.jsx("div",{ref:j,id:"viewport-canvas",className:d,"data-viewport":"true",onDoubleClick:ft,onContextMenu:St,style:It,children:Gn}),e[101]=d,e[102]=St,e[103]=ft,e[104]=It,e[105]=Gn,e[106]=qi):qi=e[106],qi}Zt();Ul();Zt();Tn();var _1=44,Ya=12,ou="8px";function XN(n){const e={position:"absolute",width:`${_1}px`,height:`${_1}px`,zIndex:10,touchAction:"none",WebkitTouchCallout:"none",WebkitUserSelect:"none",userSelect:"none"};switch(n){case"nw":return{...e,top:-22,left:-22,cursor:"nwse-resize"};case"ne":return{...e,top:-22,right:-22,cursor:"nesw-resize"};case"sw":return{...e,bottom:-22,left:-22,cursor:"nesw-resize"};case"se":return{...e,bottom:-22,right:-22,cursor:"nwse-resize"};case"n":return{...e,top:-22,left:"50%",transform:"translateX(-50%)",cursor:"ns-resize"};case"s":return{...e,bottom:-22,left:"50%",transform:"translateX(-50%)",cursor:"ns-resize"};case"e":return{...e,right:-22,top:"50%",transform:"translateY(-50%)",cursor:"ew-resize"};case"w":return{...e,left:-22,top:"50%",transform:"translateY(-50%)",cursor:"ew-resize"}}}function KN(n,e){const d=`${e?"4px":"3px"} solid ${e?"var(--node-resize-handle-active, rgba(59, 130, 246, 0.8))":"var(--node-resize-handle, rgba(0, 0, 0, 0.2))"}`,p={position:"absolute",pointerEvents:"none",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:`${Ya}px`,height:`${Ya}px`};switch(n){case"nw":return{...p,borderTop:d,borderLeft:d,borderTopLeftRadius:ou};case"ne":return{...p,borderTop:d,borderRight:d,borderTopRightRadius:ou};case"sw":return{...p,borderBottom:d,borderLeft:d,borderBottomLeftRadius:ou};case"se":return{...p,borderBottom:d,borderRight:d,borderBottomRightRadius:ou};case"n":return{...p,borderTop:d,width:`${Ya*2}px`};case"s":return{...p,borderBottom:d,width:`${Ya*2}px`};case"e":return{...p,borderRight:d,height:`${Ya*2}px`};case"w":return{...p,borderLeft:d,height:`${Ya*2}px`}}}function $r(n){const e=Oe.c(26),{direction:o,createResizeStart:r,handleResizeMove:l,handleResizeEnd:c,isResizing:d,alwaysVisible:p}=n,m=p===void 0?!1:p;let h;e[0]!==r||e[1]!==o?(h=r(o),e[0]=r,e[1]=o,e[2]=h):h=e[2];let g;e[3]!==o?(g=XN(o),e[3]=o,e[4]=g):g=e[4];const y=m||d?1:0;let v;e[5]!==g||e[6]!==y?(v={...g,opacity:y,transition:"opacity 200ms"},e[5]=g,e[6]=y,e[7]=v):v=e[7];let w;e[8]!==m?(w=D=>{m||(D.currentTarget.style.opacity="1")},e[8]=m,e[9]=w):w=e[9];let S;e[10]!==m||e[11]!==d?(S=D=>{!m&&!d&&(D.currentTarget.style.opacity="0")},e[10]=m,e[11]=d,e[12]=S):S=e[12];let A;e[13]!==o||e[14]!==d?(A=KN(o,d),e[13]=o,e[14]=d,e[15]=A):A=e[15];let x;e[16]!==A?(x=z.jsx("div",{style:A}),e[16]=A,e[17]=x):x=e[17];let E;return e[18]!==c||e[19]!==l||e[20]!==h||e[21]!==v||e[22]!==w||e[23]!==S||e[24]!==x?(E=z.jsx("div",{"data-no-drag":"true",onPointerDown:h,onPointerMove:l,onPointerUp:c,onPointerCancel:c,style:v,onPointerEnter:w,onPointerLeave:S,children:x}),e[18]=c,e[19]=l,e[20]=h,e[21]=v,e[22]=w,e[23]=S,e[24]=x,e[25]=E):E=e[25],E}function QN(n){const e=Oe.c(137),{nodeData:o,renderContent:r,onClick:l,onDoubleClick:c,onTripleClick:d,onRightClick:p,onLongPress:m,onHover:h,onLeave:g,onPersist:y,onPersistError:v,wrapper:w}=n,{id:S,zIndex:A}=o,x=he(ze),E=ge(Hp),{isSelected:D}=tN(S),R=he(tt),_=he(Gi);let N;e[0]!==S?(N=xi(S),e[0]=S,e[1]=N):N=e[1],he(N),he(wr);const T=cd(),O=ne.useRef(null),M=ne.useRef(null),$=ne.useRef(!1);let L;e[2]!==y||e[3]!==v?(L={onPersist:y,onPersistError:v},e[2]=y,e[3]=v,e[4]=L):L=e[4];const{bind:X,updateNodePositions:ae}=rN(S,L);let te;e[5]!==y||e[6]!==v?(te={onPersist:y,onPersistError:v},e[5]=y,e[6]=v,e[7]=te):te=e[7];const me=te;let ce;e[8]!==S||e[9]!==o||e[10]!==me||e[11]!==ae?(ce={id:S,nodeData:o,updateNodePositions:ae,options:me},e[8]=S,e[9]=o,e[10]=me,e[11]=ae,e[12]=ce):ce=e[12];const{localWidth:j,localHeight:I,isResizing:G,createResizeStart:Y,handleResizeMove:V,handleResizeEnd:k}=lN(ce),H=j,F=I,oe=typeof window<"u"&&("ontouchstart"in window||navigator.maxTouchPoints>0);let J,W,ue,xe,de,Te,Ce,Se,Ee,Be,et,ft,un,St;if(e[13]!==_||e[14]!==X||e[15]!==T.nodes.defaultBackground||e[16]!==T.nodes.defaultBorderColor||e[17]!==T.nodes.defaultBorderRadius||e[18]!==T.nodes.draggingBackgroundColor||e[19]!==T.nodes.draggingBorderColor||e[20]!==T.nodes.selectedBorderColor||e[21]!==T.nodes.selectedGlowColor||e[22]!==T.nodes.shadowColor||e[23]!==x||e[24]!==S||e[25]!==G||e[26]!==D||e[27]!==o||e[28]!==F||e[29]!==H||e[30]!==l||e[31]!==c||e[32]!==h||e[33]!==g||e[34]!==m||e[35]!==p||e[36]!==d||e[37]!==r||e[38]!==R||e[39]!==E||e[40]!==A){const dt=_!==null&&R.has(S);let In;e[55]!==S||e[56]!==o||e[57]!==m?(In=Pe=>{if(!oe)return;const Ct=Pe.target;if(Ct.closest('[data-no-drag="true"]')||Ct.closest("button")||Ct.closest("input"))return;const Ft=Pe.touches[0];M.current={x:Ft.clientX,y:Ft.clientY},$.current=!1,O.current=setTimeout(()=>{$.current=!0,m==null||m(S,o,{x:Ft.clientX,y:Ft.clientY}),O.current=null},600)},e[55]=S,e[56]=o,e[57]=m,e[58]=In):In=e[58];const Ei=In;let Fn;e[59]===Symbol.for("react.memo_cache_sentinel")?(Fn=Pe=>{if(!O.current||!M.current)return;const Ct=Pe.touches[0],Ft=Math.abs(Ct.clientX-M.current.x),Ro=Math.abs(Ct.clientY-M.current.y);(Ft>10||Ro>10)&&(clearTimeout(O.current),O.current=null)},e[59]=Fn):Fn=e[59];const Hi=Fn;let Dn;e[60]===Symbol.for("react.memo_cache_sentinel")?(Dn=Pe=>{$.current&&(Pe.preventDefault(),Pe.stopPropagation(),$.current=!1),O.current&&(clearTimeout(O.current),O.current=null),M.current=null},e[60]=Dn):Dn=e[60];const Ot=Dn;let dn;e[61]!==X?(dn=X(),e[61]=X,e[62]=dn):dn=e[62];const vt=dn;let Pn;e[63]!==vt||e[64]!==S||e[65]!==E?(Pn=Pe=>{const Ct=Pe.target;Ct.closest('[data-no-drag="true"]')||Ct.tagName==="INPUT"||Ct.tagName==="TEXTAREA"||Ct.tagName==="SELECT"||(vt.onPointerDown&&vt.onPointerDown(Pe),Pe.stopPropagation(),E({nodeId:S,isShiftPressed:Pe.shiftKey}))},e[63]=vt,e[64]=S,e[65]=E,e[66]=Pn):Pn=e[66];const Oo=Pn;let Jn;e[67]!==x||e[68]!==S||e[69]!==A?(Jn=x.hasNode(S)?x.getNodeAttribute(S,"zIndex"):A,e[67]=x,e[68]=S,e[69]=A,e[70]=Jn):Jn=e[70];const Mn=Jn;let Sn;e[71]!==S||e[72]!==o||e[73]!==l||e[74]!==c||e[75]!==d?(Sn=Pe=>{const Ct=Pe.target;if(Ct.closest('[data-no-drag="true"]')||Ct.tagName==="INPUT"||Ct.tagName==="TEXTAREA")return;const Ft=Pe.detail;Ft===1?l==null||l(S,o):Ft===2?(Pe.preventDefault(),Pe.stopPropagation(),c==null||c(S,o)):Ft>=3&&(Pe.preventDefault(),Pe.stopPropagation(),d==null||d(S,o))},e[71]=S,e[72]=o,e[73]=l,e[74]=c,e[75]=d,e[76]=Sn):Sn=e[76];const Ni=Sn;let It;e[77]!==S||e[78]!==o||e[79]!==p?(It=Pe=>{p&&(Pe.preventDefault(),Pe.stopPropagation(),p(S,o,Pe))},e[77]=S,e[78]=o,e[79]=p,e[80]=It):It=e[80];const $i=It;let fn;e[81]!==S||e[82]!==o||e[83]!==h?(fn=()=>{h==null||h(S,o)},e[81]=S,e[82]=o,e[83]=h,e[84]=fn):fn=e[84];const Yi=fn;let Gn;e[85]!==S||e[86]!==g?(Gn=()=>{g==null||g(S)},e[85]=S,e[86]=g,e[87]=Gn):Gn=e[87];const qi=Gn,be=D?T.nodes.selectedBorderColor:dt?T.nodes.draggingBorderColor:T.nodes.defaultBorderColor,Xe=D||dt?"1.5px":"1px",ct=`${T.nodes.defaultBorderRadius}px`,bt=`0px 8px 24px ${T.nodes.shadowColor}`,Rt=`0px 12px 32px ${T.nodes.shadowColor}`,At=`0 0 10px 2px ${T.nodes.selectedGlowColor}, ${bt}`,Ht=D?At:dt?Rt:bt;Be="true",et=S,ft=vt,un=Oo,St=Ei,J=Hi,W=Ot,ue=Ot,xe=Ni,de=$i,Te=Yi,Ce=qi;const zn=`${H}px`,Bn=`${F}px`,$t=dt?T.nodes.draggingBackgroundColor:T.nodes.defaultBackground,nt=`${Xe} solid ${be}`,wt=dt?"grabbing":"grab",An=dt?.9:1,hn=dt?"opacity 0.1s, transform 0.05s, background-color 0.1s, box-shadow 0.1s, border-color 0.1s":"opacity 0.4s, border-color 0.4s, box-shadow 0.4s, background-color 0.4s, transform 0.4s ease-in-out",Hn=dt?"scale(1.005)":"scale(1)";e[88]!==ct||e[89]!==Ht||e[90]!==Mn||e[91]!==zn||e[92]!==Bn||e[93]!==$t||e[94]!==nt||e[95]!==wt||e[96]!==An||e[97]!==hn||e[98]!==Hn?(Se={width:zn,height:Bn,backgroundColor:$t,border:nt,borderRadius:ct,boxShadow:Ht,cursor:wt,opacity:An,transition:hn,transform:Hn,zIndex:Mn,touchAction:"manipulation",userSelect:"auto",position:"relative",overflow:"hidden"},e[88]=ct,e[89]=Ht,e[90]=Mn,e[91]=zn,e[92]=Bn,e[93]=$t,e[94]=nt,e[95]=wt,e[96]=An,e[97]=hn,e[98]=Hn,e[99]=Se):Se=e[99],Ee=r({node:o,isSelected:D,isResizing:G,isDragging:dt}),e[13]=_,e[14]=X,e[15]=T.nodes.defaultBackground,e[16]=T.nodes.defaultBorderColor,e[17]=T.nodes.defaultBorderRadius,e[18]=T.nodes.draggingBackgroundColor,e[19]=T.nodes.draggingBorderColor,e[20]=T.nodes.selectedBorderColor,e[21]=T.nodes.selectedGlowColor,e[22]=T.nodes.shadowColor,e[23]=x,e[24]=S,e[25]=G,e[26]=D,e[27]=o,e[28]=F,e[29]=H,e[30]=l,e[31]=c,e[32]=h,e[33]=g,e[34]=m,e[35]=p,e[36]=d,e[37]=r,e[38]=R,e[39]=E,e[40]=A,e[41]=J,e[42]=W,e[43]=ue,e[44]=xe,e[45]=de,e[46]=Te,e[47]=Ce,e[48]=Se,e[49]=Ee,e[50]=Be,e[51]=et,e[52]=ft,e[53]=un,e[54]=St}else J=e[41],W=e[42],ue=e[43],xe=e[44],de=e[45],Te=e[46],Ce=e[47],Se=e[48],Ee=e[49],Be=e[50],et=e[51],ft=e[52],un=e[53],St=e[54];let ht,zt,Gt,on,rn,Ve,Bt;e[100]!==Y||e[101]!==k||e[102]!==V||e[103]!==G?(ht=z.jsx($r,{direction:"nw",createResizeStart:Y,handleResizeMove:V,handleResizeEnd:k,isResizing:G}),zt=z.jsx($r,{direction:"ne",createResizeStart:Y,handleResizeMove:V,handleResizeEnd:k,isResizing:G}),Gt=z.jsx($r,{direction:"sw",createResizeStart:Y,handleResizeMove:V,handleResizeEnd:k,isResizing:G}),on=z.jsx($r,{direction:"se",createResizeStart:Y,handleResizeMove:V,handleResizeEnd:k,isResizing:G,alwaysVisible:!0}),rn=z.jsx($r,{direction:"n",createResizeStart:Y,handleResizeMove:V,handleResizeEnd:k,isResizing:G}),Ve=z.jsx($r,{direction:"s",createResizeStart:Y,handleResizeMove:V,handleResizeEnd:k,isResizing:G}),Bt=z.jsx($r,{direction:"w",createResizeStart:Y,handleResizeMove:V,handleResizeEnd:k,isResizing:G}),e[100]=Y,e[101]=k,e[102]=V,e[103]=G,e[104]=ht,e[105]=zt,e[106]=Gt,e[107]=on,e[108]=rn,e[109]=Ve,e[110]=Bt):(ht=e[104],zt=e[105],Gt=e[106],on=e[107],rn=e[108],Ve=e[109],Bt=e[110]);let wn;e[111]!==J||e[112]!==W||e[113]!==ue||e[114]!==xe||e[115]!==de||e[116]!==Te||e[117]!==Ce||e[118]!==Se||e[119]!==Ee||e[120]!==ht||e[121]!==zt||e[122]!==Gt||e[123]!==on||e[124]!==rn||e[125]!==Ve||e[126]!==Bt||e[127]!==Be||e[128]!==et||e[129]!==ft||e[130]!==un||e[131]!==St?(wn=z.jsxs("div",{"data-draggable-node":Be,"data-node-id":et,...ft,onPointerDown:un,onTouchStart:St,onTouchMove:J,onTouchEnd:W,onTouchCancel:ue,onClick:xe,onContextMenu:de,onPointerEnter:Te,onPointerLeave:Ce,style:Se,children:[Ee,ht,zt,Gt,on,rn,Ve,Bt]}),e[111]=J,e[112]=W,e[113]=ue,e[114]=xe,e[115]=de,e[116]=Te,e[117]=Ce,e[118]=Se,e[119]=Ee,e[120]=ht,e[121]=zt,e[122]=Gt,e[123]=on,e[124]=rn,e[125]=Ve,e[126]=Bt,e[127]=Be,e[128]=et,e[129]=ft,e[130]=un,e[131]=St,e[132]=wn):wn=e[132];const xn=wn;if(w){let dt;return e[133]!==w||e[134]!==xn||e[135]!==o?(dt=z.jsx(w,{nodeData:o,children:xn}),e[133]=w,e[134]=xn,e[135]=o,e[136]=dt):dt=e[136],dt}return xn}function ZN(n){const e=Oe.c(11),{error:o,reset:r}=n;let l,c,d;e[0]===Symbol.for("react.memo_cache_sentinel")?(l={padding:"16px",backgroundColor:"rgba(239, 68, 68, 0.1)",border:"1px solid rgba(239, 68, 68, 0.3)",borderRadius:"8px",color:"#ef4444",fontSize:"12px",minWidth:"150px"},c=z.jsx("div",{style:{fontWeight:600,marginBottom:"8px"},children:"⚠️ Node Error"}),d={color:"#888",marginBottom:"8px",wordBreak:"break-word"},e[0]=l,e[1]=c,e[2]=d):(l=e[0],c=e[1],d=e[2]);const p=o.message||"Unknown error";let m;e[3]!==p?(m=z.jsx("div",{style:d,children:p}),e[3]=p,e[4]=m):m=e[4];let h;e[5]===Symbol.for("react.memo_cache_sentinel")?(h={padding:"4px 8px",fontSize:"11px",backgroundColor:"rgba(239, 68, 68, 0.2)",border:"1px solid rgba(239, 68, 68, 0.3)",borderRadius:"4px",color:"#ef4444",cursor:"pointer"},e[5]=h):h=e[5];let g;e[6]!==r?(g=z.jsx("button",{onClick:r,style:h,children:"Retry"}),e[6]=r,e[7]=g):g=e[7];let y;return e[8]!==m||e[9]!==g?(y=z.jsxs("div",{style:l,children:[c,m,g]}),e[8]=m,e[9]=g,e[10]=y):y=e[10],y}var IN=class extends ne.Component{constructor(n){super(n),cp(this,"reset",()=>{this.setState({hasError:!1,error:null})}),this.state={hasError:!1,error:null}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}componentDidCatch(n,e){const{nodeId:o,onError:r}=this.props;console.error(`[NodeErrorBoundary] Error in node ${o}:`,n,e),r==null||r(o,n,e)}render(){const{hasError:n,error:e}=this.state,{nodeId:o,children:r,renderFallback:l}=this.props;return n&&e?l?l({nodeId:o,error:e,reset:this.reset}):z.jsx(ZN,{nodeId:o,error:e,reset:this.reset}):r}};function FN(n){const e=Oe.c(31),{renderNode:o,onNodeClick:r,onNodeDoubleClick:l,onNodeTripleClick:c,onNodeRightClick:d,onNodeLongPress:p,onNodeHover:m,onNodeLeave:h,onNodePersist:g,onNodePersistError:y,onNodeRenderError:v,renderErrorFallback:w,nodeWrapper:S}=n,A=he(yl);let x;if(e[0]!==A||e[1]!==S||e[2]!==r||e[3]!==l||e[4]!==m||e[5]!==h||e[6]!==p||e[7]!==g||e[8]!==y||e[9]!==v||e[10]!==d||e[11]!==c||e[12]!==w||e[13]!==o){let D;e[15]!==S||e[16]!==r||e[17]!==l||e[18]!==m||e[19]!==h||e[20]!==p||e[21]!==g||e[22]!==y||e[23]!==v||e[24]!==d||e[25]!==c||e[26]!==w||e[27]!==o?(D=R=>z.jsx(PN,{nodeKey:R,renderNode:o,onNodeClick:r,onNodeDoubleClick:l,onNodeTripleClick:c,onNodeRightClick:d,onNodeLongPress:p,onNodeHover:m,onNodeLeave:h,onNodePersist:g,onNodePersistError:y,onNodeRenderError:v,renderErrorFallback:w,nodeWrapper:S},R),e[15]=S,e[16]=r,e[17]=l,e[18]=m,e[19]=h,e[20]=p,e[21]=g,e[22]=y,e[23]=v,e[24]=d,e[25]=c,e[26]=w,e[27]=o,e[28]=D):D=e[28],x=A.map(D),e[0]=A,e[1]=S,e[2]=r,e[3]=l,e[4]=m,e[5]=h,e[6]=p,e[7]=g,e[8]=y,e[9]=v,e[10]=d,e[11]=c,e[12]=w,e[13]=o,e[14]=x}else x=e[14];let E;return e[29]!==x?(E=z.jsx(z.Fragment,{children:x}),e[29]=x,e[30]=E):E=e[30],E}function PN(n){const e=Oe.c(28),{nodeKey:o,renderNode:r,onNodeClick:l,onNodeDoubleClick:c,onNodeTripleClick:d,onNodeRightClick:p,onNodeLongPress:m,onNodeHover:h,onNodeLeave:g,onNodePersist:y,onNodePersistError:v,onNodeRenderError:w,renderErrorFallback:S,nodeWrapper:A}=n;let x;e[0]!==o?(x=Op(o),e[0]=o,e[1]=x):x=e[1];const E=he(x);let D;e[2]!==o?(D=xi(o),e[2]=o,e[3]=D):D=e[3];const R=he(D);if(!E)return null;let _;e[4]!==R.x||e[5]!==R.y?(_={position:"absolute",left:R.x,top:R.y,transform:"translate(0, 0)"},e[4]=R.x,e[5]=R.y,e[6]=_):_=e[6];let N;e[7]!==E||e[8]!==A||e[9]!==l||e[10]!==c||e[11]!==h||e[12]!==g||e[13]!==m||e[14]!==y||e[15]!==v||e[16]!==p||e[17]!==d||e[18]!==r?(N=z.jsx(QN,{nodeData:E,renderContent:r,onClick:l,onDoubleClick:c,onTripleClick:d,onRightClick:p,onLongPress:m,onHover:h,onLeave:g,onPersist:y,onPersistError:v,wrapper:A}),e[7]=E,e[8]=A,e[9]=l,e[10]=c,e[11]=h,e[12]=g,e[13]=m,e[14]=y,e[15]=v,e[16]=p,e[17]=d,e[18]=r,e[19]=N):N=e[19];let T;e[20]!==o||e[21]!==w||e[22]!==S||e[23]!==N?(T=z.jsx(IN,{nodeId:o,onError:w,renderFallback:S,children:N}),e[20]=o,e[21]=w,e[22]=S,e[23]=N,e[24]=T):T=e[24];let O;return e[25]!==_||e[26]!==T?(O=z.jsx("div",{style:_,children:T}),e[25]=_,e[26]=T,e[27]=O):O=e[27],O}Zt();Ul();Tn();cn();var JN="#3b82f6";function WN(n){const e=Oe.c(16),{onEdgeClick:o,onEdgeDoubleClick:r,onEdgeRightClick:l,onEdgeHover:c,onEdgeLeave:d}=n,p=he(Du);let m;e[0]===Symbol.for("react.memo_cache_sentinel")?(m={position:"absolute",top:0,left:0,width:"100%",height:"100%",pointerEvents:"none",zIndex:0,overflow:"visible"},e[0]=m):m=e[0];let h;if(e[1]!==p||e[2]!==o||e[3]!==r||e[4]!==c||e[5]!==d||e[6]!==l){let y;e[8]!==o||e[9]!==r||e[10]!==c||e[11]!==d||e[12]!==l?(y=v=>z.jsx(e5,{edgeKey:v,onEdgeClick:o,onEdgeDoubleClick:r,onEdgeRightClick:l,onEdgeHover:c,onEdgeLeave:d},v),e[8]=o,e[9]=r,e[10]=c,e[11]=d,e[12]=l,e[13]=y):y=e[13],h=p.map(y),e[1]=p,e[2]=o,e[3]=r,e[4]=c,e[5]=d,e[6]=l,e[7]=h}else h=e[7];let g;return e[14]!==h?(g=z.jsx("svg",{style:m,children:h}),e[14]=h,e[15]=g):g=e[15],g}function e5(n){const e=Oe.c(71),{edgeKey:o,onEdgeClick:r,onEdgeDoubleClick:l,onEdgeRightClick:c,onEdgeHover:d,onEdgeLeave:p}=n;let m;e[0]!==o?(m=Rp(o),e[0]=o,e[1]=m):m=e[1];const h=he(m),g=cd(),y=he(_o),v=ge(Ju),w=he(Tt),S=y===o;let A,x,E,D,R,_,N,T,O,M,$;if(e[2]!==h||e[3]!==o||e[4]!==r||e[5]!==l||e[6]!==d||e[7]!==p||e[8]!==c||e[9]!==v||e[10]!==g.edges.pathType||e[11]!==w){O=Symbol.for("react.early_return_sentinel");e:{const W=MN(g.edges.pathType||"bezier");let ue;e[23]!==h||e[24]!==o||e[25]!==r||e[26]!==v?(ue=Ve=>{Ve.stopPropagation(),r&&h?r(o,h,Ve):v(o)},e[23]=h,e[24]=o,e[25]=r,e[26]=v,e[27]=ue):ue=e[27],x=ue;let xe;e[28]!==h||e[29]!==o||e[30]!==l?(xe=Ve=>{l&&h&&(Ve.stopPropagation(),Ve.preventDefault(),l(o,h,Ve))},e[28]=h,e[29]=o,e[30]=l,e[31]=xe):xe=e[31],D=xe;let de;e[32]!==h||e[33]!==o||e[34]!==c?(de=Ve=>{c&&h&&(Ve.preventDefault(),Ve.stopPropagation(),c(o,h,Ve))},e[32]=h,e[33]=o,e[34]=c,e[35]=de):de=e[35],E=de;let Te;e[36]!==h||e[37]!==o||e[38]!==d?(Te=()=>{d&&h&&d(o,h)},e[36]=h,e[37]=o,e[38]=d,e[39]=Te):Te=e[39],R=Te;let Ce;if(e[40]!==o||e[41]!==p?(Ce=()=>{p&&p(o)},e[40]=o,e[41]=p,e[42]=Ce):Ce=e[42],_=Ce,!h){O=null;break e}const{sourcePosition:Se,targetPosition:Ee,color:Be,weight:et,type:ft,label:un,sourceEndpoint:St,targetEndpoint:ht}=h;A=Be,$=et,M=ft,N=un;const zt=(St==null?void 0:St.x)??Se.x+h.sourceNodeWidth/2,Gt=(St==null?void 0:St.y)??Se.y+h.sourceNodeHeight/2,on=(ht==null?void 0:ht.x)??Ee.x+h.targetNodeWidth/2,rn=(ht==null?void 0:ht.y)??Ee.y+h.targetNodeHeight/2;if(isNaN(zt)||isNaN(Gt)||isNaN(on)||isNaN(rn)||w===0){O=null;break e}T=W({x1:zt,y1:Gt,x2:on,y2:rn,sourceWidth:h.sourceNodeWidth,sourceHeight:h.sourceNodeHeight,targetWidth:h.targetNodeWidth,targetHeight:h.targetNodeHeight})}e[2]=h,e[3]=o,e[4]=r,e[5]=l,e[6]=d,e[7]=p,e[8]=c,e[9]=v,e[10]=g.edges.pathType,e[11]=w,e[12]=A,e[13]=x,e[14]=E,e[15]=D,e[16]=R,e[17]=_,e[18]=N,e[19]=T,e[20]=O,e[21]=M,e[22]=$}else A=e[12],x=e[13],E=e[14],D=e[15],R=e[16],_=e[17],N=e[18],T=e[19],O=e[20],M=e[21],$=e[22];if(O!==Symbol.for("react.early_return_sentinel"))return O;const{path:L,labelX:X,labelY:ae}=T,te=S?JN:A||g.edges.defaultColor,me=$||g.edges.defaultWeight,ce=(S?me*1.5:me)/w,j=10/w,I=Math.max(10,me*3)/w;let G;e[43]===Symbol.for("react.memo_cache_sentinel")?(G={cursor:"pointer"},e[43]=G):G=e[43];let Y;e[44]===Symbol.for("react.memo_cache_sentinel")?(Y={pointerEvents:"stroke"},e[44]=Y):Y=e[44];let V;e[45]!==x||e[46]!==E||e[47]!==D||e[48]!==R||e[49]!==_||e[50]!==I||e[51]!==L?(V=z.jsx("path",{d:L,stroke:"transparent",strokeWidth:I,fill:"none",style:Y,onClick:x,onDoubleClick:D,onContextMenu:E,onPointerEnter:R,onPointerLeave:_}),e[45]=x,e[46]=E,e[47]=D,e[48]=R,e[49]=_,e[50]=I,e[51]=L,e[52]=V):V=e[52];const k=M==="dashed"?`calc(5px / ${w}) calc(5px / ${w})`:void 0;let H;e[53]===Symbol.for("react.memo_cache_sentinel")?(H={pointerEvents:"none"},e[53]=H):H=e[53];let F;e[54]!==te||e[55]!==ce||e[56]!==L||e[57]!==k?(F=z.jsx("path",{d:L,stroke:te,strokeWidth:ce,fill:"none",strokeDasharray:k,style:H}),e[54]=te,e[55]=ce,e[56]=L,e[57]=k,e[58]=F):F=e[58];let oe;e[59]!==j||e[60]!==N||e[61]!==X||e[62]!==ae||e[63]!==g.edges.labelColor||e[64]!==g.edges.labelStrokeColor||e[65]!==w?(oe=N&&z.jsx("text",{x:X,y:ae,fontSize:`${j}px`,fill:g.edges.labelColor,stroke:g.edges.labelStrokeColor,strokeWidth:`${.2/w}px`,textAnchor:"middle",dy:`${-5/w}px`,style:{pointerEvents:"none"},children:N}),e[59]=j,e[60]=N,e[61]=X,e[62]=ae,e[63]=g.edges.labelColor,e[64]=g.edges.labelStrokeColor,e[65]=w,e[66]=oe):oe=e[66];let J;return e[67]!==oe||e[68]!==V||e[69]!==F?(J=z.jsxs("g",{style:G,children:[V,F,oe]}),e[67]=oe,e[68]=V,e[69]=F,e[70]=J):J=e[70],J}Tn();function t5(n){const e=Oe.c(5),o=he(tt),r=he(_o),l=ne.useRef(!0);let c,d;e[0]!==n||e[1]!==r||e[2]!==o?(c=()=>{if(l.current){l.current=!1;return}n==null||n(o,r)},d=[o,r,n],e[0]=n,e[1]=r,e[2]=o,e[3]=c,e[4]=d):(c=e[3],d=e[4]),ne.useEffect(c,d)}cn();function n5(n){const e=Oe.c(5),o=he(Tt),r=he(nn),l=ne.useRef(null),c=ne.useRef(!0);let d,p;e[0]!==n||e[1]!==r||e[2]!==o?(d=()=>{if(c.current){c.current=!1;return}if(n)return l.current!==null&&cancelAnimationFrame(l.current),l.current=requestAnimationFrame(()=>{n({zoom:o,pan:r}),l.current=null}),()=>{l.current!==null&&cancelAnimationFrame(l.current)}},p=[o,r,n],e[0]=n,e[1]=r,e[2]=o,e[3]=d,e[4]=p):(d=e[3],p=e[4]),ne.useEffect(d,p)}Zt();Tn();function i5(n,e){const o=Oe.c(7),r=he(Gi),l=Tl(),c=ne.useRef(null);let d;o[0]===Symbol.for("react.memo_cache_sentinel")?(d=[],o[0]=d):d=o[0];const p=ne.useRef(d);let m,h;o[1]!==r||o[2]!==e||o[3]!==n||o[4]!==l?(m=()=>{const g=c.current;if(c.current=r,g===null&&r!==null){const y=Array.from(l.get(tt));p.current=y,n==null||n(y)}else if(g!==null&&r===null){const y=p.current;if(e&&y.length>0){const v=l.get(ze),w=new Map;for(const S of y)if(v.hasNode(S)){const A=v.getNodeAttributes(S);w.set(S,{x:A.x,y:A.y})}e(y,w)}p.current=[]}},h=[r,l,n,e],o[1]=r,o[2]=e,o[3]=n,o[4]=l,o[5]=m,o[6]=h):(m=o[5],h=o[6]),ne.useEffect(m,h)}function o5(n){const e=Oe.c(50);let o,r,l,c,d,p,m,h,g,y,v,w,S,A,x,E,D,R,_,N,T,O,M,$;e[0]!==n?({renderNode:M,onNodeClick:y,onNodeDoubleClick:v,onNodeTripleClick:_,onNodeRightClick:R,onNodeLongPress:A,onNodeHover:w,onNodeLeave:S,onEdgeClick:d,onEdgeDoubleClick:p,onEdgeRightClick:g,onEdgeHover:m,onEdgeLeave:h,onSelectionChange:N,onViewportChange:T,onDragStart:c,onDragEnd:l,onNodePersist:x,onNodePersistError:E,onNodeRenderError:D,renderErrorFallback:O,nodeWrapper:r,children:o,...$}=n,e[0]=n,e[1]=o,e[2]=r,e[3]=l,e[4]=c,e[5]=d,e[6]=p,e[7]=m,e[8]=h,e[9]=g,e[10]=y,e[11]=v,e[12]=w,e[13]=S,e[14]=A,e[15]=x,e[16]=E,e[17]=D,e[18]=R,e[19]=_,e[20]=N,e[21]=T,e[22]=O,e[23]=M,e[24]=$):(o=e[1],r=e[2],l=e[3],c=e[4],d=e[5],p=e[6],m=e[7],h=e[8],g=e[9],y=e[10],v=e[11],w=e[12],S=e[13],A=e[14],x=e[15],E=e[16],D=e[17],R=e[18],_=e[19],N=e[20],T=e[21],O=e[22],M=e[23],$=e[24]),t5(N),n5(T),i5(c,l);let L;e[25]!==d||e[26]!==p||e[27]!==m||e[28]!==h||e[29]!==g?(L=z.jsx(WN,{onEdgeClick:d,onEdgeDoubleClick:p,onEdgeRightClick:g,onEdgeHover:m,onEdgeLeave:h}),e[25]=d,e[26]=p,e[27]=m,e[28]=h,e[29]=g,e[30]=L):L=e[30];let X;e[31]!==r||e[32]!==y||e[33]!==v||e[34]!==w||e[35]!==S||e[36]!==A||e[37]!==x||e[38]!==E||e[39]!==D||e[40]!==R||e[41]!==_||e[42]!==O||e[43]!==M?(X=z.jsx(FN,{renderNode:M,onNodeClick:y,onNodeDoubleClick:v,onNodeTripleClick:_,onNodeRightClick:R,onNodeLongPress:A,onNodeHover:w,onNodeLeave:S,onNodePersist:x,onNodePersistError:E,onNodeRenderError:D,renderErrorFallback:O,nodeWrapper:r}),e[31]=r,e[32]=y,e[33]=v,e[34]=w,e[35]=S,e[36]=A,e[37]=x,e[38]=E,e[39]=D,e[40]=R,e[41]=_,e[42]=O,e[43]=M,e[44]=X):X=e[44];let ae;return e[45]!==o||e[46]!==L||e[47]!==X||e[48]!==$?(ae=z.jsxs(VN,{...$,children:[L,X,o]}),e[45]=o,e[46]=L,e[47]=X,e[48]=$,e[49]=ae):ae=e[49],ae}Mo();ln("connected-node");Zt();Ul();Zt();Tn();ad();Qp();Zt();Tn();U2();E2();na();Ll();Wp();function Gh(n){const e=Oe.c(28),{event:o,currentActionId:r,onActionChange:l,rowClassName:c,labelClassName:d,selectClassName:p}=n;let m,h,g,y,v,w;if(e[0]!==r||e[1]!==o.label||e[2]!==o.type||e[3]!==d||e[4]!==l||e[5]!==c||e[6]!==p){const x=j2();v=c,e[13]!==o.label||e[14]!==d?(w=z.jsx("span",{className:d,children:o.label}),e[13]=o.label,e[14]=d,e[15]=w):w=e[15],m=p,h=r,e[16]!==o.type||e[17]!==l?(g=E=>l(o.type,E.target.value),e[16]=o.type,e[17]=l,e[18]=g):g=e[18],y=x.map(r5),e[0]=r,e[1]=o.label,e[2]=o.type,e[3]=d,e[4]=l,e[5]=c,e[6]=p,e[7]=m,e[8]=h,e[9]=g,e[10]=y,e[11]=v,e[12]=w}else m=e[7],h=e[8],g=e[9],y=e[10],v=e[11],w=e[12];let S;e[19]!==m||e[20]!==h||e[21]!==g||e[22]!==y?(S=z.jsx("select",{className:m,value:h,onChange:g,children:y}),e[19]=m,e[20]=h,e[21]=g,e[22]=y,e[23]=S):S=e[23];let A;return e[24]!==v||e[25]!==w||e[26]!==S?(A=z.jsxs("div",{className:v,children:[w,S]}),e[24]=v,e[25]=w,e[26]=S,e[27]=A):A=e[27],A}function r5(n){return z.jsx("optgroup",{label:n.label,children:n.actions.map(a5)},n.category)}function a5(n){return z.jsx("option",{value:n.id,children:n.label},n.id)}function s5(n){const e=Oe.c(17),{className:o,checkboxClassName:r,virtualizationClassName:l,virtualizationStatsClassName:c}=n,{enabled:d,toggle:p,visibleNodes:m,totalNodes:h,culledNodes:g}=EN();let y;e[0]!==r||e[1]!==d||e[2]!==p?(y=z.jsx("input",{type:"checkbox",className:r,checked:d,onChange:p}),e[0]=r,e[1]=d,e[2]=p,e[3]=y):y=e[3];let v;e[4]===Symbol.for("react.memo_cache_sentinel")?(v=z.jsx("span",{children:"Virtualization"}),e[4]=v):v=e[4];let w;e[5]!==y?(w=z.jsxs("label",{children:[y,v]}),e[5]=y,e[6]=w):w=e[6];const S=d?`${m}/${h} (${g} culled)`:"Off";let A;e[7]!==S||e[8]!==c?(A=z.jsx("span",{className:c,children:S}),e[7]=S,e[8]=c,e[9]=A):A=e[9];let x;e[10]!==w||e[11]!==A||e[12]!==l?(x=z.jsxs("div",{className:l,children:[w,A]}),e[10]=w,e[11]=A,e[12]=l,e[13]=x):x=e[13];let E;return e[14]!==o||e[15]!==x?(E=z.jsx("div",{className:o,children:x}),e[14]=o,e[15]=x,e[16]=E):E=e[16],E}function l5(n){var ce;const e=Oe.c(36),{className:o,selectClassName:r,buttonClassName:l,buttonsClassName:c,inputClassName:d}=n,{allPresets:p,activePresetId:m,hasUnsavedChanges:h,applyPreset:g,saveAsPreset:y,deletePreset:v,resetSettings:w}=_m(),[S,A]=ne.useState(!1),[x,E]=ne.useState("");let D;e[0]!==x||e[1]!==y?(D=()=>{x.trim()&&(y(x.trim()),E(""),A(!1))},e[0]=x,e[1]=y,e[2]=D):D=e[2];const R=D;let _;e[3]!==m||e[4]!==p||e[5]!==v?(_=()=>{var j;m&&!((j=p.find(I=>I.id===m))!=null&&j.isBuiltIn)&&v(m)},e[3]=m,e[4]=p,e[5]=v,e[6]=_):_=e[6];const N=_,T=m||"";let O;e[7]!==g?(O=j=>j.target.value&&g(j.target.value),e[7]=g,e[8]=O):O=e[8];const M=h?"Custom (modified)":"Select preset...";let $;e[9]!==M?($=z.jsx("option",{value:"",disabled:!0,children:M}),e[9]=M,e[10]=$):$=e[10];let L;e[11]!==p?(L=p.map(c5),e[11]=p,e[12]=L):L=e[12];let X;e[13]!==r||e[14]!==T||e[15]!==O||e[16]!==$||e[17]!==L?(X=z.jsxs("select",{className:r,value:T,onChange:O,children:[$,L]}),e[13]=r,e[14]=T,e[15]=O,e[16]=$,e[17]=L,e[18]=X):X=e[18];let ae;e[19]!==m||e[20]!==p||e[21]!==l||e[22]!==N||e[23]!==R||e[24]!==d||e[25]!==x||e[26]!==w||e[27]!==S?(ae=S?z.jsxs(z.Fragment,{children:[z.jsx("input",{type:"text",className:d,placeholder:"Preset name",value:x,onChange:j=>E(j.target.value),onKeyDown:j=>j.key==="Enter"&&R(),autoFocus:!0}),z.jsx("button",{className:l,onClick:R,children:"Save"}),z.jsx("button",{className:l,onClick:()=>A(!1),children:"Cancel"})]}):z.jsxs(z.Fragment,{children:[z.jsx("button",{className:l,onClick:()=>A(!0),children:"Save as..."}),m&&!((ce=p.find(j=>j.id===m))!=null&&ce.isBuiltIn)&&z.jsx("button",{className:l,onClick:N,children:"Delete"}),z.jsx("button",{className:l,onClick:w,children:"Reset"})]}),e[19]=m,e[20]=p,e[21]=l,e[22]=N,e[23]=R,e[24]=d,e[25]=x,e[26]=w,e[27]=S,e[28]=ae):ae=e[28];let te;e[29]!==c||e[30]!==ae?(te=z.jsx("div",{className:c,children:ae}),e[29]=c,e[30]=ae,e[31]=te):te=e[31];let me;return e[32]!==o||e[33]!==te||e[34]!==X?(me=z.jsxs("div",{className:o,children:[X,te]}),e[32]=o,e[33]=te,e[34]=X,e[35]=me):me=e[35],me}function c5(n){return z.jsxs("option",{value:n.id,children:[n.name,n.isBuiltIn?"":" (custom)"]},n.id)}function u5(n){const e=Oe.c(71),{className:o,headerClassName:r,contentClassName:l,footerClassName:c,rowClassName:d,labelClassName:p,selectClassName:m,buttonClassName:h,presetClassName:g,presetSelectClassName:y,presetButtonsClassName:v,checkboxClassName:w,groupClassName:S,groupHeadingClassName:A,quickActionsClassName:x,virtualizationClassName:E,virtualizationStatsClassName:D,inputClassName:R,renderHeader:_,renderFooter:N,onClose:T}=n,{mappings:O,setEventMapping:M}=_m();let $;e[0]===Symbol.for("react.memo_cache_sentinel")?($=Object.values(fe).filter(h5),e[0]=$):$=e[0];const L=$;let X;e[1]===Symbol.for("react.memo_cache_sentinel")?(X=Object.values(fe).filter(f5),e[1]=X):X=e[1];const ae=X;let te;e[2]===Symbol.for("react.memo_cache_sentinel")?(te=Object.values(fe).filter(d5),e[2]=te):te=e[2];const me=te;let ce;e[3]!==h||e[4]!==r||e[5]!==T||e[6]!==_?(ce=_?_():z.jsxs("div",{className:r,children:[z.jsx("h2",{children:"Canvas Settings"}),T&&z.jsx("button",{className:h,onClick:T,children:"×"})]}),e[3]=h,e[4]=r,e[5]=T,e[6]=_,e[7]=ce):ce=e[7];const j=y||m;let I;e[8]!==h||e[9]!==R||e[10]!==v||e[11]!==g||e[12]!==j?(I=z.jsx(l5,{className:g,selectClassName:j,buttonClassName:h,buttonsClassName:v,inputClassName:R}),e[8]=h,e[9]=R,e[10]=v,e[11]=g,e[12]=j,e[13]=I):I=e[13];let G;e[14]!==h||e[15]!==w||e[16]!==x||e[17]!==E||e[18]!==D?(G=z.jsx(s5,{className:x,buttonClassName:h,checkboxClassName:w,virtualizationClassName:E,virtualizationStatsClassName:D}),e[14]=h,e[15]=w,e[16]=x,e[17]=E,e[18]=D,e[19]=G):G=e[19];let Y;e[20]!==A?(Y=z.jsx("h3",{className:A,children:"Node Events"}),e[20]=A,e[21]=Y):Y=e[21];let V;e[22]!==p||e[23]!==O||e[24]!==d||e[25]!==m||e[26]!==M?(V=L.map(Ce=>z.jsx(Gh,{event:xr[Ce],currentActionId:O[Ce],onActionChange:M,rowClassName:d,labelClassName:p,selectClassName:m},Ce)),e[22]=p,e[23]=O,e[24]=d,e[25]=m,e[26]=M,e[27]=V):V=e[27];let k;e[28]!==S||e[29]!==Y||e[30]!==V?(k=z.jsxs("div",{className:S,children:[Y,V]}),e[28]=S,e[29]=Y,e[30]=V,e[31]=k):k=e[31];let H;e[32]!==A?(H=z.jsx("h3",{className:A,children:"Edge Events"}),e[32]=A,e[33]=H):H=e[33];let F;e[34]!==p||e[35]!==O||e[36]!==d||e[37]!==m||e[38]!==M?(F=ae.map(Ce=>z.jsx(Gh,{event:xr[Ce],currentActionId:O[Ce],onActionChange:M,rowClassName:d,labelClassName:p,selectClassName:m},Ce)),e[34]=p,e[35]=O,e[36]=d,e[37]=m,e[38]=M,e[39]=F):F=e[39];let oe;e[40]!==S||e[41]!==H||e[42]!==F?(oe=z.jsxs("div",{className:S,children:[H,F]}),e[40]=S,e[41]=H,e[42]=F,e[43]=oe):oe=e[43];let J;e[44]!==A?(J=z.jsx("h3",{className:A,children:"Background Events"}),e[44]=A,e[45]=J):J=e[45];let W;e[46]!==p||e[47]!==O||e[48]!==d||e[49]!==m||e[50]!==M?(W=me.map(Ce=>z.jsx(Gh,{event:xr[Ce],currentActionId:O[Ce],onActionChange:M,rowClassName:d,labelClassName:p,selectClassName:m},Ce)),e[46]=p,e[47]=O,e[48]=d,e[49]=m,e[50]=M,e[51]=W):W=e[51];let ue;e[52]!==S||e[53]!==J||e[54]!==W?(ue=z.jsxs("div",{className:S,children:[J,W]}),e[52]=S,e[53]=J,e[54]=W,e[55]=ue):ue=e[55];let xe;e[56]!==l||e[57]!==k||e[58]!==oe||e[59]!==ue?(xe=z.jsxs("div",{className:l,children:[k,oe,ue]}),e[56]=l,e[57]=k,e[58]=oe,e[59]=ue,e[60]=xe):xe=e[60];let de;e[61]!==c||e[62]!==N?(de=N?N():z.jsx("div",{className:c,children:"Changes auto-saved to localStorage."}),e[61]=c,e[62]=N,e[63]=de):de=e[63];let Te;return e[64]!==o||e[65]!==xe||e[66]!==de||e[67]!==ce||e[68]!==I||e[69]!==G?(Te=z.jsxs("div",{className:o,children:[ce,I,G,xe,de]}),e[64]=o,e[65]=xe,e[66]=de,e[67]=ce,e[68]=I,e[69]=G,e[70]=Te):Te=e[70],Te}function d5(n){return xr[n].category==="background"}function f5(n){return xr[n].category==="edge"}function h5(n){return xr[n].category==="node"}function p5(){const n=Oe.c(24),[e]=Ci(Dt),o=ge(SN),r=ge(Z2);he(vp);const[l,c]=Ci(ld),d=ne.useRef(null),[p,m]=ne.useState("");let h,g;n[0]===Symbol.for("react.memo_cache_sentinel")?(h=()=>{var N;(N=d.current)==null||N.focus()},g=[],n[0]=h,n[1]=g):(h=n[0],g=n[1]),ne.useEffect(h,g);let y;n[2]!==e.phase||n[3]!==e.suggestions?(y=e.phase==="searching"?e.suggestions:To.all(),n[2]=e.phase,n[3]=e.suggestions,n[4]=y):y=n[4];const v=y;let w;n[5]!==o?(w=N=>{const T=N.target.value;m(T),o(T)},n[5]=o,n[6]=w):w=n[6];const S=w;let A;n[7]!==r||n[8]!==l||n[9]!==c||n[10]!==v||n[11]!==o?(A=N=>{e:switch(N.key){case"ArrowDown":{N.preventDefault(),c(T=>Math.min(T+1,v.length-1));break e}case"ArrowUp":{N.preventDefault(),c(m5);break e}case"Enter":{N.preventDefault(),v[l]&&r(v[l]);break e}case"Tab":N.preventDefault(),v[l]&&(m(v[l].name),o(v[l].name))}},n[7]=r,n[8]=l,n[9]=c,n[10]=v,n[11]=o,n[12]=A):A=n[12];const x=A;let E;n[13]===Symbol.for("react.memo_cache_sentinel")?(E={color:"var(--cmd-input-text)"},n[13]=E):E=n[13];let D;n[14]!==S||n[15]!==x||n[16]!==p?(D=z.jsx("input",{ref:d,type:"text",value:p,onChange:S,onKeyDown:x,placeholder:"Type command name...",className:"flex-1 bg-transparent outline-none",style:E,autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:"false"}),n[14]=S,n[15]=x,n[16]=p,n[17]=D):D=n[17];let R;n[18]!==p||n[19]!==v?(R=p&&z.jsxs("span",{className:"ml-2 text-xs",style:{color:"var(--hud-text-secondary)",opacity:.6},children:[v.length," matches"]}),n[18]=p,n[19]=v,n[20]=R):R=n[20];let _;return n[21]!==D||n[22]!==R?(_=z.jsxs("div",{className:"flex flex-1 items-center",children:[D,R]}),n[21]=D,n[22]=R,n[23]=_):_=n[23],_}function m5(n){return Math.max(n-1,0)}cn();function g5(){const n=Oe.c(73),[e]=Ci(Dt),o=he(F2),r=he(P2),l=he(Bi),c=ge(I2),d=ge(AN),p=ge(_N),m=ne.useRef(null),[h,g]=ne.useState(""),y=he(Tt),v=he(nn),w=he(Zn);let S,A;n[0]!==o?(S=()=>{var J;o&&(o.type==="text"||o.type==="number"||o.type==="point")&&((J=m.current)==null||J.focus())},A=[o],n[0]=o,n[1]=S,n[2]=A):(S=n[1],A=n[2]),ne.useEffect(S,A);let x;n[3]===Symbol.for("react.memo_cache_sentinel")?(x=()=>{g("")},n[3]=x):x=n[3];const E=o==null?void 0:o.name;let D;n[4]!==E?(D=[E],n[4]=E,n[5]=D):D=n[5],ne.useEffect(x,D);let R;n[6]!==v.x||n[7]!==v.y||n[8]!==w||n[9]!==y?(R=()=>{const J=w?w.width/2:window.innerWidth/2,W=w?w.height/2:window.innerHeight/2,ue=(J-v.x)/y,xe=(W-v.y)/y;return{x:Math.round(ue),y:Math.round(xe)}},n[6]=v.x,n[7]=v.y,n[8]=w,n[9]=y,n[10]=R):R=n[10];const _=R;let N,T;n[11]!==o||n[12]!==_||n[13]!==c?(N=()=>{if(!o)return;const J=W=>{const ue=W.target,xe=ue.tagName==="INPUT"||ue.tagName==="TEXTAREA"||ue.isContentEditable;if(W.key==="Enter"&&!xe){if(o.type==="point"){W.preventDefault(),c(_());return}if(o.default!==void 0){W.preventDefault(),c(o.default);return}}if(o.type==="select"&&o.options){const de=o.options.find(Te=>Te.shortcut.toLowerCase()===W.key.toLowerCase());if(de){W.preventDefault(),c(de.value);return}}if(o.type==="boolean"){if(W.key.toLowerCase()==="y"){W.preventDefault(),c(!0);return}if(W.key.toLowerCase()==="n"){W.preventDefault(),c(!1);return}}};return window.addEventListener("keydown",J),()=>window.removeEventListener("keydown",J)},T=[o,c,_],n[11]=o,n[12]=_,n[13]=c,n[14]=N,n[15]=T):(N=n[14],T=n[15]),ne.useEffect(N,T);let O;n[16]!==o||n[17]!==c||n[18]!==h?(O=J=>{if(J.preventDefault(),!!o){if(h===""&&o.default!==void 0){c(o.default),g("");return}if(o.type==="number"){const W=parseFloat(h);isNaN(W)||c(W)}else c(h);g("")}},n[16]=o,n[17]=c,n[18]=h,n[19]=O):O=n[19];const M=O;let $;n[20]!==o||n[21]!==p||n[22]!==r||n[23]!==c||n[24]!==d||n[25]!==h?($=J=>{if(J.key==="Escape"){J.preventDefault(),(o==null?void 0:o.required)===!1?d():r&&r.current>1&&p();return}if(J.key==="Backspace"&&h===""&&r&&r.current>1){J.preventDefault(),p();return}if((o==null?void 0:o.type)==="select"&&o.options){const W=o.options.find(ue=>ue.shortcut.toLowerCase()===J.key.toLowerCase());W&&(J.preventDefault(),c(W.value))}},n[20]=o,n[21]=p,n[22]=r,n[23]=c,n[24]=d,n[25]=h,n[26]=$):$=n[26];const L=$;if(e.phase!=="collecting"||!o)return null;const X=l.type==="pickPoint"||l.type==="pickNode"||l.type==="pickNodes",ae=o.type==="select";let te;n[27]!==r||n[28]!==e.command?(te=r&&z.jsxs("div",{className:"flex items-center gap-2 text-xs",style:{color:"var(--hud-text-secondary)"},children:[z.jsx("span",{className:"font-medium",style:{color:"var(--hud-text)"},children:e.command.name}),z.jsx("span",{children:"•"}),z.jsxs("span",{children:["Step ",r.current,"/",r.total]})]}),n[27]=r,n[28]=e.command,n[29]=te):te=n[29];let me;n[30]===Symbol.for("react.memo_cache_sentinel")?(me={color:"var(--hud-text-secondary)"},n[30]=me):me=n[30];let ce;n[31]!==o.prompt?(ce=z.jsxs("span",{style:me,children:[o.prompt,":"]}),n[31]=o.prompt,n[32]=ce):ce=n[32];let j;n[33]!==l.type||n[34]!==X?(j=X&&z.jsxs("span",{className:"animate-pulse text-sm",style:{color:"var(--badge-info-text)"},children:[l.type==="pickPoint"&&"Click on canvas or enter x,y",l.type==="pickNode"&&"Click on a node",l.type==="pickNodes"&&"Click nodes (Enter when done)"]}),n[33]=l.type,n[34]=X,n[35]=j):j=n[35];let I;n[36]!==o.options||n[37]!==ae||n[38]!==c?(I=ae&&o.options&&z.jsx("div",{className:"flex items-center gap-2",children:o.options.map(J=>z.jsxs("button",{onClick:()=>c(J.value),className:"flex items-center gap-1 rounded px-2 py-0.5 text-sm transition-colors",style:{backgroundColor:"var(--list-item-bg-hover)",color:"var(--hud-text)"},onMouseEnter:E5,onMouseLeave:C5,title:J.description,children:[z.jsx("kbd",{className:"rounded px-1 py-0.5 font-mono text-xs",style:{backgroundColor:"var(--cmd-bg)",color:"var(--badge-info-text)"},children:J.shortcut.toUpperCase()}),z.jsx("span",{children:J.label})]},J.value))}),n[36]=o.options,n[37]=ae,n[38]=c,n[39]=I):I=n[39];let G;n[40]!==o.default||n[41]!==o.type||n[42]!==L||n[43]!==M||n[44]!==h?(G=(o.type==="text"||o.type==="number")&&z.jsx("form",{onSubmit:M,className:"flex flex-1 items-center",children:z.jsx("input",{ref:m,type:o.type==="number"?"number":"text",value:h,onChange:J=>g(J.target.value),onKeyDown:L,placeholder:o.default!==void 0?`Default: ${o.default}`:void 0,className:"flex-1 bg-transparent outline-none",style:{color:"var(--cmd-input-text)"},autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:"false"})}),n[40]=o.default,n[41]=o.type,n[42]=L,n[43]=M,n[44]=h,n[45]=G):G=n[45];let Y;n[46]!==o.type||n[47]!==_||n[48]!==L||n[49]!==c||n[50]!==h?(Y=o.type==="point"&&z.jsx("form",{onSubmit:J=>{if(J.preventDefault(),h.trim()===""){c(_()),g("");return}const W=h.match(/^\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)\s*$/);W&&(c({x:parseFloat(W[1]),y:parseFloat(W[2])}),g(""))},className:"flex flex-1 items-center",children:z.jsx("input",{ref:m,type:"text",value:h,onChange:J=>g(J.target.value),onKeyDown:L,placeholder:"x, y or click on canvas (Enter for center)",className:"flex-1 bg-transparent outline-none",style:{color:"var(--cmd-input-text)"},autoComplete:"off"})}),n[46]=o.type,n[47]=_,n[48]=L,n[49]=c,n[50]=h,n[51]=Y):Y=n[51];let V;n[52]!==o.type||n[53]!==c?(V=o.type==="boolean"&&z.jsxs("div",{className:"flex items-center gap-2",children:[z.jsxs("button",{onClick:()=>c(!0),className:"flex items-center gap-1 rounded px-2 py-0.5 text-sm transition-colors",style:{backgroundColor:"var(--list-item-bg-hover)",color:"var(--hud-text)"},onMouseEnter:_5,onMouseLeave:A5,children:[z.jsx("kbd",{className:"rounded px-1 py-0.5 font-mono text-xs",style:{backgroundColor:"var(--cmd-bg)",color:"var(--badge-info-text)"},children:"Y"}),z.jsx("span",{children:"Yes"})]}),z.jsxs("button",{onClick:()=>c(!1),className:"flex items-center gap-1 rounded px-2 py-0.5 text-sm transition-colors",style:{backgroundColor:"var(--list-item-bg-hover)",color:"var(--hud-text)"},onMouseEnter:S5,onMouseLeave:x5,children:[z.jsx("kbd",{className:"rounded px-1 py-0.5 font-mono text-xs",style:{backgroundColor:"var(--cmd-bg)",color:"var(--badge-info-text)"},children:"N"}),z.jsx("span",{children:"No"})]})]}),n[52]=o.type,n[53]=c,n[54]=V):V=n[54];let k;n[55]!==o.required||n[56]!==d?(k=o.required===!1&&z.jsx("button",{onClick:()=>d(),className:"rounded px-2 py-0.5 text-xs transition-colors",style:{color:"var(--hud-text-secondary)",opacity:.8},onMouseEnter:w5,onMouseLeave:b5,children:"Skip (Esc)"}),n[55]=o.required,n[56]=d,n[57]=k):k=n[57];let H;n[58]!==p||n[59]!==r?(H=r&&r.current>1&&z.jsx("button",{onClick:()=>p(),className:"rounded px-2 py-0.5 text-xs transition-colors",style:{color:"var(--hud-text-secondary)",opacity:.8},onMouseEnter:v5,onMouseLeave:y5,children:"Back"}),n[58]=p,n[59]=r,n[60]=H):H=n[60];let F;n[61]!==ce||n[62]!==j||n[63]!==I||n[64]!==G||n[65]!==Y||n[66]!==V||n[67]!==k||n[68]!==H?(F=z.jsxs("div",{className:"flex items-center gap-2",children:[ce,j,I,G,Y,V,k,H]}),n[61]=ce,n[62]=j,n[63]=I,n[64]=G,n[65]=Y,n[66]=V,n[67]=k,n[68]=H,n[69]=F):F=n[69];let oe;return n[70]!==te||n[71]!==F?(oe=z.jsxs("div",{className:"flex flex-1 flex-col gap-1",children:[te,F]}),n[70]=te,n[71]=F,n[72]=oe):oe=n[72],oe}function y5(n){n.currentTarget.style.backgroundColor="transparent",n.currentTarget.style.color="var(--hud-text-secondary)"}function v5(n){n.currentTarget.style.backgroundColor="var(--list-item-bg-hover)",n.currentTarget.style.color="var(--hud-text)"}function b5(n){n.currentTarget.style.backgroundColor="transparent",n.currentTarget.style.color="var(--hud-text-secondary)"}function w5(n){n.currentTarget.style.backgroundColor="var(--list-item-bg-hover)",n.currentTarget.style.color="var(--hud-text)"}function x5(n){return n.currentTarget.style.backgroundColor="var(--list-item-bg-hover)"}function S5(n){return n.currentTarget.style.backgroundColor="var(--list-item-border)"}function A5(n){return n.currentTarget.style.backgroundColor="var(--list-item-bg-hover)"}function _5(n){return n.currentTarget.style.backgroundColor="var(--list-item-border)"}function C5(n){return n.currentTarget.style.backgroundColor="var(--list-item-bg-hover)"}function E5(n){return n.currentTarget.style.backgroundColor="var(--list-item-border)"}var N5=60,k5=400,C1=200;function T5(n){const e=Oe.c(58),{isModalOpen:o}=n,r=he(sd),[l,c]=Ci(Dt);ge(Cm);const d=he(P2),p=he(ld),m=ge(Bi),h=ne.useRef(null),[g,y]=ne.useState(C1),[v,w]=ne.useState(!1),S=ne.useRef(0),A=ne.useRef(C1);let x,E;e[0]!==o||e[1]!==m||e[2]!==c||e[3]!==l.phase||e[4]!==r?(x=()=>{if(!r)return;const W=ue=>{if(ue.key==="Escape"){if(o!=null&&o())return;ue.preventDefault(),ue.stopPropagation(),(l.phase==="collecting"||l.phase==="executing"||l.phase==="error")&&(c({phase:"searching",query:"",suggestions:To.all()}),m({type:"normal"}))}};return window.addEventListener("keydown",W,{capture:!0}),()=>window.removeEventListener("keydown",W,{capture:!0})},E=[r,l.phase,c,m,o],e[0]=o,e[1]=m,e[2]=c,e[3]=l.phase,e[4]=r,e[5]=x,e[6]=E):(x=e[5],E=e[6]),ne.useEffect(x,E);let D;e[7]!==g?(D=W=>{W.preventDefault(),w(!0),S.current=W.clientY,A.current=g},e[7]=g,e[8]=D):D=e[8];const R=D;let _,N;if(e[9]!==v?(_=()=>{if(!v)return;const W=xe=>{const de=S.current-xe.clientY,Te=Math.min(k5,Math.max(N5,A.current+de));y(Te)},ue=()=>{w(!1)};return window.addEventListener("mousemove",W),window.addEventListener("mouseup",ue),()=>{window.removeEventListener("mousemove",W),window.removeEventListener("mouseup",ue)}},N=[v],e[9]=v,e[10]=_,e[11]=N):(_=e[10],N=e[11]),ne.useEffect(_,N),!r)return null;const T=`${g}px`;let O;e[12]!==T?(O={height:T,maxHeight:"50vh",backgroundColor:"var(--cmd-bg)"},e[12]=T,e[13]=O):O=e[13];const M=v?"var(--cmd-resize-hover)":"var(--cmd-resize-bg)";let $;e[14]!==M?($={borderColor:"var(--cmd-border)",backgroundColor:M},e[14]=M,e[15]=$):$=e[15];let L,X;e[16]!==v?(L=W=>!v&&(W.currentTarget.style.backgroundColor="var(--cmd-resize-hover)"),X=W=>!v&&(W.currentTarget.style.backgroundColor="var(--cmd-resize-bg)"),e[16]=v,e[17]=L,e[18]=X):(L=e[17],X=e[18]);let ae;e[19]===Symbol.for("react.memo_cache_sentinel")?(ae=z.jsx("div",{className:"h-1 w-12 rounded-full opacity-50",style:{backgroundColor:"var(--hud-icon)"}}),e[19]=ae):ae=e[19];let te;e[20]!==R||e[21]!==L||e[22]!==X||e[23]!==$?(te=z.jsx("div",{onMouseDown:R,className:"flex h-3 w-full shrink-0 cursor-ns-resize items-center justify-center border-t transition-colors",style:$,onMouseEnter:L,onMouseLeave:X,children:ae}),e[20]=R,e[21]=L,e[22]=X,e[23]=$,e[24]=te):te=e[24];let me;e[25]===Symbol.for("react.memo_cache_sentinel")?(me=z.jsx("span",{className:"mr-2 text-lg font-bold select-none",style:{color:"var(--badge-info-text)"},children:">"}),e[25]=me):me=e[25];let ce;e[26]!==l.phase?(ce=(l.phase==="idle"||l.phase==="searching")&&z.jsx(p5,{}),e[26]=l.phase,e[27]=ce):ce=e[27];let j;e[28]!==l.phase?(j=l.phase==="collecting"&&z.jsx(g5,{}),e[28]=l.phase,e[29]=j):j=e[29];let I;e[30]!==l.command||e[31]!==l.phase?(I=l.phase==="executing"&&z.jsxs("div",{className:"flex items-center gap-2",style:{color:"var(--badge-warning-text)"},children:[z.jsxs("svg",{className:"h-5 w-5 animate-spin",viewBox:"0 0 24 24",children:[z.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4",fill:"none"}),z.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]}),z.jsxs("span",{className:"text-base",children:["Executing ",l.command.name,"..."]})]}),e[30]=l.command,e[31]=l.phase,e[32]=I):I=e[32];let G;e[33]!==c||e[34]!==l.message||e[35]!==l.phase?(G=l.phase==="error"&&z.jsxs("div",{className:"flex items-center gap-2",style:{color:"var(--badge-error-text)"},children:[z.jsxs("svg",{className:"h-5 w-5",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[z.jsx("circle",{cx:"12",cy:"12",r:"10"}),z.jsx("line",{x1:"15",y1:"9",x2:"9",y2:"15"}),z.jsx("line",{x1:"9",y1:"9",x2:"15",y2:"15"})]}),z.jsx("span",{className:"text-base",children:l.message}),z.jsx("button",{onClick:()=>c({phase:"idle"}),className:"ml-2 rounded px-2 py-1 text-sm transition-colors",style:{backgroundColor:"var(--list-item-bg-hover)",color:"var(--hud-text-secondary)"},onMouseEnter:M5,onMouseLeave:D5,children:"Try again"})]}),e[33]=c,e[34]=l.message,e[35]=l.phase,e[36]=G):G=e[36];let Y;e[37]===Symbol.for("react.memo_cache_sentinel")?(Y=z.jsx("div",{className:"flex-1"}),e[37]=Y):Y=e[37];let V;e[38]!==d?(V=d&&z.jsxs("span",{className:"mr-4 rounded px-2 py-1 text-sm",style:{backgroundColor:"var(--list-item-bg-hover)",color:"var(--hud-text-secondary)"},children:["Step ",d.current,"/",d.total]}),e[38]=d,e[39]=V):V=e[39];let k;e[40]===Symbol.for("react.memo_cache_sentinel")?(k=z.jsx("span",{className:"text-sm select-none",style:{color:"var(--hud-text-secondary)",opacity:.6},children:"/ to close • ESC to cancel"}),e[40]=k):k=e[40];let H;e[41]!==ce||e[42]!==j||e[43]!==I||e[44]!==G||e[45]!==V?(H=z.jsxs("div",{className:"flex items-center px-4 py-3 font-mono text-sm",children:[me,ce,j,I,G,Y,V,k]}),e[41]=ce,e[42]=j,e[43]=I,e[44]=G,e[45]=V,e[46]=H):H=e[46];let F;e[47]!==p||e[48]!==l.phase||e[49]!==l.suggestions?(F=l.phase==="searching"&&l.suggestions.length>0&&z.jsx("div",{className:"min-h-0 shrink overflow-y-auto border-t",style:{maxHeight:"40vh",borderColor:"var(--cmd-border)"},children:l.suggestions.map((W,ue)=>z.jsx(z5,{command:W,isHighlighted:ue===p},W.name))}),e[47]=p,e[48]=l.phase,e[49]=l.suggestions,e[50]=F):F=e[50];let oe;e[51]!==H||e[52]!==F?(oe=z.jsxs("div",{className:"flex min-h-0 flex-1 flex-col overflow-hidden",children:[H,F]}),e[51]=H,e[52]=F,e[53]=oe):oe=e[53];let J;return e[54]!==te||e[55]!==oe||e[56]!==O?(J=z.jsxs("div",{ref:h,className:"fixed right-0 bottom-0 left-0 z-50 flex flex-col shadow-2xl",style:O,children:[te,oe]}),e[54]=te,e[55]=oe,e[56]=O,e[57]=J):J=e[57],J}function D5(n){return n.currentTarget.style.color="var(--hud-text-secondary)"}function M5(n){return n.currentTarget.style.color="var(--hud-text)"}function z5(n){const e=Oe.c(24),{command:o,isHighlighted:r}=n,l=ge(Z2);let c;e[0]!==o||e[1]!==l?(c=()=>l(o),e[0]=o,e[1]=l,e[2]=c):c=e[2];const d=r?"var(--list-item-bg-hover)":"transparent";let p;e[3]!==d?(p={backgroundColor:d},e[3]=d,e[4]=p):p=e[4];let m,h;e[5]!==r?(m=x=>!r&&(x.currentTarget.style.backgroundColor="var(--list-item-bg-hover)"),h=x=>!r&&(x.currentTarget.style.backgroundColor="transparent"),e[5]=r,e[6]=m,e[7]=h):(m=e[6],h=e[7]);let g;e[8]===Symbol.for("react.memo_cache_sentinel")?(g={color:"var(--hud-text)"},e[8]=g):g=e[8];let y;e[9]!==o.name?(y=z.jsx("span",{className:"font-mono",style:g,children:o.name}),e[9]=o.name,e[10]=y):y=e[10];let v;e[11]!==o.aliases?(v=o.aliases&&o.aliases.length>0&&z.jsxs("span",{className:"text-xs",style:{color:"var(--hud-text-secondary)",opacity:.5},children:["(",o.aliases.join(", "),")"]}),e[11]=o.aliases,e[12]=v):v=e[12];let w;e[13]===Symbol.for("react.memo_cache_sentinel")?(w={color:"var(--hud-text-secondary)"},e[13]=w):w=e[13];let S;e[14]!==o.description?(S=z.jsx("span",{className:"text-sm",style:w,children:o.description}),e[14]=o.description,e[15]=S):S=e[15];let A;return e[16]!==c||e[17]!==S||e[18]!==p||e[19]!==m||e[20]!==h||e[21]!==y||e[22]!==v?(A=z.jsxs("button",{onClick:c,className:"flex w-full items-center gap-3 px-4 py-2 text-left transition-colors",style:p,onMouseEnter:m,onMouseLeave:h,children:[y,v,S]}),e[16]=c,e[17]=S,e[18]=p,e[19]=m,e[20]=h,e[21]=y,e[22]=v,e[23]=A):A=e[23],A}cn();function O5(){const n=Oe.c(27),e=he(Bi),o=he(Cl),r=he(F2),l=he(Tt),c=he(nn);if(e.type==="normal")return null;let d;n[0]===Symbol.for("react.memo_cache_sentinel")?(d={},n[0]=d):d=n[0];let p;n[1]!==o||n[2]!==e.type||n[3]!==c||n[4]!==l?(p=(e.type==="pickPoint"||(o==null?void 0:o.crosshair))&&(o==null?void 0:o.cursorWorldPos)&&z.jsx(R5,{position:o.cursorWorldPos,zoom:l,pan:c}),n[1]=o,n[2]=e.type,n[3]=c,n[4]=l,n[5]=p):p=n[5];let m;n[6]!==o||n[7]!==c||n[8]!==l?(m=(o==null?void 0:o.hoveredNodeId)&&z.jsx(j5,{nodeId:o.hoveredNodeId,zoom:l,pan:c}),n[6]=o,n[7]=c,n[8]=l,n[9]=m):m=n[9];let h;n[10]!==o||n[11]!==c||n[12]!==l?(h=(o==null?void 0:o.previewEdge)&&z.jsx(L5,{edge:o.previewEdge,zoom:l,pan:c}),n[10]=o,n[11]=c,n[12]=l,n[13]=h):h=n[13];let g;n[14]!==o||n[15]!==c||n[16]!==l?(g=(o==null?void 0:o.ghostNode)&&z.jsx(U5,{ghost:o.ghostNode,zoom:l,pan:c}),n[14]=o,n[15]=c,n[16]=l,n[17]=g):g=n[17];const y=r==null?void 0:r.prompt;let v;n[18]!==e||n[19]!==y?(v=z.jsx(G5,{inputMode:e,prompt:y}),n[18]=e,n[19]=y,n[20]=v):v=n[20];let w;return n[21]!==p||n[22]!==m||n[23]!==h||n[24]!==g||n[25]!==v?(w=z.jsxs("div",{className:"pointer-events-none fixed inset-0 z-50",style:d,children:[p,m,h,g,v]}),n[21]=p,n[22]=m,n[23]=h,n[24]=g,n[25]=v,n[26]=w):w=n[26],w}function R5(n){const e=Oe.c(10),{position:o,zoom:r,pan:l}=n,c=o.x*r+l.x,d=o.y*r+l.y,p=c-20,m=d-20;let h;e[0]!==p||e[1]!==m?(h={left:p,top:m,width:40,height:40},e[0]=p,e[1]=m,e[2]=h):h=e[2];let g,y,v,w,S;e[3]===Symbol.for("react.memo_cache_sentinel")?(g=z.jsx("line",{x1:"0",y1:"20",x2:"15",y2:"20",stroke:"var(--list-item-border-active)",strokeWidth:"2"}),y=z.jsx("line",{x1:"25",y1:"20",x2:"40",y2:"20",stroke:"var(--list-item-border-active)",strokeWidth:"2"}),v=z.jsx("line",{x1:"20",y1:"0",x2:"20",y2:"15",stroke:"var(--list-item-border-active)",strokeWidth:"2"}),w=z.jsx("line",{x1:"20",y1:"25",x2:"20",y2:"40",stroke:"var(--list-item-border-active)",strokeWidth:"2"}),S=z.jsx("circle",{cx:"20",cy:"20",r:"3",fill:"var(--list-item-border-active)"}),e[3]=g,e[4]=y,e[5]=v,e[6]=w,e[7]=S):(g=e[3],y=e[4],v=e[5],w=e[6],S=e[7]);let A;return e[8]!==h?(A=z.jsxs("svg",{className:"pointer-events-none absolute",style:h,children:[g,y,v,w,S]}),e[8]=h,e[9]=A):A=e[9],A}function j5({nodeId:n,zoom:e,pan:o}){return null}function L5(n){const e=Oe.c(15),{edge:o,zoom:r,pan:l}=n,c=o.from.x*r+l.x,d=o.from.y*r+l.y;let p;e[0]!==c||e[1]!==d?(p={x:c,y:d},e[0]=c,e[1]=d,e[2]=p):p=e[2];const m=p,h=o.to.x*r+l.x,g=o.to.y*r+l.y;let y;e[3]!==h||e[4]!==g?(y={x:h,y:g},e[3]=h,e[4]=g,e[5]=y):y=e[5];const v=y;let w;e[6]===Symbol.for("react.memo_cache_sentinel")?(w={width:"100%",height:"100%"},e[6]=w):w=e[6];let S;e[7]!==m.x||e[8]!==m.y||e[9]!==v.x||e[10]!==v.y?(S=z.jsx("line",{x1:m.x,y1:m.y,x2:v.x,y2:v.y,stroke:"var(--list-item-border-active)",strokeWidth:"2",strokeDasharray:"5,5",markerEnd:"url(#arrowhead)"}),e[7]=m.x,e[8]=m.y,e[9]=v.x,e[10]=v.y,e[11]=S):S=e[11];let A;e[12]===Symbol.for("react.memo_cache_sentinel")?(A=z.jsx("defs",{children:z.jsx("marker",{id:"arrowhead",markerWidth:"10",markerHeight:"7",refX:"9",refY:"3.5",orient:"auto",children:z.jsx("polygon",{points:"0 0, 10 3.5, 0 7",fill:"var(--list-item-border-active)"})})}),e[12]=A):A=e[12];let x;return e[13]!==S?(x=z.jsxs("svg",{className:"pointer-events-none absolute inset-0",style:w,children:[S,A]}),e[13]=S,e[14]=x):x=e[14],x}function U5(n){const e=Oe.c(7),{ghost:o,zoom:r,pan:l}=n,c=o.position.x*r+l.x,d=o.position.y*r+l.y;let p;e[0]!==c||e[1]!==d?(p={x:c,y:d},e[0]=c,e[1]=d,e[2]=p):p=e[2];const m=p,h=m.x-50,g=m.y-50;let y;return e[3]!==o.opacity||e[4]!==h||e[5]!==g?(y=z.jsx("div",{className:"absolute rounded-lg border-2 border-dashed",style:{left:h,top:g,width:100,height:100,opacity:o.opacity,borderColor:"var(--badge-info-border)",backgroundColor:"var(--badge-info-bg)"}}),e[3]=o.opacity,e[4]=h,e[5]=g,e[6]=y):y=e[6],y}function G5(n){const e=Oe.c(7),{inputMode:o,prompt:r}=n,l=r||o.prompt||"Waiting for input...";let c;e:switch(o.type){case"pickPoint":{c="Click to pick point";break e}case"pickNode":{c="Click a node to select";break e}case"pickNodes":{c="Click nodes to select (Shift+click for multiple)";break e}case"select":{c="Choose an option";break e}case"text":{c="Type your input";break e}default:c=o.type}let d,p;e[0]===Symbol.for("react.memo_cache_sentinel")?(d={backgroundColor:"var(--modal-bg)",borderColor:"var(--modal-border)",color:"var(--modal-text-primary)",opacity:.9},p={color:"var(--badge-info-text)"},e[0]=d,e[1]=p):(d=e[0],p=e[1]);let m;e[2]!==c?(m=z.jsxs("span",{style:p,children:[c,":"]}),e[2]=c,e[3]=m):m=e[3];let h;return e[4]!==l||e[5]!==m?(h=z.jsxs("div",{className:"fixed bottom-16 left-1/2 -translate-x-1/2 rounded-lg border px-4 py-2 font-mono text-sm shadow-lg",style:d,children:[m," ",l]}),e[4]=l,e[5]=m,e[6]=h):h=e[6],h}cn();ad();function B5(n){const e=Oe.c(39),{minZoom:o,maxZoom:r,zoomStep:l,position:c,alwaysVisible:d,className:p,style:m}=n,h=o===void 0?.1:o,g=r===void 0?5:r,y=l===void 0?.25:l,v=c===void 0?"bottom-right":c,w=d===void 0?!1:d,[S,A]=Ci(Tt);Ci(nn);const x=he(wm),E=ge(zl);let D;e[0]!==g||e[1]!==A||e[2]!==S||e[3]!==y?(D=()=>{A(Math.min(g,S+y))},e[0]=g,e[1]=A,e[2]=S,e[3]=y,e[4]=D):D=e[4];const R=D;let _;e[5]!==h||e[6]!==A||e[7]!==S||e[8]!==y?(_=()=>{A(Math.max(h,S-y))},e[5]=h,e[6]=A,e[7]=S,e[8]=y,e[9]=_):_=e[9];const N=_;let T;e[10]!==E?(T=()=>{E()},e[10]=E,e[11]=T):T=e[11];const O=T;if(!w&&!x)return null;let M;e[12]!==v?(M=Y5(v),e[12]=v,e[13]=M):M=e[13];const $=M;let L;e[14]!==S?(L=Math.round(S*100),e[14]=S,e[15]=L):L=e[15];const X=L;let ae;e[16]!==$||e[17]!==m?(ae={position:"absolute",...$,display:"flex",flexDirection:"column",gap:"4px",zIndex:100,pointerEvents:"auto",...m},e[16]=$,e[17]=m,e[18]=ae):ae=e[18];const te=S>=g;let me;e[19]===Symbol.for("react.memo_cache_sentinel")?(me=z.jsx(H5,{}),e[19]=me):me=e[19];let ce;e[20]!==R||e[21]!==te?(ce=z.jsx(Bh,{onClick:R,disabled:te,"aria-label":"Zoom in",children:me}),e[20]=R,e[21]=te,e[22]=ce):ce=e[22];const j=`Reset zoom (${X}%)`,I=`${X}%`;let G;e[23]===Symbol.for("react.memo_cache_sentinel")?(G={fontSize:"10px",fontWeight:600},e[23]=G):G=e[23];let Y;e[24]!==O||e[25]!==j||e[26]!==I||e[27]!==X?(Y=z.jsxs(Bh,{onClick:O,"aria-label":j,title:I,style:G,children:[X,"%"]}),e[24]=O,e[25]=j,e[26]=I,e[27]=X,e[28]=Y):Y=e[28];const V=S<=h;let k;e[29]===Symbol.for("react.memo_cache_sentinel")?(k=z.jsx($5,{}),e[29]=k):k=e[29];let H;e[30]!==N||e[31]!==V?(H=z.jsx(Bh,{onClick:N,disabled:V,"aria-label":"Zoom out",children:k}),e[30]=N,e[31]=V,e[32]=H):H=e[32];let F;return e[33]!==p||e[34]!==ae||e[35]!==ce||e[36]!==Y||e[37]!==H?(F=z.jsxs("div",{className:p,style:ae,children:[ce,Y,H]}),e[33]=p,e[34]=ae,e[35]=ce,e[36]=Y,e[37]=H,e[38]=F):F=e[38],F}function Bh(n){const e=Oe.c(12);let o,r,l;if(e[0]!==n){const{children:h,style:g,disabled:y,...v}=n;l=g,o=y,r=v,e[0]=n,e[1]=o,e[2]=r,e[3]=l}else o=e[1],r=e[2],l=e[3];const c=o?"default":"pointer",d=o?.4:1;let p;e[4]!==l||e[5]!==c||e[6]!==d?(p={width:"44px",height:"44px",borderRadius:"12px",border:"1px solid var(--canvas-control-border, rgba(255,255,255,0.1))",backgroundColor:"var(--canvas-control-bg, rgba(30,30,30,0.85))",color:"var(--canvas-control-fg, rgba(255,255,255,0.9))",display:"flex",alignItems:"center",justifyContent:"center",cursor:c,opacity:d,touchAction:"manipulation",WebkitTapHighlightColor:"transparent",userSelect:"none",transition:"background-color 150ms, opacity 150ms",backdropFilter:"blur(12px)",WebkitBackdropFilter:"blur(12px)",padding:0,...l},e[4]=l,e[5]=c,e[6]=d,e[7]=p):p=e[7];let m;return e[8]!==o||e[9]!==r||e[10]!==p?(m=z.jsx("button",{...r,disabled:o,style:p,"data-no-drag":"true"}),e[8]=o,e[9]=r,e[10]=p,e[11]=m):m=e[11],m}function H5(){const n=Oe.c(1);let e;return n[0]===Symbol.for("react.memo_cache_sentinel")?(e=z.jsxs("svg",{width:"18",height:"18",viewBox:"0 0 18 18",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:[z.jsx("line",{x1:"9",y1:"4",x2:"9",y2:"14"}),z.jsx("line",{x1:"4",y1:"9",x2:"14",y2:"9"})]}),n[0]=e):e=n[0],e}function $5(){const n=Oe.c(1);let e;return n[0]===Symbol.for("react.memo_cache_sentinel")?(e=z.jsx("svg",{width:"18",height:"18",viewBox:"0 0 18 18",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:z.jsx("line",{x1:"4",y1:"9",x2:"14",y2:"9"})}),n[0]=e):e=n[0],e}function Y5(n){switch(n){case"bottom-right":return{bottom:"16px",right:"16px"};case"bottom-left":return{bottom:"16px",left:"16px"};case"top-right":return{top:"16px",right:"16px"};case"top-left":return{top:"16px",left:"16px"};default:return{bottom:"16px",right:"16px"}}}Tn();na();fs();function q5(n){const e=Oe.c(18),o=he(sd),r=ge(Q2),l=ge(Cm),c=he(tt),d=ge(cs),p=ge(Ol),m=he(Sl),h=he(od),g=ge(Za),y=ge(_l),v=ge(rd),w=ge(us),S=ge(Up);let A;e[0]!==p||e[1]!==d||e[2]!==l||e[3]!==o||e[4]!==g||e[5]!==S||e[6]!==v||e[7]!==h||e[8]!==m||e[9]!==r||e[10]!==n||e[11]!==y||e[12]!==w||e[13]!==c?(A=R=>{const _=R.target,N=_.tagName==="INPUT"||_.tagName==="TEXTAREA"||_.isContentEditable,T=R.metaKey||R.ctrlKey;if(R.key==="Escape"){!o&&c.size>0&&(R.preventDefault(),d());return}if(!N){if(R.key==="/"){R.preventDefault(),o?l():r();return}if(T&&R.key==="c"&&!R.shiftKey){c.size>0&&(R.preventDefault(),g(Array.from(c)));return}if(T&&R.key==="x"&&!R.shiftKey){c.size>0&&(R.preventDefault(),g(Array.from(c)));return}if(T&&R.key==="v"&&!R.shiftKey){h&&(R.preventDefault(),y());return}if(T&&R.key==="d"&&!R.shiftKey){c.size>0&&(R.preventDefault(),v());return}if(T&&R.key==="a"&&!R.shiftKey){R.preventDefault(),d(),p(m);return}if((R.key==="Delete"||R.key==="Backspace")&&!T){if(c.size>0){R.preventDefault();{w("Delete nodes");for(const O of c)S({nodeId:O})}}return}}},e[0]=p,e[1]=d,e[2]=l,e[3]=o,e[4]=g,e[5]=S,e[6]=v,e[7]=h,e[8]=m,e[9]=r,e[10]=n,e[11]=y,e[12]=w,e[13]=c,e[14]=A):A=e[14];const x=A;let E,D;e[15]!==x?(E=()=>(window.addEventListener("keydown",x),()=>window.removeEventListener("keydown",x)),D=[x],e[15]=x,e[16]=E,e[17]=D):(E=e[16],D=e[17]),ne.useEffect(E,D)}Zt();Tn();cn();ds();var V5=ne.createContext(null);function X5(n){const e=Oe.c(43),{children:o,onCreateNode:r,onUpdateNode:l,onDeleteNode:c,onCreateEdge:d,onDeleteEdge:p,onForceLayoutPersist:m}=n,h=Tl(),g=he(wr),y=he(tt),v=he(Tt),w=he(nn),S=ge(Rl),A=ge(jl),{fitToBounds:x}=Am();let E;e[0]!==m?(E=m?async Y=>{await m(Y.map(Q5))}:void 0,e[0]=m,e[1]=E):E=e[1];let D;e[2]!==E?(D={onPositionsChanged:E},e[2]=E,e[3]=D):D=e[3];const{applyForceLayout:R}=vN(D),_=ge(Cm),N=ge(CN);let T;e[4]!==R||e[5]!==g||e[6]!==x||e[7]!==d||e[8]!==r||e[9]!==p||e[10]!==c||e[11]!==l||e[12]!==w||e[13]!==A||e[14]!==y||e[15]!==h.get||e[16]!==h.set||e[17]!==S||e[18]!==v?(T=()=>({get:h.get,set:h.set,currentGraphId:g,selectedNodeIds:y,viewport:{zoom:v,pan:w},mutations:{createNode:async Y=>{if(!r)throw new Error("onCreateNode callback not provided to CommandProvider");return r(Y)},updateNode:async(Y,V)=>{if(!l)throw new Error("onUpdateNode callback not provided to CommandProvider");return l(Y,V)},deleteNode:async Y=>{if(!c)throw new Error("onDeleteNode callback not provided to CommandProvider");return c(Y)},createEdge:async Y=>{if(!d)throw new Error("onCreateEdge callback not provided to CommandProvider");return d(Y)},deleteEdge:async Y=>{if(!p)throw new Error("onDeleteEdge callback not provided to CommandProvider");return p(Y)}},layout:{fitToBounds:(Y,V)=>{const k=Y==="graph"?No.Graph:No.Selection;x(k,V)},applyForceLayout:R},history:{undo:S,redo:A}}),e[4]=R,e[5]=g,e[6]=x,e[7]=d,e[8]=r,e[9]=p,e[10]=c,e[11]=l,e[12]=w,e[13]=A,e[14]=y,e[15]=h.get,e[16]=h.set,e[17]=S,e[18]=v,e[19]=T):T=e[19];const O=T;let M;e[20]!==_||e[21]!==O||e[22]!==N?(M=async(Y,V)=>{const k=To.get(Y);if(!k)throw new Error(`Unknown command: ${Y}`);for(const F of k.inputs)if(F.required!==!1&&V[F.name]===void 0)throw new Error(`Missing required input: ${F.name}`);const H=O();try{await k.execute(V,H),_()}catch(F){const oe=F,J=oe instanceof Error?oe.message:"Command execution failed";throw N(J),oe}},e[20]=_,e[21]=O,e[22]=N,e[23]=M):M=e[23];const $=M,L=K5,[X,ae]=Ci(Dt),te=ne.useRef(!1);let me;e[24]!==X||e[25]!==O||e[26]!==N||e[27]!==ae||e[28]!==h?(me=()=>{if(X.phase==="executing"&&!te.current){const{command:oe}=X;if(oe.inputs.length===0){te.current=!0;const J=O();oe.execute({},J).then(()=>{ae({phase:"searching",query:"",suggestions:To.all()})}).catch(W=>{const ue=W instanceof Error?W.message:"Command execution failed";N(ue)}).finally(()=>{te.current=!1})}return}if(X.phase!=="collecting"){te.current=!1;return}const{command:Y,inputIndex:V,collected:k}=X,H=Y.inputs.length-1,F=Y.inputs[H];if(V===H&&k[F.name]!==void 0&&!te.current){te.current=!0,ae({phase:"executing",command:Y});const oe=O();Y.execute(k,oe).then(()=>{ae({phase:"searching",query:"",suggestions:To.all()}),h.set(Bi,{type:"normal"}),h.set(Cl,null)}).catch(J=>{const W=J instanceof Error?J.message:"Command execution failed";N(W)}).finally(()=>{te.current=!1})}},e[24]=X,e[25]=O,e[26]=N,e[27]=ae,e[28]=h,e[29]=me):me=e[29];let ce;e[30]!==_||e[31]!==X||e[32]!==O||e[33]!==N||e[34]!==ae||e[35]!==h?(ce=[X,O,_,N,ae,h],e[30]=_,e[31]=X,e[32]=O,e[33]=N,e[34]=ae,e[35]=h,e[36]=ce):ce=e[36],ne.useEffect(me,ce);let j;e[37]!==$||e[38]!==O?(j={executeCommand:$,getContext:O,hasCommand:L},e[37]=$,e[38]=O,e[39]=j):j=e[39];const I=j;let G;return e[40]!==o||e[41]!==I?(G=z.jsx(V5,{value:I,children:o}),e[40]=o,e[41]=I,e[42]=G):G=e[42],G}function K5(n){return To.has(n)}function Q5(n){return{nodeId:n.nodeId,x:n.position.x,y:n.position.y}}var Z5={name:"fitToView",description:"Fit all nodes in the viewport",aliases:["fit","fitAll"],category:"viewport",inputs:[],execute:async(n,e)=>{e.layout.fitToBounds("graph")}},I5={name:"fitSelection",description:"Fit selected nodes in the viewport",aliases:["fitSel"],category:"viewport",inputs:[],execute:async(n,e)=>{if(e.selectedNodeIds.size===0)throw new Error("No nodes selected");e.layout.fitToBounds("selection")}},F5={name:"resetViewport",description:"Reset zoom and pan to default",aliases:["reset","home"],category:"viewport",inputs:[],execute:async(n,e)=>{const{resetViewportAtom:o}=await Promise.resolve().then(()=>(cn(),qu));e.set(o)}},P5={name:"zoomIn",description:"Zoom in on the canvas",aliases:["+","in"],category:"viewport",inputs:[],execute:async(n,e)=>{const{zoomAtom:o,setZoomAtom:r}=await Promise.resolve().then(()=>(cn(),qu)),l=e.get(o);e.set(r,{zoom:Math.min(5,l*1.25)})}},J5={name:"zoomOut",description:"Zoom out on the canvas",aliases:["-","out"],category:"viewport",inputs:[],execute:async(n,e)=>{const{zoomAtom:o,setZoomAtom:r}=await Promise.resolve().then(()=>(cn(),qu)),l=e.get(o);e.set(r,{zoom:Math.max(.1,l/1.25)})}};function W5(){En(Z5),En(I5),En(F5),En(P5),En(J5)}var e4={name:"selectAll",description:"Select all nodes in the graph",aliases:["all"],category:"selection",inputs:[],execute:async(n,e)=>{const{nodeKeysAtom:o,selectedNodeIdsAtom:r}=await Promise.resolve().then(()=>(na(),Bl)),l=e.get(o);e.set(r,new Set(l))}},t4={name:"clearSelection",description:"Clear all selection",aliases:["deselect","clear"],category:"selection",inputs:[],execute:async(n,e)=>{const{clearSelectionAtom:o}=await Promise.resolve().then(()=>(na(),Bl));e.set(o)}},n4={name:"invertSelection",description:"Invert the current selection",aliases:["invert"],category:"selection",inputs:[],execute:async(n,e)=>{const{nodeKeysAtom:o,selectedNodeIdsAtom:r}=await Promise.resolve().then(()=>(na(),Bl)),l=e.get(o),c=e.selectedNodeIds,d=l.filter(p=>!c.has(p));e.set(r,new Set(d))}};function i4(){En(e4),En(t4),En(n4)}var o4={name:"undo",description:"Undo the last action",aliases:["z"],category:"history",inputs:[],execute:async(n,e)=>{e.history.undo()}},r4={name:"redo",description:"Redo the last undone action",aliases:["y"],category:"history",inputs:[],execute:async(n,e)=>{e.history.redo()}};function a4(){En(o4),En(r4)}var s4={name:"forceLayout",description:"Apply force-directed layout to all nodes",aliases:["force","autoLayout"],category:"layout",inputs:[],execute:async(n,e)=>{await e.layout.applyForceLayout()}};function l4(){En(s4)}var c4={name:"copy",description:"Copy selected nodes to clipboard",aliases:["cp"],category:"selection",inputs:[],execute:async(n,e)=>{const{copyToClipboardAtom:o,hasClipboardContentAtom:r}=await Promise.resolve().then(()=>(fs(),Gl));if(e.selectedNodeIds.size===0)throw new Error("No nodes selected to copy");if(e.set(o,Array.from(e.selectedNodeIds)),!e.get(r))throw new Error("Failed to copy nodes")}},u4={name:"cut",description:"Cut selected nodes (copy to clipboard)",aliases:["x"],category:"selection",inputs:[],execute:async(n,e)=>{const{copyToClipboardAtom:o,hasClipboardContentAtom:r}=await Promise.resolve().then(()=>(fs(),Gl));if(e.selectedNodeIds.size===0)throw new Error("No nodes selected to cut");if(e.set(o,Array.from(e.selectedNodeIds)),!e.get(r))throw new Error("Failed to cut nodes");for(const c of e.selectedNodeIds)await e.mutations.deleteNode(c)}},d4={name:"paste",description:"Paste nodes from clipboard",aliases:["v"],category:"selection",inputs:[{name:"position",type:"point",prompt:"Click to paste at position (or Enter for default offset)",required:!1}],execute:async(n,e)=>{const{pasteFromClipboardAtom:o,clipboardAtom:r,PASTE_OFFSET:l}=await Promise.resolve().then(()=>(fs(),Gl)),c=e.get(r);if(!c||c.nodes.length===0)throw new Error("Clipboard is empty");let d=l;if(n.position){const m=n.position;d={x:m.x-c.bounds.minX,y:m.y-c.bounds.minY}}const p=e.set(o,d);if(!p||p.length===0)throw new Error("Failed to paste nodes")},feedback:(n,e)=>e.name==="position"?{crosshair:!0}:null},f4={name:"duplicate",description:"Duplicate selected nodes",aliases:["d","dup"],category:"selection",inputs:[],execute:async(n,e)=>{const{duplicateSelectionAtom:o}=await Promise.resolve().then(()=>(fs(),Gl));if(e.selectedNodeIds.size===0)throw new Error("No nodes selected to duplicate");const r=e.set(o);if(!r||r.length===0)throw new Error("Failed to duplicate nodes")}},h4={name:"deleteSelected",description:"Delete selected nodes",aliases:["del","delete","remove"],category:"selection",inputs:[],execute:async(n,e)=>{if(e.selectedNodeIds.size===0)throw new Error("No nodes selected to delete");const{pushHistoryAtom:o}=await Promise.resolve().then(()=>(na(),Bl));e.set(o,"Delete nodes");for(const r of e.selectedNodeIds)await e.mutations.deleteNode(r)}};function p4(){En(c4),En(u4),En(d4),En(f4),En(h4)}function m4(){W5(),i4(),a4(),l4(),p4()}var g4="0.6.0",y4={version:g4};const v4=(n,e)=>{const o=new Array(n.length+e.length);for(let r=0;r({classGroupId:n,validator:e}),nw=(n=new Map,e=null,o)=>({nextPart:n,validators:e,classGroupId:o}),Ou="-",E1=[],w4="arbitrary..",x4=n=>{const e=A4(n),{conflictingClassGroups:o,conflictingClassGroupModifiers:r}=n;return{getClassGroupId:d=>{if(d.startsWith("[")&&d.endsWith("]"))return S4(d);const p=d.split(Ou),m=p[0]===""&&p.length>1?1:0;return iw(p,m,e)},getConflictingClassGroupIds:(d,p)=>{if(p){const m=r[d],h=o[d];return m?h?v4(h,m):m:h||E1}return o[d]||E1}}},iw=(n,e,o)=>{if(n.length-e===0)return o.classGroupId;const l=n[e],c=o.nextPart.get(l);if(c){const h=iw(n,e+1,c);if(h)return h}const d=o.validators;if(d===null)return;const p=e===0?n.join(Ou):n.slice(e).join(Ou),m=d.length;for(let h=0;hn.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const e=n.slice(1,-1),o=e.indexOf(":"),r=e.slice(0,o);return r?w4+r:void 0})(),A4=n=>{const{theme:e,classGroups:o}=n;return _4(o,e)},_4=(n,e)=>{const o=nw();for(const r in n){const l=n[r];km(l,o,r,e)}return o},km=(n,e,o,r)=>{const l=n.length;for(let c=0;c{if(typeof n=="string"){E4(n,e,o);return}if(typeof n=="function"){N4(n,e,o,r);return}k4(n,e,o,r)},E4=(n,e,o)=>{const r=n===""?e:ow(e,n);r.classGroupId=o},N4=(n,e,o,r)=>{if(T4(n)){km(n(r),e,o,r);return}e.validators===null&&(e.validators=[]),e.validators.push(b4(o,n))},k4=(n,e,o,r)=>{const l=Object.entries(n),c=l.length;for(let d=0;d{let o=n;const r=e.split(Ou),l=r.length;for(let c=0;c"isThemeGetter"in n&&n.isThemeGetter===!0,D4=n=>{if(n<1)return{get:()=>{},set:()=>{}};let e=0,o=Object.create(null),r=Object.create(null);const l=(c,d)=>{o[c]=d,e++,e>n&&(e=0,r=o,o=Object.create(null))};return{get(c){let d=o[c];if(d!==void 0)return d;if((d=r[c])!==void 0)return l(c,d),d},set(c,d){c in o?o[c]=d:l(c,d)}}},wp="!",N1=":",M4=[],k1=(n,e,o,r,l)=>({modifiers:n,hasImportantModifier:e,baseClassName:o,maybePostfixModifierPosition:r,isExternal:l}),z4=n=>{const{prefix:e,experimentalParseClassName:o}=n;let r=l=>{const c=[];let d=0,p=0,m=0,h;const g=l.length;for(let A=0;Am?h-m:void 0;return k1(c,w,v,S)};if(e){const l=e+N1,c=r;r=d=>d.startsWith(l)?c(d.slice(l.length)):k1(M4,!1,d,void 0,!0)}if(o){const l=r;r=c=>o({className:c,parseClassName:l})}return r},O4=n=>{const e=new Map;return n.orderSensitiveModifiers.forEach((o,r)=>{e.set(o,1e6+r)}),o=>{const r=[];let l=[];for(let c=0;c0&&(l.sort(),r.push(...l),l=[]),r.push(d)):l.push(d)}return l.length>0&&(l.sort(),r.push(...l)),r}},R4=n=>({cache:D4(n.cacheSize),parseClassName:z4(n),sortModifiers:O4(n),...x4(n)}),j4=/\s+/,L4=(n,e)=>{const{parseClassName:o,getClassGroupId:r,getConflictingClassGroupIds:l,sortModifiers:c}=e,d=[],p=n.trim().split(j4);let m="";for(let h=p.length-1;h>=0;h-=1){const g=p[h],{isExternal:y,modifiers:v,hasImportantModifier:w,baseClassName:S,maybePostfixModifierPosition:A}=o(g);if(y){m=g+(m.length>0?" "+m:m);continue}let x=!!A,E=r(x?S.substring(0,A):S);if(!E){if(!x){m=g+(m.length>0?" "+m:m);continue}if(E=r(S),!E){m=g+(m.length>0?" "+m:m);continue}x=!1}const D=v.length===0?"":v.length===1?v[0]:c(v).join(":"),R=w?D+wp:D,_=R+E;if(d.indexOf(_)>-1)continue;d.push(_);const N=l(E,x);for(let T=0;T0?" "+m:m)}return m},U4=(...n)=>{let e=0,o,r,l="";for(;e{if(typeof n=="string")return n;let e,o="";for(let r=0;r{let o,r,l,c;const d=m=>{const h=e.reduce((g,y)=>y(g),n());return o=R4(h),r=o.cache.get,l=o.cache.set,c=p,p(m)},p=m=>{const h=r(m);if(h)return h;const g=L4(m,o);return l(m,g),g};return c=d,(...m)=>c(U4(...m))},B4=[],Jt=n=>{const e=o=>o[n]||B4;return e.isThemeGetter=!0,e},aw=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,sw=/^\((?:(\w[\w-]*):)?(.+)\)$/i,H4=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,$4=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Y4=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,q4=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,V4=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,X4=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,ar=n=>H4.test(n),Ge=n=>!!n&&!Number.isNaN(Number(n)),sr=n=>!!n&&Number.isInteger(Number(n)),Hh=n=>n.endsWith("%")&&Ge(n.slice(0,-1)),bo=n=>$4.test(n),lw=()=>!0,K4=n=>Y4.test(n)&&!q4.test(n),Tm=()=>!1,Q4=n=>V4.test(n),Z4=n=>X4.test(n),I4=n=>!we(n)&&!Ae(n),F4=n=>Sr(n,dw,Tm),we=n=>aw.test(n),Yr=n=>Sr(n,fw,K4),T1=n=>Sr(n,o6,Ge),P4=n=>Sr(n,pw,lw),J4=n=>Sr(n,hw,Tm),D1=n=>Sr(n,cw,Tm),W4=n=>Sr(n,uw,Z4),ru=n=>Sr(n,mw,Q4),Ae=n=>sw.test(n),ll=n=>ia(n,fw),e6=n=>ia(n,hw),M1=n=>ia(n,cw),t6=n=>ia(n,dw),n6=n=>ia(n,uw),au=n=>ia(n,mw,!0),i6=n=>ia(n,pw,!0),Sr=(n,e,o)=>{const r=aw.exec(n);return r?r[1]?e(r[1]):o(r[2]):!1},ia=(n,e,o=!1)=>{const r=sw.exec(n);return r?r[1]?e(r[1]):o:!1},cw=n=>n==="position"||n==="percentage",uw=n=>n==="image"||n==="url",dw=n=>n==="length"||n==="size"||n==="bg-size",fw=n=>n==="length",o6=n=>n==="number",hw=n=>n==="family-name",pw=n=>n==="number"||n==="weight",mw=n=>n==="shadow",r6=()=>{const n=Jt("color"),e=Jt("font"),o=Jt("text"),r=Jt("font-weight"),l=Jt("tracking"),c=Jt("leading"),d=Jt("breakpoint"),p=Jt("container"),m=Jt("spacing"),h=Jt("radius"),g=Jt("shadow"),y=Jt("inset-shadow"),v=Jt("text-shadow"),w=Jt("drop-shadow"),S=Jt("blur"),A=Jt("perspective"),x=Jt("aspect"),E=Jt("ease"),D=Jt("animate"),R=()=>["auto","avoid","all","avoid-page","page","left","right","column"],_=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],N=()=>[..._(),Ae,we],T=()=>["auto","hidden","clip","visible","scroll"],O=()=>["auto","contain","none"],M=()=>[Ae,we,m],$=()=>[ar,"full","auto",...M()],L=()=>[sr,"none","subgrid",Ae,we],X=()=>["auto",{span:["full",sr,Ae,we]},sr,Ae,we],ae=()=>[sr,"auto",Ae,we],te=()=>["auto","min","max","fr",Ae,we],me=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],ce=()=>["start","end","center","stretch","center-safe","end-safe"],j=()=>["auto",...M()],I=()=>[ar,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...M()],G=()=>[ar,"screen","full","dvw","lvw","svw","min","max","fit",...M()],Y=()=>[ar,"screen","full","lh","dvh","lvh","svh","min","max","fit",...M()],V=()=>[n,Ae,we],k=()=>[..._(),M1,D1,{position:[Ae,we]}],H=()=>["no-repeat",{repeat:["","x","y","space","round"]}],F=()=>["auto","cover","contain",t6,F4,{size:[Ae,we]}],oe=()=>[Hh,ll,Yr],J=()=>["","none","full",h,Ae,we],W=()=>["",Ge,ll,Yr],ue=()=>["solid","dashed","dotted","double"],xe=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],de=()=>[Ge,Hh,M1,D1],Te=()=>["","none",S,Ae,we],Ce=()=>["none",Ge,Ae,we],Se=()=>["none",Ge,Ae,we],Ee=()=>[Ge,Ae,we],Be=()=>[ar,"full",...M()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[bo],breakpoint:[bo],color:[lw],container:[bo],"drop-shadow":[bo],ease:["in","out","in-out"],font:[I4],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[bo],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[bo],shadow:[bo],spacing:["px",Ge],text:[bo],"text-shadow":[bo],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",ar,we,Ae,x]}],container:["container"],columns:[{columns:[Ge,we,Ae,p]}],"break-after":[{"break-after":R()}],"break-before":[{"break-before":R()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:N()}],overflow:[{overflow:T()}],"overflow-x":[{"overflow-x":T()}],"overflow-y":[{"overflow-y":T()}],overscroll:[{overscroll:O()}],"overscroll-x":[{"overscroll-x":O()}],"overscroll-y":[{"overscroll-y":O()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:$()}],"inset-x":[{"inset-x":$()}],"inset-y":[{"inset-y":$()}],start:[{"inset-s":$(),start:$()}],end:[{"inset-e":$(),end:$()}],"inset-bs":[{"inset-bs":$()}],"inset-be":[{"inset-be":$()}],top:[{top:$()}],right:[{right:$()}],bottom:[{bottom:$()}],left:[{left:$()}],visibility:["visible","invisible","collapse"],z:[{z:[sr,"auto",Ae,we]}],basis:[{basis:[ar,"full","auto",p,...M()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[Ge,ar,"auto","initial","none",we]}],grow:[{grow:["",Ge,Ae,we]}],shrink:[{shrink:["",Ge,Ae,we]}],order:[{order:[sr,"first","last","none",Ae,we]}],"grid-cols":[{"grid-cols":L()}],"col-start-end":[{col:X()}],"col-start":[{"col-start":ae()}],"col-end":[{"col-end":ae()}],"grid-rows":[{"grid-rows":L()}],"row-start-end":[{row:X()}],"row-start":[{"row-start":ae()}],"row-end":[{"row-end":ae()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":te()}],"auto-rows":[{"auto-rows":te()}],gap:[{gap:M()}],"gap-x":[{"gap-x":M()}],"gap-y":[{"gap-y":M()}],"justify-content":[{justify:[...me(),"normal"]}],"justify-items":[{"justify-items":[...ce(),"normal"]}],"justify-self":[{"justify-self":["auto",...ce()]}],"align-content":[{content:["normal",...me()]}],"align-items":[{items:[...ce(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...ce(),{baseline:["","last"]}]}],"place-content":[{"place-content":me()}],"place-items":[{"place-items":[...ce(),"baseline"]}],"place-self":[{"place-self":["auto",...ce()]}],p:[{p:M()}],px:[{px:M()}],py:[{py:M()}],ps:[{ps:M()}],pe:[{pe:M()}],pbs:[{pbs:M()}],pbe:[{pbe:M()}],pt:[{pt:M()}],pr:[{pr:M()}],pb:[{pb:M()}],pl:[{pl:M()}],m:[{m:j()}],mx:[{mx:j()}],my:[{my:j()}],ms:[{ms:j()}],me:[{me:j()}],mbs:[{mbs:j()}],mbe:[{mbe:j()}],mt:[{mt:j()}],mr:[{mr:j()}],mb:[{mb:j()}],ml:[{ml:j()}],"space-x":[{"space-x":M()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":M()}],"space-y-reverse":["space-y-reverse"],size:[{size:I()}],"inline-size":[{inline:["auto",...G()]}],"min-inline-size":[{"min-inline":["auto",...G()]}],"max-inline-size":[{"max-inline":["none",...G()]}],"block-size":[{block:["auto",...Y()]}],"min-block-size":[{"min-block":["auto",...Y()]}],"max-block-size":[{"max-block":["none",...Y()]}],w:[{w:[p,"screen",...I()]}],"min-w":[{"min-w":[p,"screen","none",...I()]}],"max-w":[{"max-w":[p,"screen","none","prose",{screen:[d]},...I()]}],h:[{h:["screen","lh",...I()]}],"min-h":[{"min-h":["screen","lh","none",...I()]}],"max-h":[{"max-h":["screen","lh",...I()]}],"font-size":[{text:["base",o,ll,Yr]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[r,i6,P4]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",Hh,we]}],"font-family":[{font:[e6,J4,e]}],"font-features":[{"font-features":[we]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[l,Ae,we]}],"line-clamp":[{"line-clamp":[Ge,"none",Ae,T1]}],leading:[{leading:[c,...M()]}],"list-image":[{"list-image":["none",Ae,we]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",Ae,we]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:V()}],"text-color":[{text:V()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ue(),"wavy"]}],"text-decoration-thickness":[{decoration:[Ge,"from-font","auto",Ae,Yr]}],"text-decoration-color":[{decoration:V()}],"underline-offset":[{"underline-offset":[Ge,"auto",Ae,we]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:M()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",Ae,we]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",Ae,we]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:k()}],"bg-repeat":[{bg:H()}],"bg-size":[{bg:F()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},sr,Ae,we],radial:["",Ae,we],conic:[sr,Ae,we]},n6,W4]}],"bg-color":[{bg:V()}],"gradient-from-pos":[{from:oe()}],"gradient-via-pos":[{via:oe()}],"gradient-to-pos":[{to:oe()}],"gradient-from":[{from:V()}],"gradient-via":[{via:V()}],"gradient-to":[{to:V()}],rounded:[{rounded:J()}],"rounded-s":[{"rounded-s":J()}],"rounded-e":[{"rounded-e":J()}],"rounded-t":[{"rounded-t":J()}],"rounded-r":[{"rounded-r":J()}],"rounded-b":[{"rounded-b":J()}],"rounded-l":[{"rounded-l":J()}],"rounded-ss":[{"rounded-ss":J()}],"rounded-se":[{"rounded-se":J()}],"rounded-ee":[{"rounded-ee":J()}],"rounded-es":[{"rounded-es":J()}],"rounded-tl":[{"rounded-tl":J()}],"rounded-tr":[{"rounded-tr":J()}],"rounded-br":[{"rounded-br":J()}],"rounded-bl":[{"rounded-bl":J()}],"border-w":[{border:W()}],"border-w-x":[{"border-x":W()}],"border-w-y":[{"border-y":W()}],"border-w-s":[{"border-s":W()}],"border-w-e":[{"border-e":W()}],"border-w-bs":[{"border-bs":W()}],"border-w-be":[{"border-be":W()}],"border-w-t":[{"border-t":W()}],"border-w-r":[{"border-r":W()}],"border-w-b":[{"border-b":W()}],"border-w-l":[{"border-l":W()}],"divide-x":[{"divide-x":W()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":W()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...ue(),"hidden","none"]}],"divide-style":[{divide:[...ue(),"hidden","none"]}],"border-color":[{border:V()}],"border-color-x":[{"border-x":V()}],"border-color-y":[{"border-y":V()}],"border-color-s":[{"border-s":V()}],"border-color-e":[{"border-e":V()}],"border-color-bs":[{"border-bs":V()}],"border-color-be":[{"border-be":V()}],"border-color-t":[{"border-t":V()}],"border-color-r":[{"border-r":V()}],"border-color-b":[{"border-b":V()}],"border-color-l":[{"border-l":V()}],"divide-color":[{divide:V()}],"outline-style":[{outline:[...ue(),"none","hidden"]}],"outline-offset":[{"outline-offset":[Ge,Ae,we]}],"outline-w":[{outline:["",Ge,ll,Yr]}],"outline-color":[{outline:V()}],shadow:[{shadow:["","none",g,au,ru]}],"shadow-color":[{shadow:V()}],"inset-shadow":[{"inset-shadow":["none",y,au,ru]}],"inset-shadow-color":[{"inset-shadow":V()}],"ring-w":[{ring:W()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:V()}],"ring-offset-w":[{"ring-offset":[Ge,Yr]}],"ring-offset-color":[{"ring-offset":V()}],"inset-ring-w":[{"inset-ring":W()}],"inset-ring-color":[{"inset-ring":V()}],"text-shadow":[{"text-shadow":["none",v,au,ru]}],"text-shadow-color":[{"text-shadow":V()}],opacity:[{opacity:[Ge,Ae,we]}],"mix-blend":[{"mix-blend":[...xe(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":xe()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[Ge]}],"mask-image-linear-from-pos":[{"mask-linear-from":de()}],"mask-image-linear-to-pos":[{"mask-linear-to":de()}],"mask-image-linear-from-color":[{"mask-linear-from":V()}],"mask-image-linear-to-color":[{"mask-linear-to":V()}],"mask-image-t-from-pos":[{"mask-t-from":de()}],"mask-image-t-to-pos":[{"mask-t-to":de()}],"mask-image-t-from-color":[{"mask-t-from":V()}],"mask-image-t-to-color":[{"mask-t-to":V()}],"mask-image-r-from-pos":[{"mask-r-from":de()}],"mask-image-r-to-pos":[{"mask-r-to":de()}],"mask-image-r-from-color":[{"mask-r-from":V()}],"mask-image-r-to-color":[{"mask-r-to":V()}],"mask-image-b-from-pos":[{"mask-b-from":de()}],"mask-image-b-to-pos":[{"mask-b-to":de()}],"mask-image-b-from-color":[{"mask-b-from":V()}],"mask-image-b-to-color":[{"mask-b-to":V()}],"mask-image-l-from-pos":[{"mask-l-from":de()}],"mask-image-l-to-pos":[{"mask-l-to":de()}],"mask-image-l-from-color":[{"mask-l-from":V()}],"mask-image-l-to-color":[{"mask-l-to":V()}],"mask-image-x-from-pos":[{"mask-x-from":de()}],"mask-image-x-to-pos":[{"mask-x-to":de()}],"mask-image-x-from-color":[{"mask-x-from":V()}],"mask-image-x-to-color":[{"mask-x-to":V()}],"mask-image-y-from-pos":[{"mask-y-from":de()}],"mask-image-y-to-pos":[{"mask-y-to":de()}],"mask-image-y-from-color":[{"mask-y-from":V()}],"mask-image-y-to-color":[{"mask-y-to":V()}],"mask-image-radial":[{"mask-radial":[Ae,we]}],"mask-image-radial-from-pos":[{"mask-radial-from":de()}],"mask-image-radial-to-pos":[{"mask-radial-to":de()}],"mask-image-radial-from-color":[{"mask-radial-from":V()}],"mask-image-radial-to-color":[{"mask-radial-to":V()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":_()}],"mask-image-conic-pos":[{"mask-conic":[Ge]}],"mask-image-conic-from-pos":[{"mask-conic-from":de()}],"mask-image-conic-to-pos":[{"mask-conic-to":de()}],"mask-image-conic-from-color":[{"mask-conic-from":V()}],"mask-image-conic-to-color":[{"mask-conic-to":V()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:k()}],"mask-repeat":[{mask:H()}],"mask-size":[{mask:F()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",Ae,we]}],filter:[{filter:["","none",Ae,we]}],blur:[{blur:Te()}],brightness:[{brightness:[Ge,Ae,we]}],contrast:[{contrast:[Ge,Ae,we]}],"drop-shadow":[{"drop-shadow":["","none",w,au,ru]}],"drop-shadow-color":[{"drop-shadow":V()}],grayscale:[{grayscale:["",Ge,Ae,we]}],"hue-rotate":[{"hue-rotate":[Ge,Ae,we]}],invert:[{invert:["",Ge,Ae,we]}],saturate:[{saturate:[Ge,Ae,we]}],sepia:[{sepia:["",Ge,Ae,we]}],"backdrop-filter":[{"backdrop-filter":["","none",Ae,we]}],"backdrop-blur":[{"backdrop-blur":Te()}],"backdrop-brightness":[{"backdrop-brightness":[Ge,Ae,we]}],"backdrop-contrast":[{"backdrop-contrast":[Ge,Ae,we]}],"backdrop-grayscale":[{"backdrop-grayscale":["",Ge,Ae,we]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[Ge,Ae,we]}],"backdrop-invert":[{"backdrop-invert":["",Ge,Ae,we]}],"backdrop-opacity":[{"backdrop-opacity":[Ge,Ae,we]}],"backdrop-saturate":[{"backdrop-saturate":[Ge,Ae,we]}],"backdrop-sepia":[{"backdrop-sepia":["",Ge,Ae,we]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":M()}],"border-spacing-x":[{"border-spacing-x":M()}],"border-spacing-y":[{"border-spacing-y":M()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",Ae,we]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[Ge,"initial",Ae,we]}],ease:[{ease:["linear","initial",E,Ae,we]}],delay:[{delay:[Ge,Ae,we]}],animate:[{animate:["none",D,Ae,we]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[A,Ae,we]}],"perspective-origin":[{"perspective-origin":N()}],rotate:[{rotate:Ce()}],"rotate-x":[{"rotate-x":Ce()}],"rotate-y":[{"rotate-y":Ce()}],"rotate-z":[{"rotate-z":Ce()}],scale:[{scale:Se()}],"scale-x":[{"scale-x":Se()}],"scale-y":[{"scale-y":Se()}],"scale-z":[{"scale-z":Se()}],"scale-3d":["scale-3d"],skew:[{skew:Ee()}],"skew-x":[{"skew-x":Ee()}],"skew-y":[{"skew-y":Ee()}],transform:[{transform:[Ae,we,"","none","gpu","cpu"]}],"transform-origin":[{origin:N()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:Be()}],"translate-x":[{"translate-x":Be()}],"translate-y":[{"translate-y":Be()}],"translate-z":[{"translate-z":Be()}],"translate-none":["translate-none"],accent:[{accent:V()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:V()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",Ae,we]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":M()}],"scroll-mx":[{"scroll-mx":M()}],"scroll-my":[{"scroll-my":M()}],"scroll-ms":[{"scroll-ms":M()}],"scroll-me":[{"scroll-me":M()}],"scroll-mbs":[{"scroll-mbs":M()}],"scroll-mbe":[{"scroll-mbe":M()}],"scroll-mt":[{"scroll-mt":M()}],"scroll-mr":[{"scroll-mr":M()}],"scroll-mb":[{"scroll-mb":M()}],"scroll-ml":[{"scroll-ml":M()}],"scroll-p":[{"scroll-p":M()}],"scroll-px":[{"scroll-px":M()}],"scroll-py":[{"scroll-py":M()}],"scroll-ps":[{"scroll-ps":M()}],"scroll-pe":[{"scroll-pe":M()}],"scroll-pbs":[{"scroll-pbs":M()}],"scroll-pbe":[{"scroll-pbe":M()}],"scroll-pt":[{"scroll-pt":M()}],"scroll-pr":[{"scroll-pr":M()}],"scroll-pb":[{"scroll-pb":M()}],"scroll-pl":[{"scroll-pl":M()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",Ae,we]}],fill:[{fill:["none",...V()]}],"stroke-w":[{stroke:[Ge,ll,Yr,T1]}],stroke:[{stroke:["none",...V()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","inset-bs","inset-be","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pbs","pbe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mbs","mbe","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-bs","border-w-be","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-bs","border-color-be","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mbs","scroll-mbe","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pbs","scroll-pbe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},a6=G4(r6);function Dm(...n){return a6(Qb(n))}const s6=Zb("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 cursor-pointer",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),So=ne.forwardRef(({className:n,variant:e,size:o,asChild:r=!1,...l},c)=>{const d=r?wE:"button";return z.jsx(d,{className:Dm(s6({variant:e,size:o,className:n})),ref:c,...l})});So.displayName="Button";const l6=Zb("inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",{variants:{variant:{default:"border-transparent bg-primary text-primary-foreground shadow",secondary:"border-transparent bg-secondary text-secondary-foreground",destructive:"border-transparent bg-destructive text-destructive-foreground shadow",outline:"text-foreground"}},defaultVariants:{variant:"default"}});function $h({className:n,variant:e,...o}){return z.jsx("div",{className:Dm(l6({variant:e}),n),...o})}const gw=ne.forwardRef(({className:n,orientation:e="horizontal",decorative:o=!0,...r},l)=>z.jsx("div",{ref:l,role:o?"none":"separator","aria-orientation":o?void 0:e,className:Dm("shrink-0 bg-border",e==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",n),...r}));gw.displayName="Separator";/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const yw=(...n)=>n.filter((e,o,r)=>!!e&&e.trim()!==""&&r.indexOf(e)===o).join(" ").trim();/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const c6=n=>n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const u6=n=>n.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,o,r)=>r?r.toUpperCase():o.toLowerCase());/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const z1=n=>{const e=u6(n);return e.charAt(0).toUpperCase()+e.slice(1)};/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var d6={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const f6=n=>{for(const e in n)if(e.startsWith("aria-")||e==="role"||e==="title")return!0;return!1};/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const h6=ne.forwardRef(({color:n="currentColor",size:e=24,strokeWidth:o=2,absoluteStrokeWidth:r,className:l="",children:c,iconNode:d,...p},m)=>ne.createElement("svg",{ref:m,...d6,width:e,height:e,stroke:n,strokeWidth:r?Number(o)*24/Number(e):o,className:yw("lucide",l),...!c&&!f6(p)&&{"aria-hidden":"true"},...p},[...d.map(([h,g])=>ne.createElement(h,g)),...Array.isArray(c)?c:[c]]));/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const li=(n,e)=>{const o=ne.forwardRef(({className:r,...l},c)=>ne.createElement(h6,{ref:c,iconNode:e,className:yw(`lucide-${c6(z1(n))}`,`lucide-${n}`,r),...l}));return o.displayName=z1(n),o};/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const p6=[["path",{d:"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3",key:"11bfej"}]],m6=li("command",p6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const g6=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],y6=li("copy",g6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const v6=[["path",{d:"M10 8h.01",key:"1r9ogq"}],["path",{d:"M12 12h.01",key:"1mp3jc"}],["path",{d:"M14 8h.01",key:"1primd"}],["path",{d:"M16 12h.01",key:"1l6xoz"}],["path",{d:"M18 8h.01",key:"emo2bl"}],["path",{d:"M6 8h.01",key:"x9i8wu"}],["path",{d:"M7 16h10",key:"wp8him"}],["path",{d:"M8 12h.01",key:"czm47f"}],["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}]],b6=li("keyboard",v6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const w6=[["path",{d:"m12 15 4 4",key:"lnac28"}],["path",{d:"M2.352 10.648a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l6.029-6.029a1 1 0 1 1 3 3l-6.029 6.029a1.205 1.205 0 0 0 0 1.704l2.296 2.296a1.205 1.205 0 0 0 1.704 0l6.365-6.367A1 1 0 0 0 8.716 4.282z",key:"nlhkjb"}],["path",{d:"m5 8 4 4",key:"j6kj7e"}]],x6=li("magnet",w6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const S6=[["path",{d:"M8 3H5a2 2 0 0 0-2 2v3",key:"1dcmit"}],["path",{d:"M21 8V5a2 2 0 0 0-2-2h-3",key:"1e4gt3"}],["path",{d:"M3 16v3a2 2 0 0 0 2 2h3",key:"wsl5sc"}],["path",{d:"M16 21h3a2 2 0 0 0 2-2v-3",key:"18trek"}]],A6=li("maximize",S6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _6=[["path",{d:"M14 4.1 12 6",key:"ita8i4"}],["path",{d:"m5.1 8-2.9-.8",key:"1go3kf"}],["path",{d:"m6 12-1.9 2",key:"mnht97"}],["path",{d:"M7.2 2.2 8 5.1",key:"1cfko1"}],["path",{d:"M9.037 9.69a.498.498 0 0 1 .653-.653l11 4.5a.5.5 0 0 1-.074.949l-4.349 1.041a1 1 0 0 0-.74.739l-1.04 4.35a.5.5 0 0 1-.95.074z",key:"s0h3yz"}]],C6=li("mouse-pointer-click",_6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const E6=[["path",{d:"M12 2v20",key:"t6zp3m"}],["path",{d:"m15 19-3 3-3-3",key:"11eu04"}],["path",{d:"m19 9 3 3-3 3",key:"1mg7y2"}],["path",{d:"M2 12h20",key:"9i4pu4"}],["path",{d:"m5 9-3 3 3 3",key:"j64kie"}],["path",{d:"m9 5 3-3 3 3",key:"l8vdw6"}]],N6=li("move",E6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const k6=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],T6=li("pencil",k6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const D6=[["path",{d:"m15 14 5-5-5-5",key:"12vg1m"}],["path",{d:"M20 9H9.5A5.5 5.5 0 0 0 4 14.5A5.5 5.5 0 0 0 9.5 20H13",key:"6uklza"}]],M6=li("redo-2",D6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const z6=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],O6=li("settings",z6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const R6=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],j6=li("trash-2",R6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const L6=[["path",{d:"M9 14 4 9l5-5",key:"102s5s"}],["path",{d:"M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11",key:"f3b9sd"}]],U6=li("undo-2",L6);/** + * @license lucide-react v0.576.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const G6=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],B6=li("x",G6);m4();const Xa=["#6366f1","#f97316","#22c55e","#3b82f6","#ec4899","#eab308","#14b8a6","#f43f5e","#a855f7","#ef4444"],Ru=160,ju=80;function H6(){const[n,e]=ne.useState(0),o=ne.useRef(0),r=ne.useRef(performance.now());return ne.useEffect(()=>{let l;const c=()=>{o.current++;const d=performance.now();d-r.current>=1e3&&(e(Math.round(o.current*1e3/(d-r.current))),o.current=0,r.current=d),l=requestAnimationFrame(c)};return l=requestAnimationFrame(c),()=>cancelAnimationFrame(l)},[]),n}const $6=Ji.memo(function({node:e,isSelected:o}){return z.jsxs("div",{className:` + w-full h-full flex flex-col items-center justify-center gap-1 + rounded-lg border px-3 py-2 cursor-grab + transition-all duration-150 + ${o?"bg-indigo-500/20 border-indigo-400 shadow-[0_0_20px_rgba(99,102,241,0.3)]":"bg-secondary/50 border-border/50 shadow-sm hover:border-border"} + `,children:[z.jsx("span",{className:"text-sm font-semibold text-foreground truncate max-w-full",children:e.label||`Node ${e.id}`}),z.jsxs("span",{className:"text-[10px] font-mono text-muted-foreground",children:[Math.round(e.x),", ",Math.round(e.y)]})]})});function Y6(n){const e=new We({multi:!0,allowSelfLoops:!0,type:"directed"}),o=new Date().toISOString(),r=Math.max(Math.ceil(Math.sqrt(n*1.5)),5);for(let l=0;l=50?"text-green-400":o>=30?"text-yellow-400":"text-red-400";return z.jsxs("aside",{className:"fixed top-0 left-0 bottom-0 w-64 bg-background/95 backdrop-blur-xl border-r border-border z-[200] flex flex-col overflow-y-auto",children:[z.jsxs("div",{className:"p-4 pb-3 border-b border-border",children:[z.jsxs("p",{className:"text-[11px] font-mono text-muted-foreground",children:["@blinksgg/canvas v",y4.version]}),z.jsx("h1",{className:"text-base font-bold mt-1",children:"Feature Demo"})]}),z.jsxs("div",{className:"px-4 py-3 border-b border-border",children:[z.jsx("span",{className:`text-3xl font-bold ${x}`,children:o}),z.jsx("span",{className:"text-xs text-muted-foreground ml-1",children:"FPS"})]}),z.jsx(su,{title:"Graph",children:z.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[z.jsxs($h,{variant:"secondary",children:["📦 ",n," nodes"]}),z.jsxs($h,{variant:"secondary",children:["✅ ",r.count," selected"]}),z.jsxs($h,{variant:"secondary",children:["🔍 ",(l.zoom*100).toFixed(0),"%"]})]})}),z.jsx(su,{title:"Node Count",children:z.jsx("div",{className:"flex flex-wrap gap-1",children:[10,50,100,200,500,1e3].map(E=>z.jsx(So,{size:"sm",variant:n===E?"default":"secondary",className:"h-7 px-2.5 text-xs font-mono",onClick:()=>e(E),children:E},E))})}),z.jsx(su,{title:"Actions",children:z.jsxs("div",{className:"flex flex-col gap-1",children:[z.jsxs(So,{variant:"ghost",size:"sm",className:"justify-between",onClick:()=>g(),children:[z.jsxs("span",{className:"flex items-center gap-2",children:[z.jsx(m6,{className:"w-3.5 h-3.5"})," Command Palette"]}),z.jsx("kbd",{className:"text-[10px] text-muted-foreground bg-secondary px-1.5 py-0.5 rounded",children:"/"})]}),z.jsxs(So,{variant:"ghost",size:"sm",className:"justify-start gap-2",onClick:()=>h(No.Graph),children:[z.jsx(A6,{className:"w-3.5 h-3.5"})," Fit to View"]}),z.jsxs("div",{className:"flex gap-1",children:[z.jsxs(So,{variant:"ghost",size:"sm",className:"flex-1 gap-1",disabled:!p,onClick:c,children:[z.jsx(U6,{className:"w-3.5 h-3.5"})," Undo"]}),z.jsxs(So,{variant:"ghost",size:"sm",className:"flex-1 gap-1",disabled:!m,onClick:d,children:[z.jsx(M6,{className:"w-3.5 h-3.5"})," Redo"]})]}),z.jsxs(So,{variant:"ghost",size:"sm",className:"justify-start gap-2",onClick:v,children:[z.jsx(x6,{className:"w-3.5 h-3.5"}),"Snap: ",y?"ON":"OFF"," (",w,"px)"]}),z.jsxs(So,{variant:S?"secondary":"ghost",size:"sm",className:"justify-start gap-2",onClick:A,children:[z.jsx(O6,{className:"w-3.5 h-3.5"})," Settings Panel"]})]})}),S&&z.jsx(su,{title:"Event → Action Mappings",children:z.jsx(u5,{className:"flex flex-col gap-2 text-xs",headerClassName:"hidden",contentClassName:"flex flex-col gap-3",footerClassName:"text-[10px] text-muted-foreground pt-2 border-t border-border",groupClassName:"flex flex-col gap-1",groupHeadingClassName:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground mb-1",rowClassName:"flex items-center justify-between gap-2 py-0.5",labelClassName:"text-xs text-foreground shrink-0",selectClassName:"bg-secondary text-foreground border border-border rounded-md px-1.5 py-1 text-[11px] min-w-0 flex-1 truncate",buttonClassName:"bg-secondary text-foreground border border-border rounded-md px-2 py-1 text-[11px] cursor-pointer hover:bg-accent transition-colors",presetClassName:"flex flex-col gap-1.5",presetSelectClassName:"bg-secondary text-foreground border border-border rounded-md px-2 py-1 text-xs w-full",presetButtonsClassName:"flex gap-1 flex-wrap",inputClassName:"bg-secondary text-foreground border border-border rounded-md px-2 py-1 text-xs flex-1 min-w-0",checkboxClassName:"accent-indigo-500",quickActionsClassName:"flex flex-col gap-1",virtualizationClassName:"flex items-center gap-2 [&_label]:flex [&_label]:items-center [&_label]:gap-1.5 [&_label]:cursor-pointer [&_label]:text-xs",virtualizationStatsClassName:"text-[10px] text-muted-foreground",onClose:A,renderHeader:()=>z.jsxs("div",{className:"flex items-center justify-between w-full mb-1",children:[z.jsx("span",{className:"font-semibold text-sm",children:"Settings"}),z.jsx(So,{variant:"ghost",size:"icon",className:"h-6 w-6",onClick:A,children:z.jsx(B6,{className:"w-3.5 h-3.5"})})]})})}),z.jsx(gw,{}),z.jsxs("div",{className:"px-4 py-3 mt-auto text-[11px] text-muted-foreground leading-relaxed",children:[z.jsx("p",{className:"font-semibold text-xs text-foreground mb-1.5",children:"Controls"}),z.jsxs("div",{className:"space-y-0.5",children:[z.jsxs("p",{children:[z.jsx(N6,{className:"w-3 h-3 inline mr-1"})," Drag bg → Pan"]}),z.jsxs("p",{children:[z.jsx(C6,{className:"w-3 h-3 inline mr-1"})," Dbl-click → mapped action"]}),z.jsxs("p",{children:[z.jsx(T6,{className:"w-3 h-3 inline mr-1"})," Pencil → Lasso"]}),z.jsxs("p",{children:[z.jsx(b6,{className:"w-3 h-3 inline mr-1"})," / → Palette · ⌘Z → Undo"]}),z.jsxs("p",{children:[z.jsx(y6,{className:"w-3 h-3 inline mr-1"})," ⌘C/V/D → Copy/Paste/Dupe"]}),z.jsxs("p",{children:[z.jsx(j6,{className:"w-3 h-3 inline mr-1"})," Del → Remove selected"]})]})]})]})}function su({title:n,children:e}){return z.jsxs("div",{className:"px-4 py-3 border-b border-border",children:[z.jsx("p",{className:"text-[11px] font-semibold uppercase tracking-wider text-muted-foreground mb-2",children:n}),e]})}function V6(){return q5(),null}let Yh=0;function X6(){const[n]=rA(ze),e=Ka(ze),o=Ka(en),r=Ka(Qn),[l,c]=ne.useState(20),d=ne.useCallback(()=>{o(G=>G+1),r(G=>G+1)},[o,r]),p=ne.useCallback(G=>{Yh=G,e(Y6(G)),d()},[e,d]);ne.useEffect(()=>{p(l)},[]);const m=ne.useCallback(G=>{c(G),p(G)},[p]),h=ne.useCallback((G,Y,V)=>{const k=`n${Yh++}`,H=Xa[Math.floor(Math.random()*Xa.length)],F=V??`Node ${Yh-1}`;n.addNode(k,{x:G-80,y:Y-40,size:10,width:Ru,height:ju,color:H,label:F,zIndex:0,dbData:{id:k,graph_id:"demo",label:F,node_type:"default",configuration:null,ui_properties:{x:G-80,y:Y-40,width:Ru,height:ju,color:H},created_at:new Date().toISOString(),updated_at:new Date().toISOString()}}),d(),c(n.order)},[n,d]),g=ne.useCallback(G=>{n.hasNode(G)&&(n.dropNode(G),d(),c(n.order))},[n,d]),{executeEventAction:y}=bN({onCreateNode:async G=>h(G.x,G.y),onDeleteNode:async G=>g(G),onOpenContextMenu:(G,Y)=>console.log("[ctx]",Y??"bg",G)}),v=ne.useCallback((G,Y)=>{y(fe.NodeClick,si(fe.NodeClick,{clientX:Y.x,clientY:Y.y},{x:Y.x,y:Y.y},{nodeId:G}))},[y]),w=ne.useCallback((G,Y)=>{y(fe.NodeDoubleClick,si(fe.NodeDoubleClick,{clientX:Y.x,clientY:Y.y},{x:Y.x,y:Y.y},{nodeId:G}))},[y]),S=ne.useCallback((G,Y)=>{y(fe.NodeTripleClick,si(fe.NodeTripleClick,{clientX:Y.x,clientY:Y.y},{x:Y.x,y:Y.y},{nodeId:G}))},[y]),A=ne.useCallback(G=>{y(fe.BackgroundDoubleClick,si(fe.BackgroundDoubleClick,{clientX:G.x,clientY:G.y},G))},[y]),x=ne.useCallback((G,Y)=>{y(fe.BackgroundRightClick,si(fe.BackgroundRightClick,{clientX:Y.clientX,clientY:Y.clientY},G))},[y]),E=ne.useCallback(G=>{y(fe.BackgroundLongPress,si(fe.BackgroundLongPress,{clientX:G.x,clientY:G.y},G))},[y]),D=ne.useCallback(G=>{y(fe.BackgroundClick,si(fe.BackgroundClick,{clientX:G.x,clientY:G.y},G))},[y]),R=ne.useCallback((G,Y,V)=>{y(fe.NodeRightClick,si(fe.NodeRightClick,{clientX:V.clientX,clientY:V.clientY},{x:Y.x,y:Y.y},{nodeId:G}))},[y]),_=ne.useCallback((G,Y,V)=>{y(fe.NodeLongPress,si(fe.NodeLongPress,{clientX:V.x,clientY:V.y},{x:Y.x,y:Y.y},{nodeId:G}))},[y]),N=ne.useCallback((G,Y,V)=>{y(fe.EdgeClick,si(fe.EdgeClick,{clientX:V.clientX,clientY:V.clientY},{x:V.clientX,y:V.clientY},{edgeId:G,edgeData:Y}))},[y]),T=ne.useCallback((G,Y,V)=>{y(fe.EdgeDoubleClick,si(fe.EdgeDoubleClick,{clientX:V.clientX,clientY:V.clientY},{x:V.clientX,y:V.clientY},{edgeId:G,edgeData:Y}))},[y]),O=ne.useCallback((G,Y,V)=>{y(fe.EdgeRightClick,si(fe.EdgeRightClick,{clientX:V.clientX,clientY:V.clientY},{x:V.clientX,y:V.clientY},{edgeId:G,edgeData:Y}))},[y]),M=ne.useCallback((G,Y)=>{console.log("[edge:hover]",G)},[]),$=ne.useCallback(G=>{console.log("[edge:leave]",G)},[]),L=ne.useCallback((G,Y)=>{console.log("[selection]",{nodes:[...G],edge:Y})},[]),X=ne.useCallback(G=>{console.log("[viewport]",{zoom:G.zoom.toFixed(2),pan:G.pan})},[]),ae=ne.useCallback(G=>{console.log("[drag:start]",G)},[]),te=ne.useCallback((G,Y)=>{console.log("[drag:end]",G,Object.fromEntries(Y))},[]),me=ne.useCallback((G,Y)=>{console.log("[hover]",G)},[]),ce=ne.useCallback(G=>{console.log("[leave]",G)},[]),j=ne.useCallback(async G=>{const Y=G.ui_properties;h((Y==null?void 0:Y.x)??0,(Y==null?void 0:Y.y)??0,G.label)},[h]),I=ne.useCallback(async G=>g(G),[g]);return z.jsxs(X5,{onCreateNode:j,onDeleteNode:I,children:[z.jsx(V6,{}),z.jsx("div",{className:"w-screen h-screen pl-64 box-border",children:z.jsxs(o5,{renderNode:G=>z.jsx($6,{...G}),style:{background:"linear-gradient(145deg, #0f172a 0%, #1e1b4b 50%, #0f172a 100%)"},onNodeClick:v,onNodeDoubleClick:w,onNodeTripleClick:S,onNodeRightClick:R,onNodeLongPress:_,onNodeHover:me,onNodeLeave:ce,onEdgeClick:N,onEdgeDoubleClick:T,onEdgeRightClick:O,onEdgeHover:M,onEdgeLeave:$,onSelectionChange:L,onViewportChange:X,onDragStart:ae,onDragEnd:te,onBackgroundClick:D,onBackgroundDoubleClick:A,onBackgroundRightClick:x,onBackgroundLongPress:E,children:[z.jsx(B5,{}),z.jsx(O5,{})]})}),z.jsx(T5,{}),z.jsx(q6,{nodeCount:l,onSetNodes:m})]})}function K6(){return z.jsx(iA,{children:z.jsx(HN,{isDark:!0,children:z.jsx(X6,{})})})}US.createRoot(document.getElementById("root")).render(z.jsx(Ji.StrictMode,{children:z.jsx(K6,{})})); diff --git a/canvas-demo/dist/assets/index-BbLtK4h-.css b/canvas-demo/dist/assets/index-BbLtK4h-.css new file mode 100644 index 0000000..8e4eb70 --- /dev/null +++ b/canvas-demo/dist/assets/index-BbLtK4h-.css @@ -0,0 +1 @@ +/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-yellow-400:oklch(85.2% .199 91.936);--color-green-400:oklch(79.2% .209 151.711);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-background:oklch(14.5% 0 0);--color-foreground:oklch(98.5% 0 0);--color-primary:oklch(92.2% 0 0);--color-primary-foreground:oklch(20.5% 0 0);--color-secondary:oklch(26.9% 0 0);--color-secondary-foreground:oklch(92.2% 0 0);--color-muted-foreground:oklch(70.8% 0 0);--color-accent:oklch(26.9% 0 0);--color-accent-foreground:oklch(92.2% 0 0);--color-destructive:oklch(70.4% .191 22.216);--color-destructive-foreground:oklch(92.2% 0 0);--color-border:oklch(26.9% 0 0);--color-input:oklch(26.9% 0 0);--color-ring:oklch(55.6% 0 0)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.top-0{top:calc(var(--spacing)*0)}.bottom-0{bottom:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.z-\[200\]{z-index:200}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-auto{margin-top:auto}.mr-1{margin-right:calc(var(--spacing)*1)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.ml-1{margin-left:calc(var(--spacing)*1)}.box-border{box-sizing:border-box}.flex{display:flex}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-\[1px\]{height:1px}.h-full{height:100%}.h-screen{height:100vh}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-6{width:calc(var(--spacing)*6)}.w-9{width:calc(var(--spacing)*9)}.w-64{width:calc(var(--spacing)*64)}.w-\[1px\]{width:1px}.w-full{width:100%}.w-screen{width:100vw}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--color-border)}.border-border\/50{border-color:#26262680}@supports (color:color-mix(in lab,red,red)){.border-border\/50{border-color:color-mix(in oklab,var(--color-border)50%,transparent)}}.border-indigo-400{border-color:var(--color-indigo-400)}.border-input{border-color:var(--color-input)}.border-transparent{border-color:#0000}.bg-background{background-color:var(--color-background)}.bg-background\/95{background-color:#0a0a0af2}@supports (color:color-mix(in lab,red,red)){.bg-background\/95{background-color:color-mix(in oklab,var(--color-background)95%,transparent)}}.bg-border{background-color:var(--color-border)}.bg-destructive{background-color:var(--color-destructive)}.bg-indigo-500\/20{background-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/20{background-color:color-mix(in oklab,var(--color-indigo-500)20%,transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-secondary{background-color:var(--color-secondary)}.bg-secondary\/50{background-color:#26262680}@supports (color:color-mix(in lab,red,red)){.bg-secondary\/50{background-color:color-mix(in oklab,var(--color-secondary)50%,transparent)}}.p-4{padding:calc(var(--spacing)*4)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.pt-2{padding-top:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pl-64{padding-left:calc(var(--spacing)*64)}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.text-destructive-foreground{color:var(--color-destructive-foreground)}.text-foreground{color:var(--color-foreground)}.text-green-400{color:var(--color-green-400)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-red-400{color:var(--color-red-400)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-yellow-400{color:var(--color-yellow-400)}.uppercase{text-transform:uppercase}.underline-offset-4{text-underline-offset:4px}.accent-indigo-500{accent-color:var(--color-indigo-500)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_20px_rgba\(99\,102\,241\,0\.3\)\]{--tw-shadow:0 0 20px var(--tw-shadow-color,#6366f14d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.\[drag\:end\]{drag:end}.\[drag\:start\]{drag:start}.\[edge\:hover\]{edge:hover}.\[edge\:leave\]{edge:leave}@media(hover:hover){.hover\:border-border:hover{border-color:var(--color-border)}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-destructive\/90:hover{background-color:#ff6568e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--color-destructive)90%,transparent)}}.hover\:bg-primary\/90:hover{background-color:#e5e5e5e6}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--color-primary)90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:#262626cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--color-secondary)80%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--color-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--color-ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--color-ring)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.\[\&_label\]\:flex label{display:flex}.\[\&_label\]\:cursor-pointer label{cursor:pointer}.\[\&_label\]\:items-center label{align-items:center}.\[\&_label\]\:gap-1\.5 label{gap:calc(var(--spacing)*1.5)}.\[\&_label\]\:text-xs label{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}}body{background:var(--color-background);color:var(--color-foreground);margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@font-face{font-family:Inter;font-style:normal;font-weight:100;src:local(""),url(/assets/inter-v12-latin-100-BQDzDElq.woff2) format("woff2"),url(/assets/inter-v12-latin-100-46Mq0mOp.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:200;src:local(""),url(/assets/inter-v12-latin-200-BxfrU12A.woff2) format("woff2"),url(/assets/inter-v12-latin-200-DXfqWPZg.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:300;src:local(""),url(/assets/inter-v12-latin-300-DEbyFmpd.woff2) format("woff2"),url(/assets/inter-v12-latin-300-f7r92Nkj.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:400;src:local(""),url(/assets/inter-v12-latin-regular-YtgfLPRn.woff2) format("woff2"),url(/assets/inter-v12-latin-regular-CahmJf_6.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:500;src:local(""),url(/assets/inter-v12-latin-500-DfX5FI9E.woff2) format("woff2"),url(/assets/inter-v12-latin-500-BQ2gQN_M.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:600;src:local(""),url(/assets/inter-v12-latin-600-BvOeHRLc.woff2) format("woff2"),url(/assets/inter-v12-latin-600-D01NXWOK.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:700;src:local(""),url(/assets/inter-v12-latin-700-Bj1B9WKG.woff2) format("woff2"),url(/assets/inter-v12-latin-700-B5TOIllR.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:800;src:local(""),url(/assets/inter-v12-latin-800-Bdy4lAMa.woff2) format("woff2"),url(/assets/inter-v12-latin-800-DFVvDWwT.woff) format("woff")}@font-face{font-family:Inter;font-style:normal;font-weight:900;src:local(""),url(/assets/inter-v12-latin-900-CMga-52B.woff2) format("woff2"),url(/assets/inter-v12-latin-900-ORHAl5ZU.woff) format("woff")}.bn-block-outer{line-height:1.5;transition:margin .2s}.bn-block{display:flex;flex-direction:column}.bn-block-content{padding:3px 0;display:flex;transition:font-size .2s;width:100%}.bn-block-content.ProseMirror-selectednode>*,.ProseMirror-selectednode>.bn-block-content>*{border-radius:4px;outline:4px solid rgb(100,160,255)}.bn-block-content:before{content:"";margin-right:0;transition:all .2s;height:0;overflow:visible}.bn-inline-content{width:100%}.bn-block-group .bn-block-group{margin-left:24px}.bn-block-group .bn-block-group>.bn-block-outer{position:relative}.bn-block-group .bn-block-group>.bn-block-outer:not([data-prev-depth-changed]):before{content:" ";display:inline;position:absolute;left:-20px;height:100%;transition:all .2s .1s}.bn-block-group .bn-block-group>.bn-block-outer[data-prev-depth-change="-2"]:before{height:0}.bn-inline-content code{font-family:monospace}[data-prev-depth-change="1"]{--x: 1}[data-prev-depth-change="2"]{--x: 2}[data-prev-depth-change="3"]{--x: 3}[data-prev-depth-change="4"]{--x: 4}[data-prev-depth-change="5"]{--x: 5}[data-prev-depth-change="-1"]{--x: -1}[data-prev-depth-change="-2"]{--x: -2}[data-prev-depth-change="-3"]{--x: -3}[data-prev-depth-change="-4"]{--x: -4}[data-prev-depth-change="-5"]{--x: -5}.bn-block-outer[data-prev-depth-change]{margin-left:calc(10px * var(--x))}.bn-block-outer[data-prev-depth-change] .bn-block-outer[data-prev-depth-change]{margin-left:0}[data-content-type=heading]{--level: 3em}[data-content-type=heading][data-level="2"]{--level: 2em}[data-content-type=heading][data-level="3"]{--level: 1.3em}[data-content-type=heading][data-level="4"]{--level: 1em}[data-content-type=heading][data-level="5"]{--level: .9em}[data-content-type=heading][data-level="6"]{--level: .8em}[data-prev-level="1"]{--prev-level: 3em}[data-prev-level="2"]{--prev-level: 2em}[data-prev-level="3"]{--prev-level: 1.3em}[data-prev-level="4"]{--prev-level: 1em}[data-prev-level="5"]{--prev-level: .9em}[data-prev-level="6"]{--prev-level: .8em}.bn-block-outer[data-prev-type=heading]>.bn-block>.bn-block-content{font-size:var(--prev-level);font-weight:700}.bn-block-outer:not([data-prev-type])>.bn-block>.bn-block-content[data-content-type=heading],.bn-block-outer:not([data-prev-type])>.bn-block>div[data-type=modification]>div[data-type=modification]>.bn-block-content[data-content-type=heading]{font-size:var(--level);font-weight:700}[data-content-type=quote] blockquote{border-left:2px solid rgb(125,121,122);color:#7d797a;margin:0;padding-left:1em}[data-content-type=divider] hr{border:none;border-top:1px solid rgb(125,121,122);margin:.5em 0;flex:1}.bn-block-content:before{margin-right:0;content:""}.bn-block-content[data-content-type=numberedListItem]:before{display:flex;justify-content:center;min-width:24px;padding-right:4px}[data-content-type=numberedListItem]{--index: attr(data-index)}[data-prev-type=numberedListItem]{--prev-index: attr(data-prev-index)}.bn-block-outer[data-prev-type=numberedListItem]:not([data-prev-index=none])>.bn-block>.bn-block-content:before{content:var(--prev-index) "."}.bn-block-outer:not([data-prev-type])>.bn-block>.bn-block-content[data-content-type=numberedListItem]:before,.bn-block-outer:not([data-prev-type])>.bn-block>div[data-type=modification]>.bn-block-content[data-content-type=numberedListItem]:before{content:var(--index) "."}.bn-block-content[data-content-type=bulletListItem]:before{display:flex;justify-content:center;min-width:24px;padding-right:4px}.bn-block-content[data-content-type=checkListItem]>input{cursor:pointer;height:24px;margin-left:4px;margin-right:8px;margin-top:0;width:12px}.bn-block-content[data-content-type=checkListItem][data-checked=true] .bn-inline-content{text-decoration:line-through}.bn-block-content[data-text-alignment=center]{justify-content:center}.bn-block-content[data-text-alignment=right]{justify-content:flex-end}.bn-block:has(>.bn-block-content>div>.bn-toggle-wrapper[data-show-children=false])>.bn-block-group,.bn-block:has(>.react-renderer>.bn-block-content>div>.bn-toggle-wrapper[data-show-children=false])>.bn-block-group{display:none}.bn-toggle-wrapper{display:flex;align-items:center}.bn-toggle-button{color:var(--bn-colors-editor-text);padding:3px}.bn-toggle-button>svg{width:18px;height:18px}.bn-toggle-wrapper[data-show-children=true] .bn-toggle-button{transform:rotate(90deg)}.bn-toggle-add-block-button{font-size:16px;color:var(--bn-colors-side-menu);font-weight:400;margin-left:22px;padding-inline:2px;width:fit-content}.bn-toggle-button,.bn-toggle-add-block-button{background:none;border:none;border-radius:var(--bn-border-radius-small);cursor:pointer;display:flex;-webkit-user-select:none;user-select:none}.bn-toggle-button:hover,.bn-toggle-add-block-button:hover{background-color:var(--bn-colors-hovered-background)}.bn-block-outer[data-prev-type=bulletListItem]>.bn-block>.bn-block-content:before{content:"•"}.bn-block-outer:not([data-prev-type])>.bn-block>.bn-block-content[data-content-type=bulletListItem]:before,.bn-block-outer:not([data-prev-type])>.bn-block>div[data-type=modification]>.bn-block-content[data-content-type=bulletListItem]:before{content:"•"}[data-content-type=bulletListItem]~.bn-block-group>.bn-block-outer[data-prev-type=bulletListItem]>.bn-block>.bn-block-content:before{content:"◦"}[data-content-type=bulletListItem]~.bn-block-group>.bn-block-outer:not([data-prev-type])>.bn-block>.bn-block-content[data-content-type=bulletListItem]:before,[data-content-type=bulletListItem]~.bn-block-group>.bn-block-outer:not([data-prev-type])>.bn-block>div[data-type=modification]>.bn-block-content[data-content-type=bulletListItem]:before{content:"◦"}[data-content-type=bulletListItem]~.bn-block-group [data-content-type=bulletListItem]~.bn-block-group>.bn-block-outer[data-prev-type=bulletListItem]>.bn-block>.bn-block-content:before{content:"▪"}[data-content-type=bulletListItem]~.bn-block-group [data-content-type=bulletListItem]~.bn-block-group>.bn-block-outer:not([data-prev-type])>.bn-block>.bn-block-content[data-content-type=bulletListItem]:before,[data-content-type=bulletListItem]~.bn-block-group [data-content-type=bulletListItem]~.bn-block-group>.bn-block-outer:not([data-prev-type])>.bn-block>div[data-type=modification]>.bn-block-content[data-content-type=bulletListItem]:before{content:"▪"}.bn-block-content[data-content-type=codeBlock]{position:relative;background-color:#161616;color:#fff;border-radius:8px}.bn-block-content[data-content-type=codeBlock]>pre{white-space:pre;overflow-x:auto;margin:0;width:100%;-moz-tab-size:2;tab-size:2;padding:24px}.bn-block-content[data-content-type=codeBlock]>div{outline:none!important}.bn-block-content[data-content-type=codeBlock]>div>select{outline:none!important;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;user-select:none;border:none;cursor:pointer;background-color:transparent;position:absolute;top:8px;left:18px;font-size:.8em;color:#fff;opacity:0;transition:opacity .3s;transition-delay:1s}.bn-block-content[data-content-type=codeBlock]>div>select>option{color:#000}.bn-block-content[data-content-type=codeBlock]:hover>div>select,.bn-block-content[data-content-type=codeBlock]>div>select:focus{opacity:.5;transition-delay:.1s}.bn-block-content[data-content-type=pageBreak]>div{width:100%;height:0;border-top:dotted rgb(125,121,122) 2px;margin-block:11px}@media print{.bn-block-content[data-content-type=pageBreak]>div{page-break-after:always}}[data-file-block] .bn-file-block-content-wrapper{cursor:pointer;display:flex;flex-direction:column;-webkit-user-select:none;user-select:none}[data-file-block] .bn-file-block-content-wrapper:has(.bn-add-file-button),[data-file-block] .bn-file-block-content-wrapper:has(.bn-file-name-with-icon){width:100%}[data-file-block] .bn-add-file-button{align-items:center;background-color:#f2f1ee;border-radius:4px;color:#7d797a;display:flex;gap:10px;padding:12px}.bn-editor[contenteditable=true] [data-file-block] .bn-add-file-button:hover,[data-file-block] .bn-file-name-with-icon:hover,.ProseMirror-selectednode .bn-file-name-with-icon{background-color:#e1e1e1}[data-file-block] .bn-add-file-button-icon,[data-file-block] .bn-file-icon{width:24px;height:24px}[data-file-block] .bn-add-file-button-text{font-size:.9rem}[data-file-block] .bn-file-name-with-icon{border-radius:4px;display:flex;gap:4px;padding:4px}[data-file-block] .bn-file-caption{font-size:.8em;padding-block:4px;word-break:break-word}[data-file-block] .bn-file-caption:empty{padding-block:0}[data-file-block] .bn-resize-handle{position:absolute;width:8px;height:30px;background-color:#000;border:1px solid white;border-radius:4px;cursor:ew-resize}[data-file-block] .bn-visual-media-wrapper{display:flex;align-items:center;position:relative;max-width:100%}[data-file-block] .bn-visual-media{border-radius:4px;width:100%}[data-content-type=audio]>.bn-file-block-content-wrapper,.bn-audio{width:100%}.bn-inline-content:has(>.ProseMirror-trailingBreak:only-child):before{pointer-events:none;height:0;position:absolute;font-style:italic}[data-style-type=textColor][data-value=gray],[data-text-color=gray],.bn-block:has(>.bn-block-content[data-text-color=gray]){color:#9b9a97}[data-style-type=textColor][data-value=brown],[data-text-color=brown],.bn-block:has(>.bn-block-content[data-text-color=brown]){color:#64473a}[data-style-type=textColor][data-value=red],[data-text-color=red],.bn-block:has(>.bn-block-content[data-text-color=red]){color:#e03e3e}[data-style-type=textColor][data-value=orange],[data-text-color=orange],.bn-block:has(>.bn-block-content[data-text-color=orange]){color:#d9730d}[data-style-type=textColor][data-value=yellow],[data-text-color=yellow],.bn-block:has(>.bn-block-content[data-text-color=yellow]){color:#dfab01}[data-style-type=textColor][data-value=green],[data-text-color=green],.bn-block:has(>.bn-block-content[data-text-color=green]){color:#4d6461}[data-style-type=textColor][data-value=blue],[data-text-color=blue],.bn-block:has(>.bn-block-content[data-text-color=blue]){color:#0b6e99}[data-style-type=textColor][data-value=purple],[data-text-color=purple],.bn-block:has(>.bn-block-content[data-text-color=purple]){color:#6940a5}[data-style-type=textColor][data-value=pink],[data-text-color=pink],.bn-block:has(>.bn-block-content[data-text-color=pink]){color:#ad1a72}[data-style-type=backgroundColor][data-value=gray],[data-background-color=gray],.bn-block:has(>.bn-block-content[data-background-color=gray]){background-color:#ebeced}[data-style-type=backgroundColor][data-value=brown],[data-background-color=brown],.bn-block:has(>.bn-block-content[data-background-color=brown]){background-color:#e9e5e3}[data-style-type=backgroundColor][data-value=red],[data-background-color=red],.bn-block:has(>.bn-block-content[data-background-color=red]){background-color:#fbe4e4}[data-style-type=backgroundColor][data-value=orange],[data-background-color=orange],.bn-block:has(>.bn-block-content[data-background-color=orange]){background-color:#f6e9d9}[data-style-type=backgroundColor][data-value=yellow],[data-background-color=yellow],.bn-block:has(>.bn-block-content[data-background-color=yellow]){background-color:#fbf3db}[data-style-type=backgroundColor][data-value=green],[data-background-color=green],.bn-block:has(>.bn-block-content[data-background-color=green]){background-color:#ddedea}[data-style-type=backgroundColor][data-value=blue],[data-background-color=blue],.bn-block:has(>.bn-block-content[data-background-color=blue]){background-color:#ddebf1}[data-style-type=backgroundColor][data-value=purple],[data-background-color=purple],.bn-block:has(>.bn-block-content[data-background-color=purple]){background-color:#eae4f2}[data-style-type=backgroundColor][data-value=pink],[data-background-color=pink],.bn-block:has(>.bn-block-content[data-background-color=pink]){background-color:#f4dfeb}[data-text-alignment=left]{justify-content:flex-start!important;text-align:left!important}[data-text-alignment=center]{justify-content:center!important;text-align:center!important}[data-text-alignment=right]{justify-content:flex-end!important;text-align:right!important}[data-text-alignment=justify]{justify-content:flex-start!important;text-align:justify!important}.bn-block-column-list{display:flex;flex-direction:row}.bn-block-column{flex:1;padding:12px 20px;overflow-x:auto}.bn-block-column:first-child{padding-left:0}.bn-block-column:last-child{padding-right:0}.bn-thread-mark:not([data-orphan=true]){background:#ffc80026}.bn-thread-mark .bn-thread-mark-selected{background:#ffc80040}.ProseMirror .tableWrapper{overflow-x:auto}.ProseMirror table{border-collapse:collapse;table-layout:fixed;width:100%;overflow:hidden}.ProseMirror td,.ProseMirror th{vertical-align:top;box-sizing:border-box;position:relative}.ProseMirror td:not([data-colwidth]):not(.column-resize-dragging),.ProseMirror th:not([data-colwidth]):not(.column-resize-dragging){min-width:var(--default-cell-min-width)}.ProseMirror .column-resize-handle{position:absolute;right:-2px;top:0;bottom:0;width:4px;z-index:20;background-color:#adf;pointer-events:none}.ProseMirror.resize-cursor{cursor:ew-resize;cursor:col-resize}.ProseMirror .selectedCell:after{z-index:2;position:absolute;content:"";left:0;right:0;top:0;bottom:0;background:#c8c8ff66;pointer-events:none}.bn-editor{outline:none;padding-inline:54px;--N800: #172b4d;--N40: #dfe1e6}.bn-comment-editor{width:100%;padding:0}.bn-comment-editor .bn-editor{padding:0}.bn-root{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bn-root *,.bn-root *:before,.bn-root *:after{-webkit-box-sizing:inherit;-moz-box-sizing:inherit;box-sizing:inherit}.bn-default-styles p,.bn-default-styles h1,.bn-default-styles h2,.bn-default-styles h3,.bn-default-styles h4,.bn-default-styles h5,.bn-default-styles h6,.bn-default-styles li{margin:0;padding:0;font-size:inherit;min-width:2px!important}.bn-default-styles{font-size:16px;font-weight:400;font-family:Inter,SF Pro Display,-apple-system,BlinkMacSystemFont,Open Sans,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.bn-table-drop-cursor{position:absolute;z-index:20;background-color:#adf;pointer-events:none}.bn-drag-preview{position:absolute;top:0;left:0;padding:10px;opacity:.001}.bn-editor .bn-collaboration-cursor__base{position:relative}.bn-editor .bn-collaboration-cursor__base .bn-collaboration-cursor__caret{position:absolute;width:2px;top:1px;bottom:-2px;left:-1px}.bn-editor .bn-collaboration-cursor__base .bn-collaboration-cursor__label{pointer-events:none;border-radius:0 1.5px 1.5px 0;font-size:12px;font-style:normal;font-weight:600;line-height:normal;left:0;overflow:hidden;position:absolute;white-space:nowrap;-webkit-user-select:none;user-select:none;color:transparent;max-height:5px;max-width:4px;padding:0;top:-1px;transition:all .2s}.bn-editor .bn-collaboration-cursor__base[data-active] .bn-collaboration-cursor__label{color:#0d0d0d;max-height:1.1rem;max-width:20rem;padding:.1rem .3rem;top:-17px;left:0;border-radius:3px 3px 3px 0;transition:all .2s}.bn-editor [data-content-type=table] .tableWrapper{--bn-table-widget-size: 22px;--bn-table-handle-size: 9px ;overflow-y:hidden;padding:var(--bn-table-handle-size) var(--bn-table-widget-size) var(--bn-table-widget-size) var(--bn-table-handle-size);position:relative;width:100%}.bn-editor [data-content-type=table] table{width:auto!important;word-break:break-word}.bn-editor [data-content-type=table] th,.bn-editor [data-content-type=table] td{border:1px solid #ddd;padding:5px 10px}.bn-editor [data-content-type=table] th{font-weight:700;text-align:left}.bn-editor [data-content-type=table] th>p,.bn-editor [data-content-type=table] td>p{min-height:1.5rem}.ProseMirror td,.ProseMirror th{min-width:auto!important}.ProseMirror td:not([colwidth]):not(.column-resize-dragging),.ProseMirror th:not([colwidth]):not(.column-resize-dragging){min-width:var(--default-cell-min-width)!important}.prosemirror-dropcursor-block{transition-property:top,bottom;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.prosemirror-dropcursor-vertical{transition-property:left,right}[data-show-selection]{background-color:highlight;padding:2px 0}.bn-container{--bn-colors-editor-text: #3f3f3f;--bn-colors-editor-background: #ffffff;--bn-colors-menu-text: #3f3f3f;--bn-colors-menu-background: #ffffff;--bn-colors-tooltip-text: #3f3f3f;--bn-colors-tooltip-background: #efefef;--bn-colors-hovered-text: #3f3f3f;--bn-colors-hovered-background: #efefef;--bn-colors-selected-text: #ffffff;--bn-colors-selected-background: #3f3f3f;--bn-colors-disabled-text: #afafaf;--bn-colors-disabled-background: #efefef;--bn-colors-shadow: #cfcfcf;--bn-colors-border: #efefef;--bn-colors-side-menu: #cfcfcf;--bn-colors-highlights-gray-text: #9b9a97;--bn-colors-highlights-gray-background: #ebeced;--bn-colors-highlights-brown-text: #64473a;--bn-colors-highlights-brown-background: #e9e5e3;--bn-colors-highlights-red-text: #e03e3e;--bn-colors-highlights-red-background: #fbe4e4;--bn-colors-highlights-orange-text: #d9730d;--bn-colors-highlights-orange-background: #f6e9d9;--bn-colors-highlights-yellow-text: #dfab01;--bn-colors-highlights-yellow-background: #fbf3db;--bn-colors-highlights-green-text: #4d6461;--bn-colors-highlights-green-background: #ddedea;--bn-colors-highlights-blue-text: #0b6e99;--bn-colors-highlights-blue-background: #ddebf1;--bn-colors-highlights-purple-text: #6940a5;--bn-colors-highlights-purple-background: #eae4f2;--bn-colors-highlights-pink-text: #ad1a72;--bn-colors-highlights-pink-background: #f4dfeb;--bn-font-family: "Inter", "SF Pro Display", -apple-system, BlinkMacSystemFont, "Open Sans", "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;--bn-border-radius: 6px;--bn-shadow-medium: 0 4px 12px var(--bn-colors-shadow);--bn-shadow-light: 0 2px 6px var(--bn-colors-border);--bn-border: 1px solid var(--bn-colors-border);--bn-border-radius-small: max(var(--bn-border-radius) - 2px, 1px);--bn-border-radius-medium: var(--bn-border-radius);--bn-border-radius-large: max(var(--bn-border-radius) + 2px, 1px)}.bn-container[data-color-scheme=dark]{--bn-colors-editor-text: #cfcfcf;--bn-colors-editor-background: #1f1f1f;--bn-colors-menu-text: #cfcfcf;--bn-colors-menu-background: #1f1f1f;--bn-colors-tooltip-text: #cfcfcf;--bn-colors-tooltip-background: #161616;--bn-colors-hovered-text: #cfcfcf;--bn-colors-hovered-background: #161616;--bn-colors-selected-text: #cfcfcf;--bn-colors-selected-background: #0f0f0f;--bn-colors-disabled-text: #3f3f3f;--bn-colors-disabled-background: #161616;--bn-colors-shadow: #0f0f0f;--bn-colors-border: #161616;--bn-colors-side-menu: #7f7f7f;--bn-colors-highlights-gray-text: #bebdb8;--bn-colors-highlights-gray-background: #9b9a97;--bn-colors-highlights-brown-text: #8e6552;--bn-colors-highlights-brown-background: #64473a;--bn-colors-highlights-red-text: #ec4040;--bn-colors-highlights-red-background: #be3434;--bn-colors-highlights-orange-text: #e3790d;--bn-colors-highlights-orange-background: #b7600a;--bn-colors-highlights-yellow-text: #dfab01;--bn-colors-highlights-yellow-background: #b58b00;--bn-colors-highlights-green-text: #6b8b87;--bn-colors-highlights-green-background: #4d6461;--bn-colors-highlights-blue-text: #0e87bc;--bn-colors-highlights-blue-background: #0b6e99;--bn-colors-highlights-purple-text: #8552d7;--bn-colors-highlights-purple-background: #6940a5;--bn-colors-highlights-pink-text: #da208f;--bn-colors-highlights-pink-background: #ad1a72}.bn-container{font-family:var(--bn-font-family)}.bn-editor{background-color:var(--bn-colors-editor-background);border-radius:var(--bn-border-radius-large);color:var(--bn-colors-editor-text)}.bn-react-node-view-renderer{display:flex;flex-direction:column;width:100%}.bn-block-group .bn-block:not(:has(.bn-toggle-wrapper)) .bn-block-group .bn-block-outer:not([data-prev-depth-changed]):before{border-left:1px solid var(--bn-colors-side-menu)}.bn-inline-content:has(>.ProseMirror-trailingBreak):before{color:var(--bn-colors-side-menu)}.bn-container .bn-color-icon{align-items:center;border:var(--bn-border);border-radius:var(--bn-border-radius-small);display:flex;justify-content:center}.bn-error-text{color:red;font-size:12px}[data-style-type=textColor][data-value=gray],[data-text-color=gray]{color:var(--bn-colors-highlights-gray-text)}[data-style-type=textColor][data-value=brown],[data-text-color=brown]{color:var(--bn-colors-highlights-brown-text)}[data-style-type=textColor][data-value=red],[data-text-color=red]{color:var(--bn-colors-highlights-red-text)}[data-style-type=textColor][data-value=orange],[data-text-color=orange]{color:var(--bn-colors-highlights-orange-text)}[data-style-type=textColor][data-value=yellow],[data-text-color=yellow]{color:var(--bn-colors-highlights-yellow-text)}[data-style-type=textColor][data-value=green],[data-text-color=green]{color:var(--bn-colors-highlights-green-text)}[data-style-type=textColor][data-value=blue],[data-text-color=blue]{color:var(--bn-colors-highlights-blue-text)}[data-style-type=textColor][data-value=purple],[data-text-color=purple]{color:var(--bn-colors-highlights-purple-text)}[data-style-type=textColor][data-value=pink],[data-text-color=pink]{color:var(--bn-colors-highlights-pink-text)}[data-style-type=backgroundColor][data-value=gray],[data-background-color=gray]{background-color:var(--bn-colors-highlights-gray-background)}[data-style-type=backgroundColor][data-value=brown],[data-background-color=brown]{background-color:var(--bn-colors-highlights-brown-background)}[data-style-type=backgroundColor][data-value=red],[data-background-color=red]{background-color:var(--bn-colors-highlights-red-background)}[data-style-type=backgroundColor][data-value=orange],[data-background-color=orange]{background-color:var(--bn-colors-highlights-orange-background)}[data-style-type=backgroundColor][data-value=yellow],[data-background-color=yellow]{background-color:var(--bn-colors-highlights-yellow-background)}[data-style-type=backgroundColor][data-value=green],[data-background-color=green]{background-color:var(--bn-colors-highlights-green-background)}[data-style-type=backgroundColor][data-value=blue],[data-background-color=blue]{background-color:var(--bn-colors-highlights-blue-background)}[data-style-type=backgroundColor][data-value=purple],[data-background-color=purple]{background-color:var(--bn-colors-highlights-purple-background)}[data-style-type=backgroundColor][data-value=pink],[data-background-color=pink]{background-color:var(--bn-colors-highlights-pink-background)}.bn-container{--bn-ui-base-z-index: 0}.bn-side-menu{height:30px}.bn-side-menu[data-block-type=heading][data-level="1"]{height:78px}.bn-side-menu[data-block-type=heading][data-level="2"]{height:54px}.bn-side-menu[data-block-type=heading][data-level="3"]{height:37px}.bn-side-menu[data-block-type=file]{height:38px}.bn-side-menu[data-block-type=audio]{height:60px}.bn-side-menu[data-url=false]{height:54px}.bn-threads-sidebar{border-radius:var(--bn-border-radius-medium);display:flex;flex-direction:column;gap:10px;overflow:auto}.bn-thread-expand-prompt .mantine-Text-root,.bn-thread .bn-header-text{color:var(--bn-colors-menu-text)}.bn-threads-sidebar .bn-thread .bn-editor{background-color:transparent}.bn-threads-sidebar .bn-thread.selected{background-color:#f5f9fd;border:2px solid #c2dcf8}.dark .bn-threads-sidebar .bn-thread.selected{background-color:#20242a;border:2px solid #23405b}em-emoji-picker{max-height:100%;z-index:11000}.bn-shadcn svg:not([class*=size-]){width:revert;height:revert}.bn-shadcn svg{pointer-events:all}.bn-shadcn .bn-editor a{color:revert;text-decoration:revert}.bn-shadcn .bn-editor:focus-visible{outline:none}.bn-shadcn .bn-side-menu{align-items:center;display:flex;justify-content:center}.bn-shadcn .bn-side-menu .bn-button{padding:0;height:24px}.bn-shadcn .bn-select{max-height:var(--radix-select-content-available-height)}.bn-shadcn .bn-menu-dropdown{max-height:var(--radix-dropdown-menu-content-available-height)}.bn-shadcn .bn-color-picker-dropdown{overflow:auto}.bn-shadcn .bn-extend-button-add-remove-columns{cursor:col-resize}.bn-shadcn .bn-extend-button-add-remove-rows{cursor:row-resize}.bn-shadcn .bn-toolbar{overflow-x:auto;max-width:100vw}.bn-shadcn .bn-comment-actions-wrapper{display:flex;justify-content:flex-end}.bn-shadcn .bn-table-cell-handle{padding:0 4px;height:12px}.bn-shadcn .bn-thread .bn-resolved-text{font-size:14px;font-style:italic}.bn-shadcn .bn-combobox-error{color:var(--bn-colors-highlights-red-background);font-weight:700} diff --git a/canvas-demo/dist/assets/inter-v12-latin-100-46Mq0mOp.woff b/canvas-demo/dist/assets/inter-v12-latin-100-46Mq0mOp.woff new file mode 100644 index 0000000000000000000000000000000000000000..ae5e660b36f401e33714fd7cf24bd66a799845ee GIT binary patch literal 21240 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 A8~^|S literal 0 HcmV?d00001 diff --git a/canvas-demo/dist/assets/inter-v12-latin-100-BQDzDElq.woff2 b/canvas-demo/dist/assets/inter-v12-latin-100-BQDzDElq.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1ef23573652f263ddc59093737bd3a8a7d207908 GIT binary patch literal 16548 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

k$`dkkCYy$8&_ZTXJp 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 Ye+CQ(7_a~UEL{Qe0Js7Fg|GyT0A>+QrT_o{ literal 0 HcmV?d00001 diff --git a/canvas-demo/dist/assets/inter-v12-latin-500-BQ2gQN_M.woff b/canvas-demo/dist/assets/inter-v12-latin-500-BQ2gQN_M.woff new file mode 100644 index 0000000000000000000000000000000000000000..19c7bf8f0b3ba385e27f3e6c63413bc17fb7ee93 GIT binary patch literal 22516 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 literal 0 HcmV?d00001 diff --git a/canvas-demo/dist/assets/inter-v12-latin-600-D01NXWOK.woff b/canvas-demo/dist/assets/inter-v12-latin-600-D01NXWOK.woff new file mode 100644 index 0000000000000000000000000000000000000000..b606a875e6704a6f7a4ff0636b3da3f064162b8a GIT binary patch literal 22636 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 literal 0 HcmV?d00001 diff --git a/canvas-demo/dist/assets/inter-v12-latin-700-B5TOIllR.woff b/canvas-demo/dist/assets/inter-v12-latin-700-B5TOIllR.woff new file mode 100644 index 0000000000000000000000000000000000000000..097e23e3c07dc21f481b31bec990dc04e4ed6a7f GIT binary patch literal 22684 zcmYg$19T+Y_jSkiWMZ2W+qP}nwrx%_u_m^iOl;d`M-%(Yd++zH^}nl6o!+N*owNH^ z*Il>jmb<)|7ytzD)ikmI$p82ji7)(bYH+24r;k$fsp#Nvc<~E*YUojs5 zfSC#aP-bx?)HAd&H8cSL6idH2Z2uVDfT5_xSMV#g^Mwh&j1>PKh1|l{<*TOB7X+;b z03b}L+xmHI?2W&8DqnR$Q@^Y+xcnEZt)a(PU3Hl+BJP(Ff;fRd+8NrKe#I=l^kIDQ zFc}zBwjJ!9zqDxtd~wkJ;e9XzdL5ihzmC;N`NB~Dm<41^sK*+@00?A=0zh=u8%lt$ zApigt_MN%dErB#Zfe=u|2911=iwKGixZaCZk=RZ9yz?}eKy%j9xcy!qj!R@dg6