@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.
Files changed (127) hide show
  1. package/README.md +37 -105
  2. package/dist/chunk-25AJTPMS.js +68 -0
  3. package/dist/chunk-25AJTPMS.js.map +1 -0
  4. package/dist/chunk-64PUANNH.js +151 -0
  5. package/dist/chunk-64PUANNH.js.map +1 -0
  6. package/dist/chunk-ITDZ72JE.js +96 -0
  7. package/dist/chunk-ITDZ72JE.js.map +1 -0
  8. package/dist/{chunk-PDP5CVUL.js → chunk-LOQLNYB3.js} +2 -2
  9. package/dist/chunk-N7HCYULH.js +12 -0
  10. package/dist/chunk-N7HCYULH.js.map +1 -0
  11. package/dist/{chunk-I75TMOE4.js → chunk-P6PKWVYF.js} +2 -2
  12. package/dist/chunk-RFMUATWB.js +753 -0
  13. package/dist/chunk-RFMUATWB.js.map +1 -0
  14. package/dist/chunk-UAMEJG2C.js +267 -0
  15. package/dist/chunk-UAMEJG2C.js.map +1 -0
  16. package/dist/{chunk-LJYSKSCE.js → chunk-W2CAOOJJ.js} +6 -6
  17. package/dist/chunk-W2CAOOJJ.js.map +1 -0
  18. package/dist/{chunk-6NXADJK2.js → chunk-WO4JAAKP.js} +84 -117
  19. package/dist/chunk-WO4JAAKP.js.map +1 -0
  20. package/dist/config/index.cjs +250 -349
  21. package/dist/config/index.cjs.map +1 -1
  22. package/dist/config/index.d.cts +107 -66
  23. package/dist/config/index.d.ts +107 -66
  24. package/dist/config/index.js +52 -34
  25. package/dist/constants/index.cjs +14 -333
  26. package/dist/constants/index.cjs.map +1 -1
  27. package/dist/constants/index.d.cts +5 -243
  28. package/dist/constants/index.d.ts +5 -243
  29. package/dist/constants/index.js +5 -75
  30. package/dist/designSystem-D49xVfr8.d.cts +150 -0
  31. package/dist/designSystem-D49xVfr8.d.ts +150 -0
  32. package/dist/document-BFBwn93X.d.ts +26 -0
  33. package/dist/document-MEJEfxl3.d.cts +26 -0
  34. package/dist/ideaSize-BTJu6thN.d.cts +11 -0
  35. package/dist/ideaSize-RKbms8K6.d.ts +11 -0
  36. package/dist/index-CcF0Jvmb.d.ts +99 -0
  37. package/dist/index-Dt--T2l8.d.cts +99 -0
  38. package/dist/index.cjs +1636 -961
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.d.cts +350 -27
  41. package/dist/index.d.ts +350 -27
  42. package/dist/index.js +434 -179
  43. package/dist/index.js.map +1 -1
  44. package/dist/{document-B3hnNr-F.d.cts → layer-B2A3Ki48.d.cts} +2 -16
  45. package/dist/{document-B3hnNr-F.d.ts → layer-B2A3Ki48.d.ts} +2 -16
  46. package/dist/layout/index.d.cts +2 -1
  47. package/dist/layout/index.d.ts +2 -1
  48. package/dist/mindmap-BO3YD5qu.d.cts +182 -0
  49. package/dist/mindmap-D0Of0jaZ.d.ts +182 -0
  50. package/dist/parser/index.cjs +745 -179
  51. package/dist/parser/index.cjs.map +1 -1
  52. package/dist/parser/index.d.cts +23 -8
  53. package/dist/parser/index.d.ts +23 -8
  54. package/dist/parser/index.js +7 -2
  55. package/dist/performance/index.cjs +13 -0
  56. package/dist/performance/index.cjs.map +1 -1
  57. package/dist/performance/index.js +2 -2
  58. package/dist/theme/index.cjs +884 -0
  59. package/dist/theme/index.cjs.map +1 -0
  60. package/dist/theme/index.d.cts +2 -0
  61. package/dist/theme/index.d.ts +2 -0
  62. package/dist/theme/index.js +53 -0
  63. package/dist/types/index.d.cts +4 -2
  64. package/dist/types/index.d.ts +4 -2
  65. package/dist/viewport/index.cjs +17 -6
  66. package/dist/viewport/index.cjs.map +1 -1
  67. package/dist/viewport/index.d.cts +6 -4
  68. package/dist/viewport/index.d.ts +6 -4
  69. package/dist/viewport/index.js +2 -2
  70. package/licenses/visualli-design-system/LICENSE +9 -0
  71. package/licenses/visualli-design-system/NOTICE.md +6 -0
  72. package/package.json +12 -4
  73. package/src/config/README.md +2 -4
  74. package/src/config/USAGE_EXAMPLES.md +0 -4
  75. package/src/config/index.ts +3 -4
  76. package/src/constants/index.ts +1 -1
  77. package/src/constants/layout.ts +11 -0
  78. package/src/constants/performanceConstants.ts +8 -27
  79. package/src/generated/README.md +12 -0
  80. package/src/generated/designSystem.ts +758 -0
  81. package/src/generated/geometry/blob.ts +99 -0
  82. package/src/generated/geometry/blobShapes.ts +4 -0
  83. package/src/generated/geometry/color.ts +37 -0
  84. package/src/generated/geometry/container.ts +84 -0
  85. package/src/generated/geometry/detail.ts +22 -0
  86. package/src/generated/geometry/idea.ts +56 -0
  87. package/src/generated/geometry/interaction.ts +122 -0
  88. package/src/generated/geometry/motion.ts +140 -0
  89. package/src/index.ts +18 -1
  90. package/src/parser/configUtils.ts +12 -19
  91. package/src/parser/visualliConverter.ts +71 -112
  92. package/src/parser/visualliParser.ts +16 -1
  93. package/src/rendering/culling.ts +16 -12
  94. package/src/rendering/ideaSize.ts +21 -0
  95. package/src/rendering/nodeGeometry.ts +97 -0
  96. package/src/theme/index.ts +136 -0
  97. package/src/types/document.ts +9 -0
  98. package/src/types/layer.ts +1 -1
  99. package/src/types/mindmap.ts +13 -0
  100. package/src/utils/navigation.ts +33 -63
  101. package/src/viewport/viewportUtils.ts +6 -4
  102. package/dist/animations/index.cjs +0 -146
  103. package/dist/animations/index.cjs.map +0 -1
  104. package/dist/animations/index.d.cts +0 -81
  105. package/dist/animations/index.d.ts +0 -81
  106. package/dist/animations/index.js +0 -35
  107. package/dist/chunk-6NXADJK2.js.map +0 -1
  108. package/dist/chunk-F36SMC3K.js +0 -106
  109. package/dist/chunk-F36SMC3K.js.map +0 -1
  110. package/dist/chunk-G5H3P4YZ.js +0 -273
  111. package/dist/chunk-G5H3P4YZ.js.map +0 -1
  112. package/dist/chunk-LDJRGT2Q.js +0 -163
  113. package/dist/chunk-LDJRGT2Q.js.map +0 -1
  114. package/dist/chunk-LJYSKSCE.js.map +0 -1
  115. package/dist/chunk-LNTJTDB2.js +0 -349
  116. package/dist/chunk-LNTJTDB2.js.map +0 -1
  117. package/dist/mindmap-DWS0WZT_.d.cts +0 -118
  118. package/dist/mindmap-DWS0WZT_.d.ts +0 -118
  119. package/src/animations/constants.ts +0 -72
  120. package/src/animations/easing.ts +0 -70
  121. package/src/animations/index.ts +0 -2
  122. package/src/config/blobShapes.ts +0 -146
  123. package/src/config/textScaling.ts +0 -54
  124. package/src/constants/design.ts +0 -281
  125. /package/dist/{chunk-PDP5CVUL.js.map → chunk-LOQLNYB3.js.map} +0 -0
  126. /package/dist/{chunk-I75TMOE4.js.map → chunk-P6PKWVYF.js.map} +0 -0
  127. /package/dist/{animations → theme}/index.js.map +0 -0
@@ -1,163 +0,0 @@
1
- // src/constants/performanceConstants.ts
2
- var FPS_TARGET = 60;
3
- var FPS_WARNING_THRESHOLD = 45;
4
- var FPS_CRITICAL_THRESHOLD = 30;
5
- var TARGET_FRAME_TIME = 1e3 / FPS_TARGET;
6
- var MAX_FRAME_TIME = 18;
7
- var FPS_TARGETS = {
8
- PAN_MIN: 30,
9
- ZOOM_TARGET: 60,
10
- WARNING_THRESHOLD: 20
11
- };
12
- var TIMING_THRESHOLDS = {
13
- VIEWPORT_QUERY_MAX: 5,
14
- SPATIAL_UPDATE_MAX: 10,
15
- DRAG_RESPONSE_MAX: 16,
16
- LOAD_5K_TARGET: 2e3,
17
- LOAD_10K_TARGET: 3e3,
18
- VIEWPORT_DEBOUNCE: 100,
19
- SPATIAL_INDEX_BUILD: 50
20
- };
21
- var MEMORY_TARGET_MB = 500;
22
- var MEMORY_WARNING_MB = 600;
23
- var MEMORY_CRITICAL_MB = 800;
24
- var MEMORY_LIMITS = {
25
- MAX_10K_NODES: 500,
26
- MAX_GROWTH_PERCENT: 20,
27
- WARNING_THRESHOLD: 400
28
- };
29
- var VIEWPORT_MARGIN = 0.1;
30
- var MAX_VISIBLE_NODES = 800;
31
- var CULLING_QUERY_TIME_BUDGET = 5;
32
- var RBUSH_MAX_ENTRIES = 16;
33
- var SPATIAL_INDEX_BUILD_BUDGET = 50;
34
- var NODE_MIN_WIDTH = 200;
35
- var NODE_HEIGHT = 80;
36
- var NODE_PADDING = 40;
37
- var CHAR_WIDTH = 8;
38
- var TITLE_MAX_LENGTH = 150;
39
- var CORNER_RADIUS = 8;
40
- var BORDER_WIDTH_NORMAL = 2;
41
- var BORDER_WIDTH_SELECTED = 3;
42
- var COLOR_SELECTED = "#1B2D4F";
43
- var COLOR_BORDER_LIGHT = "#4A3728";
44
- var COLOR_BORDER_DARK = "#FAF6F1";
45
- var COLOR_DEFAULT_NODE = "#FAF6F1";
46
- var ZOOM_MIN = 0.05;
47
- var ZOOM_MAX = 5;
48
- var ZOOM_DEFAULT = 1;
49
- var ZOOM_STEP = 0.1;
50
- var ZOOM_WHEEL_SENSITIVITY = 1e-3;
51
- var ZOOM_NAV_IN_THRESHOLD = 2.7;
52
- var ZOOM_NAV_OUT_THRESHOLD = 0.4;
53
- var TEXT_LABEL_HIDE_BELOW_ZOOM = 0.3;
54
- var QUALITY_HIGH = {
55
- shadows: true,
56
- bezierCurves: true,
57
- animations: true,
58
- textQuality: "high",
59
- antialiasing: true
60
- };
61
- var QUALITY_MEDIUM = {
62
- shadows: false,
63
- bezierCurves: true,
64
- animations: true,
65
- textQuality: "medium",
66
- antialiasing: true
67
- };
68
- var QUALITY_LOW = {
69
- shadows: false,
70
- bezierCurves: false,
71
- animations: false,
72
- textQuality: "low",
73
- antialiasing: false
74
- };
75
- var FPS_SAMPLE_WINDOW = 60;
76
- var FPS_UPDATE_INTERVAL = 1e3;
77
- var MEMORY_CHECK_INTERVAL = 5e3;
78
- var PERFORMANCE_TOAST_COOLDOWN = 1e4;
79
- var FPS_DOWNGRADE_THRESHOLD = 45;
80
- var FPS_UPGRADE_THRESHOLD = 58;
81
- var FPS_STABILIZATION_FRAMES = 180;
82
- var DEFAULT_CANVAS_WIDTH = 1920;
83
- var DEFAULT_CANVAS_HEIGHT = 1080;
84
- var CLICK_THRESHOLD = 5;
85
- var DOUBLE_CLICK_DELAY = 300;
86
- var DRAG_START_DISTANCE = 10;
87
- var MAX_NODES = 2e4;
88
- var CIRCULAR_REFERENCE_MAX_DEPTH = 1e3;
89
- var RESIZE_DEBOUNCE = 300;
90
- var SCROLL_THROTTLE = 16;
91
- var SEARCH_DEBOUNCE = 500;
92
- var NODE_COUNT_THRESHOLDS = {
93
- SPATIAL_INDEX_MIN: 100,
94
- VIEWPORT_CULLING_MIN: 500,
95
- CANVAS_RENDERING_MIN: 2e3,
96
- DOM_RENDERING_MAX: 5e3
97
- };
98
- var VIEWPORT_CONFIG = {
99
- BUFFER_PERCENT: 0.2,
100
- MIN_VISIBLE_NODES: 10
101
- };
102
-
103
- export {
104
- FPS_TARGET,
105
- FPS_WARNING_THRESHOLD,
106
- FPS_CRITICAL_THRESHOLD,
107
- TARGET_FRAME_TIME,
108
- MAX_FRAME_TIME,
109
- FPS_TARGETS,
110
- TIMING_THRESHOLDS,
111
- MEMORY_TARGET_MB,
112
- MEMORY_WARNING_MB,
113
- MEMORY_CRITICAL_MB,
114
- MEMORY_LIMITS,
115
- VIEWPORT_MARGIN,
116
- MAX_VISIBLE_NODES,
117
- CULLING_QUERY_TIME_BUDGET,
118
- RBUSH_MAX_ENTRIES,
119
- SPATIAL_INDEX_BUILD_BUDGET,
120
- NODE_MIN_WIDTH,
121
- NODE_HEIGHT,
122
- NODE_PADDING,
123
- CHAR_WIDTH,
124
- TITLE_MAX_LENGTH,
125
- CORNER_RADIUS,
126
- BORDER_WIDTH_NORMAL,
127
- BORDER_WIDTH_SELECTED,
128
- COLOR_SELECTED,
129
- COLOR_BORDER_LIGHT,
130
- COLOR_BORDER_DARK,
131
- COLOR_DEFAULT_NODE,
132
- ZOOM_MIN,
133
- ZOOM_MAX,
134
- ZOOM_DEFAULT,
135
- ZOOM_STEP,
136
- ZOOM_WHEEL_SENSITIVITY,
137
- ZOOM_NAV_IN_THRESHOLD,
138
- ZOOM_NAV_OUT_THRESHOLD,
139
- TEXT_LABEL_HIDE_BELOW_ZOOM,
140
- QUALITY_HIGH,
141
- QUALITY_MEDIUM,
142
- QUALITY_LOW,
143
- FPS_SAMPLE_WINDOW,
144
- FPS_UPDATE_INTERVAL,
145
- MEMORY_CHECK_INTERVAL,
146
- PERFORMANCE_TOAST_COOLDOWN,
147
- FPS_DOWNGRADE_THRESHOLD,
148
- FPS_UPGRADE_THRESHOLD,
149
- FPS_STABILIZATION_FRAMES,
150
- DEFAULT_CANVAS_WIDTH,
151
- DEFAULT_CANVAS_HEIGHT,
152
- CLICK_THRESHOLD,
153
- DOUBLE_CLICK_DELAY,
154
- DRAG_START_DISTANCE,
155
- MAX_NODES,
156
- CIRCULAR_REFERENCE_MAX_DEPTH,
157
- RESIZE_DEBOUNCE,
158
- SCROLL_THROTTLE,
159
- SEARCH_DEBOUNCE,
160
- NODE_COUNT_THRESHOLDS,
161
- VIEWPORT_CONFIG
162
- };
163
- //# sourceMappingURL=chunk-LDJRGT2Q.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants/performanceConstants.ts"],"sourcesContent":["// ─── 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"],"mappings":";AAIO,IAAM,aAA6B;AACnC,IAAM,wBAA6B;AACnC,IAAM,yBAA6B;AACnC,IAAM,oBAA6B,MAAO;AAC1C,IAAM,iBAA6B;AAGnC,IAAM,cAAc;AAAA,EACzB,SAAmB;AAAA,EACnB,aAAmB;AAAA,EACnB,mBAAmB;AACrB;AAIO,IAAM,oBAAoB;AAAA,EAC/B,oBAAuB;AAAA,EACvB,oBAAuB;AAAA,EACvB,mBAAuB;AAAA,EACvB,gBAAuB;AAAA,EACvB,iBAAuB;AAAA,EACvB,mBAAuB;AAAA,EACvB,qBAAuB;AACzB;AAIO,IAAM,mBAAqB;AAC3B,IAAM,oBAAqB;AAC3B,IAAM,qBAAqB;AAE3B,IAAM,gBAAgB;AAAA,EAC3B,eAAqB;AAAA,EACrB,oBAAqB;AAAA,EACrB,mBAAqB;AACvB;AAIO,IAAM,kBAA2B;AACjC,IAAM,oBAA2B;AACjC,IAAM,4BAA4B;AAIlC,IAAM,oBAA2B;AACjC,IAAM,6BAA6B;AAInC,IAAM,iBAAoB;AAC1B,IAAM,cAAoB;AAC1B,IAAM,eAAoB;AAC1B,IAAM,aAAoB;AAC1B,IAAM,mBAAoB;AAI1B,IAAM,gBAAwB;AAC9B,IAAM,sBAAwB;AAC9B,IAAM,wBAAwB;AAE9B,IAAM,iBAAsB;AAC5B,IAAM,qBAAsB;AAC5B,IAAM,oBAAsB;AAC5B,IAAM,qBAAsB;AAI5B,IAAM,WAAwB;AAC9B,IAAM,WAAwB;AAC9B,IAAM,eAAwB;AAC9B,IAAM,YAAwB;AAC9B,IAAM,yBAAyB;AAE/B,IAAM,wBAAyB;AAC/B,IAAM,yBAAyB;AAC/B,IAAM,6BAA6B;AAInC,IAAM,eAAe;AAAA,EAC1B,SAAc;AAAA,EACd,cAAc;AAAA,EACd,YAAc;AAAA,EACd,aAAc;AAAA,EACd,cAAc;AAChB;AAEO,IAAM,iBAAiB;AAAA,EAC5B,SAAc;AAAA,EACd,cAAc;AAAA,EACd,YAAc;AAAA,EACd,aAAc;AAAA,EACd,cAAc;AAChB;AAEO,IAAM,cAAc;AAAA,EACzB,SAAc;AAAA,EACd,cAAc;AAAA,EACd,YAAc;AAAA,EACd,aAAc;AAAA,EACd,cAAc;AAChB;AAIO,IAAM,oBAA6B;AACnC,IAAM,sBAA6B;AACnC,IAAM,wBAA6B;AACnC,IAAM,6BAA6B;AAInC,IAAM,0BAA6B;AACnC,IAAM,wBAA6B;AACnC,IAAM,2BAA6B;AAInC,IAAM,uBAAwB;AAC9B,IAAM,wBAAwB;AAI9B,IAAM,kBAAuB;AAC7B,IAAM,qBAAuB;AAC7B,IAAM,sBAAuB;AAI7B,IAAM,YAA+B;AACrC,IAAM,+BAA+B;AAIrC,IAAM,kBAAmB;AACzB,IAAM,kBAAmB;AACzB,IAAM,kBAAmB;AAGzB,IAAM,wBAAwB;AAAA,EACnC,mBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,mBAAsB;AACxB;AAGO,IAAM,kBAAkB;AAAA,EAC7B,gBAAkB;AAAA,EAClB,mBAAmB;AACrB;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/viewport/viewportUtils.ts"],"sourcesContent":["// ─── Viewport Utilities ───────────────────────────────────────────────────────\n//\n// Pure functions for viewport bounds calculation, coordinate transforms,\n// pan/zoom operations, and node visibility queries.\n\nimport type { ViewportState } from '../types/mindmap.js';\nimport {\n VIEWPORT_MARGIN,\n DEFAULT_CANVAS_WIDTH,\n DEFAULT_CANVAS_HEIGHT,\n ZOOM_MIN,\n ZOOM_MAX,\n} from '../constants/performanceConstants.js';\n\n// ── Viewport Bounds ───────────────────────────────────────────────────────────\n\nexport interface WorldBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\n/**\n * Calculate the visible world-space bounding box including a margin buffer.\n */\nexport function calculateViewportBounds(\n viewport: ViewportState,\n canvasWidth = DEFAULT_CANVAS_WIDTH,\n canvasHeight = DEFAULT_CANVAS_HEIGHT,\n): WorldBounds {\n const worldW = canvasWidth / viewport.zoomLevel;\n const worldH = canvasHeight / viewport.zoomLevel;\n const mx = worldW * VIEWPORT_MARGIN;\n const my = worldH * VIEWPORT_MARGIN;\n return {\n minX: viewport.centerX - worldW / 2 - mx,\n minY: viewport.centerY - worldH / 2 - my,\n maxX: viewport.centerX + worldW / 2 + mx,\n maxY: viewport.centerY + worldH / 2 + my,\n };\n}\n\n/**\n * Return a new ViewportState with `visibleBounds` recalculated.\n */\nexport function recalculateViewportBounds(\n viewport: ViewportState,\n canvasWidth = DEFAULT_CANVAS_WIDTH,\n canvasHeight = DEFAULT_CANVAS_HEIGHT,\n): ViewportState {\n return {\n ...viewport,\n visibleBounds: calculateViewportBounds(viewport, canvasWidth, canvasHeight),\n };\n}\n\n// ── Coordinate Transforms ─────────────────────────────────────────────────────\n\n/**\n * Convert world-space coordinates to screen-space pixel coordinates.\n */\nexport function worldToScreen(\n worldX: number,\n worldY: number,\n viewport: ViewportState,\n canvasWidth = DEFAULT_CANVAS_WIDTH,\n canvasHeight = DEFAULT_CANVAS_HEIGHT,\n): { x: number; y: number } {\n return {\n x: (worldX - viewport.centerX) * viewport.zoomLevel + canvasWidth / 2,\n y: (worldY - viewport.centerY) * viewport.zoomLevel + canvasHeight / 2,\n };\n}\n\n/**\n * Convert screen-space pixel coordinates to world-space coordinates.\n */\nexport function screenToWorld(\n screenX: number,\n screenY: number,\n viewport: ViewportState,\n canvasWidth = DEFAULT_CANVAS_WIDTH,\n canvasHeight = DEFAULT_CANVAS_HEIGHT,\n): { x: number; y: number } {\n return {\n x: (screenX - canvasWidth / 2) / viewport.zoomLevel + viewport.centerX,\n y: (screenY - canvasHeight / 2) / viewport.zoomLevel + viewport.centerY,\n };\n}\n\n// ── Pan / Zoom ────────────────────────────────────────────────────────────────\n\n/** Clamp zoom to [ZOOM_MIN, ZOOM_MAX]. */\nexport function clampZoom(zoom: number): number {\n return Math.min(ZOOM_MAX, Math.max(ZOOM_MIN, zoom));\n}\n\n/**\n * Pan the viewport by a screen-space delta (positive = right/down).\n */\nexport function panViewport(\n deltaX: number,\n deltaY: number,\n viewport: ViewportState,\n): ViewportState {\n return {\n ...viewport,\n centerX: viewport.centerX - deltaX / viewport.zoomLevel,\n centerY: viewport.centerY - deltaY / viewport.zoomLevel,\n };\n}\n\n/** Teleport the viewport centre to the given world coordinates. */\nexport function setViewportCenter(\n x: number,\n y: number,\n viewport: ViewportState,\n): ViewportState {\n return { ...viewport, centerX: x, centerY: y };\n}\n\n/**\n * Zoom the viewport by a multiplicative delta, optionally around a pivot point.\n *\n * @param delta - Multiplier delta, e.g. 0.1 for +10% zoom\n * @param pivotX - Optional screen-space X pivot\n * @param pivotY - Optional screen-space Y pivot\n */\nexport function zoomViewport(\n delta: number,\n viewport: ViewportState,\n pivotX?: number,\n pivotY?: number,\n canvasWidth = DEFAULT_CANVAS_WIDTH,\n canvasHeight = DEFAULT_CANVAS_HEIGHT,\n): ViewportState {\n const newZoom = clampZoom(viewport.zoomLevel * (1 + delta));\n\n let cx = viewport.centerX;\n let cy = viewport.centerY;\n\n if (pivotX !== undefined && pivotY !== undefined) {\n const worldPivot = screenToWorld(pivotX, pivotY, viewport, canvasWidth, canvasHeight);\n cx = worldPivot.x - (pivotX - canvasWidth / 2) / newZoom;\n cy = worldPivot.y - (pivotY - canvasHeight / 2) / newZoom;\n }\n\n return { ...viewport, centerX: cx, centerY: cy, zoomLevel: newZoom };\n}\n\n/**\n * Create a viewport centred on a node (world coordinates) at the given zoom level.\n */\nexport function focusOnNode(\n nodeX: number,\n nodeY: number,\n zoom: number,\n): ViewportState {\n const clamped = clampZoom(zoom);\n return {\n centerX: nodeX,\n centerY: nodeY,\n zoomLevel: clamped,\n rotation: 0,\n visibleBounds: calculateViewportBounds(\n { centerX: nodeX, centerY: nodeY, zoomLevel: clamped, rotation: 0, visibleBounds: { minX: 0, minY: 0, maxX: 0, maxY: 0 } },\n ),\n };\n}\n\n// ── Visibility ────────────────────────────────────────────────────────────────\n\n/**\n * Test whether a world-space AABB intersects the viewport's visible bounds.\n */\nexport function isNodeInViewport(\n nodeX: number,\n nodeY: number,\n nodeWidth: number,\n nodeHeight: number,\n viewport: ViewportState,\n canvasWidth = DEFAULT_CANVAS_WIDTH,\n canvasHeight = DEFAULT_CANVAS_HEIGHT,\n): boolean {\n const bounds = calculateViewportBounds(viewport, canvasWidth, canvasHeight);\n const hw = nodeWidth / 2;\n const hh = nodeHeight / 2;\n return !(\n nodeX + hw < bounds.minX ||\n nodeX - hw > bounds.maxX ||\n nodeY + hh < bounds.minY ||\n nodeY - hh > bounds.maxY\n );\n}\n"],"mappings":";;;;;;;;;AA0BO,SAAS,wBACd,UACA,cAAe,sBACf,eAAe,uBACF;AACb,QAAM,SAAS,cAAe,SAAS;AACvC,QAAM,SAAS,eAAe,SAAS;AACvC,QAAM,KAAK,SAAS;AACpB,QAAM,KAAK,SAAS;AACpB,SAAO;AAAA,IACL,MAAM,SAAS,UAAU,SAAS,IAAI;AAAA,IACtC,MAAM,SAAS,UAAU,SAAS,IAAI;AAAA,IACtC,MAAM,SAAS,UAAU,SAAS,IAAI;AAAA,IACtC,MAAM,SAAS,UAAU,SAAS,IAAI;AAAA,EACxC;AACF;AAKO,SAAS,0BACd,UACA,cAAe,sBACf,eAAe,uBACA;AACf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe,wBAAwB,UAAU,aAAa,YAAY;AAAA,EAC5E;AACF;AAOO,SAAS,cACd,QACA,QACA,UACA,cAAe,sBACf,eAAe,uBACW;AAC1B,SAAO;AAAA,IACL,IAAI,SAAS,SAAS,WAAW,SAAS,YAAY,cAAe;AAAA,IACrE,IAAI,SAAS,SAAS,WAAW,SAAS,YAAY,eAAe;AAAA,EACvE;AACF;AAKO,SAAS,cACd,SACA,SACA,UACA,cAAe,sBACf,eAAe,uBACW;AAC1B,SAAO;AAAA,IACL,IAAI,UAAU,cAAe,KAAK,SAAS,YAAY,SAAS;AAAA,IAChE,IAAI,UAAU,eAAe,KAAK,SAAS,YAAY,SAAS;AAAA,EAClE;AACF;AAKO,SAAS,UAAU,MAAsB;AAC9C,SAAO,KAAK,IAAI,UAAU,KAAK,IAAI,UAAU,IAAI,CAAC;AACpD;AAKO,SAAS,YACd,QACA,QACA,UACe;AACf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,SAAS,UAAU,SAAS,SAAS;AAAA,IAC9C,SAAS,SAAS,UAAU,SAAS,SAAS;AAAA,EAChD;AACF;AAGO,SAAS,kBACd,GACA,GACA,UACe;AACf,SAAO,EAAE,GAAG,UAAU,SAAS,GAAG,SAAS,EAAE;AAC/C;AASO,SAAS,aACd,OACA,UACA,QACA,QACA,cAAe,sBACf,eAAe,uBACA;AACf,QAAM,UAAU,UAAU,SAAS,aAAa,IAAI,MAAM;AAE1D,MAAI,KAAK,SAAS;AAClB,MAAI,KAAK,SAAS;AAElB,MAAI,WAAW,UAAa,WAAW,QAAW;AAChD,UAAM,aAAa,cAAc,QAAQ,QAAQ,UAAU,aAAa,YAAY;AACpF,SAAK,WAAW,KAAK,SAAS,cAAe,KAAK;AAClD,SAAK,WAAW,KAAK,SAAS,eAAe,KAAK;AAAA,EACpD;AAEA,SAAO,EAAE,GAAG,UAAU,SAAS,IAAI,SAAS,IAAI,WAAW,QAAQ;AACrE;AAKO,SAAS,YACd,OACA,OACA,MACe;AACf,QAAM,UAAU,UAAU,IAAI;AAC9B,SAAO;AAAA,IACL,SAAU;AAAA,IACV,SAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAU;AAAA,IACV,eAAe;AAAA,MACb,EAAE,SAAS,OAAO,SAAS,OAAO,WAAW,SAAS,UAAU,GAAG,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,EAAE;AAAA,IAC3H;AAAA,EACF;AACF;AAOO,SAAS,iBACd,OACA,OACA,WACA,YACA,UACA,cAAe,sBACf,eAAe,uBACN;AACT,QAAM,SAAS,wBAAwB,UAAU,aAAa,YAAY;AAC1E,QAAM,KAAK,YAAa;AACxB,QAAM,KAAK,aAAa;AACxB,SAAO,EACL,QAAQ,KAAK,OAAO,QACpB,QAAQ,KAAK,OAAO,QACpB,QAAQ,KAAK,OAAO,QACpB,QAAQ,KAAK,OAAO;AAExB;","names":[]}
@@ -1,349 +0,0 @@
1
- import {
2
- NODE_HEIGHT
3
- } from "./chunk-LDJRGT2Q.js";
4
-
5
- // src/config/blobShapes.ts
6
- var BLOB_LAYER_CONFIG = [
7
- { opacity: 0.3, rotation: -15, scaleUp: 1.3, strokeWidth: 3, dash: [6, 4] },
8
- // Layer #3 (outermost)
9
- { opacity: 0.4, rotation: -10, scaleUp: 1.2, strokeWidth: 1, dash: void 0 },
10
- // Layer #2
11
- { opacity: 0.5, rotation: -5, scaleUp: 1.1, strokeWidth: 2, dash: void 0 }
12
- // Layer #1
13
- ];
14
- var NODE_LAYER_CONFIG = { opacity: 1, rotation: 0, strokeWidth: 3 };
15
- var ALL_BLOB_SHAPES = [
16
- // Shape 0 · Blob 1
17
- [
18
- { x: 1.12, y: 0 },
19
- { x: 0.86, y: 0.56 },
20
- { x: 0.46, y: 0.94 },
21
- { x: -0.08, y: 1.06 },
22
- { x: -0.68, y: 0.82 },
23
- { x: -0.96, y: 0.08 },
24
- { x: -0.55, y: -0.82 },
25
- { x: 0.04, y: -1.02 },
26
- { x: 0.72, y: -0.8 },
27
- { x: 1.08, y: -0.38 }
28
- ],
29
- // Shape 1 · Blob 2
30
- [
31
- { x: -0.489, y: -0.625 },
32
- { x: -0.384, y: -0.716 },
33
- { x: -0.285, y: -0.792 },
34
- { x: -0.189, y: -0.855 },
35
- { x: -0.09, y: -0.903 },
36
- { x: 0.014, y: -0.932 },
37
- { x: 0.129, y: -0.94 },
38
- { x: 0.255, y: -0.924 },
39
- { x: 0.412, y: -0.876 },
40
- { x: 0.516, y: -0.832 },
41
- { x: 0.612, y: -0.78 },
42
- { x: 0.695, y: -0.725 },
43
- { x: 0.767, y: -0.666 },
44
- { x: 0.83, y: -0.606 },
45
- { x: 0.885, y: -0.546 },
46
- { x: 0.933, y: -0.486 },
47
- { x: 0.979, y: -0.425 },
48
- { x: 1.006, y: -0.385 },
49
- { x: 1.034, y: -0.334 },
50
- { x: 1.058, y: -0.276 },
51
- { x: 1.078, y: -0.209 },
52
- { x: 1.092, y: -0.133 },
53
- { x: 1.101, y: -0.046 },
54
- { x: 1.102, y: 0.052 },
55
- { x: 1.094, y: 0.173 },
56
- { x: 1.083, y: 0.244 },
57
- { x: 1.063, y: 0.324 },
58
- { x: 1.034, y: 0.401 },
59
- { x: 0.996, y: 0.477 },
60
- { x: 0.948, y: 0.549 },
61
- { x: 0.889, y: 0.617 },
62
- { x: 0.82, y: 0.681 },
63
- { x: 0.735, y: 0.741 },
64
- { x: 0.658, y: 0.783 },
65
- { x: 0.569, y: 0.822 },
66
- { x: 0.474, y: 0.855 },
67
- { x: 0.372, y: 0.882 },
68
- { x: 0.265, y: 0.904 },
69
- { x: 0.156, y: 0.92 },
70
- { x: 0.046, y: 0.931 },
71
- { x: -0.069, y: 0.938 },
72
- { x: -0.155, y: 0.935 },
73
- { x: -0.25, y: 0.919 },
74
- { x: -0.346, y: 0.89 },
75
- { x: -0.443, y: 0.851 },
76
- { x: -0.539, y: 0.8 },
77
- { x: -0.633, y: 0.738 },
78
- { x: -0.723, y: 0.667 },
79
- { x: -0.808, y: 0.585 },
80
- { x: -0.882, y: 0.501 },
81
- { x: -0.944, y: 0.421 },
82
- { x: -0.994, y: 0.343 },
83
- { x: -1.034, y: 0.267 },
84
- { x: -1.064, y: 0.192 },
85
- { x: -1.085, y: 0.12 },
86
- { x: -1.097, y: 0.042 },
87
- { x: -1.102, y: 1e-3 },
88
- { x: -1.09, y: -0.243 },
89
- { x: -1.05, y: -0.365 },
90
- { x: -0.99, y: -0.441 },
91
- { x: -0.911, y: -0.479 },
92
- { x: -0.819, y: -0.499 },
93
- { x: -0.715, y: -0.517 },
94
- { x: -0.605, y: -0.551 }
95
- ],
96
- // Shape 2 · Blob 3
97
- [
98
- { x: 3e-3, y: -0.97 },
99
- { x: 0.163, y: -0.984 },
100
- { x: 0.286, y: -1.028 },
101
- { x: 0.389, y: -1.096 },
102
- { x: 0.488, y: -1.174 },
103
- { x: 0.597, y: -1.21 },
104
- { x: 0.728, y: -1.165 },
105
- { x: 0.867, y: -1.036 },
106
- { x: 0.996, y: -0.839 },
107
- { x: 1.098, y: -0.59 },
108
- { x: 1.158, y: -0.304 },
109
- { x: 1.153, y: 0.012 },
110
- { x: 1.08, y: 0.336 },
111
- { x: 0.944, y: 0.639 },
112
- { x: 0.756, y: 0.889 },
113
- { x: 0.484, y: 1.072 },
114
- { x: 0.339, y: 1.079 },
115
- { x: 0.219, y: 1.051 },
116
- { x: 0.131, y: 0.994 },
117
- { x: 0.059, y: 0.939 },
118
- { x: 8e-3, y: 0.915 },
119
- { x: -0.105, y: 0.931 },
120
- { x: -0.176, y: 0.965 },
121
- { x: -0.249, y: 1.005 },
122
- { x: -0.345, y: 1.039 },
123
- { x: -0.497, y: 1.055 },
124
- { x: -0.672, y: 1.032 },
125
- { x: -0.817, y: 0.952 },
126
- { x: -0.945, y: 0.81 },
127
- { x: -1.054, y: 0.6 },
128
- { x: -1.16, y: 0.302 },
129
- { x: -1.187, y: -0.011 },
130
- { x: -1.165, y: -0.326 },
131
- { x: -1.097, y: -0.599 },
132
- { x: -0.991, y: -0.838 },
133
- { x: -0.852, y: -0.912 },
134
- { x: -0.695, y: -0.958 },
135
- { x: -0.53, y: -0.988 },
136
- { x: -0.357, y: -0.992 },
137
- { x: -0.18, y: -0.983 }
138
- ],
139
- // Shape 3 · Blob 4
140
- [
141
- { x: -0.734, y: -1.127 },
142
- { x: -0.656, y: -1.146 },
143
- { x: -0.567, y: -1.142 },
144
- { x: -0.468, y: -1.115 },
145
- { x: -0.358, y: -1.079 },
146
- { x: -0.238, y: -1.034 },
147
- { x: -0.107, y: -0.989 },
148
- { x: 0.035, y: -0.953 },
149
- { x: 0.188, y: -0.929 },
150
- { x: 0.325, y: -0.916 },
151
- { x: 0.484, y: -0.896 },
152
- { x: 0.65, y: -0.854 },
153
- { x: 0.811, y: -0.77 },
154
- { x: 0.955, y: -0.631 },
155
- { x: 1.068, y: -0.422 },
156
- { x: 1.138, y: -0.126 },
157
- { x: 1.152, y: 0.272 },
158
- { x: 1.121, y: 0.451 },
159
- { x: 1.046, y: 0.602 },
160
- { x: 0.928, y: 0.727 },
161
- { x: 0.767, y: 0.833 },
162
- { x: 0.565, y: 0.925 },
163
- { x: 0.323, y: 1.001 },
164
- { x: 0.042, y: 1.075 },
165
- { x: -0.277, y: 1.142 },
166
- { x: -0.368, y: 1.147 },
167
- { x: -0.475, y: 1.136 },
168
- { x: -0.589, y: 1.104 },
169
- { x: -0.704, y: 1.05 },
170
- { x: -0.815, y: 0.973 },
171
- { x: -0.913, y: 0.871 },
172
- { x: -0.993, y: 0.746 },
173
- { x: -1.048, y: 0.593 },
174
- { x: -1.109, y: 0.298 },
175
- { x: -1.145, y: 0.018 },
176
- { x: -1.154, y: -0.243 },
177
- { x: -1.135, y: -0.482 },
178
- { x: -1.085, y: -0.695 },
179
- { x: -1.003, y: -0.874 },
180
- { x: -0.886, y: -1.02 }
181
- ],
182
- // Shape 4 · Blob 5
183
- [
184
- { x: -0.734, y: 1.127 },
185
- { x: -0.656, y: 1.146 },
186
- { x: -0.567, y: 1.142 },
187
- { x: -0.468, y: 1.115 },
188
- { x: -0.358, y: 1.079 },
189
- { x: -0.238, y: 1.034 },
190
- { x: -0.107, y: 0.989 },
191
- { x: 0.035, y: 0.953 },
192
- { x: 0.188, y: 0.929 },
193
- { x: 0.325, y: 0.916 },
194
- { x: 0.484, y: 0.896 },
195
- { x: 0.65, y: 0.854 },
196
- { x: 0.811, y: 0.77 },
197
- { x: 0.955, y: 0.631 },
198
- { x: 1.068, y: 0.422 },
199
- { x: 1.138, y: 0.126 },
200
- { x: 1.152, y: -0.272 },
201
- { x: 1.121, y: -0.451 },
202
- { x: 1.046, y: -0.602 },
203
- { x: 0.928, y: -0.727 },
204
- { x: 0.767, y: -0.833 },
205
- { x: 0.565, y: -0.925 },
206
- { x: 0.323, y: -1.001 },
207
- { x: 0.042, y: -1.075 },
208
- { x: -0.277, y: -1.142 },
209
- { x: -0.368, y: -1.147 },
210
- { x: -0.475, y: -1.136 },
211
- { x: -0.589, y: -1.104 },
212
- { x: -0.704, y: -1.05 },
213
- { x: -0.815, y: -0.973 },
214
- { x: -0.913, y: -0.871 },
215
- { x: -0.993, y: -0.746 },
216
- { x: -1.048, y: -0.593 },
217
- { x: -1.109, y: -0.298 },
218
- { x: -1.145, y: -0.018 },
219
- { x: -1.154, y: 0.243 },
220
- { x: -1.135, y: 0.482 },
221
- { x: -1.085, y: 0.695 },
222
- { x: -1.003, y: 0.874 },
223
- { x: -0.886, y: 1.02 }
224
- ],
225
- // Shape 5 · Blob 6
226
- [
227
- { x: 1e-3, y: -1.006 },
228
- { x: 0.134, y: -1.001 },
229
- { x: 0.262, y: -1.024 },
230
- { x: 0.382, y: -1.073 },
231
- { x: 0.498, y: -1.107 },
232
- { x: 0.614, y: -1.105 },
233
- { x: 0.733, y: -1.049 },
234
- { x: 0.85, y: -0.932 },
235
- { x: 0.953, y: -0.755 },
236
- { x: 1.03, y: -0.529 },
237
- { x: 1.067, y: -0.265 },
238
- { x: 1.054, y: 0.018 },
239
- { x: 0.986, y: 0.3 },
240
- { x: 0.868, y: 0.557 },
241
- { x: 0.715, y: 0.766 },
242
- { x: 0.55, y: 0.909 },
243
- { x: 0.396, y: 0.984 },
244
- { x: 0.262, y: 1.005 },
245
- { x: 0.148, y: 1.003 },
246
- { x: 0.037, y: 1.008 },
247
- { x: -0.083, y: 1.04 },
248
- { x: -0.22, y: 1.118 },
249
- { x: -0.36, y: 1.192 },
250
- { x: -0.5, y: 1.234 },
251
- { x: -0.65, y: 1.175 },
252
- { x: -0.81, y: 1.045 },
253
- { x: -0.99, y: 0.855 },
254
- { x: -1.14, y: 0.61 },
255
- { x: -1.24, y: 0.33 },
256
- { x: -1.27, y: 0.04 },
257
- { x: -1.275, y: -0.25 },
258
- { x: -1.225, y: -0.5 },
259
- { x: -1.08, y: -0.72 },
260
- { x: -0.89, y: -0.92 },
261
- { x: -0.734, y: -1.053 },
262
- { x: -0.614, y: -1.112 },
263
- { x: -0.498, y: -1.127 },
264
- { x: -0.381, y: -1.11 },
265
- { x: -0.261, y: -1.095 },
266
- { x: -0.133, y: -1.058 },
267
- { x: 1e-3, y: -1.01 },
268
- { x: 0.134, y: -1.001 }
269
- ]
270
- ];
271
- var ACTIVE_BLOB_TYPES = [0, 1, 2, 3, 4, 5];
272
- var BLOB_TEXT_OFFSETS = [0, 0, 0, 0, 0, -0.1];
273
- function getBlobTypeForLayer(level) {
274
- const numTypes = ACTIVE_BLOB_TYPES.length;
275
- if (numTypes <= 1) return ACTIVE_BLOB_TYPES[0] ?? 0;
276
- let currentType = 0;
277
- for (let i = 1; i <= level; i++) {
278
- const pseudoRandom = Math.floor(Math.abs(Math.sin((i + 1) * 12.9898) * 43758.5453));
279
- const stepOffset = pseudoRandom % (numTypes - 1) + 1;
280
- currentType = (currentType + stepOffset) % numTypes;
281
- }
282
- return ACTIVE_BLOB_TYPES[currentType];
283
- }
284
- function drawBlobPath(ctx, radiusX, radiusY, blobType) {
285
- const srcPts = ALL_BLOB_SHAPES[blobType] ?? ALL_BLOB_SHAPES[0];
286
- const pts = srcPts.map((p) => ({ x: p.x * radiusX, y: p.y * radiusY }));
287
- ctx.beginPath();
288
- const last = pts[pts.length - 1];
289
- const first = pts[0];
290
- ctx.moveTo((last.x + first.x) / 2, (last.y + first.y) / 2);
291
- for (let i = 0; i < pts.length; i++) {
292
- const curr = pts[i];
293
- const next = pts[(i + 1) % pts.length];
294
- ctx.quadraticCurveTo(curr.x, curr.y, (curr.x + next.x) / 2, (curr.y + next.y) / 2);
295
- }
296
- ctx.closePath();
297
- }
298
-
299
- // src/config/textScaling.ts
300
- var NODE_TEXT_BASE_FONT_PX = 28;
301
- var DESCRIPTION_TEXT_BASE_FONT_PX = 12;
302
- var CONTAINER_LABEL_BASE_FONT_PX = 24;
303
- var EDGE_LABEL_BASE_FONT_PX = 18;
304
- var OVERLAY_FONT_UPPER_BOOST_PX = 8;
305
- var NODE_TEXT_SAFE_BLOB_FILL_RATIO = 0.88;
306
- function computeNodeTextWorldScale(nodeWidth, zoomLevel) {
307
- const safeZoom = Math.max(zoomLevel, 1e-4);
308
- const baseRadiusX = nodeWidth / 2;
309
- const baseRadiusY = Math.max(NODE_HEIGHT * 1.6 / 2, baseRadiusX * 0.74);
310
- const textNaturalWidth = nodeWidth - 40;
311
- const textNaturalHeight = NODE_HEIGHT - 20;
312
- const maxScaleX = baseRadiusX * 2 * NODE_TEXT_SAFE_BLOB_FILL_RATIO / Math.max(textNaturalWidth, 1);
313
- const maxScaleY = baseRadiusY * 2 * NODE_TEXT_SAFE_BLOB_FILL_RATIO / Math.max(textNaturalHeight, 1);
314
- const fitScale = Math.max(0.01, Math.min(maxScaleX, maxScaleY));
315
- return Math.min(1 / safeZoom, fitScale);
316
- }
317
- function computeNodeTextScreenScale(nodeWidth, zoomLevel) {
318
- return computeNodeTextWorldScale(nodeWidth, zoomLevel) * zoomLevel;
319
- }
320
- function computeOverlayScale(zoomLevel) {
321
- const safeZoom = Math.max(zoomLevel, 1e-4);
322
- const inverseScale = 1 / safeZoom;
323
- const maxScale = (NODE_TEXT_BASE_FONT_PX + OVERLAY_FONT_UPPER_BOOST_PX) / NODE_TEXT_BASE_FONT_PX;
324
- return Math.min(Math.max(inverseScale, 1), maxScale);
325
- }
326
- function computeEdgeLabelScale(zoomLevel) {
327
- const safeZoom = Math.max(zoomLevel, 1e-4);
328
- return Math.min(Math.max(EDGE_LABEL_BASE_FONT_PX / safeZoom, 10), 32);
329
- }
330
-
331
- export {
332
- BLOB_LAYER_CONFIG,
333
- NODE_LAYER_CONFIG,
334
- ALL_BLOB_SHAPES,
335
- ACTIVE_BLOB_TYPES,
336
- BLOB_TEXT_OFFSETS,
337
- getBlobTypeForLayer,
338
- drawBlobPath,
339
- NODE_TEXT_BASE_FONT_PX,
340
- DESCRIPTION_TEXT_BASE_FONT_PX,
341
- CONTAINER_LABEL_BASE_FONT_PX,
342
- EDGE_LABEL_BASE_FONT_PX,
343
- OVERLAY_FONT_UPPER_BOOST_PX,
344
- computeNodeTextWorldScale,
345
- computeNodeTextScreenScale,
346
- computeOverlayScale,
347
- computeEdgeLabelScale
348
- };
349
- //# sourceMappingURL=chunk-LNTJTDB2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/blobShapes.ts","../src/config/textScaling.ts"],"sourcesContent":["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","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":[]}