tegaki 0.2.3 → 0.3.1
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 +155 -197
- 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 +154 -177
- 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.1",
|
|
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,6 @@
|
|
|
1
|
-
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { type ComponentProps, type Ref, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|
2
4
|
import type { TegakiBundle, TegakiEffects } from '../types.ts';
|
|
3
5
|
import { drawFallbackGlyph } from './drawFallbackGlyph.ts';
|
|
4
6
|
import { drawGlyph } from './drawGlyph.ts';
|
|
@@ -20,13 +22,18 @@ const CSS_PROGRESS = '--tegaki-progress';
|
|
|
20
22
|
const CSS_DURATION = '--tegaki-duration';
|
|
21
23
|
|
|
22
24
|
// Register custom properties so they are animatable (typed as <number>).
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
// Deferred to first mount to avoid running at import time during SSR.
|
|
26
|
+
let cssPropertiesRegistered = false;
|
|
27
|
+
function registerCssProperties() {
|
|
28
|
+
if (cssPropertiesRegistered) return;
|
|
29
|
+
cssPropertiesRegistered = true;
|
|
30
|
+
if (typeof CSS !== 'undefined' && 'registerProperty' in CSS) {
|
|
31
|
+
for (const prop of [CSS_TIME, CSS_PROGRESS, CSS_DURATION]) {
|
|
32
|
+
try {
|
|
33
|
+
CSS.registerProperty({ name: prop, syntax: '<number>', inherits: true, initialValue: '0' });
|
|
34
|
+
} catch {
|
|
35
|
+
// Already registered — ignore.
|
|
36
|
+
}
|
|
30
37
|
}
|
|
31
38
|
}
|
|
32
39
|
}
|
|
@@ -69,7 +76,33 @@ export type TimeControlMode = {
|
|
|
69
76
|
*/
|
|
70
77
|
export type TimeControlProp = null | undefined | number | 'css' | TimeControlMode[keyof TimeControlMode];
|
|
71
78
|
|
|
72
|
-
|
|
79
|
+
/** Imperative handle exposed via the `ref` prop. */
|
|
80
|
+
export interface TegakiRendererHandle {
|
|
81
|
+
/** The root DOM element. */
|
|
82
|
+
getElement(): HTMLDivElement | null;
|
|
83
|
+
/** Current animation time in seconds. */
|
|
84
|
+
getCurrentTime(): number;
|
|
85
|
+
/** Total timeline duration in seconds. */
|
|
86
|
+
getDuration(): number;
|
|
87
|
+
/** Whether the animation is currently playing (uncontrolled mode only). */
|
|
88
|
+
getIsPlaying(): boolean;
|
|
89
|
+
/** Whether the animation has reached the end. */
|
|
90
|
+
getIsComplete(): boolean;
|
|
91
|
+
/** Resume playback (uncontrolled mode only). No-op in controlled/css mode. */
|
|
92
|
+
play(): void;
|
|
93
|
+
/** Pause playback (uncontrolled mode only). No-op in controlled/css mode. */
|
|
94
|
+
pause(): void;
|
|
95
|
+
/** Jump to a specific time in seconds (uncontrolled mode only). No-op in controlled/css mode. */
|
|
96
|
+
seek(time: number): void;
|
|
97
|
+
/** Seek to 0 and play (uncontrolled mode only). No-op in controlled/css mode. */
|
|
98
|
+
restart(): void;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string, never>>
|
|
102
|
+
extends Omit<ComponentProps<'div'>, 'children' | 'ref'> {
|
|
103
|
+
/** Imperative handle ref for playback controls and DOM access. */
|
|
104
|
+
ref?: Ref<TegakiRendererHandle>;
|
|
105
|
+
|
|
73
106
|
/** TegakiBundle with font data and animated glyph SVGs. */
|
|
74
107
|
font?: TegakiBundle;
|
|
75
108
|
|
|
@@ -89,10 +122,6 @@ export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string,
|
|
|
89
122
|
/** Called once when the animation reaches the end of the timeline. */
|
|
90
123
|
onComplete?: () => void;
|
|
91
124
|
|
|
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
125
|
/** Visual effects applied during canvas rendering. */
|
|
97
126
|
effects?: E;
|
|
98
127
|
|
|
@@ -110,18 +139,20 @@ export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string,
|
|
|
110
139
|
// --- Component ---
|
|
111
140
|
|
|
112
141
|
export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string, never>>({
|
|
142
|
+
ref,
|
|
113
143
|
font,
|
|
114
144
|
text,
|
|
115
145
|
children,
|
|
116
146
|
time: timeProp,
|
|
117
147
|
onComplete,
|
|
118
|
-
mode = 'canvas',
|
|
119
148
|
effects,
|
|
120
149
|
segmentSize,
|
|
121
150
|
timing,
|
|
122
151
|
showOverlay,
|
|
123
152
|
...props
|
|
124
153
|
}: TegakiRendererProps<E>) {
|
|
154
|
+
registerCssProperties();
|
|
155
|
+
|
|
125
156
|
const resolvedText = text ?? coerceToString(children);
|
|
126
157
|
|
|
127
158
|
// --- Resolve effects ---
|
|
@@ -143,25 +174,44 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
143
174
|
const controlledTime = timeControl.mode === 'controlled' ? timeControl.value : undefined;
|
|
144
175
|
const defaultTime = timeControl.mode === 'uncontrolled' ? (timeControl.initialTime ?? 0) : 0;
|
|
145
176
|
const speed = timeControl.mode === 'uncontrolled' ? (timeControl.speed ?? 1) : 1;
|
|
146
|
-
const
|
|
177
|
+
const propPlaying = timeControl.mode === 'uncontrolled' ? (timeControl.playing ?? true) : false;
|
|
147
178
|
const loop = timeControl.mode === 'uncontrolled' ? (timeControl.loop ?? false) : false;
|
|
148
179
|
const catchUp = timeControl.mode === 'uncontrolled' ? (timeControl.catchUp ?? 0) : 0;
|
|
149
180
|
const onTimeChange = timeControl.mode === 'uncontrolled' ? timeControl.onTimeChange : undefined;
|
|
150
181
|
|
|
182
|
+
// Imperative playing override (undefined = follow prop)
|
|
183
|
+
const [playingOverride, setPlayingOverride] = useState<boolean | undefined>(undefined);
|
|
184
|
+
const playing = playingOverride ?? propPlaying;
|
|
185
|
+
|
|
186
|
+
// Reset override when the prop changes so the prop regains control
|
|
187
|
+
const prevPropPlaying = useRef(propPlaying);
|
|
188
|
+
if (prevPropPlaying.current !== propPlaying) {
|
|
189
|
+
prevPropPlaying.current = propPlaying;
|
|
190
|
+
setPlayingOverride(undefined);
|
|
191
|
+
}
|
|
192
|
+
|
|
151
193
|
// --- Internal time (uncontrolled mode) ---
|
|
152
194
|
const [internalTime, setInternalTime] = useState(defaultTime);
|
|
153
195
|
// --- CSS-driven time ---
|
|
154
196
|
const [cssTime, setCssTime] = useState(0);
|
|
155
197
|
const currentTime = isCss ? cssTime : isControlled ? controlledTime! : internalTime;
|
|
156
198
|
|
|
157
|
-
// Stable
|
|
199
|
+
// Stable refs so the imperative handle and rAF loop always see latest values
|
|
200
|
+
const currentTimeRef = useRef(currentTime);
|
|
201
|
+
currentTimeRef.current = currentTime;
|
|
202
|
+
const playingRef = useRef(playing);
|
|
203
|
+
playingRef.current = playing;
|
|
204
|
+
const isControlledRef = useRef(isControlled);
|
|
205
|
+
isControlledRef.current = isControlled;
|
|
158
206
|
const onTimeChangeRef = useRef(onTimeChange);
|
|
159
207
|
onTimeChangeRef.current = onTimeChange;
|
|
160
208
|
const onCompleteRef = useRef(onComplete);
|
|
161
209
|
onCompleteRef.current = onComplete;
|
|
162
210
|
|
|
163
211
|
// --- Font loading ---
|
|
164
|
-
const [fontReady, setFontReady] = useState(
|
|
212
|
+
const [fontReady, setFontReady] = useState(
|
|
213
|
+
() => typeof document !== 'undefined' && !!font && document.fonts.check(`16px "${font.family}"`),
|
|
214
|
+
);
|
|
165
215
|
useEffect(() => {
|
|
166
216
|
if (!font) {
|
|
167
217
|
setFontReady(false);
|
|
@@ -186,13 +236,13 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
186
236
|
// --- Font-derived constants ---
|
|
187
237
|
const fontFamily = font?.family;
|
|
188
238
|
const emHeight = font ? (font.ascender - font.descender) / font.unitsPerEm : 0;
|
|
189
|
-
const baselineOffset = font ? font.descender / font.unitsPerEm : 0;
|
|
190
239
|
|
|
191
240
|
// --- Container measurement ---
|
|
192
241
|
const rootRef = useRef<HTMLDivElement>(null);
|
|
193
242
|
const [containerWidth, setContainerWidth] = useState(0);
|
|
194
243
|
const [fontSize, setFontSize] = useState(0);
|
|
195
244
|
const [lineHeight, setLineHeight] = useState(0);
|
|
245
|
+
const [currentColor, setCurrentColor] = useState('');
|
|
196
246
|
|
|
197
247
|
// --- Timeline ---
|
|
198
248
|
const timeline = useMemo(
|
|
@@ -220,6 +270,34 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
220
270
|
}
|
|
221
271
|
});
|
|
222
272
|
|
|
273
|
+
// --- Imperative handle (stable — reads from refs) ---
|
|
274
|
+
useImperativeHandle(
|
|
275
|
+
ref,
|
|
276
|
+
() => ({
|
|
277
|
+
getElement: () => rootRef.current,
|
|
278
|
+
getCurrentTime: () => currentTimeRef.current,
|
|
279
|
+
getDuration: () => totalDurationRef.current,
|
|
280
|
+
getIsPlaying: () => playingRef.current,
|
|
281
|
+
getIsComplete: () => totalDurationRef.current > 0 && currentTimeRef.current >= totalDurationRef.current,
|
|
282
|
+
play: () => {
|
|
283
|
+
if (!isControlledRef.current) setPlayingOverride(true);
|
|
284
|
+
},
|
|
285
|
+
pause: () => {
|
|
286
|
+
if (!isControlledRef.current) setPlayingOverride(false);
|
|
287
|
+
},
|
|
288
|
+
seek: (time: number) => {
|
|
289
|
+
if (!isControlledRef.current) setInternalTime(Math.max(0, Math.min(time, totalDurationRef.current)));
|
|
290
|
+
},
|
|
291
|
+
restart: () => {
|
|
292
|
+
if (!isControlledRef.current) {
|
|
293
|
+
setInternalTime(0);
|
|
294
|
+
setPlayingOverride(true);
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
}),
|
|
298
|
+
[],
|
|
299
|
+
);
|
|
300
|
+
|
|
223
301
|
// --- Uncontrolled: time change notification ---
|
|
224
302
|
useEffect(() => {
|
|
225
303
|
if (!isControlled) {
|
|
@@ -227,9 +305,28 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
227
305
|
}
|
|
228
306
|
}, [internalTime, isControlled]);
|
|
229
307
|
|
|
308
|
+
// --- Reduced motion preference ---
|
|
309
|
+
const [prefersReducedMotion, setPrefersReducedMotion] = useState(
|
|
310
|
+
() => typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches,
|
|
311
|
+
);
|
|
312
|
+
useEffect(() => {
|
|
313
|
+
const mql = window.matchMedia('(prefers-reduced-motion: reduce)');
|
|
314
|
+
setPrefersReducedMotion(mql.matches);
|
|
315
|
+
const onChange = (e: MediaQueryListEvent) => setPrefersReducedMotion(e.matches);
|
|
316
|
+
mql.addEventListener('change', onChange);
|
|
317
|
+
return () => mql.removeEventListener('change', onChange);
|
|
318
|
+
}, []);
|
|
319
|
+
|
|
320
|
+
// When reduced motion is preferred, skip to end of timeline
|
|
321
|
+
useEffect(() => {
|
|
322
|
+
if (prefersReducedMotion && !isControlled && timeline.totalDuration > 0) {
|
|
323
|
+
setInternalTime(timeline.totalDuration);
|
|
324
|
+
}
|
|
325
|
+
}, [prefersReducedMotion, isControlled, timeline.totalDuration]);
|
|
326
|
+
|
|
230
327
|
// --- Uncontrolled: rAF playback loop ---
|
|
231
328
|
useEffect(() => {
|
|
232
|
-
if (isControlled || !playing || !font || !fontReady) return;
|
|
329
|
+
if (isControlled || !playing || !font || !fontReady || prefersReducedMotion) return;
|
|
233
330
|
|
|
234
331
|
// Reset smoothed boost when the loop restarts
|
|
235
332
|
smoothedBoostRef.current = 0;
|
|
@@ -274,45 +371,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
274
371
|
|
|
275
372
|
raf = requestAnimationFrame(tick);
|
|
276
373
|
return () => cancelAnimationFrame(raf);
|
|
277
|
-
}, [isControlled, playing, speed, loop, catchUp, font, fontReady]);
|
|
278
|
-
|
|
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
|
-
}
|
|
374
|
+
}, [isControlled, playing, speed, loop, catchUp, font, fontReady, prefersReducedMotion]);
|
|
316
375
|
|
|
317
376
|
// --- Container size observation ---
|
|
318
377
|
useEffect(() => {
|
|
@@ -324,6 +383,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
324
383
|
const styles = getComputedStyle(el);
|
|
325
384
|
setFontSize(Number.parseFloat(styles.fontSize));
|
|
326
385
|
setLineHeight(Number.parseFloat(styles.lineHeight));
|
|
386
|
+
setCurrentColor(styles.color);
|
|
327
387
|
}
|
|
328
388
|
});
|
|
329
389
|
ro.observe(el);
|
|
@@ -343,6 +403,9 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
343
403
|
setFontSize(Number.parseFloat(styles.fontSize));
|
|
344
404
|
setLineHeight(Number.parseFloat(styles.lineHeight));
|
|
345
405
|
}
|
|
406
|
+
if (e.propertyName === 'color') {
|
|
407
|
+
setCurrentColor(styles.color);
|
|
408
|
+
}
|
|
346
409
|
if (e.propertyName === CSS_PROGRESS) {
|
|
347
410
|
const rawProgress = Number(styles.getPropertyValue(CSS_PROGRESS));
|
|
348
411
|
setCssTime(rawProgress * totalDurationRef.current);
|
|
@@ -362,27 +425,10 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
362
425
|
const padH = PADDING_H_EM * fontSize;
|
|
363
426
|
const padV = fontSize ? Math.max(MIN_PADDING_V_EM * fontSize, (MIN_LINE_HEIGHT_EM * fontSize - lineHeight) / 2) : 0;
|
|
364
427
|
|
|
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
428
|
// --- Canvas rendering ---
|
|
382
429
|
const canvasRef = useRef<HTMLCanvasElement>(null);
|
|
383
430
|
|
|
384
431
|
useLayoutEffect(() => {
|
|
385
|
-
if (mode !== 'canvas') return;
|
|
386
432
|
const canvas = canvasRef.current;
|
|
387
433
|
if (!canvas || !font?.glyphData || !layout || !fontSize) return;
|
|
388
434
|
|
|
@@ -407,8 +453,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
407
453
|
ctx.clearRect(0, 0, w, h);
|
|
408
454
|
ctx.translate(padH, padV);
|
|
409
455
|
|
|
410
|
-
|
|
411
|
-
const color = getComputedStyle(el).color;
|
|
456
|
+
const color = currentColor || getComputedStyle(el).color;
|
|
412
457
|
|
|
413
458
|
const emHeightPx = emHeight * fontSize;
|
|
414
459
|
const halfLeading = (lineHeight - emHeightPx) / 2;
|
|
@@ -425,7 +470,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
425
470
|
const kerning = layout.kernings[charIdx] ?? 0;
|
|
426
471
|
const glyph = font.glyphData[char];
|
|
427
472
|
|
|
428
|
-
if (glyph && entry.
|
|
473
|
+
if (glyph && entry.hasGlyph) {
|
|
429
474
|
const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
|
|
430
475
|
const glyphY = y + halfLeading;
|
|
431
476
|
drawGlyph(
|
|
@@ -446,7 +491,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
446
491
|
seed + charIdx,
|
|
447
492
|
segmentSize,
|
|
448
493
|
);
|
|
449
|
-
} else if (!entry.
|
|
494
|
+
} else if (!entry.hasGlyph && currentTime >= entry.offset + entry.duration) {
|
|
450
495
|
const baseline = y + halfLeading + (font.ascender / font.unitsPerEm) * fontSize;
|
|
451
496
|
drawFallbackGlyph(ctx, char, x, baseline, fontSize, fontFamily!, color, resolvedEffects, seed + charIdx);
|
|
452
497
|
}
|
|
@@ -456,7 +501,6 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
456
501
|
y += lineHeight;
|
|
457
502
|
}
|
|
458
503
|
}, [
|
|
459
|
-
mode,
|
|
460
504
|
currentTime,
|
|
461
505
|
timeline,
|
|
462
506
|
layout,
|
|
@@ -468,72 +512,14 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
468
512
|
emHeight,
|
|
469
513
|
padH,
|
|
470
514
|
padV,
|
|
515
|
+
currentColor,
|
|
471
516
|
resolvedEffects,
|
|
472
517
|
seed,
|
|
473
518
|
segmentSize,
|
|
474
519
|
]);
|
|
475
520
|
|
|
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
521
|
// --- Rendering ---
|
|
532
522
|
|
|
533
|
-
if (!font || !resolvedText || !fontReady) {
|
|
534
|
-
return <div ref={rootRef} {...props} />;
|
|
535
|
-
}
|
|
536
|
-
|
|
537
523
|
return (
|
|
538
524
|
<div
|
|
539
525
|
ref={rootRef}
|
|
@@ -551,27 +537,29 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
551
537
|
},
|
|
552
538
|
}}
|
|
553
539
|
>
|
|
554
|
-
{
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
540
|
+
<div style={{ position: 'relative' }}>
|
|
541
|
+
{/* Sentinel: inherits font-size & line-height; its height changes when either changes */}
|
|
542
|
+
<span
|
|
543
|
+
ref={sentinelRef}
|
|
544
|
+
aria-hidden="true"
|
|
545
|
+
style={{
|
|
546
|
+
position: 'absolute',
|
|
547
|
+
width: 0,
|
|
548
|
+
overflow: 'hidden',
|
|
549
|
+
pointerEvents: 'none',
|
|
550
|
+
fontSize: 'inherit',
|
|
551
|
+
lineHeight: 'inherit',
|
|
552
|
+
visibility: 'hidden',
|
|
553
|
+
transition: isCss
|
|
554
|
+
? `font-size 0.001s, line-height 0.001s, color 0.001s, ${CSS_PROGRESS} 0.001s`
|
|
555
|
+
: 'font-size 0.001s, line-height 0.001s, color 0.001s',
|
|
556
|
+
}}
|
|
557
|
+
>
|
|
558
|
+
{'\u00A0'}
|
|
559
|
+
</span>
|
|
572
560
|
<canvas
|
|
573
561
|
ref={canvasRef}
|
|
574
|
-
aria-hidden
|
|
562
|
+
aria-hidden="true"
|
|
575
563
|
style={{
|
|
576
564
|
position: 'absolute',
|
|
577
565
|
inset: `${-padV}px ${-padH}px`,
|
|
@@ -580,31 +568,20 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
|
|
|
580
568
|
pointerEvents: 'none',
|
|
581
569
|
}}
|
|
582
570
|
/>
|
|
583
|
-
|
|
571
|
+
|
|
584
572
|
<div
|
|
585
573
|
style={{
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
574
|
+
userSelect: 'auto',
|
|
575
|
+
whiteSpace: 'pre-wrap',
|
|
576
|
+
overflowWrap: 'break-word',
|
|
577
|
+
paddingRight: 1,
|
|
578
|
+
WebkitTextFillColor: showOverlay ? undefined : 'transparent',
|
|
589
579
|
fontFamily,
|
|
580
|
+
color: showOverlay ? 'rgba(255, 0, 0, 0.4)' : undefined,
|
|
590
581
|
}}
|
|
591
582
|
>
|
|
592
|
-
{
|
|
583
|
+
{resolvedText}
|
|
593
584
|
</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
585
|
</div>
|
|
609
586
|
</div>
|
|
610
587
|
);
|
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
|