tegaki 0.2.2 → 0.3.0

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