modern-text 1.11.1 → 2.0.0

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 (30) hide show
  1. package/README.md +283 -22
  2. package/dist/deformations/index.cjs +566 -0
  3. package/dist/deformations/index.d.cts +11 -0
  4. package/dist/deformations/index.d.mts +11 -0
  5. package/dist/deformations/index.d.ts +11 -0
  6. package/dist/deformations/index.mjs +563 -0
  7. package/dist/index.cjs +15 -3
  8. package/dist/index.d.cts +186 -6
  9. package/dist/index.d.mts +186 -6
  10. package/dist/index.d.ts +186 -6
  11. package/dist/index.js +6 -5
  12. package/dist/index.mjs +4 -2
  13. package/dist/shared/modern-text.B2xfrqDc.cjs +556 -0
  14. package/dist/shared/modern-text.BD7PBYt7.d.cts +100 -0
  15. package/dist/shared/modern-text.BxijkspX.d.ts +100 -0
  16. package/dist/shared/{modern-text.BKZQdmgG.cjs → modern-text.CBgc-cQ1.cjs} +288 -18
  17. package/dist/shared/modern-text.CYa4lfoG.d.mts +100 -0
  18. package/dist/shared/{modern-text.Dqw5Z6MV.mjs → modern-text.ChzjFjsk.mjs} +283 -13
  19. package/dist/shared/{modern-text.Db7Uoht6.d.cts → modern-text.D4WopQCu.d.cts} +56 -22
  20. package/dist/shared/{modern-text.Db7Uoht6.d.mts → modern-text.D4WopQCu.d.mts} +56 -22
  21. package/dist/shared/{modern-text.Db7Uoht6.d.ts → modern-text.D4WopQCu.d.ts} +56 -22
  22. package/dist/shared/modern-text.JF1ny7A-.mjs +550 -0
  23. package/dist/shared/modern-text.MC5bIC9E.cjs +316 -0
  24. package/dist/shared/modern-text.fT17R5HY.mjs +310 -0
  25. package/dist/web-components/index.cjs +2 -1
  26. package/dist/web-components/index.d.cts +1 -1
  27. package/dist/web-components/index.d.mts +1 -1
  28. package/dist/web-components/index.d.ts +1 -1
  29. package/dist/web-components/index.mjs +2 -1
  30. package/package.json +12 -7
@@ -0,0 +1,566 @@
1
+ 'use strict';
2
+
3
+ const modernPath2d = require('modern-path2d');
4
+ const deformation = require('../shared/modern-text.B2xfrqDc.cjs');
5
+ const curves = require('../shared/modern-text.MC5bIC9E.cjs');
6
+ require('modern-idoc');
7
+
8
+ const BY_WORD = [50, 5, 0, 100];
9
+ const PI_DIV_3 = Math.PI / 3;
10
+ function random(value) {
11
+ const v = Math.sin(value) * 43758.5453123;
12
+ return v - Math.trunc(v);
13
+ }
14
+ function translatePoint(point, arg) {
15
+ return [point.x + arg.translateVec.x, point.y + arg.translateVec.y];
16
+ }
17
+ function scalePoint(point, arg) {
18
+ const { centerX, centerY, t, center } = arg;
19
+ return [(point.x - center.x) * t + centerX, (point.y - center.y) * t + centerY];
20
+ }
21
+ function rotatePoint(point, arg) {
22
+ const { cos, sin, center } = arg;
23
+ const dx = point.x - center.x;
24
+ const dy = point.y - center.y;
25
+ return [center.x + dx * cos - dy * sin, center.y + dx * sin + dy * cos];
26
+ }
27
+ const deformationPresets = {
28
+ // ── Bend(整体弯曲)───────────────────────────────────────────────────
29
+ "bend": {
30
+ engine: "bend",
31
+ vertical: false,
32
+ transform: (ctx) => {
33
+ const { lineHeight, size, center, centerDist, centerDistAngle, width, height } = ctx;
34
+ return (point) => {
35
+ const p = lineHeight + Math.sign(size) * height / 2 - (point.y - center.y);
36
+ const deg = centerDistAngle + (point.x - centerDist.x) / width * 2 * size;
37
+ return [centerDist.x + p * Math.cos(deg), centerDist.y + p * Math.sin(deg)];
38
+ };
39
+ }
40
+ },
41
+ "bend-vertical": {
42
+ engine: "bend",
43
+ vertical: true,
44
+ transform: (ctx) => {
45
+ const { lineHeight, size, center, centerDist, centerDistAngle, width, height } = ctx;
46
+ return (point) => {
47
+ const p = lineHeight + Math.sign(size) * width / 2 + (point.x - center.x);
48
+ const deg = centerDistAngle + (point.y - centerDist.y) / height * 2 * size;
49
+ return [centerDist.x + p * Math.cos(deg), centerDist.y + p * Math.sin(deg)];
50
+ };
51
+ }
52
+ },
53
+ "arch-curve": {
54
+ engine: "bend",
55
+ vertical: "auto",
56
+ transform: (ctx) => {
57
+ const { lineHeight, size, center, centerDist, centerDistAngle, width, height, isHorizontal } = ctx;
58
+ return isHorizontal ? (point) => {
59
+ const p = centerDistAngle + (point.x - centerDist.x) / width * 2 * size;
60
+ const x = centerDist.x + lineHeight * Math.cos(p);
61
+ const y = centerDist.y + lineHeight * Math.sin(p) - Math.sign(size) * height / 2 + (point.y - center.y);
62
+ return [x, y];
63
+ } : (point) => {
64
+ const deg = centerDistAngle + (point.y - centerDist.y) / height * 2 * size;
65
+ const x = centerDist.x + lineHeight * Math.cos(deg) + Math.sign(size) * width / 2 + (point.x - center.x);
66
+ const y = centerDist.y + lineHeight * Math.sin(deg);
67
+ return [x, y];
68
+ };
69
+ }
70
+ },
71
+ // ── FFD(自由变形)─────────────────────────────────────────────────────
72
+ "concave-curve": {
73
+ engine: "ffd",
74
+ bezier: true,
75
+ hBlocks: 1,
76
+ vBlocks: 0,
77
+ lineToQuad: true,
78
+ build: (p, { a, baseHeight, adjust }) => {
79
+ const k = baseHeight * a;
80
+ adjust(p[0], 0, -k);
81
+ adjust(p[2], 0, 2 * k);
82
+ adjust(p[4], 0, -k);
83
+ adjust(p[1], 0, k);
84
+ adjust(p[3], 0, -2 * k);
85
+ adjust(p[5], 0, k);
86
+ }
87
+ },
88
+ "upper-arch-curve": {
89
+ engine: "ffd",
90
+ bezier: true,
91
+ hBlocks: 1,
92
+ vBlocks: 0,
93
+ lineToQuad: true,
94
+ build: (p, { a, baseWidth, baseHeight, adjust }) => {
95
+ const k = (a > 0 ? 0.5 * baseWidth : 2 * baseHeight) * a;
96
+ adjust(p[2], 0, -k);
97
+ }
98
+ },
99
+ "lower-arch-curve": {
100
+ engine: "ffd",
101
+ bezier: true,
102
+ hBlocks: 1,
103
+ vBlocks: 0,
104
+ lineToQuad: true,
105
+ build: (p, { a, baseWidth, baseHeight, adjust }) => {
106
+ const k = (a > 0 ? 0.5 * baseWidth : 2 * baseHeight) * a;
107
+ adjust(p[3], 0, +k);
108
+ }
109
+ },
110
+ "bulb-curve": {
111
+ engine: "ffd",
112
+ bezier: true,
113
+ hBlocks: 1,
114
+ vBlocks: 0,
115
+ lineToQuad: true,
116
+ build: (p, { a, baseHeight, adjust }) => {
117
+ const k = -baseHeight * a;
118
+ adjust(p[0], 0, -0.5 * k);
119
+ adjust(p[2], 0, 2 * k);
120
+ adjust(p[4], 0, -0.5 * k);
121
+ adjust(p[1], 0, 0.5 * k);
122
+ adjust(p[3], 0, -2 * k);
123
+ adjust(p[5], 0, 0.5 * k);
124
+ }
125
+ },
126
+ "skew": {
127
+ engine: "ffd",
128
+ bezier: false,
129
+ hBlocks: 0,
130
+ vBlocks: 0,
131
+ build: (p, { a, b, baseWidth, baseHeight, adjust }) => {
132
+ const k1 = baseHeight * Math.tan(a * PI_DIV_3);
133
+ const k2 = baseWidth * Math.tan(b * PI_DIV_3);
134
+ adjust(p[0], k1, 0);
135
+ adjust(p[2], k1, -k2);
136
+ adjust(p[3], 0, -k2);
137
+ }
138
+ },
139
+ "flag-curve": {
140
+ engine: "ffd",
141
+ bezier: true,
142
+ hBlocks: 3,
143
+ vBlocks: 0,
144
+ breakLine: true,
145
+ lineToQuad: true,
146
+ build: (p, { a, baseWidth, adjust }) => {
147
+ const k = 0.5 * baseWidth * a;
148
+ adjust(p[2], 0, -k);
149
+ adjust(p[3], 0, -k);
150
+ adjust(p[6], 0, k);
151
+ adjust(p[7], 0, k);
152
+ }
153
+ },
154
+ "trapezoid": {
155
+ engine: "ffd",
156
+ bezier: true,
157
+ hBlocks: 0,
158
+ vBlocks: 1,
159
+ build: (p, { a, b, baseWidth, baseHeight, adjust }) => {
160
+ const k1 = 0.25 * baseWidth * a;
161
+ const k2 = 0.5 * baseHeight * b;
162
+ const t = 0.5 * (a + 1);
163
+ adjust(p[0], +k1, -k2);
164
+ adjust(p[2], -k1, +k2);
165
+ adjust(p[3], -k1, -k2);
166
+ adjust(p[5], +k1, +k2);
167
+ p[1] = modernPath2d.Vector2.lerp(p[2], p[0], t);
168
+ p[4] = modernPath2d.Vector2.lerp(p[5], p[3], t);
169
+ }
170
+ },
171
+ "lower-trapezoid": {
172
+ engine: "ffd",
173
+ bezier: true,
174
+ hBlocks: 1,
175
+ vBlocks: 0,
176
+ build: (p, { a, b, baseWidth, baseHeight, adjust }) => {
177
+ const k1 = baseWidth * Math.tan(a * PI_DIV_3);
178
+ const k2 = baseHeight * b;
179
+ const t = 0.5 * (a + 1);
180
+ adjust(p[0], 0, -k2);
181
+ adjust(p[4], 0, -k2);
182
+ adjust(p[a > 0 ? 1 : 5], 0, +Math.abs(k1));
183
+ p[2] = modernPath2d.Vector2.lerp(p[0], p[4], t);
184
+ p[3] = modernPath2d.Vector2.lerp(p[1], p[5], t);
185
+ }
186
+ },
187
+ "top-trapezoid": {
188
+ engine: "ffd",
189
+ bezier: true,
190
+ hBlocks: 1,
191
+ vBlocks: 0,
192
+ build: (p, { a, b, baseWidth, baseHeight, adjust }) => {
193
+ const k1 = baseWidth * Math.tan(a * PI_DIV_3);
194
+ const k2 = baseHeight * b;
195
+ const t = 0.5 * (a + 1);
196
+ adjust(p[1], 0, +k2);
197
+ adjust(p[5], 0, +k2);
198
+ adjust(p[a > 0 ? 4 : 0], 0, -Math.abs(k1));
199
+ p[2] = modernPath2d.Vector2.lerp(p[4], p[0], t);
200
+ p[3] = modernPath2d.Vector2.lerp(p[5], p[1], t);
201
+ }
202
+ },
203
+ "horizontal-trapezoid": {
204
+ engine: "ffd",
205
+ bezier: true,
206
+ hBlocks: 1,
207
+ vBlocks: 0,
208
+ build: (p, { a, b, baseWidth, baseHeight, adjust }) => {
209
+ const k1 = 0.5 * baseWidth * Math.tan(a * PI_DIV_3);
210
+ const k2 = 0.5 * baseHeight * b;
211
+ const t = 0.5 + a * 0.5;
212
+ adjust(p[a > 0 ? 0 : 4], 0, -Math.sign(a) * k1);
213
+ adjust(p[a > 0 ? 1 : 5], 0, +Math.sign(a) * k1);
214
+ adjust(p[0], 0, -k2);
215
+ adjust(p[1], 0, +k2);
216
+ adjust(p[4], 0, -k2);
217
+ adjust(p[5], 0, +k2);
218
+ p[2] = modernPath2d.Vector2.lerp(p[0], p[4], t);
219
+ p[3] = modernPath2d.Vector2.lerp(p[1], p[5], t);
220
+ }
221
+ },
222
+ "bevel": {
223
+ engine: "ffd",
224
+ bezier: false,
225
+ hBlocks: 1,
226
+ vBlocks: 0,
227
+ breakLine: true,
228
+ build: (p, { a, b, baseWidth, baseHeight, adjust }) => {
229
+ const k1 = 0.5 * baseWidth * Math.tan(a * PI_DIV_3);
230
+ const k2 = 0.5 * baseHeight * b;
231
+ adjust(p[0], 0, -k2);
232
+ adjust(p[2], 0, -k1 - k2);
233
+ adjust(p[4], 0, -k2);
234
+ adjust(p[1], 0, +k2);
235
+ adjust(p[3], 0, -k1 + k2);
236
+ adjust(p[5], 0, +k2);
237
+ }
238
+ },
239
+ "upper-roof": {
240
+ engine: "ffd",
241
+ bezier: false,
242
+ hBlocks: 1,
243
+ vBlocks: 0,
244
+ breakLine: true,
245
+ build: (p, { a, b, baseWidth, baseHeight, adjust }) => {
246
+ const k1 = 0.5 * baseWidth * Math.tan(a * PI_DIV_3);
247
+ const k2 = baseHeight * b;
248
+ adjust(p[0], 0, +a * baseHeight - k2);
249
+ adjust(p[2], 0, -k1 - k2);
250
+ adjust(p[4], 0, +a * baseHeight - k2);
251
+ }
252
+ },
253
+ "lower-roof": {
254
+ engine: "ffd",
255
+ bezier: false,
256
+ hBlocks: 1,
257
+ vBlocks: 0,
258
+ breakLine: true,
259
+ build: (p, { a, b, baseWidth, baseHeight, adjust }) => {
260
+ const k1 = 0.5 * baseWidth * Math.tan(a * PI_DIV_3);
261
+ const k2 = baseHeight * b;
262
+ adjust(p[1], 0, -a * baseHeight + k2);
263
+ adjust(p[3], 0, +k1 + k2);
264
+ adjust(p[5], 0, -a * baseHeight + k2);
265
+ }
266
+ },
267
+ "angled-projection": {
268
+ engine: "ffd",
269
+ bezier: false,
270
+ hBlocks: 1,
271
+ vBlocks: 0,
272
+ breakLine: true,
273
+ build: (p, { a, b, baseWidth, baseHeight, adjust }) => {
274
+ const k1 = 0.5 * baseWidth * Math.tan(a * 0.5 * PI_DIV_3);
275
+ const k2 = 0.5 * baseHeight * b;
276
+ adjust(p[0], 0, 0.5 * k1 - k2);
277
+ adjust(p[2], 0, -2 * k1 - k2);
278
+ adjust(p[4], 0, 0.5 * k1 - k2);
279
+ adjust(p[1], 0, -0.5 * k1 + k2);
280
+ adjust(p[3], 0, 2 * k1 + k2);
281
+ adjust(p[5], 0, -0.5 * k1 + k2);
282
+ }
283
+ },
284
+ "folded-corner": {
285
+ engine: "ffd",
286
+ bezier: false,
287
+ hBlocks: 1,
288
+ vBlocks: 0,
289
+ breakLine: true,
290
+ build: (p, { a, b, baseWidth, baseHeight, adjust }) => {
291
+ const k1 = 0.5 * baseWidth * Math.tan(a * 0.5 * PI_DIV_3);
292
+ const k2 = 0.5 * baseHeight * b;
293
+ adjust(p[0], 0, -k1 - k2);
294
+ adjust(p[2], 0, 0.5 * k1 - k2);
295
+ adjust(p[4], 0, -k1 - k2);
296
+ adjust(p[1], 0, +k1 + k2);
297
+ adjust(p[3], 0, -0.5 * k1 + k2);
298
+ adjust(p[5], 0, +k1 + k2);
299
+ }
300
+ },
301
+ "lateral-stretching": {
302
+ engine: "ffd",
303
+ bezier: false,
304
+ hBlocks: 0,
305
+ vBlocks: 0,
306
+ build: (p, { a, baseWidth, adjust }) => {
307
+ const k = 0.5 * baseWidth * a;
308
+ adjust(p[0], -k, 0);
309
+ adjust(p[2], k, 0);
310
+ adjust(p[1], -k, 0);
311
+ adjust(p[3], k, 0);
312
+ }
313
+ },
314
+ "vertical-stretching": {
315
+ engine: "ffd",
316
+ bezier: false,
317
+ hBlocks: 0,
318
+ vBlocks: 0,
319
+ build: (p, { a, baseHeight, adjust }) => {
320
+ const k = 0.5 * baseHeight * a;
321
+ adjust(p[0], 0, -k);
322
+ adjust(p[2], 0, -k);
323
+ adjust(p[1], 0, +k);
324
+ adjust(p[3], 0, +k);
325
+ }
326
+ },
327
+ // ── 逐字 · 位移/旋转(offset)──────────────────────────────────────────
328
+ "patchwork-by-word": {
329
+ engine: "offset",
330
+ defaultIntensities: BY_WORD,
331
+ point: translatePoint,
332
+ perChar: (ctx, { character }) => {
333
+ const { index, fontSize } = character;
334
+ const n = 0.5 * (-1) ** (index + 1) * ctx.intensities[0] * fontSize;
335
+ return { translateVec: ctx.isHorizontal ? new modernPath2d.Vector2(0, -n) : new modernPath2d.Vector2(n, 0) };
336
+ }
337
+ },
338
+ "step-by-word": {
339
+ engine: "offset",
340
+ defaultIntensities: BY_WORD,
341
+ point: translatePoint,
342
+ perChar: (ctx, { character }) => {
343
+ const { left, top } = ctx.boundingBox;
344
+ const { center } = character;
345
+ const translateVec = ctx.isHorizontal ? new modernPath2d.Vector2(0, -((center.x - left) * ctx.intensities[0])) : new modernPath2d.Vector2((center.y - top) * ctx.intensities[0], 0);
346
+ return { translateVec };
347
+ }
348
+ },
349
+ "arch2-by-word": {
350
+ engine: "offset",
351
+ defaultIntensities: BY_WORD,
352
+ point: translatePoint,
353
+ perChar: (ctx, { character }) => {
354
+ const { left, top } = ctx.boundingBox;
355
+ const i = ctx.intensities[0];
356
+ const { center } = character;
357
+ let o;
358
+ let translateVec;
359
+ if (ctx.isHorizontal) {
360
+ o = (center.x - left) / ctx.baseWidth;
361
+ translateVec = new modernPath2d.Vector2(0, -(o * (1 - o) * i * ctx.baseWidth));
362
+ } else {
363
+ o = (center.y - top) / ctx.baseWidth;
364
+ translateVec = new modernPath2d.Vector2(o * (1 - o) * i * ctx.baseWidth, 0);
365
+ }
366
+ return { translateVec };
367
+ }
368
+ },
369
+ "wave-by-word": {
370
+ engine: "offset",
371
+ defaultIntensities: BY_WORD,
372
+ point: translatePoint,
373
+ perChar: (ctx, { character }) => {
374
+ const { width, height, left, top } = ctx.boundingBox;
375
+ const i = ctx.intensities[0];
376
+ const { center } = character;
377
+ let translateVec;
378
+ if (ctx.isHorizontal) {
379
+ const l = (center.x - left) / width * 2 * Math.PI;
380
+ translateVec = new modernPath2d.Vector2(0, -(0.25 * Math.sin(l) * i * width));
381
+ } else {
382
+ const l = (center.y - top) / height * 2 * Math.PI;
383
+ translateVec = new modernPath2d.Vector2(0.25 * Math.sin(l) * i * height, 0);
384
+ }
385
+ return { translateVec };
386
+ }
387
+ },
388
+ "step-far-and-near-by-word": {
389
+ engine: "offset",
390
+ defaultIntensities: BY_WORD,
391
+ point: scalePoint,
392
+ perChar: (ctx, { character }) => {
393
+ const { left, top, width, height } = ctx.boundingBox;
394
+ const { center } = character;
395
+ const s = ctx.intensities[0];
396
+ let l;
397
+ let centerX;
398
+ let centerY;
399
+ if (ctx.isHorizontal) {
400
+ l = (center.x - left) / width;
401
+ centerX = (center.x - left) * (s * l + 1 - s) + left;
402
+ centerY = center.y;
403
+ } else {
404
+ l = (center.y - top) / height;
405
+ centerX = center.x;
406
+ centerY = (center.y - top) * (s * l + 1 - s) + top;
407
+ }
408
+ const t = 2 * (l - 0.5) * s + 1;
409
+ return { centerX, centerY, t, center };
410
+ }
411
+ },
412
+ "arch-far-and-near-by-word": {
413
+ engine: "offset",
414
+ defaultIntensities: BY_WORD,
415
+ point: scalePoint,
416
+ perChar: (ctx, { character }) => {
417
+ const { left, top, width, height } = ctx.boundingBox;
418
+ const boxCenter = new modernPath2d.Vector2(left + 0.5 * width, top + 0.5 * height);
419
+ const n = ctx.intensities[0];
420
+ const { center } = character;
421
+ let h;
422
+ let centerX;
423
+ let centerY;
424
+ if (ctx.isHorizontal) {
425
+ h = 2 * Math.abs(center.x - boxCenter.x) / width;
426
+ centerX = (center.x - boxCenter.x) * (-n * h + 1 + n) + boxCenter.x;
427
+ centerY = center.y;
428
+ } else {
429
+ h = 2 * Math.abs(center.y - boxCenter.y) / height;
430
+ centerX = center.x;
431
+ centerY = (center.y - boxCenter.y) * (-n * h + 1 + n) + boxCenter.y;
432
+ }
433
+ const t = -2 * (h - 0.5) * n + 1;
434
+ return { centerX, centerY, t, center };
435
+ }
436
+ },
437
+ "horizontal-rotate-by-word": {
438
+ engine: "offset",
439
+ defaultIntensities: BY_WORD,
440
+ point: rotatePoint,
441
+ perChar: (ctx, { character }) => {
442
+ const { center } = character;
443
+ const s = 0.333 * ctx.intensities[0] * Math.PI;
444
+ return { cos: Math.cos(s), sin: Math.sin(s), center };
445
+ }
446
+ },
447
+ "arbitrary-offset-rotate-by-word": {
448
+ engine: "offset",
449
+ defaultIntensities: BY_WORD,
450
+ point: (point, arg) => {
451
+ const { cos, sin, diviate, center, isHorizontal } = arg;
452
+ const dx = point.x - center.x;
453
+ const dy = point.y - center.y;
454
+ if (isHorizontal) {
455
+ return [center.x + dx * cos - dy * sin, center.y + diviate + dx * sin + dy * cos];
456
+ }
457
+ return [center.x + diviate + dx * cos - dy * sin, center.y + dx * sin + dy * cos];
458
+ },
459
+ perChar: (ctx, { characterIndex, character }) => {
460
+ const { fontSize, center } = character;
461
+ let o = random(characterIndex * Math.E);
462
+ const e = 0.5 * ctx.intensities[1] * Math.PI * o;
463
+ o = random(characterIndex * characterIndex * Math.E);
464
+ const diviate = 0.5 * ctx.intensities[0] * o * fontSize;
465
+ return { cos: Math.cos(e), sin: Math.sin(e), diviate, center, isHorizontal: ctx.isHorizontal };
466
+ }
467
+ },
468
+ // ── 逐字 · 沿曲线排布(curve)──────────────────────────────────────────
469
+ "horizontal-curved-rotate-by-word": {
470
+ engine: "curve",
471
+ followTangent: true,
472
+ defaultIntensities: BY_WORD,
473
+ makeCurve: (ctx) => {
474
+ const { width, height, left, top } = ctx.boundingBox;
475
+ const center = new modernPath2d.Vector2(left + width / 2, top + height / 2);
476
+ const radius = ctx.lineHeight * 2 / Math.sin(ctx.intensities[0] * Math.PI * 0.5);
477
+ const e = 0.5 * ctx.baseWidth / radius;
478
+ const l = ctx.isHorizontal ? 0 : 0.5 * Math.PI;
479
+ return new curves.CircleCurve(center, radius, l - e, l + e);
480
+ }
481
+ },
482
+ "ellipse-by-word": {
483
+ engine: "curve",
484
+ followTangent: true,
485
+ defaultIntensities: BY_WORD,
486
+ makeCurve: (ctx) => {
487
+ const { width, height, left, top } = ctx.boundingBox;
488
+ const n = ctx.intensities[3] || 0;
489
+ let aX;
490
+ let aY;
491
+ let xRadius;
492
+ let yRadius;
493
+ if (ctx.isHorizontal) {
494
+ aX = left + 0.5 * width;
495
+ aY = top;
496
+ xRadius = 0.5 * width * ctx.intensities[0];
497
+ yRadius = Math.sqrt(1 - n * n) * xRadius;
498
+ } else {
499
+ aX = left;
500
+ aY = top + 0.5 * height;
501
+ yRadius = 0.5 * height * ctx.intensities[0];
502
+ xRadius = Math.sqrt(1 - n * n) * yRadius;
503
+ }
504
+ const startAngle = (ctx.intensities[1] / 1.8 + (ctx.isHorizontal ? 1 : 1.5)) * Math.PI;
505
+ const endAngle = startAngle + ctx.intensities[2] / 1.8 * Math.PI;
506
+ return new curves.EllipseCurve(new modernPath2d.Vector2(aX, aY), xRadius, yRadius, 0, startAngle, endAngle, false);
507
+ }
508
+ },
509
+ "triangle-by-word": {
510
+ engine: "curve",
511
+ followTangent: true,
512
+ expandAlongNormal: true,
513
+ defaultIntensities: BY_WORD,
514
+ makeCurve: (ctx) => makePolygonCurve(ctx)
515
+ },
516
+ "pentagon-by-word": {
517
+ engine: "curve",
518
+ followTangent: true,
519
+ expandAlongNormal: true,
520
+ defaultIntensities: BY_WORD,
521
+ makeCurve: (ctx) => makePolygonCurve(ctx)
522
+ },
523
+ "rectangular-by-word": {
524
+ engine: "curve",
525
+ followTangent: true,
526
+ defaultIntensities: BY_WORD,
527
+ makeCurve: (ctx) => {
528
+ const { center, extent } = shapeBase(ctx);
529
+ const e = ctx.intensities[1];
530
+ const l = ctx.intensities[2];
531
+ const c = l + ctx.intensities[3];
532
+ return new curves.RectangularCurve(center, extent, e, l, c);
533
+ }
534
+ },
535
+ "heart-by-word": {
536
+ engine: "curve",
537
+ followTangent: true,
538
+ defaultIntensities: BY_WORD,
539
+ makeCurve: (ctx) => {
540
+ const { center, extent } = shapeBase(ctx);
541
+ const ratio = ctx.intensities[1];
542
+ const startNum = ratio + ctx.intensities[2];
543
+ return new curves.HeartCurve(center, extent, ratio, startNum);
544
+ }
545
+ }
546
+ };
547
+ function shapeBase(ctx) {
548
+ const { width, height, left, top } = ctx.boundingBox;
549
+ const i0 = ctx.intensities[0];
550
+ return ctx.isHorizontal ? { center: new modernPath2d.Vector2(left + 0.5 * width, top), extent: 0.5 * i0 * width } : { center: new modernPath2d.Vector2(left, top + 0.5 * height), extent: 0.5 * i0 * height };
551
+ }
552
+ function makePolygonCurve(ctx) {
553
+ const { center, extent } = shapeBase(ctx);
554
+ const num = ctx.intensities[1] * 100;
555
+ const startNum = ctx.intensities[2];
556
+ const endNum = startNum + ctx.intensities[3];
557
+ return new curves.PolygonCurve(center, extent, num, startNum, endNum);
558
+ }
559
+ function registerDeformations() {
560
+ for (const name in deformationPresets) {
561
+ deformation.defineDeformation(name, deformationPresets[name]);
562
+ }
563
+ }
564
+
565
+ exports.deformationPresets = deformationPresets;
566
+ exports.registerDeformations = registerDeformations;
@@ -0,0 +1,11 @@
1
+ import { c as DeformationPreset } from '../shared/modern-text.BD7PBYt7.cjs';
2
+ import 'modern-path2d';
3
+ import '../shared/modern-text.D4WopQCu.cjs';
4
+ import 'modern-idoc';
5
+ import 'modern-font';
6
+
7
+ declare const deformationPresets: Record<string, DeformationPreset>;
8
+ /** 把全部官方预设注册到全局注册表 */
9
+ declare function registerDeformations(): void;
10
+
11
+ export { deformationPresets, registerDeformations };
@@ -0,0 +1,11 @@
1
+ import { c as DeformationPreset } from '../shared/modern-text.CYa4lfoG.mjs';
2
+ import 'modern-path2d';
3
+ import '../shared/modern-text.D4WopQCu.mjs';
4
+ import 'modern-idoc';
5
+ import 'modern-font';
6
+
7
+ declare const deformationPresets: Record<string, DeformationPreset>;
8
+ /** 把全部官方预设注册到全局注册表 */
9
+ declare function registerDeformations(): void;
10
+
11
+ export { deformationPresets, registerDeformations };
@@ -0,0 +1,11 @@
1
+ import { c as DeformationPreset } from '../shared/modern-text.BxijkspX.js';
2
+ import 'modern-path2d';
3
+ import '../shared/modern-text.D4WopQCu.js';
4
+ import 'modern-idoc';
5
+ import 'modern-font';
6
+
7
+ declare const deformationPresets: Record<string, DeformationPreset>;
8
+ /** 把全部官方预设注册到全局注册表 */
9
+ declare function registerDeformations(): void;
10
+
11
+ export { deformationPresets, registerDeformations };