@visualli/core 0.1.7 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -105
- package/dist/chunk-25AJTPMS.js +68 -0
- package/dist/chunk-25AJTPMS.js.map +1 -0
- package/dist/{chunk-6NXADJK2.js → chunk-7NJWM7ZE.js} +84 -117
- package/dist/chunk-7NJWM7ZE.js.map +1 -0
- package/dist/chunk-KVSM3APM.js +96 -0
- package/dist/chunk-KVSM3APM.js.map +1 -0
- package/dist/{chunk-PDP5CVUL.js → chunk-LOQLNYB3.js} +2 -2
- package/dist/chunk-LV3EXUQY.js +753 -0
- package/dist/chunk-LV3EXUQY.js.map +1 -0
- package/dist/chunk-N7HCYULH.js +12 -0
- package/dist/chunk-N7HCYULH.js.map +1 -0
- package/dist/{chunk-I75TMOE4.js → chunk-P6PKWVYF.js} +2 -2
- package/dist/chunk-TPLJJKAU.js +151 -0
- package/dist/chunk-TPLJJKAU.js.map +1 -0
- package/dist/chunk-UAMEJG2C.js +267 -0
- package/dist/chunk-UAMEJG2C.js.map +1 -0
- package/dist/{chunk-LJYSKSCE.js → chunk-W2CAOOJJ.js} +6 -6
- package/dist/chunk-W2CAOOJJ.js.map +1 -0
- package/dist/config/index.cjs +250 -349
- package/dist/config/index.cjs.map +1 -1
- package/dist/config/index.d.cts +107 -66
- package/dist/config/index.d.ts +107 -66
- package/dist/config/index.js +52 -34
- package/dist/constants/index.cjs +14 -333
- package/dist/constants/index.cjs.map +1 -1
- package/dist/constants/index.d.cts +5 -243
- package/dist/constants/index.d.ts +5 -243
- package/dist/constants/index.js +5 -75
- package/dist/designSystem-BOrZHfEq.d.cts +150 -0
- package/dist/designSystem-BOrZHfEq.d.ts +150 -0
- package/dist/document-BFBwn93X.d.ts +26 -0
- package/dist/document-MEJEfxl3.d.cts +26 -0
- package/dist/ideaSize-CLDKeyqD.d.cts +11 -0
- package/dist/ideaSize-DxxGy2E8.d.ts +11 -0
- package/dist/index-BmILeKj6.d.cts +99 -0
- package/dist/index-CcPRwVUL.d.ts +99 -0
- package/dist/index.cjs +1636 -961
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +350 -27
- package/dist/index.d.ts +350 -27
- package/dist/index.js +434 -179
- package/dist/index.js.map +1 -1
- package/dist/{document-B3hnNr-F.d.cts → layer-B2A3Ki48.d.cts} +2 -16
- package/dist/{document-B3hnNr-F.d.ts → layer-B2A3Ki48.d.ts} +2 -16
- package/dist/layout/index.d.cts +2 -1
- package/dist/layout/index.d.ts +2 -1
- package/dist/mindmap-C3Qr0qKW.d.cts +182 -0
- package/dist/mindmap-DHeVa86G.d.ts +182 -0
- package/dist/parser/index.cjs +745 -179
- package/dist/parser/index.cjs.map +1 -1
- package/dist/parser/index.d.cts +23 -8
- package/dist/parser/index.d.ts +23 -8
- package/dist/parser/index.js +7 -2
- package/dist/performance/index.cjs +13 -0
- package/dist/performance/index.cjs.map +1 -1
- package/dist/performance/index.js +2 -2
- package/dist/theme/index.cjs +884 -0
- package/dist/theme/index.cjs.map +1 -0
- package/dist/theme/index.d.cts +2 -0
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/index.js +53 -0
- package/dist/types/index.d.cts +4 -2
- package/dist/types/index.d.ts +4 -2
- package/dist/viewport/index.cjs +17 -6
- package/dist/viewport/index.cjs.map +1 -1
- package/dist/viewport/index.d.cts +6 -4
- package/dist/viewport/index.d.ts +6 -4
- package/dist/viewport/index.js +2 -2
- package/licenses/visualli-design-system/LICENSE +9 -0
- package/licenses/visualli-design-system/NOTICE.md +6 -0
- package/package.json +12 -4
- package/src/config/README.md +2 -4
- package/src/config/USAGE_EXAMPLES.md +0 -4
- package/src/config/index.ts +3 -4
- package/src/constants/index.ts +1 -1
- package/src/constants/layout.ts +11 -0
- package/src/constants/performanceConstants.ts +8 -27
- package/src/generated/README.md +12 -0
- package/src/generated/designSystem.ts +758 -0
- package/src/generated/geometry/blob.ts +99 -0
- package/src/generated/geometry/blobShapes.ts +4 -0
- package/src/generated/geometry/color.ts +37 -0
- package/src/generated/geometry/container.ts +84 -0
- package/src/generated/geometry/detail.ts +22 -0
- package/src/generated/geometry/idea.ts +56 -0
- package/src/generated/geometry/interaction.ts +122 -0
- package/src/generated/geometry/motion.ts +140 -0
- package/src/index.ts +18 -1
- package/src/parser/configUtils.ts +12 -19
- package/src/parser/visualliConverter.ts +71 -112
- package/src/parser/visualliParser.ts +16 -1
- package/src/rendering/culling.ts +16 -12
- package/src/rendering/ideaSize.ts +21 -0
- package/src/rendering/nodeGeometry.ts +97 -0
- package/src/theme/index.ts +136 -0
- package/src/types/document.ts +9 -0
- package/src/types/layer.ts +1 -1
- package/src/types/mindmap.ts +13 -0
- package/src/utils/navigation.ts +33 -63
- package/src/viewport/viewportUtils.ts +6 -4
- package/dist/animations/index.cjs +0 -146
- package/dist/animations/index.cjs.map +0 -1
- package/dist/animations/index.d.cts +0 -81
- package/dist/animations/index.d.ts +0 -81
- package/dist/animations/index.js +0 -35
- package/dist/chunk-6NXADJK2.js.map +0 -1
- package/dist/chunk-F36SMC3K.js +0 -106
- package/dist/chunk-F36SMC3K.js.map +0 -1
- package/dist/chunk-G5H3P4YZ.js +0 -273
- package/dist/chunk-G5H3P4YZ.js.map +0 -1
- package/dist/chunk-LDJRGT2Q.js +0 -163
- package/dist/chunk-LDJRGT2Q.js.map +0 -1
- package/dist/chunk-LJYSKSCE.js.map +0 -1
- package/dist/chunk-LNTJTDB2.js +0 -349
- package/dist/chunk-LNTJTDB2.js.map +0 -1
- package/dist/mindmap-DWS0WZT_.d.cts +0 -118
- package/dist/mindmap-DWS0WZT_.d.ts +0 -118
- package/src/animations/constants.ts +0 -72
- package/src/animations/easing.ts +0 -70
- package/src/animations/index.ts +0 -2
- package/src/config/blobShapes.ts +0 -146
- package/src/config/textScaling.ts +0 -54
- package/src/constants/design.ts +0 -281
- /package/dist/{chunk-PDP5CVUL.js.map → chunk-LOQLNYB3.js.map} +0 -0
- /package/dist/{chunk-I75TMOE4.js.map → chunk-P6PKWVYF.js.map} +0 -0
- /package/dist/{animations → theme}/index.js.map +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/generated/designSystem.ts"],"sourcesContent":["// GENERATED by scripts/gen-design-system.mjs from design-system/ (tokens/tokens.json, tokens/tokens.css). Do not edit.\n// Change the design system instead; the next `npm run build` regenerates this file.\n\n/** Version of the design system these modules were generated from. */\nexport const DESIGN_SYSTEM_VERSION = \"0.2.0\" as const;\n\nexport const THEME_NAMES = [\n \"light\",\n \"dark\",\n \"focus-light\",\n \"focus-dark\",\n \"colorsafe-light\",\n \"colorsafe-dark\",\n \"contrast-light\",\n \"contrast-dark\"\n] as const;\nexport type ThemeName = (typeof THEME_NAMES)[number];\n\n/** Every token for every theme (each theme already merged over \"light\"). Keys match the CSS custom properties. */\nexport const TOKENS: Readonly<Record<ThemeName, Readonly<Record<string, string>>>> = {\n \"light\": {\n \"font-display\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, sans-serif\",\n \"font-ui\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, -apple-system, \\\"Segoe UI\\\", sans-serif\",\n \"font-hand\": \"Kalam, \\\"Atkinson Hyperlegible Next\\\", cursive\",\n \"font-note\": \"Caveat, Kalam, cursive\",\n \"font-mono\": \"\\\"Atkinson Hyperlegible Mono\\\", ui-monospace, \\\"SF Mono\\\", Menlo, monospace\",\n \"canvas\": \"#f6f3ee\",\n \"surface\": \"#ffffff\",\n \"surface-sunken\": \"#f0ece5\",\n \"surface-overlay\": \"#ffffff\",\n \"line\": \"#e4dfd6\",\n \"line-strong\": \"#7a7f94\",\n \"ink\": \"#182140\",\n \"ink-muted\": \"#4f5671\",\n \"ink-subtle\": \"#5f647c\",\n \"action\": \"#182140\",\n \"on-action\": \"#ffffff\",\n \"focus\": \"#325e8c\",\n \"link\": \"#2f5a87\",\n \"selection\": \"rgba(18, 199, 211, 0.28)\",\n \"node-ink\": \"#182140\",\n \"edge\": \"#2a3048\",\n \"edge-label\": \"#4f5671\",\n \"topic-teal\": \"#87f2f8\",\n \"topic-teal-ring\": \"#00cdd5\",\n \"topic-harbor\": \"#bcdbff\",\n \"topic-harbor-ring\": \"#76b2f5\",\n \"topic-iris\": \"#e0c8fe\",\n \"topic-iris-ring\": \"#bd96ea\",\n \"topic-berry\": \"#ffbdc4\",\n \"topic-berry-ring\": \"#f47e8f\",\n \"topic-coral\": \"#ffc7b2\",\n \"topic-coral-ring\": \"#f38e65\",\n \"topic-amber\": \"#ffcf9d\",\n \"topic-amber-ring\": \"#eb9c38\",\n \"topic-sun\": \"#ffea94\",\n \"topic-sun-ring\": \"#dfbd04\",\n \"topic-stone\": \"#e0dacf\",\n \"topic-stone-ring\": \"#bab09f\",\n \"space-1\": \"4px\",\n \"space-2\": \"8px\",\n \"space-3\": \"12px\",\n \"space-4\": \"16px\",\n \"space-7\": \"48px\",\n \"radius-sm\": \"10px\",\n \"radius-md\": \"16px\",\n \"radius-lg\": \"24px\",\n \"radius-pill\": \"999px\",\n \"shadow-float\": \"0 1px 2px rgba(24, 33, 64, 0.06), 0 8px 24px rgba(24, 33, 64, 0.08)\",\n \"shadow-pop\": \"0 2px 4px rgba(24, 33, 64, 0.08), 0 16px 40px rgba(24, 33, 64, 0.14)\",\n \"node-width\": \"200px\",\n \"node-height\": \"148px\",\n \"node-stroke\": \"3px\",\n \"edge-width\": \"2.5px\",\n \"edge-gap\": \"15px\",\n \"edge-arc-max\": \"45px\",\n \"immersion-alpha\": \"0.15\",\n \"zoom-min\": \"0.3\",\n \"zoom-max\": \"5\",\n \"duration-instant\": \"100ms\",\n \"duration-quick\": \"160ms\",\n \"duration-base\": \"240ms\",\n \"duration-zoom\": \"500ms\",\n \"duration-reveal\": \"420ms\",\n \"stagger-reveal\": \"70ms\",\n \"ease-zoom\": \"cubic-bezier(0.2, 0.8, 0.2, 1)\",\n \"ease-standard\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"ease-bloom\": \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n \"z-chrome\": \"10\",\n \"z-card\": \"20\",\n \"z-menu\": \"40\"\n },\n \"dark\": {\n \"font-display\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, sans-serif\",\n \"font-ui\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, -apple-system, \\\"Segoe UI\\\", sans-serif\",\n \"font-hand\": \"Kalam, \\\"Atkinson Hyperlegible Next\\\", cursive\",\n \"font-note\": \"Caveat, Kalam, cursive\",\n \"font-mono\": \"\\\"Atkinson Hyperlegible Mono\\\", ui-monospace, \\\"SF Mono\\\", Menlo, monospace\",\n \"canvas\": \"#0f1220\",\n \"surface\": \"#171b2b\",\n \"surface-sunken\": \"#0f1220\",\n \"surface-overlay\": \"#212639\",\n \"line\": \"#2b3148\",\n \"line-strong\": \"#6c7392\",\n \"ink\": \"#eef0f7\",\n \"ink-muted\": \"#b3b8cc\",\n \"ink-subtle\": \"#8f95ae\",\n \"action\": \"#f6f3ee\",\n \"on-action\": \"#182140\",\n \"focus\": \"#12c7d3\",\n \"link\": \"#5fd8e1\",\n \"selection\": \"rgba(18, 199, 211, 0.32)\",\n \"node-ink\": \"#182140\",\n \"edge\": \"#c9cddc\",\n \"edge-label\": \"#b3b8cc\",\n \"topic-teal\": \"#87f2f8\",\n \"topic-teal-ring\": \"#0fc5cd\",\n \"topic-harbor\": \"#bcdbff\",\n \"topic-harbor-ring\": \"#73aceb\",\n \"topic-iris\": \"#e0c8fe\",\n \"topic-iris-ring\": \"#b691e1\",\n \"topic-berry\": \"#ffbdc4\",\n \"topic-berry-ring\": \"#eb798a\",\n \"topic-coral\": \"#ffc7b2\",\n \"topic-coral-ring\": \"#ea8962\",\n \"topic-amber\": \"#ffcf9d\",\n \"topic-amber-ring\": \"#e29737\",\n \"topic-sun\": \"#ffea94\",\n \"topic-sun-ring\": \"#d8b70a\",\n \"topic-stone\": \"#e0dacf\",\n \"topic-stone-ring\": \"#b4a999\",\n \"space-1\": \"4px\",\n \"space-2\": \"8px\",\n \"space-3\": \"12px\",\n \"space-4\": \"16px\",\n \"space-7\": \"48px\",\n \"radius-sm\": \"10px\",\n \"radius-md\": \"16px\",\n \"radius-lg\": \"24px\",\n \"radius-pill\": \"999px\",\n \"shadow-float\": \"0 1px 2px rgba(0, 0, 0, 0.40), 0 8px 24px rgba(0, 0, 0, 0.35)\",\n \"shadow-pop\": \"0 2px 4px rgba(0, 0, 0, 0.50), 0 16px 40px rgba(0, 0, 0, 0.50)\",\n \"node-width\": \"200px\",\n \"node-height\": \"148px\",\n \"node-stroke\": \"3px\",\n \"edge-width\": \"2.5px\",\n \"edge-gap\": \"15px\",\n \"edge-arc-max\": \"45px\",\n \"immersion-alpha\": \"0.15\",\n \"zoom-min\": \"0.3\",\n \"zoom-max\": \"5\",\n \"duration-instant\": \"100ms\",\n \"duration-quick\": \"160ms\",\n \"duration-base\": \"240ms\",\n \"duration-zoom\": \"500ms\",\n \"duration-reveal\": \"420ms\",\n \"stagger-reveal\": \"70ms\",\n \"ease-zoom\": \"cubic-bezier(0.2, 0.8, 0.2, 1)\",\n \"ease-standard\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"ease-bloom\": \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n \"z-chrome\": \"10\",\n \"z-card\": \"20\",\n \"z-menu\": \"40\"\n },\n \"focus-light\": {\n \"font-display\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, sans-serif\",\n \"font-ui\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, -apple-system, \\\"Segoe UI\\\", sans-serif\",\n \"font-hand\": \"Kalam, \\\"Atkinson Hyperlegible Next\\\", cursive\",\n \"font-note\": \"Caveat, Kalam, cursive\",\n \"font-mono\": \"\\\"Atkinson Hyperlegible Mono\\\", ui-monospace, \\\"SF Mono\\\", Menlo, monospace\",\n \"canvas\": \"#f4f2ee\",\n \"surface\": \"#ffffff\",\n \"surface-sunken\": \"#f0ece5\",\n \"surface-overlay\": \"#ffffff\",\n \"line\": \"#e4dfd6\",\n \"line-strong\": \"#7a7f94\",\n \"ink\": \"#182140\",\n \"ink-muted\": \"#4f5671\",\n \"ink-subtle\": \"#5f647c\",\n \"action\": \"#182140\",\n \"on-action\": \"#ffffff\",\n \"focus\": \"#325e8c\",\n \"link\": \"#2f5a87\",\n \"selection\": \"rgba(18, 199, 211, 0.28)\",\n \"node-ink\": \"#182140\",\n \"edge\": \"#5a6079\",\n \"edge-label\": \"#5a6079\",\n \"topic-teal\": \"#bce8ea\",\n \"topic-teal-ring\": \"#67c6cb\",\n \"topic-harbor\": \"#c9d9ec\",\n \"topic-harbor-ring\": \"#8bb2de\",\n \"topic-iris\": \"#d9cfe8\",\n \"topic-iris-ring\": \"#b79ed4\",\n \"topic-berry\": \"#edc6c9\",\n \"topic-berry-ring\": \"#da9099\",\n \"topic-coral\": \"#eecec1\",\n \"topic-coral-ring\": \"#db9b82\",\n \"topic-amber\": \"#eed4ba\",\n \"topic-amber-ring\": \"#d6a570\",\n \"topic-sun\": \"#f4eac1\",\n \"topic-sun-ring\": \"#d2bf73\",\n \"topic-stone\": \"#dddad5\",\n \"topic-stone-ring\": \"#bab09f\",\n \"space-1\": \"4px\",\n \"space-2\": \"8px\",\n \"space-3\": \"12px\",\n \"space-4\": \"16px\",\n \"space-7\": \"48px\",\n \"radius-sm\": \"10px\",\n \"radius-md\": \"16px\",\n \"radius-lg\": \"24px\",\n \"radius-pill\": \"999px\",\n \"shadow-float\": \"0 1px 2px rgba(24, 33, 64, 0.06), 0 8px 24px rgba(24, 33, 64, 0.08)\",\n \"shadow-pop\": \"0 2px 4px rgba(24, 33, 64, 0.08), 0 16px 40px rgba(24, 33, 64, 0.14)\",\n \"node-width\": \"200px\",\n \"node-height\": \"148px\",\n \"node-stroke\": \"3px\",\n \"edge-width\": \"2.5px\",\n \"edge-gap\": \"15px\",\n \"edge-arc-max\": \"45px\",\n \"immersion-alpha\": \"0.15\",\n \"zoom-min\": \"0.3\",\n \"zoom-max\": \"5\",\n \"duration-instant\": \"100ms\",\n \"duration-quick\": \"160ms\",\n \"duration-base\": \"240ms\",\n \"duration-zoom\": \"500ms\",\n \"duration-reveal\": \"420ms\",\n \"stagger-reveal\": \"70ms\",\n \"ease-zoom\": \"cubic-bezier(0.2, 0.8, 0.2, 1)\",\n \"ease-standard\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"ease-bloom\": \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n \"z-chrome\": \"10\",\n \"z-card\": \"20\",\n \"z-menu\": \"40\"\n },\n \"focus-dark\": {\n \"font-display\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, sans-serif\",\n \"font-ui\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, -apple-system, \\\"Segoe UI\\\", sans-serif\",\n \"font-hand\": \"Kalam, \\\"Atkinson Hyperlegible Next\\\", cursive\",\n \"font-note\": \"Caveat, Kalam, cursive\",\n \"font-mono\": \"\\\"Atkinson Hyperlegible Mono\\\", ui-monospace, \\\"SF Mono\\\", Menlo, monospace\",\n \"canvas\": \"#12141c\",\n \"surface\": \"#171b2b\",\n \"surface-sunken\": \"#0f1220\",\n \"surface-overlay\": \"#212639\",\n \"line\": \"#2b3148\",\n \"line-strong\": \"#6c7392\",\n \"ink\": \"#eef0f7\",\n \"ink-muted\": \"#b3b8cc\",\n \"ink-subtle\": \"#8f95ae\",\n \"action\": \"#f6f3ee\",\n \"on-action\": \"#182140\",\n \"focus\": \"#12c7d3\",\n \"link\": \"#5fd8e1\",\n \"selection\": \"rgba(18, 199, 211, 0.32)\",\n \"node-ink\": \"#182140\",\n \"edge\": \"#a9aec0\",\n \"edge-label\": \"#b3b8cc\",\n \"topic-teal\": \"#bce8ea\",\n \"topic-teal-ring\": \"#71bdc1\",\n \"topic-harbor\": \"#c9d9ec\",\n \"topic-harbor-ring\": \"#8cabce\",\n \"topic-iris\": \"#d9cfe8\",\n \"topic-iris-ring\": \"#ae9bc6\",\n \"topic-berry\": \"#edc6c9\",\n \"topic-berry-ring\": \"#cc8e95\",\n \"topic-coral\": \"#eecec1\",\n \"topic-coral-ring\": \"#cd9884\",\n \"topic-amber\": \"#eed4ba\",\n \"topic-amber-ring\": \"#c9a176\",\n \"topic-sun\": \"#f4eac1\",\n \"topic-sun-ring\": \"#c9b97a\",\n \"topic-stone\": \"#dddad5\",\n \"topic-stone-ring\": \"#b4a999\",\n \"space-1\": \"4px\",\n \"space-2\": \"8px\",\n \"space-3\": \"12px\",\n \"space-4\": \"16px\",\n \"space-7\": \"48px\",\n \"radius-sm\": \"10px\",\n \"radius-md\": \"16px\",\n \"radius-lg\": \"24px\",\n \"radius-pill\": \"999px\",\n \"shadow-float\": \"0 1px 2px rgba(24, 33, 64, 0.06), 0 8px 24px rgba(24, 33, 64, 0.08)\",\n \"shadow-pop\": \"0 2px 4px rgba(24, 33, 64, 0.08), 0 16px 40px rgba(24, 33, 64, 0.14)\",\n \"node-width\": \"200px\",\n \"node-height\": \"148px\",\n \"node-stroke\": \"3px\",\n \"edge-width\": \"2.5px\",\n \"edge-gap\": \"15px\",\n \"edge-arc-max\": \"45px\",\n \"immersion-alpha\": \"0.15\",\n \"zoom-min\": \"0.3\",\n \"zoom-max\": \"5\",\n \"duration-instant\": \"100ms\",\n \"duration-quick\": \"160ms\",\n \"duration-base\": \"240ms\",\n \"duration-zoom\": \"500ms\",\n \"duration-reveal\": \"420ms\",\n \"stagger-reveal\": \"70ms\",\n \"ease-zoom\": \"cubic-bezier(0.2, 0.8, 0.2, 1)\",\n \"ease-standard\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"ease-bloom\": \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n \"z-chrome\": \"10\",\n \"z-card\": \"20\",\n \"z-menu\": \"40\"\n },\n \"colorsafe-light\": {\n \"font-display\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, sans-serif\",\n \"font-ui\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, -apple-system, \\\"Segoe UI\\\", sans-serif\",\n \"font-hand\": \"Kalam, \\\"Atkinson Hyperlegible Next\\\", cursive\",\n \"font-note\": \"Caveat, Kalam, cursive\",\n \"font-mono\": \"\\\"Atkinson Hyperlegible Mono\\\", ui-monospace, \\\"SF Mono\\\", Menlo, monospace\",\n \"canvas\": \"#f6f3ee\",\n \"surface\": \"#ffffff\",\n \"surface-sunken\": \"#f0ece5\",\n \"surface-overlay\": \"#ffffff\",\n \"line\": \"#e4dfd6\",\n \"line-strong\": \"#7a7f94\",\n \"ink\": \"#182140\",\n \"ink-muted\": \"#4f5671\",\n \"ink-subtle\": \"#5f647c\",\n \"action\": \"#182140\",\n \"on-action\": \"#ffffff\",\n \"focus\": \"#325e8c\",\n \"link\": \"#2f5a87\",\n \"selection\": \"rgba(18, 199, 211, 0.28)\",\n \"node-ink\": \"#182140\",\n \"edge\": \"#2a3048\",\n \"edge-label\": \"#4f5671\",\n \"topic-teal\": \"#b0ecbc\",\n \"topic-teal-ring\": \"#6cc982\",\n \"topic-harbor\": \"#abdbfe\",\n \"topic-harbor-ring\": \"#60b4ec\",\n \"topic-iris\": \"#f6bde2\",\n \"topic-iris-ring\": \"#dc87c0\",\n \"topic-berry\": \"#feb79e\",\n \"topic-berry-ring\": \"#ec7f58\",\n \"topic-coral\": \"#fece96\",\n \"topic-coral-ring\": \"#e49d41\",\n \"topic-amber\": \"#b2e8fa\",\n \"topic-amber-ring\": \"#5cc4e2\",\n \"topic-sun\": \"#f6f097\",\n \"topic-sun-ring\": \"#d0c637\",\n \"topic-stone\": \"#dbdbdb\",\n \"topic-stone-ring\": \"#b7afb1\",\n \"space-1\": \"4px\",\n \"space-2\": \"8px\",\n \"space-3\": \"12px\",\n \"space-4\": \"16px\",\n \"space-7\": \"48px\",\n \"radius-sm\": \"10px\",\n \"radius-md\": \"16px\",\n \"radius-lg\": \"24px\",\n \"radius-pill\": \"999px\",\n \"shadow-float\": \"0 1px 2px rgba(24, 33, 64, 0.06), 0 8px 24px rgba(24, 33, 64, 0.08)\",\n \"shadow-pop\": \"0 2px 4px rgba(24, 33, 64, 0.08), 0 16px 40px rgba(24, 33, 64, 0.14)\",\n \"node-width\": \"200px\",\n \"node-height\": \"148px\",\n \"node-stroke\": \"3px\",\n \"edge-width\": \"2.5px\",\n \"edge-gap\": \"15px\",\n \"edge-arc-max\": \"45px\",\n \"immersion-alpha\": \"0.15\",\n \"zoom-min\": \"0.3\",\n \"zoom-max\": \"5\",\n \"duration-instant\": \"100ms\",\n \"duration-quick\": \"160ms\",\n \"duration-base\": \"240ms\",\n \"duration-zoom\": \"500ms\",\n \"duration-reveal\": \"420ms\",\n \"stagger-reveal\": \"70ms\",\n \"ease-zoom\": \"cubic-bezier(0.2, 0.8, 0.2, 1)\",\n \"ease-standard\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"ease-bloom\": \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n \"z-chrome\": \"10\",\n \"z-card\": \"20\",\n \"z-menu\": \"40\"\n },\n \"colorsafe-dark\": {\n \"font-display\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, sans-serif\",\n \"font-ui\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, -apple-system, \\\"Segoe UI\\\", sans-serif\",\n \"font-hand\": \"Kalam, \\\"Atkinson Hyperlegible Next\\\", cursive\",\n \"font-note\": \"Caveat, Kalam, cursive\",\n \"font-mono\": \"\\\"Atkinson Hyperlegible Mono\\\", ui-monospace, \\\"SF Mono\\\", Menlo, monospace\",\n \"canvas\": \"#0f1220\",\n \"surface\": \"#171b2b\",\n \"surface-sunken\": \"#0f1220\",\n \"surface-overlay\": \"#212639\",\n \"line\": \"#2b3148\",\n \"line-strong\": \"#6c7392\",\n \"ink\": \"#eef0f7\",\n \"ink-muted\": \"#b3b8cc\",\n \"ink-subtle\": \"#8f95ae\",\n \"action\": \"#f6f3ee\",\n \"on-action\": \"#182140\",\n \"focus\": \"#12c7d3\",\n \"link\": \"#5fd8e1\",\n \"selection\": \"rgba(18, 199, 211, 0.32)\",\n \"node-ink\": \"#182140\",\n \"edge\": \"#c9cddc\",\n \"edge-label\": \"#b3b8cc\",\n \"topic-teal\": \"#b0ecbc\",\n \"topic-teal-ring\": \"#69c27e\",\n \"topic-harbor\": \"#abdbfe\",\n \"topic-harbor-ring\": \"#5eade2\",\n \"topic-iris\": \"#f6bde2\",\n \"topic-iris-ring\": \"#d383b9\",\n \"topic-berry\": \"#feb79e\",\n \"topic-berry-ring\": \"#e37a55\",\n \"topic-coral\": \"#fece96\",\n \"topic-coral-ring\": \"#db9840\",\n \"topic-amber\": \"#b2e8fa\",\n \"topic-amber-ring\": \"#5bbdda\",\n \"topic-sun\": \"#f6f097\",\n \"topic-sun-ring\": \"#c9bf37\",\n \"topic-stone\": \"#dbdbdb\",\n \"topic-stone-ring\": \"#b1a8aa\",\n \"space-1\": \"4px\",\n \"space-2\": \"8px\",\n \"space-3\": \"12px\",\n \"space-4\": \"16px\",\n \"space-7\": \"48px\",\n \"radius-sm\": \"10px\",\n \"radius-md\": \"16px\",\n \"radius-lg\": \"24px\",\n \"radius-pill\": \"999px\",\n \"shadow-float\": \"0 1px 2px rgba(24, 33, 64, 0.06), 0 8px 24px rgba(24, 33, 64, 0.08)\",\n \"shadow-pop\": \"0 2px 4px rgba(24, 33, 64, 0.08), 0 16px 40px rgba(24, 33, 64, 0.14)\",\n \"node-width\": \"200px\",\n \"node-height\": \"148px\",\n \"node-stroke\": \"3px\",\n \"edge-width\": \"2.5px\",\n \"edge-gap\": \"15px\",\n \"edge-arc-max\": \"45px\",\n \"immersion-alpha\": \"0.15\",\n \"zoom-min\": \"0.3\",\n \"zoom-max\": \"5\",\n \"duration-instant\": \"100ms\",\n \"duration-quick\": \"160ms\",\n \"duration-base\": \"240ms\",\n \"duration-zoom\": \"500ms\",\n \"duration-reveal\": \"420ms\",\n \"stagger-reveal\": \"70ms\",\n \"ease-zoom\": \"cubic-bezier(0.2, 0.8, 0.2, 1)\",\n \"ease-standard\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"ease-bloom\": \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n \"z-chrome\": \"10\",\n \"z-card\": \"20\",\n \"z-menu\": \"40\"\n },\n \"contrast-light\": {\n \"font-display\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, sans-serif\",\n \"font-ui\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, -apple-system, \\\"Segoe UI\\\", sans-serif\",\n \"font-hand\": \"Kalam, \\\"Atkinson Hyperlegible Next\\\", cursive\",\n \"font-note\": \"Caveat, Kalam, cursive\",\n \"font-mono\": \"\\\"Atkinson Hyperlegible Mono\\\", ui-monospace, \\\"SF Mono\\\", Menlo, monospace\",\n \"canvas\": \"#ffffff\",\n \"surface\": \"#ffffff\",\n \"surface-sunken\": \"#f2f2f2\",\n \"surface-overlay\": \"#ffffff\",\n \"line\": \"#5c6178\",\n \"line-strong\": \"#000000\",\n \"ink\": \"#000000\",\n \"ink-muted\": \"#1f2433\",\n \"ink-subtle\": \"#3a3f52\",\n \"action\": \"#000000\",\n \"on-action\": \"#ffffff\",\n \"focus\": \"#0b4a8f\",\n \"link\": \"#0b4a8f\",\n \"selection\": \"rgba(18, 199, 211, 0.28)\",\n \"node-ink\": \"#000000\",\n \"edge\": \"#000000\",\n \"edge-label\": \"#1f2433\",\n \"topic-teal\": \"#87f2f8\",\n \"topic-teal-ring\": \"#006b70\",\n \"topic-harbor\": \"#bcdbff\",\n \"topic-harbor-ring\": \"#0e599d\",\n \"topic-iris\": \"#e0c8fe\",\n \"topic-iris-ring\": \"#683b92\",\n \"topic-berry\": \"#ffbdc4\",\n \"topic-berry-ring\": \"#96173a\",\n \"topic-coral\": \"#ffc7b2\",\n \"topic-coral-ring\": \"#923400\",\n \"topic-amber\": \"#ffcf9d\",\n \"topic-amber-ring\": \"#7e4d00\",\n \"topic-sun\": \"#ffea94\",\n \"topic-sun-ring\": \"#7a6600\",\n \"topic-stone\": \"#e0dacf\",\n \"topic-stone-ring\": \"#63594b\",\n \"space-1\": \"4px\",\n \"space-2\": \"8px\",\n \"space-3\": \"12px\",\n \"space-4\": \"16px\",\n \"space-7\": \"48px\",\n \"radius-sm\": \"10px\",\n \"radius-md\": \"16px\",\n \"radius-lg\": \"24px\",\n \"radius-pill\": \"999px\",\n \"shadow-float\": \"none\",\n \"shadow-pop\": \"none\",\n \"node-width\": \"200px\",\n \"node-height\": \"148px\",\n \"node-stroke\": \"3px\",\n \"edge-width\": \"2.5px\",\n \"edge-gap\": \"15px\",\n \"edge-arc-max\": \"45px\",\n \"immersion-alpha\": \"0.15\",\n \"zoom-min\": \"0.3\",\n \"zoom-max\": \"5\",\n \"duration-instant\": \"100ms\",\n \"duration-quick\": \"160ms\",\n \"duration-base\": \"240ms\",\n \"duration-zoom\": \"500ms\",\n \"duration-reveal\": \"420ms\",\n \"stagger-reveal\": \"70ms\",\n \"ease-zoom\": \"cubic-bezier(0.2, 0.8, 0.2, 1)\",\n \"ease-standard\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"ease-bloom\": \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n \"z-chrome\": \"10\",\n \"z-card\": \"20\",\n \"z-menu\": \"40\"\n },\n \"contrast-dark\": {\n \"font-display\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, sans-serif\",\n \"font-ui\": \"\\\"Atkinson Hyperlegible Next\\\", system-ui, -apple-system, \\\"Segoe UI\\\", sans-serif\",\n \"font-hand\": \"Kalam, \\\"Atkinson Hyperlegible Next\\\", cursive\",\n \"font-note\": \"Caveat, Kalam, cursive\",\n \"font-mono\": \"\\\"Atkinson Hyperlegible Mono\\\", ui-monospace, \\\"SF Mono\\\", Menlo, monospace\",\n \"canvas\": \"#000000\",\n \"surface\": \"#000000\",\n \"surface-sunken\": \"#0d0d0d\",\n \"surface-overlay\": \"#0d0d0d\",\n \"line\": \"#9aa0b8\",\n \"line-strong\": \"#ffffff\",\n \"ink\": \"#ffffff\",\n \"ink-muted\": \"#e6e8f0\",\n \"ink-subtle\": \"#c8ccda\",\n \"action\": \"#ffffff\",\n \"on-action\": \"#000000\",\n \"focus\": \"#5fe8f0\",\n \"link\": \"#7ff0f5\",\n \"selection\": \"rgba(18, 199, 211, 0.32)\",\n \"node-ink\": \"#000000\",\n \"edge\": \"#ffffff\",\n \"edge-label\": \"#e6e8f0\",\n \"topic-teal\": \"#87f2f8\",\n \"topic-teal-ring\": \"#64eff7\",\n \"topic-harbor\": \"#bcdbff\",\n \"topic-harbor-ring\": \"#b0d5fe\",\n \"topic-iris\": \"#e0c8fe\",\n \"topic-iris-ring\": \"#dcbfff\",\n \"topic-berry\": \"#ffbdc4\",\n \"topic-berry-ring\": \"#feb3bb\",\n \"topic-coral\": \"#ffc7b2\",\n \"topic-coral-ring\": \"#ffbea5\",\n \"topic-amber\": \"#ffcf9d\",\n \"topic-amber-ring\": \"#ffc78a\",\n \"topic-sun\": \"#ffea94\",\n \"topic-sun-ring\": \"#ffe26d\",\n \"topic-stone\": \"#e0dacf\",\n \"topic-stone-ring\": \"#ddd3c2\",\n \"space-1\": \"4px\",\n \"space-2\": \"8px\",\n \"space-3\": \"12px\",\n \"space-4\": \"16px\",\n \"space-7\": \"48px\",\n \"radius-sm\": \"10px\",\n \"radius-md\": \"16px\",\n \"radius-lg\": \"24px\",\n \"radius-pill\": \"999px\",\n \"shadow-float\": \"none\",\n \"shadow-pop\": \"none\",\n \"node-width\": \"200px\",\n \"node-height\": \"148px\",\n \"node-stroke\": \"3px\",\n \"edge-width\": \"2.5px\",\n \"edge-gap\": \"15px\",\n \"edge-arc-max\": \"45px\",\n \"immersion-alpha\": \"0.15\",\n \"zoom-min\": \"0.3\",\n \"zoom-max\": \"5\",\n \"duration-instant\": \"100ms\",\n \"duration-quick\": \"160ms\",\n \"duration-base\": \"240ms\",\n \"duration-zoom\": \"500ms\",\n \"duration-reveal\": \"420ms\",\n \"stagger-reveal\": \"70ms\",\n \"ease-zoom\": \"cubic-bezier(0.2, 0.8, 0.2, 1)\",\n \"ease-standard\": \"cubic-bezier(0.4, 0, 0.2, 1)\",\n \"ease-bloom\": \"cubic-bezier(0.34, 1.4, 0.64, 1)\",\n \"z-chrome\": \"10\",\n \"z-card\": \"20\",\n \"z-menu\": \"40\"\n }\n};\n\n/** Topic palette names (token pairs `topic-<name>` / `topic-<name>-ring`). */\nexport const TOPICS = [\n \"teal\",\n \"harbor\",\n \"iris\",\n \"berry\",\n \"coral\",\n \"amber\",\n \"sun\",\n \"stone\"\n] as const;\nexport type TopicName = (typeof TOPICS)[number];\n\n/** Numeric tokens (px / ms stripped), camel-cased: nodeWidth, nodeStroke, edgeWidth, edgeGap, durationBase, zoomMin ... */\nexport const METRICS = {\n \"space1\": 4,\n \"space2\": 8,\n \"space3\": 12,\n \"space4\": 16,\n \"space7\": 48,\n \"radiusSm\": 10,\n \"radiusMd\": 16,\n \"radiusLg\": 24,\n \"radiusPill\": 999,\n \"nodeWidth\": 200,\n \"nodeHeight\": 148,\n \"nodeStroke\": 3,\n \"edgeWidth\": 2.5,\n \"edgeGap\": 15,\n \"edgeArcMax\": 45,\n \"immersionAlpha\": 0.15,\n \"zoomMin\": 0.3,\n \"zoomMax\": 5,\n \"durationInstant\": 100,\n \"durationQuick\": 160,\n \"durationBase\": 240,\n \"durationZoom\": 500,\n \"durationReveal\": 420,\n \"staggerReveal\": 70,\n \"zChrome\": 10,\n \"zCard\": 20,\n \"zMenu\": 40\n} as const;\n/** Overrides applied when motion is reduced. */\nexport const METRICS_REDUCED_MOTION = {\n \"durationInstant\": 120,\n \"durationQuick\": 0,\n \"durationBase\": 0,\n \"durationZoom\": 0,\n \"durationReveal\": 0,\n \"staggerReveal\": 0\n} as const;\n\n/** Canvas type styles (family is a token name: font-hand, font-note, font-ui ...). */\nexport const TYPE_STYLES = {\n \"heading\": {\n \"family\": \"font-ui\",\n \"size\": 17,\n \"lineHeight\": 24,\n \"weight\": 700\n },\n \"body\": {\n \"family\": \"font-ui\",\n \"size\": 15,\n \"lineHeight\": 22,\n \"weight\": 400\n },\n \"body-sm\": {\n \"family\": \"font-ui\",\n \"size\": 13,\n \"lineHeight\": 18,\n \"weight\": 400\n },\n \"label\": {\n \"family\": \"font-ui\",\n \"size\": 13,\n \"lineHeight\": 16,\n \"weight\": 600,\n \"letterSpacing\": 0.01\n },\n \"caption\": {\n \"family\": \"font-ui\",\n \"size\": 12,\n \"lineHeight\": 16,\n \"weight\": 400\n },\n \"node-root\": {\n \"family\": \"font-hand\",\n \"size\": 30,\n \"lineHeight\": 34,\n \"weight\": 700\n },\n \"node-label\": {\n \"family\": \"font-hand\",\n \"size\": 22,\n \"lineHeight\": 26,\n \"weight\": 700\n },\n \"edge-label\": {\n \"family\": \"font-note\",\n \"size\": 18,\n \"lineHeight\": 20,\n \"weight\": 500\n },\n \"annotation\": {\n \"family\": \"font-note\",\n \"size\": 24,\n \"lineHeight\": 26,\n \"weight\": 600\n }\n} as const;\n\n/** Canvas styling extracted from css/spec.css (node labels, hover, shadows, connector dashes, group frames). */\nexport const CANVAS_STYLE = {\n \"node\": {\n \"selectedStrokeWidth\": 4,\n \"hoverRingsRotate\": -2,\n \"hoverRingsScale\": 1.015,\n \"hoverLift\": -2,\n \"dimmedOpacity\": 1,\n \"dimmedOpacityFocus\": 0.4,\n \"dimmedOpacityTouch\": 0.6,\n \"dimmedOpacityFocusTouch\": 0.4,\n \"shadowLight\": \"0 6px 14px rgba(24, 33, 64, .10)\",\n \"shadowDark\": \"0 0 22px rgba(255, 255, 255, .10)\"\n },\n \"edge\": {\n \"dash\": [\n 7,\n 7\n ],\n \"labelWeight\": 500,\n \"labelSize\": 18,\n \"readableLabelSize\": 14,\n \"readableLabelWeight\": 600,\n \"labelHaloWidth\": 5\n },\n \"group\": {\n \"strokeWidth\": 1.5,\n \"dash\": [\n 10,\n 6\n ],\n \"labelWeight\": 700,\n \"labelLineHeight\": 1.1,\n \"labelSize\": 26,\n \"labelPadding\": {\n \"top\": 6,\n \"x\": 22,\n \"bottom\": 8\n },\n \"labelMaxWidth\": 420,\n \"labelBorderWidth\": 1.5,\n \"labelFill\": \"topic-stone\",\n \"labelBorder\": \"topic-stone-ring\",\n \"labelInk\": \"node-ink\",\n \"contrastLabelBorderWidth\": 2,\n \"contrastLabelBorder\": \"line-strong\"\n }\n} as const;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants/layout.ts"],"sourcesContent":["// ─── Layout constants ────────────────────────────────────────────────────────\n//\n// Non-visual layout metrics (world units). Everything visual (colours, fonts,\n// radii, spacing, motion) comes from the design system: see ../theme.\n\nexport const LAYOUT_SPACING = {\n nodeSpacing: 200,\n levelSpacing: 150,\n containerPadding: 20,\n gridSize: 50,\n} as const;\n"],"mappings":";AAKO,IAAM,iBAAiB;AAAA,EAC5B,aAAkB;AAAA,EAClB,cAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,UAAkB;AACpB;","names":[]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
QUALITY_HIGH,
|
|
5
5
|
QUALITY_LOW,
|
|
6
6
|
QUALITY_MEDIUM
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-UAMEJG2C.js";
|
|
8
8
|
|
|
9
9
|
// src/constants/renderConfig.ts
|
|
10
10
|
var DEFAULT_RENDER_CONFIG = {
|
|
@@ -105,4 +105,4 @@ export {
|
|
|
105
105
|
isFeatureEnabled,
|
|
106
106
|
getRecommendedRenderConfig
|
|
107
107
|
};
|
|
108
|
-
//# sourceMappingURL=chunk-
|
|
108
|
+
//# sourceMappingURL=chunk-P6PKWVYF.js.map
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import {
|
|
2
|
+
METRICS
|
|
3
|
+
} from "./chunk-LV3EXUQY.js";
|
|
4
|
+
|
|
5
|
+
// src/generated/geometry/blobShapes.ts
|
|
6
|
+
var BLOB_SHAPES = [[[1.12, 0], [0.86, 0.56], [0.46, 0.94], [-0.08, 1.06], [-0.68, 0.82], [-0.96, 0.08], [-0.55, -0.82], [0.04, -1.02], [0.72, -0.8], [1.08, -0.38]], [[-0.489, -0.625], [-0.384, -0.716], [-0.285, -0.792], [-0.189, -0.855], [-0.09, -0.903], [0.014, -0.932], [0.129, -0.94], [0.255, -0.924], [0.412, -0.876], [0.516, -0.832], [0.612, -0.78], [0.695, -0.725], [0.767, -0.666], [0.83, -0.606], [0.885, -0.546], [0.933, -0.486], [0.979, -0.425], [1.006, -0.385], [1.034, -0.334], [1.058, -0.276], [1.078, -0.209], [1.092, -0.133], [1.101, -0.046], [1.102, 0.052], [1.094, 0.173], [1.083, 0.244], [1.063, 0.324], [1.034, 0.401], [0.996, 0.477], [0.948, 0.549], [0.889, 0.617], [0.82, 0.681], [0.735, 0.741], [0.658, 0.783], [0.569, 0.822], [0.474, 0.855], [0.372, 0.882], [0.265, 0.904], [0.156, 0.92], [0.046, 0.931], [-0.069, 0.938], [-0.155, 0.935], [-0.25, 0.919], [-0.346, 0.89], [-0.443, 0.851], [-0.539, 0.8], [-0.633, 0.738], [-0.723, 0.667], [-0.808, 0.585], [-0.882, 0.501], [-0.944, 0.421], [-0.994, 0.343], [-1.034, 0.267], [-1.064, 0.192], [-1.085, 0.12], [-1.097, 0.042], [-1.102, 1e-3], [-1.09, -0.243], [-1.05, -0.365], [-0.99, -0.441], [-0.911, -0.479], [-0.819, -0.499], [-0.715, -0.517], [-0.605, -0.551]], [[3e-3, -0.97], [0.163, -0.984], [0.286, -1.028], [0.389, -1.096], [0.488, -1.174], [0.597, -1.21], [0.728, -1.165], [0.867, -1.036], [0.996, -0.839], [1.098, -0.59], [1.158, -0.304], [1.153, 0.012], [1.08, 0.336], [0.944, 0.639], [0.756, 0.889], [0.484, 1.072], [0.339, 1.079], [0.219, 1.051], [0.131, 0.994], [0.059, 0.939], [8e-3, 0.915], [-0.105, 0.931], [-0.176, 0.965], [-0.249, 1.005], [-0.345, 1.039], [-0.497, 1.055], [-0.672, 1.032], [-0.817, 0.952], [-0.945, 0.81], [-1.054, 0.6], [-1.16, 0.302], [-1.187, -0.011], [-1.165, -0.326], [-1.097, -0.599], [-0.991, -0.838], [-0.852, -0.912], [-0.695, -0.958], [-0.53, -0.988], [-0.357, -0.992], [-0.18, -0.983]], [[-0.734, -1.127], [-0.656, -1.146], [-0.567, -1.142], [-0.468, -1.115], [-0.358, -1.079], [-0.238, -1.034], [-0.107, -0.989], [0.035, -0.953], [0.188, -0.929], [0.325, -0.916], [0.484, -0.896], [0.65, -0.854], [0.811, -0.77], [0.955, -0.631], [1.068, -0.422], [1.138, -0.126], [1.152, 0.272], [1.121, 0.451], [1.046, 0.602], [0.928, 0.727], [0.767, 0.833], [0.565, 0.925], [0.323, 1.001], [0.042, 1.075], [-0.277, 1.142], [-0.368, 1.147], [-0.475, 1.136], [-0.589, 1.104], [-0.704, 1.05], [-0.815, 0.973], [-0.913, 0.871], [-0.993, 0.746], [-1.048, 0.593], [-1.109, 0.298], [-1.145, 0.018], [-1.154, -0.243], [-1.135, -0.482], [-1.085, -0.695], [-1.003, -0.874], [-0.886, -1.02]], [[-0.734, 1.127], [-0.656, 1.146], [-0.567, 1.142], [-0.468, 1.115], [-0.358, 1.079], [-0.238, 1.034], [-0.107, 0.989], [0.035, 0.953], [0.188, 0.929], [0.325, 0.916], [0.484, 0.896], [0.65, 0.854], [0.811, 0.77], [0.955, 0.631], [1.068, 0.422], [1.138, 0.126], [1.152, -0.272], [1.121, -0.451], [1.046, -0.602], [0.928, -0.727], [0.767, -0.833], [0.565, -0.925], [0.323, -1.001], [0.042, -1.075], [-0.277, -1.142], [-0.368, -1.147], [-0.475, -1.136], [-0.589, -1.104], [-0.704, -1.05], [-0.815, -0.973], [-0.913, -0.871], [-0.993, -0.746], [-1.048, -0.593], [-1.109, -0.298], [-1.145, -0.018], [-1.154, 0.243], [-1.135, 0.482], [-1.085, 0.695], [-1.003, 0.874], [-0.886, 1.02]], [[1e-3, -1.006], [0.134, -1.001], [0.262, -1.024], [0.382, -1.073], [0.498, -1.107], [0.614, -1.105], [0.733, -1.049], [0.85, -0.932], [0.953, -0.755], [1.03, -0.529], [1.067, -0.265], [1.054, 0.018], [0.986, 0.3], [0.868, 0.557], [0.715, 0.766], [0.55, 0.909], [0.396, 0.984], [0.262, 1.005], [0.148, 1.003], [0.037, 1.008], [-0.083, 1.04], [-0.22, 1.118], [-0.36, 1.192], [-0.5, 1.234], [-0.65, 1.175], [-0.81, 1.045], [-0.99, 0.855], [-1.14, 0.61], [-1.24, 0.33], [-1.27, 0.04], [-1.275, -0.25], [-1.225, -0.5], [-1.08, -0.72], [-0.89, -0.92], [-0.734, -1.053], [-0.614, -1.112], [-0.498, -1.127], [-0.381, -1.11], [-0.261, -1.095], [-0.133, -1.058], [1e-3, -1.01], [0.134, -1.001]]];
|
|
7
|
+
|
|
8
|
+
// src/generated/geometry/blob.ts
|
|
9
|
+
var SHAPE = { idea: 0, varyByLevel: false };
|
|
10
|
+
function shapeForLevel(level) {
|
|
11
|
+
if (!SHAPE.varyByLevel) return SHAPE.idea;
|
|
12
|
+
const n = BLOB_SHAPES.length;
|
|
13
|
+
let cur = SHAPE.idea;
|
|
14
|
+
for (let i = 1; i <= level; i++) {
|
|
15
|
+
const r = Math.floor(Math.abs(Math.sin((i + 1) * 12.9898) * 43758.5453));
|
|
16
|
+
cur = (cur + r % (n - 1) + 1) % n;
|
|
17
|
+
}
|
|
18
|
+
return cur;
|
|
19
|
+
}
|
|
20
|
+
function blobPath(shape, rx, ry, cx = 0, cy = 0) {
|
|
21
|
+
const pts = BLOB_SHAPES[(shape % BLOB_SHAPES.length + BLOB_SHAPES.length) % BLOB_SHAPES.length].map(([x, y]) => [cx + x * rx, cy + y * ry]);
|
|
22
|
+
const mid = (a, b) => [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];
|
|
23
|
+
const f = (n) => n.toFixed(2);
|
|
24
|
+
const start = mid(pts[pts.length - 1], pts[0]);
|
|
25
|
+
let d = `M${f(start[0])} ${f(start[1])}`;
|
|
26
|
+
for (let i = 0; i < pts.length; i++) {
|
|
27
|
+
const p = pts[i], m = mid(p, pts[(i + 1) % pts.length]);
|
|
28
|
+
d += `Q${f(p[0])} ${f(p[1])} ${f(m[0])} ${f(m[1])}`;
|
|
29
|
+
}
|
|
30
|
+
return d + "Z";
|
|
31
|
+
}
|
|
32
|
+
function drawBlob(ctx, shape, rx, ry, cx = 0, cy = 0) {
|
|
33
|
+
const pts = BLOB_SHAPES[(shape % BLOB_SHAPES.length + BLOB_SHAPES.length) % BLOB_SHAPES.length].map(([x, y]) => [cx + x * rx, cy + y * ry]);
|
|
34
|
+
const mid = (a, b) => [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];
|
|
35
|
+
const s = mid(pts[pts.length - 1], pts[0]);
|
|
36
|
+
ctx.beginPath();
|
|
37
|
+
ctx.moveTo(s[0], s[1]);
|
|
38
|
+
pts.forEach((p, i) => {
|
|
39
|
+
const m = mid(p, pts[(i + 1) % pts.length]);
|
|
40
|
+
ctx.quadraticCurveTo(p[0], p[1], m[0], m[1]);
|
|
41
|
+
});
|
|
42
|
+
ctx.closePath();
|
|
43
|
+
}
|
|
44
|
+
function blobRadius(shape, rx, ry, angle) {
|
|
45
|
+
const pts = BLOB_SHAPES[(shape % BLOB_SHAPES.length + BLOB_SHAPES.length) % BLOB_SHAPES.length].map(([x, y]) => [x * rx, y * ry]);
|
|
46
|
+
const mid = (a, b) => [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];
|
|
47
|
+
const poly = [];
|
|
48
|
+
for (let i = 0; i < pts.length; i++) {
|
|
49
|
+
const p0 = mid(pts[(i - 1 + pts.length) % pts.length], pts[i]), c = pts[i], p1 = mid(pts[i], pts[(i + 1) % pts.length]);
|
|
50
|
+
for (let k = 0; k < 8; k++) {
|
|
51
|
+
const t = k / 8, u = 1 - t;
|
|
52
|
+
poly.push([u * u * p0[0] + 2 * u * t * c[0] + t * t * p1[0], u * u * p0[1] + 2 * u * t * c[1] + t * t * p1[1]]);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const dx = Math.cos(angle), dy = Math.sin(angle);
|
|
56
|
+
let best = 0;
|
|
57
|
+
for (let i = 0; i < poly.length; i++) {
|
|
58
|
+
const [ax, ay] = poly[i], [bx, by] = poly[(i + 1) % poly.length], ex = bx - ax, ey = by - ay;
|
|
59
|
+
const den = dx * ey - dy * ex;
|
|
60
|
+
if (Math.abs(den) < 1e-9) continue;
|
|
61
|
+
const r = (ax * ey - ay * ex) / den, q = (ax * dy - ay * dx) / den;
|
|
62
|
+
if (r > 0 && q >= 0 && q <= 1) best = Math.max(best, r);
|
|
63
|
+
}
|
|
64
|
+
return best || Math.max(rx, ry);
|
|
65
|
+
}
|
|
66
|
+
var RINGS = [
|
|
67
|
+
{ scale: 1.1, opacity: 0.5, rotate: -5, width: 2, dash: "" },
|
|
68
|
+
{ scale: 1.2, opacity: 0.4, rotate: -10, width: 1, dash: "" },
|
|
69
|
+
{ scale: 1.3, opacity: 0.3, rotate: -15, width: 3, dash: "6 4" }
|
|
70
|
+
];
|
|
71
|
+
function edgePath(a, b, bow = 1) {
|
|
72
|
+
const dx = b.x - a.x, dy = b.y - a.y, d = Math.hypot(dx, dy) || 1;
|
|
73
|
+
const arc = Math.min(45, 45 / (1 + Math.max(0, (d - 200) / 400))) * bow;
|
|
74
|
+
const nx = -dy / d, ny = dx / d;
|
|
75
|
+
const mx = (a.x + b.x) / 2 + nx * arc, my = (a.y + b.y) / 2 + ny * arc;
|
|
76
|
+
const c1 = { x: a.x + (mx - a.x) * 0.66 + 0, y: a.y + (my - a.y) * 0.66 };
|
|
77
|
+
const c2 = { x: b.x + (mx - b.x) * 0.66, y: b.y + (my - b.y) * 0.66 };
|
|
78
|
+
const ang = Math.atan2(b.y - c2.y, b.x - c2.x);
|
|
79
|
+
return { d: `M${a.x.toFixed(1)} ${a.y.toFixed(1)}C${c1.x.toFixed(1)} ${c1.y.toFixed(1)} ${c2.x.toFixed(1)} ${c2.y.toFixed(1)} ${b.x.toFixed(1)} ${b.y.toFixed(1)}`, angle: ang, mid: { x: mx, y: my } };
|
|
80
|
+
}
|
|
81
|
+
function arrowPath(p, angle, len = 11) {
|
|
82
|
+
const s = Math.PI / 5.5;
|
|
83
|
+
const a1 = { x: p.x - len * Math.cos(angle - s), y: p.y - len * Math.sin(angle - s) };
|
|
84
|
+
const a2 = { x: p.x - len * Math.cos(angle + s), y: p.y - len * Math.sin(angle + s) };
|
|
85
|
+
return `M${a1.x.toFixed(1)} ${a1.y.toFixed(1)}L${p.x.toFixed(1)} ${p.y.toFixed(1)}L${a2.x.toFixed(1)} ${a2.y.toFixed(1)}`;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// src/rendering/nodeGeometry.ts
|
|
89
|
+
var MAX_RINGS = RINGS.length;
|
|
90
|
+
var DEG = Math.PI / 180;
|
|
91
|
+
function nodeRadii(n) {
|
|
92
|
+
return { rx: n.width / 2, ry: n.height / 2 };
|
|
93
|
+
}
|
|
94
|
+
var ringCount = (branchCount) => Math.max(0, Math.min(branchCount ?? 0, MAX_RINGS));
|
|
95
|
+
var ringsFor = (branchCount) => RINGS.slice(0, ringCount(branchCount));
|
|
96
|
+
var shapeCache = /* @__PURE__ */ new Map();
|
|
97
|
+
function shapeOfLevel(level) {
|
|
98
|
+
let s = shapeCache.get(level);
|
|
99
|
+
if (s === void 0) {
|
|
100
|
+
s = shapeForLevel(level);
|
|
101
|
+
shapeCache.set(level, s);
|
|
102
|
+
}
|
|
103
|
+
return s;
|
|
104
|
+
}
|
|
105
|
+
var BLOB_MAX_NORM = Math.max(...BLOB_SHAPES.flatMap((s) => s.map(([x, y]) => Math.hypot(x, y))));
|
|
106
|
+
var VISUAL_MARGIN = METRICS.nodeStroke * 2 + 24;
|
|
107
|
+
function nodeBounds(n) {
|
|
108
|
+
const { rx, ry } = nodeRadii(n);
|
|
109
|
+
const rings = ringCount(n.branchCount);
|
|
110
|
+
const scale = rings > 0 ? RINGS[rings - 1].scale : 1;
|
|
111
|
+
const r = BLOB_MAX_NORM * Math.max(rx, ry) * scale + VISUAL_MARGIN;
|
|
112
|
+
return { minX: n.x - r, minY: n.y - r, maxX: n.x + r, maxY: n.y + r };
|
|
113
|
+
}
|
|
114
|
+
function outlineRadius(n, angle) {
|
|
115
|
+
const { rx, ry } = nodeRadii(n);
|
|
116
|
+
const shape = shapeOfLevel(n.level);
|
|
117
|
+
const rings = ringCount(n.branchCount);
|
|
118
|
+
if (rings === 0) return blobRadius(shape, rx, ry, angle);
|
|
119
|
+
const ring = RINGS[rings - 1];
|
|
120
|
+
return blobRadius(shape, rx * ring.scale, ry * ring.scale, angle - ring.rotate * DEG);
|
|
121
|
+
}
|
|
122
|
+
function connectorGeometry(from, to, gap = METRICS.edgeGap) {
|
|
123
|
+
const theta = Math.atan2(to.y - from.y, to.x - from.x);
|
|
124
|
+
const ra = outlineRadius(from, theta) + gap;
|
|
125
|
+
const rb = outlineRadius(to, theta + Math.PI) + gap;
|
|
126
|
+
const a = { x: from.x + Math.cos(theta) * ra, y: from.y + Math.sin(theta) * ra };
|
|
127
|
+
const b = { x: to.x - Math.cos(theta) * rb, y: to.y - Math.sin(theta) * rb };
|
|
128
|
+
const e = edgePath(a, b);
|
|
129
|
+
return { a, b, d: e.d, angle: e.angle, mid: e.mid, arrow: arrowPath(b, e.angle) };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export {
|
|
133
|
+
BLOB_SHAPES,
|
|
134
|
+
SHAPE,
|
|
135
|
+
shapeForLevel,
|
|
136
|
+
blobPath,
|
|
137
|
+
drawBlob,
|
|
138
|
+
blobRadius,
|
|
139
|
+
RINGS,
|
|
140
|
+
edgePath,
|
|
141
|
+
arrowPath,
|
|
142
|
+
MAX_RINGS,
|
|
143
|
+
nodeRadii,
|
|
144
|
+
ringCount,
|
|
145
|
+
ringsFor,
|
|
146
|
+
shapeOfLevel,
|
|
147
|
+
nodeBounds,
|
|
148
|
+
outlineRadius,
|
|
149
|
+
connectorGeometry
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=chunk-TPLJJKAU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/generated/geometry/blobShapes.ts","../src/generated/geometry/blob.ts","../src/rendering/nodeGeometry.ts"],"sourcesContent":["// Generated from visualli.ai design-system/components/src/blobShapes.ts — do not edit here.\n// The six hand-authored Visualli node outlines, in normalized units (rx = ry = 1).\n// Copied verbatim from the web app (features/canvas/config/blobShapes.ts). Shape 0 is the root shape.\nexport const BLOB_SHAPES: number[][][] = [[[1.12,0.0],[0.86,0.56],[0.46,0.94],[-0.08,1.06],[-0.68,0.82],[-0.96,0.08],[-0.55,-0.82],[0.04,-1.02],[0.72,-0.8],[1.08,-0.38]],[[-0.489,-0.625],[-0.384,-0.716],[-0.285,-0.792],[-0.189,-0.855],[-0.09,-0.903],[0.014,-0.932],[0.129,-0.94],[0.255,-0.924],[0.412,-0.876],[0.516,-0.832],[0.612,-0.78],[0.695,-0.725],[0.767,-0.666],[0.83,-0.606],[0.885,-0.546],[0.933,-0.486],[0.979,-0.425],[1.006,-0.385],[1.034,-0.334],[1.058,-0.276],[1.078,-0.209],[1.092,-0.133],[1.101,-0.046],[1.102,0.052],[1.094,0.173],[1.083,0.244],[1.063,0.324],[1.034,0.401],[0.996,0.477],[0.948,0.549],[0.889,0.617],[0.82,0.681],[0.735,0.741],[0.658,0.783],[0.569,0.822],[0.474,0.855],[0.372,0.882],[0.265,0.904],[0.156,0.92],[0.046,0.931],[-0.069,0.938],[-0.155,0.935],[-0.25,0.919],[-0.346,0.89],[-0.443,0.851],[-0.539,0.8],[-0.633,0.738],[-0.723,0.667],[-0.808,0.585],[-0.882,0.501],[-0.944,0.421],[-0.994,0.343],[-1.034,0.267],[-1.064,0.192],[-1.085,0.12],[-1.097,0.042],[-1.102,0.001],[-1.09,-0.243],[-1.05,-0.365],[-0.99,-0.441],[-0.911,-0.479],[-0.819,-0.499],[-0.715,-0.517],[-0.605,-0.551]],[[0.003,-0.97],[0.163,-0.984],[0.286,-1.028],[0.389,-1.096],[0.488,-1.174],[0.597,-1.21],[0.728,-1.165],[0.867,-1.036],[0.996,-0.839],[1.098,-0.59],[1.158,-0.304],[1.153,0.012],[1.08,0.336],[0.944,0.639],[0.756,0.889],[0.484,1.072],[0.339,1.079],[0.219,1.051],[0.131,0.994],[0.059,0.939],[0.008,0.915],[-0.105,0.931],[-0.176,0.965],[-0.249,1.005],[-0.345,1.039],[-0.497,1.055],[-0.672,1.032],[-0.817,0.952],[-0.945,0.81],[-1.054,0.6],[-1.16,0.302],[-1.187,-0.011],[-1.165,-0.326],[-1.097,-0.599],[-0.991,-0.838],[-0.852,-0.912],[-0.695,-0.958],[-0.53,-0.988],[-0.357,-0.992],[-0.18,-0.983]],[[-0.734,-1.127],[-0.656,-1.146],[-0.567,-1.142],[-0.468,-1.115],[-0.358,-1.079],[-0.238,-1.034],[-0.107,-0.989],[0.035,-0.953],[0.188,-0.929],[0.325,-0.916],[0.484,-0.896],[0.65,-0.854],[0.811,-0.77],[0.955,-0.631],[1.068,-0.422],[1.138,-0.126],[1.152,0.272],[1.121,0.451],[1.046,0.602],[0.928,0.727],[0.767,0.833],[0.565,0.925],[0.323,1.001],[0.042,1.075],[-0.277,1.142],[-0.368,1.147],[-0.475,1.136],[-0.589,1.104],[-0.704,1.05],[-0.815,0.973],[-0.913,0.871],[-0.993,0.746],[-1.048,0.593],[-1.109,0.298],[-1.145,0.018],[-1.154,-0.243],[-1.135,-0.482],[-1.085,-0.695],[-1.003,-0.874],[-0.886,-1.02]],[[-0.734,1.127],[-0.656,1.146],[-0.567,1.142],[-0.468,1.115],[-0.358,1.079],[-0.238,1.034],[-0.107,0.989],[0.035,0.953],[0.188,0.929],[0.325,0.916],[0.484,0.896],[0.65,0.854],[0.811,0.77],[0.955,0.631],[1.068,0.422],[1.138,0.126],[1.152,-0.272],[1.121,-0.451],[1.046,-0.602],[0.928,-0.727],[0.767,-0.833],[0.565,-0.925],[0.323,-1.001],[0.042,-1.075],[-0.277,-1.142],[-0.368,-1.147],[-0.475,-1.136],[-0.589,-1.104],[-0.704,-1.05],[-0.815,-0.973],[-0.913,-0.871],[-0.993,-0.746],[-1.048,-0.593],[-1.109,-0.298],[-1.145,-0.018],[-1.154,0.243],[-1.135,0.482],[-1.085,0.695],[-1.003,0.874],[-0.886,1.02]],[[0.001,-1.006],[0.134,-1.001],[0.262,-1.024],[0.382,-1.073],[0.498,-1.107],[0.614,-1.105],[0.733,-1.049],[0.85,-0.932],[0.953,-0.755],[1.03,-0.529],[1.067,-0.265],[1.054,0.018],[0.986,0.3],[0.868,0.557],[0.715,0.766],[0.55,0.909],[0.396,0.984],[0.262,1.005],[0.148,1.003],[0.037,1.008],[-0.083,1.04],[-0.22,1.118],[-0.36,1.192],[-0.5,1.234],[-0.65,1.175],[-0.81,1.045],[-0.99,0.855],[-1.14,0.61],[-1.24,0.33],[-1.27,0.04],[-1.275,-0.25],[-1.225,-0.5],[-1.08,-0.72],[-0.89,-0.92],[-0.734,-1.053],[-0.614,-1.112],[-0.498,-1.127],[-0.381,-1.11],[-0.261,-1.095],[-0.133,-1.058],[0.001,-1.01],[0.134,-1.001]]];\n","// Generated from visualli.ai design-system/components/src/blob.ts — do not edit here.\nimport { BLOB_SHAPES } from './blobShapes';\nexport { BLOB_SHAPES };\n\n/** Which outline ideas take. Every idea, at every depth, has the same shape (`idea`, the shape of the map's centre);\n * depth shows through the depth trail, rings, the layer tint and the step-inside motion. The other authored shapes\n * stay in BLOB_SHAPES for explicit use (`Node shape`); `varyByLevel: true` brings back one shape per level. */\nexport const SHAPE: { idea: number; varyByLevel: boolean } = { idea: 0, varyByLevel: false };\n\n/** Shape for a layer level: SHAPE.idea for every level. With SHAPE.varyByLevel, level 0 is SHAPE.idea and consecutive\n * levels never repeat. */\nexport function shapeForLevel(level: number): number {\n if (!SHAPE.varyByLevel) return SHAPE.idea;\n const n = BLOB_SHAPES.length;\n let cur = SHAPE.idea;\n for (let i = 1; i <= level; i++) {\n const r = Math.floor(Math.abs(Math.sin((i + 1) * 12.9898) * 43758.5453));\n cur = (cur + (r % (n - 1)) + 1) % n;\n }\n return cur;\n}\n\n/** SVG path of a node outline centered on (cx, cy): midpoint-quadratic smoothing through the authored points. */\nexport function blobPath(shape: number, rx: number, ry: number, cx = 0, cy = 0): string {\n const pts = BLOB_SHAPES[((shape % BLOB_SHAPES.length) + BLOB_SHAPES.length) % BLOB_SHAPES.length].map(([x, y]) => [cx + x * rx, cy + y * ry]);\n const mid = (a: number[], b: number[]) => [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n const f = (n: number) => n.toFixed(2);\n const start = mid(pts[pts.length - 1], pts[0]);\n let d = `M${f(start[0])} ${f(start[1])}`;\n for (let i = 0; i < pts.length; i++) {\n const p = pts[i], m = mid(p, pts[(i + 1) % pts.length]);\n d += `Q${f(p[0])} ${f(p[1])} ${f(m[0])} ${f(m[1])}`;\n }\n return d + 'Z';\n}\n\n/** The path calls drawBlob makes: satisfied by a CanvasRenderingContext2D and by Konva's Context (sceneFunc / hitFunc). */\nexport type PathContext = { beginPath(): void; moveTo(x: number, y: number): void; quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void; closePath(): void };\n\n/** Canvas twin of blobPath — call fill()/stroke() after (in Konva: ctx.fillStrokeShape(shape)). */\nexport function drawBlob(ctx: PathContext, shape: number, rx: number, ry: number, cx = 0, cy = 0) {\n const pts = BLOB_SHAPES[((shape % BLOB_SHAPES.length) + BLOB_SHAPES.length) % BLOB_SHAPES.length].map(([x, y]) => [cx + x * rx, cy + y * ry]);\n const mid = (a: number[], b: number[]) => [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n const s = mid(pts[pts.length - 1], pts[0]);\n ctx.beginPath();\n ctx.moveTo(s[0], s[1]);\n pts.forEach((p, i) => { const m = mid(p, pts[(i + 1) % pts.length]); ctx.quadraticCurveTo(p[0], p[1], m[0], m[1]); });\n ctx.closePath();\n}\n\n/** Distance from the center to the smoothed outline (blobPath) in direction `angle` (radians, SVG y-down).\n * Connectors use it to start and end just outside the outline an idea actually has, not a stand-in ellipse. */\nexport function blobRadius(shape: number, rx: number, ry: number, angle: number): number {\n const pts = BLOB_SHAPES[((shape % BLOB_SHAPES.length) + BLOB_SHAPES.length) % BLOB_SHAPES.length].map(([x, y]) => [x * rx, y * ry]);\n const mid = (a: number[], b: number[]) => [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n // Sample the midpoint-quadratic curve into a polygon, then cast a ray from the center.\n const poly: number[][] = [];\n for (let i = 0; i < pts.length; i++) {\n const p0 = mid(pts[(i - 1 + pts.length) % pts.length], pts[i]), c = pts[i], p1 = mid(pts[i], pts[(i + 1) % pts.length]);\n for (let k = 0; k < 8; k++) { const t = k / 8, u = 1 - t; poly.push([u * u * p0[0] + 2 * u * t * c[0] + t * t * p1[0], u * u * p0[1] + 2 * u * t * c[1] + t * t * p1[1]]); }\n }\n const dx = Math.cos(angle), dy = Math.sin(angle);\n let best = 0;\n for (let i = 0; i < poly.length; i++) {\n const [ax, ay] = poly[i], [bx, by] = poly[(i + 1) % poly.length], ex = bx - ax, ey = by - ay;\n const den = dx * ey - dy * ex;\n if (Math.abs(den) < 1e-9) continue;\n const r = (ax * ey - ay * ex) / den, q = (ax * dy - ay * dx) / den;\n if (r > 0 && q >= 0 && q <= 1) best = Math.max(best, r);\n }\n return best || Math.max(rx, ry);\n}\n\n/** Ring recipe: index 0 is the innermost ring. A node shows min(childLayers, 3) rings. */\nexport const RINGS = [\n { scale: 1.1, opacity: 0.5, rotate: -5, width: 2, dash: '' },\n { scale: 1.2, opacity: 0.4, rotate: -10, width: 1, dash: '' },\n { scale: 1.3, opacity: 0.3, rotate: -15, width: 3, dash: '6 4' },\n];\n\n/** Connector geometry: a cubic that bows perpendicular to the chord, flatter as distance grows. */\nexport function edgePath(a: { x: number; y: number }, b: { x: number; y: number }, bow = 1) {\n const dx = b.x - a.x, dy = b.y - a.y, d = Math.hypot(dx, dy) || 1;\n const arc = Math.min(45, 45 / (1 + Math.max(0, (d - 200) / 400))) * bow;\n const nx = -dy / d, ny = dx / d;\n const mx = (a.x + b.x) / 2 + nx * arc, my = (a.y + b.y) / 2 + ny * arc;\n const c1 = { x: a.x + (mx - a.x) * 0.66 + 0, y: a.y + (my - a.y) * 0.66 };\n const c2 = { x: b.x + (mx - b.x) * 0.66, y: b.y + (my - b.y) * 0.66 };\n const ang = Math.atan2(b.y - c2.y, b.x - c2.x);\n return { d: `M${a.x.toFixed(1)} ${a.y.toFixed(1)}C${c1.x.toFixed(1)} ${c1.y.toFixed(1)} ${c2.x.toFixed(1)} ${c2.y.toFixed(1)} ${b.x.toFixed(1)} ${b.y.toFixed(1)}`, angle: ang, mid: { x: mx, y: my } };\n}\n\n/** Open V arrowhead at point p, pointing along angle. */\nexport function arrowPath(p: { x: number; y: number }, angle: number, len = 11) {\n const s = Math.PI / 5.5;\n const a1 = { x: p.x - len * Math.cos(angle - s), y: p.y - len * Math.sin(angle - s) };\n const a2 = { x: p.x - len * Math.cos(angle + s), y: p.y - len * Math.sin(angle + s) };\n return `M${a1.x.toFixed(1)} ${a1.y.toFixed(1)}L${p.x.toFixed(1)} ${p.y.toFixed(1)}L${a2.x.toFixed(1)} ${a2.y.toFixed(1)}`;\n}\n","// ─── Node & connector geometry ───────────────────────────────────────────────\n//\n// Thin layer over the design system's geometry (generated/geometry/blob.ts):\n// it chooses the radii, shapes, rings and endpoints for a FlatNode and never\n// re-implements outline or curve math. Pure functions, no DOM.\n\nimport { BLOB_SHAPES, RINGS, SHAPE, arrowPath, blobPath, blobRadius, edgePath, shapeForLevel } from '../generated/geometry/blob.js';\nimport { METRICS } from '../generated/designSystem.js';\nimport type { FlatNode } from '../types/mindmap.js';\n\n// The design system's geometry is part of the public API (single source of truth).\nexport { BLOB_SHAPES, RINGS, SHAPE, arrowPath, blobPath, blobRadius, edgePath, shapeForLevel };\nexport { drawBlob } from '../generated/geometry/blob.js';\n\n/** Minimum a node needs to be drawn / connected. */\nexport type NodeLike = Pick<FlatNode, 'x' | 'y' | 'width' | 'height' | 'level' | 'branchCount'>;\n\nexport const MAX_RINGS = RINGS.length;\nconst DEG = Math.PI / 180;\n\n/** Outline radii of an idea: half its size (sized for its label by the design system's idea.ts). */\nexport function nodeRadii(n: Pick<FlatNode, 'width' | 'height'>): { rx: number; ry: number } {\n return { rx: n.width / 2, ry: n.height / 2 };\n}\n\n/** Rings an idea shows: one per layer beneath it, at most 3. */\nexport const ringCount = (branchCount: number | undefined): number => Math.max(0, Math.min(branchCount ?? 0, MAX_RINGS));\n\n/** The design system's ring recipes an idea shows, innermost first (index 0 = scale 1.1). */\nexport const ringsFor = (branchCount: number | undefined): typeof RINGS => RINGS.slice(0, ringCount(branchCount));\n\nconst shapeCache = new Map<number, number>();\n/** Outline shape for a layer level (memoised: shapeForLevel is O(level)). */\nexport function shapeOfLevel(level: number): number {\n let s = shapeCache.get(level);\n if (s === undefined) { s = shapeForLevel(level); shapeCache.set(level, s); }\n return s;\n}\n\n/** Largest distance from a blob's centre to any control point, in units of max(rx, ry). */\nconst BLOB_MAX_NORM = Math.max(...BLOB_SHAPES.flatMap((s) => s.map(([x, y]) => Math.hypot(x!, y!))));\n\n/** Visual margin around an idea beyond its outline: stroke, hover lift and the node shadow. */\nconst VISUAL_MARGIN = METRICS.nodeStroke * 2 + 24;\n\n/**\n * Conservative world-space bounds of everything drawn for an idea (rings and\n * stroke included). Ideas are drawn CENTRED on (x, y), so bounds are centred\n * too. A circle bound is used so ring rotation can never push ink outside it.\n */\nexport function nodeBounds(n: NodeLike): { minX: number; minY: number; maxX: number; maxY: number } {\n const { rx, ry } = nodeRadii(n);\n const rings = ringCount(n.branchCount);\n const scale = rings > 0 ? RINGS[rings - 1]!.scale : 1;\n const r = BLOB_MAX_NORM * Math.max(rx, ry) * scale + VISUAL_MARGIN;\n return { minX: n.x - r, minY: n.y - r, maxX: n.x + r, maxY: n.y + r };\n}\n\n/**\n * Distance from an idea's centre to the outline connectors must clear, in the\n * world direction `angle` (radians, y down). That is the outermost visible\n * ring (rotated like the ring is drawn), or the body when there are no rings.\n */\nexport function outlineRadius(n: NodeLike, angle: number): number {\n const { rx, ry } = nodeRadii(n);\n const shape = shapeOfLevel(n.level);\n const rings = ringCount(n.branchCount);\n if (rings === 0) return blobRadius(shape, rx, ry, angle);\n const ring = RINGS[rings - 1]!;\n // The ring is the same blob scaled and rotated about the centre, so look up\n // the radius in the ring's own frame.\n return blobRadius(shape, rx * ring.scale, ry * ring.scale, angle - ring.rotate * DEG);\n}\n\nexport interface ConnectorGeometry {\n /** Start / end points: `edge-gap` outside the source / target outline. */\n a: { x: number; y: number };\n b: { x: number; y: number };\n /** Cubic path data (SVG syntax) and the arrowhead direction, from the design system's edgePath. */\n d: string;\n angle: number;\n /** Bow apex returned by edgePath, where the connector label sits. */\n mid: { x: number; y: number };\n /** Open arrowhead path data at b, from the design system's arrowPath. */\n arrow: string;\n}\n\n/** Endpoints and curve of a connector between two ideas. */\nexport function connectorGeometry(from: NodeLike, to: NodeLike, gap: number = METRICS.edgeGap): ConnectorGeometry {\n const theta = Math.atan2(to.y - from.y, to.x - from.x);\n const ra = outlineRadius(from, theta) + gap;\n const rb = outlineRadius(to, theta + Math.PI) + gap;\n const a = { x: from.x + Math.cos(theta) * ra, y: from.y + Math.sin(theta) * ra };\n const b = { x: to.x - Math.cos(theta) * rb, y: to.y - Math.sin(theta) * rb };\n const e = edgePath(a, b);\n return { a, b, d: e.d, angle: e.angle, mid: e.mid, arrow: arrowPath(b, e.angle) };\n}\n"],"mappings":"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,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,MAAK,MAAM,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,IAAI,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,KAAK,CAAC,GAAE,CAAC,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,MAAK,KAAK,GAAE,CAAC,OAAM,IAAI,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,IAAI,CAAC,GAAE,CAAC,CAAC,MAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,MAAK,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,MAAK,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,GAAG,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,MAAK,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,QAAO,IAAI,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,MAAK,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,IAAI,GAAE,CAAC,OAAM,IAAI,GAAE,CAAC,OAAM,IAAI,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,IAAI,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,OAAM,KAAK,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,KAAK,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,MAAM,KAAK,GAAE,CAAC,OAAM,MAAM,CAAC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","names":[]}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
// src/generated/geometry/interaction.ts
|
|
2
|
+
var TERM = {
|
|
3
|
+
/** Hovering the term this long opens its definition card… */
|
|
4
|
+
hoverOpen: 250,
|
|
5
|
+
/** …which closes this long after the pointer leaves both the term and the card (moving between them keeps it open). */
|
|
6
|
+
hoverClose: 300,
|
|
7
|
+
/** Only a mouse opens on hover; touch and pen open on tap. */
|
|
8
|
+
hoverPointers: ["mouse"],
|
|
9
|
+
/** A click, tap, Enter or Space pins the card open (hovering away doesn't close it); pressing again unpins and closes. */
|
|
10
|
+
clickPins: true,
|
|
11
|
+
/** Escape closes the card and returns focus to the term; a press anywhere outside the term and its card closes it. */
|
|
12
|
+
escapeCloses: true,
|
|
13
|
+
pressOutsideCloses: true,
|
|
14
|
+
/** Opening by click or keyboard moves focus to the card's first link or button. */
|
|
15
|
+
focusCardOnOpen: true,
|
|
16
|
+
/** The card is kept this far inside the viewport's left and right edges. */
|
|
17
|
+
viewportMargin: 8,
|
|
18
|
+
/** The card's link to a source about the term. */
|
|
19
|
+
learnMoreLabel: "Learn more"
|
|
20
|
+
};
|
|
21
|
+
var PEEK = {
|
|
22
|
+
/** Hovering an idea opens its peek at once; it stays this long after the pointer leaves the idea (and while the
|
|
23
|
+
* pointer is over the peek itself), so the pointer can travel from the idea onto the card. */
|
|
24
|
+
hoverClose: 180
|
|
25
|
+
};
|
|
26
|
+
var SHEET = {
|
|
27
|
+
/** Dragging the grip down this far closes the sheet (or collapses it when expanded); up this far expands it. */
|
|
28
|
+
dismissDrag: 80,
|
|
29
|
+
expandDrag: 40,
|
|
30
|
+
/** Its height: this share of the map, at most `maxHeight` px; the map pans the chosen idea into the space above it. */
|
|
31
|
+
heightRatio: 0.42,
|
|
32
|
+
maxHeight: 300
|
|
33
|
+
};
|
|
34
|
+
var VIEW = {
|
|
35
|
+
/** Each zoom step multiplies or divides the zoom by this. */
|
|
36
|
+
zoomStep: 1.2,
|
|
37
|
+
/** Zoom limits (the zoom-min / zoom-max tokens; the build checks they agree). */
|
|
38
|
+
zoomMin: 0.3,
|
|
39
|
+
zoomMax: 5,
|
|
40
|
+
/** Fit to view never enlarges a layer beyond this. */
|
|
41
|
+
fitMax: 1.1
|
|
42
|
+
};
|
|
43
|
+
var GESTURE = {
|
|
44
|
+
/** Two fingers pinch to zoom the map's contents — ideas, connectors, containers and their labels — around the
|
|
45
|
+
* point between the fingers, within VIEW's limits. Controls, the depth trail, the peek, chat and the page never scale. */
|
|
46
|
+
pinchZoom: true,
|
|
47
|
+
/** Moving both fingers pans the contents. */
|
|
48
|
+
twoFingerPan: true,
|
|
49
|
+
/** The pointers that pinch (PointerEvent.pointerType). */
|
|
50
|
+
pointers: ["touch"],
|
|
51
|
+
/** Where the map is the page (an app: AppShell, the mobile app), it takes every touch gesture (touch-action: none),
|
|
52
|
+
* so the browser never zooms the page. Embedded on a scrolling page (website, docs), one finger still scrolls the
|
|
53
|
+
* page (touch-action: pan-x pan-y); two fingers that land together pinch the map. */
|
|
54
|
+
appTouchAction: "none",
|
|
55
|
+
embeddedTouchAction: "pan-x pan-y",
|
|
56
|
+
/** Zoom never navigates: stepping inside and backing out stay explicit (tap an idea / Step inside, the depth trail,
|
|
57
|
+
* Escape or Backspace). */
|
|
58
|
+
zoomNavigates: false
|
|
59
|
+
};
|
|
60
|
+
function pinchZoom(startZoom, startDistance, distance) {
|
|
61
|
+
const z = startZoom * (distance / Math.max(startDistance, 1));
|
|
62
|
+
return Math.min(VIEW.zoomMax, Math.max(VIEW.zoomMin, z));
|
|
63
|
+
}
|
|
64
|
+
function zoomAround(t0, s0, s1, from, to) {
|
|
65
|
+
const wx = (from.x - t0.x) / s0, wy = (from.y - t0.y) / s0;
|
|
66
|
+
return { x: to.x - wx * s1, y: to.y - wy * s1 };
|
|
67
|
+
}
|
|
68
|
+
var FRAME = {
|
|
69
|
+
/** Room beyond each idea's outline (at least `minPadX` / `minPadY` from its centre). */
|
|
70
|
+
clearX: 50,
|
|
71
|
+
clearY: 46,
|
|
72
|
+
minPadX: 150,
|
|
73
|
+
minPadY: 120,
|
|
74
|
+
/** Room beyond each container hull for its dashed line and the name pill straddling it. */
|
|
75
|
+
hullX: 24,
|
|
76
|
+
hullY: 40
|
|
77
|
+
};
|
|
78
|
+
function layerBounds(ideas, hulls = []) {
|
|
79
|
+
let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;
|
|
80
|
+
for (const n of ideas) {
|
|
81
|
+
const px = Math.max(FRAME.minPadX, n.rx + FRAME.clearX), py = Math.max(FRAME.minPadY, n.ry + FRAME.clearY);
|
|
82
|
+
x0 = Math.min(x0, n.x - px);
|
|
83
|
+
x1 = Math.max(x1, n.x + px);
|
|
84
|
+
y0 = Math.min(y0, n.y - py);
|
|
85
|
+
y1 = Math.max(y1, n.y + py);
|
|
86
|
+
}
|
|
87
|
+
for (const h of hulls) {
|
|
88
|
+
x0 = Math.min(x0, h.x0 - FRAME.hullX);
|
|
89
|
+
x1 = Math.max(x1, h.x1 + FRAME.hullX);
|
|
90
|
+
y0 = Math.min(y0, h.y0 - FRAME.hullY);
|
|
91
|
+
y1 = Math.max(y1, h.y1 + FRAME.hullY);
|
|
92
|
+
}
|
|
93
|
+
if (!Number.isFinite(x0)) return { x0: -FRAME.minPadX, y0: -FRAME.minPadY, x1: FRAME.minPadX, y1: FRAME.minPadY };
|
|
94
|
+
return { x0, y0, x1, y1 };
|
|
95
|
+
}
|
|
96
|
+
function fitView(bounds, width, height) {
|
|
97
|
+
const scale = Math.min(width / Math.max(1, bounds.x1 - bounds.x0), height / Math.max(1, bounds.y1 - bounds.y0), VIEW.fitMax);
|
|
98
|
+
return { scale, center: { x: (bounds.x0 + bounds.x1) / 2, y: (bounds.y0 + bounds.y1) / 2 } };
|
|
99
|
+
}
|
|
100
|
+
var PEEK_PLACEMENT = {
|
|
101
|
+
/** Gap between the idea's outermost ring and the card. */
|
|
102
|
+
gap: 16,
|
|
103
|
+
/** The card's width and the height kept clear below it. */
|
|
104
|
+
cardWidth: 300,
|
|
105
|
+
cardHeight: 220,
|
|
106
|
+
/** The card is raised this much above the idea's centre. */
|
|
107
|
+
raise: 70,
|
|
108
|
+
/** Kept this far inside the map's edges. */
|
|
109
|
+
margin: 12
|
|
110
|
+
};
|
|
111
|
+
function peekPosition(idea, box, card = { w: PEEK_PLACEMENT.cardWidth, h: PEEK_PLACEMENT.cardHeight }) {
|
|
112
|
+
const P = PEEK_PLACEMENT, half = idea.half + P.gap;
|
|
113
|
+
const right = idea.x + half + card.w < box.w - P.margin;
|
|
114
|
+
return { left: right ? idea.x + half : Math.max(P.margin, idea.x - half - card.w), top: Math.min(Math.max(P.margin, idea.y - P.raise), box.h - card.h), side: right ? "right" : "left" };
|
|
115
|
+
}
|
|
116
|
+
var TRAIL = { rootTopic: "stone", rootLabel: "icon", homeIconSize: 12, dotBox: 16, dotRadius: 6.4, stroke: 1.25, currentStroke: 1.75 };
|
|
117
|
+
function pointerModeFor(pointerType) {
|
|
118
|
+
return pointerType === "mouse" ? "hover" : pointerType === "touch" || pointerType === "pen" ? "touch" : null;
|
|
119
|
+
}
|
|
120
|
+
function hoverOpensTerm(pointerType) {
|
|
121
|
+
return TERM.hoverPointers.includes(pointerType);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// src/constants/performanceConstants.ts
|
|
125
|
+
var FPS_TARGET = 60;
|
|
126
|
+
var FPS_WARNING_THRESHOLD = 45;
|
|
127
|
+
var FPS_CRITICAL_THRESHOLD = 30;
|
|
128
|
+
var TARGET_FRAME_TIME = 1e3 / FPS_TARGET;
|
|
129
|
+
var MAX_FRAME_TIME = 18;
|
|
130
|
+
var FPS_TARGETS = {
|
|
131
|
+
PAN_MIN: 30,
|
|
132
|
+
ZOOM_TARGET: 60,
|
|
133
|
+
WARNING_THRESHOLD: 20
|
|
134
|
+
};
|
|
135
|
+
var TIMING_THRESHOLDS = {
|
|
136
|
+
VIEWPORT_QUERY_MAX: 5,
|
|
137
|
+
SPATIAL_UPDATE_MAX: 10,
|
|
138
|
+
DRAG_RESPONSE_MAX: 16,
|
|
139
|
+
LOAD_5K_TARGET: 2e3,
|
|
140
|
+
LOAD_10K_TARGET: 3e3,
|
|
141
|
+
VIEWPORT_DEBOUNCE: 100,
|
|
142
|
+
SPATIAL_INDEX_BUILD: 50
|
|
143
|
+
};
|
|
144
|
+
var MEMORY_TARGET_MB = 500;
|
|
145
|
+
var MEMORY_WARNING_MB = 600;
|
|
146
|
+
var MEMORY_CRITICAL_MB = 800;
|
|
147
|
+
var MEMORY_LIMITS = {
|
|
148
|
+
MAX_10K_NODES: 500,
|
|
149
|
+
MAX_GROWTH_PERCENT: 20,
|
|
150
|
+
WARNING_THRESHOLD: 400
|
|
151
|
+
};
|
|
152
|
+
var VIEWPORT_MARGIN = 0.1;
|
|
153
|
+
var MAX_VISIBLE_NODES = 800;
|
|
154
|
+
var CULLING_QUERY_TIME_BUDGET = 5;
|
|
155
|
+
var RBUSH_MAX_ENTRIES = 16;
|
|
156
|
+
var SPATIAL_INDEX_BUILD_BUDGET = 50;
|
|
157
|
+
var ZOOM_MIN = VIEW.zoomMin;
|
|
158
|
+
var ZOOM_MAX = VIEW.zoomMax;
|
|
159
|
+
var ZOOM_DEFAULT = 1;
|
|
160
|
+
var QUALITY_HIGH = {
|
|
161
|
+
shadows: true,
|
|
162
|
+
bezierCurves: true,
|
|
163
|
+
animations: true,
|
|
164
|
+
textQuality: "high",
|
|
165
|
+
antialiasing: true
|
|
166
|
+
};
|
|
167
|
+
var QUALITY_MEDIUM = {
|
|
168
|
+
shadows: false,
|
|
169
|
+
bezierCurves: true,
|
|
170
|
+
animations: true,
|
|
171
|
+
textQuality: "medium",
|
|
172
|
+
antialiasing: true
|
|
173
|
+
};
|
|
174
|
+
var QUALITY_LOW = {
|
|
175
|
+
shadows: false,
|
|
176
|
+
bezierCurves: false,
|
|
177
|
+
animations: false,
|
|
178
|
+
textQuality: "low",
|
|
179
|
+
antialiasing: false
|
|
180
|
+
};
|
|
181
|
+
var FPS_SAMPLE_WINDOW = 60;
|
|
182
|
+
var FPS_UPDATE_INTERVAL = 1e3;
|
|
183
|
+
var MEMORY_CHECK_INTERVAL = 5e3;
|
|
184
|
+
var PERFORMANCE_TOAST_COOLDOWN = 1e4;
|
|
185
|
+
var FPS_DOWNGRADE_THRESHOLD = 45;
|
|
186
|
+
var FPS_UPGRADE_THRESHOLD = 58;
|
|
187
|
+
var FPS_STABILIZATION_FRAMES = 180;
|
|
188
|
+
var DEFAULT_CANVAS_WIDTH = 1920;
|
|
189
|
+
var DEFAULT_CANVAS_HEIGHT = 1080;
|
|
190
|
+
var CLICK_THRESHOLD = 5;
|
|
191
|
+
var DOUBLE_CLICK_DELAY = 300;
|
|
192
|
+
var DRAG_START_DISTANCE = 10;
|
|
193
|
+
var MAX_NODES = 2e4;
|
|
194
|
+
var CIRCULAR_REFERENCE_MAX_DEPTH = 1e3;
|
|
195
|
+
var RESIZE_DEBOUNCE = 300;
|
|
196
|
+
var SCROLL_THROTTLE = 16;
|
|
197
|
+
var SEARCH_DEBOUNCE = 500;
|
|
198
|
+
var NODE_COUNT_THRESHOLDS = {
|
|
199
|
+
SPATIAL_INDEX_MIN: 100,
|
|
200
|
+
VIEWPORT_CULLING_MIN: 500,
|
|
201
|
+
CANVAS_RENDERING_MIN: 2e3,
|
|
202
|
+
DOM_RENDERING_MAX: 5e3
|
|
203
|
+
};
|
|
204
|
+
var VIEWPORT_CONFIG = {
|
|
205
|
+
BUFFER_PERCENT: 0.2,
|
|
206
|
+
MIN_VISIBLE_NODES: 10
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
export {
|
|
210
|
+
TERM,
|
|
211
|
+
PEEK,
|
|
212
|
+
SHEET,
|
|
213
|
+
VIEW,
|
|
214
|
+
GESTURE,
|
|
215
|
+
pinchZoom,
|
|
216
|
+
zoomAround,
|
|
217
|
+
FRAME,
|
|
218
|
+
layerBounds,
|
|
219
|
+
fitView,
|
|
220
|
+
PEEK_PLACEMENT,
|
|
221
|
+
peekPosition,
|
|
222
|
+
TRAIL,
|
|
223
|
+
pointerModeFor,
|
|
224
|
+
hoverOpensTerm,
|
|
225
|
+
FPS_TARGET,
|
|
226
|
+
FPS_WARNING_THRESHOLD,
|
|
227
|
+
FPS_CRITICAL_THRESHOLD,
|
|
228
|
+
TARGET_FRAME_TIME,
|
|
229
|
+
MAX_FRAME_TIME,
|
|
230
|
+
FPS_TARGETS,
|
|
231
|
+
TIMING_THRESHOLDS,
|
|
232
|
+
MEMORY_TARGET_MB,
|
|
233
|
+
MEMORY_WARNING_MB,
|
|
234
|
+
MEMORY_CRITICAL_MB,
|
|
235
|
+
MEMORY_LIMITS,
|
|
236
|
+
VIEWPORT_MARGIN,
|
|
237
|
+
MAX_VISIBLE_NODES,
|
|
238
|
+
CULLING_QUERY_TIME_BUDGET,
|
|
239
|
+
RBUSH_MAX_ENTRIES,
|
|
240
|
+
SPATIAL_INDEX_BUILD_BUDGET,
|
|
241
|
+
ZOOM_MIN,
|
|
242
|
+
ZOOM_MAX,
|
|
243
|
+
ZOOM_DEFAULT,
|
|
244
|
+
QUALITY_HIGH,
|
|
245
|
+
QUALITY_MEDIUM,
|
|
246
|
+
QUALITY_LOW,
|
|
247
|
+
FPS_SAMPLE_WINDOW,
|
|
248
|
+
FPS_UPDATE_INTERVAL,
|
|
249
|
+
MEMORY_CHECK_INTERVAL,
|
|
250
|
+
PERFORMANCE_TOAST_COOLDOWN,
|
|
251
|
+
FPS_DOWNGRADE_THRESHOLD,
|
|
252
|
+
FPS_UPGRADE_THRESHOLD,
|
|
253
|
+
FPS_STABILIZATION_FRAMES,
|
|
254
|
+
DEFAULT_CANVAS_WIDTH,
|
|
255
|
+
DEFAULT_CANVAS_HEIGHT,
|
|
256
|
+
CLICK_THRESHOLD,
|
|
257
|
+
DOUBLE_CLICK_DELAY,
|
|
258
|
+
DRAG_START_DISTANCE,
|
|
259
|
+
MAX_NODES,
|
|
260
|
+
CIRCULAR_REFERENCE_MAX_DEPTH,
|
|
261
|
+
RESIZE_DEBOUNCE,
|
|
262
|
+
SCROLL_THROTTLE,
|
|
263
|
+
SEARCH_DEBOUNCE,
|
|
264
|
+
NODE_COUNT_THRESHOLDS,
|
|
265
|
+
VIEWPORT_CONFIG
|
|
266
|
+
};
|
|
267
|
+
//# sourceMappingURL=chunk-UAMEJG2C.js.map
|