tegaki 0.0.1 → 0.2.2

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 +19 -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 +900 -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 +589 -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,589 @@
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-derived constants ---
164
+ const fontFamily = font?.family;
165
+ const emHeight = font ? (font.ascender - font.descender) / font.unitsPerEm : 0;
166
+ const baselineOffset = font ? font.descender / font.unitsPerEm : 0;
167
+
168
+ // --- Container measurement ---
169
+ const rootRef = useRef<HTMLDivElement>(null);
170
+ const [containerWidth, setContainerWidth] = useState(0);
171
+ const [fontSize, setFontSize] = useState(0);
172
+ const [lineHeight, setLineHeight] = useState(0);
173
+
174
+ // --- Timeline ---
175
+ const timeline = useMemo(
176
+ () => (font && resolvedText ? computeTimeline(resolvedText, font, timing) : { entries: [] as TimelineEntry[], totalDuration: 0 }),
177
+ [resolvedText, font, timing],
178
+ );
179
+
180
+ // Duration ref so the rAF loop always sees the latest value without restarting
181
+ const totalDurationRef = useRef(timeline.totalDuration);
182
+ totalDurationRef.current = timeline.totalDuration;
183
+
184
+ // Smoothed catch-up boost (raw bonus on top of base speed; attack/release smoothed)
185
+ const smoothedBoostRef = useRef(0);
186
+
187
+ // --- Completion tracking ---
188
+ const prevCompletedRef = useRef(false);
189
+ const isComplete = timeline.totalDuration > 0 && currentTime >= timeline.totalDuration;
190
+
191
+ useEffect(() => {
192
+ if (isComplete && !prevCompletedRef.current) {
193
+ prevCompletedRef.current = true;
194
+ onCompleteRef.current?.();
195
+ } else if (!isComplete) {
196
+ prevCompletedRef.current = false;
197
+ }
198
+ });
199
+
200
+ // --- Uncontrolled: time change notification ---
201
+ useEffect(() => {
202
+ if (!isControlled) {
203
+ onTimeChangeRef.current?.(internalTime);
204
+ }
205
+ }, [internalTime, isControlled]);
206
+
207
+ // --- Uncontrolled: rAF playback loop ---
208
+ useEffect(() => {
209
+ if (isControlled || !playing || !font) return;
210
+
211
+ // Reset smoothed boost when the loop restarts
212
+ smoothedBoostRef.current = 0;
213
+
214
+ let lastTs: number | null = null;
215
+ let raf: number;
216
+
217
+ // Catch-up smoothing rates (per-second exponential factors)
218
+ const attackRate = 4; // fast ramp-up
219
+ const releaseRate = loop ? 30 : 2; // slow decay back to base
220
+
221
+ const tick = (ts: number) => {
222
+ if (lastTs === null) lastTs = ts;
223
+ const dtSec = (ts - lastTs) / 1000;
224
+ lastTs = ts;
225
+
226
+ setInternalTime((prev: number) => {
227
+ const totalDur = totalDurationRef.current;
228
+ if (totalDur === 0 || (!loop && prev >= totalDur)) return totalDur;
229
+
230
+ // Compute effective speed with catch-up
231
+ let effectiveSpeed = speed;
232
+ if (catchUp > 0) {
233
+ const remaining = Math.max(0, totalDur - prev);
234
+ const excess = Math.max(0, remaining - 2);
235
+ const targetBoost = catchUp * excess;
236
+ const rate = targetBoost > smoothedBoostRef.current ? attackRate : releaseRate;
237
+ smoothedBoostRef.current += (targetBoost - smoothedBoostRef.current) * (1 - Math.exp(-rate * dtSec));
238
+ effectiveSpeed = speed + smoothedBoostRef.current;
239
+ }
240
+
241
+ let next = prev + dtSec * effectiveSpeed;
242
+ if (next >= totalDur) {
243
+ next = loop ? next % totalDur : totalDur;
244
+ smoothedBoostRef.current = 0; // reset boost on loop
245
+ }
246
+ return next;
247
+ });
248
+
249
+ raf = requestAnimationFrame(tick);
250
+ };
251
+
252
+ raf = requestAnimationFrame(tick);
253
+ return () => cancelAnimationFrame(raf);
254
+ }, [isControlled, playing, speed, loop, catchUp, font]);
255
+
256
+ // --- SVG refs (only needed in SVG mode) ---
257
+ const svgRefs = useRef(new Map<number, SVGSVGElement>());
258
+ const svgRefCallbacks = useRef(new Map<number, (node: SVGSVGElement | null) => void>());
259
+
260
+ const makeSvgRef = useCallback(
261
+ (charIdx: number) => (node: SVGSVGElement | null) => {
262
+ if (node) {
263
+ node.pauseAnimations();
264
+ svgRefs.current.set(charIdx, node);
265
+ } else {
266
+ svgRefs.current.delete(charIdx);
267
+ }
268
+ },
269
+ [],
270
+ );
271
+
272
+ const getSvgRef = useCallback(
273
+ (charIdx: number) => {
274
+ let cb = svgRefCallbacks.current.get(charIdx);
275
+ if (!cb) {
276
+ cb = makeSvgRef(charIdx);
277
+ svgRefCallbacks.current.set(charIdx, cb);
278
+ }
279
+ return cb;
280
+ },
281
+ [makeSvgRef],
282
+ );
283
+
284
+ // Clear stale SVG refs when font or mode changes
285
+ const prevFontRef = useRef(font);
286
+ const prevModeRef = useRef(mode);
287
+ if (prevFontRef.current !== font || prevModeRef.current !== mode) {
288
+ prevFontRef.current = font;
289
+ prevModeRef.current = mode;
290
+ svgRefs.current.clear();
291
+ svgRefCallbacks.current.clear();
292
+ }
293
+
294
+ // --- Container size observation ---
295
+ useEffect(() => {
296
+ const el = rootRef.current;
297
+ if (!el) return;
298
+ const ro = new ResizeObserver(([entry]) => {
299
+ if (entry) {
300
+ setContainerWidth(entry.contentRect.width);
301
+ const styles = getComputedStyle(el);
302
+ setFontSize(Number.parseFloat(styles.fontSize));
303
+ setLineHeight(Number.parseFloat(styles.lineHeight));
304
+ }
305
+ });
306
+ ro.observe(el);
307
+ return () => ro.disconnect();
308
+ }, []);
309
+
310
+ // Sentinel element ref — a hidden child with `font-size: inherit` and a near-zero
311
+ // CSS transition. When any ancestor changes font-size, the transition fires an event
312
+ // so we can read the new value without polling getComputedStyle every render.
313
+ const sentinelRef = useRef<HTMLSpanElement>(null);
314
+ useEffect(() => {
315
+ const el = sentinelRef.current;
316
+ if (!el) return;
317
+ const onTransition = (e: TransitionEvent) => {
318
+ const styles = getComputedStyle(el);
319
+ if (e.propertyName === 'font-size' || e.propertyName === 'line-height') {
320
+ setFontSize(Number.parseFloat(styles.fontSize));
321
+ setLineHeight(Number.parseFloat(styles.lineHeight));
322
+ }
323
+ if (e.propertyName === CSS_PROGRESS) {
324
+ const rawProgress = Number(styles.getPropertyValue(CSS_PROGRESS));
325
+ setCssTime(rawProgress * totalDurationRef.current);
326
+ }
327
+ };
328
+ el.addEventListener('transitionend', onTransition);
329
+ return () => el.removeEventListener('transitionend', onTransition);
330
+ }, []);
331
+
332
+ // --- Text layout ---
333
+ const layout = useMemo(() => {
334
+ if (!fontFamily || !fontSize || !containerWidth || !resolvedText) return null;
335
+ return computeTextLayout(resolvedText, fontFamily, fontSize, lineHeight, containerWidth);
336
+ }, [resolvedText, fontFamily, fontSize, lineHeight, containerWidth]);
337
+
338
+ // --- Canvas padding ---
339
+ const padH = PADDING_H_EM * fontSize;
340
+ const padV = fontSize ? Math.max(MIN_PADDING_V_EM * fontSize, (MIN_LINE_HEIGHT_EM * fontSize - lineHeight) / 2) : 0;
341
+
342
+ // --- Sync SVG glyph times before paint ---
343
+ // Runs every render so SVGs stay correct even when currentTime hasn't changed
344
+ // (e.g. after pausing, or when ref callbacks re-fire due to re-renders).
345
+ useLayoutEffect(() => {
346
+ if (mode !== 'svg') return;
347
+ const entries = timeline.entries;
348
+ for (let i = 0; i < entries.length; i++) {
349
+ const entry = entries[i]!;
350
+ if (!entry.hasSvg) continue;
351
+ const svg = svgRefs.current.get(i);
352
+ if (!svg) continue;
353
+ const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
354
+ svg.setCurrentTime(localTime);
355
+ }
356
+ });
357
+
358
+ // --- Canvas rendering ---
359
+ const canvasRef = useRef<HTMLCanvasElement>(null);
360
+
361
+ useLayoutEffect(() => {
362
+ if (mode !== 'canvas') return;
363
+ const canvas = canvasRef.current;
364
+ if (!canvas || !font?.glyphData || !layout || !fontSize) return;
365
+
366
+ const dpr = window.devicePixelRatio || 1;
367
+ const el = rootRef.current;
368
+ if (!el) return;
369
+ const canvasRect = canvas.getBoundingClientRect();
370
+ const w = canvasRect.width;
371
+ const h = canvasRect.height;
372
+
373
+ // Resize canvas backing store if needed
374
+ const needsResize = canvas.width !== Math.round(w * dpr) || canvas.height !== Math.round(h * dpr);
375
+ if (needsResize) {
376
+ canvas.width = Math.round(w * dpr);
377
+ canvas.height = Math.round(h * dpr);
378
+ }
379
+
380
+ const ctx = canvas.getContext('2d');
381
+ if (!ctx) return;
382
+
383
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
384
+ ctx.clearRect(0, 0, w, h);
385
+ ctx.translate(padH, padV);
386
+
387
+ // Read currentColor from the container
388
+ const color = getComputedStyle(el).color;
389
+
390
+ const emHeightPx = emHeight * fontSize;
391
+ const halfLeading = (lineHeight - emHeightPx) / 2;
392
+ const characters = graphemes(resolvedText);
393
+
394
+ let y = 0;
395
+ for (const lineIndices of layout.lines) {
396
+ let x = 0;
397
+ for (const charIdx of lineIndices) {
398
+ const char = characters[charIdx]!;
399
+ if (char === '\n') continue;
400
+ const entry = timeline.entries[charIdx]!;
401
+ const charWidth = layout.charWidths[charIdx] ?? 0;
402
+ const kerning = layout.kernings[charIdx] ?? 0;
403
+ const glyph = font.glyphData[char];
404
+
405
+ if (glyph && entry.hasSvg) {
406
+ const localTime = Math.max(0, Math.min(currentTime - entry.offset, entry.duration));
407
+ const glyphY = y + halfLeading;
408
+ drawGlyph(
409
+ ctx,
410
+ glyph,
411
+ {
412
+ x,
413
+ y: glyphY,
414
+ fontSize,
415
+ unitsPerEm: font.unitsPerEm,
416
+ ascender: font.ascender,
417
+ descender: font.descender,
418
+ },
419
+ localTime,
420
+ font.lineCap,
421
+ color,
422
+ resolvedEffects,
423
+ seed + charIdx,
424
+ segmentSize,
425
+ );
426
+ } else if (!entry.hasSvg && currentTime >= entry.offset + entry.duration) {
427
+ const baseline = y + halfLeading + (font.ascender / font.unitsPerEm) * fontSize;
428
+ drawFallbackGlyph(ctx, char, x, baseline, fontSize, fontFamily!, color, resolvedEffects, seed + charIdx);
429
+ }
430
+
431
+ x += (charWidth + kerning) * fontSize;
432
+ }
433
+ y += lineHeight;
434
+ }
435
+ }, [
436
+ mode,
437
+ currentTime,
438
+ timeline,
439
+ layout,
440
+ font,
441
+ fontFamily,
442
+ fontSize,
443
+ lineHeight,
444
+ resolvedText,
445
+ emHeight,
446
+ padH,
447
+ padV,
448
+ resolvedEffects,
449
+ seed,
450
+ segmentSize,
451
+ ]);
452
+
453
+ // --- SVG rendering (skipped entirely in canvas mode) ---
454
+ const lineElements = useMemo(() => {
455
+ if (mode !== 'svg' || !font || !resolvedText) return null;
456
+
457
+ const characters = graphemes(resolvedText);
458
+
459
+ const renderGlyph = (charIdx: number) => {
460
+ const char = characters[charIdx]!;
461
+ const entry = timeline.entries[charIdx]!;
462
+ const GlyphSvg = font.glyphs[char] as any;
463
+ const width = layout?.charWidths[charIdx] ?? 1;
464
+ const kerning = layout?.kernings[charIdx];
465
+
466
+ if (char === '\n') return null;
467
+
468
+ if (GlyphSvg) {
469
+ return (
470
+ <GlyphSvg
471
+ key={charIdx}
472
+ ref={getSvgRef(charIdx)}
473
+ style={{
474
+ display: 'inline-block',
475
+ verticalAlign: `${baselineOffset}em`,
476
+ width: `${width}em`,
477
+ marginRight: kerning ? `${kerning}em` : undefined,
478
+ height: `${emHeight}em`,
479
+ overflow: 'visible',
480
+ }}
481
+ />
482
+ );
483
+ }
484
+
485
+ const isVisible = currentTime >= entry.offset + entry.duration;
486
+ return (
487
+ <span style={{ fontFamily, visibility: isVisible ? 'visible' : 'hidden' }} key={charIdx}>
488
+ {char}
489
+ </span>
490
+ );
491
+ };
492
+
493
+ if (layout) {
494
+ return layout.lines.map((lineIndices, lineIdx) => {
495
+ const isEmpty = lineIndices.every((i) => characters[i] === '\n');
496
+ return (
497
+ <div style={{ whiteSpace: 'nowrap', height: isEmpty ? '1lh' : undefined, lineHeight: `${lineHeight}px` }} key={lineIdx}>
498
+ {lineIndices.map(renderGlyph)}
499
+ </div>
500
+ );
501
+ });
502
+ }
503
+
504
+ // Fallback before layout is ready: single line
505
+ return characters.length > 0 ? <div style={{ whiteSpace: 'nowrap' }}>{characters.map((_, i) => renderGlyph(i))}</div> : null;
506
+ }, [mode, resolvedText, timeline, font, layout, getSvgRef, baselineOffset, emHeight, currentTime, fontFamily, lineHeight]);
507
+
508
+ // --- Rendering ---
509
+
510
+ if (!font || !resolvedText) {
511
+ return <div ref={rootRef} {...props} />;
512
+ }
513
+
514
+ return (
515
+ <div
516
+ ref={rootRef}
517
+ {...props}
518
+ style={{
519
+ ...props.style,
520
+ position: 'relative',
521
+ maxWidth: '100%',
522
+ width: 'auto',
523
+ height: 'auto',
524
+ ...{
525
+ [CSS_DURATION]: timeline.totalDuration,
526
+ [CSS_TIME]: currentTime,
527
+ [CSS_PROGRESS]: timeline.totalDuration > 0 ? currentTime / timeline.totalDuration : 0,
528
+ },
529
+ }}
530
+ >
531
+ {/* Sentinel: inherits font-size & line-height; its height changes when either changes */}
532
+ <span
533
+ ref={sentinelRef}
534
+ aria-hidden
535
+ style={{
536
+ position: 'absolute',
537
+ width: 0,
538
+ overflow: 'hidden',
539
+ pointerEvents: 'none',
540
+ fontSize: 'inherit',
541
+ lineHeight: 'inherit',
542
+ visibility: 'hidden',
543
+ transition: isCss ? `font-size 0.001s, line-height 0.001s, ${CSS_PROGRESS} 0.001s` : 'font-size 0.001s, line-height 0.001s',
544
+ }}
545
+ >
546
+ {'\u00A0'}
547
+ </span>
548
+ {mode === 'canvas' ? (
549
+ <canvas
550
+ ref={canvasRef}
551
+ aria-hidden
552
+ style={{
553
+ position: 'absolute',
554
+ inset: `${-padV}px ${-padH}px`,
555
+ width: `calc(100% + ${padH * 2}px)`,
556
+ height: `calc(100% + ${padV * 2}px)`,
557
+ pointerEvents: 'none',
558
+ }}
559
+ />
560
+ ) : (
561
+ <div
562
+ style={{
563
+ position: 'absolute',
564
+ inset: 0,
565
+ pointerEvents: 'none',
566
+ fontFamily,
567
+ }}
568
+ >
569
+ {lineElements}
570
+ </div>
571
+ )}
572
+
573
+ <div
574
+ style={{
575
+ userSelect: 'auto',
576
+ whiteSpace: 'pre-wrap',
577
+ overflowWrap: 'break-word',
578
+ paddingRight: 1,
579
+ WebkitTextFillColor: showOverlay ? undefined : 'transparent',
580
+ fontFamily,
581
+ color: showOverlay ? 'rgba(255, 0, 0, 0.4)' : undefined,
582
+ fontFeatureSettings: "'calt' 0, 'liga' 0",
583
+ }}
584
+ >
585
+ {resolvedText}
586
+ </div>
587
+ </div>
588
+ );
589
+ }
@@ -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
+ }