tegaki 0.2.2 → 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 +14 -0
- package/README.md +4 -43
- package/dist/index.d.mts +42 -23
- package/dist/index.mjs +143 -183
- package/dist/index.mjs.map +1 -1
- package/fonts/caveat/bundle.ts +1 -276
- package/fonts/caveat/glyphData.json +1 -1
- package/fonts/italianno/bundle.ts +1 -276
- package/fonts/italianno/glyphData.json +1 -1
- package/fonts/parisienne/bundle.ts +1 -276
- package/fonts/parisienne/glyphData.json +1 -1
- package/fonts/tangerine/bundle.ts +1 -276
- 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 +141 -168
- 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,33 +165,73 @@ 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);
|
|
161
200
|
onCompleteRef.current = onComplete;
|
|
162
201
|
|
|
202
|
+
// --- Font loading ---
|
|
203
|
+
const [fontReady, setFontReady] = useState(() => !!font && document.fonts.check(`16px "${font?.family}"`));
|
|
204
|
+
useEffect(() => {
|
|
205
|
+
if (!font) {
|
|
206
|
+
setFontReady(false);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
// Check if the font is already loaded
|
|
210
|
+
if (document.fonts.check(`16px "${font.family}"`)) {
|
|
211
|
+
setFontReady(true);
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
// New font — mark not ready and start loading
|
|
215
|
+
setFontReady(false);
|
|
216
|
+
let cancelled = false;
|
|
217
|
+
font.registerFontFace().then(() => {
|
|
218
|
+
if (!cancelled) setFontReady(true);
|
|
219
|
+
});
|
|
220
|
+
return () => {
|
|
221
|
+
cancelled = true;
|
|
222
|
+
};
|
|
223
|
+
}, [font]);
|
|
224
|
+
|
|
163
225
|
// --- Font-derived constants ---
|
|
164
226
|
const fontFamily = font?.family;
|
|
165
227
|
const emHeight = font ? (font.ascender - font.descender) / font.unitsPerEm : 0;
|
|
166
|
-
const baselineOffset = font ? font.descender / font.unitsPerEm : 0;
|
|
167
228
|
|
|
168
229
|
// --- Container measurement ---
|
|
169
230
|
const rootRef = useRef<HTMLDivElement>(null);
|
|
170
231
|
const [containerWidth, setContainerWidth] = useState(0);
|
|
171
232
|
const [fontSize, setFontSize] = useState(0);
|
|
172
233
|
const [lineHeight, setLineHeight] = useState(0);
|
|
234
|
+
const [currentColor, setCurrentColor] = useState('');
|
|
173
235
|
|
|
174
236
|
// --- Timeline ---
|
|
175
237
|
const timeline = useMemo(
|
|
@@ -197,6 +259,34 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
197
259
|
}
|
|
198
260
|
});
|
|
199
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
|
+
|
|
200
290
|
// --- Uncontrolled: time change notification ---
|
|
201
291
|
useEffect(() => {
|
|
202
292
|
if (!isControlled) {
|
|
@@ -206,7 +296,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
206
296
|
|
|
207
297
|
// --- Uncontrolled: rAF playback loop ---
|
|
208
298
|
useEffect(() => {
|
|
209
|
-
if (isControlled || !playing || !font) return;
|
|
299
|
+
if (isControlled || !playing || !font || !fontReady) return;
|
|
210
300
|
|
|
211
301
|
// Reset smoothed boost when the loop restarts
|
|
212
302
|
smoothedBoostRef.current = 0;
|
|
@@ -251,45 +341,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
251
341
|
|
|
252
342
|
raf = requestAnimationFrame(tick);
|
|
253
343
|
return () => cancelAnimationFrame(raf);
|
|
254
|
-
}, [isControlled, playing, speed, loop, catchUp, font]);
|
|
255
|
-
|
|
256
|
-
// --- SVG refs (only needed in SVG mode) ---
|
|
257
|
-
const svgRefs = useRef(new Map<number, SVGSVGElement>());
|
|
258
|
-
const svgRefCallbacks = useRef(new Map<number, (node: SVGSVGElement | null) => void>());
|
|
259
|
-
|
|
260
|
-
const makeSvgRef = useCallback(
|
|
261
|
-
(charIdx: number) => (node: SVGSVGElement | null) => {
|
|
262
|
-
if (node) {
|
|
263
|
-
node.pauseAnimations();
|
|
264
|
-
svgRefs.current.set(charIdx, node);
|
|
265
|
-
} else {
|
|
266
|
-
svgRefs.current.delete(charIdx);
|
|
267
|
-
}
|
|
268
|
-
},
|
|
269
|
-
[],
|
|
270
|
-
);
|
|
271
|
-
|
|
272
|
-
const getSvgRef = useCallback(
|
|
273
|
-
(charIdx: number) => {
|
|
274
|
-
let cb = svgRefCallbacks.current.get(charIdx);
|
|
275
|
-
if (!cb) {
|
|
276
|
-
cb = makeSvgRef(charIdx);
|
|
277
|
-
svgRefCallbacks.current.set(charIdx, cb);
|
|
278
|
-
}
|
|
279
|
-
return cb;
|
|
280
|
-
},
|
|
281
|
-
[makeSvgRef],
|
|
282
|
-
);
|
|
283
|
-
|
|
284
|
-
// Clear stale SVG refs when font or mode changes
|
|
285
|
-
const prevFontRef = useRef(font);
|
|
286
|
-
const prevModeRef = useRef(mode);
|
|
287
|
-
if (prevFontRef.current !== font || prevModeRef.current !== mode) {
|
|
288
|
-
prevFontRef.current = font;
|
|
289
|
-
prevModeRef.current = mode;
|
|
290
|
-
svgRefs.current.clear();
|
|
291
|
-
svgRefCallbacks.current.clear();
|
|
292
|
-
}
|
|
344
|
+
}, [isControlled, playing, speed, loop, catchUp, font, fontReady]);
|
|
293
345
|
|
|
294
346
|
// --- Container size observation ---
|
|
295
347
|
useEffect(() => {
|
|
@@ -301,6 +353,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
301
353
|
const styles = getComputedStyle(el);
|
|
302
354
|
setFontSize(Number.parseFloat(styles.fontSize));
|
|
303
355
|
setLineHeight(Number.parseFloat(styles.lineHeight));
|
|
356
|
+
setCurrentColor(styles.color);
|
|
304
357
|
}
|
|
305
358
|
});
|
|
306
359
|
ro.observe(el);
|
|
@@ -320,6 +373,9 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
320
373
|
setFontSize(Number.parseFloat(styles.fontSize));
|
|
321
374
|
setLineHeight(Number.parseFloat(styles.lineHeight));
|
|
322
375
|
}
|
|
376
|
+
if (e.propertyName === 'color') {
|
|
377
|
+
setCurrentColor(styles.color);
|
|
378
|
+
}
|
|
323
379
|
if (e.propertyName === CSS_PROGRESS) {
|
|
324
380
|
const rawProgress = Number(styles.getPropertyValue(CSS_PROGRESS));
|
|
325
381
|
setCssTime(rawProgress * totalDurationRef.current);
|
|
@@ -331,35 +387,18 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
331
387
|
|
|
332
388
|
// --- Text layout ---
|
|
333
389
|
const layout = useMemo(() => {
|
|
334
|
-
if (!fontFamily || !fontSize || !containerWidth || !resolvedText) return null;
|
|
390
|
+
if (!fontReady || !fontFamily || !fontSize || !containerWidth || !resolvedText) return null;
|
|
335
391
|
return computeTextLayout(resolvedText, fontFamily, fontSize, lineHeight, containerWidth);
|
|
336
|
-
}, [resolvedText, fontFamily, fontSize, lineHeight, containerWidth]);
|
|
392
|
+
}, [fontReady, resolvedText, fontFamily, fontSize, lineHeight, containerWidth]);
|
|
337
393
|
|
|
338
394
|
// --- Canvas padding ---
|
|
339
395
|
const padH = PADDING_H_EM * fontSize;
|
|
340
396
|
const padV = fontSize ? Math.max(MIN_PADDING_V_EM * fontSize, (MIN_LINE_HEIGHT_EM * fontSize - lineHeight) / 2) : 0;
|
|
341
397
|
|
|
342
|
-
// --- Sync SVG glyph times before paint ---
|
|
343
|
-
// Runs every render so SVGs stay correct even when currentTime hasn't changed
|
|
344
|
-
// (e.g. after pausing, or when ref callbacks re-fire due to re-renders).
|
|
345
|
-
useLayoutEffect(() => {
|
|
346
|
-
if (mode !== 'svg') return;
|
|
347
|
-
const entries = timeline.entries;
|
|
348
|
-
for (let i = 0; i < entries.length; i++) {
|
|
349
|
-
const entry = entries[i]!;
|
|
350
|
-
if (!entry.hasSvg) continue;
|
|
351
|
-
const svg = svgRefs.current.get(i);
|
|
352
|
-
if (!svg) continue;
|
|
353
|
-
const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
|
|
354
|
-
svg.setCurrentTime(localTime);
|
|
355
|
-
}
|
|
356
|
-
});
|
|
357
|
-
|
|
358
398
|
// --- Canvas rendering ---
|
|
359
399
|
const canvasRef = useRef<HTMLCanvasElement>(null);
|
|
360
400
|
|
|
361
401
|
useLayoutEffect(() => {
|
|
362
|
-
if (mode !== 'canvas') return;
|
|
363
402
|
const canvas = canvasRef.current;
|
|
364
403
|
if (!canvas || !font?.glyphData || !layout || !fontSize) return;
|
|
365
404
|
|
|
@@ -384,8 +423,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
384
423
|
ctx.clearRect(0, 0, w, h);
|
|
385
424
|
ctx.translate(padH, padV);
|
|
386
425
|
|
|
387
|
-
|
|
388
|
-
const color = getComputedStyle(el).color;
|
|
426
|
+
const color = currentColor || getComputedStyle(el).color;
|
|
389
427
|
|
|
390
428
|
const emHeightPx = emHeight * fontSize;
|
|
391
429
|
const halfLeading = (lineHeight - emHeightPx) / 2;
|
|
@@ -402,7 +440,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
402
440
|
const kerning = layout.kernings[charIdx] ?? 0;
|
|
403
441
|
const glyph = font.glyphData[char];
|
|
404
442
|
|
|
405
|
-
if (glyph && entry.
|
|
443
|
+
if (glyph && entry.hasGlyph) {
|
|
406
444
|
const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
|
|
407
445
|
const glyphY = y + halfLeading;
|
|
408
446
|
drawGlyph(
|
|
@@ -423,7 +461,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
423
461
|
seed + charIdx,
|
|
424
462
|
segmentSize,
|
|
425
463
|
);
|
|
426
|
-
} else if (!entry.
|
|
464
|
+
} else if (!entry.hasGlyph && currentTime >= entry.offset + entry.duration) {
|
|
427
465
|
const baseline = y + halfLeading + (font.ascender / font.unitsPerEm) * fontSize;
|
|
428
466
|
drawFallbackGlyph(ctx, char, x, baseline, fontSize, fontFamily!, color, resolvedEffects, seed + charIdx);
|
|
429
467
|
}
|
|
@@ -433,7 +471,6 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
433
471
|
y += lineHeight;
|
|
434
472
|
}
|
|
435
473
|
}, [
|
|
436
|
-
mode,
|
|
437
474
|
currentTime,
|
|
438
475
|
timeline,
|
|
439
476
|
layout,
|
|
@@ -445,69 +482,15 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
445
482
|
emHeight,
|
|
446
483
|
padH,
|
|
447
484
|
padV,
|
|
485
|
+
currentColor,
|
|
448
486
|
resolvedEffects,
|
|
449
487
|
seed,
|
|
450
488
|
segmentSize,
|
|
451
489
|
]);
|
|
452
490
|
|
|
453
|
-
// --- SVG rendering (skipped entirely in canvas mode) ---
|
|
454
|
-
const lineElements = useMemo(() => {
|
|
455
|
-
if (mode !== 'svg' || !font || !resolvedText) return null;
|
|
456
|
-
|
|
457
|
-
const characters = graphemes(resolvedText);
|
|
458
|
-
|
|
459
|
-
const renderGlyph = (charIdx: number) => {
|
|
460
|
-
const char = characters[charIdx]!;
|
|
461
|
-
const entry = timeline.entries[charIdx]!;
|
|
462
|
-
const GlyphSvg = font.glyphs[char] as any;
|
|
463
|
-
const width = layout?.charWidths[charIdx] ?? 1;
|
|
464
|
-
const kerning = layout?.kernings[charIdx];
|
|
465
|
-
|
|
466
|
-
if (char === '\n') return null;
|
|
467
|
-
|
|
468
|
-
if (GlyphSvg) {
|
|
469
|
-
return (
|
|
470
|
-
<GlyphSvg
|
|
471
|
-
key={charIdx}
|
|
472
|
-
ref={getSvgRef(charIdx)}
|
|
473
|
-
style={{
|
|
474
|
-
display: 'inline-block',
|
|
475
|
-
verticalAlign: `${baselineOffset}em`,
|
|
476
|
-
width: `${width}em`,
|
|
477
|
-
marginRight: kerning ? `${kerning}em` : undefined,
|
|
478
|
-
height: `${emHeight}em`,
|
|
479
|
-
overflow: 'visible',
|
|
480
|
-
}}
|
|
481
|
-
/>
|
|
482
|
-
);
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
const isVisible = currentTime >= entry.offset + entry.duration;
|
|
486
|
-
return (
|
|
487
|
-
<span style={{ fontFamily, visibility: isVisible ? 'visible' : 'hidden' }} key={charIdx}>
|
|
488
|
-
{char}
|
|
489
|
-
</span>
|
|
490
|
-
);
|
|
491
|
-
};
|
|
492
|
-
|
|
493
|
-
if (layout) {
|
|
494
|
-
return layout.lines.map((lineIndices, lineIdx) => {
|
|
495
|
-
const isEmpty = lineIndices.every((i) => characters[i] === '\n');
|
|
496
|
-
return (
|
|
497
|
-
<div style={{ whiteSpace: 'nowrap', height: isEmpty ? '1lh' : undefined, lineHeight: `${lineHeight}px` }} key={lineIdx}>
|
|
498
|
-
{lineIndices.map(renderGlyph)}
|
|
499
|
-
</div>
|
|
500
|
-
);
|
|
501
|
-
});
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
// Fallback before layout is ready: single line
|
|
505
|
-
return characters.length > 0 ? <div style={{ whiteSpace: 'nowrap' }}>{characters.map((_, i) => renderGlyph(i))}</div> : null;
|
|
506
|
-
}, [mode, resolvedText, timeline, font, layout, getSvgRef, baselineOffset, emHeight, currentTime, fontFamily, lineHeight]);
|
|
507
|
-
|
|
508
491
|
// --- Rendering ---
|
|
509
492
|
|
|
510
|
-
if (!font || !resolvedText) {
|
|
493
|
+
if (!font || !resolvedText || !fontReady) {
|
|
511
494
|
return <div ref={rootRef} {...props} />;
|
|
512
495
|
}
|
|
513
496
|
|
|
@@ -528,24 +511,26 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
528
511
|
},
|
|
529
512
|
}}
|
|
530
513
|
>
|
|
531
|
-
{
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
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>
|
|
549
534
|
<canvas
|
|
550
535
|
ref={canvasRef}
|
|
551
536
|
aria-hidden
|
|
@@ -557,32 +542,20 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
557
542
|
pointerEvents: 'none',
|
|
558
543
|
}}
|
|
559
544
|
/>
|
|
560
|
-
|
|
545
|
+
|
|
561
546
|
<div
|
|
562
547
|
style={{
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
548
|
+
userSelect: 'auto',
|
|
549
|
+
whiteSpace: 'pre-wrap',
|
|
550
|
+
overflowWrap: 'break-word',
|
|
551
|
+
paddingRight: 1,
|
|
552
|
+
WebkitTextFillColor: showOverlay ? undefined : 'transparent',
|
|
566
553
|
fontFamily,
|
|
554
|
+
color: showOverlay ? 'rgba(255, 0, 0, 0.4)' : undefined,
|
|
567
555
|
}}
|
|
568
556
|
>
|
|
569
|
-
{
|
|
557
|
+
{resolvedText}
|
|
570
558
|
</div>
|
|
571
|
-
)}
|
|
572
|
-
|
|
573
|
-
<div
|
|
574
|
-
style={{
|
|
575
|
-
userSelect: 'auto',
|
|
576
|
-
whiteSpace: 'pre-wrap',
|
|
577
|
-
overflowWrap: 'break-word',
|
|
578
|
-
paddingRight: 1,
|
|
579
|
-
WebkitTextFillColor: showOverlay ? undefined : 'transparent',
|
|
580
|
-
fontFamily,
|
|
581
|
-
color: showOverlay ? 'rgba(255, 0, 0, 0.4)' : undefined,
|
|
582
|
-
fontFeatureSettings: "'calt' 0, 'liga' 0",
|
|
583
|
-
}}
|
|
584
|
-
>
|
|
585
|
-
{resolvedText}
|
|
586
559
|
</div>
|
|
587
560
|
</div>
|
|
588
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
|
}
|