@visualli/core 0.1.5 → 0.1.6

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 +6 -1
  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,349 @@
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
@@ -0,0 +1 @@
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":[]}
@@ -0,0 +1,139 @@
1
+ import {
2
+ FPS_SAMPLE_WINDOW,
3
+ FPS_TARGET,
4
+ MEMORY_CHECK_INTERVAL
5
+ } from "./chunk-LDJRGT2Q.js";
6
+
7
+ // src/performance/performanceMonitor.ts
8
+ var FPSMonitor = class {
9
+ constructor() {
10
+ this.frameTimes = [];
11
+ this.lastTime = 0;
12
+ this.currentFPS = FPS_TARGET;
13
+ this.rafId = null;
14
+ }
15
+ start() {
16
+ if (this.rafId !== null) return;
17
+ const measure = (ts) => {
18
+ if (this.lastTime > 0) {
19
+ this.frameTimes.push(ts - this.lastTime);
20
+ if (this.frameTimes.length > FPS_SAMPLE_WINDOW) this.frameTimes.shift();
21
+ this.currentFPS = this.calc();
22
+ }
23
+ this.lastTime = ts;
24
+ this.rafId = requestAnimationFrame(measure);
25
+ };
26
+ this.rafId = requestAnimationFrame(measure);
27
+ }
28
+ stop() {
29
+ if (this.rafId !== null) {
30
+ cancelAnimationFrame(this.rafId);
31
+ this.rafId = null;
32
+ }
33
+ }
34
+ calc() {
35
+ if (this.frameTimes.length === 0) return FPS_TARGET;
36
+ const avg = this.frameTimes.reduce((a, b) => a + b, 0) / this.frameTimes.length;
37
+ return Math.round(1e3 / avg);
38
+ }
39
+ getFPS() {
40
+ return this.currentFPS;
41
+ }
42
+ getAverageFPS() {
43
+ return this.currentFPS;
44
+ }
45
+ getP95FrameTime() {
46
+ if (this.frameTimes.length === 0) return 0;
47
+ const sorted = [...this.frameTimes].sort((a, b) => a - b);
48
+ return sorted[Math.floor(sorted.length * 0.95)];
49
+ }
50
+ reset() {
51
+ this.frameTimes = [];
52
+ this.currentFPS = FPS_TARGET;
53
+ }
54
+ };
55
+ var MemoryMonitor = class {
56
+ constructor() {
57
+ this.timer = null;
58
+ this.current = 0;
59
+ }
60
+ start(onUpdate) {
61
+ if (this.timer !== null) return;
62
+ this.timer = setInterval(() => {
63
+ this.current = this.measure();
64
+ onUpdate?.(this.current);
65
+ }, MEMORY_CHECK_INTERVAL);
66
+ }
67
+ stop() {
68
+ if (this.timer !== null) {
69
+ clearInterval(this.timer);
70
+ this.timer = null;
71
+ }
72
+ }
73
+ measure() {
74
+ const mem = performance["memory"];
75
+ return mem ? mem["usedJSHeapSize"] / (1024 * 1024) : 0;
76
+ }
77
+ getMemoryMB() {
78
+ return this.current;
79
+ }
80
+ getStats() {
81
+ const mem = performance["memory"];
82
+ if (!mem) return null;
83
+ return {
84
+ usedJSHeapSize: mem["usedJSHeapSize"],
85
+ totalJSHeapSize: mem["totalJSHeapSize"],
86
+ jsHeapSizeLimit: mem["jsHeapSizeLimit"],
87
+ heapUsagePercent: mem["usedJSHeapSize"] / mem["jsHeapSizeLimit"] * 100
88
+ };
89
+ }
90
+ static isSupported() {
91
+ return !!performance["memory"];
92
+ }
93
+ };
94
+ var PerformanceProfiler = class {
95
+ constructor() {
96
+ this.marks = /* @__PURE__ */ new Map();
97
+ this.measures = /* @__PURE__ */ new Map();
98
+ }
99
+ mark(label) {
100
+ this.marks.set(label, performance.now());
101
+ }
102
+ measure(label) {
103
+ const start = this.marks.get(label);
104
+ if (start === void 0) return 0;
105
+ const duration = performance.now() - start;
106
+ const list = this.measures.get(label) ?? [];
107
+ list.push(duration);
108
+ this.measures.set(label, list);
109
+ this.marks.delete(label);
110
+ return duration;
111
+ }
112
+ getAverage(label) {
113
+ const list = this.measures.get(label);
114
+ if (!list?.length) return 0;
115
+ return list.reduce((a, b) => a + b, 0) / list.length;
116
+ }
117
+ getP95(label) {
118
+ const list = this.measures.get(label);
119
+ if (!list?.length) return 0;
120
+ const sorted = [...list].sort((a, b) => a - b);
121
+ return sorted[Math.floor(sorted.length * 0.95)];
122
+ }
123
+ clear(label) {
124
+ if (label) {
125
+ this.marks.delete(label);
126
+ this.measures.delete(label);
127
+ } else {
128
+ this.marks.clear();
129
+ this.measures.clear();
130
+ }
131
+ }
132
+ };
133
+
134
+ export {
135
+ FPSMonitor,
136
+ MemoryMonitor,
137
+ PerformanceProfiler
138
+ };
139
+ //# sourceMappingURL=chunk-PDP5CVUL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/performance/performanceMonitor.ts"],"sourcesContent":["// ─── Performance Monitors ─────────────────────────────────────────────────────\n//\n// FPSMonitor – tracks frame rate via requestAnimationFrame (browser)\n// MemoryMonitor – polls performance.memory (Chrome)\n// PerformanceProfiler – mark / measure utility for arbitrary operations\n\nimport {\n FPS_TARGET,\n FPS_SAMPLE_WINDOW,\n MEMORY_CHECK_INTERVAL,\n} from '../constants/performanceConstants.js';\n\n// ── FPS Monitor ───────────────────────────────────────────────────────────────\n\nexport class FPSMonitor {\n private frameTimes: number[] = [];\n private lastTime = 0;\n private currentFPS = FPS_TARGET;\n private rafId: number | null = null;\n\n start(): void {\n if (this.rafId !== null) return;\n\n const measure = (ts: number) => {\n if (this.lastTime > 0) {\n this.frameTimes.push(ts - this.lastTime);\n if (this.frameTimes.length > FPS_SAMPLE_WINDOW) this.frameTimes.shift();\n this.currentFPS = this.calc();\n }\n this.lastTime = ts;\n this.rafId = requestAnimationFrame(measure);\n };\n\n this.rafId = requestAnimationFrame(measure);\n }\n\n stop(): void {\n if (this.rafId !== null) { cancelAnimationFrame(this.rafId); this.rafId = null; }\n }\n\n private calc(): number {\n if (this.frameTimes.length === 0) return FPS_TARGET;\n const avg = this.frameTimes.reduce((a, b) => a + b, 0) / this.frameTimes.length;\n return Math.round(1000 / avg);\n }\n\n getFPS(): number { return this.currentFPS; }\n getAverageFPS(): number { return this.currentFPS; }\n\n getP95FrameTime(): number {\n if (this.frameTimes.length === 0) return 0;\n const sorted = [...this.frameTimes].sort((a, b) => a - b);\n return sorted[Math.floor(sorted.length * 0.95)];\n }\n\n reset(): void { this.frameTimes = []; this.currentFPS = FPS_TARGET; }\n}\n\n// ── Memory Monitor ────────────────────────────────────────────────────────────\n\nexport interface MemoryStats {\n usedJSHeapSize: number;\n totalJSHeapSize: number;\n jsHeapSizeLimit: number;\n heapUsagePercent: number;\n}\n\nexport class MemoryMonitor {\n private timer: ReturnType<typeof setInterval> | null = null;\n private current = 0;\n\n start(onUpdate?: (mb: number) => void): void {\n if (this.timer !== null) return;\n this.timer = setInterval(() => {\n this.current = this.measure();\n onUpdate?.(this.current);\n }, MEMORY_CHECK_INTERVAL);\n }\n\n stop(): void {\n if (this.timer !== null) { clearInterval(this.timer); this.timer = null; }\n }\n\n private measure(): number {\n const mem = (performance as unknown as Record<string, unknown>)['memory'] as Record<string, number> | undefined;\n return mem ? mem['usedJSHeapSize'] / (1024 * 1024) : 0;\n }\n\n getMemoryMB(): number { return this.current; }\n\n getStats(): MemoryStats | null {\n const mem = (performance as unknown as Record<string, unknown>)['memory'] as Record<string, number> | undefined;\n if (!mem) return null;\n return {\n usedJSHeapSize: mem['usedJSHeapSize'],\n totalJSHeapSize: mem['totalJSHeapSize'],\n jsHeapSizeLimit: mem['jsHeapSizeLimit'],\n heapUsagePercent: (mem['usedJSHeapSize'] / mem['jsHeapSizeLimit']) * 100,\n };\n }\n\n static isSupported(): boolean {\n return !!(performance as unknown as Record<string, unknown>)['memory'];\n }\n}\n\n// ── Performance Profiler ──────────────────────────────────────────────────────\n\nexport class PerformanceProfiler {\n private marks: Map<string, number> = new Map();\n private measures: Map<string, number[]> = new Map();\n\n mark(label: string): void {\n this.marks.set(label, performance.now());\n }\n\n measure(label: string): number {\n const start = this.marks.get(label);\n if (start === undefined) return 0;\n const duration = performance.now() - start;\n const list = this.measures.get(label) ?? [];\n list.push(duration);\n this.measures.set(label, list);\n this.marks.delete(label);\n return duration;\n }\n\n getAverage(label: string): number {\n const list = this.measures.get(label);\n if (!list?.length) return 0;\n return list.reduce((a, b) => a + b, 0) / list.length;\n }\n\n getP95(label: string): number {\n const list = this.measures.get(label);\n if (!list?.length) return 0;\n const sorted = [...list].sort((a, b) => a - b);\n return sorted[Math.floor(sorted.length * 0.95)];\n }\n\n clear(label?: string): void {\n if (label) { this.marks.delete(label); this.measures.delete(label); }\n else { this.marks.clear(); this.measures.clear(); }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-VLGR5PZX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}