@visualli/core 0.1.5 → 0.1.7

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 (85) hide show
  1. package/dist/animations/index.cjs +146 -0
  2. package/dist/animations/index.cjs.map +1 -0
  3. package/dist/animations/index.d.cts +81 -0
  4. package/dist/animations/index.d.ts +81 -0
  5. package/dist/animations/index.js +35 -0
  6. package/dist/animations/index.js.map +1 -0
  7. package/dist/chunk-6NXADJK2.js +562 -0
  8. package/dist/chunk-6NXADJK2.js.map +1 -0
  9. package/dist/chunk-F36SMC3K.js +106 -0
  10. package/dist/chunk-F36SMC3K.js.map +1 -0
  11. package/dist/chunk-G5H3P4YZ.js +273 -0
  12. package/dist/chunk-G5H3P4YZ.js.map +1 -0
  13. package/dist/chunk-GQMFBYLK.js +81 -0
  14. package/dist/chunk-GQMFBYLK.js.map +1 -0
  15. package/dist/chunk-I75TMOE4.js +108 -0
  16. package/dist/chunk-I75TMOE4.js.map +1 -0
  17. package/dist/chunk-LDJRGT2Q.js +163 -0
  18. package/dist/chunk-LDJRGT2Q.js.map +1 -0
  19. package/dist/chunk-LI3BVD6H.js +98 -0
  20. package/dist/chunk-LI3BVD6H.js.map +1 -0
  21. package/dist/chunk-LJYSKSCE.js +95 -0
  22. package/dist/chunk-LJYSKSCE.js.map +1 -0
  23. package/dist/chunk-LNTJTDB2.js +349 -0
  24. package/dist/chunk-LNTJTDB2.js.map +1 -0
  25. package/dist/chunk-PDP5CVUL.js +139 -0
  26. package/dist/chunk-PDP5CVUL.js.map +1 -0
  27. package/dist/chunk-VLGR5PZX.js +1 -0
  28. package/dist/chunk-VLGR5PZX.js.map +1 -0
  29. package/dist/config/index.cjs +391 -0
  30. package/dist/config/index.cjs.map +1 -0
  31. package/dist/config/index.d.cts +77 -0
  32. package/dist/config/index.d.ts +77 -0
  33. package/dist/config/index.js +38 -0
  34. package/dist/config/index.js.map +1 -0
  35. package/dist/constants/index.cjs +642 -0
  36. package/dist/constants/index.cjs.map +1 -0
  37. package/dist/constants/index.d.cts +448 -0
  38. package/dist/constants/index.d.ts +448 -0
  39. package/dist/constants/index.js +183 -0
  40. package/dist/constants/index.js.map +1 -0
  41. package/dist/document-B3hnNr-F.d.cts +73 -0
  42. package/dist/document-B3hnNr-F.d.ts +73 -0
  43. package/dist/index.cjs +32 -32
  44. package/dist/index.cjs.map +1 -1
  45. package/dist/index.d.cts +15 -1044
  46. package/dist/index.d.ts +15 -1044
  47. package/dist/index.js +179 -1747
  48. package/dist/index.js.map +1 -1
  49. package/dist/layout/index.cjs +210 -0
  50. package/dist/layout/index.cjs.map +1 -0
  51. package/dist/layout/index.d.cts +80 -0
  52. package/dist/layout/index.d.ts +80 -0
  53. package/dist/layout/index.js +25 -0
  54. package/dist/layout/index.js.map +1 -0
  55. package/dist/mindmap-DWS0WZT_.d.cts +118 -0
  56. package/dist/mindmap-DWS0WZT_.d.ts +118 -0
  57. package/dist/parser/index.cjs +739 -0
  58. package/dist/parser/index.cjs.map +1 -0
  59. package/dist/parser/index.d.cts +87 -0
  60. package/dist/parser/index.d.ts +87 -0
  61. package/dist/parser/index.js +43 -0
  62. package/dist/parser/index.js.map +1 -0
  63. package/dist/performance/index.cjs +167 -0
  64. package/dist/performance/index.cjs.map +1 -0
  65. package/dist/performance/index.d.cts +40 -0
  66. package/dist/performance/index.d.ts +40 -0
  67. package/dist/performance/index.js +12 -0
  68. package/dist/performance/index.js.map +1 -0
  69. package/dist/types/index.cjs +19 -0
  70. package/dist/types/index.cjs.map +1 -0
  71. package/dist/types/index.d.cts +8 -0
  72. package/dist/types/index.d.ts +8 -0
  73. package/dist/types/index.js +2 -0
  74. package/dist/types/index.js.map +1 -0
  75. package/dist/viewport/index.cjs +131 -0
  76. package/dist/viewport/index.cjs.map +1 -0
  77. package/dist/viewport/index.d.cts +56 -0
  78. package/dist/viewport/index.d.ts +56 -0
  79. package/dist/viewport/index.js +26 -0
  80. package/dist/viewport/index.js.map +1 -0
  81. package/package.json +7 -2
  82. package/src/config/README.md +59 -0
  83. package/src/config/USAGE_EXAMPLES.md +285 -0
  84. package/src/config/index.ts +7 -0
  85. package/src/index.ts +1 -2
@@ -0,0 +1,391 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/config/index.ts
21
+ var config_exports = {};
22
+ __export(config_exports, {
23
+ ACTIVE_BLOB_TYPES: () => ACTIVE_BLOB_TYPES,
24
+ ALL_BLOB_SHAPES: () => ALL_BLOB_SHAPES,
25
+ BLOB_LAYER_CONFIG: () => BLOB_LAYER_CONFIG,
26
+ BLOB_TEXT_OFFSETS: () => BLOB_TEXT_OFFSETS,
27
+ CONTAINER_LABEL_BASE_FONT_PX: () => CONTAINER_LABEL_BASE_FONT_PX,
28
+ DESCRIPTION_TEXT_BASE_FONT_PX: () => DESCRIPTION_TEXT_BASE_FONT_PX,
29
+ EDGE_LABEL_BASE_FONT_PX: () => EDGE_LABEL_BASE_FONT_PX,
30
+ NODE_LAYER_CONFIG: () => NODE_LAYER_CONFIG,
31
+ NODE_TEXT_BASE_FONT_PX: () => NODE_TEXT_BASE_FONT_PX,
32
+ OVERLAY_FONT_UPPER_BOOST_PX: () => OVERLAY_FONT_UPPER_BOOST_PX,
33
+ computeEdgeLabelScale: () => computeEdgeLabelScale,
34
+ computeNodeTextScreenScale: () => computeNodeTextScreenScale,
35
+ computeNodeTextWorldScale: () => computeNodeTextWorldScale,
36
+ computeOverlayScale: () => computeOverlayScale,
37
+ drawBlobPath: () => drawBlobPath,
38
+ getBlobTypeForLayer: () => getBlobTypeForLayer
39
+ });
40
+ module.exports = __toCommonJS(config_exports);
41
+
42
+ // src/config/blobShapes.ts
43
+ var BLOB_LAYER_CONFIG = [
44
+ { opacity: 0.3, rotation: -15, scaleUp: 1.3, strokeWidth: 3, dash: [6, 4] },
45
+ // Layer #3 (outermost)
46
+ { opacity: 0.4, rotation: -10, scaleUp: 1.2, strokeWidth: 1, dash: void 0 },
47
+ // Layer #2
48
+ { opacity: 0.5, rotation: -5, scaleUp: 1.1, strokeWidth: 2, dash: void 0 }
49
+ // Layer #1
50
+ ];
51
+ var NODE_LAYER_CONFIG = { opacity: 1, rotation: 0, strokeWidth: 3 };
52
+ var ALL_BLOB_SHAPES = [
53
+ // Shape 0 · Blob 1
54
+ [
55
+ { x: 1.12, y: 0 },
56
+ { x: 0.86, y: 0.56 },
57
+ { x: 0.46, y: 0.94 },
58
+ { x: -0.08, y: 1.06 },
59
+ { x: -0.68, y: 0.82 },
60
+ { x: -0.96, y: 0.08 },
61
+ { x: -0.55, y: -0.82 },
62
+ { x: 0.04, y: -1.02 },
63
+ { x: 0.72, y: -0.8 },
64
+ { x: 1.08, y: -0.38 }
65
+ ],
66
+ // Shape 1 · Blob 2
67
+ [
68
+ { x: -0.489, y: -0.625 },
69
+ { x: -0.384, y: -0.716 },
70
+ { x: -0.285, y: -0.792 },
71
+ { x: -0.189, y: -0.855 },
72
+ { x: -0.09, y: -0.903 },
73
+ { x: 0.014, y: -0.932 },
74
+ { x: 0.129, y: -0.94 },
75
+ { x: 0.255, y: -0.924 },
76
+ { x: 0.412, y: -0.876 },
77
+ { x: 0.516, y: -0.832 },
78
+ { x: 0.612, y: -0.78 },
79
+ { x: 0.695, y: -0.725 },
80
+ { x: 0.767, y: -0.666 },
81
+ { x: 0.83, y: -0.606 },
82
+ { x: 0.885, y: -0.546 },
83
+ { x: 0.933, y: -0.486 },
84
+ { x: 0.979, y: -0.425 },
85
+ { x: 1.006, y: -0.385 },
86
+ { x: 1.034, y: -0.334 },
87
+ { x: 1.058, y: -0.276 },
88
+ { x: 1.078, y: -0.209 },
89
+ { x: 1.092, y: -0.133 },
90
+ { x: 1.101, y: -0.046 },
91
+ { x: 1.102, y: 0.052 },
92
+ { x: 1.094, y: 0.173 },
93
+ { x: 1.083, y: 0.244 },
94
+ { x: 1.063, y: 0.324 },
95
+ { x: 1.034, y: 0.401 },
96
+ { x: 0.996, y: 0.477 },
97
+ { x: 0.948, y: 0.549 },
98
+ { x: 0.889, y: 0.617 },
99
+ { x: 0.82, y: 0.681 },
100
+ { x: 0.735, y: 0.741 },
101
+ { x: 0.658, y: 0.783 },
102
+ { x: 0.569, y: 0.822 },
103
+ { x: 0.474, y: 0.855 },
104
+ { x: 0.372, y: 0.882 },
105
+ { x: 0.265, y: 0.904 },
106
+ { x: 0.156, y: 0.92 },
107
+ { x: 0.046, y: 0.931 },
108
+ { x: -0.069, y: 0.938 },
109
+ { x: -0.155, y: 0.935 },
110
+ { x: -0.25, y: 0.919 },
111
+ { x: -0.346, y: 0.89 },
112
+ { x: -0.443, y: 0.851 },
113
+ { x: -0.539, y: 0.8 },
114
+ { x: -0.633, y: 0.738 },
115
+ { x: -0.723, y: 0.667 },
116
+ { x: -0.808, y: 0.585 },
117
+ { x: -0.882, y: 0.501 },
118
+ { x: -0.944, y: 0.421 },
119
+ { x: -0.994, y: 0.343 },
120
+ { x: -1.034, y: 0.267 },
121
+ { x: -1.064, y: 0.192 },
122
+ { x: -1.085, y: 0.12 },
123
+ { x: -1.097, y: 0.042 },
124
+ { x: -1.102, y: 1e-3 },
125
+ { x: -1.09, y: -0.243 },
126
+ { x: -1.05, y: -0.365 },
127
+ { x: -0.99, y: -0.441 },
128
+ { x: -0.911, y: -0.479 },
129
+ { x: -0.819, y: -0.499 },
130
+ { x: -0.715, y: -0.517 },
131
+ { x: -0.605, y: -0.551 }
132
+ ],
133
+ // Shape 2 · Blob 3
134
+ [
135
+ { x: 3e-3, y: -0.97 },
136
+ { x: 0.163, y: -0.984 },
137
+ { x: 0.286, y: -1.028 },
138
+ { x: 0.389, y: -1.096 },
139
+ { x: 0.488, y: -1.174 },
140
+ { x: 0.597, y: -1.21 },
141
+ { x: 0.728, y: -1.165 },
142
+ { x: 0.867, y: -1.036 },
143
+ { x: 0.996, y: -0.839 },
144
+ { x: 1.098, y: -0.59 },
145
+ { x: 1.158, y: -0.304 },
146
+ { x: 1.153, y: 0.012 },
147
+ { x: 1.08, y: 0.336 },
148
+ { x: 0.944, y: 0.639 },
149
+ { x: 0.756, y: 0.889 },
150
+ { x: 0.484, y: 1.072 },
151
+ { x: 0.339, y: 1.079 },
152
+ { x: 0.219, y: 1.051 },
153
+ { x: 0.131, y: 0.994 },
154
+ { x: 0.059, y: 0.939 },
155
+ { x: 8e-3, y: 0.915 },
156
+ { x: -0.105, y: 0.931 },
157
+ { x: -0.176, y: 0.965 },
158
+ { x: -0.249, y: 1.005 },
159
+ { x: -0.345, y: 1.039 },
160
+ { x: -0.497, y: 1.055 },
161
+ { x: -0.672, y: 1.032 },
162
+ { x: -0.817, y: 0.952 },
163
+ { x: -0.945, y: 0.81 },
164
+ { x: -1.054, y: 0.6 },
165
+ { x: -1.16, y: 0.302 },
166
+ { x: -1.187, y: -0.011 },
167
+ { x: -1.165, y: -0.326 },
168
+ { x: -1.097, y: -0.599 },
169
+ { x: -0.991, y: -0.838 },
170
+ { x: -0.852, y: -0.912 },
171
+ { x: -0.695, y: -0.958 },
172
+ { x: -0.53, y: -0.988 },
173
+ { x: -0.357, y: -0.992 },
174
+ { x: -0.18, y: -0.983 }
175
+ ],
176
+ // Shape 3 · Blob 4
177
+ [
178
+ { x: -0.734, y: -1.127 },
179
+ { x: -0.656, y: -1.146 },
180
+ { x: -0.567, y: -1.142 },
181
+ { x: -0.468, y: -1.115 },
182
+ { x: -0.358, y: -1.079 },
183
+ { x: -0.238, y: -1.034 },
184
+ { x: -0.107, y: -0.989 },
185
+ { x: 0.035, y: -0.953 },
186
+ { x: 0.188, y: -0.929 },
187
+ { x: 0.325, y: -0.916 },
188
+ { x: 0.484, y: -0.896 },
189
+ { x: 0.65, y: -0.854 },
190
+ { x: 0.811, y: -0.77 },
191
+ { x: 0.955, y: -0.631 },
192
+ { x: 1.068, y: -0.422 },
193
+ { x: 1.138, y: -0.126 },
194
+ { x: 1.152, y: 0.272 },
195
+ { x: 1.121, y: 0.451 },
196
+ { x: 1.046, y: 0.602 },
197
+ { x: 0.928, y: 0.727 },
198
+ { x: 0.767, y: 0.833 },
199
+ { x: 0.565, y: 0.925 },
200
+ { x: 0.323, y: 1.001 },
201
+ { x: 0.042, y: 1.075 },
202
+ { x: -0.277, y: 1.142 },
203
+ { x: -0.368, y: 1.147 },
204
+ { x: -0.475, y: 1.136 },
205
+ { x: -0.589, y: 1.104 },
206
+ { x: -0.704, y: 1.05 },
207
+ { x: -0.815, y: 0.973 },
208
+ { x: -0.913, y: 0.871 },
209
+ { x: -0.993, y: 0.746 },
210
+ { x: -1.048, y: 0.593 },
211
+ { x: -1.109, y: 0.298 },
212
+ { x: -1.145, y: 0.018 },
213
+ { x: -1.154, y: -0.243 },
214
+ { x: -1.135, y: -0.482 },
215
+ { x: -1.085, y: -0.695 },
216
+ { x: -1.003, y: -0.874 },
217
+ { x: -0.886, y: -1.02 }
218
+ ],
219
+ // Shape 4 · Blob 5
220
+ [
221
+ { x: -0.734, y: 1.127 },
222
+ { x: -0.656, y: 1.146 },
223
+ { x: -0.567, y: 1.142 },
224
+ { x: -0.468, y: 1.115 },
225
+ { x: -0.358, y: 1.079 },
226
+ { x: -0.238, y: 1.034 },
227
+ { x: -0.107, y: 0.989 },
228
+ { x: 0.035, y: 0.953 },
229
+ { x: 0.188, y: 0.929 },
230
+ { x: 0.325, y: 0.916 },
231
+ { x: 0.484, y: 0.896 },
232
+ { x: 0.65, y: 0.854 },
233
+ { x: 0.811, y: 0.77 },
234
+ { x: 0.955, y: 0.631 },
235
+ { x: 1.068, y: 0.422 },
236
+ { x: 1.138, y: 0.126 },
237
+ { x: 1.152, y: -0.272 },
238
+ { x: 1.121, y: -0.451 },
239
+ { x: 1.046, y: -0.602 },
240
+ { x: 0.928, y: -0.727 },
241
+ { x: 0.767, y: -0.833 },
242
+ { x: 0.565, y: -0.925 },
243
+ { x: 0.323, y: -1.001 },
244
+ { x: 0.042, y: -1.075 },
245
+ { x: -0.277, y: -1.142 },
246
+ { x: -0.368, y: -1.147 },
247
+ { x: -0.475, y: -1.136 },
248
+ { x: -0.589, y: -1.104 },
249
+ { x: -0.704, y: -1.05 },
250
+ { x: -0.815, y: -0.973 },
251
+ { x: -0.913, y: -0.871 },
252
+ { x: -0.993, y: -0.746 },
253
+ { x: -1.048, y: -0.593 },
254
+ { x: -1.109, y: -0.298 },
255
+ { x: -1.145, y: -0.018 },
256
+ { x: -1.154, y: 0.243 },
257
+ { x: -1.135, y: 0.482 },
258
+ { x: -1.085, y: 0.695 },
259
+ { x: -1.003, y: 0.874 },
260
+ { x: -0.886, y: 1.02 }
261
+ ],
262
+ // Shape 5 · Blob 6
263
+ [
264
+ { x: 1e-3, y: -1.006 },
265
+ { x: 0.134, y: -1.001 },
266
+ { x: 0.262, y: -1.024 },
267
+ { x: 0.382, y: -1.073 },
268
+ { x: 0.498, y: -1.107 },
269
+ { x: 0.614, y: -1.105 },
270
+ { x: 0.733, y: -1.049 },
271
+ { x: 0.85, y: -0.932 },
272
+ { x: 0.953, y: -0.755 },
273
+ { x: 1.03, y: -0.529 },
274
+ { x: 1.067, y: -0.265 },
275
+ { x: 1.054, y: 0.018 },
276
+ { x: 0.986, y: 0.3 },
277
+ { x: 0.868, y: 0.557 },
278
+ { x: 0.715, y: 0.766 },
279
+ { x: 0.55, y: 0.909 },
280
+ { x: 0.396, y: 0.984 },
281
+ { x: 0.262, y: 1.005 },
282
+ { x: 0.148, y: 1.003 },
283
+ { x: 0.037, y: 1.008 },
284
+ { x: -0.083, y: 1.04 },
285
+ { x: -0.22, y: 1.118 },
286
+ { x: -0.36, y: 1.192 },
287
+ { x: -0.5, y: 1.234 },
288
+ { x: -0.65, y: 1.175 },
289
+ { x: -0.81, y: 1.045 },
290
+ { x: -0.99, y: 0.855 },
291
+ { x: -1.14, y: 0.61 },
292
+ { x: -1.24, y: 0.33 },
293
+ { x: -1.27, y: 0.04 },
294
+ { x: -1.275, y: -0.25 },
295
+ { x: -1.225, y: -0.5 },
296
+ { x: -1.08, y: -0.72 },
297
+ { x: -0.89, y: -0.92 },
298
+ { x: -0.734, y: -1.053 },
299
+ { x: -0.614, y: -1.112 },
300
+ { x: -0.498, y: -1.127 },
301
+ { x: -0.381, y: -1.11 },
302
+ { x: -0.261, y: -1.095 },
303
+ { x: -0.133, y: -1.058 },
304
+ { x: 1e-3, y: -1.01 },
305
+ { x: 0.134, y: -1.001 }
306
+ ]
307
+ ];
308
+ var ACTIVE_BLOB_TYPES = [0, 1, 2, 3, 4, 5];
309
+ var BLOB_TEXT_OFFSETS = [0, 0, 0, 0, 0, -0.1];
310
+ function getBlobTypeForLayer(level) {
311
+ const numTypes = ACTIVE_BLOB_TYPES.length;
312
+ if (numTypes <= 1) return ACTIVE_BLOB_TYPES[0] ?? 0;
313
+ let currentType = 0;
314
+ for (let i = 1; i <= level; i++) {
315
+ const pseudoRandom = Math.floor(Math.abs(Math.sin((i + 1) * 12.9898) * 43758.5453));
316
+ const stepOffset = pseudoRandom % (numTypes - 1) + 1;
317
+ currentType = (currentType + stepOffset) % numTypes;
318
+ }
319
+ return ACTIVE_BLOB_TYPES[currentType];
320
+ }
321
+ function drawBlobPath(ctx, radiusX, radiusY, blobType) {
322
+ const srcPts = ALL_BLOB_SHAPES[blobType] ?? ALL_BLOB_SHAPES[0];
323
+ const pts = srcPts.map((p) => ({ x: p.x * radiusX, y: p.y * radiusY }));
324
+ ctx.beginPath();
325
+ const last = pts[pts.length - 1];
326
+ const first = pts[0];
327
+ ctx.moveTo((last.x + first.x) / 2, (last.y + first.y) / 2);
328
+ for (let i = 0; i < pts.length; i++) {
329
+ const curr = pts[i];
330
+ const next = pts[(i + 1) % pts.length];
331
+ ctx.quadraticCurveTo(curr.x, curr.y, (curr.x + next.x) / 2, (curr.y + next.y) / 2);
332
+ }
333
+ ctx.closePath();
334
+ }
335
+
336
+ // src/constants/performanceConstants.ts
337
+ var FPS_TARGET = 60;
338
+ var TARGET_FRAME_TIME = 1e3 / FPS_TARGET;
339
+ var NODE_HEIGHT = 80;
340
+
341
+ // src/config/textScaling.ts
342
+ var NODE_TEXT_BASE_FONT_PX = 28;
343
+ var DESCRIPTION_TEXT_BASE_FONT_PX = 12;
344
+ var CONTAINER_LABEL_BASE_FONT_PX = 24;
345
+ var EDGE_LABEL_BASE_FONT_PX = 18;
346
+ var OVERLAY_FONT_UPPER_BOOST_PX = 8;
347
+ var NODE_TEXT_SAFE_BLOB_FILL_RATIO = 0.88;
348
+ function computeNodeTextWorldScale(nodeWidth, zoomLevel) {
349
+ const safeZoom = Math.max(zoomLevel, 1e-4);
350
+ const baseRadiusX = nodeWidth / 2;
351
+ const baseRadiusY = Math.max(NODE_HEIGHT * 1.6 / 2, baseRadiusX * 0.74);
352
+ const textNaturalWidth = nodeWidth - 40;
353
+ const textNaturalHeight = NODE_HEIGHT - 20;
354
+ const maxScaleX = baseRadiusX * 2 * NODE_TEXT_SAFE_BLOB_FILL_RATIO / Math.max(textNaturalWidth, 1);
355
+ const maxScaleY = baseRadiusY * 2 * NODE_TEXT_SAFE_BLOB_FILL_RATIO / Math.max(textNaturalHeight, 1);
356
+ const fitScale = Math.max(0.01, Math.min(maxScaleX, maxScaleY));
357
+ return Math.min(1 / safeZoom, fitScale);
358
+ }
359
+ function computeNodeTextScreenScale(nodeWidth, zoomLevel) {
360
+ return computeNodeTextWorldScale(nodeWidth, zoomLevel) * zoomLevel;
361
+ }
362
+ function computeOverlayScale(zoomLevel) {
363
+ const safeZoom = Math.max(zoomLevel, 1e-4);
364
+ const inverseScale = 1 / safeZoom;
365
+ const maxScale = (NODE_TEXT_BASE_FONT_PX + OVERLAY_FONT_UPPER_BOOST_PX) / NODE_TEXT_BASE_FONT_PX;
366
+ return Math.min(Math.max(inverseScale, 1), maxScale);
367
+ }
368
+ function computeEdgeLabelScale(zoomLevel) {
369
+ const safeZoom = Math.max(zoomLevel, 1e-4);
370
+ return Math.min(Math.max(EDGE_LABEL_BASE_FONT_PX / safeZoom, 10), 32);
371
+ }
372
+ // Annotate the CommonJS export names for ESM import in node:
373
+ 0 && (module.exports = {
374
+ ACTIVE_BLOB_TYPES,
375
+ ALL_BLOB_SHAPES,
376
+ BLOB_LAYER_CONFIG,
377
+ BLOB_TEXT_OFFSETS,
378
+ CONTAINER_LABEL_BASE_FONT_PX,
379
+ DESCRIPTION_TEXT_BASE_FONT_PX,
380
+ EDGE_LABEL_BASE_FONT_PX,
381
+ NODE_LAYER_CONFIG,
382
+ NODE_TEXT_BASE_FONT_PX,
383
+ OVERLAY_FONT_UPPER_BOOST_PX,
384
+ computeEdgeLabelScale,
385
+ computeNodeTextScreenScale,
386
+ computeNodeTextWorldScale,
387
+ computeOverlayScale,
388
+ drawBlobPath,
389
+ getBlobTypeForLayer
390
+ });
391
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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":[]}
@@ -0,0 +1,77 @@
1
+ interface BlobPoint {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ type BlobShape = BlobPoint[];
6
+ declare const BLOB_LAYER_CONFIG: readonly [{
7
+ readonly opacity: 0.3;
8
+ readonly rotation: -15;
9
+ readonly scaleUp: 1.3;
10
+ readonly strokeWidth: 3;
11
+ readonly dash: readonly [6, 4];
12
+ }, {
13
+ readonly opacity: 0.4;
14
+ readonly rotation: -10;
15
+ readonly scaleUp: 1.2;
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;
29
+ };
30
+ declare const ALL_BLOB_SHAPES: ReadonlyArray<BlobShape>;
31
+ declare const ACTIVE_BLOB_TYPES: ReadonlyArray<number>;
32
+ /**
33
+ * Per-shape text x-offset as a fraction of baseRadiusX.
34
+ * Compensates for visually asymmetric blobs. Positive = right, negative = left.
35
+ */
36
+ declare const BLOB_TEXT_OFFSETS: ReadonlyArray<number>;
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: {
47
+ beginPath(): void;
48
+ moveTo(x: number, y: number): void;
49
+ quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
50
+ closePath(): void;
51
+ }, radiusX: number, radiusY: number, blobType: number): void;
52
+
53
+ declare const NODE_TEXT_BASE_FONT_PX = 28;
54
+ declare const DESCRIPTION_TEXT_BASE_FONT_PX = 12;
55
+ declare const CONTAINER_LABEL_BASE_FONT_PX = 24;
56
+ declare const EDGE_LABEL_BASE_FONT_PX = 18;
57
+ declare const OVERLAY_FONT_UPPER_BOOST_PX = 8;
58
+ /**
59
+ * Computes world-space text scale for node title:
60
+ * - inverse zoom for screen-space consistency
61
+ * - clamped so text stays inside the node blob with safe padding
62
+ *
63
+ * Matches visualli.ai's computeNodeTextWorldScale(nodeWidth, zoomLevel).
64
+ */
65
+ declare function computeNodeTextWorldScale(nodeWidth: number, zoomLevel: number): number;
66
+ /** Screen-space scale (zoom-adjusted) for text overlays. */
67
+ declare function computeNodeTextScreenScale(nodeWidth: number, zoomLevel: number): number;
68
+ /**
69
+ * Screen-space overlay scale for description/semantic tooltips.
70
+ * - lower bound: 1x
71
+ * - upper bound: node-title-root + OVERLAY_FONT_UPPER_BOOST_PX
72
+ */
73
+ declare function computeOverlayScale(zoomLevel: number): number;
74
+ /** Scale for edge path labels in screen pixels. */
75
+ declare function computeEdgeLabelScale(zoomLevel: number): number;
76
+
77
+ export { ACTIVE_BLOB_TYPES, ALL_BLOB_SHAPES, BLOB_LAYER_CONFIG, BLOB_TEXT_OFFSETS, type BlobPoint, type BlobShape, CONTAINER_LABEL_BASE_FONT_PX, DESCRIPTION_TEXT_BASE_FONT_PX, EDGE_LABEL_BASE_FONT_PX, NODE_LAYER_CONFIG, NODE_TEXT_BASE_FONT_PX, OVERLAY_FONT_UPPER_BOOST_PX, computeEdgeLabelScale, computeNodeTextScreenScale, computeNodeTextWorldScale, computeOverlayScale, drawBlobPath, getBlobTypeForLayer };
@@ -0,0 +1,77 @@
1
+ interface BlobPoint {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ type BlobShape = BlobPoint[];
6
+ declare const BLOB_LAYER_CONFIG: readonly [{
7
+ readonly opacity: 0.3;
8
+ readonly rotation: -15;
9
+ readonly scaleUp: 1.3;
10
+ readonly strokeWidth: 3;
11
+ readonly dash: readonly [6, 4];
12
+ }, {
13
+ readonly opacity: 0.4;
14
+ readonly rotation: -10;
15
+ readonly scaleUp: 1.2;
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;
29
+ };
30
+ declare const ALL_BLOB_SHAPES: ReadonlyArray<BlobShape>;
31
+ declare const ACTIVE_BLOB_TYPES: ReadonlyArray<number>;
32
+ /**
33
+ * Per-shape text x-offset as a fraction of baseRadiusX.
34
+ * Compensates for visually asymmetric blobs. Positive = right, negative = left.
35
+ */
36
+ declare const BLOB_TEXT_OFFSETS: ReadonlyArray<number>;
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: {
47
+ beginPath(): void;
48
+ moveTo(x: number, y: number): void;
49
+ quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
50
+ closePath(): void;
51
+ }, radiusX: number, radiusY: number, blobType: number): void;
52
+
53
+ declare const NODE_TEXT_BASE_FONT_PX = 28;
54
+ declare const DESCRIPTION_TEXT_BASE_FONT_PX = 12;
55
+ declare const CONTAINER_LABEL_BASE_FONT_PX = 24;
56
+ declare const EDGE_LABEL_BASE_FONT_PX = 18;
57
+ declare const OVERLAY_FONT_UPPER_BOOST_PX = 8;
58
+ /**
59
+ * Computes world-space text scale for node title:
60
+ * - inverse zoom for screen-space consistency
61
+ * - clamped so text stays inside the node blob with safe padding
62
+ *
63
+ * Matches visualli.ai's computeNodeTextWorldScale(nodeWidth, zoomLevel).
64
+ */
65
+ declare function computeNodeTextWorldScale(nodeWidth: number, zoomLevel: number): number;
66
+ /** Screen-space scale (zoom-adjusted) for text overlays. */
67
+ declare function computeNodeTextScreenScale(nodeWidth: number, zoomLevel: number): number;
68
+ /**
69
+ * Screen-space overlay scale for description/semantic tooltips.
70
+ * - lower bound: 1x
71
+ * - upper bound: node-title-root + OVERLAY_FONT_UPPER_BOOST_PX
72
+ */
73
+ declare function computeOverlayScale(zoomLevel: number): number;
74
+ /** Scale for edge path labels in screen pixels. */
75
+ declare function computeEdgeLabelScale(zoomLevel: number): number;
76
+
77
+ export { ACTIVE_BLOB_TYPES, ALL_BLOB_SHAPES, BLOB_LAYER_CONFIG, BLOB_TEXT_OFFSETS, type BlobPoint, type BlobShape, CONTAINER_LABEL_BASE_FONT_PX, DESCRIPTION_TEXT_BASE_FONT_PX, EDGE_LABEL_BASE_FONT_PX, NODE_LAYER_CONFIG, NODE_TEXT_BASE_FONT_PX, OVERLAY_FONT_UPPER_BOOST_PX, computeEdgeLabelScale, computeNodeTextScreenScale, computeNodeTextWorldScale, computeOverlayScale, drawBlobPath, getBlobTypeForLayer };
@@ -0,0 +1,38 @@
1
+ import {
2
+ ACTIVE_BLOB_TYPES,
3
+ ALL_BLOB_SHAPES,
4
+ BLOB_LAYER_CONFIG,
5
+ BLOB_TEXT_OFFSETS,
6
+ CONTAINER_LABEL_BASE_FONT_PX,
7
+ DESCRIPTION_TEXT_BASE_FONT_PX,
8
+ EDGE_LABEL_BASE_FONT_PX,
9
+ NODE_LAYER_CONFIG,
10
+ NODE_TEXT_BASE_FONT_PX,
11
+ OVERLAY_FONT_UPPER_BOOST_PX,
12
+ computeEdgeLabelScale,
13
+ computeNodeTextScreenScale,
14
+ computeNodeTextWorldScale,
15
+ computeOverlayScale,
16
+ drawBlobPath,
17
+ getBlobTypeForLayer
18
+ } from "../chunk-LNTJTDB2.js";
19
+ import "../chunk-LDJRGT2Q.js";
20
+ export {
21
+ ACTIVE_BLOB_TYPES,
22
+ ALL_BLOB_SHAPES,
23
+ BLOB_LAYER_CONFIG,
24
+ BLOB_TEXT_OFFSETS,
25
+ CONTAINER_LABEL_BASE_FONT_PX,
26
+ DESCRIPTION_TEXT_BASE_FONT_PX,
27
+ EDGE_LABEL_BASE_FONT_PX,
28
+ NODE_LAYER_CONFIG,
29
+ NODE_TEXT_BASE_FONT_PX,
30
+ OVERLAY_FONT_UPPER_BOOST_PX,
31
+ computeEdgeLabelScale,
32
+ computeNodeTextScreenScale,
33
+ computeNodeTextWorldScale,
34
+ computeOverlayScale,
35
+ drawBlobPath,
36
+ getBlobTypeForLayer
37
+ };
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}