tegaki 0.2.3 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +155 -197
  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 +154 -177
  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.1",
4
4
  "type": "module",
5
5
  "description": "React component for rendering animated handwriting from any font",
6
6
  "keywords": [
@@ -54,7 +54,7 @@
54
54
  "typecheck": "tsc --noEmit",
55
55
  "build": "tsdown src/index.ts --dts --sourcemap",
56
56
  "prepack": "bun run build && bun ../../scripts/prepareForRelease.ts",
57
- "generate-fonts": "bun --filter tegaki-generator start generate Caveat --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,6 @@
1
- import { type ComponentProps, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
1
+ 'use client';
2
+
3
+ import { type ComponentProps, type Ref, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from 'react';
2
4
  import type { TegakiBundle, TegakiEffects } from '../types.ts';
3
5
  import { drawFallbackGlyph } from './drawFallbackGlyph.ts';
4
6
  import { drawGlyph } from './drawGlyph.ts';
@@ -20,13 +22,18 @@ const CSS_PROGRESS = '--tegaki-progress';
20
22
  const CSS_DURATION = '--tegaki-duration';
21
23
 
22
24
  // Register custom properties so they are animatable (typed as <number>).
23
- // Calling registerProperty twice with the same name throws, so guard with try/catch.
24
- if (typeof CSS !== 'undefined' && 'registerProperty' in CSS) {
25
- for (const prop of [CSS_TIME, CSS_PROGRESS, CSS_DURATION]) {
26
- try {
27
- CSS.registerProperty({ name: prop, syntax: '<number>', inherits: true, initialValue: '0' });
28
- } catch {
29
- // Already registered ignore.
25
+ // Deferred to first mount to avoid running at import time during SSR.
26
+ let cssPropertiesRegistered = false;
27
+ function registerCssProperties() {
28
+ if (cssPropertiesRegistered) return;
29
+ cssPropertiesRegistered = true;
30
+ if (typeof CSS !== 'undefined' && 'registerProperty' in CSS) {
31
+ for (const prop of [CSS_TIME, CSS_PROGRESS, CSS_DURATION]) {
32
+ try {
33
+ CSS.registerProperty({ name: prop, syntax: '<number>', inherits: true, initialValue: '0' });
34
+ } catch {
35
+ // Already registered — ignore.
36
+ }
30
37
  }
31
38
  }
32
39
  }
@@ -69,7 +76,33 @@ export type TimeControlMode = {
69
76
  */
70
77
  export type TimeControlProp = null | undefined | number | 'css' | TimeControlMode[keyof TimeControlMode];
71
78
 
72
- export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string, never>> extends Omit<ComponentProps<'div'>, 'children'> {
79
+ /** Imperative handle exposed via the `ref` prop. */
80
+ export interface TegakiRendererHandle {
81
+ /** The root DOM element. */
82
+ getElement(): HTMLDivElement | null;
83
+ /** Current animation time in seconds. */
84
+ getCurrentTime(): number;
85
+ /** Total timeline duration in seconds. */
86
+ getDuration(): number;
87
+ /** Whether the animation is currently playing (uncontrolled mode only). */
88
+ getIsPlaying(): boolean;
89
+ /** Whether the animation has reached the end. */
90
+ getIsComplete(): boolean;
91
+ /** Resume playback (uncontrolled mode only). No-op in controlled/css mode. */
92
+ play(): void;
93
+ /** Pause playback (uncontrolled mode only). No-op in controlled/css mode. */
94
+ pause(): void;
95
+ /** Jump to a specific time in seconds (uncontrolled mode only). No-op in controlled/css mode. */
96
+ seek(time: number): void;
97
+ /** Seek to 0 and play (uncontrolled mode only). No-op in controlled/css mode. */
98
+ restart(): void;
99
+ }
100
+
101
+ export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string, never>>
102
+ extends Omit<ComponentProps<'div'>, 'children' | 'ref'> {
103
+ /** Imperative handle ref for playback controls and DOM access. */
104
+ ref?: Ref<TegakiRendererHandle>;
105
+
73
106
  /** TegakiBundle with font data and animated glyph SVGs. */
74
107
  font?: TegakiBundle;
75
108
 
@@ -89,10 +122,6 @@ export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string,
89
122
  /** Called once when the animation reaches the end of the timeline. */
90
123
  onComplete?: () => void;
91
124
 
92
- /** Rendering mode. `'canvas'` draws strokes on a `<canvas>` (requires
93
- * `font.glyphData`), `'svg'` uses animated SVG elements. Default: `'canvas'` */
94
- mode?: 'canvas' | 'svg';
95
-
96
125
  /** Visual effects applied during canvas rendering. */
97
126
  effects?: E;
98
127
 
@@ -110,18 +139,20 @@ export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string,
110
139
  // --- Component ---
111
140
 
112
141
  export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string, never>>({
142
+ ref,
113
143
  font,
114
144
  text,
115
145
  children,
116
146
  time: timeProp,
117
147
  onComplete,
118
- mode = 'canvas',
119
148
  effects,
120
149
  segmentSize,
121
150
  timing,
122
151
  showOverlay,
123
152
  ...props
124
153
  }: TegakiRendererProps<E>) {
154
+ registerCssProperties();
155
+
125
156
  const resolvedText = text ?? coerceToString(children);
126
157
 
127
158
  // --- Resolve effects ---
@@ -143,25 +174,44 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
143
174
  const controlledTime = timeControl.mode === 'controlled' ? timeControl.value : undefined;
144
175
  const defaultTime = timeControl.mode === 'uncontrolled' ? (timeControl.initialTime ?? 0) : 0;
145
176
  const speed = timeControl.mode === 'uncontrolled' ? (timeControl.speed ?? 1) : 1;
146
- const playing = timeControl.mode === 'uncontrolled' ? (timeControl.playing ?? true) : false;
177
+ const propPlaying = timeControl.mode === 'uncontrolled' ? (timeControl.playing ?? true) : false;
147
178
  const loop = timeControl.mode === 'uncontrolled' ? (timeControl.loop ?? false) : false;
148
179
  const catchUp = timeControl.mode === 'uncontrolled' ? (timeControl.catchUp ?? 0) : 0;
149
180
  const onTimeChange = timeControl.mode === 'uncontrolled' ? timeControl.onTimeChange : undefined;
150
181
 
182
+ // Imperative playing override (undefined = follow prop)
183
+ const [playingOverride, setPlayingOverride] = useState<boolean | undefined>(undefined);
184
+ const playing = playingOverride ?? propPlaying;
185
+
186
+ // Reset override when the prop changes so the prop regains control
187
+ const prevPropPlaying = useRef(propPlaying);
188
+ if (prevPropPlaying.current !== propPlaying) {
189
+ prevPropPlaying.current = propPlaying;
190
+ setPlayingOverride(undefined);
191
+ }
192
+
151
193
  // --- Internal time (uncontrolled mode) ---
152
194
  const [internalTime, setInternalTime] = useState(defaultTime);
153
195
  // --- CSS-driven time ---
154
196
  const [cssTime, setCssTime] = useState(0);
155
197
  const currentTime = isCss ? cssTime : isControlled ? controlledTime! : internalTime;
156
198
 
157
- // Stable callback refs to avoid restarting the rAF loop
199
+ // Stable refs so the imperative handle and rAF loop always see latest values
200
+ const currentTimeRef = useRef(currentTime);
201
+ currentTimeRef.current = currentTime;
202
+ const playingRef = useRef(playing);
203
+ playingRef.current = playing;
204
+ const isControlledRef = useRef(isControlled);
205
+ isControlledRef.current = isControlled;
158
206
  const onTimeChangeRef = useRef(onTimeChange);
159
207
  onTimeChangeRef.current = onTimeChange;
160
208
  const onCompleteRef = useRef(onComplete);
161
209
  onCompleteRef.current = onComplete;
162
210
 
163
211
  // --- Font loading ---
164
- const [fontReady, setFontReady] = useState(() => !!font && document.fonts.check(`16px "${font?.family}"`));
212
+ const [fontReady, setFontReady] = useState(
213
+ () => typeof document !== 'undefined' && !!font && document.fonts.check(`16px "${font.family}"`),
214
+ );
165
215
  useEffect(() => {
166
216
  if (!font) {
167
217
  setFontReady(false);
@@ -186,13 +236,13 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
186
236
  // --- Font-derived constants ---
187
237
  const fontFamily = font?.family;
188
238
  const emHeight = font ? (font.ascender - font.descender) / font.unitsPerEm : 0;
189
- const baselineOffset = font ? font.descender / font.unitsPerEm : 0;
190
239
 
191
240
  // --- Container measurement ---
192
241
  const rootRef = useRef<HTMLDivElement>(null);
193
242
  const [containerWidth, setContainerWidth] = useState(0);
194
243
  const [fontSize, setFontSize] = useState(0);
195
244
  const [lineHeight, setLineHeight] = useState(0);
245
+ const [currentColor, setCurrentColor] = useState('');
196
246
 
197
247
  // --- Timeline ---
198
248
  const timeline = useMemo(
@@ -220,6 +270,34 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
220
270
  }
221
271
  });
222
272
 
273
+ // --- Imperative handle (stable — reads from refs) ---
274
+ useImperativeHandle(
275
+ ref,
276
+ () => ({
277
+ getElement: () => rootRef.current,
278
+ getCurrentTime: () => currentTimeRef.current,
279
+ getDuration: () => totalDurationRef.current,
280
+ getIsPlaying: () => playingRef.current,
281
+ getIsComplete: () => totalDurationRef.current > 0 && currentTimeRef.current >= totalDurationRef.current,
282
+ play: () => {
283
+ if (!isControlledRef.current) setPlayingOverride(true);
284
+ },
285
+ pause: () => {
286
+ if (!isControlledRef.current) setPlayingOverride(false);
287
+ },
288
+ seek: (time: number) => {
289
+ if (!isControlledRef.current) setInternalTime(Math.max(0, Math.min(time, totalDurationRef.current)));
290
+ },
291
+ restart: () => {
292
+ if (!isControlledRef.current) {
293
+ setInternalTime(0);
294
+ setPlayingOverride(true);
295
+ }
296
+ },
297
+ }),
298
+ [],
299
+ );
300
+
223
301
  // --- Uncontrolled: time change notification ---
224
302
  useEffect(() => {
225
303
  if (!isControlled) {
@@ -227,9 +305,28 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
227
305
  }
228
306
  }, [internalTime, isControlled]);
229
307
 
308
+ // --- Reduced motion preference ---
309
+ const [prefersReducedMotion, setPrefersReducedMotion] = useState(
310
+ () => typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches,
311
+ );
312
+ useEffect(() => {
313
+ const mql = window.matchMedia('(prefers-reduced-motion: reduce)');
314
+ setPrefersReducedMotion(mql.matches);
315
+ const onChange = (e: MediaQueryListEvent) => setPrefersReducedMotion(e.matches);
316
+ mql.addEventListener('change', onChange);
317
+ return () => mql.removeEventListener('change', onChange);
318
+ }, []);
319
+
320
+ // When reduced motion is preferred, skip to end of timeline
321
+ useEffect(() => {
322
+ if (prefersReducedMotion && !isControlled && timeline.totalDuration > 0) {
323
+ setInternalTime(timeline.totalDuration);
324
+ }
325
+ }, [prefersReducedMotion, isControlled, timeline.totalDuration]);
326
+
230
327
  // --- Uncontrolled: rAF playback loop ---
231
328
  useEffect(() => {
232
- if (isControlled || !playing || !font || !fontReady) return;
329
+ if (isControlled || !playing || !font || !fontReady || prefersReducedMotion) return;
233
330
 
234
331
  // Reset smoothed boost when the loop restarts
235
332
  smoothedBoostRef.current = 0;
@@ -274,45 +371,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
274
371
 
275
372
  raf = requestAnimationFrame(tick);
276
373
  return () => cancelAnimationFrame(raf);
277
- }, [isControlled, playing, speed, loop, catchUp, font, fontReady]);
278
-
279
- // --- SVG refs (only needed in SVG mode) ---
280
- const svgRefs = useRef(new Map<number, SVGSVGElement>());
281
- const svgRefCallbacks = useRef(new Map<number, (node: SVGSVGElement | null) => void>());
282
-
283
- const makeSvgRef = useCallback(
284
- (charIdx: number) => (node: SVGSVGElement | null) => {
285
- if (node) {
286
- node.pauseAnimations();
287
- svgRefs.current.set(charIdx, node);
288
- } else {
289
- svgRefs.current.delete(charIdx);
290
- }
291
- },
292
- [],
293
- );
294
-
295
- const getSvgRef = useCallback(
296
- (charIdx: number) => {
297
- let cb = svgRefCallbacks.current.get(charIdx);
298
- if (!cb) {
299
- cb = makeSvgRef(charIdx);
300
- svgRefCallbacks.current.set(charIdx, cb);
301
- }
302
- return cb;
303
- },
304
- [makeSvgRef],
305
- );
306
-
307
- // Clear stale SVG refs when font or mode changes
308
- const prevFontRef = useRef(font);
309
- const prevModeRef = useRef(mode);
310
- if (prevFontRef.current !== font || prevModeRef.current !== mode) {
311
- prevFontRef.current = font;
312
- prevModeRef.current = mode;
313
- svgRefs.current.clear();
314
- svgRefCallbacks.current.clear();
315
- }
374
+ }, [isControlled, playing, speed, loop, catchUp, font, fontReady, prefersReducedMotion]);
316
375
 
317
376
  // --- Container size observation ---
318
377
  useEffect(() => {
@@ -324,6 +383,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
324
383
  const styles = getComputedStyle(el);
325
384
  setFontSize(Number.parseFloat(styles.fontSize));
326
385
  setLineHeight(Number.parseFloat(styles.lineHeight));
386
+ setCurrentColor(styles.color);
327
387
  }
328
388
  });
329
389
  ro.observe(el);
@@ -343,6 +403,9 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
343
403
  setFontSize(Number.parseFloat(styles.fontSize));
344
404
  setLineHeight(Number.parseFloat(styles.lineHeight));
345
405
  }
406
+ if (e.propertyName === 'color') {
407
+ setCurrentColor(styles.color);
408
+ }
346
409
  if (e.propertyName === CSS_PROGRESS) {
347
410
  const rawProgress = Number(styles.getPropertyValue(CSS_PROGRESS));
348
411
  setCssTime(rawProgress * totalDurationRef.current);
@@ -362,27 +425,10 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
362
425
  const padH = PADDING_H_EM * fontSize;
363
426
  const padV = fontSize ? Math.max(MIN_PADDING_V_EM * fontSize, (MIN_LINE_HEIGHT_EM * fontSize - lineHeight) / 2) : 0;
364
427
 
365
- // --- Sync SVG glyph times before paint ---
366
- // Runs every render so SVGs stay correct even when currentTime hasn't changed
367
- // (e.g. after pausing, or when ref callbacks re-fire due to re-renders).
368
- useLayoutEffect(() => {
369
- if (mode !== 'svg') return;
370
- const entries = timeline.entries;
371
- for (let i = 0; i < entries.length; i++) {
372
- const entry = entries[i]!;
373
- if (!entry.hasSvg) continue;
374
- const svg = svgRefs.current.get(i);
375
- if (!svg) continue;
376
- const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
377
- svg.setCurrentTime(localTime);
378
- }
379
- });
380
-
381
428
  // --- Canvas rendering ---
382
429
  const canvasRef = useRef<HTMLCanvasElement>(null);
383
430
 
384
431
  useLayoutEffect(() => {
385
- if (mode !== 'canvas') return;
386
432
  const canvas = canvasRef.current;
387
433
  if (!canvas || !font?.glyphData || !layout || !fontSize) return;
388
434
 
@@ -407,8 +453,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
407
453
  ctx.clearRect(0, 0, w, h);
408
454
  ctx.translate(padH, padV);
409
455
 
410
- // Read currentColor from the container
411
- const color = getComputedStyle(el).color;
456
+ const color = currentColor || getComputedStyle(el).color;
412
457
 
413
458
  const emHeightPx = emHeight * fontSize;
414
459
  const halfLeading = (lineHeight - emHeightPx) / 2;
@@ -425,7 +470,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
425
470
  const kerning = layout.kernings[charIdx] ?? 0;
426
471
  const glyph = font.glyphData[char];
427
472
 
428
- if (glyph && entry.hasSvg) {
473
+ if (glyph && entry.hasGlyph) {
429
474
  const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
430
475
  const glyphY = y + halfLeading;
431
476
  drawGlyph(
@@ -446,7 +491,7 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
446
491
  seed + charIdx,
447
492
  segmentSize,
448
493
  );
449
- } else if (!entry.hasSvg && currentTime >= entry.offset + entry.duration) {
494
+ } else if (!entry.hasGlyph && currentTime >= entry.offset + entry.duration) {
450
495
  const baseline = y + halfLeading + (font.ascender / font.unitsPerEm) * fontSize;
451
496
  drawFallbackGlyph(ctx, char, x, baseline, fontSize, fontFamily!, color, resolvedEffects, seed + charIdx);
452
497
  }
@@ -456,7 +501,6 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
456
501
  y += lineHeight;
457
502
  }
458
503
  }, [
459
- mode,
460
504
  currentTime,
461
505
  timeline,
462
506
  layout,
@@ -468,72 +512,14 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
468
512
  emHeight,
469
513
  padH,
470
514
  padV,
515
+ currentColor,
471
516
  resolvedEffects,
472
517
  seed,
473
518
  segmentSize,
474
519
  ]);
475
520
 
476
- // --- SVG rendering (skipped entirely in canvas mode) ---
477
- const lineElements = useMemo(() => {
478
- if (mode !== 'svg' || !font || !resolvedText) return null;
479
-
480
- const characters = graphemes(resolvedText);
481
-
482
- const renderGlyph = (charIdx: number) => {
483
- const char = characters[charIdx]!;
484
- const entry = timeline.entries[charIdx]!;
485
- const GlyphSvg = font.glyphs[char] as any;
486
- const width = layout?.charWidths[charIdx] ?? 1;
487
- const kerning = layout?.kernings[charIdx];
488
-
489
- if (char === '\n') return null;
490
-
491
- if (GlyphSvg) {
492
- return (
493
- <GlyphSvg
494
- key={charIdx}
495
- ref={getSvgRef(charIdx)}
496
- style={{
497
- display: 'inline-block',
498
- verticalAlign: `${baselineOffset}em`,
499
- width: `${width}em`,
500
- marginRight: kerning ? `${kerning}em` : undefined,
501
- height: `${emHeight}em`,
502
- overflow: 'visible',
503
- }}
504
- />
505
- );
506
- }
507
-
508
- const isVisible = currentTime >= entry.offset + entry.duration;
509
- return (
510
- <span style={{ fontFamily, visibility: isVisible ? 'visible' : 'hidden' }} key={charIdx}>
511
- {char}
512
- </span>
513
- );
514
- };
515
-
516
- if (layout) {
517
- return layout.lines.map((lineIndices, lineIdx) => {
518
- const isEmpty = lineIndices.every((i) => characters[i] === '\n');
519
- return (
520
- <div style={{ whiteSpace: 'nowrap', height: isEmpty ? '1lh' : undefined, lineHeight: `${lineHeight}px` }} key={lineIdx}>
521
- {lineIndices.map(renderGlyph)}
522
- </div>
523
- );
524
- });
525
- }
526
-
527
- // Fallback before layout is ready: single line
528
- return characters.length > 0 ? <div style={{ whiteSpace: 'nowrap' }}>{characters.map((_, i) => renderGlyph(i))}</div> : null;
529
- }, [mode, resolvedText, timeline, font, layout, getSvgRef, baselineOffset, emHeight, currentTime, fontFamily, lineHeight]);
530
-
531
521
  // --- Rendering ---
532
522
 
533
- if (!font || !resolvedText || !fontReady) {
534
- return <div ref={rootRef} {...props} />;
535
- }
536
-
537
523
  return (
538
524
  <div
539
525
  ref={rootRef}
@@ -551,27 +537,29 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
551
537
  },
552
538
  }}
553
539
  >
554
- {/* 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' ? (
540
+ <div style={{ position: 'relative' }}>
541
+ {/* Sentinel: inherits font-size & line-height; its height changes when either changes */}
542
+ <span
543
+ ref={sentinelRef}
544
+ aria-hidden="true"
545
+ style={{
546
+ position: 'absolute',
547
+ width: 0,
548
+ overflow: 'hidden',
549
+ pointerEvents: 'none',
550
+ fontSize: 'inherit',
551
+ lineHeight: 'inherit',
552
+ visibility: 'hidden',
553
+ transition: isCss
554
+ ? `font-size 0.001s, line-height 0.001s, color 0.001s, ${CSS_PROGRESS} 0.001s`
555
+ : 'font-size 0.001s, line-height 0.001s, color 0.001s',
556
+ }}
557
+ >
558
+ {'\u00A0'}
559
+ </span>
572
560
  <canvas
573
561
  ref={canvasRef}
574
- aria-hidden
562
+ aria-hidden="true"
575
563
  style={{
576
564
  position: 'absolute',
577
565
  inset: `${-padV}px ${-padH}px`,
@@ -580,31 +568,20 @@ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string,
580
568
  pointerEvents: 'none',
581
569
  }}
582
570
  />
583
- ) : (
571
+
584
572
  <div
585
573
  style={{
586
- position: 'absolute',
587
- inset: 0,
588
- pointerEvents: 'none',
574
+ userSelect: 'auto',
575
+ whiteSpace: 'pre-wrap',
576
+ overflowWrap: 'break-word',
577
+ paddingRight: 1,
578
+ WebkitTextFillColor: showOverlay ? undefined : 'transparent',
589
579
  fontFamily,
580
+ color: showOverlay ? 'rgba(255, 0, 0, 0.4)' : undefined,
590
581
  }}
591
582
  >
592
- {lineElements}
583
+ {resolvedText}
593
584
  </div>
594
- )}
595
-
596
- <div
597
- style={{
598
- userSelect: 'auto',
599
- whiteSpace: 'pre-wrap',
600
- overflowWrap: 'break-word',
601
- paddingRight: 1,
602
- WebkitTextFillColor: showOverlay ? undefined : 'transparent',
603
- fontFamily,
604
- color: showOverlay ? 'rgba(255, 0, 0, 0.4)' : undefined,
605
- }}
606
- >
607
- {resolvedText}
608
585
  </div>
609
586
  </div>
610
587
  );
@@ -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