@visualli/core 0.1.4 → 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.
- package/dist/animations/index.cjs +146 -0
- package/dist/animations/index.cjs.map +1 -0
- package/dist/animations/index.d.cts +81 -0
- package/dist/animations/index.d.ts +81 -0
- package/dist/animations/index.js +35 -0
- package/dist/animations/index.js.map +1 -0
- package/dist/chunk-6NXADJK2.js +562 -0
- package/dist/chunk-6NXADJK2.js.map +1 -0
- package/dist/chunk-F36SMC3K.js +106 -0
- package/dist/chunk-F36SMC3K.js.map +1 -0
- package/dist/chunk-G5H3P4YZ.js +273 -0
- package/dist/chunk-G5H3P4YZ.js.map +1 -0
- package/dist/chunk-GQMFBYLK.js +81 -0
- package/dist/chunk-GQMFBYLK.js.map +1 -0
- package/dist/chunk-I75TMOE4.js +108 -0
- package/dist/chunk-I75TMOE4.js.map +1 -0
- package/dist/chunk-LDJRGT2Q.js +163 -0
- package/dist/chunk-LDJRGT2Q.js.map +1 -0
- package/dist/chunk-LI3BVD6H.js +98 -0
- package/dist/chunk-LI3BVD6H.js.map +1 -0
- package/dist/chunk-LJYSKSCE.js +95 -0
- package/dist/chunk-LJYSKSCE.js.map +1 -0
- package/dist/chunk-LNTJTDB2.js +349 -0
- package/dist/chunk-LNTJTDB2.js.map +1 -0
- package/dist/chunk-PDP5CVUL.js +139 -0
- package/dist/chunk-PDP5CVUL.js.map +1 -0
- package/dist/chunk-VLGR5PZX.js +1 -0
- package/dist/chunk-VLGR5PZX.js.map +1 -0
- package/dist/config/index.cjs +391 -0
- package/dist/config/index.cjs.map +1 -0
- package/dist/config/index.d.cts +77 -0
- package/dist/config/index.d.ts +77 -0
- package/dist/config/index.js +38 -0
- package/dist/config/index.js.map +1 -0
- package/dist/constants/index.cjs +642 -0
- package/dist/constants/index.cjs.map +1 -0
- package/dist/constants/index.d.cts +448 -0
- package/dist/constants/index.d.ts +448 -0
- package/dist/constants/index.js +183 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/document-B3hnNr-F.d.cts +73 -0
- package/dist/document-B3hnNr-F.d.ts +73 -0
- package/dist/index.cjs +32 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +15 -1044
- package/dist/index.d.ts +15 -1044
- package/dist/index.js +179 -1747
- package/dist/index.js.map +1 -1
- package/dist/layout/index.cjs +210 -0
- package/dist/layout/index.cjs.map +1 -0
- package/dist/layout/index.d.cts +80 -0
- package/dist/layout/index.d.ts +80 -0
- package/dist/layout/index.js +25 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/mindmap-DWS0WZT_.d.cts +118 -0
- package/dist/mindmap-DWS0WZT_.d.ts +118 -0
- package/dist/parser/index.cjs +739 -0
- package/dist/parser/index.cjs.map +1 -0
- package/dist/parser/index.d.cts +87 -0
- package/dist/parser/index.d.ts +87 -0
- package/dist/parser/index.js +43 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/performance/index.cjs +167 -0
- package/dist/performance/index.cjs.map +1 -0
- package/dist/performance/index.d.cts +40 -0
- package/dist/performance/index.d.ts +40 -0
- package/dist/performance/index.js +12 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/types/index.cjs +19 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +8 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/viewport/index.cjs +131 -0
- package/dist/viewport/index.cjs.map +1 -0
- package/dist/viewport/index.d.cts +56 -0
- package/dist/viewport/index.d.ts +56 -0
- package/dist/viewport/index.js +26 -0
- package/dist/viewport/index.js.map +1 -0
- package/package.json +6 -1
- package/src/config/README.md +59 -0
- package/src/config/USAGE_EXAMPLES.md +285 -0
- package/src/config/index.ts +7 -0
- 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":[]}
|