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,374 @@
1
+ import type { LineCap, TegakiGlyphData } from '../types.ts';
2
+ import { findEffect, findEffects, type ResolvedEffect } from './effects.ts';
3
+ import { resolveCSSLength } from './utils.ts';
4
+
5
+ interface GlyphPosition {
6
+ /** X offset in CSS pixels */
7
+ x: number;
8
+ /** Y offset in CSS pixels (top of em square) */
9
+ y: number;
10
+ /** Font size in CSS pixels */
11
+ fontSize: number;
12
+ /** Units per em from the font */
13
+ unitsPerEm: number;
14
+ /** Font ascender in font units */
15
+ ascender: number;
16
+ /** Font descender in font units (negative) */
17
+ descender: number;
18
+ }
19
+
20
+ // --- Color helpers ---
21
+
22
+ function parseColor(color: string): [number, number, number, number] {
23
+ const h = color.replace('#', '');
24
+ if (h.length === 3) {
25
+ return [parseInt(h[0]! + h[0]!, 16), parseInt(h[1]! + h[1]!, 16), parseInt(h[2]! + h[2]!, 16), 1];
26
+ }
27
+ if (h.length === 4) {
28
+ return [parseInt(h[0]! + h[0]!, 16), parseInt(h[1]! + h[1]!, 16), parseInt(h[2]! + h[2]!, 16), parseInt(h[3]! + h[3]!, 16) / 255];
29
+ }
30
+ if (h.length === 8) {
31
+ return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16), parseInt(h.slice(6, 8), 16) / 255];
32
+ }
33
+ return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16), 1];
34
+ }
35
+
36
+ function lerpColor(a: [number, number, number, number], b: [number, number, number, number], t: number): string {
37
+ const r = Math.round(a[0] + (b[0] - a[0]) * t);
38
+ const g = Math.round(a[1] + (b[1] - a[1]) * t);
39
+ const bl = Math.round(a[2] + (b[2] - a[2]) * t);
40
+ const al = a[3] + (b[3] - a[3]) * t;
41
+ if (al >= 1) return `rgb(${r},${g},${bl})`;
42
+ return `rgba(${r},${g},${bl},${al.toFixed(3)})`;
43
+ }
44
+
45
+ function gradientColor(progress: number, colors: string[], seed: number): string {
46
+ if (colors.length === 0) return '#000';
47
+ if (colors.length === 1) return colors[0]!;
48
+ const t = (((progress + seed * 0.1) % 1) + 1) % 1;
49
+ const scaledT = t * (colors.length - 1);
50
+ const i = Math.min(Math.floor(scaledT), colors.length - 2);
51
+ const frac = scaledT - i;
52
+ return lerpColor(parseColor(colors[i]!), parseColor(colors[i + 1]!), frac);
53
+ }
54
+
55
+ function rainbowColor(progress: number, saturation: number, lightness: number, seed: number): string {
56
+ const hue = (progress * 360 + seed * 137.5) % 360;
57
+ return `hsl(${hue}, ${saturation}%, ${lightness}%)`;
58
+ }
59
+
60
+ // --- Noise helper for wobble ---
61
+
62
+ function hash(x: number): number {
63
+ let h = (x * 2654435761) | 0;
64
+ h = ((h >>> 16) ^ h) * 0x45d9f3b;
65
+ h = ((h >>> 16) ^ h) * 0x45d9f3b;
66
+ h = (h >>> 16) ^ h;
67
+ return (h & 0x7fffffff) / 0x7fffffff; // 0-1
68
+ }
69
+
70
+ function noise1d(x: number, seed: number): number {
71
+ const i = Math.floor(x);
72
+ const f = x - i;
73
+ const t = f * f * (3 - 2 * f); // smoothstep
74
+ return hash(i + seed * 7919) * (1 - t) + hash(i + 1 + seed * 7919) * t;
75
+ }
76
+
77
+ /**
78
+ * Draw a single glyph's strokes onto a canvas context, animated up to `localTime`.
79
+ * `localTime` is seconds relative to this glyph's start (0 = glyph begins).
80
+ */
81
+ export function drawGlyph(
82
+ ctx: CanvasRenderingContext2D,
83
+ glyph: TegakiGlyphData,
84
+ pos: GlyphPosition,
85
+ localTime: number,
86
+ lineCap: LineCap,
87
+ color: string,
88
+ effects: ResolvedEffect[] = [],
89
+ seed = 0,
90
+ segmentSize?: number,
91
+ ) {
92
+ const scale = pos.fontSize / pos.unitsPerEm;
93
+ const ox = pos.x;
94
+ const oy = pos.y;
95
+
96
+ const glowEffects = findEffects(effects, 'glow');
97
+ const wobbleEffect = findEffect(effects, 'wobble');
98
+ const pressureEffect = findEffect(effects, 'pressureWidth');
99
+ const taperEffect = findEffect(effects, 'taper');
100
+ const gradientEffect = findEffect(effects, 'gradient');
101
+
102
+ // Pressure params (0 = uniform avg width, 1 = fully per-point width)
103
+ const pressureAmount = pressureEffect ? Math.max(0, Math.min(pressureEffect.config.strength ?? 1, 1)) : 0;
104
+
105
+ // Wobble params
106
+ const wobbleAmplitude = wobbleEffect ? (wobbleEffect.config.amplitude ?? 1.5) : 0;
107
+ const wobbleFrequency = wobbleEffect ? (wobbleEffect.config.frequency ?? 8) : 0;
108
+ const wobbleMode = wobbleEffect?.config.mode ?? 'sine';
109
+
110
+ // Taper params
111
+ const taperStart = taperEffect ? Math.max(0, Math.min(taperEffect.config.startLength ?? 0.15, 1)) : 0;
112
+ const taperEnd = taperEffect ? Math.max(0, Math.min(taperEffect.config.endLength ?? 0.15, 1)) : 0;
113
+
114
+ // Gradient params
115
+ const gradientColors = gradientEffect?.config.colors;
116
+ const isRainbow = gradientColors === 'rainbow';
117
+ const gradientColorStops = Array.isArray(gradientColors) ? gradientColors : undefined;
118
+ const gradientSaturation = gradientEffect?.config.saturation ?? 80;
119
+ const gradientLightness = gradientEffect?.config.lightness ?? 55;
120
+
121
+ // Helper: apply wobble offset to a point in font units
122
+ const wobbleX = (x: number, y: number, idx: number) => {
123
+ if (!wobbleEffect) return x;
124
+ if (wobbleMode === 'noise') {
125
+ return x + wobbleAmplitude * (noise1d(y * 0.1 + idx * 0.7, seed) * 2 - 1);
126
+ }
127
+ return x + wobbleAmplitude * Math.sin(wobbleFrequency * (y * 0.01 + idx * 0.7) + seed);
128
+ };
129
+ const wobbleY = (x: number, y: number, idx: number) => {
130
+ if (!wobbleEffect) return y;
131
+ if (wobbleMode === 'noise') {
132
+ return y + wobbleAmplitude * (noise1d(x * 0.1 + idx * 0.5, seed * 1.3 + 1000) * 2 - 1);
133
+ }
134
+ return y + wobbleAmplitude * Math.cos(wobbleFrequency * (x * 0.01 + idx * 0.5) + seed * 1.3);
135
+ };
136
+
137
+ // Helper: convert font-unit point to pixel
138
+ const px = (x: number) => ox + x * scale;
139
+ const py = (y: number) => oy + (y + pos.ascender) * scale;
140
+
141
+ // Helper: get color for a given stroke progress
142
+ const colorAt = (progress: number): string => {
143
+ if (isRainbow) return rainbowColor(progress, gradientSaturation, gradientLightness, seed);
144
+ if (gradientColorStops) return gradientColor(progress, gradientColorStops, seed);
145
+ return color;
146
+ };
147
+ const hasGradient = !!gradientEffect;
148
+
149
+ // Helper: taper multiplier (0-1) for a given stroke progress
150
+ const taperMultiplier = (progress: number): number => {
151
+ let m = 1;
152
+ if (taperStart > 0 && progress < taperStart) m = Math.min(m, progress / taperStart);
153
+ if (taperEnd > 0 && progress > 1 - taperEnd) m = Math.min(m, (1 - progress) / taperEnd);
154
+ return m;
155
+ };
156
+
157
+ for (const stroke of glyph.strokes) {
158
+ if (localTime < stroke.delay) continue;
159
+ const elapsed = localTime - stroke.delay;
160
+ const progress = Math.min(elapsed / stroke.animationDuration, 1);
161
+
162
+ const pts = stroke.points;
163
+ if (pts.length === 0) continue;
164
+
165
+ const avgWidth = pts.reduce((s, p) => s + p.width, 0) / pts.length;
166
+ const baseLineWidth = Math.max(avgWidth, 0.5) * scale;
167
+
168
+ // --- Single-point dot ---
169
+ if (pts.length === 1) {
170
+ if (progress <= 0) continue;
171
+ const p = pts[0]!;
172
+ const dotX = px(wobbleX(p.x, p.y, 0));
173
+ const dotY = py(wobbleY(p.x, p.y, 0));
174
+ const perPointDot = Math.max(p.width, 0.5) * scale;
175
+ let dotWidth = baseLineWidth + (perPointDot - baseLineWidth) * pressureAmount;
176
+ dotWidth *= taperMultiplier(0.5);
177
+
178
+ // Glow passes for dots
179
+ for (const glow of glowEffects) {
180
+ ctx.save();
181
+ ctx.shadowBlur = resolveCSSLength(glow.config.radius ?? 8, pos.fontSize);
182
+ ctx.shadowColor = glow.config.color ?? color;
183
+ ctx.shadowOffsetX = (glow.config.offsetX ?? 0) * scale;
184
+ ctx.shadowOffsetY = (glow.config.offsetY ?? 0) * scale;
185
+ ctx.fillStyle = glow.config.color ?? color;
186
+ ctx.beginPath();
187
+ if (lineCap === 'round') {
188
+ ctx.arc(dotX, dotY, dotWidth / 2, 0, Math.PI * 2);
189
+ } else {
190
+ ctx.rect(dotX - dotWidth / 2, dotY - dotWidth / 2, dotWidth, dotWidth);
191
+ }
192
+ ctx.fill();
193
+ ctx.restore();
194
+ }
195
+
196
+ // Main dot
197
+ ctx.fillStyle = colorAt(0);
198
+ ctx.beginPath();
199
+ if (lineCap === 'round') {
200
+ ctx.arc(dotX, dotY, dotWidth / 2, 0, Math.PI * 2);
201
+ ctx.fill();
202
+ } else {
203
+ ctx.fillRect(dotX - dotWidth / 2, dotY - dotWidth / 2, dotWidth, dotWidth);
204
+ }
205
+ continue;
206
+ }
207
+
208
+ // --- Compute total path length ---
209
+ let totalLen = 0;
210
+ for (let j = 1; j < pts.length; j++) {
211
+ const dx = pts[j]!.x - pts[j - 1]!.x;
212
+ const dy = pts[j]!.y - pts[j - 1]!.y;
213
+ totalLen += Math.sqrt(dx * dx + dy * dy);
214
+ }
215
+
216
+ const drawLen = totalLen * progress;
217
+ if (drawLen <= 0) continue;
218
+
219
+ // --- Collect drawable segments ---
220
+ const segments: {
221
+ x0: number;
222
+ y0: number;
223
+ x1: number;
224
+ y1: number;
225
+ width0: number;
226
+ width1: number;
227
+ segProgress: number;
228
+ }[] = [];
229
+
230
+ let accumulated = 0;
231
+ for (let j = 1; j < pts.length; j++) {
232
+ const prev = pts[j - 1]!;
233
+ const cur = pts[j]!;
234
+ const dx = cur.x - prev.x;
235
+ const dy = cur.y - prev.y;
236
+ const segLen = Math.sqrt(dx * dx + dy * dy);
237
+
238
+ if (accumulated + segLen <= drawLen) {
239
+ segments.push({
240
+ x0: px(wobbleX(prev.x, prev.y, j - 1)),
241
+ y0: py(wobbleY(prev.x, prev.y, j - 1)),
242
+ x1: px(wobbleX(cur.x, cur.y, j)),
243
+ y1: py(wobbleY(cur.x, cur.y, j)),
244
+ width0: prev.width,
245
+ width1: cur.width,
246
+ segProgress: (accumulated + segLen / 2) / totalLen,
247
+ });
248
+ accumulated += segLen;
249
+ } else {
250
+ const remaining = drawLen - accumulated;
251
+ const frac = segLen > 0 ? remaining / segLen : 0;
252
+ const ix = prev.x + dx * frac;
253
+ const iy = prev.y + dy * frac;
254
+ const iw = prev.width + (cur.width - prev.width) * frac;
255
+ segments.push({
256
+ x0: px(wobbleX(prev.x, prev.y, j - 1)),
257
+ y0: py(wobbleY(prev.x, prev.y, j - 1)),
258
+ x1: px(wobbleX(ix, iy, j)),
259
+ y1: py(wobbleY(ix, iy, j)),
260
+ width0: prev.width,
261
+ width1: iw,
262
+ segProgress: (accumulated + remaining / 2) / totalLen,
263
+ });
264
+ break;
265
+ }
266
+ }
267
+
268
+ if (segments.length === 0) continue;
269
+
270
+ // Keep coarse segments for glow (shadowBlur is expensive per draw call)
271
+ const coarseSegments = segments.slice();
272
+
273
+ // --- Subdivide long segments for smooth effect transitions ---
274
+ const effectsNeedSubdivision = pressureAmount > 0 || hasGradient || !!wobbleEffect || !!taperEffect;
275
+ const resolvedSegmentSize = segmentSize ?? (effectsNeedSubdivision ? 2 : undefined);
276
+ if (resolvedSegmentSize != null) {
277
+ const maxSegLen = resolvedSegmentSize * scale;
278
+ const subdivided: typeof segments = [];
279
+ for (const seg of segments) {
280
+ const dx = seg.x1 - seg.x0;
281
+ const dy = seg.y1 - seg.y0;
282
+ const len = Math.sqrt(dx * dx + dy * dy);
283
+ const count = Math.max(1, Math.ceil(len / maxSegLen));
284
+ for (let k = 0; k < count; k++) {
285
+ const t0 = k / count;
286
+ const t1 = (k + 1) / count;
287
+ subdivided.push({
288
+ x0: seg.x0 + dx * t0,
289
+ y0: seg.y0 + dy * t0,
290
+ x1: seg.x0 + dx * t1,
291
+ y1: seg.y0 + dy * t1,
292
+ width0: seg.width0 + (seg.width1 - seg.width0) * t0,
293
+ width1: seg.width0 + (seg.width1 - seg.width0) * t1,
294
+ segProgress: seg.segProgress,
295
+ });
296
+ }
297
+ }
298
+ for (let k = 0; k < subdivided.length; k++) {
299
+ subdivided[k]!.segProgress = subdivided.length > 1 ? k / (subdivided.length - 1) : 0;
300
+ }
301
+ segments.length = 0;
302
+ segments.push(...subdivided);
303
+ }
304
+
305
+ // Helper: compute segment line width with pressure and taper
306
+ const segWidth = (seg: (typeof segments)[0]) => {
307
+ const perPoint = ((seg.width0 + seg.width1) / 2) * scale;
308
+ const w = Math.max(baseLineWidth + (perPoint - baseLineWidth) * pressureAmount, 0.5 * scale);
309
+ return w * taperMultiplier(seg.segProgress);
310
+ };
311
+
312
+ const needsPerSegment = pressureAmount > 0 || taperEffect;
313
+
314
+ const drawStrokePath = () => {
315
+ if (needsPerSegment) {
316
+ for (const seg of segments) {
317
+ ctx.lineWidth = segWidth(seg);
318
+ ctx.beginPath();
319
+ ctx.moveTo(seg.x0, seg.y0);
320
+ ctx.lineTo(seg.x1, seg.y1);
321
+ ctx.stroke();
322
+ }
323
+ } else {
324
+ ctx.lineWidth = baseLineWidth;
325
+ ctx.beginPath();
326
+ ctx.moveTo(segments[0]!.x0, segments[0]!.y0);
327
+ for (const seg of segments) {
328
+ ctx.lineTo(seg.x1, seg.y1);
329
+ }
330
+ ctx.stroke();
331
+ }
332
+ };
333
+
334
+ const drawGradientPath = () => {
335
+ for (const seg of segments) {
336
+ ctx.strokeStyle = colorAt(seg.segProgress);
337
+ if (needsPerSegment) ctx.lineWidth = segWidth(seg);
338
+ ctx.beginPath();
339
+ ctx.moveTo(seg.x0, seg.y0);
340
+ ctx.lineTo(seg.x1, seg.y1);
341
+ ctx.stroke();
342
+ }
343
+ };
344
+
345
+ ctx.lineCap = lineCap;
346
+ ctx.lineJoin = 'round';
347
+
348
+ // --- Glow passes (use coarse segments to avoid expensive per-subsegment shadowBlur) ---
349
+ for (const glow of glowEffects) {
350
+ ctx.save();
351
+ ctx.shadowBlur = resolveCSSLength(glow.config.radius ?? 8, pos.fontSize);
352
+ ctx.shadowColor = glow.config.color ?? color;
353
+ ctx.shadowOffsetX = (glow.config.offsetX ?? 0) * scale;
354
+ ctx.shadowOffsetY = (glow.config.offsetY ?? 0) * scale;
355
+ ctx.strokeStyle = glow.config.color ?? color;
356
+ ctx.lineWidth = baseLineWidth;
357
+ ctx.beginPath();
358
+ ctx.moveTo(coarseSegments[0]!.x0, coarseSegments[0]!.y0);
359
+ for (const seg of coarseSegments) {
360
+ ctx.lineTo(seg.x1, seg.y1);
361
+ }
362
+ ctx.stroke();
363
+ ctx.restore();
364
+ }
365
+
366
+ // --- Main stroke ---
367
+ if (hasGradient) {
368
+ drawGradientPath();
369
+ } else {
370
+ ctx.strokeStyle = color;
371
+ drawStrokePath();
372
+ }
373
+ }
374
+ }
@@ -0,0 +1,56 @@
1
+ import type { TegakiEffectConfigs, TegakiEffectName } from '../types.ts';
2
+
3
+ export interface ResolvedEffect<K extends TegakiEffectName = TegakiEffectName> {
4
+ effect: K;
5
+ order: number;
6
+ config: TegakiEffectConfigs[K];
7
+ }
8
+
9
+ /**
10
+ * Normalizes an effects record into a sorted array of resolved effects.
11
+ * Known keys infer the effect name; custom keys read it from the `effect` field.
12
+ * Boolean `true` becomes an empty config. `false`/absent entries are skipped.
13
+ */
14
+ export function resolveEffects(effects: Record<string, any> | undefined): ResolvedEffect[] {
15
+ if (!effects) return [];
16
+
17
+ const knownEffects: Set<string> = new Set(['glow', 'wobble', 'pressureWidth', 'taper', 'gradient']);
18
+ const result: ResolvedEffect[] = [];
19
+
20
+ for (const [key, value] of Object.entries(effects)) {
21
+ if (value === false || value == null) continue;
22
+
23
+ let effectName: TegakiEffectName;
24
+ let config: Record<string, any>;
25
+ let order: number;
26
+
27
+ if (value === true) {
28
+ effectName = (knownEffects.has(key) ? key : undefined) as TegakiEffectName;
29
+ if (!effectName) continue;
30
+ config = {};
31
+ order = 0;
32
+ } else {
33
+ if (value.enabled === false) continue;
34
+ effectName = value.effect ?? (knownEffects.has(key) ? key : undefined);
35
+ if (!effectName) continue;
36
+ const { effect: _, order: o, enabled: __, ...rest } = value;
37
+ config = rest;
38
+ order = o ?? 0;
39
+ }
40
+
41
+ result.push({ effect: effectName, order, config });
42
+ }
43
+
44
+ result.sort((a, b) => a.order - b.order);
45
+ return result;
46
+ }
47
+
48
+ /** Check if a specific effect is active. */
49
+ export function findEffect<K extends TegakiEffectName>(effects: ResolvedEffect[], name: K): ResolvedEffect<K> | undefined {
50
+ return effects.find((e) => e.effect === name) as ResolvedEffect<K> | undefined;
51
+ }
52
+
53
+ /** Get all instances of a specific effect (for duplicates). */
54
+ export function findEffects<K extends TegakiEffectName>(effects: ResolvedEffect[], name: K): ResolvedEffect<K>[] {
55
+ return effects.filter((e) => e.effect === name) as ResolvedEffect<K>[];
56
+ }
@@ -0,0 +1,114 @@
1
+ import { layoutWithLines, prepareWithSegments } from '@chenglou/pretext';
2
+ import { graphemes } from './utils.ts';
3
+
4
+ export interface TextLayout {
5
+ /** Character indices per line */
6
+ lines: number[][];
7
+ /** Width in em per character index */
8
+ charWidths: number[];
9
+ /** Kerning adjustment in em between character at index i and i+1 */
10
+ kernings: number[];
11
+ /** Intrinsic (single-line) width in em */
12
+ intrinsicWidth: number;
13
+ }
14
+
15
+ export function computeTextLayout(text: string, fontFamily: string, fontSize: number, lineHeight: number, maxWidth: number): TextLayout {
16
+ const fontStr = `${fontSize}px ${fontFamily}`;
17
+ const chars = graphemes(text);
18
+
19
+ // Measure unique character widths
20
+ const widthCache = new Map<string, number>();
21
+ const charWidths: number[] = [];
22
+ for (const char of chars) {
23
+ let w = widthCache.get(char);
24
+ if (w === undefined) {
25
+ if (char === '\n') {
26
+ w = 0;
27
+ } else {
28
+ const p = prepareWithSegments(char, fontStr, { whiteSpace: 'pre-wrap' });
29
+ const r = layoutWithLines(p, Infinity, lineHeight);
30
+ w = r.lines.length > 0 ? r.lines[0]!.width / fontSize : 0;
31
+ }
32
+ widthCache.set(char, w);
33
+ }
34
+ charWidths.push(w);
35
+ }
36
+
37
+ // Compute intrinsic width (single-line, no wrapping)
38
+ const prepared = prepareWithSegments(text, fontStr, { whiteSpace: 'pre-wrap' });
39
+ const singleLineResult = layoutWithLines(prepared, Infinity, lineHeight);
40
+ const intrinsicWidth = Math.max(0, ...singleLineResult.lines.map((l) => l.width)) / fontSize;
41
+
42
+ // Line breaking at actual available width
43
+ const result = layoutWithLines(prepared, maxWidth, lineHeight);
44
+
45
+ // Map line texts back to character indices (grapheme-based)
46
+ // Build a mapping from UTF-16 offset to grapheme index
47
+ const utf16ToCodePoint: number[] = [];
48
+ for (let ci = 0; ci < chars.length; ci++) {
49
+ for (let j = 0; j < chars[ci]!.length; j++) {
50
+ utf16ToCodePoint.push(ci);
51
+ }
52
+ }
53
+
54
+ const lines: number[][] = [];
55
+ let utf16Offset = 0;
56
+ for (const line of result.lines) {
57
+ const indices: number[] = [];
58
+ const seen = new Set<number>();
59
+ for (let i = 0; i < line.text.length; i++) {
60
+ const cpIdx = utf16ToCodePoint[utf16Offset + i]!;
61
+ if (!seen.has(cpIdx)) {
62
+ seen.add(cpIdx);
63
+ indices.push(cpIdx);
64
+ }
65
+ }
66
+ utf16Offset += line.text.length;
67
+ // Consume the newline that caused this line break
68
+ if (utf16Offset < text.length && text[utf16Offset] === '\n') {
69
+ const cpIdx = utf16ToCodePoint[utf16Offset]!;
70
+ indices.push(cpIdx);
71
+ utf16Offset++;
72
+ }
73
+ lines.push(indices);
74
+ }
75
+
76
+ // Any remaining characters (shouldn't happen, but safety)
77
+ if (utf16Offset < text.length) {
78
+ const indices: number[] = [];
79
+ const seen = new Set<number>();
80
+ for (let i = utf16Offset; i < text.length; i++) {
81
+ const cpIdx = utf16ToCodePoint[i]!;
82
+ if (!seen.has(cpIdx)) {
83
+ seen.add(cpIdx);
84
+ indices.push(cpIdx);
85
+ }
86
+ }
87
+ lines.push(indices);
88
+ }
89
+
90
+ // Measure kerning between adjacent character pairs
91
+ const kernings: number[] = [];
92
+ const pairCache = new Map<string, number>();
93
+ for (let i = 0; i < chars.length - 1; i++) {
94
+ const a = chars[i]!;
95
+ const b = chars[i + 1]!;
96
+ if (a === '\n' || b === '\n') {
97
+ kernings.push(0);
98
+ continue;
99
+ }
100
+ const pair = `${a}${b}`;
101
+ let k = pairCache.get(pair);
102
+ if (k === undefined) {
103
+ const p = prepareWithSegments(pair, fontStr, { whiteSpace: 'pre-wrap' });
104
+ const r = layoutWithLines(p, Infinity, lineHeight);
105
+ const pairWidth = r.lines.length > 0 ? r.lines[0]!.width / fontSize : 0;
106
+ k = pairWidth - (widthCache.get(a) ?? 0) - (widthCache.get(b) ?? 0);
107
+ if (Math.abs(k) < 0.001) k = 0;
108
+ pairCache.set(pair, k);
109
+ }
110
+ kernings.push(k);
111
+ }
112
+
113
+ return { lines, charWidths, kernings, intrinsicWidth };
114
+ }
@@ -0,0 +1,65 @@
1
+ import type { TegakiBundle } from '../types.ts';
2
+ import { graphemes } from './utils.ts';
3
+
4
+ export interface TimelineConfig {
5
+ /** Pause between glyphs (seconds). Default: `0.1` */
6
+ glyphGap?: number;
7
+ /** Pause after a space character (seconds). Default: `0.15` */
8
+ wordGap?: number;
9
+ /** Pause after a newline / line break (seconds). Default: `0.3` */
10
+ lineGap?: number;
11
+ /** Duration for characters without glyph SVGs (seconds). Default: `0.2` */
12
+ unknownDuration?: number;
13
+ }
14
+
15
+ const DEFAULTS: Required<TimelineConfig> = {
16
+ glyphGap: 0.1,
17
+ wordGap: 0.15,
18
+ lineGap: 0.3,
19
+ unknownDuration: 0.2,
20
+ };
21
+
22
+ export interface TimelineEntry {
23
+ char: string;
24
+ offset: number;
25
+ duration: number;
26
+ hasSvg: boolean;
27
+ }
28
+
29
+ export interface Timeline {
30
+ entries: TimelineEntry[];
31
+ totalDuration: number;
32
+ }
33
+
34
+ export function computeTimeline(text: string, font: TegakiBundle, config?: TimelineConfig): Timeline {
35
+ const glyphGap = config?.glyphGap ?? DEFAULTS.glyphGap;
36
+ const wordGap = config?.wordGap ?? DEFAULTS.wordGap;
37
+ const lineGap = config?.lineGap ?? DEFAULTS.lineGap;
38
+ const unknownDuration = config?.unknownDuration ?? DEFAULTS.unknownDuration;
39
+
40
+ const chars = graphemes(text);
41
+ const entries: TimelineEntry[] = [];
42
+ let offset = 0;
43
+ for (const char of chars) {
44
+ const hasSvg = char in font.glyphs;
45
+ const duration = hasSvg ? (font.glyphTimings[char] ?? 1) : unknownDuration;
46
+ entries.push({ char, offset, duration, hasSvg });
47
+ offset += duration;
48
+
49
+ // Gap after this character
50
+ if (char === '\n') {
51
+ offset += lineGap;
52
+ } else if (char === ' ') {
53
+ offset += wordGap;
54
+ } else {
55
+ offset += glyphGap;
56
+ }
57
+ }
58
+ // Remove trailing gap
59
+ if (entries.length > 0) {
60
+ const lastChar = chars[chars.length - 1]!;
61
+ const trailingGap = lastChar === '\n' ? lineGap : lastChar === ' ' ? wordGap : glyphGap;
62
+ offset -= trailingGap;
63
+ }
64
+ return { entries, totalDuration: Math.max(0, offset) };
65
+ }
@@ -0,0 +1,22 @@
1
+ import type { CSSLength } from '../types.ts';
2
+
3
+ const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
4
+
5
+ /** Resolve a CSSLength to pixels. Plain numbers are px, `"Nem"` is N * fontSize. */
6
+ export function resolveCSSLength(value: CSSLength, fontSize: number): number {
7
+ if (typeof value === 'number') return value;
8
+ return parseFloat(value) * fontSize;
9
+ }
10
+
11
+ export function graphemes(text: string): string[] {
12
+ return Array.from(segmenter.segment(text), (s) => s.segment);
13
+ }
14
+ export type Coercible = string | number | boolean | null | undefined | readonly Coercible[];
15
+
16
+ export function coerceToString(value: unknown): string {
17
+ if (value == null || typeof value === 'boolean') return '';
18
+ if (typeof value === 'string') return value;
19
+ if (typeof value === 'number' || typeof value === 'bigint') return String(value);
20
+ if (Array.isArray(value)) return value.map(coerceToString).join('');
21
+ return '';
22
+ }