tegaki 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (744) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +4 -43
  3. package/dist/index.d.mts +42 -23
  4. package/dist/index.mjs +118 -178
  5. package/dist/index.mjs.map +1 -1
  6. package/fonts/caveat/bundle.ts +0 -275
  7. package/fonts/caveat/glyphData.json +1 -1
  8. package/fonts/italianno/bundle.ts +0 -275
  9. package/fonts/italianno/glyphData.json +1 -1
  10. package/fonts/parisienne/bundle.ts +0 -275
  11. package/fonts/parisienne/glyphData.json +1 -1
  12. package/fonts/tangerine/bundle.ts +0 -275
  13. package/fonts/tangerine/glyphData.json +1 -1
  14. package/package.json +2 -2
  15. package/src/env.d.ts +0 -6
  16. package/src/index.ts +1 -0
  17. package/src/lib/TegakiRenderer.tsx +113 -162
  18. package/src/lib/drawGlyph.ts +25 -25
  19. package/src/lib/timeline.ts +6 -5
  20. package/src/types.ts +13 -8
  21. package/fonts/caveat/font.json +0 -24472
  22. package/fonts/caveat/svg/0.svg +0 -12
  23. package/fonts/caveat/svg/0.tsx +0 -14
  24. package/fonts/caveat/svg/1.svg +0 -7
  25. package/fonts/caveat/svg/1.tsx +0 -9
  26. package/fonts/caveat/svg/2.svg +0 -10
  27. package/fonts/caveat/svg/2.tsx +0 -12
  28. package/fonts/caveat/svg/3.svg +0 -12
  29. package/fonts/caveat/svg/3.tsx +0 -14
  30. package/fonts/caveat/svg/4.svg +0 -12
  31. package/fonts/caveat/svg/4.tsx +0 -14
  32. package/fonts/caveat/svg/5.svg +0 -7
  33. package/fonts/caveat/svg/5.tsx +0 -9
  34. package/fonts/caveat/svg/6.svg +0 -7
  35. package/fonts/caveat/svg/6.tsx +0 -9
  36. package/fonts/caveat/svg/7.svg +0 -12
  37. package/fonts/caveat/svg/7.tsx +0 -14
  38. package/fonts/caveat/svg/8.svg +0 -10
  39. package/fonts/caveat/svg/8.tsx +0 -12
  40. package/fonts/caveat/svg/9.svg +0 -12
  41. package/fonts/caveat/svg/9.tsx +0 -14
  42. package/fonts/caveat/svg/U+0021.svg +0 -12
  43. package/fonts/caveat/svg/U+0021.tsx +0 -14
  44. package/fonts/caveat/svg/U+0022.svg +0 -12
  45. package/fonts/caveat/svg/U+0022.tsx +0 -14
  46. package/fonts/caveat/svg/U+0023.svg +0 -22
  47. package/fonts/caveat/svg/U+0023.tsx +0 -24
  48. package/fonts/caveat/svg/U+0024.svg +0 -12
  49. package/fonts/caveat/svg/U+0024.tsx +0 -14
  50. package/fonts/caveat/svg/U+0025.svg +0 -25
  51. package/fonts/caveat/svg/U+0025.tsx +0 -27
  52. package/fonts/caveat/svg/U+0026.svg +0 -10
  53. package/fonts/caveat/svg/U+0026.tsx +0 -12
  54. package/fonts/caveat/svg/U+0027.svg +0 -7
  55. package/fonts/caveat/svg/U+0027.tsx +0 -9
  56. package/fonts/caveat/svg/U+0028.svg +0 -7
  57. package/fonts/caveat/svg/U+0028.tsx +0 -9
  58. package/fonts/caveat/svg/U+0029.svg +0 -7
  59. package/fonts/caveat/svg/U+0029.tsx +0 -9
  60. package/fonts/caveat/svg/U+002a.svg +0 -17
  61. package/fonts/caveat/svg/U+002a.tsx +0 -19
  62. package/fonts/caveat/svg/U+002b.svg +0 -12
  63. package/fonts/caveat/svg/U+002b.tsx +0 -14
  64. package/fonts/caveat/svg/U+002c.svg +0 -7
  65. package/fonts/caveat/svg/U+002c.tsx +0 -9
  66. package/fonts/caveat/svg/U+002d.svg +0 -7
  67. package/fonts/caveat/svg/U+002d.tsx +0 -9
  68. package/fonts/caveat/svg/U+002e.svg +0 -7
  69. package/fonts/caveat/svg/U+002e.tsx +0 -9
  70. package/fonts/caveat/svg/U+002f.svg +0 -12
  71. package/fonts/caveat/svg/U+002f.tsx +0 -14
  72. package/fonts/caveat/svg/U+003a.svg +0 -12
  73. package/fonts/caveat/svg/U+003a.tsx +0 -14
  74. package/fonts/caveat/svg/U+003b.svg +0 -12
  75. package/fonts/caveat/svg/U+003b.tsx +0 -14
  76. package/fonts/caveat/svg/U+003c.svg +0 -12
  77. package/fonts/caveat/svg/U+003c.tsx +0 -14
  78. package/fonts/caveat/svg/U+003d.svg +0 -12
  79. package/fonts/caveat/svg/U+003d.tsx +0 -14
  80. package/fonts/caveat/svg/U+003e.svg +0 -12
  81. package/fonts/caveat/svg/U+003e.tsx +0 -14
  82. package/fonts/caveat/svg/U+003f.svg +0 -12
  83. package/fonts/caveat/svg/U+003f.tsx +0 -14
  84. package/fonts/caveat/svg/U+0040.svg +0 -7
  85. package/fonts/caveat/svg/U+0040.tsx +0 -9
  86. package/fonts/caveat/svg/U+005c.svg +0 -7
  87. package/fonts/caveat/svg/U+005c.tsx +0 -9
  88. package/fonts/caveat/svg/U+005e.svg +0 -7
  89. package/fonts/caveat/svg/U+005e.tsx +0 -9
  90. package/fonts/caveat/svg/U+005f.svg +0 -7
  91. package/fonts/caveat/svg/U+005f.tsx +0 -9
  92. package/fonts/caveat/svg/U+0060.svg +0 -7
  93. package/fonts/caveat/svg/U+0060.tsx +0 -9
  94. package/fonts/caveat/svg/U+007c.svg +0 -7
  95. package/fonts/caveat/svg/U+007c.tsx +0 -9
  96. package/fonts/caveat/svg/U+007e.svg +0 -7
  97. package/fonts/caveat/svg/U+007e.tsx +0 -9
  98. package/fonts/caveat/svg/a.svg +0 -7
  99. package/fonts/caveat/svg/a.tsx +0 -9
  100. package/fonts/caveat/svg/b.svg +0 -12
  101. package/fonts/caveat/svg/b.tsx +0 -14
  102. package/fonts/caveat/svg/c.svg +0 -7
  103. package/fonts/caveat/svg/c.tsx +0 -9
  104. package/fonts/caveat/svg/d.svg +0 -12
  105. package/fonts/caveat/svg/d.tsx +0 -14
  106. package/fonts/caveat/svg/e.svg +0 -7
  107. package/fonts/caveat/svg/e.tsx +0 -9
  108. package/fonts/caveat/svg/f.svg +0 -12
  109. package/fonts/caveat/svg/f.tsx +0 -14
  110. package/fonts/caveat/svg/g.svg +0 -15
  111. package/fonts/caveat/svg/g.tsx +0 -17
  112. package/fonts/caveat/svg/h.svg +0 -7
  113. package/fonts/caveat/svg/h.tsx +0 -9
  114. package/fonts/caveat/svg/i.svg +0 -12
  115. package/fonts/caveat/svg/i.tsx +0 -14
  116. package/fonts/caveat/svg/j.svg +0 -12
  117. package/fonts/caveat/svg/j.tsx +0 -14
  118. package/fonts/caveat/svg/k.svg +0 -15
  119. package/fonts/caveat/svg/k.tsx +0 -17
  120. package/fonts/caveat/svg/l.svg +0 -7
  121. package/fonts/caveat/svg/l.tsx +0 -9
  122. package/fonts/caveat/svg/m.svg +0 -17
  123. package/fonts/caveat/svg/m.tsx +0 -19
  124. package/fonts/caveat/svg/n.svg +0 -17
  125. package/fonts/caveat/svg/n.tsx +0 -19
  126. package/fonts/caveat/svg/o.svg +0 -7
  127. package/fonts/caveat/svg/o.tsx +0 -9
  128. package/fonts/caveat/svg/p.svg +0 -12
  129. package/fonts/caveat/svg/p.tsx +0 -14
  130. package/fonts/caveat/svg/q.svg +0 -7
  131. package/fonts/caveat/svg/q.tsx +0 -9
  132. package/fonts/caveat/svg/r.svg +0 -12
  133. package/fonts/caveat/svg/r.tsx +0 -14
  134. package/fonts/caveat/svg/s.svg +0 -7
  135. package/fonts/caveat/svg/s.tsx +0 -9
  136. package/fonts/caveat/svg/t.svg +0 -20
  137. package/fonts/caveat/svg/t.tsx +0 -22
  138. package/fonts/caveat/svg/u.svg +0 -12
  139. package/fonts/caveat/svg/u.tsx +0 -14
  140. package/fonts/caveat/svg/upper_A.svg +0 -12
  141. package/fonts/caveat/svg/upper_A.tsx +0 -14
  142. package/fonts/caveat/svg/upper_B.svg +0 -17
  143. package/fonts/caveat/svg/upper_B.tsx +0 -19
  144. package/fonts/caveat/svg/upper_C.svg +0 -7
  145. package/fonts/caveat/svg/upper_C.tsx +0 -9
  146. package/fonts/caveat/svg/upper_D.svg +0 -12
  147. package/fonts/caveat/svg/upper_D.tsx +0 -14
  148. package/fonts/caveat/svg/upper_E.svg +0 -12
  149. package/fonts/caveat/svg/upper_E.tsx +0 -14
  150. package/fonts/caveat/svg/upper_F.svg +0 -17
  151. package/fonts/caveat/svg/upper_F.tsx +0 -19
  152. package/fonts/caveat/svg/upper_G.svg +0 -7
  153. package/fonts/caveat/svg/upper_G.tsx +0 -9
  154. package/fonts/caveat/svg/upper_H.svg +0 -17
  155. package/fonts/caveat/svg/upper_H.tsx +0 -19
  156. package/fonts/caveat/svg/upper_I.svg +0 -17
  157. package/fonts/caveat/svg/upper_I.tsx +0 -19
  158. package/fonts/caveat/svg/upper_J.svg +0 -7
  159. package/fonts/caveat/svg/upper_J.tsx +0 -9
  160. package/fonts/caveat/svg/upper_K.svg +0 -12
  161. package/fonts/caveat/svg/upper_K.tsx +0 -14
  162. package/fonts/caveat/svg/upper_L.svg +0 -7
  163. package/fonts/caveat/svg/upper_L.tsx +0 -9
  164. package/fonts/caveat/svg/upper_M.svg +0 -17
  165. package/fonts/caveat/svg/upper_M.tsx +0 -19
  166. package/fonts/caveat/svg/upper_N.svg +0 -7
  167. package/fonts/caveat/svg/upper_N.tsx +0 -9
  168. package/fonts/caveat/svg/upper_O.svg +0 -7
  169. package/fonts/caveat/svg/upper_O.tsx +0 -9
  170. package/fonts/caveat/svg/upper_P.svg +0 -12
  171. package/fonts/caveat/svg/upper_P.tsx +0 -14
  172. package/fonts/caveat/svg/upper_Q.svg +0 -15
  173. package/fonts/caveat/svg/upper_Q.tsx +0 -17
  174. package/fonts/caveat/svg/upper_R.svg +0 -12
  175. package/fonts/caveat/svg/upper_R.tsx +0 -14
  176. package/fonts/caveat/svg/upper_S.svg +0 -7
  177. package/fonts/caveat/svg/upper_S.tsx +0 -9
  178. package/fonts/caveat/svg/upper_T.svg +0 -12
  179. package/fonts/caveat/svg/upper_T.tsx +0 -14
  180. package/fonts/caveat/svg/upper_U.svg +0 -15
  181. package/fonts/caveat/svg/upper_U.tsx +0 -17
  182. package/fonts/caveat/svg/upper_V.svg +0 -12
  183. package/fonts/caveat/svg/upper_V.tsx +0 -14
  184. package/fonts/caveat/svg/upper_W.svg +0 -12
  185. package/fonts/caveat/svg/upper_W.tsx +0 -14
  186. package/fonts/caveat/svg/upper_X.svg +0 -12
  187. package/fonts/caveat/svg/upper_X.tsx +0 -14
  188. package/fonts/caveat/svg/upper_Y.svg +0 -12
  189. package/fonts/caveat/svg/upper_Y.tsx +0 -14
  190. package/fonts/caveat/svg/upper_Z.svg +0 -7
  191. package/fonts/caveat/svg/upper_Z.tsx +0 -9
  192. package/fonts/caveat/svg/v.svg +0 -7
  193. package/fonts/caveat/svg/v.tsx +0 -9
  194. package/fonts/caveat/svg/w.svg +0 -12
  195. package/fonts/caveat/svg/w.tsx +0 -14
  196. package/fonts/caveat/svg/x.svg +0 -17
  197. package/fonts/caveat/svg/x.tsx +0 -19
  198. package/fonts/caveat/svg/y.svg +0 -12
  199. package/fonts/caveat/svg/y.tsx +0 -14
  200. package/fonts/caveat/svg/z.svg +0 -7
  201. package/fonts/caveat/svg/z.tsx +0 -9
  202. package/fonts/italianno/font.json +0 -33410
  203. package/fonts/italianno/svg/0.svg +0 -10
  204. package/fonts/italianno/svg/0.tsx +0 -12
  205. package/fonts/italianno/svg/1.svg +0 -17
  206. package/fonts/italianno/svg/1.tsx +0 -19
  207. package/fonts/italianno/svg/2.svg +0 -12
  208. package/fonts/italianno/svg/2.tsx +0 -14
  209. package/fonts/italianno/svg/3.svg +0 -17
  210. package/fonts/italianno/svg/3.tsx +0 -19
  211. package/fonts/italianno/svg/4.svg +0 -22
  212. package/fonts/italianno/svg/4.tsx +0 -24
  213. package/fonts/italianno/svg/5.svg +0 -12
  214. package/fonts/italianno/svg/5.tsx +0 -14
  215. package/fonts/italianno/svg/6.svg +0 -13
  216. package/fonts/italianno/svg/6.tsx +0 -15
  217. package/fonts/italianno/svg/7.svg +0 -12
  218. package/fonts/italianno/svg/7.tsx +0 -14
  219. package/fonts/italianno/svg/8.svg +0 -7
  220. package/fonts/italianno/svg/8.tsx +0 -9
  221. package/fonts/italianno/svg/9.svg +0 -12
  222. package/fonts/italianno/svg/9.tsx +0 -14
  223. package/fonts/italianno/svg/U+0021.svg +0 -12
  224. package/fonts/italianno/svg/U+0021.tsx +0 -14
  225. package/fonts/italianno/svg/U+0022.svg +0 -15
  226. package/fonts/italianno/svg/U+0022.tsx +0 -17
  227. package/fonts/italianno/svg/U+0023.svg +0 -22
  228. package/fonts/italianno/svg/U+0023.tsx +0 -24
  229. package/fonts/italianno/svg/U+0024.svg +0 -25
  230. package/fonts/italianno/svg/U+0024.tsx +0 -27
  231. package/fonts/italianno/svg/U+0025.svg +0 -22
  232. package/fonts/italianno/svg/U+0025.tsx +0 -24
  233. package/fonts/italianno/svg/U+0026.svg +0 -17
  234. package/fonts/italianno/svg/U+0026.tsx +0 -19
  235. package/fonts/italianno/svg/U+0027.svg +0 -7
  236. package/fonts/italianno/svg/U+0027.tsx +0 -9
  237. package/fonts/italianno/svg/U+0028.svg +0 -7
  238. package/fonts/italianno/svg/U+0028.tsx +0 -9
  239. package/fonts/italianno/svg/U+0029.svg +0 -7
  240. package/fonts/italianno/svg/U+0029.tsx +0 -9
  241. package/fonts/italianno/svg/U+002a.svg +0 -22
  242. package/fonts/italianno/svg/U+002a.tsx +0 -24
  243. package/fonts/italianno/svg/U+002b.svg +0 -12
  244. package/fonts/italianno/svg/U+002b.tsx +0 -14
  245. package/fonts/italianno/svg/U+002c.svg +0 -12
  246. package/fonts/italianno/svg/U+002c.tsx +0 -14
  247. package/fonts/italianno/svg/U+002d.svg +0 -7
  248. package/fonts/italianno/svg/U+002d.tsx +0 -9
  249. package/fonts/italianno/svg/U+002e.svg +0 -7
  250. package/fonts/italianno/svg/U+002e.tsx +0 -9
  251. package/fonts/italianno/svg/U+002f.svg +0 -7
  252. package/fonts/italianno/svg/U+002f.tsx +0 -9
  253. package/fonts/italianno/svg/U+003a.svg +0 -12
  254. package/fonts/italianno/svg/U+003a.tsx +0 -14
  255. package/fonts/italianno/svg/U+003b.svg +0 -12
  256. package/fonts/italianno/svg/U+003b.tsx +0 -14
  257. package/fonts/italianno/svg/U+003c.svg +0 -7
  258. package/fonts/italianno/svg/U+003c.tsx +0 -9
  259. package/fonts/italianno/svg/U+003d.svg +0 -12
  260. package/fonts/italianno/svg/U+003d.tsx +0 -14
  261. package/fonts/italianno/svg/U+003e.svg +0 -12
  262. package/fonts/italianno/svg/U+003e.tsx +0 -14
  263. package/fonts/italianno/svg/U+003f.svg +0 -12
  264. package/fonts/italianno/svg/U+003f.tsx +0 -14
  265. package/fonts/italianno/svg/U+0040.svg +0 -15
  266. package/fonts/italianno/svg/U+0040.tsx +0 -17
  267. package/fonts/italianno/svg/U+005c.svg +0 -7
  268. package/fonts/italianno/svg/U+005c.tsx +0 -9
  269. package/fonts/italianno/svg/U+005e.svg +0 -12
  270. package/fonts/italianno/svg/U+005e.tsx +0 -14
  271. package/fonts/italianno/svg/U+005f.svg +0 -3
  272. package/fonts/italianno/svg/U+005f.tsx +0 -5
  273. package/fonts/italianno/svg/U+0060.svg +0 -10
  274. package/fonts/italianno/svg/U+0060.tsx +0 -12
  275. package/fonts/italianno/svg/U+007c.svg +0 -7
  276. package/fonts/italianno/svg/U+007c.tsx +0 -9
  277. package/fonts/italianno/svg/U+007e.svg +0 -7
  278. package/fonts/italianno/svg/U+007e.tsx +0 -9
  279. package/fonts/italianno/svg/a.svg +0 -12
  280. package/fonts/italianno/svg/a.tsx +0 -14
  281. package/fonts/italianno/svg/b.svg +0 -10
  282. package/fonts/italianno/svg/b.tsx +0 -12
  283. package/fonts/italianno/svg/c.svg +0 -10
  284. package/fonts/italianno/svg/c.tsx +0 -12
  285. package/fonts/italianno/svg/d.svg +0 -15
  286. package/fonts/italianno/svg/d.tsx +0 -17
  287. package/fonts/italianno/svg/e.svg +0 -12
  288. package/fonts/italianno/svg/e.tsx +0 -14
  289. package/fonts/italianno/svg/f.svg +0 -12
  290. package/fonts/italianno/svg/f.tsx +0 -14
  291. package/fonts/italianno/svg/g.svg +0 -12
  292. package/fonts/italianno/svg/g.tsx +0 -14
  293. package/fonts/italianno/svg/h.svg +0 -12
  294. package/fonts/italianno/svg/h.tsx +0 -14
  295. package/fonts/italianno/svg/i.svg +0 -17
  296. package/fonts/italianno/svg/i.tsx +0 -19
  297. package/fonts/italianno/svg/j.svg +0 -12
  298. package/fonts/italianno/svg/j.tsx +0 -14
  299. package/fonts/italianno/svg/k.svg +0 -17
  300. package/fonts/italianno/svg/k.tsx +0 -19
  301. package/fonts/italianno/svg/l.svg +0 -15
  302. package/fonts/italianno/svg/l.tsx +0 -17
  303. package/fonts/italianno/svg/m.svg +0 -27
  304. package/fonts/italianno/svg/m.tsx +0 -29
  305. package/fonts/italianno/svg/n.svg +0 -22
  306. package/fonts/italianno/svg/n.tsx +0 -24
  307. package/fonts/italianno/svg/o.svg +0 -20
  308. package/fonts/italianno/svg/o.tsx +0 -22
  309. package/fonts/italianno/svg/p.svg +0 -12
  310. package/fonts/italianno/svg/p.tsx +0 -14
  311. package/fonts/italianno/svg/q.svg +0 -17
  312. package/fonts/italianno/svg/q.tsx +0 -19
  313. package/fonts/italianno/svg/r.svg +0 -22
  314. package/fonts/italianno/svg/r.tsx +0 -24
  315. package/fonts/italianno/svg/s.svg +0 -15
  316. package/fonts/italianno/svg/s.tsx +0 -17
  317. package/fonts/italianno/svg/t.svg +0 -17
  318. package/fonts/italianno/svg/t.tsx +0 -19
  319. package/fonts/italianno/svg/u.svg +0 -12
  320. package/fonts/italianno/svg/u.tsx +0 -14
  321. package/fonts/italianno/svg/upper_A.svg +0 -17
  322. package/fonts/italianno/svg/upper_A.tsx +0 -19
  323. package/fonts/italianno/svg/upper_B.svg +0 -27
  324. package/fonts/italianno/svg/upper_B.tsx +0 -29
  325. package/fonts/italianno/svg/upper_C.svg +0 -7
  326. package/fonts/italianno/svg/upper_C.tsx +0 -9
  327. package/fonts/italianno/svg/upper_D.svg +0 -12
  328. package/fonts/italianno/svg/upper_D.tsx +0 -14
  329. package/fonts/italianno/svg/upper_E.svg +0 -17
  330. package/fonts/italianno/svg/upper_E.tsx +0 -19
  331. package/fonts/italianno/svg/upper_F.svg +0 -17
  332. package/fonts/italianno/svg/upper_F.tsx +0 -19
  333. package/fonts/italianno/svg/upper_G.svg +0 -20
  334. package/fonts/italianno/svg/upper_G.tsx +0 -22
  335. package/fonts/italianno/svg/upper_H.svg +0 -17
  336. package/fonts/italianno/svg/upper_H.tsx +0 -19
  337. package/fonts/italianno/svg/upper_I.svg +0 -12
  338. package/fonts/italianno/svg/upper_I.tsx +0 -14
  339. package/fonts/italianno/svg/upper_J.svg +0 -10
  340. package/fonts/italianno/svg/upper_J.tsx +0 -12
  341. package/fonts/italianno/svg/upper_K.svg +0 -20
  342. package/fonts/italianno/svg/upper_K.tsx +0 -22
  343. package/fonts/italianno/svg/upper_L.svg +0 -12
  344. package/fonts/italianno/svg/upper_L.tsx +0 -14
  345. package/fonts/italianno/svg/upper_M.svg +0 -17
  346. package/fonts/italianno/svg/upper_M.tsx +0 -19
  347. package/fonts/italianno/svg/upper_N.svg +0 -17
  348. package/fonts/italianno/svg/upper_N.tsx +0 -19
  349. package/fonts/italianno/svg/upper_O.svg +0 -17
  350. package/fonts/italianno/svg/upper_O.tsx +0 -19
  351. package/fonts/italianno/svg/upper_P.svg +0 -22
  352. package/fonts/italianno/svg/upper_P.tsx +0 -24
  353. package/fonts/italianno/svg/upper_Q.svg +0 -12
  354. package/fonts/italianno/svg/upper_Q.tsx +0 -14
  355. package/fonts/italianno/svg/upper_R.svg +0 -15
  356. package/fonts/italianno/svg/upper_R.tsx +0 -17
  357. package/fonts/italianno/svg/upper_S.svg +0 -12
  358. package/fonts/italianno/svg/upper_S.tsx +0 -14
  359. package/fonts/italianno/svg/upper_T.svg +0 -17
  360. package/fonts/italianno/svg/upper_T.tsx +0 -19
  361. package/fonts/italianno/svg/upper_U.svg +0 -17
  362. package/fonts/italianno/svg/upper_U.tsx +0 -19
  363. package/fonts/italianno/svg/upper_V.svg +0 -17
  364. package/fonts/italianno/svg/upper_V.tsx +0 -19
  365. package/fonts/italianno/svg/upper_W.svg +0 -17
  366. package/fonts/italianno/svg/upper_W.tsx +0 -19
  367. package/fonts/italianno/svg/upper_X.svg +0 -22
  368. package/fonts/italianno/svg/upper_X.tsx +0 -24
  369. package/fonts/italianno/svg/upper_Y.svg +0 -22
  370. package/fonts/italianno/svg/upper_Y.tsx +0 -24
  371. package/fonts/italianno/svg/upper_Z.svg +0 -12
  372. package/fonts/italianno/svg/upper_Z.tsx +0 -14
  373. package/fonts/italianno/svg/v.svg +0 -17
  374. package/fonts/italianno/svg/v.tsx +0 -19
  375. package/fonts/italianno/svg/w.svg +0 -17
  376. package/fonts/italianno/svg/w.tsx +0 -19
  377. package/fonts/italianno/svg/x.svg +0 -15
  378. package/fonts/italianno/svg/x.tsx +0 -17
  379. package/fonts/italianno/svg/y.svg +0 -12
  380. package/fonts/italianno/svg/y.tsx +0 -14
  381. package/fonts/italianno/svg/z.svg +0 -17
  382. package/fonts/italianno/svg/z.tsx +0 -19
  383. package/fonts/parisienne/font.json +0 -36222
  384. package/fonts/parisienne/svg/0.svg +0 -7
  385. package/fonts/parisienne/svg/0.tsx +0 -9
  386. package/fonts/parisienne/svg/1.svg +0 -12
  387. package/fonts/parisienne/svg/1.tsx +0 -14
  388. package/fonts/parisienne/svg/2.svg +0 -7
  389. package/fonts/parisienne/svg/2.tsx +0 -9
  390. package/fonts/parisienne/svg/3.svg +0 -7
  391. package/fonts/parisienne/svg/3.tsx +0 -9
  392. package/fonts/parisienne/svg/4.svg +0 -17
  393. package/fonts/parisienne/svg/4.tsx +0 -19
  394. package/fonts/parisienne/svg/5.svg +0 -10
  395. package/fonts/parisienne/svg/5.tsx +0 -12
  396. package/fonts/parisienne/svg/6.svg +0 -7
  397. package/fonts/parisienne/svg/6.tsx +0 -9
  398. package/fonts/parisienne/svg/7.svg +0 -12
  399. package/fonts/parisienne/svg/7.tsx +0 -14
  400. package/fonts/parisienne/svg/8.svg +0 -7
  401. package/fonts/parisienne/svg/8.tsx +0 -9
  402. package/fonts/parisienne/svg/9.svg +0 -7
  403. package/fonts/parisienne/svg/9.tsx +0 -9
  404. package/fonts/parisienne/svg/U+0021.svg +0 -10
  405. package/fonts/parisienne/svg/U+0021.tsx +0 -12
  406. package/fonts/parisienne/svg/U+0022.svg +0 -12
  407. package/fonts/parisienne/svg/U+0022.tsx +0 -14
  408. package/fonts/parisienne/svg/U+0023.svg +0 -22
  409. package/fonts/parisienne/svg/U+0023.tsx +0 -24
  410. package/fonts/parisienne/svg/U+0024.svg +0 -15
  411. package/fonts/parisienne/svg/U+0024.tsx +0 -17
  412. package/fonts/parisienne/svg/U+0025.svg +0 -22
  413. package/fonts/parisienne/svg/U+0025.tsx +0 -24
  414. package/fonts/parisienne/svg/U+0026.svg +0 -17
  415. package/fonts/parisienne/svg/U+0026.tsx +0 -19
  416. package/fonts/parisienne/svg/U+0027.svg +0 -7
  417. package/fonts/parisienne/svg/U+0027.tsx +0 -9
  418. package/fonts/parisienne/svg/U+0028.svg +0 -7
  419. package/fonts/parisienne/svg/U+0028.tsx +0 -9
  420. package/fonts/parisienne/svg/U+0029.svg +0 -7
  421. package/fonts/parisienne/svg/U+0029.tsx +0 -9
  422. package/fonts/parisienne/svg/U+002a.svg +0 -22
  423. package/fonts/parisienne/svg/U+002a.tsx +0 -24
  424. package/fonts/parisienne/svg/U+002b.svg +0 -12
  425. package/fonts/parisienne/svg/U+002b.tsx +0 -14
  426. package/fonts/parisienne/svg/U+002c.svg +0 -7
  427. package/fonts/parisienne/svg/U+002c.tsx +0 -9
  428. package/fonts/parisienne/svg/U+002d.svg +0 -7
  429. package/fonts/parisienne/svg/U+002d.tsx +0 -9
  430. package/fonts/parisienne/svg/U+002e.svg +0 -7
  431. package/fonts/parisienne/svg/U+002e.tsx +0 -9
  432. package/fonts/parisienne/svg/U+002f.svg +0 -7
  433. package/fonts/parisienne/svg/U+002f.tsx +0 -9
  434. package/fonts/parisienne/svg/U+003a.svg +0 -8
  435. package/fonts/parisienne/svg/U+003a.tsx +0 -10
  436. package/fonts/parisienne/svg/U+003b.svg +0 -10
  437. package/fonts/parisienne/svg/U+003b.tsx +0 -12
  438. package/fonts/parisienne/svg/U+003c.svg +0 -7
  439. package/fonts/parisienne/svg/U+003c.tsx +0 -9
  440. package/fonts/parisienne/svg/U+003d.svg +0 -12
  441. package/fonts/parisienne/svg/U+003d.tsx +0 -14
  442. package/fonts/parisienne/svg/U+003e.svg +0 -7
  443. package/fonts/parisienne/svg/U+003e.tsx +0 -9
  444. package/fonts/parisienne/svg/U+003f.svg +0 -10
  445. package/fonts/parisienne/svg/U+003f.tsx +0 -12
  446. package/fonts/parisienne/svg/U+0040.svg +0 -15
  447. package/fonts/parisienne/svg/U+0040.tsx +0 -17
  448. package/fonts/parisienne/svg/U+005c.svg +0 -7
  449. package/fonts/parisienne/svg/U+005c.tsx +0 -9
  450. package/fonts/parisienne/svg/U+005e.svg +0 -7
  451. package/fonts/parisienne/svg/U+005e.tsx +0 -9
  452. package/fonts/parisienne/svg/U+005f.svg +0 -7
  453. package/fonts/parisienne/svg/U+005f.tsx +0 -9
  454. package/fonts/parisienne/svg/U+0060.svg +0 -10
  455. package/fonts/parisienne/svg/U+0060.tsx +0 -12
  456. package/fonts/parisienne/svg/U+007c.svg +0 -7
  457. package/fonts/parisienne/svg/U+007c.tsx +0 -9
  458. package/fonts/parisienne/svg/U+007e.svg +0 -7
  459. package/fonts/parisienne/svg/U+007e.tsx +0 -9
  460. package/fonts/parisienne/svg/a.svg +0 -15
  461. package/fonts/parisienne/svg/a.tsx +0 -17
  462. package/fonts/parisienne/svg/b.svg +0 -7
  463. package/fonts/parisienne/svg/b.tsx +0 -9
  464. package/fonts/parisienne/svg/c.svg +0 -12
  465. package/fonts/parisienne/svg/c.tsx +0 -14
  466. package/fonts/parisienne/svg/d.svg +0 -12
  467. package/fonts/parisienne/svg/d.tsx +0 -14
  468. package/fonts/parisienne/svg/e.svg +0 -17
  469. package/fonts/parisienne/svg/e.tsx +0 -19
  470. package/fonts/parisienne/svg/f.svg +0 -12
  471. package/fonts/parisienne/svg/f.tsx +0 -14
  472. package/fonts/parisienne/svg/g.svg +0 -10
  473. package/fonts/parisienne/svg/g.tsx +0 -12
  474. package/fonts/parisienne/svg/h.svg +0 -12
  475. package/fonts/parisienne/svg/h.tsx +0 -14
  476. package/fonts/parisienne/svg/i.svg +0 -12
  477. package/fonts/parisienne/svg/i.tsx +0 -14
  478. package/fonts/parisienne/svg/j.svg +0 -17
  479. package/fonts/parisienne/svg/j.tsx +0 -19
  480. package/fonts/parisienne/svg/k.svg +0 -17
  481. package/fonts/parisienne/svg/k.tsx +0 -19
  482. package/fonts/parisienne/svg/l.svg +0 -7
  483. package/fonts/parisienne/svg/l.tsx +0 -9
  484. package/fonts/parisienne/svg/m.svg +0 -17
  485. package/fonts/parisienne/svg/m.tsx +0 -19
  486. package/fonts/parisienne/svg/n.svg +0 -12
  487. package/fonts/parisienne/svg/n.tsx +0 -14
  488. package/fonts/parisienne/svg/o.svg +0 -15
  489. package/fonts/parisienne/svg/o.tsx +0 -17
  490. package/fonts/parisienne/svg/p.svg +0 -12
  491. package/fonts/parisienne/svg/p.tsx +0 -14
  492. package/fonts/parisienne/svg/q.svg +0 -12
  493. package/fonts/parisienne/svg/q.tsx +0 -14
  494. package/fonts/parisienne/svg/r.svg +0 -7
  495. package/fonts/parisienne/svg/r.tsx +0 -9
  496. package/fonts/parisienne/svg/s.svg +0 -17
  497. package/fonts/parisienne/svg/s.tsx +0 -19
  498. package/fonts/parisienne/svg/t.svg +0 -20
  499. package/fonts/parisienne/svg/t.tsx +0 -22
  500. package/fonts/parisienne/svg/u.svg +0 -12
  501. package/fonts/parisienne/svg/u.tsx +0 -14
  502. package/fonts/parisienne/svg/upper_A.svg +0 -10
  503. package/fonts/parisienne/svg/upper_A.tsx +0 -12
  504. package/fonts/parisienne/svg/upper_B.svg +0 -12
  505. package/fonts/parisienne/svg/upper_B.tsx +0 -14
  506. package/fonts/parisienne/svg/upper_C.svg +0 -7
  507. package/fonts/parisienne/svg/upper_C.tsx +0 -9
  508. package/fonts/parisienne/svg/upper_D.svg +0 -7
  509. package/fonts/parisienne/svg/upper_D.tsx +0 -9
  510. package/fonts/parisienne/svg/upper_E.svg +0 -10
  511. package/fonts/parisienne/svg/upper_E.tsx +0 -12
  512. package/fonts/parisienne/svg/upper_F.svg +0 -22
  513. package/fonts/parisienne/svg/upper_F.tsx +0 -24
  514. package/fonts/parisienne/svg/upper_G.svg +0 -15
  515. package/fonts/parisienne/svg/upper_G.tsx +0 -17
  516. package/fonts/parisienne/svg/upper_H.svg +0 -15
  517. package/fonts/parisienne/svg/upper_H.tsx +0 -17
  518. package/fonts/parisienne/svg/upper_I.svg +0 -15
  519. package/fonts/parisienne/svg/upper_I.tsx +0 -17
  520. package/fonts/parisienne/svg/upper_J.svg +0 -15
  521. package/fonts/parisienne/svg/upper_J.tsx +0 -17
  522. package/fonts/parisienne/svg/upper_K.svg +0 -12
  523. package/fonts/parisienne/svg/upper_K.tsx +0 -14
  524. package/fonts/parisienne/svg/upper_L.svg +0 -7
  525. package/fonts/parisienne/svg/upper_L.tsx +0 -9
  526. package/fonts/parisienne/svg/upper_M.svg +0 -15
  527. package/fonts/parisienne/svg/upper_M.tsx +0 -17
  528. package/fonts/parisienne/svg/upper_N.svg +0 -12
  529. package/fonts/parisienne/svg/upper_N.tsx +0 -14
  530. package/fonts/parisienne/svg/upper_O.svg +0 -7
  531. package/fonts/parisienne/svg/upper_O.tsx +0 -9
  532. package/fonts/parisienne/svg/upper_P.svg +0 -12
  533. package/fonts/parisienne/svg/upper_P.tsx +0 -14
  534. package/fonts/parisienne/svg/upper_Q.svg +0 -15
  535. package/fonts/parisienne/svg/upper_Q.tsx +0 -17
  536. package/fonts/parisienne/svg/upper_R.svg +0 -12
  537. package/fonts/parisienne/svg/upper_R.tsx +0 -14
  538. package/fonts/parisienne/svg/upper_S.svg +0 -7
  539. package/fonts/parisienne/svg/upper_S.tsx +0 -9
  540. package/fonts/parisienne/svg/upper_T.svg +0 -12
  541. package/fonts/parisienne/svg/upper_T.tsx +0 -14
  542. package/fonts/parisienne/svg/upper_U.svg +0 -17
  543. package/fonts/parisienne/svg/upper_U.tsx +0 -19
  544. package/fonts/parisienne/svg/upper_V.svg +0 -7
  545. package/fonts/parisienne/svg/upper_V.tsx +0 -9
  546. package/fonts/parisienne/svg/upper_W.svg +0 -12
  547. package/fonts/parisienne/svg/upper_W.tsx +0 -14
  548. package/fonts/parisienne/svg/upper_X.svg +0 -27
  549. package/fonts/parisienne/svg/upper_X.tsx +0 -29
  550. package/fonts/parisienne/svg/upper_Y.svg +0 -15
  551. package/fonts/parisienne/svg/upper_Y.tsx +0 -17
  552. package/fonts/parisienne/svg/upper_Z.svg +0 -12
  553. package/fonts/parisienne/svg/upper_Z.tsx +0 -14
  554. package/fonts/parisienne/svg/v.svg +0 -7
  555. package/fonts/parisienne/svg/v.tsx +0 -9
  556. package/fonts/parisienne/svg/w.svg +0 -17
  557. package/fonts/parisienne/svg/w.tsx +0 -19
  558. package/fonts/parisienne/svg/x.svg +0 -17
  559. package/fonts/parisienne/svg/x.tsx +0 -19
  560. package/fonts/parisienne/svg/y.svg +0 -17
  561. package/fonts/parisienne/svg/y.tsx +0 -19
  562. package/fonts/parisienne/svg/z.svg +0 -12
  563. package/fonts/parisienne/svg/z.tsx +0 -14
  564. package/fonts/tangerine/font.json +0 -31512
  565. package/fonts/tangerine/svg/0.svg +0 -7
  566. package/fonts/tangerine/svg/0.tsx +0 -9
  567. package/fonts/tangerine/svg/1.svg +0 -12
  568. package/fonts/tangerine/svg/1.tsx +0 -14
  569. package/fonts/tangerine/svg/2.svg +0 -12
  570. package/fonts/tangerine/svg/2.tsx +0 -14
  571. package/fonts/tangerine/svg/3.svg +0 -12
  572. package/fonts/tangerine/svg/3.tsx +0 -14
  573. package/fonts/tangerine/svg/4.svg +0 -12
  574. package/fonts/tangerine/svg/4.tsx +0 -14
  575. package/fonts/tangerine/svg/5.svg +0 -7
  576. package/fonts/tangerine/svg/5.tsx +0 -9
  577. package/fonts/tangerine/svg/6.svg +0 -7
  578. package/fonts/tangerine/svg/6.tsx +0 -9
  579. package/fonts/tangerine/svg/7.svg +0 -12
  580. package/fonts/tangerine/svg/7.tsx +0 -14
  581. package/fonts/tangerine/svg/8.svg +0 -7
  582. package/fonts/tangerine/svg/8.tsx +0 -9
  583. package/fonts/tangerine/svg/9.svg +0 -7
  584. package/fonts/tangerine/svg/9.tsx +0 -9
  585. package/fonts/tangerine/svg/U+0021.svg +0 -12
  586. package/fonts/tangerine/svg/U+0021.tsx +0 -14
  587. package/fonts/tangerine/svg/U+0022.svg +0 -12
  588. package/fonts/tangerine/svg/U+0022.tsx +0 -14
  589. package/fonts/tangerine/svg/U+0023.svg +0 -22
  590. package/fonts/tangerine/svg/U+0023.tsx +0 -24
  591. package/fonts/tangerine/svg/U+0024.svg +0 -12
  592. package/fonts/tangerine/svg/U+0024.tsx +0 -14
  593. package/fonts/tangerine/svg/U+0025.svg +0 -17
  594. package/fonts/tangerine/svg/U+0025.tsx +0 -19
  595. package/fonts/tangerine/svg/U+0026.svg +0 -7
  596. package/fonts/tangerine/svg/U+0026.tsx +0 -9
  597. package/fonts/tangerine/svg/U+0027.svg +0 -7
  598. package/fonts/tangerine/svg/U+0027.tsx +0 -9
  599. package/fonts/tangerine/svg/U+0028.svg +0 -7
  600. package/fonts/tangerine/svg/U+0028.tsx +0 -9
  601. package/fonts/tangerine/svg/U+0029.svg +0 -7
  602. package/fonts/tangerine/svg/U+0029.tsx +0 -9
  603. package/fonts/tangerine/svg/U+002a.svg +0 -17
  604. package/fonts/tangerine/svg/U+002a.tsx +0 -19
  605. package/fonts/tangerine/svg/U+002b.svg +0 -12
  606. package/fonts/tangerine/svg/U+002b.tsx +0 -14
  607. package/fonts/tangerine/svg/U+002c.svg +0 -10
  608. package/fonts/tangerine/svg/U+002c.tsx +0 -12
  609. package/fonts/tangerine/svg/U+002d.svg +0 -7
  610. package/fonts/tangerine/svg/U+002d.tsx +0 -9
  611. package/fonts/tangerine/svg/U+002e.svg +0 -10
  612. package/fonts/tangerine/svg/U+002e.tsx +0 -12
  613. package/fonts/tangerine/svg/U+002f.svg +0 -7
  614. package/fonts/tangerine/svg/U+002f.tsx +0 -9
  615. package/fonts/tangerine/svg/U+003a.svg +0 -12
  616. package/fonts/tangerine/svg/U+003a.tsx +0 -14
  617. package/fonts/tangerine/svg/U+003b.svg +0 -12
  618. package/fonts/tangerine/svg/U+003b.tsx +0 -14
  619. package/fonts/tangerine/svg/U+003c.svg +0 -12
  620. package/fonts/tangerine/svg/U+003c.tsx +0 -14
  621. package/fonts/tangerine/svg/U+003d.svg +0 -12
  622. package/fonts/tangerine/svg/U+003d.tsx +0 -14
  623. package/fonts/tangerine/svg/U+003e.svg +0 -12
  624. package/fonts/tangerine/svg/U+003e.tsx +0 -14
  625. package/fonts/tangerine/svg/U+003f.svg +0 -12
  626. package/fonts/tangerine/svg/U+003f.tsx +0 -14
  627. package/fonts/tangerine/svg/U+0040.svg +0 -15
  628. package/fonts/tangerine/svg/U+0040.tsx +0 -17
  629. package/fonts/tangerine/svg/U+005c.svg +0 -7
  630. package/fonts/tangerine/svg/U+005c.tsx +0 -9
  631. package/fonts/tangerine/svg/U+005e.svg +0 -12
  632. package/fonts/tangerine/svg/U+005e.tsx +0 -14
  633. package/fonts/tangerine/svg/U+005f.svg +0 -7
  634. package/fonts/tangerine/svg/U+005f.tsx +0 -9
  635. package/fonts/tangerine/svg/U+0060.svg +0 -7
  636. package/fonts/tangerine/svg/U+0060.tsx +0 -9
  637. package/fonts/tangerine/svg/U+007c.svg +0 -7
  638. package/fonts/tangerine/svg/U+007c.tsx +0 -9
  639. package/fonts/tangerine/svg/U+007e.svg +0 -7
  640. package/fonts/tangerine/svg/U+007e.tsx +0 -9
  641. package/fonts/tangerine/svg/a.svg +0 -12
  642. package/fonts/tangerine/svg/a.tsx +0 -14
  643. package/fonts/tangerine/svg/b.svg +0 -7
  644. package/fonts/tangerine/svg/b.tsx +0 -9
  645. package/fonts/tangerine/svg/c.svg +0 -7
  646. package/fonts/tangerine/svg/c.tsx +0 -9
  647. package/fonts/tangerine/svg/d.svg +0 -12
  648. package/fonts/tangerine/svg/d.tsx +0 -14
  649. package/fonts/tangerine/svg/e.svg +0 -15
  650. package/fonts/tangerine/svg/e.tsx +0 -17
  651. package/fonts/tangerine/svg/f.svg +0 -15
  652. package/fonts/tangerine/svg/f.tsx +0 -17
  653. package/fonts/tangerine/svg/g.svg +0 -12
  654. package/fonts/tangerine/svg/g.tsx +0 -14
  655. package/fonts/tangerine/svg/h.svg +0 -12
  656. package/fonts/tangerine/svg/h.tsx +0 -14
  657. package/fonts/tangerine/svg/i.svg +0 -15
  658. package/fonts/tangerine/svg/i.tsx +0 -17
  659. package/fonts/tangerine/svg/j.svg +0 -12
  660. package/fonts/tangerine/svg/j.tsx +0 -14
  661. package/fonts/tangerine/svg/k.svg +0 -12
  662. package/fonts/tangerine/svg/k.tsx +0 -14
  663. package/fonts/tangerine/svg/l.svg +0 -7
  664. package/fonts/tangerine/svg/l.tsx +0 -9
  665. package/fonts/tangerine/svg/m.svg +0 -17
  666. package/fonts/tangerine/svg/m.tsx +0 -19
  667. package/fonts/tangerine/svg/n.svg +0 -12
  668. package/fonts/tangerine/svg/n.tsx +0 -14
  669. package/fonts/tangerine/svg/o.svg +0 -12
  670. package/fonts/tangerine/svg/o.tsx +0 -14
  671. package/fonts/tangerine/svg/p.svg +0 -17
  672. package/fonts/tangerine/svg/p.tsx +0 -19
  673. package/fonts/tangerine/svg/q.svg +0 -15
  674. package/fonts/tangerine/svg/q.tsx +0 -17
  675. package/fonts/tangerine/svg/r.svg +0 -17
  676. package/fonts/tangerine/svg/r.tsx +0 -19
  677. package/fonts/tangerine/svg/s.svg +0 -10
  678. package/fonts/tangerine/svg/s.tsx +0 -12
  679. package/fonts/tangerine/svg/t.svg +0 -17
  680. package/fonts/tangerine/svg/t.tsx +0 -19
  681. package/fonts/tangerine/svg/u.svg +0 -17
  682. package/fonts/tangerine/svg/u.tsx +0 -19
  683. package/fonts/tangerine/svg/upper_A.svg +0 -20
  684. package/fonts/tangerine/svg/upper_A.tsx +0 -22
  685. package/fonts/tangerine/svg/upper_B.svg +0 -17
  686. package/fonts/tangerine/svg/upper_B.tsx +0 -19
  687. package/fonts/tangerine/svg/upper_C.svg +0 -7
  688. package/fonts/tangerine/svg/upper_C.tsx +0 -9
  689. package/fonts/tangerine/svg/upper_D.svg +0 -12
  690. package/fonts/tangerine/svg/upper_D.tsx +0 -14
  691. package/fonts/tangerine/svg/upper_E.svg +0 -7
  692. package/fonts/tangerine/svg/upper_E.tsx +0 -9
  693. package/fonts/tangerine/svg/upper_F.svg +0 -17
  694. package/fonts/tangerine/svg/upper_F.tsx +0 -19
  695. package/fonts/tangerine/svg/upper_G.svg +0 -12
  696. package/fonts/tangerine/svg/upper_G.tsx +0 -14
  697. package/fonts/tangerine/svg/upper_H.svg +0 -12
  698. package/fonts/tangerine/svg/upper_H.tsx +0 -14
  699. package/fonts/tangerine/svg/upper_I.svg +0 -7
  700. package/fonts/tangerine/svg/upper_I.tsx +0 -9
  701. package/fonts/tangerine/svg/upper_J.svg +0 -7
  702. package/fonts/tangerine/svg/upper_J.tsx +0 -9
  703. package/fonts/tangerine/svg/upper_K.svg +0 -17
  704. package/fonts/tangerine/svg/upper_K.tsx +0 -19
  705. package/fonts/tangerine/svg/upper_L.svg +0 -7
  706. package/fonts/tangerine/svg/upper_L.tsx +0 -9
  707. package/fonts/tangerine/svg/upper_M.svg +0 -12
  708. package/fonts/tangerine/svg/upper_M.tsx +0 -14
  709. package/fonts/tangerine/svg/upper_N.svg +0 -15
  710. package/fonts/tangerine/svg/upper_N.tsx +0 -17
  711. package/fonts/tangerine/svg/upper_O.svg +0 -7
  712. package/fonts/tangerine/svg/upper_O.tsx +0 -9
  713. package/fonts/tangerine/svg/upper_P.svg +0 -12
  714. package/fonts/tangerine/svg/upper_P.tsx +0 -14
  715. package/fonts/tangerine/svg/upper_Q.svg +0 -12
  716. package/fonts/tangerine/svg/upper_Q.tsx +0 -14
  717. package/fonts/tangerine/svg/upper_R.svg +0 -12
  718. package/fonts/tangerine/svg/upper_R.tsx +0 -14
  719. package/fonts/tangerine/svg/upper_S.svg +0 -7
  720. package/fonts/tangerine/svg/upper_S.tsx +0 -9
  721. package/fonts/tangerine/svg/upper_T.svg +0 -7
  722. package/fonts/tangerine/svg/upper_T.tsx +0 -9
  723. package/fonts/tangerine/svg/upper_U.svg +0 -12
  724. package/fonts/tangerine/svg/upper_U.tsx +0 -14
  725. package/fonts/tangerine/svg/upper_V.svg +0 -12
  726. package/fonts/tangerine/svg/upper_V.tsx +0 -14
  727. package/fonts/tangerine/svg/upper_W.svg +0 -17
  728. package/fonts/tangerine/svg/upper_W.tsx +0 -19
  729. package/fonts/tangerine/svg/upper_X.svg +0 -12
  730. package/fonts/tangerine/svg/upper_X.tsx +0 -14
  731. package/fonts/tangerine/svg/upper_Y.svg +0 -12
  732. package/fonts/tangerine/svg/upper_Y.tsx +0 -14
  733. package/fonts/tangerine/svg/upper_Z.svg +0 -17
  734. package/fonts/tangerine/svg/upper_Z.tsx +0 -19
  735. package/fonts/tangerine/svg/v.svg +0 -12
  736. package/fonts/tangerine/svg/v.tsx +0 -14
  737. package/fonts/tangerine/svg/w.svg +0 -25
  738. package/fonts/tangerine/svg/w.tsx +0 -27
  739. package/fonts/tangerine/svg/x.svg +0 -17
  740. package/fonts/tangerine/svg/x.tsx +0 -19
  741. package/fonts/tangerine/svg/y.svg +0 -12
  742. package/fonts/tangerine/svg/y.tsx +0 -14
  743. package/fonts/tangerine/svg/z.svg +0 -20
  744. 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.2.3",
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 --chars '0' --output ../renderer/fonts/caveat && bun --filter tegaki-generator start generate Italianno --chars '0' --output ../renderer/fonts/italianno && bun --filter tegaki-generator start generate Tangerine --chars '0' --output ../renderer/fonts/tangerine && bun --filter tegaki-generator start generate Parisienne --chars '0' --output ../renderer/fonts/parisienne"
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
@@ -2,9 +2,3 @@ declare module '*.ttf' {
2
2
  const src: string;
3
3
  export default src;
4
4
  }
5
-
6
- declare module '*.svg' {
7
- import type { FC, SVGProps } from 'react';
8
- const ReactComponent: FC<SVGProps<SVGSVGElement>>;
9
- export default ReactComponent;
10
- }
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export { drawGlyph } from './lib/drawGlyph.ts';
2
2
  export {
3
3
  TegakiRenderer,
4
+ type TegakiRendererHandle,
4
5
  type TegakiRendererProps,
5
6
  type TimeControlMode,
6
7
  type TimeControlProp,
@@ -1,4 +1,4 @@
1
- import { type ComponentProps, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
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
- export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string, never>> extends Omit<ComponentProps<'div'>, 'children'> {
72
+ /** Imperative handle exposed via the `ref` prop. */
73
+ export interface TegakiRendererHandle {
74
+ /** The root DOM element. */
75
+ getElement(): HTMLDivElement | null;
76
+ /** Current animation time in seconds. */
77
+ getCurrentTime(): number;
78
+ /** Total timeline duration in seconds. */
79
+ getDuration(): number;
80
+ /** Whether the animation is currently playing (uncontrolled mode only). */
81
+ getIsPlaying(): boolean;
82
+ /** Whether the animation has reached the end. */
83
+ getIsComplete(): boolean;
84
+ /** Resume playback (uncontrolled mode only). No-op in controlled/css mode. */
85
+ play(): void;
86
+ /** Pause playback (uncontrolled mode only). No-op in controlled/css mode. */
87
+ pause(): void;
88
+ /** Jump to a specific time in seconds (uncontrolled mode only). No-op in controlled/css mode. */
89
+ seek(time: number): void;
90
+ /** Seek to 0 and play (uncontrolled mode only). No-op in controlled/css mode. */
91
+ restart(): void;
92
+ }
93
+
94
+ export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string, never>>
95
+ extends Omit<ComponentProps<'div'>, 'children' | 'ref'> {
96
+ /** Imperative handle ref for playback controls and DOM access. */
97
+ ref?: Ref<TegakiRendererHandle>;
98
+
73
99
  /** TegakiBundle with font data and animated glyph SVGs. */
74
100
  font?: TegakiBundle;
75
101
 
@@ -89,10 +115,6 @@ export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string,
89
115
  /** Called once when the animation reaches the end of the timeline. */
90
116
  onComplete?: () => void;
91
117
 
92
- /** Rendering mode. `'canvas'` draws strokes on a `<canvas>` (requires
93
- * `font.glyphData`), `'svg'` uses animated SVG elements. Default: `'canvas'` */
94
- mode?: 'canvas' | 'svg';
95
-
96
118
  /** Visual effects applied during canvas rendering. */
97
119
  effects?: E;
98
120
 
@@ -110,12 +132,12 @@ export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string,
110
132
  // --- Component ---
111
133
 
112
134
  export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string, never>>({
135
+ ref,
113
136
  font,
114
137
  text,
115
138
  children,
116
139
  time: timeProp,
117
140
  onComplete,
118
- mode = 'canvas',
119
141
  effects,
120
142
  segmentSize,
121
143
  timing,
@@ -143,18 +165,35 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
143
165
  const controlledTime = timeControl.mode === 'controlled' ? timeControl.value : undefined;
144
166
  const defaultTime = timeControl.mode === 'uncontrolled' ? (timeControl.initialTime ?? 0) : 0;
145
167
  const speed = timeControl.mode === 'uncontrolled' ? (timeControl.speed ?? 1) : 1;
146
- const playing = timeControl.mode === 'uncontrolled' ? (timeControl.playing ?? true) : false;
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 callback refs to avoid restarting the rAF loop
190
+ // Stable refs so the imperative handle and rAF loop always see latest values
191
+ const currentTimeRef = useRef(currentTime);
192
+ currentTimeRef.current = currentTime;
193
+ const playingRef = useRef(playing);
194
+ playingRef.current = playing;
195
+ const isControlledRef = useRef(isControlled);
196
+ isControlledRef.current = isControlled;
158
197
  const onTimeChangeRef = useRef(onTimeChange);
159
198
  onTimeChangeRef.current = onTimeChange;
160
199
  const onCompleteRef = useRef(onComplete);
@@ -186,13 +225,13 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
186
225
  // --- Font-derived constants ---
187
226
  const fontFamily = font?.family;
188
227
  const emHeight = font ? (font.ascender - font.descender) / font.unitsPerEm : 0;
189
- const baselineOffset = font ? font.descender / font.unitsPerEm : 0;
190
228
 
191
229
  // --- Container measurement ---
192
230
  const rootRef = useRef<HTMLDivElement>(null);
193
231
  const [containerWidth, setContainerWidth] = useState(0);
194
232
  const [fontSize, setFontSize] = useState(0);
195
233
  const [lineHeight, setLineHeight] = useState(0);
234
+ const [currentColor, setCurrentColor] = useState('');
196
235
 
197
236
  // --- Timeline ---
198
237
  const timeline = useMemo(
@@ -220,6 +259,34 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
220
259
  }
221
260
  });
222
261
 
262
+ // --- Imperative handle (stable — reads from refs) ---
263
+ useImperativeHandle(
264
+ ref,
265
+ () => ({
266
+ getElement: () => rootRef.current,
267
+ getCurrentTime: () => currentTimeRef.current,
268
+ getDuration: () => totalDurationRef.current,
269
+ getIsPlaying: () => playingRef.current,
270
+ getIsComplete: () => totalDurationRef.current > 0 && currentTimeRef.current >= totalDurationRef.current,
271
+ play: () => {
272
+ if (!isControlledRef.current) setPlayingOverride(true);
273
+ },
274
+ pause: () => {
275
+ if (!isControlledRef.current) setPlayingOverride(false);
276
+ },
277
+ seek: (time: number) => {
278
+ if (!isControlledRef.current) setInternalTime(Math.max(0, Math.min(time, totalDurationRef.current)));
279
+ },
280
+ restart: () => {
281
+ if (!isControlledRef.current) {
282
+ setInternalTime(0);
283
+ setPlayingOverride(true);
284
+ }
285
+ },
286
+ }),
287
+ [],
288
+ );
289
+
223
290
  // --- Uncontrolled: time change notification ---
224
291
  useEffect(() => {
225
292
  if (!isControlled) {
@@ -276,44 +343,6 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
276
343
  return () => cancelAnimationFrame(raf);
277
344
  }, [isControlled, playing, speed, loop, catchUp, font, fontReady]);
278
345
 
279
- // --- SVG refs (only needed in SVG mode) ---
280
- const svgRefs = useRef(new Map<number, SVGSVGElement>());
281
- const svgRefCallbacks = useRef(new Map<number, (node: SVGSVGElement | null) => void>());
282
-
283
- const makeSvgRef = useCallback(
284
- (charIdx: number) => (node: SVGSVGElement | null) => {
285
- if (node) {
286
- node.pauseAnimations();
287
- svgRefs.current.set(charIdx, node);
288
- } else {
289
- svgRefs.current.delete(charIdx);
290
- }
291
- },
292
- [],
293
- );
294
-
295
- const getSvgRef = useCallback(
296
- (charIdx: number) => {
297
- let cb = svgRefCallbacks.current.get(charIdx);
298
- if (!cb) {
299
- cb = makeSvgRef(charIdx);
300
- svgRefCallbacks.current.set(charIdx, cb);
301
- }
302
- return cb;
303
- },
304
- [makeSvgRef],
305
- );
306
-
307
- // Clear stale SVG refs when font or mode changes
308
- const prevFontRef = useRef(font);
309
- const prevModeRef = useRef(mode);
310
- if (prevFontRef.current !== font || prevModeRef.current !== mode) {
311
- prevFontRef.current = font;
312
- prevModeRef.current = mode;
313
- svgRefs.current.clear();
314
- svgRefCallbacks.current.clear();
315
- }
316
-
317
346
  // --- Container size observation ---
318
347
  useEffect(() => {
319
348
  const el = rootRef.current;
@@ -324,6 +353,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
324
353
  const styles = getComputedStyle(el);
325
354
  setFontSize(Number.parseFloat(styles.fontSize));
326
355
  setLineHeight(Number.parseFloat(styles.lineHeight));
356
+ setCurrentColor(styles.color);
327
357
  }
328
358
  });
329
359
  ro.observe(el);
@@ -343,6 +373,9 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
343
373
  setFontSize(Number.parseFloat(styles.fontSize));
344
374
  setLineHeight(Number.parseFloat(styles.lineHeight));
345
375
  }
376
+ if (e.propertyName === 'color') {
377
+ setCurrentColor(styles.color);
378
+ }
346
379
  if (e.propertyName === CSS_PROGRESS) {
347
380
  const rawProgress = Number(styles.getPropertyValue(CSS_PROGRESS));
348
381
  setCssTime(rawProgress * totalDurationRef.current);
@@ -362,27 +395,10 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
362
395
  const padH = PADDING_H_EM * fontSize;
363
396
  const padV = fontSize ? Math.max(MIN_PADDING_V_EM * fontSize, (MIN_LINE_HEIGHT_EM * fontSize - lineHeight) / 2) : 0;
364
397
 
365
- // --- Sync SVG glyph times before paint ---
366
- // Runs every render so SVGs stay correct even when currentTime hasn't changed
367
- // (e.g. after pausing, or when ref callbacks re-fire due to re-renders).
368
- useLayoutEffect(() => {
369
- if (mode !== 'svg') return;
370
- const entries = timeline.entries;
371
- for (let i = 0; i < entries.length; i++) {
372
- const entry = entries[i]!;
373
- if (!entry.hasSvg) continue;
374
- const svg = svgRefs.current.get(i);
375
- if (!svg) continue;
376
- const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
377
- svg.setCurrentTime(localTime);
378
- }
379
- });
380
-
381
398
  // --- Canvas rendering ---
382
399
  const canvasRef = useRef<HTMLCanvasElement>(null);
383
400
 
384
401
  useLayoutEffect(() => {
385
- if (mode !== 'canvas') return;
386
402
  const canvas = canvasRef.current;
387
403
  if (!canvas || !font?.glyphData || !layout || !fontSize) return;
388
404
 
@@ -407,8 +423,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
407
423
  ctx.clearRect(0, 0, w, h);
408
424
  ctx.translate(padH, padV);
409
425
 
410
- // Read currentColor from the container
411
- const color = getComputedStyle(el).color;
426
+ const color = currentColor || getComputedStyle(el).color;
412
427
 
413
428
  const emHeightPx = emHeight * fontSize;
414
429
  const halfLeading = (lineHeight - emHeightPx) / 2;
@@ -425,7 +440,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
425
440
  const kerning = layout.kernings[charIdx] ?? 0;
426
441
  const glyph = font.glyphData[char];
427
442
 
428
- if (glyph && entry.hasSvg) {
443
+ if (glyph && entry.hasGlyph) {
429
444
  const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
430
445
  const glyphY = y + halfLeading;
431
446
  drawGlyph(
@@ -446,7 +461,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
446
461
  seed + charIdx,
447
462
  segmentSize,
448
463
  );
449
- } else if (!entry.hasSvg && currentTime >= entry.offset + entry.duration) {
464
+ } else if (!entry.hasGlyph && currentTime >= entry.offset + entry.duration) {
450
465
  const baseline = y + halfLeading + (font.ascender / font.unitsPerEm) * fontSize;
451
466
  drawFallbackGlyph(ctx, char, x, baseline, fontSize, fontFamily!, color, resolvedEffects, seed + charIdx);
452
467
  }
@@ -456,7 +471,6 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
456
471
  y += lineHeight;
457
472
  }
458
473
  }, [
459
- mode,
460
474
  currentTime,
461
475
  timeline,
462
476
  layout,
@@ -468,66 +482,12 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
468
482
  emHeight,
469
483
  padH,
470
484
  padV,
485
+ currentColor,
471
486
  resolvedEffects,
472
487
  seed,
473
488
  segmentSize,
474
489
  ]);
475
490
 
476
- // --- SVG rendering (skipped entirely in canvas mode) ---
477
- const lineElements = useMemo(() => {
478
- if (mode !== 'svg' || !font || !resolvedText) return null;
479
-
480
- const characters = graphemes(resolvedText);
481
-
482
- const renderGlyph = (charIdx: number) => {
483
- const char = characters[charIdx]!;
484
- const entry = timeline.entries[charIdx]!;
485
- const GlyphSvg = font.glyphs[char] as any;
486
- const width = layout?.charWidths[charIdx] ?? 1;
487
- const kerning = layout?.kernings[charIdx];
488
-
489
- if (char === '\n') return null;
490
-
491
- if (GlyphSvg) {
492
- return (
493
- <GlyphSvg
494
- key={charIdx}
495
- ref={getSvgRef(charIdx)}
496
- style={{
497
- display: 'inline-block',
498
- verticalAlign: `${baselineOffset}em`,
499
- width: `${width}em`,
500
- marginRight: kerning ? `${kerning}em` : undefined,
501
- height: `${emHeight}em`,
502
- overflow: 'visible',
503
- }}
504
- />
505
- );
506
- }
507
-
508
- const isVisible = currentTime >= entry.offset + entry.duration;
509
- return (
510
- <span style={{ fontFamily, visibility: isVisible ? 'visible' : 'hidden' }} key={charIdx}>
511
- {char}
512
- </span>
513
- );
514
- };
515
-
516
- if (layout) {
517
- return layout.lines.map((lineIndices, lineIdx) => {
518
- const isEmpty = lineIndices.every((i) => characters[i] === '\n');
519
- return (
520
- <div style={{ whiteSpace: 'nowrap', height: isEmpty ? '1lh' : undefined, lineHeight: `${lineHeight}px` }} key={lineIdx}>
521
- {lineIndices.map(renderGlyph)}
522
- </div>
523
- );
524
- });
525
- }
526
-
527
- // Fallback before layout is ready: single line
528
- return characters.length > 0 ? <div style={{ whiteSpace: 'nowrap' }}>{characters.map((_, i) => renderGlyph(i))}</div> : null;
529
- }, [mode, resolvedText, timeline, font, layout, getSvgRef, baselineOffset, emHeight, currentTime, fontFamily, lineHeight]);
530
-
531
491
  // --- Rendering ---
532
492
 
533
493
  if (!font || !resolvedText || !fontReady) {
@@ -551,24 +511,26 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
551
511
  },
552
512
  }}
553
513
  >
554
- {/* Sentinel: inherits font-size & line-height; its height changes when either changes */}
555
- <span
556
- ref={sentinelRef}
557
- aria-hidden
558
- style={{
559
- position: 'absolute',
560
- width: 0,
561
- overflow: 'hidden',
562
- pointerEvents: 'none',
563
- fontSize: 'inherit',
564
- lineHeight: 'inherit',
565
- visibility: 'hidden',
566
- transition: isCss ? `font-size 0.001s, line-height 0.001s, ${CSS_PROGRESS} 0.001s` : 'font-size 0.001s, line-height 0.001s',
567
- }}
568
- >
569
- {'\u00A0'}
570
- </span>
571
- {mode === 'canvas' ? (
514
+ <div style={{ position: 'relative' }}>
515
+ {/* Sentinel: inherits font-size & line-height; its height changes when either changes */}
516
+ <span
517
+ ref={sentinelRef}
518
+ aria-hidden
519
+ style={{
520
+ position: 'absolute',
521
+ width: 0,
522
+ overflow: 'hidden',
523
+ pointerEvents: 'none',
524
+ fontSize: 'inherit',
525
+ lineHeight: 'inherit',
526
+ visibility: 'hidden',
527
+ transition: isCss
528
+ ? `font-size 0.001s, line-height 0.001s, color 0.001s, ${CSS_PROGRESS} 0.001s`
529
+ : 'font-size 0.001s, line-height 0.001s, color 0.001s',
530
+ }}
531
+ >
532
+ {'\u00A0'}
533
+ </span>
572
534
  <canvas
573
535
  ref={canvasRef}
574
536
  aria-hidden
@@ -580,31 +542,20 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
580
542
  pointerEvents: 'none',
581
543
  }}
582
544
  />
583
- ) : (
545
+
584
546
  <div
585
547
  style={{
586
- position: 'absolute',
587
- inset: 0,
588
- pointerEvents: 'none',
548
+ userSelect: 'auto',
549
+ whiteSpace: 'pre-wrap',
550
+ overflowWrap: 'break-word',
551
+ paddingRight: 1,
552
+ WebkitTextFillColor: showOverlay ? undefined : 'transparent',
589
553
  fontFamily,
554
+ color: showOverlay ? 'rgba(255, 0, 0, 0.4)' : undefined,
590
555
  }}
591
556
  >
592
- {lineElements}
557
+ {resolvedText}
593
558
  </div>
594
- )}
595
-
596
- <div
597
- style={{
598
- userSelect: 'auto',
599
- whiteSpace: 'pre-wrap',
600
- overflowWrap: 'break-word',
601
- paddingRight: 1,
602
- WebkitTextFillColor: showOverlay ? undefined : 'transparent',
603
- fontFamily,
604
- color: showOverlay ? 'rgba(255, 0, 0, 0.4)' : undefined,
605
- }}
606
- >
607
- {resolvedText}
608
559
  </div>
609
560
  </div>
610
561
  );
@@ -154,24 +154,24 @@ export function drawGlyph(
154
154
  return m;
155
155
  };
156
156
 
157
- for (const stroke of glyph.strokes) {
158
- if (localTime < stroke.delay) continue;
159
- const elapsed = localTime - stroke.delay;
160
- const progress = Math.min(elapsed / stroke.animationDuration, 1);
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.points;
162
+ const pts = stroke.p;
163
163
  if (pts.length === 0) continue;
164
164
 
165
- const avgWidth = pts.reduce((s, p) => s + p.width, 0) / pts.length;
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.x, p.y, 0));
173
- const dotY = py(wobbleY(p.x, p.y, 0));
174
- const perPointDot = Math.max(p.width, 0.5) * scale;
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]!.x - pts[j - 1]!.x;
212
- const dy = pts[j]!.y - pts[j - 1]!.y;
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.x - prev.x;
235
- const dy = cur.y - prev.y;
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.x, prev.y, j - 1)),
241
- y0: py(wobbleY(prev.x, prev.y, j - 1)),
242
- x1: px(wobbleX(cur.x, cur.y, j)),
243
- y1: py(wobbleY(cur.x, cur.y, j)),
244
- width0: prev.width,
245
- width1: cur.width,
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.x + dx * frac;
253
- const iy = prev.y + dy * frac;
254
- const iw = prev.width + (cur.width - prev.width) * frac;
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.x, prev.y, j - 1)),
257
- y0: py(wobbleY(prev.x, prev.y, j - 1)),
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.width,
260
+ width0: prev[2],
261
261
  width1: iw,
262
262
  segProgress: (accumulated + remaining / 2) / totalLen,
263
263
  });
@@ -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 SVGs (seconds). Default: `0.2` */
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
- hasSvg: boolean;
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 hasSvg = char in font.glyphs;
45
- const duration = hasSvg ? (font.glyphTimings[char] ?? 1) : unknownDuration;
46
- entries.push({ char, offset, duration, hasSvg });
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
- advanceWidth: number;
64
- strokes: {
65
- points: { x: number; y: number; t: number; width: number }[];
66
- delay: number;
67
- animationDuration: number;
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
- glyphs: Record<string, import('react').FC<import('react').SVGProps<SVGSVGElement>>>;
111
- glyphData?: Record<string, TegakiGlyphData>;
112
- glyphTimings: Record<string, number>;
117
+ glyphData: Record<string, TegakiGlyphData>;
113
118
  registerFontFace: () => Promise<void>;
114
119
  }