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