tegaki 0.0.1 → 0.2.3

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 (756) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/FONTS-LICENSE.md +67 -0
  3. package/LICENSE +21 -0
  4. package/README.md +261 -0
  5. package/dist/index.d.mts +257 -0
  6. package/dist/index.mjs +920 -0
  7. package/dist/index.mjs.map +1 -0
  8. package/fonts/caveat/bundle.ts +300 -0
  9. package/fonts/caveat/caveat.ttf +0 -0
  10. package/fonts/caveat/font.json +24472 -0
  11. package/fonts/caveat/glyphData.json +1 -0
  12. package/fonts/caveat/svg/0.svg +12 -0
  13. package/fonts/caveat/svg/0.tsx +14 -0
  14. package/fonts/caveat/svg/1.svg +7 -0
  15. package/fonts/caveat/svg/1.tsx +9 -0
  16. package/fonts/caveat/svg/2.svg +10 -0
  17. package/fonts/caveat/svg/2.tsx +12 -0
  18. package/fonts/caveat/svg/3.svg +12 -0
  19. package/fonts/caveat/svg/3.tsx +14 -0
  20. package/fonts/caveat/svg/4.svg +12 -0
  21. package/fonts/caveat/svg/4.tsx +14 -0
  22. package/fonts/caveat/svg/5.svg +7 -0
  23. package/fonts/caveat/svg/5.tsx +9 -0
  24. package/fonts/caveat/svg/6.svg +7 -0
  25. package/fonts/caveat/svg/6.tsx +9 -0
  26. package/fonts/caveat/svg/7.svg +12 -0
  27. package/fonts/caveat/svg/7.tsx +14 -0
  28. package/fonts/caveat/svg/8.svg +10 -0
  29. package/fonts/caveat/svg/8.tsx +12 -0
  30. package/fonts/caveat/svg/9.svg +12 -0
  31. package/fonts/caveat/svg/9.tsx +14 -0
  32. package/fonts/caveat/svg/U+0021.svg +12 -0
  33. package/fonts/caveat/svg/U+0021.tsx +14 -0
  34. package/fonts/caveat/svg/U+0022.svg +12 -0
  35. package/fonts/caveat/svg/U+0022.tsx +14 -0
  36. package/fonts/caveat/svg/U+0023.svg +22 -0
  37. package/fonts/caveat/svg/U+0023.tsx +24 -0
  38. package/fonts/caveat/svg/U+0024.svg +12 -0
  39. package/fonts/caveat/svg/U+0024.tsx +14 -0
  40. package/fonts/caveat/svg/U+0025.svg +25 -0
  41. package/fonts/caveat/svg/U+0025.tsx +27 -0
  42. package/fonts/caveat/svg/U+0026.svg +10 -0
  43. package/fonts/caveat/svg/U+0026.tsx +12 -0
  44. package/fonts/caveat/svg/U+0027.svg +7 -0
  45. package/fonts/caveat/svg/U+0027.tsx +9 -0
  46. package/fonts/caveat/svg/U+0028.svg +7 -0
  47. package/fonts/caveat/svg/U+0028.tsx +9 -0
  48. package/fonts/caveat/svg/U+0029.svg +7 -0
  49. package/fonts/caveat/svg/U+0029.tsx +9 -0
  50. package/fonts/caveat/svg/U+002a.svg +17 -0
  51. package/fonts/caveat/svg/U+002a.tsx +19 -0
  52. package/fonts/caveat/svg/U+002b.svg +12 -0
  53. package/fonts/caveat/svg/U+002b.tsx +14 -0
  54. package/fonts/caveat/svg/U+002c.svg +7 -0
  55. package/fonts/caveat/svg/U+002c.tsx +9 -0
  56. package/fonts/caveat/svg/U+002d.svg +7 -0
  57. package/fonts/caveat/svg/U+002d.tsx +9 -0
  58. package/fonts/caveat/svg/U+002e.svg +7 -0
  59. package/fonts/caveat/svg/U+002e.tsx +9 -0
  60. package/fonts/caveat/svg/U+002f.svg +12 -0
  61. package/fonts/caveat/svg/U+002f.tsx +14 -0
  62. package/fonts/caveat/svg/U+003a.svg +12 -0
  63. package/fonts/caveat/svg/U+003a.tsx +14 -0
  64. package/fonts/caveat/svg/U+003b.svg +12 -0
  65. package/fonts/caveat/svg/U+003b.tsx +14 -0
  66. package/fonts/caveat/svg/U+003c.svg +12 -0
  67. package/fonts/caveat/svg/U+003c.tsx +14 -0
  68. package/fonts/caveat/svg/U+003d.svg +12 -0
  69. package/fonts/caveat/svg/U+003d.tsx +14 -0
  70. package/fonts/caveat/svg/U+003e.svg +12 -0
  71. package/fonts/caveat/svg/U+003e.tsx +14 -0
  72. package/fonts/caveat/svg/U+003f.svg +12 -0
  73. package/fonts/caveat/svg/U+003f.tsx +14 -0
  74. package/fonts/caveat/svg/U+0040.svg +7 -0
  75. package/fonts/caveat/svg/U+0040.tsx +9 -0
  76. package/fonts/caveat/svg/U+005c.svg +7 -0
  77. package/fonts/caveat/svg/U+005c.tsx +9 -0
  78. package/fonts/caveat/svg/U+005e.svg +7 -0
  79. package/fonts/caveat/svg/U+005e.tsx +9 -0
  80. package/fonts/caveat/svg/U+005f.svg +7 -0
  81. package/fonts/caveat/svg/U+005f.tsx +9 -0
  82. package/fonts/caveat/svg/U+0060.svg +7 -0
  83. package/fonts/caveat/svg/U+0060.tsx +9 -0
  84. package/fonts/caveat/svg/U+007c.svg +7 -0
  85. package/fonts/caveat/svg/U+007c.tsx +9 -0
  86. package/fonts/caveat/svg/U+007e.svg +7 -0
  87. package/fonts/caveat/svg/U+007e.tsx +9 -0
  88. package/fonts/caveat/svg/a.svg +7 -0
  89. package/fonts/caveat/svg/a.tsx +9 -0
  90. package/fonts/caveat/svg/b.svg +12 -0
  91. package/fonts/caveat/svg/b.tsx +14 -0
  92. package/fonts/caveat/svg/c.svg +7 -0
  93. package/fonts/caveat/svg/c.tsx +9 -0
  94. package/fonts/caveat/svg/d.svg +12 -0
  95. package/fonts/caveat/svg/d.tsx +14 -0
  96. package/fonts/caveat/svg/e.svg +7 -0
  97. package/fonts/caveat/svg/e.tsx +9 -0
  98. package/fonts/caveat/svg/f.svg +12 -0
  99. package/fonts/caveat/svg/f.tsx +14 -0
  100. package/fonts/caveat/svg/g.svg +15 -0
  101. package/fonts/caveat/svg/g.tsx +17 -0
  102. package/fonts/caveat/svg/h.svg +7 -0
  103. package/fonts/caveat/svg/h.tsx +9 -0
  104. package/fonts/caveat/svg/i.svg +12 -0
  105. package/fonts/caveat/svg/i.tsx +14 -0
  106. package/fonts/caveat/svg/j.svg +12 -0
  107. package/fonts/caveat/svg/j.tsx +14 -0
  108. package/fonts/caveat/svg/k.svg +15 -0
  109. package/fonts/caveat/svg/k.tsx +17 -0
  110. package/fonts/caveat/svg/l.svg +7 -0
  111. package/fonts/caveat/svg/l.tsx +9 -0
  112. package/fonts/caveat/svg/m.svg +17 -0
  113. package/fonts/caveat/svg/m.tsx +19 -0
  114. package/fonts/caveat/svg/n.svg +17 -0
  115. package/fonts/caveat/svg/n.tsx +19 -0
  116. package/fonts/caveat/svg/o.svg +7 -0
  117. package/fonts/caveat/svg/o.tsx +9 -0
  118. package/fonts/caveat/svg/p.svg +12 -0
  119. package/fonts/caveat/svg/p.tsx +14 -0
  120. package/fonts/caveat/svg/q.svg +7 -0
  121. package/fonts/caveat/svg/q.tsx +9 -0
  122. package/fonts/caveat/svg/r.svg +12 -0
  123. package/fonts/caveat/svg/r.tsx +14 -0
  124. package/fonts/caveat/svg/s.svg +7 -0
  125. package/fonts/caveat/svg/s.tsx +9 -0
  126. package/fonts/caveat/svg/t.svg +20 -0
  127. package/fonts/caveat/svg/t.tsx +22 -0
  128. package/fonts/caveat/svg/u.svg +12 -0
  129. package/fonts/caveat/svg/u.tsx +14 -0
  130. package/fonts/caveat/svg/upper_A.svg +12 -0
  131. package/fonts/caveat/svg/upper_A.tsx +14 -0
  132. package/fonts/caveat/svg/upper_B.svg +17 -0
  133. package/fonts/caveat/svg/upper_B.tsx +19 -0
  134. package/fonts/caveat/svg/upper_C.svg +7 -0
  135. package/fonts/caveat/svg/upper_C.tsx +9 -0
  136. package/fonts/caveat/svg/upper_D.svg +12 -0
  137. package/fonts/caveat/svg/upper_D.tsx +14 -0
  138. package/fonts/caveat/svg/upper_E.svg +12 -0
  139. package/fonts/caveat/svg/upper_E.tsx +14 -0
  140. package/fonts/caveat/svg/upper_F.svg +17 -0
  141. package/fonts/caveat/svg/upper_F.tsx +19 -0
  142. package/fonts/caveat/svg/upper_G.svg +7 -0
  143. package/fonts/caveat/svg/upper_G.tsx +9 -0
  144. package/fonts/caveat/svg/upper_H.svg +17 -0
  145. package/fonts/caveat/svg/upper_H.tsx +19 -0
  146. package/fonts/caveat/svg/upper_I.svg +17 -0
  147. package/fonts/caveat/svg/upper_I.tsx +19 -0
  148. package/fonts/caveat/svg/upper_J.svg +7 -0
  149. package/fonts/caveat/svg/upper_J.tsx +9 -0
  150. package/fonts/caveat/svg/upper_K.svg +12 -0
  151. package/fonts/caveat/svg/upper_K.tsx +14 -0
  152. package/fonts/caveat/svg/upper_L.svg +7 -0
  153. package/fonts/caveat/svg/upper_L.tsx +9 -0
  154. package/fonts/caveat/svg/upper_M.svg +17 -0
  155. package/fonts/caveat/svg/upper_M.tsx +19 -0
  156. package/fonts/caveat/svg/upper_N.svg +7 -0
  157. package/fonts/caveat/svg/upper_N.tsx +9 -0
  158. package/fonts/caveat/svg/upper_O.svg +7 -0
  159. package/fonts/caveat/svg/upper_O.tsx +9 -0
  160. package/fonts/caveat/svg/upper_P.svg +12 -0
  161. package/fonts/caveat/svg/upper_P.tsx +14 -0
  162. package/fonts/caveat/svg/upper_Q.svg +15 -0
  163. package/fonts/caveat/svg/upper_Q.tsx +17 -0
  164. package/fonts/caveat/svg/upper_R.svg +12 -0
  165. package/fonts/caveat/svg/upper_R.tsx +14 -0
  166. package/fonts/caveat/svg/upper_S.svg +7 -0
  167. package/fonts/caveat/svg/upper_S.tsx +9 -0
  168. package/fonts/caveat/svg/upper_T.svg +12 -0
  169. package/fonts/caveat/svg/upper_T.tsx +14 -0
  170. package/fonts/caveat/svg/upper_U.svg +15 -0
  171. package/fonts/caveat/svg/upper_U.tsx +17 -0
  172. package/fonts/caveat/svg/upper_V.svg +12 -0
  173. package/fonts/caveat/svg/upper_V.tsx +14 -0
  174. package/fonts/caveat/svg/upper_W.svg +12 -0
  175. package/fonts/caveat/svg/upper_W.tsx +14 -0
  176. package/fonts/caveat/svg/upper_X.svg +12 -0
  177. package/fonts/caveat/svg/upper_X.tsx +14 -0
  178. package/fonts/caveat/svg/upper_Y.svg +12 -0
  179. package/fonts/caveat/svg/upper_Y.tsx +14 -0
  180. package/fonts/caveat/svg/upper_Z.svg +7 -0
  181. package/fonts/caveat/svg/upper_Z.tsx +9 -0
  182. package/fonts/caveat/svg/v.svg +7 -0
  183. package/fonts/caveat/svg/v.tsx +9 -0
  184. package/fonts/caveat/svg/w.svg +12 -0
  185. package/fonts/caveat/svg/w.tsx +14 -0
  186. package/fonts/caveat/svg/x.svg +17 -0
  187. package/fonts/caveat/svg/x.tsx +19 -0
  188. package/fonts/caveat/svg/y.svg +12 -0
  189. package/fonts/caveat/svg/y.tsx +14 -0
  190. package/fonts/caveat/svg/z.svg +7 -0
  191. package/fonts/caveat/svg/z.tsx +9 -0
  192. package/fonts/italianno/bundle.ts +300 -0
  193. package/fonts/italianno/font.json +33410 -0
  194. package/fonts/italianno/glyphData.json +1 -0
  195. package/fonts/italianno/italianno.ttf +0 -0
  196. package/fonts/italianno/svg/0.svg +10 -0
  197. package/fonts/italianno/svg/0.tsx +12 -0
  198. package/fonts/italianno/svg/1.svg +17 -0
  199. package/fonts/italianno/svg/1.tsx +19 -0
  200. package/fonts/italianno/svg/2.svg +12 -0
  201. package/fonts/italianno/svg/2.tsx +14 -0
  202. package/fonts/italianno/svg/3.svg +17 -0
  203. package/fonts/italianno/svg/3.tsx +19 -0
  204. package/fonts/italianno/svg/4.svg +22 -0
  205. package/fonts/italianno/svg/4.tsx +24 -0
  206. package/fonts/italianno/svg/5.svg +12 -0
  207. package/fonts/italianno/svg/5.tsx +14 -0
  208. package/fonts/italianno/svg/6.svg +13 -0
  209. package/fonts/italianno/svg/6.tsx +15 -0
  210. package/fonts/italianno/svg/7.svg +12 -0
  211. package/fonts/italianno/svg/7.tsx +14 -0
  212. package/fonts/italianno/svg/8.svg +7 -0
  213. package/fonts/italianno/svg/8.tsx +9 -0
  214. package/fonts/italianno/svg/9.svg +12 -0
  215. package/fonts/italianno/svg/9.tsx +14 -0
  216. package/fonts/italianno/svg/U+0021.svg +12 -0
  217. package/fonts/italianno/svg/U+0021.tsx +14 -0
  218. package/fonts/italianno/svg/U+0022.svg +15 -0
  219. package/fonts/italianno/svg/U+0022.tsx +17 -0
  220. package/fonts/italianno/svg/U+0023.svg +22 -0
  221. package/fonts/italianno/svg/U+0023.tsx +24 -0
  222. package/fonts/italianno/svg/U+0024.svg +25 -0
  223. package/fonts/italianno/svg/U+0024.tsx +27 -0
  224. package/fonts/italianno/svg/U+0025.svg +22 -0
  225. package/fonts/italianno/svg/U+0025.tsx +24 -0
  226. package/fonts/italianno/svg/U+0026.svg +17 -0
  227. package/fonts/italianno/svg/U+0026.tsx +19 -0
  228. package/fonts/italianno/svg/U+0027.svg +7 -0
  229. package/fonts/italianno/svg/U+0027.tsx +9 -0
  230. package/fonts/italianno/svg/U+0028.svg +7 -0
  231. package/fonts/italianno/svg/U+0028.tsx +9 -0
  232. package/fonts/italianno/svg/U+0029.svg +7 -0
  233. package/fonts/italianno/svg/U+0029.tsx +9 -0
  234. package/fonts/italianno/svg/U+002a.svg +22 -0
  235. package/fonts/italianno/svg/U+002a.tsx +24 -0
  236. package/fonts/italianno/svg/U+002b.svg +12 -0
  237. package/fonts/italianno/svg/U+002b.tsx +14 -0
  238. package/fonts/italianno/svg/U+002c.svg +12 -0
  239. package/fonts/italianno/svg/U+002c.tsx +14 -0
  240. package/fonts/italianno/svg/U+002d.svg +7 -0
  241. package/fonts/italianno/svg/U+002d.tsx +9 -0
  242. package/fonts/italianno/svg/U+002e.svg +7 -0
  243. package/fonts/italianno/svg/U+002e.tsx +9 -0
  244. package/fonts/italianno/svg/U+002f.svg +7 -0
  245. package/fonts/italianno/svg/U+002f.tsx +9 -0
  246. package/fonts/italianno/svg/U+003a.svg +12 -0
  247. package/fonts/italianno/svg/U+003a.tsx +14 -0
  248. package/fonts/italianno/svg/U+003b.svg +12 -0
  249. package/fonts/italianno/svg/U+003b.tsx +14 -0
  250. package/fonts/italianno/svg/U+003c.svg +7 -0
  251. package/fonts/italianno/svg/U+003c.tsx +9 -0
  252. package/fonts/italianno/svg/U+003d.svg +12 -0
  253. package/fonts/italianno/svg/U+003d.tsx +14 -0
  254. package/fonts/italianno/svg/U+003e.svg +12 -0
  255. package/fonts/italianno/svg/U+003e.tsx +14 -0
  256. package/fonts/italianno/svg/U+003f.svg +12 -0
  257. package/fonts/italianno/svg/U+003f.tsx +14 -0
  258. package/fonts/italianno/svg/U+0040.svg +15 -0
  259. package/fonts/italianno/svg/U+0040.tsx +17 -0
  260. package/fonts/italianno/svg/U+005c.svg +7 -0
  261. package/fonts/italianno/svg/U+005c.tsx +9 -0
  262. package/fonts/italianno/svg/U+005e.svg +12 -0
  263. package/fonts/italianno/svg/U+005e.tsx +14 -0
  264. package/fonts/italianno/svg/U+005f.svg +3 -0
  265. package/fonts/italianno/svg/U+005f.tsx +5 -0
  266. package/fonts/italianno/svg/U+0060.svg +10 -0
  267. package/fonts/italianno/svg/U+0060.tsx +12 -0
  268. package/fonts/italianno/svg/U+007c.svg +7 -0
  269. package/fonts/italianno/svg/U+007c.tsx +9 -0
  270. package/fonts/italianno/svg/U+007e.svg +7 -0
  271. package/fonts/italianno/svg/U+007e.tsx +9 -0
  272. package/fonts/italianno/svg/a.svg +12 -0
  273. package/fonts/italianno/svg/a.tsx +14 -0
  274. package/fonts/italianno/svg/b.svg +10 -0
  275. package/fonts/italianno/svg/b.tsx +12 -0
  276. package/fonts/italianno/svg/c.svg +10 -0
  277. package/fonts/italianno/svg/c.tsx +12 -0
  278. package/fonts/italianno/svg/d.svg +15 -0
  279. package/fonts/italianno/svg/d.tsx +17 -0
  280. package/fonts/italianno/svg/e.svg +12 -0
  281. package/fonts/italianno/svg/e.tsx +14 -0
  282. package/fonts/italianno/svg/f.svg +12 -0
  283. package/fonts/italianno/svg/f.tsx +14 -0
  284. package/fonts/italianno/svg/g.svg +12 -0
  285. package/fonts/italianno/svg/g.tsx +14 -0
  286. package/fonts/italianno/svg/h.svg +12 -0
  287. package/fonts/italianno/svg/h.tsx +14 -0
  288. package/fonts/italianno/svg/i.svg +17 -0
  289. package/fonts/italianno/svg/i.tsx +19 -0
  290. package/fonts/italianno/svg/j.svg +12 -0
  291. package/fonts/italianno/svg/j.tsx +14 -0
  292. package/fonts/italianno/svg/k.svg +17 -0
  293. package/fonts/italianno/svg/k.tsx +19 -0
  294. package/fonts/italianno/svg/l.svg +15 -0
  295. package/fonts/italianno/svg/l.tsx +17 -0
  296. package/fonts/italianno/svg/m.svg +27 -0
  297. package/fonts/italianno/svg/m.tsx +29 -0
  298. package/fonts/italianno/svg/n.svg +22 -0
  299. package/fonts/italianno/svg/n.tsx +24 -0
  300. package/fonts/italianno/svg/o.svg +20 -0
  301. package/fonts/italianno/svg/o.tsx +22 -0
  302. package/fonts/italianno/svg/p.svg +12 -0
  303. package/fonts/italianno/svg/p.tsx +14 -0
  304. package/fonts/italianno/svg/q.svg +17 -0
  305. package/fonts/italianno/svg/q.tsx +19 -0
  306. package/fonts/italianno/svg/r.svg +22 -0
  307. package/fonts/italianno/svg/r.tsx +24 -0
  308. package/fonts/italianno/svg/s.svg +15 -0
  309. package/fonts/italianno/svg/s.tsx +17 -0
  310. package/fonts/italianno/svg/t.svg +17 -0
  311. package/fonts/italianno/svg/t.tsx +19 -0
  312. package/fonts/italianno/svg/u.svg +12 -0
  313. package/fonts/italianno/svg/u.tsx +14 -0
  314. package/fonts/italianno/svg/upper_A.svg +17 -0
  315. package/fonts/italianno/svg/upper_A.tsx +19 -0
  316. package/fonts/italianno/svg/upper_B.svg +27 -0
  317. package/fonts/italianno/svg/upper_B.tsx +29 -0
  318. package/fonts/italianno/svg/upper_C.svg +7 -0
  319. package/fonts/italianno/svg/upper_C.tsx +9 -0
  320. package/fonts/italianno/svg/upper_D.svg +12 -0
  321. package/fonts/italianno/svg/upper_D.tsx +14 -0
  322. package/fonts/italianno/svg/upper_E.svg +17 -0
  323. package/fonts/italianno/svg/upper_E.tsx +19 -0
  324. package/fonts/italianno/svg/upper_F.svg +17 -0
  325. package/fonts/italianno/svg/upper_F.tsx +19 -0
  326. package/fonts/italianno/svg/upper_G.svg +20 -0
  327. package/fonts/italianno/svg/upper_G.tsx +22 -0
  328. package/fonts/italianno/svg/upper_H.svg +17 -0
  329. package/fonts/italianno/svg/upper_H.tsx +19 -0
  330. package/fonts/italianno/svg/upper_I.svg +12 -0
  331. package/fonts/italianno/svg/upper_I.tsx +14 -0
  332. package/fonts/italianno/svg/upper_J.svg +10 -0
  333. package/fonts/italianno/svg/upper_J.tsx +12 -0
  334. package/fonts/italianno/svg/upper_K.svg +20 -0
  335. package/fonts/italianno/svg/upper_K.tsx +22 -0
  336. package/fonts/italianno/svg/upper_L.svg +12 -0
  337. package/fonts/italianno/svg/upper_L.tsx +14 -0
  338. package/fonts/italianno/svg/upper_M.svg +17 -0
  339. package/fonts/italianno/svg/upper_M.tsx +19 -0
  340. package/fonts/italianno/svg/upper_N.svg +17 -0
  341. package/fonts/italianno/svg/upper_N.tsx +19 -0
  342. package/fonts/italianno/svg/upper_O.svg +17 -0
  343. package/fonts/italianno/svg/upper_O.tsx +19 -0
  344. package/fonts/italianno/svg/upper_P.svg +22 -0
  345. package/fonts/italianno/svg/upper_P.tsx +24 -0
  346. package/fonts/italianno/svg/upper_Q.svg +12 -0
  347. package/fonts/italianno/svg/upper_Q.tsx +14 -0
  348. package/fonts/italianno/svg/upper_R.svg +15 -0
  349. package/fonts/italianno/svg/upper_R.tsx +17 -0
  350. package/fonts/italianno/svg/upper_S.svg +12 -0
  351. package/fonts/italianno/svg/upper_S.tsx +14 -0
  352. package/fonts/italianno/svg/upper_T.svg +17 -0
  353. package/fonts/italianno/svg/upper_T.tsx +19 -0
  354. package/fonts/italianno/svg/upper_U.svg +17 -0
  355. package/fonts/italianno/svg/upper_U.tsx +19 -0
  356. package/fonts/italianno/svg/upper_V.svg +17 -0
  357. package/fonts/italianno/svg/upper_V.tsx +19 -0
  358. package/fonts/italianno/svg/upper_W.svg +17 -0
  359. package/fonts/italianno/svg/upper_W.tsx +19 -0
  360. package/fonts/italianno/svg/upper_X.svg +22 -0
  361. package/fonts/italianno/svg/upper_X.tsx +24 -0
  362. package/fonts/italianno/svg/upper_Y.svg +22 -0
  363. package/fonts/italianno/svg/upper_Y.tsx +24 -0
  364. package/fonts/italianno/svg/upper_Z.svg +12 -0
  365. package/fonts/italianno/svg/upper_Z.tsx +14 -0
  366. package/fonts/italianno/svg/v.svg +17 -0
  367. package/fonts/italianno/svg/v.tsx +19 -0
  368. package/fonts/italianno/svg/w.svg +17 -0
  369. package/fonts/italianno/svg/w.tsx +19 -0
  370. package/fonts/italianno/svg/x.svg +15 -0
  371. package/fonts/italianno/svg/x.tsx +17 -0
  372. package/fonts/italianno/svg/y.svg +12 -0
  373. package/fonts/italianno/svg/y.tsx +14 -0
  374. package/fonts/italianno/svg/z.svg +17 -0
  375. package/fonts/italianno/svg/z.tsx +19 -0
  376. package/fonts/parisienne/bundle.ts +300 -0
  377. package/fonts/parisienne/font.json +36222 -0
  378. package/fonts/parisienne/glyphData.json +1 -0
  379. package/fonts/parisienne/parisienne.ttf +0 -0
  380. package/fonts/parisienne/svg/0.svg +7 -0
  381. package/fonts/parisienne/svg/0.tsx +9 -0
  382. package/fonts/parisienne/svg/1.svg +12 -0
  383. package/fonts/parisienne/svg/1.tsx +14 -0
  384. package/fonts/parisienne/svg/2.svg +7 -0
  385. package/fonts/parisienne/svg/2.tsx +9 -0
  386. package/fonts/parisienne/svg/3.svg +7 -0
  387. package/fonts/parisienne/svg/3.tsx +9 -0
  388. package/fonts/parisienne/svg/4.svg +17 -0
  389. package/fonts/parisienne/svg/4.tsx +19 -0
  390. package/fonts/parisienne/svg/5.svg +10 -0
  391. package/fonts/parisienne/svg/5.tsx +12 -0
  392. package/fonts/parisienne/svg/6.svg +7 -0
  393. package/fonts/parisienne/svg/6.tsx +9 -0
  394. package/fonts/parisienne/svg/7.svg +12 -0
  395. package/fonts/parisienne/svg/7.tsx +14 -0
  396. package/fonts/parisienne/svg/8.svg +7 -0
  397. package/fonts/parisienne/svg/8.tsx +9 -0
  398. package/fonts/parisienne/svg/9.svg +7 -0
  399. package/fonts/parisienne/svg/9.tsx +9 -0
  400. package/fonts/parisienne/svg/U+0021.svg +10 -0
  401. package/fonts/parisienne/svg/U+0021.tsx +12 -0
  402. package/fonts/parisienne/svg/U+0022.svg +12 -0
  403. package/fonts/parisienne/svg/U+0022.tsx +14 -0
  404. package/fonts/parisienne/svg/U+0023.svg +22 -0
  405. package/fonts/parisienne/svg/U+0023.tsx +24 -0
  406. package/fonts/parisienne/svg/U+0024.svg +15 -0
  407. package/fonts/parisienne/svg/U+0024.tsx +17 -0
  408. package/fonts/parisienne/svg/U+0025.svg +22 -0
  409. package/fonts/parisienne/svg/U+0025.tsx +24 -0
  410. package/fonts/parisienne/svg/U+0026.svg +17 -0
  411. package/fonts/parisienne/svg/U+0026.tsx +19 -0
  412. package/fonts/parisienne/svg/U+0027.svg +7 -0
  413. package/fonts/parisienne/svg/U+0027.tsx +9 -0
  414. package/fonts/parisienne/svg/U+0028.svg +7 -0
  415. package/fonts/parisienne/svg/U+0028.tsx +9 -0
  416. package/fonts/parisienne/svg/U+0029.svg +7 -0
  417. package/fonts/parisienne/svg/U+0029.tsx +9 -0
  418. package/fonts/parisienne/svg/U+002a.svg +22 -0
  419. package/fonts/parisienne/svg/U+002a.tsx +24 -0
  420. package/fonts/parisienne/svg/U+002b.svg +12 -0
  421. package/fonts/parisienne/svg/U+002b.tsx +14 -0
  422. package/fonts/parisienne/svg/U+002c.svg +7 -0
  423. package/fonts/parisienne/svg/U+002c.tsx +9 -0
  424. package/fonts/parisienne/svg/U+002d.svg +7 -0
  425. package/fonts/parisienne/svg/U+002d.tsx +9 -0
  426. package/fonts/parisienne/svg/U+002e.svg +7 -0
  427. package/fonts/parisienne/svg/U+002e.tsx +9 -0
  428. package/fonts/parisienne/svg/U+002f.svg +7 -0
  429. package/fonts/parisienne/svg/U+002f.tsx +9 -0
  430. package/fonts/parisienne/svg/U+003a.svg +8 -0
  431. package/fonts/parisienne/svg/U+003a.tsx +10 -0
  432. package/fonts/parisienne/svg/U+003b.svg +10 -0
  433. package/fonts/parisienne/svg/U+003b.tsx +12 -0
  434. package/fonts/parisienne/svg/U+003c.svg +7 -0
  435. package/fonts/parisienne/svg/U+003c.tsx +9 -0
  436. package/fonts/parisienne/svg/U+003d.svg +12 -0
  437. package/fonts/parisienne/svg/U+003d.tsx +14 -0
  438. package/fonts/parisienne/svg/U+003e.svg +7 -0
  439. package/fonts/parisienne/svg/U+003e.tsx +9 -0
  440. package/fonts/parisienne/svg/U+003f.svg +10 -0
  441. package/fonts/parisienne/svg/U+003f.tsx +12 -0
  442. package/fonts/parisienne/svg/U+0040.svg +15 -0
  443. package/fonts/parisienne/svg/U+0040.tsx +17 -0
  444. package/fonts/parisienne/svg/U+005c.svg +7 -0
  445. package/fonts/parisienne/svg/U+005c.tsx +9 -0
  446. package/fonts/parisienne/svg/U+005e.svg +7 -0
  447. package/fonts/parisienne/svg/U+005e.tsx +9 -0
  448. package/fonts/parisienne/svg/U+005f.svg +7 -0
  449. package/fonts/parisienne/svg/U+005f.tsx +9 -0
  450. package/fonts/parisienne/svg/U+0060.svg +10 -0
  451. package/fonts/parisienne/svg/U+0060.tsx +12 -0
  452. package/fonts/parisienne/svg/U+007c.svg +7 -0
  453. package/fonts/parisienne/svg/U+007c.tsx +9 -0
  454. package/fonts/parisienne/svg/U+007e.svg +7 -0
  455. package/fonts/parisienne/svg/U+007e.tsx +9 -0
  456. package/fonts/parisienne/svg/a.svg +15 -0
  457. package/fonts/parisienne/svg/a.tsx +17 -0
  458. package/fonts/parisienne/svg/b.svg +7 -0
  459. package/fonts/parisienne/svg/b.tsx +9 -0
  460. package/fonts/parisienne/svg/c.svg +12 -0
  461. package/fonts/parisienne/svg/c.tsx +14 -0
  462. package/fonts/parisienne/svg/d.svg +12 -0
  463. package/fonts/parisienne/svg/d.tsx +14 -0
  464. package/fonts/parisienne/svg/e.svg +17 -0
  465. package/fonts/parisienne/svg/e.tsx +19 -0
  466. package/fonts/parisienne/svg/f.svg +12 -0
  467. package/fonts/parisienne/svg/f.tsx +14 -0
  468. package/fonts/parisienne/svg/g.svg +10 -0
  469. package/fonts/parisienne/svg/g.tsx +12 -0
  470. package/fonts/parisienne/svg/h.svg +12 -0
  471. package/fonts/parisienne/svg/h.tsx +14 -0
  472. package/fonts/parisienne/svg/i.svg +12 -0
  473. package/fonts/parisienne/svg/i.tsx +14 -0
  474. package/fonts/parisienne/svg/j.svg +17 -0
  475. package/fonts/parisienne/svg/j.tsx +19 -0
  476. package/fonts/parisienne/svg/k.svg +17 -0
  477. package/fonts/parisienne/svg/k.tsx +19 -0
  478. package/fonts/parisienne/svg/l.svg +7 -0
  479. package/fonts/parisienne/svg/l.tsx +9 -0
  480. package/fonts/parisienne/svg/m.svg +17 -0
  481. package/fonts/parisienne/svg/m.tsx +19 -0
  482. package/fonts/parisienne/svg/n.svg +12 -0
  483. package/fonts/parisienne/svg/n.tsx +14 -0
  484. package/fonts/parisienne/svg/o.svg +15 -0
  485. package/fonts/parisienne/svg/o.tsx +17 -0
  486. package/fonts/parisienne/svg/p.svg +12 -0
  487. package/fonts/parisienne/svg/p.tsx +14 -0
  488. package/fonts/parisienne/svg/q.svg +12 -0
  489. package/fonts/parisienne/svg/q.tsx +14 -0
  490. package/fonts/parisienne/svg/r.svg +7 -0
  491. package/fonts/parisienne/svg/r.tsx +9 -0
  492. package/fonts/parisienne/svg/s.svg +17 -0
  493. package/fonts/parisienne/svg/s.tsx +19 -0
  494. package/fonts/parisienne/svg/t.svg +20 -0
  495. package/fonts/parisienne/svg/t.tsx +22 -0
  496. package/fonts/parisienne/svg/u.svg +12 -0
  497. package/fonts/parisienne/svg/u.tsx +14 -0
  498. package/fonts/parisienne/svg/upper_A.svg +10 -0
  499. package/fonts/parisienne/svg/upper_A.tsx +12 -0
  500. package/fonts/parisienne/svg/upper_B.svg +12 -0
  501. package/fonts/parisienne/svg/upper_B.tsx +14 -0
  502. package/fonts/parisienne/svg/upper_C.svg +7 -0
  503. package/fonts/parisienne/svg/upper_C.tsx +9 -0
  504. package/fonts/parisienne/svg/upper_D.svg +7 -0
  505. package/fonts/parisienne/svg/upper_D.tsx +9 -0
  506. package/fonts/parisienne/svg/upper_E.svg +10 -0
  507. package/fonts/parisienne/svg/upper_E.tsx +12 -0
  508. package/fonts/parisienne/svg/upper_F.svg +22 -0
  509. package/fonts/parisienne/svg/upper_F.tsx +24 -0
  510. package/fonts/parisienne/svg/upper_G.svg +15 -0
  511. package/fonts/parisienne/svg/upper_G.tsx +17 -0
  512. package/fonts/parisienne/svg/upper_H.svg +15 -0
  513. package/fonts/parisienne/svg/upper_H.tsx +17 -0
  514. package/fonts/parisienne/svg/upper_I.svg +15 -0
  515. package/fonts/parisienne/svg/upper_I.tsx +17 -0
  516. package/fonts/parisienne/svg/upper_J.svg +15 -0
  517. package/fonts/parisienne/svg/upper_J.tsx +17 -0
  518. package/fonts/parisienne/svg/upper_K.svg +12 -0
  519. package/fonts/parisienne/svg/upper_K.tsx +14 -0
  520. package/fonts/parisienne/svg/upper_L.svg +7 -0
  521. package/fonts/parisienne/svg/upper_L.tsx +9 -0
  522. package/fonts/parisienne/svg/upper_M.svg +15 -0
  523. package/fonts/parisienne/svg/upper_M.tsx +17 -0
  524. package/fonts/parisienne/svg/upper_N.svg +12 -0
  525. package/fonts/parisienne/svg/upper_N.tsx +14 -0
  526. package/fonts/parisienne/svg/upper_O.svg +7 -0
  527. package/fonts/parisienne/svg/upper_O.tsx +9 -0
  528. package/fonts/parisienne/svg/upper_P.svg +12 -0
  529. package/fonts/parisienne/svg/upper_P.tsx +14 -0
  530. package/fonts/parisienne/svg/upper_Q.svg +15 -0
  531. package/fonts/parisienne/svg/upper_Q.tsx +17 -0
  532. package/fonts/parisienne/svg/upper_R.svg +12 -0
  533. package/fonts/parisienne/svg/upper_R.tsx +14 -0
  534. package/fonts/parisienne/svg/upper_S.svg +7 -0
  535. package/fonts/parisienne/svg/upper_S.tsx +9 -0
  536. package/fonts/parisienne/svg/upper_T.svg +12 -0
  537. package/fonts/parisienne/svg/upper_T.tsx +14 -0
  538. package/fonts/parisienne/svg/upper_U.svg +17 -0
  539. package/fonts/parisienne/svg/upper_U.tsx +19 -0
  540. package/fonts/parisienne/svg/upper_V.svg +7 -0
  541. package/fonts/parisienne/svg/upper_V.tsx +9 -0
  542. package/fonts/parisienne/svg/upper_W.svg +12 -0
  543. package/fonts/parisienne/svg/upper_W.tsx +14 -0
  544. package/fonts/parisienne/svg/upper_X.svg +27 -0
  545. package/fonts/parisienne/svg/upper_X.tsx +29 -0
  546. package/fonts/parisienne/svg/upper_Y.svg +15 -0
  547. package/fonts/parisienne/svg/upper_Y.tsx +17 -0
  548. package/fonts/parisienne/svg/upper_Z.svg +12 -0
  549. package/fonts/parisienne/svg/upper_Z.tsx +14 -0
  550. package/fonts/parisienne/svg/v.svg +7 -0
  551. package/fonts/parisienne/svg/v.tsx +9 -0
  552. package/fonts/parisienne/svg/w.svg +17 -0
  553. package/fonts/parisienne/svg/w.tsx +19 -0
  554. package/fonts/parisienne/svg/x.svg +17 -0
  555. package/fonts/parisienne/svg/x.tsx +19 -0
  556. package/fonts/parisienne/svg/y.svg +17 -0
  557. package/fonts/parisienne/svg/y.tsx +19 -0
  558. package/fonts/parisienne/svg/z.svg +12 -0
  559. package/fonts/parisienne/svg/z.tsx +14 -0
  560. package/fonts/tangerine/bundle.ts +300 -0
  561. package/fonts/tangerine/font.json +31512 -0
  562. package/fonts/tangerine/glyphData.json +1 -0
  563. package/fonts/tangerine/svg/0.svg +7 -0
  564. package/fonts/tangerine/svg/0.tsx +9 -0
  565. package/fonts/tangerine/svg/1.svg +12 -0
  566. package/fonts/tangerine/svg/1.tsx +14 -0
  567. package/fonts/tangerine/svg/2.svg +12 -0
  568. package/fonts/tangerine/svg/2.tsx +14 -0
  569. package/fonts/tangerine/svg/3.svg +12 -0
  570. package/fonts/tangerine/svg/3.tsx +14 -0
  571. package/fonts/tangerine/svg/4.svg +12 -0
  572. package/fonts/tangerine/svg/4.tsx +14 -0
  573. package/fonts/tangerine/svg/5.svg +7 -0
  574. package/fonts/tangerine/svg/5.tsx +9 -0
  575. package/fonts/tangerine/svg/6.svg +7 -0
  576. package/fonts/tangerine/svg/6.tsx +9 -0
  577. package/fonts/tangerine/svg/7.svg +12 -0
  578. package/fonts/tangerine/svg/7.tsx +14 -0
  579. package/fonts/tangerine/svg/8.svg +7 -0
  580. package/fonts/tangerine/svg/8.tsx +9 -0
  581. package/fonts/tangerine/svg/9.svg +7 -0
  582. package/fonts/tangerine/svg/9.tsx +9 -0
  583. package/fonts/tangerine/svg/U+0021.svg +12 -0
  584. package/fonts/tangerine/svg/U+0021.tsx +14 -0
  585. package/fonts/tangerine/svg/U+0022.svg +12 -0
  586. package/fonts/tangerine/svg/U+0022.tsx +14 -0
  587. package/fonts/tangerine/svg/U+0023.svg +22 -0
  588. package/fonts/tangerine/svg/U+0023.tsx +24 -0
  589. package/fonts/tangerine/svg/U+0024.svg +12 -0
  590. package/fonts/tangerine/svg/U+0024.tsx +14 -0
  591. package/fonts/tangerine/svg/U+0025.svg +17 -0
  592. package/fonts/tangerine/svg/U+0025.tsx +19 -0
  593. package/fonts/tangerine/svg/U+0026.svg +7 -0
  594. package/fonts/tangerine/svg/U+0026.tsx +9 -0
  595. package/fonts/tangerine/svg/U+0027.svg +7 -0
  596. package/fonts/tangerine/svg/U+0027.tsx +9 -0
  597. package/fonts/tangerine/svg/U+0028.svg +7 -0
  598. package/fonts/tangerine/svg/U+0028.tsx +9 -0
  599. package/fonts/tangerine/svg/U+0029.svg +7 -0
  600. package/fonts/tangerine/svg/U+0029.tsx +9 -0
  601. package/fonts/tangerine/svg/U+002a.svg +17 -0
  602. package/fonts/tangerine/svg/U+002a.tsx +19 -0
  603. package/fonts/tangerine/svg/U+002b.svg +12 -0
  604. package/fonts/tangerine/svg/U+002b.tsx +14 -0
  605. package/fonts/tangerine/svg/U+002c.svg +10 -0
  606. package/fonts/tangerine/svg/U+002c.tsx +12 -0
  607. package/fonts/tangerine/svg/U+002d.svg +7 -0
  608. package/fonts/tangerine/svg/U+002d.tsx +9 -0
  609. package/fonts/tangerine/svg/U+002e.svg +10 -0
  610. package/fonts/tangerine/svg/U+002e.tsx +12 -0
  611. package/fonts/tangerine/svg/U+002f.svg +7 -0
  612. package/fonts/tangerine/svg/U+002f.tsx +9 -0
  613. package/fonts/tangerine/svg/U+003a.svg +12 -0
  614. package/fonts/tangerine/svg/U+003a.tsx +14 -0
  615. package/fonts/tangerine/svg/U+003b.svg +12 -0
  616. package/fonts/tangerine/svg/U+003b.tsx +14 -0
  617. package/fonts/tangerine/svg/U+003c.svg +12 -0
  618. package/fonts/tangerine/svg/U+003c.tsx +14 -0
  619. package/fonts/tangerine/svg/U+003d.svg +12 -0
  620. package/fonts/tangerine/svg/U+003d.tsx +14 -0
  621. package/fonts/tangerine/svg/U+003e.svg +12 -0
  622. package/fonts/tangerine/svg/U+003e.tsx +14 -0
  623. package/fonts/tangerine/svg/U+003f.svg +12 -0
  624. package/fonts/tangerine/svg/U+003f.tsx +14 -0
  625. package/fonts/tangerine/svg/U+0040.svg +15 -0
  626. package/fonts/tangerine/svg/U+0040.tsx +17 -0
  627. package/fonts/tangerine/svg/U+005c.svg +7 -0
  628. package/fonts/tangerine/svg/U+005c.tsx +9 -0
  629. package/fonts/tangerine/svg/U+005e.svg +12 -0
  630. package/fonts/tangerine/svg/U+005e.tsx +14 -0
  631. package/fonts/tangerine/svg/U+005f.svg +7 -0
  632. package/fonts/tangerine/svg/U+005f.tsx +9 -0
  633. package/fonts/tangerine/svg/U+0060.svg +7 -0
  634. package/fonts/tangerine/svg/U+0060.tsx +9 -0
  635. package/fonts/tangerine/svg/U+007c.svg +7 -0
  636. package/fonts/tangerine/svg/U+007c.tsx +9 -0
  637. package/fonts/tangerine/svg/U+007e.svg +7 -0
  638. package/fonts/tangerine/svg/U+007e.tsx +9 -0
  639. package/fonts/tangerine/svg/a.svg +12 -0
  640. package/fonts/tangerine/svg/a.tsx +14 -0
  641. package/fonts/tangerine/svg/b.svg +7 -0
  642. package/fonts/tangerine/svg/b.tsx +9 -0
  643. package/fonts/tangerine/svg/c.svg +7 -0
  644. package/fonts/tangerine/svg/c.tsx +9 -0
  645. package/fonts/tangerine/svg/d.svg +12 -0
  646. package/fonts/tangerine/svg/d.tsx +14 -0
  647. package/fonts/tangerine/svg/e.svg +15 -0
  648. package/fonts/tangerine/svg/e.tsx +17 -0
  649. package/fonts/tangerine/svg/f.svg +15 -0
  650. package/fonts/tangerine/svg/f.tsx +17 -0
  651. package/fonts/tangerine/svg/g.svg +12 -0
  652. package/fonts/tangerine/svg/g.tsx +14 -0
  653. package/fonts/tangerine/svg/h.svg +12 -0
  654. package/fonts/tangerine/svg/h.tsx +14 -0
  655. package/fonts/tangerine/svg/i.svg +15 -0
  656. package/fonts/tangerine/svg/i.tsx +17 -0
  657. package/fonts/tangerine/svg/j.svg +12 -0
  658. package/fonts/tangerine/svg/j.tsx +14 -0
  659. package/fonts/tangerine/svg/k.svg +12 -0
  660. package/fonts/tangerine/svg/k.tsx +14 -0
  661. package/fonts/tangerine/svg/l.svg +7 -0
  662. package/fonts/tangerine/svg/l.tsx +9 -0
  663. package/fonts/tangerine/svg/m.svg +17 -0
  664. package/fonts/tangerine/svg/m.tsx +19 -0
  665. package/fonts/tangerine/svg/n.svg +12 -0
  666. package/fonts/tangerine/svg/n.tsx +14 -0
  667. package/fonts/tangerine/svg/o.svg +12 -0
  668. package/fonts/tangerine/svg/o.tsx +14 -0
  669. package/fonts/tangerine/svg/p.svg +17 -0
  670. package/fonts/tangerine/svg/p.tsx +19 -0
  671. package/fonts/tangerine/svg/q.svg +15 -0
  672. package/fonts/tangerine/svg/q.tsx +17 -0
  673. package/fonts/tangerine/svg/r.svg +17 -0
  674. package/fonts/tangerine/svg/r.tsx +19 -0
  675. package/fonts/tangerine/svg/s.svg +10 -0
  676. package/fonts/tangerine/svg/s.tsx +12 -0
  677. package/fonts/tangerine/svg/t.svg +17 -0
  678. package/fonts/tangerine/svg/t.tsx +19 -0
  679. package/fonts/tangerine/svg/u.svg +17 -0
  680. package/fonts/tangerine/svg/u.tsx +19 -0
  681. package/fonts/tangerine/svg/upper_A.svg +20 -0
  682. package/fonts/tangerine/svg/upper_A.tsx +22 -0
  683. package/fonts/tangerine/svg/upper_B.svg +17 -0
  684. package/fonts/tangerine/svg/upper_B.tsx +19 -0
  685. package/fonts/tangerine/svg/upper_C.svg +7 -0
  686. package/fonts/tangerine/svg/upper_C.tsx +9 -0
  687. package/fonts/tangerine/svg/upper_D.svg +12 -0
  688. package/fonts/tangerine/svg/upper_D.tsx +14 -0
  689. package/fonts/tangerine/svg/upper_E.svg +7 -0
  690. package/fonts/tangerine/svg/upper_E.tsx +9 -0
  691. package/fonts/tangerine/svg/upper_F.svg +17 -0
  692. package/fonts/tangerine/svg/upper_F.tsx +19 -0
  693. package/fonts/tangerine/svg/upper_G.svg +12 -0
  694. package/fonts/tangerine/svg/upper_G.tsx +14 -0
  695. package/fonts/tangerine/svg/upper_H.svg +12 -0
  696. package/fonts/tangerine/svg/upper_H.tsx +14 -0
  697. package/fonts/tangerine/svg/upper_I.svg +7 -0
  698. package/fonts/tangerine/svg/upper_I.tsx +9 -0
  699. package/fonts/tangerine/svg/upper_J.svg +7 -0
  700. package/fonts/tangerine/svg/upper_J.tsx +9 -0
  701. package/fonts/tangerine/svg/upper_K.svg +17 -0
  702. package/fonts/tangerine/svg/upper_K.tsx +19 -0
  703. package/fonts/tangerine/svg/upper_L.svg +7 -0
  704. package/fonts/tangerine/svg/upper_L.tsx +9 -0
  705. package/fonts/tangerine/svg/upper_M.svg +12 -0
  706. package/fonts/tangerine/svg/upper_M.tsx +14 -0
  707. package/fonts/tangerine/svg/upper_N.svg +15 -0
  708. package/fonts/tangerine/svg/upper_N.tsx +17 -0
  709. package/fonts/tangerine/svg/upper_O.svg +7 -0
  710. package/fonts/tangerine/svg/upper_O.tsx +9 -0
  711. package/fonts/tangerine/svg/upper_P.svg +12 -0
  712. package/fonts/tangerine/svg/upper_P.tsx +14 -0
  713. package/fonts/tangerine/svg/upper_Q.svg +12 -0
  714. package/fonts/tangerine/svg/upper_Q.tsx +14 -0
  715. package/fonts/tangerine/svg/upper_R.svg +12 -0
  716. package/fonts/tangerine/svg/upper_R.tsx +14 -0
  717. package/fonts/tangerine/svg/upper_S.svg +7 -0
  718. package/fonts/tangerine/svg/upper_S.tsx +9 -0
  719. package/fonts/tangerine/svg/upper_T.svg +7 -0
  720. package/fonts/tangerine/svg/upper_T.tsx +9 -0
  721. package/fonts/tangerine/svg/upper_U.svg +12 -0
  722. package/fonts/tangerine/svg/upper_U.tsx +14 -0
  723. package/fonts/tangerine/svg/upper_V.svg +12 -0
  724. package/fonts/tangerine/svg/upper_V.tsx +14 -0
  725. package/fonts/tangerine/svg/upper_W.svg +17 -0
  726. package/fonts/tangerine/svg/upper_W.tsx +19 -0
  727. package/fonts/tangerine/svg/upper_X.svg +12 -0
  728. package/fonts/tangerine/svg/upper_X.tsx +14 -0
  729. package/fonts/tangerine/svg/upper_Y.svg +12 -0
  730. package/fonts/tangerine/svg/upper_Y.tsx +14 -0
  731. package/fonts/tangerine/svg/upper_Z.svg +17 -0
  732. package/fonts/tangerine/svg/upper_Z.tsx +19 -0
  733. package/fonts/tangerine/svg/v.svg +12 -0
  734. package/fonts/tangerine/svg/v.tsx +14 -0
  735. package/fonts/tangerine/svg/w.svg +25 -0
  736. package/fonts/tangerine/svg/w.tsx +27 -0
  737. package/fonts/tangerine/svg/x.svg +17 -0
  738. package/fonts/tangerine/svg/x.tsx +19 -0
  739. package/fonts/tangerine/svg/y.svg +12 -0
  740. package/fonts/tangerine/svg/y.tsx +14 -0
  741. package/fonts/tangerine/svg/z.svg +20 -0
  742. package/fonts/tangerine/svg/z.tsx +22 -0
  743. package/fonts/tangerine/tangerine.ttf +0 -0
  744. package/package.json +64 -6
  745. package/src/env.d.ts +10 -0
  746. package/src/index.ts +10 -0
  747. package/src/lib/TegakiRenderer.tsx +611 -0
  748. package/src/lib/drawFallbackGlyph.ts +70 -0
  749. package/src/lib/drawGlyph.ts +374 -0
  750. package/src/lib/effects.ts +56 -0
  751. package/src/lib/textLayout.ts +114 -0
  752. package/src/lib/timeline.ts +65 -0
  753. package/src/lib/utils.ts +22 -0
  754. package/src/types.test.ts +92 -0
  755. package/src/types.ts +114 -0
  756. package/index.js +0 -1
@@ -0,0 +1,611 @@
1
+ import { type ComponentProps, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
2
+ import type { TegakiBundle, TegakiEffects } from '../types.ts';
3
+ import { drawFallbackGlyph } from './drawFallbackGlyph.ts';
4
+ import { drawGlyph } from './drawGlyph.ts';
5
+ import { resolveEffects } from './effects.ts';
6
+ import { computeTextLayout } from './textLayout.ts';
7
+ import type { TimelineConfig, TimelineEntry } from './timeline.ts';
8
+ import { computeTimeline } from './timeline.ts';
9
+ import type { Coercible } from './utils.ts';
10
+ import { coerceToString, graphemes } from './utils.ts';
11
+
12
+ const PADDING_H_EM = 0.2;
13
+ const MIN_LINE_HEIGHT_EM = 1.8;
14
+ const MIN_PADDING_V_EM = 0.2;
15
+
16
+ // --- CSS custom property names ---
17
+
18
+ const CSS_TIME = '--tegaki-time';
19
+ const CSS_PROGRESS = '--tegaki-progress';
20
+ const CSS_DURATION = '--tegaki-duration';
21
+
22
+ // 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.
30
+ }
31
+ }
32
+ }
33
+
34
+ export type TimeControlMode = {
35
+ controlled: {
36
+ mode: 'controlled';
37
+ /** Current time in seconds. */
38
+ value: number;
39
+ };
40
+ uncontrolled: {
41
+ mode: 'uncontrolled';
42
+ /** Initial time in seconds. Default: `0` */
43
+ initialTime?: number;
44
+ /** Playback speed multiplier. Default: `1` */
45
+ speed?: number;
46
+ /** Whether animation is playing. Default: `true` */
47
+ playing?: boolean;
48
+ /** Loop animation when it reaches the end. Default: `false` */
49
+ loop?: boolean;
50
+ /**
51
+ * Catch-up strength. When positive, playback speeds up when there is a
52
+ * large amount of remaining animation and decays back to normal gradually.
53
+ * `0` disables catch-up (default). Higher values ramp up more aggressively.
54
+ * Typical range: `0.2` – `2`.
55
+ */
56
+ catchUp?: number;
57
+ /** Called on every frame with the current time. */
58
+ onTimeChange?: (time: number) => void;
59
+ };
60
+ css: {
61
+ mode: 'css';
62
+ };
63
+ };
64
+
65
+ /**
66
+ * A plain number is shorthand for `{ mode: 'controlled', value: number }`.
67
+ * `'css'` is shorthand for `{ mode: 'css' }`.
68
+ * Omit for uncontrolled mode with default settings.
69
+ */
70
+ export type TimeControlProp = null | undefined | number | 'css' | TimeControlMode[keyof TimeControlMode];
71
+
72
+ export interface TegakiRendererProps<E extends TegakiEffects<E> = Record<string, never>> extends Omit<ComponentProps<'div'>, 'children'> {
73
+ /** TegakiBundle with font data and animated glyph SVGs. */
74
+ font?: TegakiBundle;
75
+
76
+ /** Text to animate. Takes precedence over children. */
77
+ text?: string;
78
+
79
+ /** Children coerced to string. Strings and numbers are kept; everything else is ignored. */
80
+ children?: Coercible;
81
+
82
+ /**
83
+ * Time control. Accepts a number (controlled shorthand), or an object
84
+ * specifying the mode (`'controlled'`, `'uncontrolled'`, or `'css'`).
85
+ * Omit for uncontrolled playback with default settings.
86
+ */
87
+ time?: TimeControlProp;
88
+
89
+ /** Called once when the animation reaches the end of the timeline. */
90
+ onComplete?: () => void;
91
+
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
+ /** Visual effects applied during canvas rendering. */
97
+ effects?: E;
98
+
99
+ /** Maximum segment size in pixels for effect subdivision. Lower values produce
100
+ * smoother effects but cost more to render. Default: `2` */
101
+ segmentSize?: number;
102
+
103
+ /** Timeline timing configuration (gap between glyphs, words, lines, etc.). */
104
+ timing?: TimelineConfig;
105
+
106
+ /** Show debug text overlay. */
107
+ showOverlay?: boolean;
108
+ }
109
+
110
+ // --- Component ---
111
+
112
+ export function TegakiRenderer<const E extends TegakiEffects<E> = Record<string, never>>({
113
+ font,
114
+ text,
115
+ children,
116
+ time: timeProp,
117
+ onComplete,
118
+ mode = 'canvas',
119
+ effects,
120
+ segmentSize,
121
+ timing,
122
+ showOverlay,
123
+ ...props
124
+ }: TegakiRendererProps<E>) {
125
+ const resolvedText = text ?? coerceToString(children);
126
+
127
+ // --- Resolve effects ---
128
+ const resolvedEffects = useMemo(() => resolveEffects(effects as Record<string, any>), [effects]);
129
+ const [seed] = useState(() => Math.random() * 1000);
130
+
131
+ // --- Resolve time control ---
132
+ const timeControl: TimeControlMode[keyof TimeControlMode] =
133
+ timeProp == null
134
+ ? { mode: 'uncontrolled' }
135
+ : typeof timeProp === 'number'
136
+ ? { mode: 'controlled', value: timeProp }
137
+ : timeProp === 'css'
138
+ ? { mode: 'css' }
139
+ : timeProp;
140
+
141
+ const isCss = timeControl.mode === 'css';
142
+ const isControlled = timeControl.mode === 'controlled' || isCss;
143
+ const controlledTime = timeControl.mode === 'controlled' ? timeControl.value : undefined;
144
+ const defaultTime = timeControl.mode === 'uncontrolled' ? (timeControl.initialTime ?? 0) : 0;
145
+ const speed = timeControl.mode === 'uncontrolled' ? (timeControl.speed ?? 1) : 1;
146
+ const playing = timeControl.mode === 'uncontrolled' ? (timeControl.playing ?? true) : false;
147
+ const loop = timeControl.mode === 'uncontrolled' ? (timeControl.loop ?? false) : false;
148
+ const catchUp = timeControl.mode === 'uncontrolled' ? (timeControl.catchUp ?? 0) : 0;
149
+ const onTimeChange = timeControl.mode === 'uncontrolled' ? timeControl.onTimeChange : undefined;
150
+
151
+ // --- Internal time (uncontrolled mode) ---
152
+ const [internalTime, setInternalTime] = useState(defaultTime);
153
+ // --- CSS-driven time ---
154
+ const [cssTime, setCssTime] = useState(0);
155
+ const currentTime = isCss ? cssTime : isControlled ? controlledTime! : internalTime;
156
+
157
+ // Stable callback refs to avoid restarting the rAF loop
158
+ const onTimeChangeRef = useRef(onTimeChange);
159
+ onTimeChangeRef.current = onTimeChange;
160
+ const onCompleteRef = useRef(onComplete);
161
+ onCompleteRef.current = onComplete;
162
+
163
+ // --- Font loading ---
164
+ const [fontReady, setFontReady] = useState(() => !!font && document.fonts.check(`16px "${font?.family}"`));
165
+ useEffect(() => {
166
+ if (!font) {
167
+ setFontReady(false);
168
+ return;
169
+ }
170
+ // Check if the font is already loaded
171
+ if (document.fonts.check(`16px "${font.family}"`)) {
172
+ setFontReady(true);
173
+ return;
174
+ }
175
+ // New font — mark not ready and start loading
176
+ setFontReady(false);
177
+ let cancelled = false;
178
+ font.registerFontFace().then(() => {
179
+ if (!cancelled) setFontReady(true);
180
+ });
181
+ return () => {
182
+ cancelled = true;
183
+ };
184
+ }, [font]);
185
+
186
+ // --- Font-derived constants ---
187
+ const fontFamily = font?.family;
188
+ const emHeight = font ? (font.ascender - font.descender) / font.unitsPerEm : 0;
189
+ const baselineOffset = font ? font.descender / font.unitsPerEm : 0;
190
+
191
+ // --- Container measurement ---
192
+ const rootRef = useRef<HTMLDivElement>(null);
193
+ const [containerWidth, setContainerWidth] = useState(0);
194
+ const [fontSize, setFontSize] = useState(0);
195
+ const [lineHeight, setLineHeight] = useState(0);
196
+
197
+ // --- Timeline ---
198
+ const timeline = useMemo(
199
+ () => (font && resolvedText ? computeTimeline(resolvedText, font, timing) : { entries: [] as TimelineEntry[], totalDuration: 0 }),
200
+ [resolvedText, font, timing],
201
+ );
202
+
203
+ // Duration ref so the rAF loop always sees the latest value without restarting
204
+ const totalDurationRef = useRef(timeline.totalDuration);
205
+ totalDurationRef.current = timeline.totalDuration;
206
+
207
+ // Smoothed catch-up boost (raw bonus on top of base speed; attack/release smoothed)
208
+ const smoothedBoostRef = useRef(0);
209
+
210
+ // --- Completion tracking ---
211
+ const prevCompletedRef = useRef(false);
212
+ const isComplete = timeline.totalDuration > 0 && currentTime >= timeline.totalDuration;
213
+
214
+ useEffect(() => {
215
+ if (isComplete && !prevCompletedRef.current) {
216
+ prevCompletedRef.current = true;
217
+ onCompleteRef.current?.();
218
+ } else if (!isComplete) {
219
+ prevCompletedRef.current = false;
220
+ }
221
+ });
222
+
223
+ // --- Uncontrolled: time change notification ---
224
+ useEffect(() => {
225
+ if (!isControlled) {
226
+ onTimeChangeRef.current?.(internalTime);
227
+ }
228
+ }, [internalTime, isControlled]);
229
+
230
+ // --- Uncontrolled: rAF playback loop ---
231
+ useEffect(() => {
232
+ if (isControlled || !playing || !font || !fontReady) return;
233
+
234
+ // Reset smoothed boost when the loop restarts
235
+ smoothedBoostRef.current = 0;
236
+
237
+ let lastTs: number | null = null;
238
+ let raf: number;
239
+
240
+ // Catch-up smoothing rates (per-second exponential factors)
241
+ const attackRate = 4; // fast ramp-up
242
+ const releaseRate = loop ? 30 : 2; // slow decay back to base
243
+
244
+ const tick = (ts: number) => {
245
+ if (lastTs === null) lastTs = ts;
246
+ const dtSec = (ts - lastTs) / 1000;
247
+ lastTs = ts;
248
+
249
+ setInternalTime((prev: number) => {
250
+ const totalDur = totalDurationRef.current;
251
+ if (totalDur === 0 || (!loop && prev >= totalDur)) return totalDur;
252
+
253
+ // Compute effective speed with catch-up
254
+ let effectiveSpeed = speed;
255
+ if (catchUp > 0) {
256
+ const remaining = Math.max(0, totalDur - prev);
257
+ const excess = Math.max(0, remaining - 2);
258
+ const targetBoost = catchUp * excess;
259
+ const rate = targetBoost > smoothedBoostRef.current ? attackRate : releaseRate;
260
+ smoothedBoostRef.current += (targetBoost - smoothedBoostRef.current) * (1 - Math.exp(-rate * dtSec));
261
+ effectiveSpeed = speed + smoothedBoostRef.current;
262
+ }
263
+
264
+ let next = prev + dtSec * effectiveSpeed;
265
+ if (next >= totalDur) {
266
+ next = loop ? next % totalDur : totalDur;
267
+ smoothedBoostRef.current = 0; // reset boost on loop
268
+ }
269
+ return next;
270
+ });
271
+
272
+ raf = requestAnimationFrame(tick);
273
+ };
274
+
275
+ raf = requestAnimationFrame(tick);
276
+ 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
+ }
316
+
317
+ // --- Container size observation ---
318
+ useEffect(() => {
319
+ const el = rootRef.current;
320
+ if (!el) return;
321
+ const ro = new ResizeObserver(([entry]) => {
322
+ if (entry) {
323
+ setContainerWidth(entry.contentRect.width);
324
+ const styles = getComputedStyle(el);
325
+ setFontSize(Number.parseFloat(styles.fontSize));
326
+ setLineHeight(Number.parseFloat(styles.lineHeight));
327
+ }
328
+ });
329
+ ro.observe(el);
330
+ return () => ro.disconnect();
331
+ }, []);
332
+
333
+ // Sentinel element ref — a hidden child with `font-size: inherit` and a near-zero
334
+ // CSS transition. When any ancestor changes font-size, the transition fires an event
335
+ // so we can read the new value without polling getComputedStyle every render.
336
+ const sentinelRef = useRef<HTMLSpanElement>(null);
337
+ useEffect(() => {
338
+ const el = sentinelRef.current;
339
+ if (!el) return;
340
+ const onTransition = (e: TransitionEvent) => {
341
+ const styles = getComputedStyle(el);
342
+ if (e.propertyName === 'font-size' || e.propertyName === 'line-height') {
343
+ setFontSize(Number.parseFloat(styles.fontSize));
344
+ setLineHeight(Number.parseFloat(styles.lineHeight));
345
+ }
346
+ if (e.propertyName === CSS_PROGRESS) {
347
+ const rawProgress = Number(styles.getPropertyValue(CSS_PROGRESS));
348
+ setCssTime(rawProgress * totalDurationRef.current);
349
+ }
350
+ };
351
+ el.addEventListener('transitionend', onTransition);
352
+ return () => el.removeEventListener('transitionend', onTransition);
353
+ }, []);
354
+
355
+ // --- Text layout ---
356
+ const layout = useMemo(() => {
357
+ if (!fontReady || !fontFamily || !fontSize || !containerWidth || !resolvedText) return null;
358
+ return computeTextLayout(resolvedText, fontFamily, fontSize, lineHeight, containerWidth);
359
+ }, [fontReady, resolvedText, fontFamily, fontSize, lineHeight, containerWidth]);
360
+
361
+ // --- Canvas padding ---
362
+ const padH = PADDING_H_EM * fontSize;
363
+ const padV = fontSize ? Math.max(MIN_PADDING_V_EM * fontSize, (MIN_LINE_HEIGHT_EM * fontSize - lineHeight) / 2) : 0;
364
+
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
+ // --- Canvas rendering ---
382
+ const canvasRef = useRef<HTMLCanvasElement>(null);
383
+
384
+ useLayoutEffect(() => {
385
+ if (mode !== 'canvas') return;
386
+ const canvas = canvasRef.current;
387
+ if (!canvas || !font?.glyphData || !layout || !fontSize) return;
388
+
389
+ const dpr = window.devicePixelRatio || 1;
390
+ const el = rootRef.current;
391
+ if (!el) return;
392
+ const canvasRect = canvas.getBoundingClientRect();
393
+ const w = canvasRect.width;
394
+ const h = canvasRect.height;
395
+
396
+ // Resize canvas backing store if needed
397
+ const needsResize = canvas.width !== Math.round(w * dpr) || canvas.height !== Math.round(h * dpr);
398
+ if (needsResize) {
399
+ canvas.width = Math.round(w * dpr);
400
+ canvas.height = Math.round(h * dpr);
401
+ }
402
+
403
+ const ctx = canvas.getContext('2d');
404
+ if (!ctx) return;
405
+
406
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
407
+ ctx.clearRect(0, 0, w, h);
408
+ ctx.translate(padH, padV);
409
+
410
+ // Read currentColor from the container
411
+ const color = getComputedStyle(el).color;
412
+
413
+ const emHeightPx = emHeight * fontSize;
414
+ const halfLeading = (lineHeight - emHeightPx) / 2;
415
+ const characters = graphemes(resolvedText);
416
+
417
+ let y = 0;
418
+ for (const lineIndices of layout.lines) {
419
+ let x = 0;
420
+ for (const charIdx of lineIndices) {
421
+ const char = characters[charIdx]!;
422
+ if (char === '\n') continue;
423
+ const entry = timeline.entries[charIdx]!;
424
+ const charWidth = layout.charWidths[charIdx] ?? 0;
425
+ const kerning = layout.kernings[charIdx] ?? 0;
426
+ const glyph = font.glyphData[char];
427
+
428
+ if (glyph && entry.hasSvg) {
429
+ const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
430
+ const glyphY = y + halfLeading;
431
+ drawGlyph(
432
+ ctx,
433
+ glyph,
434
+ {
435
+ x,
436
+ y: glyphY,
437
+ fontSize,
438
+ unitsPerEm: font.unitsPerEm,
439
+ ascender: font.ascender,
440
+ descender: font.descender,
441
+ },
442
+ localTime,
443
+ font.lineCap,
444
+ color,
445
+ resolvedEffects,
446
+ seed + charIdx,
447
+ segmentSize,
448
+ );
449
+ } else if (!entry.hasSvg && currentTime >= entry.offset + entry.duration) {
450
+ const baseline = y + halfLeading + (font.ascender / font.unitsPerEm) * fontSize;
451
+ drawFallbackGlyph(ctx, char, x, baseline, fontSize, fontFamily!, color, resolvedEffects, seed + charIdx);
452
+ }
453
+
454
+ x += (charWidth + kerning) * fontSize;
455
+ }
456
+ y += lineHeight;
457
+ }
458
+ }, [
459
+ mode,
460
+ currentTime,
461
+ timeline,
462
+ layout,
463
+ font,
464
+ fontFamily,
465
+ fontSize,
466
+ lineHeight,
467
+ resolvedText,
468
+ emHeight,
469
+ padH,
470
+ padV,
471
+ resolvedEffects,
472
+ seed,
473
+ segmentSize,
474
+ ]);
475
+
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
+ // --- Rendering ---
532
+
533
+ if (!font || !resolvedText || !fontReady) {
534
+ return <div ref={rootRef} {...props} />;
535
+ }
536
+
537
+ return (
538
+ <div
539
+ ref={rootRef}
540
+ {...props}
541
+ style={{
542
+ ...props.style,
543
+ position: 'relative',
544
+ maxWidth: '100%',
545
+ width: 'auto',
546
+ height: 'auto',
547
+ ...{
548
+ [CSS_DURATION]: timeline.totalDuration,
549
+ [CSS_TIME]: currentTime,
550
+ [CSS_PROGRESS]: timeline.totalDuration > 0 ? currentTime / timeline.totalDuration : 0,
551
+ },
552
+ }}
553
+ >
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' ? (
572
+ <canvas
573
+ ref={canvasRef}
574
+ aria-hidden
575
+ style={{
576
+ position: 'absolute',
577
+ inset: `${-padV}px ${-padH}px`,
578
+ width: `calc(100% + ${padH * 2}px)`,
579
+ height: `calc(100% + ${padV * 2}px)`,
580
+ pointerEvents: 'none',
581
+ }}
582
+ />
583
+ ) : (
584
+ <div
585
+ style={{
586
+ position: 'absolute',
587
+ inset: 0,
588
+ pointerEvents: 'none',
589
+ fontFamily,
590
+ }}
591
+ >
592
+ {lineElements}
593
+ </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
+ </div>
609
+ </div>
610
+ );
611
+ }
@@ -0,0 +1,70 @@
1
+ import { findEffect, findEffects, type ResolvedEffect } from './effects.ts';
2
+ import { resolveCSSLength } from './utils.ts';
3
+
4
+ /**
5
+ * Draw a fallback glyph (plain text) with applicable effects (glow, gradient, wobble).
6
+ */
7
+ export function drawFallbackGlyph(
8
+ ctx: CanvasRenderingContext2D,
9
+ char: string,
10
+ x: number,
11
+ baseline: number,
12
+ fontSize: number,
13
+ fontFamily: string,
14
+ color: string,
15
+ effects: ResolvedEffect[] = [],
16
+ seed = 0,
17
+ ) {
18
+ const glowEffects = findEffects(effects, 'glow');
19
+ const wobbleEffect = findEffect(effects, 'wobble');
20
+ const gradientEffect = findEffect(effects, 'gradient');
21
+
22
+ // Wobble offsets
23
+ let dx = 0;
24
+ let dy = 0;
25
+ if (wobbleEffect) {
26
+ const amplitude = (wobbleEffect.config.amplitude ?? 1.5) * (fontSize / 100);
27
+ const frequency = wobbleEffect.config.frequency ?? 8;
28
+ dx = amplitude * Math.sin(frequency * (baseline * 0.01) + seed);
29
+ dy = amplitude * Math.cos(frequency * (x * 0.01) + seed * 1.3);
30
+ }
31
+
32
+ const drawX = x + dx;
33
+ const drawY = baseline + dy;
34
+
35
+ // Gradient / rainbow color
36
+ let fillColor = color;
37
+ if (gradientEffect) {
38
+ const colors = gradientEffect.config.colors;
39
+ if (colors === 'rainbow') {
40
+ const saturation = gradientEffect.config.saturation ?? 80;
41
+ const lightness = gradientEffect.config.lightness ?? 55;
42
+ const hue = (seed * 137.5) % 360;
43
+ fillColor = `hsl(${hue}, ${saturation}%, ${lightness}%)`;
44
+ } else if (Array.isArray(colors) && colors.length > 0) {
45
+ fillColor = colors[Math.floor(seed) % colors.length]!;
46
+ }
47
+ }
48
+
49
+ ctx.save();
50
+ ctx.font = `${fontSize}px ${fontFamily}`;
51
+ ctx.textBaseline = 'alphabetic';
52
+
53
+ // Glow passes
54
+ for (const glow of glowEffects) {
55
+ ctx.save();
56
+ ctx.shadowBlur = resolveCSSLength(glow.config.radius ?? 8, fontSize);
57
+ ctx.shadowColor = glow.config.color ?? color;
58
+ ctx.shadowOffsetX = glow.config.offsetX ?? 0;
59
+ ctx.shadowOffsetY = glow.config.offsetY ?? 0;
60
+ ctx.fillStyle = glow.config.color ?? color;
61
+ ctx.fillText(char, drawX, drawY);
62
+ ctx.restore();
63
+ }
64
+
65
+ // Main text
66
+ ctx.fillStyle = fillColor;
67
+ ctx.fillText(char, drawX, drawY);
68
+
69
+ ctx.restore();
70
+ }