@visualli/core 0.1.7 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -105
- package/dist/chunk-25AJTPMS.js +68 -0
- package/dist/chunk-25AJTPMS.js.map +1 -0
- package/dist/chunk-64PUANNH.js +151 -0
- package/dist/chunk-64PUANNH.js.map +1 -0
- package/dist/chunk-ITDZ72JE.js +96 -0
- package/dist/chunk-ITDZ72JE.js.map +1 -0
- package/dist/{chunk-PDP5CVUL.js → chunk-LOQLNYB3.js} +2 -2
- 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-RFMUATWB.js +753 -0
- package/dist/chunk-RFMUATWB.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/{chunk-6NXADJK2.js → chunk-WO4JAAKP.js} +84 -117
- package/dist/chunk-WO4JAAKP.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-D49xVfr8.d.cts +150 -0
- package/dist/designSystem-D49xVfr8.d.ts +150 -0
- package/dist/document-BFBwn93X.d.ts +26 -0
- package/dist/document-MEJEfxl3.d.cts +26 -0
- package/dist/ideaSize-BTJu6thN.d.cts +11 -0
- package/dist/ideaSize-RKbms8K6.d.ts +11 -0
- package/dist/index-CcF0Jvmb.d.ts +99 -0
- package/dist/index-Dt--T2l8.d.cts +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-BO3YD5qu.d.cts +182 -0
- package/dist/mindmap-D0Of0jaZ.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/config/index.ts","../../src/config/blobShapes.ts","../../src/constants/performanceConstants.ts","../../src/config/textScaling.ts"],"sourcesContent":["// ─── Config Barrel Export ────────────────────────────────────────────────────\n//\n// Automatically exports all configuration modules.\n// Add new config files here to make them available via `@visualli/core/config`.\n\nexport * from './blobShapes.js';\nexport * from './textScaling.js';\n","export interface BlobPoint { x: number; y: number }\nexport type BlobShape = BlobPoint[];\n\n// ── Blob Layer Config ─────────────────────────────────────────────────────────\n\nexport const BLOB_LAYER_CONFIG = [\n { opacity: 0.3, rotation: -15, scaleUp: 1.30, strokeWidth: 3, dash: [6, 4] }, // Layer #3 (outermost)\n { opacity: 0.4, rotation: -10, scaleUp: 1.20, strokeWidth: 1, dash: undefined }, // Layer #2\n { opacity: 0.5, rotation: -5, scaleUp: 1.10, strokeWidth: 2, dash: undefined }, // Layer #1\n] as const;\n\nexport const NODE_LAYER_CONFIG = { opacity: 1, rotation: 0, strokeWidth: 3 } as const;\n\n// ── Blob Shapes ───────────────────────────────────────────────────────────────\n\nexport const ALL_BLOB_SHAPES: ReadonlyArray<BlobShape> = [\n // Shape 0 · Blob 1\n [\n { x: 1.12, y: 0 }, { x: 0.86, y: 0.56 }, { x: 0.46, y: 0.94 }, { x: -0.08, y: 1.06 },\n { x: -0.68, y: 0.82 }, { x: -0.96, y: 0.08 }, { x: -0.55, y: -0.82 }, { x: 0.04, y: -1.02 },\n { x: 0.72, y: -0.8 }, { x: 1.08, y: -0.38 },\n ],\n // Shape 1 · Blob 2\n [\n { x: -0.489, y: -0.625 }, { x: -0.384, y: -0.716 }, { x: -0.285, y: -0.792 }, { x: -0.189, y: -0.855 },\n { x: -0.090, y: -0.903 }, { x: 0.014, y: -0.932 }, { x: 0.129, y: -0.940 }, { x: 0.255, y: -0.924 },\n { x: 0.412, y: -0.876 }, { x: 0.516, y: -0.832 }, { x: 0.612, y: -0.780 }, { x: 0.695, y: -0.725 },\n { x: 0.767, y: -0.666 }, { x: 0.830, y: -0.606 }, { x: 0.885, y: -0.546 }, { x: 0.933, y: -0.486 },\n { x: 0.979, y: -0.425 }, { x: 1.006, y: -0.385 }, { x: 1.034, y: -0.334 }, { x: 1.058, y: -0.276 },\n { x: 1.078, y: -0.209 }, { x: 1.092, y: -0.133 }, { x: 1.101, y: -0.046 }, { x: 1.102, y: 0.052 },\n { x: 1.094, y: 0.173 }, { x: 1.083, y: 0.244 }, { x: 1.063, y: 0.324 }, { x: 1.034, y: 0.401 },\n { x: 0.996, y: 0.477 }, { x: 0.948, y: 0.549 }, { x: 0.889, y: 0.617 }, { x: 0.820, y: 0.681 },\n { x: 0.735, y: 0.741 }, { x: 0.658, y: 0.783 }, { x: 0.569, y: 0.822 }, { x: 0.474, y: 0.855 },\n { x: 0.372, y: 0.882 }, { x: 0.265, y: 0.904 }, { x: 0.156, y: 0.920 }, { x: 0.046, y: 0.931 },\n { x: -0.069, y: 0.938 }, { x: -0.155, y: 0.935 }, { x: -0.250, y: 0.919 }, { x: -0.346, y: 0.890 },\n { x: -0.443, y: 0.851 }, { x: -0.539, y: 0.800 }, { x: -0.633, y: 0.738 }, { x: -0.723, y: 0.667 },\n { x: -0.808, y: 0.585 }, { x: -0.882, y: 0.501 }, { x: -0.944, y: 0.421 }, { x: -0.994, y: 0.343 },\n { x: -1.034, y: 0.267 }, { x: -1.064, y: 0.192 }, { x: -1.085, y: 0.120 }, { x: -1.097, y: 0.042 },\n { x: -1.102, y: 0.001 }, { x: -1.090, y: -0.243 }, { x: -1.050, y: -0.365 }, { x: -0.990, y: -0.441 },\n { x: -0.911, y: -0.479 }, { x: -0.819, y: -0.499 }, { x: -0.715, y: -0.517 }, { x: -0.605, y: -0.551 },\n ],\n // Shape 2 · Blob 3\n [\n { x: 0.003, y: -0.970 }, { x: 0.163, y: -0.984 }, { x: 0.286, y: -1.028 }, { x: 0.389, y: -1.096 },\n { x: 0.488, y: -1.174 }, { x: 0.597, y: -1.210 }, { x: 0.728, y: -1.165 }, { x: 0.867, y: -1.036 },\n { x: 0.996, y: -0.839 }, { x: 1.098, y: -0.590 }, { x: 1.158, y: -0.304 }, { x: 1.153, y: 0.012 },\n { x: 1.080, y: 0.336 }, { x: 0.944, y: 0.639 }, { x: 0.756, y: 0.889 }, { x: 0.484, y: 1.072 },\n { x: 0.339, y: 1.079 }, { x: 0.219, y: 1.051 }, { x: 0.131, y: 0.994 }, { x: 0.059, y: 0.939 },\n { x: 0.008, y: 0.915 }, { x: -0.105, y: 0.931 }, { x: -0.176, y: 0.965 }, { x: -0.249, y: 1.005 },\n { x: -0.345, y: 1.039 }, { x: -0.497, y: 1.055 }, { x: -0.672, y: 1.032 }, { x: -0.817, y: 0.952 },\n { x: -0.945, y: 0.810 }, { x: -1.054, y: 0.600 }, { x: -1.160, y: 0.302 }, { x: -1.187, y: -0.011 },\n { x: -1.165, y: -0.326 }, { x: -1.097, y: -0.599 }, { x: -0.991, y: -0.838 }, { x: -0.852, y: -0.912 },\n { x: -0.695, y: -0.958 }, { x: -0.530, y: -0.988 }, { x: -0.357, y: -0.992 }, { x: -0.180, y: -0.983 },\n ],\n // Shape 3 · Blob 4\n [\n { x: -0.734, y: -1.127 }, { x: -0.656, y: -1.146 }, { x: -0.567, y: -1.142 }, { x: -0.468, y: -1.115 },\n { x: -0.358, y: -1.079 }, { x: -0.238, y: -1.034 }, { x: -0.107, y: -0.989 }, { x: 0.035, y: -0.953 },\n { x: 0.188, y: -0.929 }, { x: 0.325, y: -0.916 }, { x: 0.484, y: -0.896 }, { x: 0.650, y: -0.854 },\n { x: 0.811, y: -0.770 }, { x: 0.955, y: -0.631 }, { x: 1.068, y: -0.422 }, { x: 1.138, y: -0.126 },\n { x: 1.152, y: 0.272 }, { x: 1.121, y: 0.451 }, { x: 1.046, y: 0.602 }, { x: 0.928, y: 0.727 },\n { x: 0.767, y: 0.833 }, { x: 0.565, y: 0.925 }, { x: 0.323, y: 1.001 }, { x: 0.042, y: 1.075 },\n { x: -0.277, y: 1.142 }, { x: -0.368, y: 1.147 }, { x: -0.475, y: 1.136 }, { x: -0.589, y: 1.104 },\n { x: -0.704, y: 1.050 }, { x: -0.815, y: 0.973 }, { x: -0.913, y: 0.871 }, { x: -0.993, y: 0.746 },\n { x: -1.048, y: 0.593 }, { x: -1.109, y: 0.298 }, { x: -1.145, y: 0.018 }, { x: -1.154, y: -0.243 },\n { x: -1.135, y: -0.482 }, { x: -1.085, y: -0.695 }, { x: -1.003, y: -0.874 }, { x: -0.886, y: -1.020 },\n ],\n // Shape 4 · Blob 5\n [\n { x: -0.734, y: 1.127 }, { x: -0.656, y: 1.146 }, { x: -0.567, y: 1.142 }, { x: -0.468, y: 1.115 },\n { x: -0.358, y: 1.079 }, { x: -0.238, y: 1.034 }, { x: -0.107, y: 0.989 }, { x: 0.035, y: 0.953 },\n { x: 0.188, y: 0.929 }, { x: 0.325, y: 0.916 }, { x: 0.484, y: 0.896 }, { x: 0.650, y: 0.854 },\n { x: 0.811, y: 0.770 }, { x: 0.955, y: 0.631 }, { x: 1.068, y: 0.422 }, { x: 1.138, y: 0.126 },\n { x: 1.152, y: -0.272 }, { x: 1.121, y: -0.451 }, { x: 1.046, y: -0.602 }, { x: 0.928, y: -0.727 },\n { x: 0.767, y: -0.833 }, { x: 0.565, y: -0.925 }, { x: 0.323, y: -1.001 }, { x: 0.042, y: -1.075 },\n { x: -0.277, y: -1.142 }, { x: -0.368, y: -1.147 }, { x: -0.475, y: -1.136 }, { x: -0.589, y: -1.104 },\n { x: -0.704, y: -1.050 }, { x: -0.815, y: -0.973 }, { x: -0.913, y: -0.871 }, { x: -0.993, y: -0.746 },\n { x: -1.048, y: -0.593 }, { x: -1.109, y: -0.298 }, { x: -1.145, y: -0.018 }, { x: -1.154, y: 0.243 },\n { x: -1.135, y: 0.482 }, { x: -1.085, y: 0.695 }, { x: -1.003, y: 0.874 }, { x: -0.886, y: 1.020 },\n ],\n // Shape 5 · Blob 6\n [\n { x: 0.001, y: -1.006 }, { x: 0.134, y: -1.001 }, { x: 0.262, y: -1.024 },\n { x: 0.382, y: -1.073 }, { x: 0.498, y: -1.107 }, { x: 0.614, y: -1.105 },\n { x: 0.733, y: -1.049 }, { x: 0.850, y: -0.932 }, { x: 0.953, y: -0.755 },\n { x: 1.030, y: -0.529 }, { x: 1.067, y: -0.265 }, { x: 1.054, y: 0.018 },\n { x: 0.986, y: 0.300 }, { x: 0.868, y: 0.557 }, { x: 0.715, y: 0.766 },\n { x: 0.550, y: 0.909 }, { x: 0.396, y: 0.984 }, { x: 0.262, y: 1.005 },\n { x: 0.148, y: 1.003 }, { x: 0.037, y: 1.008 }, { x: -0.083, y: 1.040 },\n { x: -0.220, y: 1.118 }, { x: -0.360, y: 1.192 }, { x: -0.500, y: 1.234 },\n { x: -0.650, y: 1.175 }, { x: -0.810, y: 1.045 }, { x: -0.990, y: 0.855 },\n { x: -1.140, y: 0.610 }, { x: -1.240, y: 0.330 }, { x: -1.270, y: 0.040 },\n { x: -1.275, y: -0.250 }, { x: -1.225, y: -0.500 }, { x: -1.080, y: -0.720 },\n { x: -0.890, y: -0.920 }, { x: -0.734, y: -1.053 }, { x: -0.614, y: -1.112 },\n { x: -0.498, y: -1.127 }, { x: -0.381, y: -1.110 }, { x: -0.261, y: -1.095 },\n { x: -0.133, y: -1.058 }, { x: 0.001, y: -1.010 }, { x: 0.134, y: -1.001 },\n ],\n];\n\nexport const ACTIVE_BLOB_TYPES: ReadonlyArray<number> = [0, 1, 2, 3, 4, 5];\n\n/**\n * Per-shape text x-offset as a fraction of baseRadiusX.\n * Compensates for visually asymmetric blobs. Positive = right, negative = left.\n */\nexport const BLOB_TEXT_OFFSETS: ReadonlyArray<number> = [0, 0, 0, 0, 0, -0.10];\n\n/**\n * Deterministic pseudo-random blob-type selector per tree level.\n * Root level (0) always uses shape 0; consecutive levels use different shapes.\n */\nexport function getBlobTypeForLayer(level: number): number {\n const numTypes = ACTIVE_BLOB_TYPES.length;\n if (numTypes <= 1) return ACTIVE_BLOB_TYPES[0] ?? 0;\n let currentType = 0;\n for (let i = 1; i <= level; i++) {\n const pseudoRandom = Math.floor(Math.abs(Math.sin((i + 1) * 12.9898) * 43758.5453));\n const stepOffset = (pseudoRandom % (numTypes - 1)) + 1;\n currentType = (currentType + stepOffset) % numTypes;\n }\n return ACTIVE_BLOB_TYPES[currentType];\n}\n\n/**\n * Draw the blob path onto a canvas context (centered at 0,0).\n * Uses closed quadratic bezier curves through midpoints of control points.\n */\nexport function drawBlobPath(\n ctx: { beginPath(): void; moveTo(x: number, y: number): void; quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void; closePath(): void },\n radiusX: number,\n radiusY: number,\n blobType: number,\n): void {\n const srcPts = ALL_BLOB_SHAPES[blobType] ?? ALL_BLOB_SHAPES[0];\n const pts = srcPts.map(p => ({ x: p.x * radiusX, y: p.y * radiusY }));\n ctx.beginPath();\n const last = pts[pts.length - 1];\n const first = pts[0];\n ctx.moveTo((last.x + first.x) / 2, (last.y + first.y) / 2);\n for (let i = 0; i < pts.length; i++) {\n const curr = pts[i];\n const next = pts[(i + 1) % pts.length];\n ctx.quadraticCurveTo(curr.x, curr.y, (curr.x + next.x) / 2, (curr.y + next.y) / 2);\n }\n ctx.closePath();\n}\n","// ─── Performance & Rendering Constants ───────────────────────────────────────\n\n// ── FPS ───────────────────────────────────────────────────────────────────────\n\nexport const FPS_TARGET = 60;\nexport const FPS_WARNING_THRESHOLD = 45;\nexport const FPS_CRITICAL_THRESHOLD = 30;\nexport const TARGET_FRAME_TIME = 1000 / FPS_TARGET; // ~16.67 ms\nexport const MAX_FRAME_TIME = 18; // p95 threshold\n\n/** Legacy frame-rate targets kept for backward compatibility. */\nexport const FPS_TARGETS = {\n PAN_MIN: 30,\n ZOOM_TARGET: 60,\n WARNING_THRESHOLD: 20,\n} as const;\n\n// ── Timing Thresholds (ms) ────────────────────────────────────────────────────\n\nexport const TIMING_THRESHOLDS = {\n VIEWPORT_QUERY_MAX: 5,\n SPATIAL_UPDATE_MAX: 10,\n DRAG_RESPONSE_MAX: 16,\n LOAD_5K_TARGET: 2000,\n LOAD_10K_TARGET: 3000,\n VIEWPORT_DEBOUNCE: 100,\n SPATIAL_INDEX_BUILD: 50,\n} as const;\n\n// ── Memory Limits (MB) ────────────────────────────────────────────────────────\n\nexport const MEMORY_TARGET_MB = 500;\nexport const MEMORY_WARNING_MB = 600;\nexport const MEMORY_CRITICAL_MB = 800;\n\nexport const MEMORY_LIMITS = {\n MAX_10K_NODES: 500,\n MAX_GROWTH_PERCENT: 20,\n WARNING_THRESHOLD: 400,\n} as const;\n\n// ── Viewport Culling ──────────────────────────────────────────────────────────\n\nexport const VIEWPORT_MARGIN = 0.1;\nexport const MAX_VISIBLE_NODES = 800;\nexport const CULLING_QUERY_TIME_BUDGET = 5;\n\n// ── Spatial Index ─────────────────────────────────────────────────────────────\n\nexport const RBUSH_MAX_ENTRIES = 16;\nexport const SPATIAL_INDEX_BUILD_BUDGET = 50;\n\n// ── Node Dimensions ───────────────────────────────────────────────────────────\n\nexport const NODE_MIN_WIDTH = 200;\nexport const NODE_HEIGHT = 80;\nexport const NODE_PADDING = 40;\nexport const CHAR_WIDTH = 8;\nexport const TITLE_MAX_LENGTH = 150;\n\n// ── Visual Styling ────────────────────────────────────────────────────────────\n\nexport const CORNER_RADIUS = 8;\nexport const BORDER_WIDTH_NORMAL = 2;\nexport const BORDER_WIDTH_SELECTED = 3;\n\nexport const COLOR_SELECTED = '#1B2D4F';\nexport const COLOR_BORDER_LIGHT = '#4A3728';\nexport const COLOR_BORDER_DARK = '#FAF6F1';\nexport const COLOR_DEFAULT_NODE = '#FAF6F1';\n\n// ── Zoom Constraints ──────────────────────────────────────────────────────────\n\nexport const ZOOM_MIN = 0.05;\nexport const ZOOM_MAX = 5.0;\nexport const ZOOM_DEFAULT = 1.0;\nexport const ZOOM_STEP = 0.1;\nexport const ZOOM_WHEEL_SENSITIVITY = 0.001;\n\nexport const ZOOM_NAV_IN_THRESHOLD = 2.7;\nexport const ZOOM_NAV_OUT_THRESHOLD = 0.4;\nexport const TEXT_LABEL_HIDE_BELOW_ZOOM = 0.3;\n\n// ── Quality Level Presets ─────────────────────────────────────────────────────\n\nexport const QUALITY_HIGH = {\n shadows: true,\n bezierCurves: true,\n animations: true,\n textQuality: 'high' as const,\n antialiasing: true,\n};\n\nexport const QUALITY_MEDIUM = {\n shadows: false,\n bezierCurves: true,\n animations: true,\n textQuality: 'medium' as const,\n antialiasing: true,\n};\n\nexport const QUALITY_LOW = {\n shadows: false,\n bezierCurves: false,\n animations: false,\n textQuality: 'low' as const,\n antialiasing: false,\n};\n\n// ── Performance Monitoring ────────────────────────────────────────────────────\n\nexport const FPS_SAMPLE_WINDOW = 60;\nexport const FPS_UPDATE_INTERVAL = 1000;\nexport const MEMORY_CHECK_INTERVAL = 5000;\nexport const PERFORMANCE_TOAST_COOLDOWN = 10000;\n\n// ── Auto-Adjustment ───────────────────────────────────────────────────────────\n\nexport const FPS_DOWNGRADE_THRESHOLD = 45;\nexport const FPS_UPGRADE_THRESHOLD = 58;\nexport const FPS_STABILIZATION_FRAMES = 180;\n\n// ── Canvas Dimensions ─────────────────────────────────────────────────────────\n\nexport const DEFAULT_CANVAS_WIDTH = 1920;\nexport const DEFAULT_CANVAS_HEIGHT = 1080;\n\n// ── Interaction ───────────────────────────────────────────────────────────────\n\nexport const CLICK_THRESHOLD = 5;\nexport const DOUBLE_CLICK_DELAY = 300;\nexport const DRAG_START_DISTANCE = 10;\n\n// ── Data Validation ───────────────────────────────────────────────────────────\n\nexport const MAX_NODES = 20000;\nexport const CIRCULAR_REFERENCE_MAX_DEPTH = 1000;\n\n// ── Debounce / Throttle ───────────────────────────────────────────────────────\n\nexport const RESIZE_DEBOUNCE = 300;\nexport const SCROLL_THROTTLE = 16;\nexport const SEARCH_DEBOUNCE = 500;\n\n/** Node count thresholds that gate optimisation strategies. */\nexport const NODE_COUNT_THRESHOLDS = {\n SPATIAL_INDEX_MIN: 100,\n VIEWPORT_CULLING_MIN: 500,\n CANVAS_RENDERING_MIN: 2000,\n DOM_RENDERING_MAX: 5000,\n} as const;\n\n/** Viewport buffer configuration. */\nexport const VIEWPORT_CONFIG = {\n BUFFER_PERCENT: 0.2,\n MIN_VISIBLE_NODES: 10,\n} as const;\n","import { NODE_HEIGHT } from '../constants/performanceConstants.js';\n\nexport const NODE_TEXT_BASE_FONT_PX = 28;\nexport const DESCRIPTION_TEXT_BASE_FONT_PX = 12;\nexport const CONTAINER_LABEL_BASE_FONT_PX = 24;\nexport const EDGE_LABEL_BASE_FONT_PX = 18;\nexport const OVERLAY_FONT_UPPER_BOOST_PX = 8;\n\n// Keep text away from blob edges\nconst NODE_TEXT_SAFE_BLOB_FILL_RATIO = 0.88;\n\n/**\n * Computes world-space text scale for node title:\n * - inverse zoom for screen-space consistency\n * - clamped so text stays inside the node blob with safe padding\n *\n * Matches visualli.ai's computeNodeTextWorldScale(nodeWidth, zoomLevel).\n */\nexport function computeNodeTextWorldScale(nodeWidth: number, zoomLevel: number): number {\n const safeZoom = Math.max(zoomLevel, 0.0001);\n const baseRadiusX = nodeWidth / 2;\n const baseRadiusY = Math.max((NODE_HEIGHT * 1.6) / 2, baseRadiusX * 0.74);\n const textNaturalWidth = nodeWidth - 40;\n const textNaturalHeight = NODE_HEIGHT - 20;\n\n const maxScaleX = ((baseRadiusX * 2) * NODE_TEXT_SAFE_BLOB_FILL_RATIO) / Math.max(textNaturalWidth, 1);\n const maxScaleY = ((baseRadiusY * 2) * NODE_TEXT_SAFE_BLOB_FILL_RATIO) / Math.max(textNaturalHeight, 1);\n const fitScale = Math.max(0.01, Math.min(maxScaleX, maxScaleY));\n\n return Math.min(1 / safeZoom, fitScale);\n}\n\n/** Screen-space scale (zoom-adjusted) for text overlays. */\nexport function computeNodeTextScreenScale(nodeWidth: number, zoomLevel: number): number {\n return computeNodeTextWorldScale(nodeWidth, zoomLevel) * zoomLevel;\n}\n\n/**\n * Screen-space overlay scale for description/semantic tooltips.\n * - lower bound: 1x\n * - upper bound: node-title-root + OVERLAY_FONT_UPPER_BOOST_PX\n */\nexport function computeOverlayScale(zoomLevel: number): number {\n const safeZoom = Math.max(zoomLevel, 0.0001);\n const inverseScale = 1 / safeZoom;\n const maxScale = (NODE_TEXT_BASE_FONT_PX + OVERLAY_FONT_UPPER_BOOST_PX) / NODE_TEXT_BASE_FONT_PX;\n return Math.min(Math.max(inverseScale, 1), maxScale);\n}\n\n/** Scale for edge path labels in screen pixels. */\nexport function computeEdgeLabelScale(zoomLevel: number): number {\n const safeZoom = Math.max(zoomLevel, 0.0001);\n return Math.min(Math.max(EDGE_LABEL_BASE_FONT_PX / safeZoom, 10), 32);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/config/index.ts","../../src/generated/geometry/blobShapes.ts","../../src/generated/geometry/blob.ts","../../src/generated/designSystem.ts","../../src/rendering/nodeGeometry.ts","../../src/generated/geometry/idea.ts","../../src/rendering/ideaSize.ts"],"sourcesContent":["// ─── Config Barrel Export ────────────────────────────────────────────────────\n//\n// Design-system geometry and idea sizing (all derived from generated/).\n\nexport * from '../rendering/nodeGeometry.js';\nexport * from '../rendering/ideaSize.js';\n","// 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","// 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.1\" 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","// ─── 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","// Generated from visualli.ai design-system/components/src/idea.ts — do not edit here.\n/* An idea's size and its label. An idea grows to show its whole label: it starts at its base width and widens in\n steps until the label fits in `labelLines` lines; at its widest it grows taller instead, so a label is never cut.\n Labels (and connector labels) grow a little when the map is zoomed out, so they stay readable. Every renderer sizes\n ideas with these rules, measuring text with its own font engine (`measure`). No dependencies, so it can travel alone. */\n\nexport type IdeaKind = 'root' | 'node' | 'mini';\n\n/** How much labels grow when zoomed out (`scale` = the map's zoom): never smaller than their size, up to these caps.\n * Idea labels and container names use `idea`; connector labels `connector`. Below 100% they grow; above, they don't. */\nexport const LABEL_GROWTH = { idea: 1.3, connector: 1.6 } as const;\n\nexport const IDEA = {\n /** Width an idea starts at… */ baseWidth: { root: 240, node: 200, mini: 120 },\n /** …and the widest it gets before it grows taller instead. */ maxWidth: { root: 400, node: 360, mini: 200 },\n /** Width grows in steps of this. */ step: 20,\n /** Height = width × aspect (at least `minRy` × 2), more if the label needs it. */ aspect: 0.74, minRy: 64,\n /** The label's box is the idea's width less this (22 each side). */ labelInset: 44,\n /** The idea widens until its label fits in this many lines. */ labelLines: 3,\n /** Label size (before the label scale and zoom growth), weight from the canvas type styles. */ labelSize: { root: 30, node: 22, mini: 15 },\n labelLineHeight: 1.15,\n /** The label may fill at most this share of the idea's height. */ labelFillHeight: 0.7,\n} as const;\n\n/** Greedy word wrap of `text` into lines no wider than `maxWidth` (a single word longer than that gets its own line). */\nexport function wrapLines(text: string, maxWidth: number, measure: (s: string) => number): string[] {\n const words = text.split(/\\s+/).filter(Boolean);\n const lines: string[] = [];\n let cur = '';\n for (const w of words) {\n const next = cur ? `${cur} ${w}` : w;\n if (cur && measure(next) > maxWidth) { lines.push(cur); cur = w; } else cur = next;\n }\n if (cur) lines.push(cur);\n return lines.length ? lines : [''];\n}\n\n/** An idea's size for its label: width, half-width / half-height for the blob, and the label's lines. The label is\n * measured at its largest drawn size — its type size × `labelScale` (Comfort: larger text) × LABEL_GROWTH.idea (zoomed\n * out) — so it fits at every zoom and the idea never changes size while zooming. `measure(text, px)` returns the\n * text's width in px in the label's face at `px`. */\nexport function ideaSize(kind: IdeaKind, label: string, measure: (text: string, px: number) => number, labelScale = 1) {\n const px = IDEA.labelSize[kind] * labelScale * LABEL_GROWTH.idea;\n const fit = (w: number) => wrapLines(label, w - IDEA.labelInset, (t) => measure(t, px));\n const base: number = IDEA.baseWidth[kind], max: number = IDEA.maxWidth[kind];\n let width = base, lines = fit(width);\n while (lines.length > IDEA.labelLines && width < max) { width = Math.min(max, width + IDEA.step); lines = fit(width); }\n const rx = width / 2;\n const ry = Math.max(IDEA.minRy, rx * IDEA.aspect, (lines.length * px * IDEA.labelLineHeight) / 2 / IDEA.labelFillHeight);\n return { width, height: ry * 2, rx, ry, lines };\n}\n\nexport function labelGrowth(scale: number): { idea: number; connector: number } {\n const inv = 1 / Math.max(scale, 0.0001);\n return { idea: Math.max(1, Math.min(inv, LABEL_GROWTH.idea)), connector: Math.max(1, Math.min(inv, LABEL_GROWTH.connector)) };\n}\n","// ─── Idea size and label growth ──────────────────────────────────────────────\n//\n// The design system's idea.ts (copied verbatim into generated/geometry): an idea\n// grows to show its whole label, and labels grow a little when zoomed out. The\n// SDK only supplies the text measurement (its font engine) and picks the kind.\n\nimport { IDEA, LABEL_GROWTH, ideaSize, labelGrowth, wrapLines, type IdeaKind } from '../generated/geometry/idea.js';\nimport type { VisualliLayer } from '../types/layer.js';\n\nexport { IDEA, LABEL_GROWTH, ideaSize, labelGrowth, wrapLines };\nexport type { IdeaKind };\n\n/** Width in px of `text` in the idea label's face at `px` (the label's weight; readable type adds its tracking). */\nexport type IdeaMeasure = (text: string, px: number) => number;\n\n/** Measurement without a font engine (server, tests): half an em per character. Renderers pass the real face. */\nexport const approximateMeasure: IdeaMeasure = (text, px) => text.length * px * 0.5;\n\n/** The size kind of the `index`-th idea of a layer: the centre of the root radial layer is the root, the rest ideas. */\nexport const ideaKindOf = (layer: Pick<VisualliLayer, 'level' | 'layout'>, index: number): IdeaKind =>\n layer.level === 0 && (layer.layout ?? 'radial') === 'radial' && index === 0 ? 'root' : 'node';\n"],"mappings":"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AM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,QAAO,MAAM,GAAE,CAAC,OAAM,MAAM,CAAC,GAAE,CAAC,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,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,CA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","names":[]}
|
package/dist/config/index.d.cts
CHANGED
|
@@ -1,77 +1,118 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
readonly strokeWidth: 1;
|
|
17
|
-
readonly dash: undefined;
|
|
18
|
-
}, {
|
|
19
|
-
readonly opacity: 0.5;
|
|
20
|
-
readonly rotation: -5;
|
|
21
|
-
readonly scaleUp: 1.1;
|
|
22
|
-
readonly strokeWidth: 2;
|
|
23
|
-
readonly dash: undefined;
|
|
24
|
-
}];
|
|
25
|
-
declare const NODE_LAYER_CONFIG: {
|
|
26
|
-
readonly opacity: 1;
|
|
27
|
-
readonly rotation: 0;
|
|
28
|
-
readonly strokeWidth: 3;
|
|
1
|
+
import { F as FlatNode } from '../mindmap-BO3YD5qu.cjs';
|
|
2
|
+
export { a as IDEA, I as IdeaKind, L as LABEL_GROWTH, i as ideaSize, l as labelGrowth, w as wrapLines } from '../mindmap-BO3YD5qu.cjs';
|
|
3
|
+
export { I as IdeaMeasure, a as approximateMeasure, i as ideaKindOf } from '../ideaSize-BTJu6thN.cjs';
|
|
4
|
+
import '../designSystem-D49xVfr8.cjs';
|
|
5
|
+
import '../layer-B2A3Ki48.cjs';
|
|
6
|
+
import '@visualli/bindings';
|
|
7
|
+
|
|
8
|
+
declare const BLOB_SHAPES: number[][][];
|
|
9
|
+
|
|
10
|
+
/** Which outline ideas take. Every idea, at every depth, has the same shape (`idea`, the shape of the map's centre);
|
|
11
|
+
* depth shows through the depth trail, rings, the layer tint and the step-inside motion. The other authored shapes
|
|
12
|
+
* stay in BLOB_SHAPES for explicit use (`Node shape`); `varyByLevel: true` brings back one shape per level. */
|
|
13
|
+
declare const SHAPE: {
|
|
14
|
+
idea: number;
|
|
15
|
+
varyByLevel: boolean;
|
|
29
16
|
};
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Deterministic pseudo-random blob-type selector per tree level.
|
|
39
|
-
* Root level (0) always uses shape 0; consecutive levels use different shapes.
|
|
40
|
-
*/
|
|
41
|
-
declare function getBlobTypeForLayer(level: number): number;
|
|
42
|
-
/**
|
|
43
|
-
* Draw the blob path onto a canvas context (centered at 0,0).
|
|
44
|
-
* Uses closed quadratic bezier curves through midpoints of control points.
|
|
45
|
-
*/
|
|
46
|
-
declare function drawBlobPath(ctx: {
|
|
17
|
+
/** Shape for a layer level: SHAPE.idea for every level. With SHAPE.varyByLevel, level 0 is SHAPE.idea and consecutive
|
|
18
|
+
* levels never repeat. */
|
|
19
|
+
declare function shapeForLevel(level: number): number;
|
|
20
|
+
/** SVG path of a node outline centered on (cx, cy): midpoint-quadratic smoothing through the authored points. */
|
|
21
|
+
declare function blobPath(shape: number, rx: number, ry: number, cx?: number, cy?: number): string;
|
|
22
|
+
/** The path calls drawBlob makes: satisfied by a CanvasRenderingContext2D and by Konva's Context (sceneFunc / hitFunc). */
|
|
23
|
+
type PathContext = {
|
|
47
24
|
beginPath(): void;
|
|
48
25
|
moveTo(x: number, y: number): void;
|
|
49
26
|
quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
|
|
50
27
|
closePath(): void;
|
|
51
|
-
}
|
|
28
|
+
};
|
|
29
|
+
/** Canvas twin of blobPath — call fill()/stroke() after (in Konva: ctx.fillStrokeShape(shape)). */
|
|
30
|
+
declare function drawBlob(ctx: PathContext, shape: number, rx: number, ry: number, cx?: number, cy?: number): void;
|
|
31
|
+
/** Distance from the center to the smoothed outline (blobPath) in direction `angle` (radians, SVG y-down).
|
|
32
|
+
* Connectors use it to start and end just outside the outline an idea actually has, not a stand-in ellipse. */
|
|
33
|
+
declare function blobRadius(shape: number, rx: number, ry: number, angle: number): number;
|
|
34
|
+
/** Ring recipe: index 0 is the innermost ring. A node shows min(childLayers, 3) rings. */
|
|
35
|
+
declare const RINGS: {
|
|
36
|
+
scale: number;
|
|
37
|
+
opacity: number;
|
|
38
|
+
rotate: number;
|
|
39
|
+
width: number;
|
|
40
|
+
dash: string;
|
|
41
|
+
}[];
|
|
42
|
+
/** Connector geometry: a cubic that bows perpendicular to the chord, flatter as distance grows. */
|
|
43
|
+
declare function edgePath(a: {
|
|
44
|
+
x: number;
|
|
45
|
+
y: number;
|
|
46
|
+
}, b: {
|
|
47
|
+
x: number;
|
|
48
|
+
y: number;
|
|
49
|
+
}, bow?: number): {
|
|
50
|
+
d: string;
|
|
51
|
+
angle: number;
|
|
52
|
+
mid: {
|
|
53
|
+
x: number;
|
|
54
|
+
y: number;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
/** Open V arrowhead at point p, pointing along angle. */
|
|
58
|
+
declare function arrowPath(p: {
|
|
59
|
+
x: number;
|
|
60
|
+
y: number;
|
|
61
|
+
}, angle: number, len?: number): string;
|
|
52
62
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
declare const
|
|
56
|
-
|
|
57
|
-
declare
|
|
63
|
+
/** Minimum a node needs to be drawn / connected. */
|
|
64
|
+
type NodeLike = Pick<FlatNode, 'x' | 'y' | 'width' | 'height' | 'level' | 'branchCount'>;
|
|
65
|
+
declare const MAX_RINGS: number;
|
|
66
|
+
/** Outline radii of an idea: half its size (sized for its label by the design system's idea.ts). */
|
|
67
|
+
declare function nodeRadii(n: Pick<FlatNode, 'width' | 'height'>): {
|
|
68
|
+
rx: number;
|
|
69
|
+
ry: number;
|
|
70
|
+
};
|
|
71
|
+
/** Rings an idea shows: one per layer beneath it, at most 3. */
|
|
72
|
+
declare const ringCount: (branchCount: number | undefined) => number;
|
|
73
|
+
/** The design system's ring recipes an idea shows, innermost first (index 0 = scale 1.1). */
|
|
74
|
+
declare const ringsFor: (branchCount: number | undefined) => typeof RINGS;
|
|
75
|
+
/** Outline shape for a layer level (memoised: shapeForLevel is O(level)). */
|
|
76
|
+
declare function shapeOfLevel(level: number): number;
|
|
58
77
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* Matches visualli.ai's computeNodeTextWorldScale(nodeWidth, zoomLevel).
|
|
78
|
+
* Conservative world-space bounds of everything drawn for an idea (rings and
|
|
79
|
+
* stroke included). Ideas are drawn CENTRED on (x, y), so bounds are centred
|
|
80
|
+
* too. A circle bound is used so ring rotation can never push ink outside it.
|
|
64
81
|
*/
|
|
65
|
-
declare function
|
|
66
|
-
|
|
67
|
-
|
|
82
|
+
declare function nodeBounds(n: NodeLike): {
|
|
83
|
+
minX: number;
|
|
84
|
+
minY: number;
|
|
85
|
+
maxX: number;
|
|
86
|
+
maxY: number;
|
|
87
|
+
};
|
|
68
88
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
89
|
+
* Distance from an idea's centre to the outline connectors must clear, in the
|
|
90
|
+
* world direction `angle` (radians, y down). That is the outermost visible
|
|
91
|
+
* ring (rotated like the ring is drawn), or the body when there are no rings.
|
|
72
92
|
*/
|
|
73
|
-
declare function
|
|
74
|
-
|
|
75
|
-
|
|
93
|
+
declare function outlineRadius(n: NodeLike, angle: number): number;
|
|
94
|
+
interface ConnectorGeometry {
|
|
95
|
+
/** Start / end points: `edge-gap` outside the source / target outline. */
|
|
96
|
+
a: {
|
|
97
|
+
x: number;
|
|
98
|
+
y: number;
|
|
99
|
+
};
|
|
100
|
+
b: {
|
|
101
|
+
x: number;
|
|
102
|
+
y: number;
|
|
103
|
+
};
|
|
104
|
+
/** Cubic path data (SVG syntax) and the arrowhead direction, from the design system's edgePath. */
|
|
105
|
+
d: string;
|
|
106
|
+
angle: number;
|
|
107
|
+
/** Bow apex returned by edgePath, where the connector label sits. */
|
|
108
|
+
mid: {
|
|
109
|
+
x: number;
|
|
110
|
+
y: number;
|
|
111
|
+
};
|
|
112
|
+
/** Open arrowhead path data at b, from the design system's arrowPath. */
|
|
113
|
+
arrow: string;
|
|
114
|
+
}
|
|
115
|
+
/** Endpoints and curve of a connector between two ideas. */
|
|
116
|
+
declare function connectorGeometry(from: NodeLike, to: NodeLike, gap?: number): ConnectorGeometry;
|
|
76
117
|
|
|
77
|
-
export {
|
|
118
|
+
export { BLOB_SHAPES, type ConnectorGeometry, MAX_RINGS, type NodeLike, RINGS, SHAPE, arrowPath, blobPath, blobRadius, connectorGeometry, drawBlob, edgePath, nodeBounds, nodeRadii, outlineRadius, ringCount, ringsFor, shapeForLevel, shapeOfLevel };
|
package/dist/config/index.d.ts
CHANGED
|
@@ -1,77 +1,118 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
readonly strokeWidth: 1;
|
|
17
|
-
readonly dash: undefined;
|
|
18
|
-
}, {
|
|
19
|
-
readonly opacity: 0.5;
|
|
20
|
-
readonly rotation: -5;
|
|
21
|
-
readonly scaleUp: 1.1;
|
|
22
|
-
readonly strokeWidth: 2;
|
|
23
|
-
readonly dash: undefined;
|
|
24
|
-
}];
|
|
25
|
-
declare const NODE_LAYER_CONFIG: {
|
|
26
|
-
readonly opacity: 1;
|
|
27
|
-
readonly rotation: 0;
|
|
28
|
-
readonly strokeWidth: 3;
|
|
1
|
+
import { F as FlatNode } from '../mindmap-D0Of0jaZ.js';
|
|
2
|
+
export { a as IDEA, I as IdeaKind, L as LABEL_GROWTH, i as ideaSize, l as labelGrowth, w as wrapLines } from '../mindmap-D0Of0jaZ.js';
|
|
3
|
+
export { I as IdeaMeasure, a as approximateMeasure, i as ideaKindOf } from '../ideaSize-RKbms8K6.js';
|
|
4
|
+
import '../designSystem-D49xVfr8.js';
|
|
5
|
+
import '../layer-B2A3Ki48.js';
|
|
6
|
+
import '@visualli/bindings';
|
|
7
|
+
|
|
8
|
+
declare const BLOB_SHAPES: number[][][];
|
|
9
|
+
|
|
10
|
+
/** Which outline ideas take. Every idea, at every depth, has the same shape (`idea`, the shape of the map's centre);
|
|
11
|
+
* depth shows through the depth trail, rings, the layer tint and the step-inside motion. The other authored shapes
|
|
12
|
+
* stay in BLOB_SHAPES for explicit use (`Node shape`); `varyByLevel: true` brings back one shape per level. */
|
|
13
|
+
declare const SHAPE: {
|
|
14
|
+
idea: number;
|
|
15
|
+
varyByLevel: boolean;
|
|
29
16
|
};
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
*/
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Deterministic pseudo-random blob-type selector per tree level.
|
|
39
|
-
* Root level (0) always uses shape 0; consecutive levels use different shapes.
|
|
40
|
-
*/
|
|
41
|
-
declare function getBlobTypeForLayer(level: number): number;
|
|
42
|
-
/**
|
|
43
|
-
* Draw the blob path onto a canvas context (centered at 0,0).
|
|
44
|
-
* Uses closed quadratic bezier curves through midpoints of control points.
|
|
45
|
-
*/
|
|
46
|
-
declare function drawBlobPath(ctx: {
|
|
17
|
+
/** Shape for a layer level: SHAPE.idea for every level. With SHAPE.varyByLevel, level 0 is SHAPE.idea and consecutive
|
|
18
|
+
* levels never repeat. */
|
|
19
|
+
declare function shapeForLevel(level: number): number;
|
|
20
|
+
/** SVG path of a node outline centered on (cx, cy): midpoint-quadratic smoothing through the authored points. */
|
|
21
|
+
declare function blobPath(shape: number, rx: number, ry: number, cx?: number, cy?: number): string;
|
|
22
|
+
/** The path calls drawBlob makes: satisfied by a CanvasRenderingContext2D and by Konva's Context (sceneFunc / hitFunc). */
|
|
23
|
+
type PathContext = {
|
|
47
24
|
beginPath(): void;
|
|
48
25
|
moveTo(x: number, y: number): void;
|
|
49
26
|
quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
|
|
50
27
|
closePath(): void;
|
|
51
|
-
}
|
|
28
|
+
};
|
|
29
|
+
/** Canvas twin of blobPath — call fill()/stroke() after (in Konva: ctx.fillStrokeShape(shape)). */
|
|
30
|
+
declare function drawBlob(ctx: PathContext, shape: number, rx: number, ry: number, cx?: number, cy?: number): void;
|
|
31
|
+
/** Distance from the center to the smoothed outline (blobPath) in direction `angle` (radians, SVG y-down).
|
|
32
|
+
* Connectors use it to start and end just outside the outline an idea actually has, not a stand-in ellipse. */
|
|
33
|
+
declare function blobRadius(shape: number, rx: number, ry: number, angle: number): number;
|
|
34
|
+
/** Ring recipe: index 0 is the innermost ring. A node shows min(childLayers, 3) rings. */
|
|
35
|
+
declare const RINGS: {
|
|
36
|
+
scale: number;
|
|
37
|
+
opacity: number;
|
|
38
|
+
rotate: number;
|
|
39
|
+
width: number;
|
|
40
|
+
dash: string;
|
|
41
|
+
}[];
|
|
42
|
+
/** Connector geometry: a cubic that bows perpendicular to the chord, flatter as distance grows. */
|
|
43
|
+
declare function edgePath(a: {
|
|
44
|
+
x: number;
|
|
45
|
+
y: number;
|
|
46
|
+
}, b: {
|
|
47
|
+
x: number;
|
|
48
|
+
y: number;
|
|
49
|
+
}, bow?: number): {
|
|
50
|
+
d: string;
|
|
51
|
+
angle: number;
|
|
52
|
+
mid: {
|
|
53
|
+
x: number;
|
|
54
|
+
y: number;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
/** Open V arrowhead at point p, pointing along angle. */
|
|
58
|
+
declare function arrowPath(p: {
|
|
59
|
+
x: number;
|
|
60
|
+
y: number;
|
|
61
|
+
}, angle: number, len?: number): string;
|
|
52
62
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
declare const
|
|
56
|
-
|
|
57
|
-
declare
|
|
63
|
+
/** Minimum a node needs to be drawn / connected. */
|
|
64
|
+
type NodeLike = Pick<FlatNode, 'x' | 'y' | 'width' | 'height' | 'level' | 'branchCount'>;
|
|
65
|
+
declare const MAX_RINGS: number;
|
|
66
|
+
/** Outline radii of an idea: half its size (sized for its label by the design system's idea.ts). */
|
|
67
|
+
declare function nodeRadii(n: Pick<FlatNode, 'width' | 'height'>): {
|
|
68
|
+
rx: number;
|
|
69
|
+
ry: number;
|
|
70
|
+
};
|
|
71
|
+
/** Rings an idea shows: one per layer beneath it, at most 3. */
|
|
72
|
+
declare const ringCount: (branchCount: number | undefined) => number;
|
|
73
|
+
/** The design system's ring recipes an idea shows, innermost first (index 0 = scale 1.1). */
|
|
74
|
+
declare const ringsFor: (branchCount: number | undefined) => typeof RINGS;
|
|
75
|
+
/** Outline shape for a layer level (memoised: shapeForLevel is O(level)). */
|
|
76
|
+
declare function shapeOfLevel(level: number): number;
|
|
58
77
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* Matches visualli.ai's computeNodeTextWorldScale(nodeWidth, zoomLevel).
|
|
78
|
+
* Conservative world-space bounds of everything drawn for an idea (rings and
|
|
79
|
+
* stroke included). Ideas are drawn CENTRED on (x, y), so bounds are centred
|
|
80
|
+
* too. A circle bound is used so ring rotation can never push ink outside it.
|
|
64
81
|
*/
|
|
65
|
-
declare function
|
|
66
|
-
|
|
67
|
-
|
|
82
|
+
declare function nodeBounds(n: NodeLike): {
|
|
83
|
+
minX: number;
|
|
84
|
+
minY: number;
|
|
85
|
+
maxX: number;
|
|
86
|
+
maxY: number;
|
|
87
|
+
};
|
|
68
88
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
89
|
+
* Distance from an idea's centre to the outline connectors must clear, in the
|
|
90
|
+
* world direction `angle` (radians, y down). That is the outermost visible
|
|
91
|
+
* ring (rotated like the ring is drawn), or the body when there are no rings.
|
|
72
92
|
*/
|
|
73
|
-
declare function
|
|
74
|
-
|
|
75
|
-
|
|
93
|
+
declare function outlineRadius(n: NodeLike, angle: number): number;
|
|
94
|
+
interface ConnectorGeometry {
|
|
95
|
+
/** Start / end points: `edge-gap` outside the source / target outline. */
|
|
96
|
+
a: {
|
|
97
|
+
x: number;
|
|
98
|
+
y: number;
|
|
99
|
+
};
|
|
100
|
+
b: {
|
|
101
|
+
x: number;
|
|
102
|
+
y: number;
|
|
103
|
+
};
|
|
104
|
+
/** Cubic path data (SVG syntax) and the arrowhead direction, from the design system's edgePath. */
|
|
105
|
+
d: string;
|
|
106
|
+
angle: number;
|
|
107
|
+
/** Bow apex returned by edgePath, where the connector label sits. */
|
|
108
|
+
mid: {
|
|
109
|
+
x: number;
|
|
110
|
+
y: number;
|
|
111
|
+
};
|
|
112
|
+
/** Open arrowhead path data at b, from the design system's arrowPath. */
|
|
113
|
+
arrow: string;
|
|
114
|
+
}
|
|
115
|
+
/** Endpoints and curve of a connector between two ideas. */
|
|
116
|
+
declare function connectorGeometry(from: NodeLike, to: NodeLike, gap?: number): ConnectorGeometry;
|
|
76
117
|
|
|
77
|
-
export {
|
|
118
|
+
export { BLOB_SHAPES, type ConnectorGeometry, MAX_RINGS, type NodeLike, RINGS, SHAPE, arrowPath, blobPath, blobRadius, connectorGeometry, drawBlob, edgePath, nodeBounds, nodeRadii, outlineRadius, ringCount, ringsFor, shapeForLevel, shapeOfLevel };
|