tegaki 0.2.3 → 0.3.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.
- package/CHANGELOG.md +8 -0
- package/README.md +4 -43
- package/dist/index.d.mts +42 -23
- package/dist/index.mjs +118 -178
- package/dist/index.mjs.map +1 -1
- package/fonts/caveat/bundle.ts +0 -275
- package/fonts/caveat/glyphData.json +1 -1
- package/fonts/italianno/bundle.ts +0 -275
- package/fonts/italianno/glyphData.json +1 -1
- package/fonts/parisienne/bundle.ts +0 -275
- package/fonts/parisienne/glyphData.json +1 -1
- package/fonts/tangerine/bundle.ts +0 -275
- package/fonts/tangerine/glyphData.json +1 -1
- package/package.json +2 -2
- package/src/env.d.ts +0 -6
- package/src/index.ts +1 -0
- package/src/lib/TegakiRenderer.tsx +113 -162
- package/src/lib/drawGlyph.ts +25 -25
- package/src/lib/timeline.ts +6 -5
- package/src/types.ts +13 -8
- package/fonts/caveat/font.json +0 -24472
- package/fonts/caveat/svg/0.svg +0 -12
- package/fonts/caveat/svg/0.tsx +0 -14
- package/fonts/caveat/svg/1.svg +0 -7
- package/fonts/caveat/svg/1.tsx +0 -9
- package/fonts/caveat/svg/2.svg +0 -10
- package/fonts/caveat/svg/2.tsx +0 -12
- package/fonts/caveat/svg/3.svg +0 -12
- package/fonts/caveat/svg/3.tsx +0 -14
- package/fonts/caveat/svg/4.svg +0 -12
- package/fonts/caveat/svg/4.tsx +0 -14
- package/fonts/caveat/svg/5.svg +0 -7
- package/fonts/caveat/svg/5.tsx +0 -9
- package/fonts/caveat/svg/6.svg +0 -7
- package/fonts/caveat/svg/6.tsx +0 -9
- package/fonts/caveat/svg/7.svg +0 -12
- package/fonts/caveat/svg/7.tsx +0 -14
- package/fonts/caveat/svg/8.svg +0 -10
- package/fonts/caveat/svg/8.tsx +0 -12
- package/fonts/caveat/svg/9.svg +0 -12
- package/fonts/caveat/svg/9.tsx +0 -14
- package/fonts/caveat/svg/U+0021.svg +0 -12
- package/fonts/caveat/svg/U+0021.tsx +0 -14
- package/fonts/caveat/svg/U+0022.svg +0 -12
- package/fonts/caveat/svg/U+0022.tsx +0 -14
- package/fonts/caveat/svg/U+0023.svg +0 -22
- package/fonts/caveat/svg/U+0023.tsx +0 -24
- package/fonts/caveat/svg/U+0024.svg +0 -12
- package/fonts/caveat/svg/U+0024.tsx +0 -14
- package/fonts/caveat/svg/U+0025.svg +0 -25
- package/fonts/caveat/svg/U+0025.tsx +0 -27
- package/fonts/caveat/svg/U+0026.svg +0 -10
- package/fonts/caveat/svg/U+0026.tsx +0 -12
- package/fonts/caveat/svg/U+0027.svg +0 -7
- package/fonts/caveat/svg/U+0027.tsx +0 -9
- package/fonts/caveat/svg/U+0028.svg +0 -7
- package/fonts/caveat/svg/U+0028.tsx +0 -9
- package/fonts/caveat/svg/U+0029.svg +0 -7
- package/fonts/caveat/svg/U+0029.tsx +0 -9
- package/fonts/caveat/svg/U+002a.svg +0 -17
- package/fonts/caveat/svg/U+002a.tsx +0 -19
- package/fonts/caveat/svg/U+002b.svg +0 -12
- package/fonts/caveat/svg/U+002b.tsx +0 -14
- package/fonts/caveat/svg/U+002c.svg +0 -7
- package/fonts/caveat/svg/U+002c.tsx +0 -9
- package/fonts/caveat/svg/U+002d.svg +0 -7
- package/fonts/caveat/svg/U+002d.tsx +0 -9
- package/fonts/caveat/svg/U+002e.svg +0 -7
- package/fonts/caveat/svg/U+002e.tsx +0 -9
- package/fonts/caveat/svg/U+002f.svg +0 -12
- package/fonts/caveat/svg/U+002f.tsx +0 -14
- package/fonts/caveat/svg/U+003a.svg +0 -12
- package/fonts/caveat/svg/U+003a.tsx +0 -14
- package/fonts/caveat/svg/U+003b.svg +0 -12
- package/fonts/caveat/svg/U+003b.tsx +0 -14
- package/fonts/caveat/svg/U+003c.svg +0 -12
- package/fonts/caveat/svg/U+003c.tsx +0 -14
- package/fonts/caveat/svg/U+003d.svg +0 -12
- package/fonts/caveat/svg/U+003d.tsx +0 -14
- package/fonts/caveat/svg/U+003e.svg +0 -12
- package/fonts/caveat/svg/U+003e.tsx +0 -14
- package/fonts/caveat/svg/U+003f.svg +0 -12
- package/fonts/caveat/svg/U+003f.tsx +0 -14
- package/fonts/caveat/svg/U+0040.svg +0 -7
- package/fonts/caveat/svg/U+0040.tsx +0 -9
- package/fonts/caveat/svg/U+005c.svg +0 -7
- package/fonts/caveat/svg/U+005c.tsx +0 -9
- package/fonts/caveat/svg/U+005e.svg +0 -7
- package/fonts/caveat/svg/U+005e.tsx +0 -9
- package/fonts/caveat/svg/U+005f.svg +0 -7
- package/fonts/caveat/svg/U+005f.tsx +0 -9
- package/fonts/caveat/svg/U+0060.svg +0 -7
- package/fonts/caveat/svg/U+0060.tsx +0 -9
- package/fonts/caveat/svg/U+007c.svg +0 -7
- package/fonts/caveat/svg/U+007c.tsx +0 -9
- package/fonts/caveat/svg/U+007e.svg +0 -7
- package/fonts/caveat/svg/U+007e.tsx +0 -9
- package/fonts/caveat/svg/a.svg +0 -7
- package/fonts/caveat/svg/a.tsx +0 -9
- package/fonts/caveat/svg/b.svg +0 -12
- package/fonts/caveat/svg/b.tsx +0 -14
- package/fonts/caveat/svg/c.svg +0 -7
- package/fonts/caveat/svg/c.tsx +0 -9
- package/fonts/caveat/svg/d.svg +0 -12
- package/fonts/caveat/svg/d.tsx +0 -14
- package/fonts/caveat/svg/e.svg +0 -7
- package/fonts/caveat/svg/e.tsx +0 -9
- package/fonts/caveat/svg/f.svg +0 -12
- package/fonts/caveat/svg/f.tsx +0 -14
- package/fonts/caveat/svg/g.svg +0 -15
- package/fonts/caveat/svg/g.tsx +0 -17
- package/fonts/caveat/svg/h.svg +0 -7
- package/fonts/caveat/svg/h.tsx +0 -9
- package/fonts/caveat/svg/i.svg +0 -12
- package/fonts/caveat/svg/i.tsx +0 -14
- package/fonts/caveat/svg/j.svg +0 -12
- package/fonts/caveat/svg/j.tsx +0 -14
- package/fonts/caveat/svg/k.svg +0 -15
- package/fonts/caveat/svg/k.tsx +0 -17
- package/fonts/caveat/svg/l.svg +0 -7
- package/fonts/caveat/svg/l.tsx +0 -9
- package/fonts/caveat/svg/m.svg +0 -17
- package/fonts/caveat/svg/m.tsx +0 -19
- package/fonts/caveat/svg/n.svg +0 -17
- package/fonts/caveat/svg/n.tsx +0 -19
- package/fonts/caveat/svg/o.svg +0 -7
- package/fonts/caveat/svg/o.tsx +0 -9
- package/fonts/caveat/svg/p.svg +0 -12
- package/fonts/caveat/svg/p.tsx +0 -14
- package/fonts/caveat/svg/q.svg +0 -7
- package/fonts/caveat/svg/q.tsx +0 -9
- package/fonts/caveat/svg/r.svg +0 -12
- package/fonts/caveat/svg/r.tsx +0 -14
- package/fonts/caveat/svg/s.svg +0 -7
- package/fonts/caveat/svg/s.tsx +0 -9
- package/fonts/caveat/svg/t.svg +0 -20
- package/fonts/caveat/svg/t.tsx +0 -22
- package/fonts/caveat/svg/u.svg +0 -12
- package/fonts/caveat/svg/u.tsx +0 -14
- package/fonts/caveat/svg/upper_A.svg +0 -12
- package/fonts/caveat/svg/upper_A.tsx +0 -14
- package/fonts/caveat/svg/upper_B.svg +0 -17
- package/fonts/caveat/svg/upper_B.tsx +0 -19
- package/fonts/caveat/svg/upper_C.svg +0 -7
- package/fonts/caveat/svg/upper_C.tsx +0 -9
- package/fonts/caveat/svg/upper_D.svg +0 -12
- package/fonts/caveat/svg/upper_D.tsx +0 -14
- package/fonts/caveat/svg/upper_E.svg +0 -12
- package/fonts/caveat/svg/upper_E.tsx +0 -14
- package/fonts/caveat/svg/upper_F.svg +0 -17
- package/fonts/caveat/svg/upper_F.tsx +0 -19
- package/fonts/caveat/svg/upper_G.svg +0 -7
- package/fonts/caveat/svg/upper_G.tsx +0 -9
- package/fonts/caveat/svg/upper_H.svg +0 -17
- package/fonts/caveat/svg/upper_H.tsx +0 -19
- package/fonts/caveat/svg/upper_I.svg +0 -17
- package/fonts/caveat/svg/upper_I.tsx +0 -19
- package/fonts/caveat/svg/upper_J.svg +0 -7
- package/fonts/caveat/svg/upper_J.tsx +0 -9
- package/fonts/caveat/svg/upper_K.svg +0 -12
- package/fonts/caveat/svg/upper_K.tsx +0 -14
- package/fonts/caveat/svg/upper_L.svg +0 -7
- package/fonts/caveat/svg/upper_L.tsx +0 -9
- package/fonts/caveat/svg/upper_M.svg +0 -17
- package/fonts/caveat/svg/upper_M.tsx +0 -19
- package/fonts/caveat/svg/upper_N.svg +0 -7
- package/fonts/caveat/svg/upper_N.tsx +0 -9
- package/fonts/caveat/svg/upper_O.svg +0 -7
- package/fonts/caveat/svg/upper_O.tsx +0 -9
- package/fonts/caveat/svg/upper_P.svg +0 -12
- package/fonts/caveat/svg/upper_P.tsx +0 -14
- package/fonts/caveat/svg/upper_Q.svg +0 -15
- package/fonts/caveat/svg/upper_Q.tsx +0 -17
- package/fonts/caveat/svg/upper_R.svg +0 -12
- package/fonts/caveat/svg/upper_R.tsx +0 -14
- package/fonts/caveat/svg/upper_S.svg +0 -7
- package/fonts/caveat/svg/upper_S.tsx +0 -9
- package/fonts/caveat/svg/upper_T.svg +0 -12
- package/fonts/caveat/svg/upper_T.tsx +0 -14
- package/fonts/caveat/svg/upper_U.svg +0 -15
- package/fonts/caveat/svg/upper_U.tsx +0 -17
- package/fonts/caveat/svg/upper_V.svg +0 -12
- package/fonts/caveat/svg/upper_V.tsx +0 -14
- package/fonts/caveat/svg/upper_W.svg +0 -12
- package/fonts/caveat/svg/upper_W.tsx +0 -14
- package/fonts/caveat/svg/upper_X.svg +0 -12
- package/fonts/caveat/svg/upper_X.tsx +0 -14
- package/fonts/caveat/svg/upper_Y.svg +0 -12
- package/fonts/caveat/svg/upper_Y.tsx +0 -14
- package/fonts/caveat/svg/upper_Z.svg +0 -7
- package/fonts/caveat/svg/upper_Z.tsx +0 -9
- package/fonts/caveat/svg/v.svg +0 -7
- package/fonts/caveat/svg/v.tsx +0 -9
- package/fonts/caveat/svg/w.svg +0 -12
- package/fonts/caveat/svg/w.tsx +0 -14
- package/fonts/caveat/svg/x.svg +0 -17
- package/fonts/caveat/svg/x.tsx +0 -19
- package/fonts/caveat/svg/y.svg +0 -12
- package/fonts/caveat/svg/y.tsx +0 -14
- package/fonts/caveat/svg/z.svg +0 -7
- package/fonts/caveat/svg/z.tsx +0 -9
- package/fonts/italianno/font.json +0 -33410
- package/fonts/italianno/svg/0.svg +0 -10
- package/fonts/italianno/svg/0.tsx +0 -12
- package/fonts/italianno/svg/1.svg +0 -17
- package/fonts/italianno/svg/1.tsx +0 -19
- package/fonts/italianno/svg/2.svg +0 -12
- package/fonts/italianno/svg/2.tsx +0 -14
- package/fonts/italianno/svg/3.svg +0 -17
- package/fonts/italianno/svg/3.tsx +0 -19
- package/fonts/italianno/svg/4.svg +0 -22
- package/fonts/italianno/svg/4.tsx +0 -24
- package/fonts/italianno/svg/5.svg +0 -12
- package/fonts/italianno/svg/5.tsx +0 -14
- package/fonts/italianno/svg/6.svg +0 -13
- package/fonts/italianno/svg/6.tsx +0 -15
- package/fonts/italianno/svg/7.svg +0 -12
- package/fonts/italianno/svg/7.tsx +0 -14
- package/fonts/italianno/svg/8.svg +0 -7
- package/fonts/italianno/svg/8.tsx +0 -9
- package/fonts/italianno/svg/9.svg +0 -12
- package/fonts/italianno/svg/9.tsx +0 -14
- package/fonts/italianno/svg/U+0021.svg +0 -12
- package/fonts/italianno/svg/U+0021.tsx +0 -14
- package/fonts/italianno/svg/U+0022.svg +0 -15
- package/fonts/italianno/svg/U+0022.tsx +0 -17
- package/fonts/italianno/svg/U+0023.svg +0 -22
- package/fonts/italianno/svg/U+0023.tsx +0 -24
- package/fonts/italianno/svg/U+0024.svg +0 -25
- package/fonts/italianno/svg/U+0024.tsx +0 -27
- package/fonts/italianno/svg/U+0025.svg +0 -22
- package/fonts/italianno/svg/U+0025.tsx +0 -24
- package/fonts/italianno/svg/U+0026.svg +0 -17
- package/fonts/italianno/svg/U+0026.tsx +0 -19
- package/fonts/italianno/svg/U+0027.svg +0 -7
- package/fonts/italianno/svg/U+0027.tsx +0 -9
- package/fonts/italianno/svg/U+0028.svg +0 -7
- package/fonts/italianno/svg/U+0028.tsx +0 -9
- package/fonts/italianno/svg/U+0029.svg +0 -7
- package/fonts/italianno/svg/U+0029.tsx +0 -9
- package/fonts/italianno/svg/U+002a.svg +0 -22
- package/fonts/italianno/svg/U+002a.tsx +0 -24
- package/fonts/italianno/svg/U+002b.svg +0 -12
- package/fonts/italianno/svg/U+002b.tsx +0 -14
- package/fonts/italianno/svg/U+002c.svg +0 -12
- package/fonts/italianno/svg/U+002c.tsx +0 -14
- package/fonts/italianno/svg/U+002d.svg +0 -7
- package/fonts/italianno/svg/U+002d.tsx +0 -9
- package/fonts/italianno/svg/U+002e.svg +0 -7
- package/fonts/italianno/svg/U+002e.tsx +0 -9
- package/fonts/italianno/svg/U+002f.svg +0 -7
- package/fonts/italianno/svg/U+002f.tsx +0 -9
- package/fonts/italianno/svg/U+003a.svg +0 -12
- package/fonts/italianno/svg/U+003a.tsx +0 -14
- package/fonts/italianno/svg/U+003b.svg +0 -12
- package/fonts/italianno/svg/U+003b.tsx +0 -14
- package/fonts/italianno/svg/U+003c.svg +0 -7
- package/fonts/italianno/svg/U+003c.tsx +0 -9
- package/fonts/italianno/svg/U+003d.svg +0 -12
- package/fonts/italianno/svg/U+003d.tsx +0 -14
- package/fonts/italianno/svg/U+003e.svg +0 -12
- package/fonts/italianno/svg/U+003e.tsx +0 -14
- package/fonts/italianno/svg/U+003f.svg +0 -12
- package/fonts/italianno/svg/U+003f.tsx +0 -14
- package/fonts/italianno/svg/U+0040.svg +0 -15
- package/fonts/italianno/svg/U+0040.tsx +0 -17
- package/fonts/italianno/svg/U+005c.svg +0 -7
- package/fonts/italianno/svg/U+005c.tsx +0 -9
- package/fonts/italianno/svg/U+005e.svg +0 -12
- package/fonts/italianno/svg/U+005e.tsx +0 -14
- package/fonts/italianno/svg/U+005f.svg +0 -3
- package/fonts/italianno/svg/U+005f.tsx +0 -5
- package/fonts/italianno/svg/U+0060.svg +0 -10
- package/fonts/italianno/svg/U+0060.tsx +0 -12
- package/fonts/italianno/svg/U+007c.svg +0 -7
- package/fonts/italianno/svg/U+007c.tsx +0 -9
- package/fonts/italianno/svg/U+007e.svg +0 -7
- package/fonts/italianno/svg/U+007e.tsx +0 -9
- package/fonts/italianno/svg/a.svg +0 -12
- package/fonts/italianno/svg/a.tsx +0 -14
- package/fonts/italianno/svg/b.svg +0 -10
- package/fonts/italianno/svg/b.tsx +0 -12
- package/fonts/italianno/svg/c.svg +0 -10
- package/fonts/italianno/svg/c.tsx +0 -12
- package/fonts/italianno/svg/d.svg +0 -15
- package/fonts/italianno/svg/d.tsx +0 -17
- package/fonts/italianno/svg/e.svg +0 -12
- package/fonts/italianno/svg/e.tsx +0 -14
- package/fonts/italianno/svg/f.svg +0 -12
- package/fonts/italianno/svg/f.tsx +0 -14
- package/fonts/italianno/svg/g.svg +0 -12
- package/fonts/italianno/svg/g.tsx +0 -14
- package/fonts/italianno/svg/h.svg +0 -12
- package/fonts/italianno/svg/h.tsx +0 -14
- package/fonts/italianno/svg/i.svg +0 -17
- package/fonts/italianno/svg/i.tsx +0 -19
- package/fonts/italianno/svg/j.svg +0 -12
- package/fonts/italianno/svg/j.tsx +0 -14
- package/fonts/italianno/svg/k.svg +0 -17
- package/fonts/italianno/svg/k.tsx +0 -19
- package/fonts/italianno/svg/l.svg +0 -15
- package/fonts/italianno/svg/l.tsx +0 -17
- package/fonts/italianno/svg/m.svg +0 -27
- package/fonts/italianno/svg/m.tsx +0 -29
- package/fonts/italianno/svg/n.svg +0 -22
- package/fonts/italianno/svg/n.tsx +0 -24
- package/fonts/italianno/svg/o.svg +0 -20
- package/fonts/italianno/svg/o.tsx +0 -22
- package/fonts/italianno/svg/p.svg +0 -12
- package/fonts/italianno/svg/p.tsx +0 -14
- package/fonts/italianno/svg/q.svg +0 -17
- package/fonts/italianno/svg/q.tsx +0 -19
- package/fonts/italianno/svg/r.svg +0 -22
- package/fonts/italianno/svg/r.tsx +0 -24
- package/fonts/italianno/svg/s.svg +0 -15
- package/fonts/italianno/svg/s.tsx +0 -17
- package/fonts/italianno/svg/t.svg +0 -17
- package/fonts/italianno/svg/t.tsx +0 -19
- package/fonts/italianno/svg/u.svg +0 -12
- package/fonts/italianno/svg/u.tsx +0 -14
- package/fonts/italianno/svg/upper_A.svg +0 -17
- package/fonts/italianno/svg/upper_A.tsx +0 -19
- package/fonts/italianno/svg/upper_B.svg +0 -27
- package/fonts/italianno/svg/upper_B.tsx +0 -29
- package/fonts/italianno/svg/upper_C.svg +0 -7
- package/fonts/italianno/svg/upper_C.tsx +0 -9
- package/fonts/italianno/svg/upper_D.svg +0 -12
- package/fonts/italianno/svg/upper_D.tsx +0 -14
- package/fonts/italianno/svg/upper_E.svg +0 -17
- package/fonts/italianno/svg/upper_E.tsx +0 -19
- package/fonts/italianno/svg/upper_F.svg +0 -17
- package/fonts/italianno/svg/upper_F.tsx +0 -19
- package/fonts/italianno/svg/upper_G.svg +0 -20
- package/fonts/italianno/svg/upper_G.tsx +0 -22
- package/fonts/italianno/svg/upper_H.svg +0 -17
- package/fonts/italianno/svg/upper_H.tsx +0 -19
- package/fonts/italianno/svg/upper_I.svg +0 -12
- package/fonts/italianno/svg/upper_I.tsx +0 -14
- package/fonts/italianno/svg/upper_J.svg +0 -10
- package/fonts/italianno/svg/upper_J.tsx +0 -12
- package/fonts/italianno/svg/upper_K.svg +0 -20
- package/fonts/italianno/svg/upper_K.tsx +0 -22
- package/fonts/italianno/svg/upper_L.svg +0 -12
- package/fonts/italianno/svg/upper_L.tsx +0 -14
- package/fonts/italianno/svg/upper_M.svg +0 -17
- package/fonts/italianno/svg/upper_M.tsx +0 -19
- package/fonts/italianno/svg/upper_N.svg +0 -17
- package/fonts/italianno/svg/upper_N.tsx +0 -19
- package/fonts/italianno/svg/upper_O.svg +0 -17
- package/fonts/italianno/svg/upper_O.tsx +0 -19
- package/fonts/italianno/svg/upper_P.svg +0 -22
- package/fonts/italianno/svg/upper_P.tsx +0 -24
- package/fonts/italianno/svg/upper_Q.svg +0 -12
- package/fonts/italianno/svg/upper_Q.tsx +0 -14
- package/fonts/italianno/svg/upper_R.svg +0 -15
- package/fonts/italianno/svg/upper_R.tsx +0 -17
- package/fonts/italianno/svg/upper_S.svg +0 -12
- package/fonts/italianno/svg/upper_S.tsx +0 -14
- package/fonts/italianno/svg/upper_T.svg +0 -17
- package/fonts/italianno/svg/upper_T.tsx +0 -19
- package/fonts/italianno/svg/upper_U.svg +0 -17
- package/fonts/italianno/svg/upper_U.tsx +0 -19
- package/fonts/italianno/svg/upper_V.svg +0 -17
- package/fonts/italianno/svg/upper_V.tsx +0 -19
- package/fonts/italianno/svg/upper_W.svg +0 -17
- package/fonts/italianno/svg/upper_W.tsx +0 -19
- package/fonts/italianno/svg/upper_X.svg +0 -22
- package/fonts/italianno/svg/upper_X.tsx +0 -24
- package/fonts/italianno/svg/upper_Y.svg +0 -22
- package/fonts/italianno/svg/upper_Y.tsx +0 -24
- package/fonts/italianno/svg/upper_Z.svg +0 -12
- package/fonts/italianno/svg/upper_Z.tsx +0 -14
- package/fonts/italianno/svg/v.svg +0 -17
- package/fonts/italianno/svg/v.tsx +0 -19
- package/fonts/italianno/svg/w.svg +0 -17
- package/fonts/italianno/svg/w.tsx +0 -19
- package/fonts/italianno/svg/x.svg +0 -15
- package/fonts/italianno/svg/x.tsx +0 -17
- package/fonts/italianno/svg/y.svg +0 -12
- package/fonts/italianno/svg/y.tsx +0 -14
- package/fonts/italianno/svg/z.svg +0 -17
- package/fonts/italianno/svg/z.tsx +0 -19
- package/fonts/parisienne/font.json +0 -36222
- package/fonts/parisienne/svg/0.svg +0 -7
- package/fonts/parisienne/svg/0.tsx +0 -9
- package/fonts/parisienne/svg/1.svg +0 -12
- package/fonts/parisienne/svg/1.tsx +0 -14
- package/fonts/parisienne/svg/2.svg +0 -7
- package/fonts/parisienne/svg/2.tsx +0 -9
- package/fonts/parisienne/svg/3.svg +0 -7
- package/fonts/parisienne/svg/3.tsx +0 -9
- package/fonts/parisienne/svg/4.svg +0 -17
- package/fonts/parisienne/svg/4.tsx +0 -19
- package/fonts/parisienne/svg/5.svg +0 -10
- package/fonts/parisienne/svg/5.tsx +0 -12
- package/fonts/parisienne/svg/6.svg +0 -7
- package/fonts/parisienne/svg/6.tsx +0 -9
- package/fonts/parisienne/svg/7.svg +0 -12
- package/fonts/parisienne/svg/7.tsx +0 -14
- package/fonts/parisienne/svg/8.svg +0 -7
- package/fonts/parisienne/svg/8.tsx +0 -9
- package/fonts/parisienne/svg/9.svg +0 -7
- package/fonts/parisienne/svg/9.tsx +0 -9
- package/fonts/parisienne/svg/U+0021.svg +0 -10
- package/fonts/parisienne/svg/U+0021.tsx +0 -12
- package/fonts/parisienne/svg/U+0022.svg +0 -12
- package/fonts/parisienne/svg/U+0022.tsx +0 -14
- package/fonts/parisienne/svg/U+0023.svg +0 -22
- package/fonts/parisienne/svg/U+0023.tsx +0 -24
- package/fonts/parisienne/svg/U+0024.svg +0 -15
- package/fonts/parisienne/svg/U+0024.tsx +0 -17
- package/fonts/parisienne/svg/U+0025.svg +0 -22
- package/fonts/parisienne/svg/U+0025.tsx +0 -24
- package/fonts/parisienne/svg/U+0026.svg +0 -17
- package/fonts/parisienne/svg/U+0026.tsx +0 -19
- package/fonts/parisienne/svg/U+0027.svg +0 -7
- package/fonts/parisienne/svg/U+0027.tsx +0 -9
- package/fonts/parisienne/svg/U+0028.svg +0 -7
- package/fonts/parisienne/svg/U+0028.tsx +0 -9
- package/fonts/parisienne/svg/U+0029.svg +0 -7
- package/fonts/parisienne/svg/U+0029.tsx +0 -9
- package/fonts/parisienne/svg/U+002a.svg +0 -22
- package/fonts/parisienne/svg/U+002a.tsx +0 -24
- package/fonts/parisienne/svg/U+002b.svg +0 -12
- package/fonts/parisienne/svg/U+002b.tsx +0 -14
- package/fonts/parisienne/svg/U+002c.svg +0 -7
- package/fonts/parisienne/svg/U+002c.tsx +0 -9
- package/fonts/parisienne/svg/U+002d.svg +0 -7
- package/fonts/parisienne/svg/U+002d.tsx +0 -9
- package/fonts/parisienne/svg/U+002e.svg +0 -7
- package/fonts/parisienne/svg/U+002e.tsx +0 -9
- package/fonts/parisienne/svg/U+002f.svg +0 -7
- package/fonts/parisienne/svg/U+002f.tsx +0 -9
- package/fonts/parisienne/svg/U+003a.svg +0 -8
- package/fonts/parisienne/svg/U+003a.tsx +0 -10
- package/fonts/parisienne/svg/U+003b.svg +0 -10
- package/fonts/parisienne/svg/U+003b.tsx +0 -12
- package/fonts/parisienne/svg/U+003c.svg +0 -7
- package/fonts/parisienne/svg/U+003c.tsx +0 -9
- package/fonts/parisienne/svg/U+003d.svg +0 -12
- package/fonts/parisienne/svg/U+003d.tsx +0 -14
- package/fonts/parisienne/svg/U+003e.svg +0 -7
- package/fonts/parisienne/svg/U+003e.tsx +0 -9
- package/fonts/parisienne/svg/U+003f.svg +0 -10
- package/fonts/parisienne/svg/U+003f.tsx +0 -12
- package/fonts/parisienne/svg/U+0040.svg +0 -15
- package/fonts/parisienne/svg/U+0040.tsx +0 -17
- package/fonts/parisienne/svg/U+005c.svg +0 -7
- package/fonts/parisienne/svg/U+005c.tsx +0 -9
- package/fonts/parisienne/svg/U+005e.svg +0 -7
- package/fonts/parisienne/svg/U+005e.tsx +0 -9
- package/fonts/parisienne/svg/U+005f.svg +0 -7
- package/fonts/parisienne/svg/U+005f.tsx +0 -9
- package/fonts/parisienne/svg/U+0060.svg +0 -10
- package/fonts/parisienne/svg/U+0060.tsx +0 -12
- package/fonts/parisienne/svg/U+007c.svg +0 -7
- package/fonts/parisienne/svg/U+007c.tsx +0 -9
- package/fonts/parisienne/svg/U+007e.svg +0 -7
- package/fonts/parisienne/svg/U+007e.tsx +0 -9
- package/fonts/parisienne/svg/a.svg +0 -15
- package/fonts/parisienne/svg/a.tsx +0 -17
- package/fonts/parisienne/svg/b.svg +0 -7
- package/fonts/parisienne/svg/b.tsx +0 -9
- package/fonts/parisienne/svg/c.svg +0 -12
- package/fonts/parisienne/svg/c.tsx +0 -14
- package/fonts/parisienne/svg/d.svg +0 -12
- package/fonts/parisienne/svg/d.tsx +0 -14
- package/fonts/parisienne/svg/e.svg +0 -17
- package/fonts/parisienne/svg/e.tsx +0 -19
- package/fonts/parisienne/svg/f.svg +0 -12
- package/fonts/parisienne/svg/f.tsx +0 -14
- package/fonts/parisienne/svg/g.svg +0 -10
- package/fonts/parisienne/svg/g.tsx +0 -12
- package/fonts/parisienne/svg/h.svg +0 -12
- package/fonts/parisienne/svg/h.tsx +0 -14
- package/fonts/parisienne/svg/i.svg +0 -12
- package/fonts/parisienne/svg/i.tsx +0 -14
- package/fonts/parisienne/svg/j.svg +0 -17
- package/fonts/parisienne/svg/j.tsx +0 -19
- package/fonts/parisienne/svg/k.svg +0 -17
- package/fonts/parisienne/svg/k.tsx +0 -19
- package/fonts/parisienne/svg/l.svg +0 -7
- package/fonts/parisienne/svg/l.tsx +0 -9
- package/fonts/parisienne/svg/m.svg +0 -17
- package/fonts/parisienne/svg/m.tsx +0 -19
- package/fonts/parisienne/svg/n.svg +0 -12
- package/fonts/parisienne/svg/n.tsx +0 -14
- package/fonts/parisienne/svg/o.svg +0 -15
- package/fonts/parisienne/svg/o.tsx +0 -17
- package/fonts/parisienne/svg/p.svg +0 -12
- package/fonts/parisienne/svg/p.tsx +0 -14
- package/fonts/parisienne/svg/q.svg +0 -12
- package/fonts/parisienne/svg/q.tsx +0 -14
- package/fonts/parisienne/svg/r.svg +0 -7
- package/fonts/parisienne/svg/r.tsx +0 -9
- package/fonts/parisienne/svg/s.svg +0 -17
- package/fonts/parisienne/svg/s.tsx +0 -19
- package/fonts/parisienne/svg/t.svg +0 -20
- package/fonts/parisienne/svg/t.tsx +0 -22
- package/fonts/parisienne/svg/u.svg +0 -12
- package/fonts/parisienne/svg/u.tsx +0 -14
- package/fonts/parisienne/svg/upper_A.svg +0 -10
- package/fonts/parisienne/svg/upper_A.tsx +0 -12
- package/fonts/parisienne/svg/upper_B.svg +0 -12
- package/fonts/parisienne/svg/upper_B.tsx +0 -14
- package/fonts/parisienne/svg/upper_C.svg +0 -7
- package/fonts/parisienne/svg/upper_C.tsx +0 -9
- package/fonts/parisienne/svg/upper_D.svg +0 -7
- package/fonts/parisienne/svg/upper_D.tsx +0 -9
- package/fonts/parisienne/svg/upper_E.svg +0 -10
- package/fonts/parisienne/svg/upper_E.tsx +0 -12
- package/fonts/parisienne/svg/upper_F.svg +0 -22
- package/fonts/parisienne/svg/upper_F.tsx +0 -24
- package/fonts/parisienne/svg/upper_G.svg +0 -15
- package/fonts/parisienne/svg/upper_G.tsx +0 -17
- package/fonts/parisienne/svg/upper_H.svg +0 -15
- package/fonts/parisienne/svg/upper_H.tsx +0 -17
- package/fonts/parisienne/svg/upper_I.svg +0 -15
- package/fonts/parisienne/svg/upper_I.tsx +0 -17
- package/fonts/parisienne/svg/upper_J.svg +0 -15
- package/fonts/parisienne/svg/upper_J.tsx +0 -17
- package/fonts/parisienne/svg/upper_K.svg +0 -12
- package/fonts/parisienne/svg/upper_K.tsx +0 -14
- package/fonts/parisienne/svg/upper_L.svg +0 -7
- package/fonts/parisienne/svg/upper_L.tsx +0 -9
- package/fonts/parisienne/svg/upper_M.svg +0 -15
- package/fonts/parisienne/svg/upper_M.tsx +0 -17
- package/fonts/parisienne/svg/upper_N.svg +0 -12
- package/fonts/parisienne/svg/upper_N.tsx +0 -14
- package/fonts/parisienne/svg/upper_O.svg +0 -7
- package/fonts/parisienne/svg/upper_O.tsx +0 -9
- package/fonts/parisienne/svg/upper_P.svg +0 -12
- package/fonts/parisienne/svg/upper_P.tsx +0 -14
- package/fonts/parisienne/svg/upper_Q.svg +0 -15
- package/fonts/parisienne/svg/upper_Q.tsx +0 -17
- package/fonts/parisienne/svg/upper_R.svg +0 -12
- package/fonts/parisienne/svg/upper_R.tsx +0 -14
- package/fonts/parisienne/svg/upper_S.svg +0 -7
- package/fonts/parisienne/svg/upper_S.tsx +0 -9
- package/fonts/parisienne/svg/upper_T.svg +0 -12
- package/fonts/parisienne/svg/upper_T.tsx +0 -14
- package/fonts/parisienne/svg/upper_U.svg +0 -17
- package/fonts/parisienne/svg/upper_U.tsx +0 -19
- package/fonts/parisienne/svg/upper_V.svg +0 -7
- package/fonts/parisienne/svg/upper_V.tsx +0 -9
- package/fonts/parisienne/svg/upper_W.svg +0 -12
- package/fonts/parisienne/svg/upper_W.tsx +0 -14
- package/fonts/parisienne/svg/upper_X.svg +0 -27
- package/fonts/parisienne/svg/upper_X.tsx +0 -29
- package/fonts/parisienne/svg/upper_Y.svg +0 -15
- package/fonts/parisienne/svg/upper_Y.tsx +0 -17
- package/fonts/parisienne/svg/upper_Z.svg +0 -12
- package/fonts/parisienne/svg/upper_Z.tsx +0 -14
- package/fonts/parisienne/svg/v.svg +0 -7
- package/fonts/parisienne/svg/v.tsx +0 -9
- package/fonts/parisienne/svg/w.svg +0 -17
- package/fonts/parisienne/svg/w.tsx +0 -19
- package/fonts/parisienne/svg/x.svg +0 -17
- package/fonts/parisienne/svg/x.tsx +0 -19
- package/fonts/parisienne/svg/y.svg +0 -17
- package/fonts/parisienne/svg/y.tsx +0 -19
- package/fonts/parisienne/svg/z.svg +0 -12
- package/fonts/parisienne/svg/z.tsx +0 -14
- package/fonts/tangerine/font.json +0 -31512
- package/fonts/tangerine/svg/0.svg +0 -7
- package/fonts/tangerine/svg/0.tsx +0 -9
- package/fonts/tangerine/svg/1.svg +0 -12
- package/fonts/tangerine/svg/1.tsx +0 -14
- package/fonts/tangerine/svg/2.svg +0 -12
- package/fonts/tangerine/svg/2.tsx +0 -14
- package/fonts/tangerine/svg/3.svg +0 -12
- package/fonts/tangerine/svg/3.tsx +0 -14
- package/fonts/tangerine/svg/4.svg +0 -12
- package/fonts/tangerine/svg/4.tsx +0 -14
- package/fonts/tangerine/svg/5.svg +0 -7
- package/fonts/tangerine/svg/5.tsx +0 -9
- package/fonts/tangerine/svg/6.svg +0 -7
- package/fonts/tangerine/svg/6.tsx +0 -9
- package/fonts/tangerine/svg/7.svg +0 -12
- package/fonts/tangerine/svg/7.tsx +0 -14
- package/fonts/tangerine/svg/8.svg +0 -7
- package/fonts/tangerine/svg/8.tsx +0 -9
- package/fonts/tangerine/svg/9.svg +0 -7
- package/fonts/tangerine/svg/9.tsx +0 -9
- package/fonts/tangerine/svg/U+0021.svg +0 -12
- package/fonts/tangerine/svg/U+0021.tsx +0 -14
- package/fonts/tangerine/svg/U+0022.svg +0 -12
- package/fonts/tangerine/svg/U+0022.tsx +0 -14
- package/fonts/tangerine/svg/U+0023.svg +0 -22
- package/fonts/tangerine/svg/U+0023.tsx +0 -24
- package/fonts/tangerine/svg/U+0024.svg +0 -12
- package/fonts/tangerine/svg/U+0024.tsx +0 -14
- package/fonts/tangerine/svg/U+0025.svg +0 -17
- package/fonts/tangerine/svg/U+0025.tsx +0 -19
- package/fonts/tangerine/svg/U+0026.svg +0 -7
- package/fonts/tangerine/svg/U+0026.tsx +0 -9
- package/fonts/tangerine/svg/U+0027.svg +0 -7
- package/fonts/tangerine/svg/U+0027.tsx +0 -9
- package/fonts/tangerine/svg/U+0028.svg +0 -7
- package/fonts/tangerine/svg/U+0028.tsx +0 -9
- package/fonts/tangerine/svg/U+0029.svg +0 -7
- package/fonts/tangerine/svg/U+0029.tsx +0 -9
- package/fonts/tangerine/svg/U+002a.svg +0 -17
- package/fonts/tangerine/svg/U+002a.tsx +0 -19
- package/fonts/tangerine/svg/U+002b.svg +0 -12
- package/fonts/tangerine/svg/U+002b.tsx +0 -14
- package/fonts/tangerine/svg/U+002c.svg +0 -10
- package/fonts/tangerine/svg/U+002c.tsx +0 -12
- package/fonts/tangerine/svg/U+002d.svg +0 -7
- package/fonts/tangerine/svg/U+002d.tsx +0 -9
- package/fonts/tangerine/svg/U+002e.svg +0 -10
- package/fonts/tangerine/svg/U+002e.tsx +0 -12
- package/fonts/tangerine/svg/U+002f.svg +0 -7
- package/fonts/tangerine/svg/U+002f.tsx +0 -9
- package/fonts/tangerine/svg/U+003a.svg +0 -12
- package/fonts/tangerine/svg/U+003a.tsx +0 -14
- package/fonts/tangerine/svg/U+003b.svg +0 -12
- package/fonts/tangerine/svg/U+003b.tsx +0 -14
- package/fonts/tangerine/svg/U+003c.svg +0 -12
- package/fonts/tangerine/svg/U+003c.tsx +0 -14
- package/fonts/tangerine/svg/U+003d.svg +0 -12
- package/fonts/tangerine/svg/U+003d.tsx +0 -14
- package/fonts/tangerine/svg/U+003e.svg +0 -12
- package/fonts/tangerine/svg/U+003e.tsx +0 -14
- package/fonts/tangerine/svg/U+003f.svg +0 -12
- package/fonts/tangerine/svg/U+003f.tsx +0 -14
- package/fonts/tangerine/svg/U+0040.svg +0 -15
- package/fonts/tangerine/svg/U+0040.tsx +0 -17
- package/fonts/tangerine/svg/U+005c.svg +0 -7
- package/fonts/tangerine/svg/U+005c.tsx +0 -9
- package/fonts/tangerine/svg/U+005e.svg +0 -12
- package/fonts/tangerine/svg/U+005e.tsx +0 -14
- package/fonts/tangerine/svg/U+005f.svg +0 -7
- package/fonts/tangerine/svg/U+005f.tsx +0 -9
- package/fonts/tangerine/svg/U+0060.svg +0 -7
- package/fonts/tangerine/svg/U+0060.tsx +0 -9
- package/fonts/tangerine/svg/U+007c.svg +0 -7
- package/fonts/tangerine/svg/U+007c.tsx +0 -9
- package/fonts/tangerine/svg/U+007e.svg +0 -7
- package/fonts/tangerine/svg/U+007e.tsx +0 -9
- package/fonts/tangerine/svg/a.svg +0 -12
- package/fonts/tangerine/svg/a.tsx +0 -14
- package/fonts/tangerine/svg/b.svg +0 -7
- package/fonts/tangerine/svg/b.tsx +0 -9
- package/fonts/tangerine/svg/c.svg +0 -7
- package/fonts/tangerine/svg/c.tsx +0 -9
- package/fonts/tangerine/svg/d.svg +0 -12
- package/fonts/tangerine/svg/d.tsx +0 -14
- package/fonts/tangerine/svg/e.svg +0 -15
- package/fonts/tangerine/svg/e.tsx +0 -17
- package/fonts/tangerine/svg/f.svg +0 -15
- package/fonts/tangerine/svg/f.tsx +0 -17
- package/fonts/tangerine/svg/g.svg +0 -12
- package/fonts/tangerine/svg/g.tsx +0 -14
- package/fonts/tangerine/svg/h.svg +0 -12
- package/fonts/tangerine/svg/h.tsx +0 -14
- package/fonts/tangerine/svg/i.svg +0 -15
- package/fonts/tangerine/svg/i.tsx +0 -17
- package/fonts/tangerine/svg/j.svg +0 -12
- package/fonts/tangerine/svg/j.tsx +0 -14
- package/fonts/tangerine/svg/k.svg +0 -12
- package/fonts/tangerine/svg/k.tsx +0 -14
- package/fonts/tangerine/svg/l.svg +0 -7
- package/fonts/tangerine/svg/l.tsx +0 -9
- package/fonts/tangerine/svg/m.svg +0 -17
- package/fonts/tangerine/svg/m.tsx +0 -19
- package/fonts/tangerine/svg/n.svg +0 -12
- package/fonts/tangerine/svg/n.tsx +0 -14
- package/fonts/tangerine/svg/o.svg +0 -12
- package/fonts/tangerine/svg/o.tsx +0 -14
- package/fonts/tangerine/svg/p.svg +0 -17
- package/fonts/tangerine/svg/p.tsx +0 -19
- package/fonts/tangerine/svg/q.svg +0 -15
- package/fonts/tangerine/svg/q.tsx +0 -17
- package/fonts/tangerine/svg/r.svg +0 -17
- package/fonts/tangerine/svg/r.tsx +0 -19
- package/fonts/tangerine/svg/s.svg +0 -10
- package/fonts/tangerine/svg/s.tsx +0 -12
- package/fonts/tangerine/svg/t.svg +0 -17
- package/fonts/tangerine/svg/t.tsx +0 -19
- package/fonts/tangerine/svg/u.svg +0 -17
- package/fonts/tangerine/svg/u.tsx +0 -19
- package/fonts/tangerine/svg/upper_A.svg +0 -20
- package/fonts/tangerine/svg/upper_A.tsx +0 -22
- package/fonts/tangerine/svg/upper_B.svg +0 -17
- package/fonts/tangerine/svg/upper_B.tsx +0 -19
- package/fonts/tangerine/svg/upper_C.svg +0 -7
- package/fonts/tangerine/svg/upper_C.tsx +0 -9
- package/fonts/tangerine/svg/upper_D.svg +0 -12
- package/fonts/tangerine/svg/upper_D.tsx +0 -14
- package/fonts/tangerine/svg/upper_E.svg +0 -7
- package/fonts/tangerine/svg/upper_E.tsx +0 -9
- package/fonts/tangerine/svg/upper_F.svg +0 -17
- package/fonts/tangerine/svg/upper_F.tsx +0 -19
- package/fonts/tangerine/svg/upper_G.svg +0 -12
- package/fonts/tangerine/svg/upper_G.tsx +0 -14
- package/fonts/tangerine/svg/upper_H.svg +0 -12
- package/fonts/tangerine/svg/upper_H.tsx +0 -14
- package/fonts/tangerine/svg/upper_I.svg +0 -7
- package/fonts/tangerine/svg/upper_I.tsx +0 -9
- package/fonts/tangerine/svg/upper_J.svg +0 -7
- package/fonts/tangerine/svg/upper_J.tsx +0 -9
- package/fonts/tangerine/svg/upper_K.svg +0 -17
- package/fonts/tangerine/svg/upper_K.tsx +0 -19
- package/fonts/tangerine/svg/upper_L.svg +0 -7
- package/fonts/tangerine/svg/upper_L.tsx +0 -9
- package/fonts/tangerine/svg/upper_M.svg +0 -12
- package/fonts/tangerine/svg/upper_M.tsx +0 -14
- package/fonts/tangerine/svg/upper_N.svg +0 -15
- package/fonts/tangerine/svg/upper_N.tsx +0 -17
- package/fonts/tangerine/svg/upper_O.svg +0 -7
- package/fonts/tangerine/svg/upper_O.tsx +0 -9
- package/fonts/tangerine/svg/upper_P.svg +0 -12
- package/fonts/tangerine/svg/upper_P.tsx +0 -14
- package/fonts/tangerine/svg/upper_Q.svg +0 -12
- package/fonts/tangerine/svg/upper_Q.tsx +0 -14
- package/fonts/tangerine/svg/upper_R.svg +0 -12
- package/fonts/tangerine/svg/upper_R.tsx +0 -14
- package/fonts/tangerine/svg/upper_S.svg +0 -7
- package/fonts/tangerine/svg/upper_S.tsx +0 -9
- package/fonts/tangerine/svg/upper_T.svg +0 -7
- package/fonts/tangerine/svg/upper_T.tsx +0 -9
- package/fonts/tangerine/svg/upper_U.svg +0 -12
- package/fonts/tangerine/svg/upper_U.tsx +0 -14
- package/fonts/tangerine/svg/upper_V.svg +0 -12
- package/fonts/tangerine/svg/upper_V.tsx +0 -14
- package/fonts/tangerine/svg/upper_W.svg +0 -17
- package/fonts/tangerine/svg/upper_W.tsx +0 -19
- package/fonts/tangerine/svg/upper_X.svg +0 -12
- package/fonts/tangerine/svg/upper_X.tsx +0 -14
- package/fonts/tangerine/svg/upper_Y.svg +0 -12
- package/fonts/tangerine/svg/upper_Y.tsx +0 -14
- package/fonts/tangerine/svg/upper_Z.svg +0 -17
- package/fonts/tangerine/svg/upper_Z.tsx +0 -19
- package/fonts/tangerine/svg/v.svg +0 -12
- package/fonts/tangerine/svg/v.tsx +0 -14
- package/fonts/tangerine/svg/w.svg +0 -25
- package/fonts/tangerine/svg/w.tsx +0 -27
- package/fonts/tangerine/svg/x.svg +0 -17
- package/fonts/tangerine/svg/x.tsx +0 -19
- package/fonts/tangerine/svg/y.svg +0 -12
- package/fonts/tangerine/svg/y.tsx +0 -14
- package/fonts/tangerine/svg/z.svg +0 -20
- package/fonts/tangerine/svg/z.tsx +0 -22
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tegaki",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "React component for rendering animated handwriting from any font",
|
|
6
6
|
"keywords": [
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"typecheck": "tsc --noEmit",
|
|
55
55
|
"build": "tsdown src/index.ts --dts --sourcemap",
|
|
56
56
|
"prepack": "bun run build && bun ../../scripts/prepareForRelease.ts",
|
|
57
|
-
"generate-fonts": "bun --filter tegaki-generator start generate Caveat --
|
|
57
|
+
"generate-fonts": "bun --filter tegaki-generator start generate Caveat --output ../renderer/fonts/caveat && bun --filter tegaki-generator start generate Italianno --output ../renderer/fonts/italianno && bun --filter tegaki-generator start generate Tangerine --output ../renderer/fonts/tangerine && bun --filter tegaki-generator start generate Parisienne --output ../renderer/fonts/parisienne"
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@chenglou/pretext": "^0.0.4"
|
package/src/env.d.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ComponentProps,
|
|
1
|
+
import { type ComponentProps, type Ref, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|
2
2
|
import type { TegakiBundle, TegakiEffects } from '../types.ts';
|
|
3
3
|
import { drawFallbackGlyph } from './drawFallbackGlyph.ts';
|
|
4
4
|
import { drawGlyph } from './drawGlyph.ts';
|
|
@@ -69,7 +69,33 @@ export type TimeControlMode = {
|
|
|
69
69
|
*/
|
|
70
70
|
export type TimeControlProp = null | undefined | number | 'css' | TimeControlMode[keyof TimeControlMode];
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
/** Imperative handle exposed via the `ref` prop. */
|
|
73
|
+
export interface TegakiRendererHandle {
|
|
74
|
+
/** The root DOM element. */
|
|
75
|
+
getElement(): HTMLDivElement | null;
|
|
76
|
+
/** Current animation time in seconds. */
|
|
77
|
+
getCurrentTime(): number;
|
|
78
|
+
/** Total timeline duration in seconds. */
|
|
79
|
+
getDuration(): number;
|
|
80
|
+
/** Whether the animation is currently playing (uncontrolled mode only). */
|
|
81
|
+
getIsPlaying(): boolean;
|
|
82
|
+
/** Whether the animation has reached the end. */
|
|
83
|
+
getIsComplete(): boolean;
|
|
84
|
+
/** Resume playback (uncontrolled mode only). No-op in controlled/css mode. */
|
|
85
|
+
play(): void;
|
|
86
|
+
/** Pause playback (uncontrolled mode only). No-op in controlled/css mode. */
|
|
87
|
+
pause(): void;
|
|
88
|
+
/** Jump to a specific time in seconds (uncontrolled mode only). No-op in controlled/css mode. */
|
|
89
|
+
seek(time: number): void;
|
|
90
|
+
/** Seek to 0 and play (uncontrolled mode only). No-op in controlled/css mode. */
|
|
91
|
+
restart(): void;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string, never>>
|
|
95
|
+
extends Omit<ComponentProps<'div'>, 'children' | 'ref'> {
|
|
96
|
+
/** Imperative handle ref for playback controls and DOM access. */
|
|
97
|
+
ref?: Ref<TegakiRendererHandle>;
|
|
98
|
+
|
|
73
99
|
/** TegakiBundle with font data and animated glyph SVGs. */
|
|
74
100
|
font?: TegakiBundle;
|
|
75
101
|
|
|
@@ -89,10 +115,6 @@ export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string,
|
|
|
89
115
|
/** Called once when the animation reaches the end of the timeline. */
|
|
90
116
|
onComplete?: () => void;
|
|
91
117
|
|
|
92
|
-
/** Rendering mode. `'canvas'` draws strokes on a `<canvas>` (requires
|
|
93
|
-
* `font.glyphData`), `'svg'` uses animated SVG elements. Default: `'canvas'` */
|
|
94
|
-
mode?: 'canvas' | 'svg';
|
|
95
|
-
|
|
96
118
|
/** Visual effects applied during canvas rendering. */
|
|
97
119
|
effects?: E;
|
|
98
120
|
|
|
@@ -110,12 +132,12 @@ export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string,
|
|
|
110
132
|
// --- Component ---
|
|
111
133
|
|
|
112
134
|
export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string, never>>({
|
|
135
|
+
ref,
|
|
113
136
|
font,
|
|
114
137
|
text,
|
|
115
138
|
children,
|
|
116
139
|
time: timeProp,
|
|
117
140
|
onComplete,
|
|
118
|
-
mode = 'canvas',
|
|
119
141
|
effects,
|
|
120
142
|
segmentSize,
|
|
121
143
|
timing,
|
|
@@ -143,18 +165,35 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
143
165
|
const controlledTime = timeControl.mode === 'controlled' ? timeControl.value : undefined;
|
|
144
166
|
const defaultTime = timeControl.mode === 'uncontrolled' ? (timeControl.initialTime ?? 0) : 0;
|
|
145
167
|
const speed = timeControl.mode === 'uncontrolled' ? (timeControl.speed ?? 1) : 1;
|
|
146
|
-
const
|
|
168
|
+
const propPlaying = timeControl.mode === 'uncontrolled' ? (timeControl.playing ?? true) : false;
|
|
147
169
|
const loop = timeControl.mode === 'uncontrolled' ? (timeControl.loop ?? false) : false;
|
|
148
170
|
const catchUp = timeControl.mode === 'uncontrolled' ? (timeControl.catchUp ?? 0) : 0;
|
|
149
171
|
const onTimeChange = timeControl.mode === 'uncontrolled' ? timeControl.onTimeChange : undefined;
|
|
150
172
|
|
|
173
|
+
// Imperative playing override (undefined = follow prop)
|
|
174
|
+
const [playingOverride, setPlayingOverride] = useState<boolean | undefined>(undefined);
|
|
175
|
+
const playing = playingOverride ?? propPlaying;
|
|
176
|
+
|
|
177
|
+
// Reset override when the prop changes so the prop regains control
|
|
178
|
+
const prevPropPlaying = useRef(propPlaying);
|
|
179
|
+
if (prevPropPlaying.current !== propPlaying) {
|
|
180
|
+
prevPropPlaying.current = propPlaying;
|
|
181
|
+
setPlayingOverride(undefined);
|
|
182
|
+
}
|
|
183
|
+
|
|
151
184
|
// --- Internal time (uncontrolled mode) ---
|
|
152
185
|
const [internalTime, setInternalTime] = useState(defaultTime);
|
|
153
186
|
// --- CSS-driven time ---
|
|
154
187
|
const [cssTime, setCssTime] = useState(0);
|
|
155
188
|
const currentTime = isCss ? cssTime : isControlled ? controlledTime! : internalTime;
|
|
156
189
|
|
|
157
|
-
// Stable
|
|
190
|
+
// Stable refs so the imperative handle and rAF loop always see latest values
|
|
191
|
+
const currentTimeRef = useRef(currentTime);
|
|
192
|
+
currentTimeRef.current = currentTime;
|
|
193
|
+
const playingRef = useRef(playing);
|
|
194
|
+
playingRef.current = playing;
|
|
195
|
+
const isControlledRef = useRef(isControlled);
|
|
196
|
+
isControlledRef.current = isControlled;
|
|
158
197
|
const onTimeChangeRef = useRef(onTimeChange);
|
|
159
198
|
onTimeChangeRef.current = onTimeChange;
|
|
160
199
|
const onCompleteRef = useRef(onComplete);
|
|
@@ -186,13 +225,13 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
186
225
|
// --- Font-derived constants ---
|
|
187
226
|
const fontFamily = font?.family;
|
|
188
227
|
const emHeight = font ? (font.ascender - font.descender) / font.unitsPerEm : 0;
|
|
189
|
-
const baselineOffset = font ? font.descender / font.unitsPerEm : 0;
|
|
190
228
|
|
|
191
229
|
// --- Container measurement ---
|
|
192
230
|
const rootRef = useRef<HTMLDivElement>(null);
|
|
193
231
|
const [containerWidth, setContainerWidth] = useState(0);
|
|
194
232
|
const [fontSize, setFontSize] = useState(0);
|
|
195
233
|
const [lineHeight, setLineHeight] = useState(0);
|
|
234
|
+
const [currentColor, setCurrentColor] = useState('');
|
|
196
235
|
|
|
197
236
|
// --- Timeline ---
|
|
198
237
|
const timeline = useMemo(
|
|
@@ -220,6 +259,34 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
220
259
|
}
|
|
221
260
|
});
|
|
222
261
|
|
|
262
|
+
// --- Imperative handle (stable — reads from refs) ---
|
|
263
|
+
useImperativeHandle(
|
|
264
|
+
ref,
|
|
265
|
+
() => ({
|
|
266
|
+
getElement: () => rootRef.current,
|
|
267
|
+
getCurrentTime: () => currentTimeRef.current,
|
|
268
|
+
getDuration: () => totalDurationRef.current,
|
|
269
|
+
getIsPlaying: () => playingRef.current,
|
|
270
|
+
getIsComplete: () => totalDurationRef.current > 0 && currentTimeRef.current >= totalDurationRef.current,
|
|
271
|
+
play: () => {
|
|
272
|
+
if (!isControlledRef.current) setPlayingOverride(true);
|
|
273
|
+
},
|
|
274
|
+
pause: () => {
|
|
275
|
+
if (!isControlledRef.current) setPlayingOverride(false);
|
|
276
|
+
},
|
|
277
|
+
seek: (time: number) => {
|
|
278
|
+
if (!isControlledRef.current) setInternalTime(Math.max(0, Math.min(time, totalDurationRef.current)));
|
|
279
|
+
},
|
|
280
|
+
restart: () => {
|
|
281
|
+
if (!isControlledRef.current) {
|
|
282
|
+
setInternalTime(0);
|
|
283
|
+
setPlayingOverride(true);
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
}),
|
|
287
|
+
[],
|
|
288
|
+
);
|
|
289
|
+
|
|
223
290
|
// --- Uncontrolled: time change notification ---
|
|
224
291
|
useEffect(() => {
|
|
225
292
|
if (!isControlled) {
|
|
@@ -276,44 +343,6 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
276
343
|
return () => cancelAnimationFrame(raf);
|
|
277
344
|
}, [isControlled, playing, speed, loop, catchUp, font, fontReady]);
|
|
278
345
|
|
|
279
|
-
// --- SVG refs (only needed in SVG mode) ---
|
|
280
|
-
const svgRefs = useRef(new Map<number, SVGSVGElement>());
|
|
281
|
-
const svgRefCallbacks = useRef(new Map<number, (node: SVGSVGElement | null) => void>());
|
|
282
|
-
|
|
283
|
-
const makeSvgRef = useCallback(
|
|
284
|
-
(charIdx: number) => (node: SVGSVGElement | null) => {
|
|
285
|
-
if (node) {
|
|
286
|
-
node.pauseAnimations();
|
|
287
|
-
svgRefs.current.set(charIdx, node);
|
|
288
|
-
} else {
|
|
289
|
-
svgRefs.current.delete(charIdx);
|
|
290
|
-
}
|
|
291
|
-
},
|
|
292
|
-
[],
|
|
293
|
-
);
|
|
294
|
-
|
|
295
|
-
const getSvgRef = useCallback(
|
|
296
|
-
(charIdx: number) => {
|
|
297
|
-
let cb = svgRefCallbacks.current.get(charIdx);
|
|
298
|
-
if (!cb) {
|
|
299
|
-
cb = makeSvgRef(charIdx);
|
|
300
|
-
svgRefCallbacks.current.set(charIdx, cb);
|
|
301
|
-
}
|
|
302
|
-
return cb;
|
|
303
|
-
},
|
|
304
|
-
[makeSvgRef],
|
|
305
|
-
);
|
|
306
|
-
|
|
307
|
-
// Clear stale SVG refs when font or mode changes
|
|
308
|
-
const prevFontRef = useRef(font);
|
|
309
|
-
const prevModeRef = useRef(mode);
|
|
310
|
-
if (prevFontRef.current !== font || prevModeRef.current !== mode) {
|
|
311
|
-
prevFontRef.current = font;
|
|
312
|
-
prevModeRef.current = mode;
|
|
313
|
-
svgRefs.current.clear();
|
|
314
|
-
svgRefCallbacks.current.clear();
|
|
315
|
-
}
|
|
316
|
-
|
|
317
346
|
// --- Container size observation ---
|
|
318
347
|
useEffect(() => {
|
|
319
348
|
const el = rootRef.current;
|
|
@@ -324,6 +353,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
324
353
|
const styles = getComputedStyle(el);
|
|
325
354
|
setFontSize(Number.parseFloat(styles.fontSize));
|
|
326
355
|
setLineHeight(Number.parseFloat(styles.lineHeight));
|
|
356
|
+
setCurrentColor(styles.color);
|
|
327
357
|
}
|
|
328
358
|
});
|
|
329
359
|
ro.observe(el);
|
|
@@ -343,6 +373,9 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
343
373
|
setFontSize(Number.parseFloat(styles.fontSize));
|
|
344
374
|
setLineHeight(Number.parseFloat(styles.lineHeight));
|
|
345
375
|
}
|
|
376
|
+
if (e.propertyName === 'color') {
|
|
377
|
+
setCurrentColor(styles.color);
|
|
378
|
+
}
|
|
346
379
|
if (e.propertyName === CSS_PROGRESS) {
|
|
347
380
|
const rawProgress = Number(styles.getPropertyValue(CSS_PROGRESS));
|
|
348
381
|
setCssTime(rawProgress * totalDurationRef.current);
|
|
@@ -362,27 +395,10 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
362
395
|
const padH = PADDING_H_EM * fontSize;
|
|
363
396
|
const padV = fontSize ? Math.max(MIN_PADDING_V_EM * fontSize, (MIN_LINE_HEIGHT_EM * fontSize - lineHeight) / 2) : 0;
|
|
364
397
|
|
|
365
|
-
// --- Sync SVG glyph times before paint ---
|
|
366
|
-
// Runs every render so SVGs stay correct even when currentTime hasn't changed
|
|
367
|
-
// (e.g. after pausing, or when ref callbacks re-fire due to re-renders).
|
|
368
|
-
useLayoutEffect(() => {
|
|
369
|
-
if (mode !== 'svg') return;
|
|
370
|
-
const entries = timeline.entries;
|
|
371
|
-
for (let i = 0; i < entries.length; i++) {
|
|
372
|
-
const entry = entries[i]!;
|
|
373
|
-
if (!entry.hasSvg) continue;
|
|
374
|
-
const svg = svgRefs.current.get(i);
|
|
375
|
-
if (!svg) continue;
|
|
376
|
-
const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
|
|
377
|
-
svg.setCurrentTime(localTime);
|
|
378
|
-
}
|
|
379
|
-
});
|
|
380
|
-
|
|
381
398
|
// --- Canvas rendering ---
|
|
382
399
|
const canvasRef = useRef<HTMLCanvasElement>(null);
|
|
383
400
|
|
|
384
401
|
useLayoutEffect(() => {
|
|
385
|
-
if (mode !== 'canvas') return;
|
|
386
402
|
const canvas = canvasRef.current;
|
|
387
403
|
if (!canvas || !font?.glyphData || !layout || !fontSize) return;
|
|
388
404
|
|
|
@@ -407,8 +423,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
407
423
|
ctx.clearRect(0, 0, w, h);
|
|
408
424
|
ctx.translate(padH, padV);
|
|
409
425
|
|
|
410
|
-
|
|
411
|
-
const color = getComputedStyle(el).color;
|
|
426
|
+
const color = currentColor || getComputedStyle(el).color;
|
|
412
427
|
|
|
413
428
|
const emHeightPx = emHeight * fontSize;
|
|
414
429
|
const halfLeading = (lineHeight - emHeightPx) / 2;
|
|
@@ -425,7 +440,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
425
440
|
const kerning = layout.kernings[charIdx] ?? 0;
|
|
426
441
|
const glyph = font.glyphData[char];
|
|
427
442
|
|
|
428
|
-
if (glyph && entry.
|
|
443
|
+
if (glyph && entry.hasGlyph) {
|
|
429
444
|
const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
|
|
430
445
|
const glyphY = y + halfLeading;
|
|
431
446
|
drawGlyph(
|
|
@@ -446,7 +461,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
446
461
|
seed + charIdx,
|
|
447
462
|
segmentSize,
|
|
448
463
|
);
|
|
449
|
-
} else if (!entry.
|
|
464
|
+
} else if (!entry.hasGlyph && currentTime >= entry.offset + entry.duration) {
|
|
450
465
|
const baseline = y + halfLeading + (font.ascender / font.unitsPerEm) * fontSize;
|
|
451
466
|
drawFallbackGlyph(ctx, char, x, baseline, fontSize, fontFamily!, color, resolvedEffects, seed + charIdx);
|
|
452
467
|
}
|
|
@@ -456,7 +471,6 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
456
471
|
y += lineHeight;
|
|
457
472
|
}
|
|
458
473
|
}, [
|
|
459
|
-
mode,
|
|
460
474
|
currentTime,
|
|
461
475
|
timeline,
|
|
462
476
|
layout,
|
|
@@ -468,66 +482,12 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
468
482
|
emHeight,
|
|
469
483
|
padH,
|
|
470
484
|
padV,
|
|
485
|
+
currentColor,
|
|
471
486
|
resolvedEffects,
|
|
472
487
|
seed,
|
|
473
488
|
segmentSize,
|
|
474
489
|
]);
|
|
475
490
|
|
|
476
|
-
// --- SVG rendering (skipped entirely in canvas mode) ---
|
|
477
|
-
const lineElements = useMemo(() => {
|
|
478
|
-
if (mode !== 'svg' || !font || !resolvedText) return null;
|
|
479
|
-
|
|
480
|
-
const characters = graphemes(resolvedText);
|
|
481
|
-
|
|
482
|
-
const renderGlyph = (charIdx: number) => {
|
|
483
|
-
const char = characters[charIdx]!;
|
|
484
|
-
const entry = timeline.entries[charIdx]!;
|
|
485
|
-
const GlyphSvg = font.glyphs[char] as any;
|
|
486
|
-
const width = layout?.charWidths[charIdx] ?? 1;
|
|
487
|
-
const kerning = layout?.kernings[charIdx];
|
|
488
|
-
|
|
489
|
-
if (char === '\n') return null;
|
|
490
|
-
|
|
491
|
-
if (GlyphSvg) {
|
|
492
|
-
return (
|
|
493
|
-
<GlyphSvg
|
|
494
|
-
key={charIdx}
|
|
495
|
-
ref={getSvgRef(charIdx)}
|
|
496
|
-
style={{
|
|
497
|
-
display: 'inline-block',
|
|
498
|
-
verticalAlign: `${baselineOffset}em`,
|
|
499
|
-
width: `${width}em`,
|
|
500
|
-
marginRight: kerning ? `${kerning}em` : undefined,
|
|
501
|
-
height: `${emHeight}em`,
|
|
502
|
-
overflow: 'visible',
|
|
503
|
-
}}
|
|
504
|
-
/>
|
|
505
|
-
);
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
const isVisible = currentTime >= entry.offset + entry.duration;
|
|
509
|
-
return (
|
|
510
|
-
<span style={{ fontFamily, visibility: isVisible ? 'visible' : 'hidden' }} key={charIdx}>
|
|
511
|
-
{char}
|
|
512
|
-
</span>
|
|
513
|
-
);
|
|
514
|
-
};
|
|
515
|
-
|
|
516
|
-
if (layout) {
|
|
517
|
-
return layout.lines.map((lineIndices, lineIdx) => {
|
|
518
|
-
const isEmpty = lineIndices.every((i) => characters[i] === '\n');
|
|
519
|
-
return (
|
|
520
|
-
<div style={{ whiteSpace: 'nowrap', height: isEmpty ? '1lh' : undefined, lineHeight: `${lineHeight}px` }} key={lineIdx}>
|
|
521
|
-
{lineIndices.map(renderGlyph)}
|
|
522
|
-
</div>
|
|
523
|
-
);
|
|
524
|
-
});
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
// Fallback before layout is ready: single line
|
|
528
|
-
return characters.length > 0 ? <div style={{ whiteSpace: 'nowrap' }}>{characters.map((_, i) => renderGlyph(i))}</div> : null;
|
|
529
|
-
}, [mode, resolvedText, timeline, font, layout, getSvgRef, baselineOffset, emHeight, currentTime, fontFamily, lineHeight]);
|
|
530
|
-
|
|
531
491
|
// --- Rendering ---
|
|
532
492
|
|
|
533
493
|
if (!font || !resolvedText || !fontReady) {
|
|
@@ -551,24 +511,26 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
551
511
|
},
|
|
552
512
|
}}
|
|
553
513
|
>
|
|
554
|
-
{
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
514
|
+
<div style={{ position: 'relative' }}>
|
|
515
|
+
{/* Sentinel: inherits font-size & line-height; its height changes when either changes */}
|
|
516
|
+
<span
|
|
517
|
+
ref={sentinelRef}
|
|
518
|
+
aria-hidden
|
|
519
|
+
style={{
|
|
520
|
+
position: 'absolute',
|
|
521
|
+
width: 0,
|
|
522
|
+
overflow: 'hidden',
|
|
523
|
+
pointerEvents: 'none',
|
|
524
|
+
fontSize: 'inherit',
|
|
525
|
+
lineHeight: 'inherit',
|
|
526
|
+
visibility: 'hidden',
|
|
527
|
+
transition: isCss
|
|
528
|
+
? `font-size 0.001s, line-height 0.001s, color 0.001s, ${CSS_PROGRESS} 0.001s`
|
|
529
|
+
: 'font-size 0.001s, line-height 0.001s, color 0.001s',
|
|
530
|
+
}}
|
|
531
|
+
>
|
|
532
|
+
{'\u00A0'}
|
|
533
|
+
</span>
|
|
572
534
|
<canvas
|
|
573
535
|
ref={canvasRef}
|
|
574
536
|
aria-hidden
|
|
@@ -580,31 +542,20 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
580
542
|
pointerEvents: 'none',
|
|
581
543
|
}}
|
|
582
544
|
/>
|
|
583
|
-
|
|
545
|
+
|
|
584
546
|
<div
|
|
585
547
|
style={{
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
548
|
+
userSelect: 'auto',
|
|
549
|
+
whiteSpace: 'pre-wrap',
|
|
550
|
+
overflowWrap: 'break-word',
|
|
551
|
+
paddingRight: 1,
|
|
552
|
+
WebkitTextFillColor: showOverlay ? undefined : 'transparent',
|
|
589
553
|
fontFamily,
|
|
554
|
+
color: showOverlay ? 'rgba(255, 0, 0, 0.4)' : undefined,
|
|
590
555
|
}}
|
|
591
556
|
>
|
|
592
|
-
{
|
|
557
|
+
{resolvedText}
|
|
593
558
|
</div>
|
|
594
|
-
)}
|
|
595
|
-
|
|
596
|
-
<div
|
|
597
|
-
style={{
|
|
598
|
-
userSelect: 'auto',
|
|
599
|
-
whiteSpace: 'pre-wrap',
|
|
600
|
-
overflowWrap: 'break-word',
|
|
601
|
-
paddingRight: 1,
|
|
602
|
-
WebkitTextFillColor: showOverlay ? undefined : 'transparent',
|
|
603
|
-
fontFamily,
|
|
604
|
-
color: showOverlay ? 'rgba(255, 0, 0, 0.4)' : undefined,
|
|
605
|
-
}}
|
|
606
|
-
>
|
|
607
|
-
{resolvedText}
|
|
608
559
|
</div>
|
|
609
560
|
</div>
|
|
610
561
|
);
|
package/src/lib/drawGlyph.ts
CHANGED
|
@@ -154,24 +154,24 @@ export function drawGlyph(
|
|
|
154
154
|
return m;
|
|
155
155
|
};
|
|
156
156
|
|
|
157
|
-
for (const stroke of glyph.
|
|
158
|
-
if (localTime < stroke.
|
|
159
|
-
const elapsed = localTime - stroke.
|
|
160
|
-
const progress = Math.min(elapsed / stroke.
|
|
157
|
+
for (const stroke of glyph.s) {
|
|
158
|
+
if (localTime < stroke.d) continue;
|
|
159
|
+
const elapsed = localTime - stroke.d;
|
|
160
|
+
const progress = Math.min(elapsed / stroke.a, 1);
|
|
161
161
|
|
|
162
|
-
const pts = stroke.
|
|
162
|
+
const pts = stroke.p;
|
|
163
163
|
if (pts.length === 0) continue;
|
|
164
164
|
|
|
165
|
-
const avgWidth = pts.reduce((s, p) => s + p
|
|
165
|
+
const avgWidth = pts.reduce((s, p) => s + p[2], 0) / pts.length;
|
|
166
166
|
const baseLineWidth = Math.max(avgWidth, 0.5) * scale;
|
|
167
167
|
|
|
168
168
|
// --- Single-point dot ---
|
|
169
169
|
if (pts.length === 1) {
|
|
170
170
|
if (progress <= 0) continue;
|
|
171
171
|
const p = pts[0]!;
|
|
172
|
-
const dotX = px(wobbleX(p
|
|
173
|
-
const dotY = py(wobbleY(p
|
|
174
|
-
const perPointDot = Math.max(p
|
|
172
|
+
const dotX = px(wobbleX(p[0], p[1], 0));
|
|
173
|
+
const dotY = py(wobbleY(p[0], p[1], 0));
|
|
174
|
+
const perPointDot = Math.max(p[2], 0.5) * scale;
|
|
175
175
|
let dotWidth = baseLineWidth + (perPointDot - baseLineWidth) * pressureAmount;
|
|
176
176
|
dotWidth *= taperMultiplier(0.5);
|
|
177
177
|
|
|
@@ -208,8 +208,8 @@ export function drawGlyph(
|
|
|
208
208
|
// --- Compute total path length ---
|
|
209
209
|
let totalLen = 0;
|
|
210
210
|
for (let j = 1; j < pts.length; j++) {
|
|
211
|
-
const dx = pts[j]
|
|
212
|
-
const dy = pts[j]
|
|
211
|
+
const dx = pts[j]![0] - pts[j - 1]![0];
|
|
212
|
+
const dy = pts[j]![1] - pts[j - 1]![1];
|
|
213
213
|
totalLen += Math.sqrt(dx * dx + dy * dy);
|
|
214
214
|
}
|
|
215
215
|
|
|
@@ -231,33 +231,33 @@ export function drawGlyph(
|
|
|
231
231
|
for (let j = 1; j < pts.length; j++) {
|
|
232
232
|
const prev = pts[j - 1]!;
|
|
233
233
|
const cur = pts[j]!;
|
|
234
|
-
const dx = cur
|
|
235
|
-
const dy = cur
|
|
234
|
+
const dx = cur[0] - prev[0];
|
|
235
|
+
const dy = cur[1] - prev[1];
|
|
236
236
|
const segLen = Math.sqrt(dx * dx + dy * dy);
|
|
237
237
|
|
|
238
238
|
if (accumulated + segLen <= drawLen) {
|
|
239
239
|
segments.push({
|
|
240
|
-
x0: px(wobbleX(prev
|
|
241
|
-
y0: py(wobbleY(prev
|
|
242
|
-
x1: px(wobbleX(cur
|
|
243
|
-
y1: py(wobbleY(cur
|
|
244
|
-
width0: prev
|
|
245
|
-
width1: cur
|
|
240
|
+
x0: px(wobbleX(prev[0], prev[1], j - 1)),
|
|
241
|
+
y0: py(wobbleY(prev[0], prev[1], j - 1)),
|
|
242
|
+
x1: px(wobbleX(cur[0], cur[1], j)),
|
|
243
|
+
y1: py(wobbleY(cur[0], cur[1], j)),
|
|
244
|
+
width0: prev[2],
|
|
245
|
+
width1: cur[2],
|
|
246
246
|
segProgress: (accumulated + segLen / 2) / totalLen,
|
|
247
247
|
});
|
|
248
248
|
accumulated += segLen;
|
|
249
249
|
} else {
|
|
250
250
|
const remaining = drawLen - accumulated;
|
|
251
251
|
const frac = segLen > 0 ? remaining / segLen : 0;
|
|
252
|
-
const ix = prev
|
|
253
|
-
const iy = prev
|
|
254
|
-
const iw = prev
|
|
252
|
+
const ix = prev[0] + dx * frac;
|
|
253
|
+
const iy = prev[1] + dy * frac;
|
|
254
|
+
const iw = prev[2] + (cur[2] - prev[2]) * frac;
|
|
255
255
|
segments.push({
|
|
256
|
-
x0: px(wobbleX(prev
|
|
257
|
-
y0: py(wobbleY(prev
|
|
256
|
+
x0: px(wobbleX(prev[0], prev[1], j - 1)),
|
|
257
|
+
y0: py(wobbleY(prev[0], prev[1], j - 1)),
|
|
258
258
|
x1: px(wobbleX(ix, iy, j)),
|
|
259
259
|
y1: py(wobbleY(ix, iy, j)),
|
|
260
|
-
width0: prev
|
|
260
|
+
width0: prev[2],
|
|
261
261
|
width1: iw,
|
|
262
262
|
segProgress: (accumulated + remaining / 2) / totalLen,
|
|
263
263
|
});
|
package/src/lib/timeline.ts
CHANGED
|
@@ -8,7 +8,7 @@ export interface TimelineConfig {
|
|
|
8
8
|
wordGap?: number;
|
|
9
9
|
/** Pause after a newline / line break (seconds). Default: `0.3` */
|
|
10
10
|
lineGap?: number;
|
|
11
|
-
/** Duration for characters without glyph
|
|
11
|
+
/** Duration for characters without glyph data (seconds). Default: `0.2` */
|
|
12
12
|
unknownDuration?: number;
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -23,7 +23,7 @@ export interface TimelineEntry {
|
|
|
23
23
|
char: string;
|
|
24
24
|
offset: number;
|
|
25
25
|
duration: number;
|
|
26
|
-
|
|
26
|
+
hasGlyph: boolean;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export interface Timeline {
|
|
@@ -41,9 +41,10 @@ export function computeTimeline(text: string, font: TegakiBundle, config?: Timel
|
|
|
41
41
|
const entries: TimelineEntry[] = [];
|
|
42
42
|
let offset = 0;
|
|
43
43
|
for (const char of chars) {
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
|
|
44
|
+
const glyph = font.glyphData[char];
|
|
45
|
+
const hasGlyph = !!glyph;
|
|
46
|
+
const duration = hasGlyph ? (glyph.t ?? 1) : unknownDuration;
|
|
47
|
+
entries.push({ char, offset, duration, hasGlyph });
|
|
47
48
|
offset += duration;
|
|
48
49
|
|
|
49
50
|
// Gap after this character
|
package/src/types.ts
CHANGED
|
@@ -59,12 +59,19 @@ export interface PathCommand {
|
|
|
59
59
|
y2?: number;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Compact glyph data for rendering.
|
|
64
|
+
* - `w`: advance width
|
|
65
|
+
* - `t`: total animation duration
|
|
66
|
+
* - `s`: strokes, each with `p` (points as `[x, y, width]` tuples), `d` (delay), `a` (animation duration)
|
|
67
|
+
*/
|
|
62
68
|
export interface TegakiGlyphData {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
69
|
+
w: number;
|
|
70
|
+
t: number;
|
|
71
|
+
s: {
|
|
72
|
+
p: [x: number, y: number, width: number][];
|
|
73
|
+
d: number;
|
|
74
|
+
a: number;
|
|
68
75
|
}[];
|
|
69
76
|
}
|
|
70
77
|
|
|
@@ -107,8 +114,6 @@ export interface TegakiBundle {
|
|
|
107
114
|
unitsPerEm: number;
|
|
108
115
|
ascender: number;
|
|
109
116
|
descender: number;
|
|
110
|
-
|
|
111
|
-
glyphData?: Record<string, TegakiGlyphData>;
|
|
112
|
-
glyphTimings: Record<string, number>;
|
|
117
|
+
glyphData: Record<string, TegakiGlyphData>;
|
|
113
118
|
registerFontFace: () => Promise<void>;
|
|
114
119
|
}
|