kasaframe 0.1.4 → 0.1.5

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 (294) hide show
  1. package/NOTICE +298 -0
  2. package/README.md +16 -3
  3. package/docs/AGENTS.md +1 -1
  4. package/package.json +1 -1
  5. package/packages/cli/src/commands/doctor.ts +15 -2
  6. package/packages/cli/src/commands/fonts.ts +118 -0
  7. package/packages/cli/src/commands/update.ts +66 -0
  8. package/packages/cli/src/fonts.ts +405 -0
  9. package/packages/cli/src/kf.ts +5 -0
  10. package/packages/cli/src/update.ts +250 -0
  11. package/packages/plan/src/asks.ts +1 -1
  12. package/packages/plan/src/themes.ts +8 -2
  13. package/packages/themes/kit/THEME-MAKE.md +2 -2
  14. package/packages/themes/kit/fonts/display.json +3517 -0
  15. package/packages/themes/kit/fonts/sans.json +5155 -0
  16. package/packages/themes/kit/fonts/serif.json +5229 -0
  17. package/packages/themes/kit/fonts.json +243 -79
  18. package/packages/themes/package.json +3 -1
  19. package/packages/themes/src/fontfile.ts +183 -0
  20. package/packages/themes/src/fonts.ts +296 -0
  21. package/packages/themes/src/index.ts +10 -2
  22. package/packages/themes/src/look.ts +34 -8
  23. package/packages/themes/src/types.ts +5 -0
  24. package/packages/themes/src/vary.ts +35 -34
  25. package/presets/kawaii-pastel.json +2 -2
  26. package/skills/kasaframe/SKILL.md +1 -0
  27. package/themes/blueprint/sample/style.json +5 -5
  28. package/themes/blueprint/style.json +5 -5
  29. package/themes/blueprint/theme.json +3 -1
  30. package/themes/blueprint/variants/deep-rose-suit.json +1 -1
  31. package/themes/blueprint/variants/navy-coral-2.json +1 -1
  32. package/themes/blueprint/variants/navy-coral-suit.json +1 -1
  33. package/themes/blueprint/variants/navy-orange-2.json +1 -1
  34. package/themes/blueprint/variants/navy-orange-suit.json +1 -1
  35. package/themes/cartography/sample/style.json +2 -2
  36. package/themes/cartography/style.json +2 -2
  37. package/themes/cartography/theme.json +3 -1
  38. package/themes/cartography/variants/deep-plum.json +1 -1
  39. package/themes/cartography/variants/frost-teal.json +1 -1
  40. package/themes/cartography/variants/navy-green.json +1 -1
  41. package/themes/circuit-board/sample/style.json +2 -2
  42. package/themes/circuit-board/style.json +2 -2
  43. package/themes/circuit-board/theme.json +3 -1
  44. package/themes/circuit-board/variants/dusk-gold-pretendard.json +1 -1
  45. package/themes/circuit-board/variants/navy-gold-grain.json +1 -1
  46. package/themes/circuit-board/variants/wine-gold-pretendard.json +1 -1
  47. package/themes/clay-toy/sample/style.json +2 -2
  48. package/themes/clay-toy/style.json +2 -2
  49. package/themes/clay-toy/theme.json +3 -1
  50. package/themes/clay-toy/variants/blush-coral-grain.json +1 -1
  51. package/themes/clay-toy/variants/chalk-teal.json +1 -1
  52. package/themes/clay-toy/variants/frost-sky.json +1 -1
  53. package/themes/clay-toy/variants/frost-teal.json +1 -1
  54. package/themes/clay-toy/variants/lilac-plum-round.json +1 -1
  55. package/themes/clay-toy/variants/lilac-plum.json +1 -1
  56. package/themes/clay-toy/variants/sage-indigo.json +1 -1
  57. package/themes/conveyor-factory/sample/style.json +3 -3
  58. package/themes/conveyor-factory/style.json +3 -3
  59. package/themes/conveyor-factory/theme.json +3 -1
  60. package/themes/conveyor-factory/variants/cocoa-gold.json +1 -1
  61. package/themes/conveyor-factory/variants/navy-gold.json +1 -1
  62. package/themes/conveyor-factory/variants/slate-amber-2.json +1 -1
  63. package/themes/conveyor-factory/variants/slate-amber-suit.json +1 -1
  64. package/themes/conveyor-factory/variants/slate-gold-bold.json +1 -1
  65. package/themes/data-journal/theme.json +3 -1
  66. package/themes/data-journal/variants/deep-coral.json +1 -1
  67. package/themes/data-journal/variants/navy-lime.json +1 -1
  68. package/themes/data-journal/variants/wine-indigo.json +1 -1
  69. package/themes/debug-hud/sample/style.json +1 -1
  70. package/themes/debug-hud/style.json +1 -1
  71. package/themes/debug-hud/theme.json +2 -1
  72. package/themes/debug-hud/variants/cocoa-teal.json +2 -2
  73. package/themes/debug-hud/variants/deep-teal-scan.json +2 -2
  74. package/themes/debug-hud/variants/dusk-plum.json +2 -2
  75. package/themes/debug-hud/variants/forest-lime.json +2 -2
  76. package/themes/debug-hud/variants/slate-green.json +2 -2
  77. package/themes/debug-hud/variants/wine-gold.json +2 -2
  78. package/themes/depth-flight/sample/style.json +1 -1
  79. package/themes/depth-flight/style.json +1 -1
  80. package/themes/depth-flight/theme.json +3 -1
  81. package/themes/depth-flight/variants/cocoa-cyan.json +1 -1
  82. package/themes/depth-flight/variants/cocoa-violet.json +1 -1
  83. package/themes/depth-flight/variants/deep-sky.json +1 -1
  84. package/themes/depth-flight/variants/forest-blue.json +1 -1
  85. package/themes/depth-flight/variants/navy-sky-grain.json +1 -1
  86. package/themes/depth-flight/variants/navy-sky.json +1 -1
  87. package/themes/depth-flight/variants/night-teal.json +1 -1
  88. package/themes/depth-flight/variants/slate-indigo.json +1 -1
  89. package/themes/depth-flight/variants/slate-violet.json +1 -1
  90. package/themes/film-reel/sample/style.json +2 -2
  91. package/themes/film-reel/style.json +2 -2
  92. package/themes/film-reel/theme.json +3 -1
  93. package/themes/film-reel/variants/chalk-pink.json +1 -1
  94. package/themes/film-reel/variants/lilac-gold.json +1 -1
  95. package/themes/film-reel/variants/lilac-violet.json +1 -1
  96. package/themes/glass-light/sample/style.json +1 -1
  97. package/themes/glass-light/style.json +1 -1
  98. package/themes/glass-light/theme.json +3 -1
  99. package/themes/glass-light/variants/blush-pink.json +1 -1
  100. package/themes/glass-light/variants/blush-plum.json +1 -1
  101. package/themes/glass-light/variants/cream-violet.json +1 -1
  102. package/themes/glass-light/variants/frost-sky-suit.json +1 -1
  103. package/themes/glass-light/variants/frost-sky.json +1 -1
  104. package/themes/glass-light/variants/sage-green.json +1 -1
  105. package/themes/ink-wash/sample/style.json +3 -3
  106. package/themes/ink-wash/style.json +3 -3
  107. package/themes/ink-wash/theme.json +3 -1
  108. package/themes/iso-diorama/sample/style.json +1 -1
  109. package/themes/iso-diorama/style.json +1 -1
  110. package/themes/iso-diorama/theme.json +3 -1
  111. package/themes/iso-diorama/variants/chalk-plum.json +1 -1
  112. package/themes/iso-diorama/variants/cocoa-indigo.json +1 -1
  113. package/themes/iso-diorama/variants/dusk-blue.json +1 -1
  114. package/themes/iso-diorama/variants/dusk-coral.json +1 -1
  115. package/themes/iso-diorama/variants/dusk-jade.json +1 -1
  116. package/themes/iso-diorama/variants/forest-cyan.json +1 -1
  117. package/themes/iso-diorama/variants/frost-green.json +1 -1
  118. package/themes/iso-diorama/variants/frost-teal.json +1 -1
  119. package/themes/iso-diorama/variants/navy-amber.json +1 -1
  120. package/themes/isotype/sample/style.json +2 -2
  121. package/themes/isotype/style.json +2 -2
  122. package/themes/isotype/theme.json +2 -1
  123. package/themes/isotype/variants/blush-rose.json +1 -1
  124. package/themes/isotype/variants/chalk-coral.json +1 -1
  125. package/themes/isotype/variants/chalk-orange.json +1 -1
  126. package/themes/isotype/variants/frost-amber.json +1 -1
  127. package/themes/isotype/variants/frost-coral.json +1 -1
  128. package/themes/isotype/variants/frost-orange.json +1 -1
  129. package/themes/isotype/variants/sand-amber.json +1 -1
  130. package/themes/kawaii-sticker/sample/style.json +2 -2
  131. package/themes/kawaii-sticker/style.json +2 -2
  132. package/themes/kawaii-sticker/theme.json +3 -1
  133. package/themes/kawaii-sticker/variants/cream-gold.json +1 -1
  134. package/themes/kawaii-sticker/variants/dusk-green.json +1 -1
  135. package/themes/kawaii-sticker/variants/dusk-indigo.json +1 -1
  136. package/themes/kawaii-sticker/variants/dusk-sky.json +1 -1
  137. package/themes/kawaii-sticker/variants/dusk-teal.json +1 -1
  138. package/themes/kawaii-sticker/variants/frost-blue.json +1 -1
  139. package/themes/kawaii-sticker/variants/frost-plum.json +1 -1
  140. package/themes/kawaii-sticker/variants/lilac-violet.json +1 -1
  141. package/themes/kawaii-sticker/variants/navy-gold.json +1 -1
  142. package/themes/kawaii-sticker/variants/navy-plum.json +1 -1
  143. package/themes/lab-notebook/sample/style.json +3 -3
  144. package/themes/lab-notebook/style.json +3 -3
  145. package/themes/lab-notebook/theme.json +2 -1
  146. package/themes/lab-notebook/variants/blush-orange.json +1 -1
  147. package/themes/lab-notebook/variants/chalk-coral.json +1 -1
  148. package/themes/lab-notebook/variants/chalk-orange.json +1 -1
  149. package/themes/lab-notebook/variants/chalk-rose.json +1 -1
  150. package/themes/lab-notebook/variants/lilac-rose.json +1 -1
  151. package/themes/lab-notebook/variants/sage-rose.json +1 -1
  152. package/themes/lab-notebook/variants/sand-orange.json +1 -1
  153. package/themes/lab-notebook/variants/snow-orange.json +1 -1
  154. package/themes/lab-notebook/variants/snow-rose.json +1 -1
  155. package/themes/manga-panel/sample/style.json +3 -3
  156. package/themes/manga-panel/style.json +3 -3
  157. package/themes/manga-panel/theme.json +3 -1
  158. package/themes/manga-panel/variants/chalk-cyan-dots.json +1 -1
  159. package/themes/manga-panel/variants/chalk-rose.json +1 -1
  160. package/themes/manga-panel/variants/snow-cyan.json +1 -1
  161. package/themes/manga-panel/variants/snow-magenta-dots.json +1 -1
  162. package/themes/marble-run/sample/style.json +2 -2
  163. package/themes/marble-run/style.json +2 -2
  164. package/themes/marble-run/theme.json +3 -1
  165. package/themes/marble-run/variants/slate-orange.json +1 -1
  166. package/themes/neon-sign/sample/style.json +2 -2
  167. package/themes/neon-sign/style.json +2 -2
  168. package/themes/neon-sign/theme.json +2 -1
  169. package/themes/neon-sign/variants/dusk-plum.json +1 -1
  170. package/themes/neon-sign/variants/forest-magenta.json +1 -1
  171. package/themes/neon-sign/variants/night-pink.json +1 -1
  172. package/themes/neon-sign/variants/night-violet.json +1 -1
  173. package/themes/neon-sign/variants/slate-violet.json +1 -1
  174. package/themes/newspaper/sample/style.json +2 -2
  175. package/themes/newspaper/style.json +2 -2
  176. package/themes/newspaper/theme.json +2 -1
  177. package/themes/newspaper/variants/blush-amber.json +1 -1
  178. package/themes/newspaper/variants/chalk-magenta.json +1 -1
  179. package/themes/newspaper/variants/frost-sky.json +1 -1
  180. package/themes/newspaper/variants/lilac-green.json +1 -1
  181. package/themes/newspaper/variants/sage-lime.json +1 -1
  182. package/themes/og-measure/THEME.md +32 -6
  183. package/themes/og-measure/effects.ts +219 -115
  184. package/themes/og-measure/sample/assets/brand/og-logo.svg +11 -11
  185. package/themes/og-measure/sample/lib/data.ts +6 -0
  186. package/themes/og-measure/sample/scenes/end.ts +14 -10
  187. package/themes/og-measure/sample/scenes/gather.ts +12 -1
  188. package/themes/og-measure/sample/scenes/models.ts +13 -2
  189. package/themes/og-measure/sample/scenes/one.ts +8 -6
  190. package/themes/og-measure/sample/scenes/price.ts +20 -3
  191. package/themes/og-measure/sample/style.json +30 -35
  192. package/themes/og-measure/slots.ts +25 -30
  193. package/themes/og-measure/still.png +0 -0
  194. package/themes/og-measure/style.json +30 -35
  195. package/themes/og-measure/theme.json +64 -49
  196. package/themes/og-measure/variants/snow-blue.json +90 -0
  197. package/themes/orbit-system/sample/style.json +3 -3
  198. package/themes/orbit-system/style.json +3 -3
  199. package/themes/orbit-system/theme.json +3 -1
  200. package/themes/orbit-system/variants/cocoa-amber.json +1 -1
  201. package/themes/orbit-system/variants/cocoa-cyan.json +1 -1
  202. package/themes/orbit-system/variants/dusk-magenta.json +1 -1
  203. package/themes/orbit-system/variants/dusk-violet.json +1 -1
  204. package/themes/orbit-system/variants/forest-coral.json +1 -1
  205. package/themes/orbit-system/variants/wine-amber.json +1 -1
  206. package/themes/orbit-system/variants/wine-magenta.json +1 -1
  207. package/themes/origami-fold/sample/style.json +1 -1
  208. package/themes/origami-fold/style.json +1 -1
  209. package/themes/origami-fold/theme.json +3 -1
  210. package/themes/origami-fold/variants/deep-amber-sunflower.json +1 -1
  211. package/themes/origami-fold/variants/deep-orange.json +1 -1
  212. package/themes/origami-fold/variants/forest-coral.json +1 -1
  213. package/themes/origami-fold/variants/forest-pink.json +1 -1
  214. package/themes/origami-fold/variants/frost-amber-paper.json +1 -1
  215. package/themes/origami-fold/variants/sage-coral-sunflower.json +1 -1
  216. package/themes/origami-fold/variants/sage-coral.json +1 -1
  217. package/themes/origami-fold/variants/sage-pink-round.json +1 -1
  218. package/themes/origami-fold/variants/sage-pink.json +1 -1
  219. package/themes/paper-cutout/sample/style.json +2 -2
  220. package/themes/paper-cutout/style.json +2 -2
  221. package/themes/paper-cutout/theme.json +3 -1
  222. package/themes/paper-cutout/variants/blush-violet.json +1 -1
  223. package/themes/paper-cutout/variants/frost-lime.json +1 -1
  224. package/themes/paper-cutout/variants/lilac-gold.json +1 -1
  225. package/themes/paper-cutout/variants/sage-cyan.json +1 -1
  226. package/themes/paper-cutout/variants/sage-green.json +1 -1
  227. package/themes/paper-cutout/variants/sage-pink.json +1 -1
  228. package/themes/paper-cutout/variants/sand-blue.json +1 -1
  229. package/themes/pixel-quest/theme.json +2 -1
  230. package/themes/receipt/sample/style.json +2 -2
  231. package/themes/receipt/style.json +2 -2
  232. package/themes/riso-zine/sample/style.json +2 -2
  233. package/themes/riso-zine/style.json +2 -2
  234. package/themes/riso-zine/theme.json +3 -1
  235. package/themes/riso-zine/variants/chalk-lime.json +1 -1
  236. package/themes/riso-zine/variants/frost-green.json +1 -1
  237. package/themes/riso-zine/variants/lilac-plum.json +1 -1
  238. package/themes/riso-zine/variants/lilac-violet.json +1 -1
  239. package/themes/server-hall/sample/style.json +2 -2
  240. package/themes/server-hall/style.json +2 -2
  241. package/themes/server-hall/theme.json +3 -1
  242. package/themes/server-hall/variants/night-indigo.json +1 -1
  243. package/themes/server-hall/variants/wine-plum.json +1 -1
  244. package/themes/subway-map/sample/style.json +2 -2
  245. package/themes/subway-map/style.json +2 -2
  246. package/themes/subway-map/theme.json +3 -1
  247. package/themes/subway-map/variants/deep-green.json +1 -1
  248. package/themes/subway-map/variants/deep-teal.json +1 -1
  249. package/themes/subway-map/variants/frost-jade.json +1 -1
  250. package/themes/subway-map/variants/frost-teal.json +1 -1
  251. package/themes/subway-map/variants/slate-green.json +1 -1
  252. package/themes/subway-map/variants/snow-jade.json +1 -1
  253. package/themes/swiss-poster/sample/style.json +2 -2
  254. package/themes/swiss-poster/style.json +2 -2
  255. package/themes/swiss-poster/theme.json +3 -1
  256. package/themes/swiss-poster/variants/chalk-plum.json +1 -1
  257. package/themes/swiss-poster/variants/cocoa-cyan.json +1 -1
  258. package/themes/swiss-poster/variants/dusk-magenta.json +1 -1
  259. package/themes/swiss-poster/variants/frost-indigo.json +1 -1
  260. package/themes/swiss-poster/variants/slate-orange.json +1 -1
  261. package/themes/water-works/sample/style.json +1 -1
  262. package/themes/water-works/style.json +1 -1
  263. package/themes/water-works/theme.json +3 -1
  264. package/themes/water-works/variants/chalk-cyan.json +1 -1
  265. package/themes/water-works/variants/frost-indigo.json +1 -1
  266. package/themes/water-works/variants/sand-amber.json +1 -1
  267. package/themes/water-works/variants/sand-plum.json +1 -1
  268. package/themes/whiteboard/sample/style.json +2 -2
  269. package/themes/whiteboard/style.json +2 -2
  270. package/themes/whiteboard/theme.json +3 -1
  271. package/themes/whiteboard/variants/chalk-coral.json +1 -1
  272. package/themes/whiteboard/variants/cream-lime.json +1 -1
  273. package/themes/whiteboard/variants/frost-teal.json +1 -1
  274. package/themes/whiteboard/variants/lilac-indigo.json +1 -1
  275. package/themes/whiteboard/variants/sage-plum.json +1 -1
  276. package/themes/whiteboard/variants/snow-cyan.json +1 -1
  277. package/themes/whiteboard/variants/snow-green.json +1 -1
  278. package/themes/whiteboard/variants/snow-magenta.json +1 -1
  279. package/themes/og-measure/sample/assets/brand/og-logo-full.svg +0 -12
  280. package/themes/og-measure/variants/chalk-orange.json +0 -102
  281. package/themes/og-measure/variants/cocoa-amber.json +0 -138
  282. package/themes/og-measure/variants/cocoa-cyan.json +0 -138
  283. package/themes/og-measure/variants/cocoa-gold.json +0 -129
  284. package/themes/og-measure/variants/cream-lime.json +0 -137
  285. package/themes/og-measure/variants/deep-jade.json +0 -100
  286. package/themes/og-measure/variants/dusk-violet.json +0 -133
  287. package/themes/og-measure/variants/forest-cyan.json +0 -123
  288. package/themes/og-measure/variants/frost-amber.json +0 -129
  289. package/themes/og-measure/variants/frost-cyan.json +0 -133
  290. package/themes/og-measure/variants/lilac-plum.json +0 -127
  291. package/themes/og-measure/variants/lilac-violet.json +0 -139
  292. package/themes/og-measure/variants/sage-green.json +0 -137
  293. package/themes/og-measure/variants/wine-jade.json +0 -127
  294. package/themes/og-measure/variants/wine-plum.json +0 -127
package/NOTICE CHANGED
@@ -146,3 +146,301 @@ MIT — Copyright (c) 2026 NikusonP
146
146
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
147
147
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
148
148
  SOFTWARE.
149
+
150
+ ----------------------------------------------------------------------
151
+ 글꼴 짝 — packages/themes/kit/fonts.json · kit/fonts/<무리>.json (kf fonts notice --write 가 이 절을 짓는다)
152
+ 글꼴 파일은 싣지 않는다 — 영상을 구울 때 판을 박은 주소(jsdelivr gh@커밋·npm@판)에서 받는다. 모두 상업 이용·영상·
153
+ 웹 임베딩이 허용된 라이선스이고 출처 표기 의무가 없다. kf fonts check 가 라이선스 글이나 파일 name 13 에서 그 문구를 대 본다.
154
+ 짝 305 · 글꼴 287 — 이름 · 라이선스 · 라이선스 글
155
+
156
+ Abril Fatface OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/abrilfatface/OFL.txt
157
+ Albert Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/albertsans/OFL.txt
158
+ Alegreya OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/alegreya/OFL.txt
159
+ Alegreya Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/alegreyasans/OFL.txt
160
+ Aleo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/aleo/OFL.txt
161
+ Alfa Slab One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/alfaslabone/OFL.txt
162
+ Anton OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/anton/OFL.txt
163
+ Antonio OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/antonio/OFL.txt
164
+ Architects Daughter OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/architectsdaughter/OFL.txt
165
+ Archivo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/archivo/OFL.txt
166
+ Archivo Black OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/archivoblack/OFL.txt
167
+ Archivo Narrow OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/archivonarrow/OFL.txt
168
+ Arvo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/arvo/OFL.txt
169
+ Asta Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/astasans/OFL.txt
170
+ Atkinson Hyperlegible Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/atkinsonhyperlegiblemono/OFL.txt
171
+ Audiowide OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/audiowide/OFL.txt
172
+ Azeret Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/azeretmono/OFL.txt
173
+ Bagel Fat One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bagelfatone/OFL.txt
174
+ Bangers OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bangers/OFL.txt
175
+ Barlow OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/barlow/OFL.txt
176
+ Baskervville OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/baskervville/OFL.txt
177
+ Bebas Neue OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bebasneue/OFL.txt
178
+ Bellefair OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bellefair/OFL.txt
179
+ Besley OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/besley/OFL.txt
180
+ Big Shoulders Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bigshouldersdisplay/OFL.txt
181
+ Bitter OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bitter/OFL.txt
182
+ Black And White Picture OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/blackandwhitepicture/OFL.txt
183
+ Black Han Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/blackhansans/OFL.txt
184
+ Black Ops One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/blackopsone/OFL.txt
185
+ BM EULJIRO OFL-1.1 https://www.woowahan.com/fonts/license
186
+ BM Euljiro 10 years later OFL-1.1 https://www.woowahan.com/fonts/license
187
+ BM HANNA Air OFL-1.1 https://www.woowahan.com/fonts/license
188
+ BM HANNA Pro OFL-1.1 https://www.woowahan.com/fonts/license
189
+ Bodoni Moda OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bodonimoda/OFL.txt
190
+ Bricolage Grotesque OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bricolagegrotesque/OFL.txt
191
+ Brygada 1918 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/brygada1918/OFL.txt
192
+ Bungee OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bungee/OFL.txt
193
+ Bungee Inline OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bungeeinline/OFL.txt
194
+ Bungee Outline OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bungeeoutline/OFL.txt
195
+ Cabin OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cabin/OFL.txt
196
+ Cafe24 ClassicType OFL-1.1 https://fonts.cafe24.com/
197
+ Cafe24 Danjunghae OFL-1.1 https://fonts.cafe24.com/
198
+ Cafe24 Dongdong OFL-1.1 https://fonts.cafe24.com/
199
+ Cafe24 Ohsquare OFL-1.1 https://fonts.cafe24.com/
200
+ Cafe24 Oneprettynight OFL-1.1 https://fonts.cafe24.com/
201
+ Cafe24 Shiningstar OFL-1.1 https://fonts.cafe24.com/
202
+ Cafe24 Simplehae OFL-1.1 https://fonts.cafe24.com/
203
+ Cafe24 Ssukssuk OFL-1.1 https://fonts.cafe24.com/
204
+ Cafe24 Ssurround OFL-1.1 https://fonts.cafe24.com/
205
+ Cafe24 Ssurround Air OFL-1.1 https://fonts.cafe24.com/
206
+ Cafe24 Syongsyong OFL-1.1 https://fonts.cafe24.com/
207
+ Caveat OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/caveat/OFL.txt
208
+ Chakra Petch OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/chakrapetch/OFL.txt
209
+ Chango OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/chango/OFL.txt
210
+ Chewy Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/chewy/LICENSE.txt
211
+ Chivo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/chivo/OFL.txt
212
+ Chivo Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/chivomono/OFL.txt
213
+ Cinzel OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cinzel/OFL.txt
214
+ Coiny OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/coiny/OFL.txt
215
+ Comfortaa OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/comfortaa/OFL.txt
216
+ Comic Neue OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/comicneue/OFL.txt
217
+ Commissioner OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/commissioner/OFL.txt
218
+ Cormorant OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cormorant/OFL.txt
219
+ Cormorant Garamond OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cormorantgaramond/OFL.txt
220
+ Courier Prime OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/courierprime/OFL.txt
221
+ Covered By Your Grace OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/coveredbyyourgrace/OFL.txt
222
+ Crimson Pro OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/crimsonpro/OFL.txt
223
+ Cute Font OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cutefont/OFL.txt
224
+ Cutive Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cutivemono/OFL.txt
225
+ D2Coding OFL-1.1 https://raw.githubusercontent.com/naver/d2codingfont/b0dc372e28d7abdba7f3cba854855ceffbd490a8/OFL.txt
226
+ Diphylleia OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/diphylleia/OFL.txt
227
+ DM Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dmmono/OFL.txt
228
+ DM Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dmsans/OFL.txt
229
+ DM Serif Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dmserifdisplay/OFL.txt
230
+ Do Hyeon OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dohyeon/OFL.txt
231
+ Dokdo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dokdo/OFL.txt
232
+ Domine OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/domine/OFL.txt
233
+ Dongle OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dongle/OFL.txt
234
+ Doto OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/doto/OFL.txt
235
+ DynaPuff OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dynapuff/OFL.txt
236
+ East Sea Dokdo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/eastseadokdo/OFL.txt
237
+ EB Garamond OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ebgaramond/OFL.txt
238
+ Epilogue OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/epilogue/OFL.txt
239
+ Exo 2 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/exo2/OFL.txt
240
+ Figtree OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/figtree/OFL.txt
241
+ Fira Code OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/firacode/OFL.txt
242
+ Fira Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/firamono/OFL.txt
243
+ Fjalla One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/fjallaone/OFL.txt
244
+ Forum OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/forum/OFL.txt
245
+ Fraunces OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/fraunces/OFL.txt
246
+ Fredoka OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/fredoka/OFL.txt
247
+ Freesentation OFL-1.1 https://cdn.jsdelivr.net/gh/Freesentation/freesentation@98f6b841fca55a23fbb0f9eb91acda0e16a676ea/OFL%20license.txt
248
+ Funnel Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/funneldisplay/OFL.txt
249
+ Gaegu OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gaegu/OFL.txt
250
+ Galmuri11 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
251
+ Galmuri11 Condensed OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
252
+ Galmuri14 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
253
+ Galmuri7 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
254
+ Galmuri9 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
255
+ GalmuriMono11 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
256
+ GalmuriMono7 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
257
+ GalmuriMono9 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
258
+ Gamja Flower OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gamjaflower/OFL.txt
259
+ Gasoek One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gasoekone/OFL.txt
260
+ Geist OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/geist/OFL.txt
261
+ Geist OFL-1.1 https://cdn.jsdelivr.net/npm/geist@1.3.1/LICENSE.TXT
262
+ Geist Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/geistmono/OFL.txt
263
+ Geist Mono OFL-1.1 https://cdn.jsdelivr.net/npm/geist@1.3.1/LICENSE.TXT
264
+ Gelasio OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gelasio/OFL.txt
265
+ Geologica OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/geologica/OFL.txt
266
+ Gilda Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gildadisplay/OFL.txt
267
+ Gloock OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gloock/OFL.txt
268
+ Gochi Hand OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gochihand/OFL.txt
269
+ Golos Text OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/golostext/OFL.txt
270
+ goorm Sans OFL-1.1 https://cdn.jsdelivr.net/npm/goorm-sans@1.0.0/LICENSE.md
271
+ goorm Sans Code OFL-1.1 https://cdn.jsdelivr.net/npm/goorm-sans@1.0.0/LICENSE.md
272
+ Gothic A1 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gothica1/OFL.txt
273
+ Gowun Batang OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gowunbatang/OFL.txt
274
+ Gowun Dodum OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gowundodum/OFL.txt
275
+ Grandiflora One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/grandifloraone/OFL.txt
276
+ Grandstander OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/grandstander/OFL.txt
277
+ Gugi OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gugi/OFL.txt
278
+ Hahmlet OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/hahmlet/OFL.txt
279
+ Hanken Grotesk OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/hankengrotesk/OFL.txt
280
+ Hepta Slab OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/heptaslab/OFL.txt
281
+ Hi Melody OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/himelody/OFL.txt
282
+ Host Grotesk OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/hostgrotesk/OFL.txt
283
+ Hubot Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/hubotsans/OFL.txt
284
+ IBM Plex Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ibmplexmono/OFL.txt
285
+ IBM Plex Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ibmplexsans/OFL.txt
286
+ IBM Plex Sans KR OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ibmplexsanskr/OFL.txt
287
+ IBM Plex Serif OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ibmplexserif/OFL.txt
288
+ IM Fell English OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/imfellenglish/OFL.txt
289
+ Inconsolata OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/inconsolata/OFL.txt
290
+ Indie Flower OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/indieflower/OFL.txt
291
+ Instrument Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/instrumentsans/OFL.txt
292
+ Instrument Serif OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/instrumentserif/OFL.txt
293
+ Inter OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/inter/OFL.txt
294
+ Inter Tight OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/intertight/OFL.txt
295
+ Iropke Batang OFL-1.1 https://cdn.jsdelivr.net/gh/iropke/font-iropke-batang@v1.2/README.md
296
+ Italiana OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/italiana/OFL.txt
297
+ Jersey 10 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/jersey10/OFL.txt
298
+ Jersey 15 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/jersey15/OFL.txt
299
+ JetBrains Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/jetbrainsmono/OFL.txt
300
+ JetBrains Mono OFL-1.1 https://cdn.jsdelivr.net/npm/@fontsource-variable/jetbrains-mono@5.3.0/LICENSE
301
+ Josefin Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/josefinsans/OFL.txt
302
+ Josefin Slab OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/josefinslab/OFL.txt
303
+ Jost OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/jost/OFL.txt
304
+ Jua OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/jua/OFL.txt
305
+ Kalam OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/kalam/OFL.txt
306
+ Kirang Haerang OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/kiranghaerang/OFL.txt
307
+ Kode Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/kodemono/OFL.txt
308
+ Kumbh Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/kumbhsans/OFL.txt
309
+ Lato OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/lato/OFL.txt
310
+ League Gothic OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/leaguegothic/OFL.txt
311
+ League Spartan OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/leaguespartan/OFL.txt
312
+ Lexend OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/lexend/OFL.txt
313
+ Libertinus Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/libertinusmono/OFL.txt
314
+ Libre Baskerville OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/librebaskerville/OFL.txt
315
+ Libre Bodoni OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/librebodoni/OFL.txt
316
+ Libre Caslon Text OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/librecaslontext/OFL.txt
317
+ Libre Franklin OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/librefranklin/OFL.txt
318
+ Lilita One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/lilitaone/OFL.txt
319
+ LINE Seed Sans KR OFL-1.1 https://raw.githubusercontent.com/line/seed/0564884c67ebdb3b31e90e2106c2d061f953b6a0/OFL.txt
320
+ Literata OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/literata/OFL.txt
321
+ Lora OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/lora/OFL.txt
322
+ Luckiest Guy Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/luckiestguy/LICENSE.txt
323
+ Manrope OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/manrope/OFL.txt
324
+ Mansalva OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/mansalva/OFL.txt
325
+ Marcellus OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/marcellus/OFL.txt
326
+ Martian Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/martianmono/OFL.txt
327
+ MaruBuri OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
328
+ Michroma OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/michroma/OFL.txt
329
+ Micro 5 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/micro5/OFL.txt
330
+ Moirai One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/moiraione/OFL.txt
331
+ Mona Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/monasans/OFL.txt
332
+ Monoton OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/monoton/OFL.txt
333
+ Montserrat OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/montserrat/OFL.txt
334
+ Nanum BaReunHiPi OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
335
+ Nanum Brush Script OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nanumbrushscript/OFL.txt
336
+ Nanum DaHaengCe OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
337
+ Nanum GarMaesGeur OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
338
+ Nanum GoDigANiGoGoDing OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
339
+ Nanum Gothic OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nanumgothic/OFL.txt
340
+ Nanum Gothic Coding OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nanumgothiccoding/OFL.txt
341
+ Nanum JungHagSaeng OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
342
+ Nanum KarGugSu OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
343
+ Nanum Myeongjo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nanummyeongjo/OFL.txt
344
+ Nanum Pen Script OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nanumpenscript/OFL.txt
345
+ NanumBarunGothic OFL-1.1 https://help.naver.com/service/30016/contents/18088?lang=ko&osType=PC
346
+ NanumSquare Neo OFL-1.1 https://help.naver.com/service/30016/contents/18088?lang=ko&osType=PC
347
+ NeoDunggeunmo OFL-1.1 https://cdn.jsdelivr.net/gh/Dalgona/neodgm@v1.601/LICENSE.txt
348
+ NeoDunggeunmo Code OFL-1.1 https://cdn.jsdelivr.net/gh/Dalgona/neodgm@v1.601/LICENSE.txt
349
+ Newsreader OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/newsreader/OFL.txt
350
+ Noticia Text OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/noticiatext/OFL.txt
351
+ Noto Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/notosans/OFL.txt
352
+ Noto Sans KR OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/notosanskr/OFL.txt
353
+ Noto Sans Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/notosansmono/OFL.txt
354
+ Noto Serif KR OFL-1.1 https://cdn.jsdelivr.net/gh/notofonts/noto-cjk@9b0f1436e455d902de067a2501422e5dc71ad16b/Serif/LICENSE
355
+ Nunito OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nunito/OFL.txt
356
+ Nunito Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nunitosans/OFL.txt
357
+ Old Standard TT OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/oldstandardtt/OFL.txt
358
+ Onest OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/onest/OFL.txt
359
+ Open Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/opensans/OFL.txt
360
+ Orbit OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/orbit/OFL.txt
361
+ Orbitron OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/orbitron/OFL.txt
362
+ Oswald OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/oswald/OFL.txt
363
+ Outfit OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/outfit/OFL.txt
364
+ Overpass OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/overpass/OFL.txt
365
+ Overpass Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/overpassmono/OFL.txt
366
+ Paperlogy OFL-1.1 https://cdn.jsdelivr.net/gh/Freesentation/paperlogy@8ef35f53b318c7ca914c52b1b382b9a8bad07a61/OFL%20license.txt
367
+ Patrick Hand OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/patrickhand/OFL.txt
368
+ Paytone One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/paytoneone/OFL.txt
369
+ Permanent Marker Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/permanentmarker/LICENSE.txt
370
+ Petrona OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/petrona/OFL.txt
371
+ Pixelify Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/pixelifysans/OFL.txt
372
+ Playfair Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/playfairdisplay/OFL.txt
373
+ Playpen Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/playpensans/OFL.txt
374
+ Plus Jakarta Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/plusjakartasans/OFL.txt
375
+ Poor Story OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/poorstory/OFL.txt
376
+ Poppins OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/poppins/OFL.txt
377
+ Prata OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/prata/OFL.txt
378
+ Press Start 2P OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/pressstart2p/OFL.txt
379
+ Pretendard Variable OFL-1.1 https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/LICENSE
380
+ Pretendard Variable OFL-1.1 https://cdn.jsdelivr.net/npm/pretendard@1.3.9/dist/LICENSE.txt
381
+ PT Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ptmono/OFL.txt
382
+ PT Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ptsans/OFL.txt
383
+ PT Serif OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ptserif/OFL.txt
384
+ Public Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/publicsans/OFL.txt
385
+ Quicksand OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/quicksand/OFL.txt
386
+ Red Hat Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/redhatdisplay/OFL.txt
387
+ Red Hat Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/redhatmono/OFL.txt
388
+ Reenie Beanie OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/reeniebeanie/OFL.txt
389
+ RIDIBatang OFL-1.1 https://cdn.jsdelivr.net/gh/fonts-archive/RIDIBatang@f1628238e56fd41c12451dfc7d975527b61ebfc7/README.md
390
+ Righteous OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/righteous/OFL.txt
391
+ Roboto OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/roboto/OFL.txt
392
+ Roboto Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/robotomono/OFL.txt
393
+ Roboto Slab Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/robotoslab/LICENSE.txt
394
+ Rokkitt OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/rokkitt/OFL.txt
395
+ Rozha One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/rozhaone/OFL.txt
396
+ Rubik Bubbles OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/rubikbubbles/OFL.txt
397
+ Russo One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/russoone/OFL.txt
398
+ Rye OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/rye/OFL.txt
399
+ Sacramento OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sacramento/OFL.txt
400
+ Saira OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/saira/OFL.txt
401
+ Schibsted Grotesk OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/schibstedgrotesk/OFL.txt
402
+ Schoolbell Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/schoolbell/LICENSE.txt
403
+ Sedgwick Ave OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sedgwickave/OFL.txt
404
+ Share Tech Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sharetechmono/OFL.txt
405
+ Short Stack OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/shortstack/OFL.txt
406
+ Shrikhand OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/shrikhand/OFL.txt
407
+ Silkscreen OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/silkscreen/OFL.txt
408
+ Single Day OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/singleday/OFL.txt
409
+ Sixtyfour OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sixtyfour/OFL.txt
410
+ Sniglet OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sniglet/OFL.txt
411
+ Sometype Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sometypemono/OFL.txt
412
+ Song Myung OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/songmyung/OFL.txt
413
+ Sora OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sora/OFL.txt
414
+ Source Code Pro OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sourcecodepro/OFL.txt
415
+ Source Sans 3 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sourcesans3/OFL.txt
416
+ Source Serif 4 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sourceserif4/OFL.txt
417
+ Space Grotesk OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/spacegrotesk/OFL.txt
418
+ Space Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/spacemono/OFL.txt
419
+ Special Elite Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/specialelite/LICENSE.txt
420
+ Spectral OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/spectral/OFL.txt
421
+ Spline Sans Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/splinesansmono/OFL.txt
422
+ Spoqa Han Sans Neo OFL-1.1 https://cdn.jsdelivr.net/npm/spoqa-han-sans@3.3.0/LICENSE
423
+ Stylish OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/stylish/OFL.txt
424
+ SUIT Variable OFL-1.1 https://cdn.jsdelivr.net/gh/sun-typeface/SUIT@2.0.5/LICENSE
425
+ SUITE Variable OFL-1.1 https://cdn.jsdelivr.net/gh/sun-typeface/SUITE@v2.0.4/LICENSE
426
+ Sunflower OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sunflower/OFL.txt
427
+ Syne OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/syne/OFL.txt
428
+ Tilt Neon OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/tiltneon/OFL.txt
429
+ Tiny5 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/tiny5/OFL.txt
430
+ Titan One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/titanone/OFL.txt
431
+ Ultra Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/ultra/LICENSE.txt
432
+ Unbounded OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/unbounded/OFL.txt
433
+ Urbanist OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/urbanist/OFL.txt
434
+ Varela Round OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/varelaround/OFL.txt
435
+ Victor Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/victormono/OFL.txt
436
+ Vollkorn OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/vollkorn/OFL.txt
437
+ VT323 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/vt323/OFL.txt
438
+ Wanted Sans Variable OFL-1.1 https://cdn.jsdelivr.net/npm/wanted-sans@1.0.3/fonts/OFL.txt
439
+ Work Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/worksans/OFL.txt
440
+ Workbench OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/workbench/OFL.txt
441
+ Xanh Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/xanhmono/OFL.txt
442
+ Yellowtail Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/yellowtail/LICENSE.txt
443
+ Yeon Sung OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/yeonsung/OFL.txt
444
+ Yeseva One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/yesevaone/OFL.txt
445
+ Young Serif OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/youngserif/OFL.txt
446
+ Zilla Slab OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/zillaslab/OFL.txt
package/README.md CHANGED
@@ -9,9 +9,21 @@
9
9
  ```sh
10
10
  npm i -g kasaframe
11
11
  kf setup # Playwright 크롬 + librosa(곡 분석) 받기
12
- kf doctor # ffmpeg·크롬·librosa·OG 키 점검 — 없는 것은 까는 명령을 알려 준다
12
+ kf doctor # 판·ffmpeg·크롬·librosa·OG 키 점검 — 없는 것은 까는 명령을 알려 준다
13
13
  ```
14
14
 
15
+ ### 업데이트
16
+
17
+ kf 는 몇 시간에 한 번 뒤에서 새 판을 확인해 둔다(기다리지 않는다). 새 판을 알면 터미널에서는 명령 전에 「1) 지금 업데이트 2) 건너뛰기 3) 이 판은 다시 묻지 않기」를 묻고, 1 이면 깐 방식(npm·pnpm·bun·yarn)대로 올린 뒤 치던 명령을 새 판으로 이어 돈다. 터미널이 아니면(에이전트·파이프) 표준 오류에 `[kasaframe] 새 판 <최신> (지금 <지금>) — kf update` 한 줄만 찍는다.
18
+
19
+ ```sh
20
+ kf update # 지금 확인하고 올리기
21
+ kf update --check # 보기만 (--json 이면 {current, latest, update, command})
22
+ kf update --yes # 묻지 않고 — 에이전트용
23
+ ```
24
+
25
+ 끄기: `KF_NO_UPDATE_CHECK=1` 또는 `CI`. 레지스트리는 npm 설정을 따르고, 권한이 없어 못 올리면 칠 명령을 보여 주고 지금 판으로 이어 간다(sudo 는 쓰지 않는다).
26
+
15
27
  ## 요구 사항
16
28
 
17
29
  | 무엇 | 왜 | 깔기 |
@@ -81,9 +93,10 @@ kf skill install # ~/.claude/skills/kasaframe 에 스킬 링
81
93
  | `kf narrate` | 내레이션 먼저 — 장면별 문장을 TTS 로 읽혀 장면 길이를 목소리에 맞추고(곡이 있으면 박에), 자막을 목소리 시각으로 |
82
94
  | `kf music` | 곡 모음(분위기 태그) 보기·넣기, 음악 생성(Lyria · Eleven Music) |
83
95
  | `kf transitions` | 전환 목록 — 이름·출처·라이선스 |
84
- | `kf theme list [--variants]` · `kf theme sheet [--variants <세계\|all>]` · `kf theme vary <세계\|all>` · `kf theme suggest [--json]` | 테마 — 세계(`riso-zine` · `debug-hud` · `og-measure` …)와 겉모습만 바꾼 변주(`og-measure/night-amber`), 같은 문장 한 장면을 테마마다 찍은 견본 격자, 변주 뽑기, 요청에 맞는 후보(kf make 의 테마 질문과 같은 고르기) |
96
+ | `kf theme list [--variants]` · `kf theme sheet [--variants <세계\|all>]` · `kf theme vary <세계\|all>` · `kf theme suggest [--json]` | 테마 — 세계(`riso-zine` · `debug-hud` · `og-measure` …)와 겉모습만 바꾼 변주(`og-measure/snow-blue`), 같은 문장 한 장면을 테마마다 찍은 견본 격자, 변주 뽑기, 요청에 맞는 후보(kf make 의 테마 질문과 같은 고르기) |
85
97
  | `kf app` | 작업실 — 요청 칸·실시간 미리보기·렌더·검사 보고를 브라우저로(:5150) |
86
- | `kf doctor` · `kf setup` | 바깥 도구 점검 · 깔기 |
98
+ | `kf doctor` · `kf setup` | 판·바깥 도구 점검 · 깔기 |
99
+ | `kf update` | 새 판 확인·올리기(`--check` · `--json` · `--yes`) |
87
100
  | `kf skill` | Claude Code 스킬 링크 |
88
101
 
89
102
  `kf <명령> --help` 로 인자를 본다. 렌더·검사는 한 기계에서 하나씩 돈다(잠금 — 다른 렌더가 쥐고 있으면 기다린다).
package/docs/AGENTS.md CHANGED
@@ -13,7 +13,7 @@ kf make "카사텀 홍보 영상 1분, 카와이 퓨처베이스" [--music 곡.m
13
13
  - **그림 보기는 세션이 직접**: `kf look <폴더|mp4>` 가 장면 모음(`out/look-sheet.png`)과 장면별 확인표(`out/look.md` — 빈 화면·글 깨짐·대비·잘림·주인공 자리·할 일·테마)를 만들고 경로만 찍는다. 외부 모델을 부르지 않는다. **눈 없는 모델**(Claude Code 를 OG 로 딥시크 같은 모델에 붙였을 때 — OG `/v1/messages` 는 그림을 버려서 Read 해도 안 보인다)만 `kf look <폴더|mp4> --vision-model google/gemini-3.5-flash [--ask "<볼 것>"]` 로 그림 보는 모델이 장면마다 글로 보고한다(한 번 1센트 안팎, 묻지 않고 써도 된다). `kf make --finish` 도 기본은 그림 보는 모델 없이 끝에 장면 모음·확인표 경로를 찍는다.
14
14
  - **곡**: 홍보·공개·뮤비는 곡이 끌고 간다. `--music` 을 안 주면 곡 모음(`KF_MUSIC_DIR`, 없으면 레포 `music/` — 곡마다 원본·라이선스·분위기 태그는 `music/tags.json`·`README.md`. npm 패키지에는 곡이 없다)에서 요청 낱말과 맞는 곡을 고른다. 곡 모음이 비었으면 `--music` 으로 준다.
15
15
  - **목소리·곡(쇼츠·설명)**: 차분한 TTS 내레이션 + 깊은 앰비언트 곡(`deep`)이 기본이다. 곡은 분위기 태그가 맞는 곡 모음 곡을 묻지 않고 고르고(같은 틀이면 늘 같은 곡), 없으면 생성(Lyria·Eleven Music, 돈)·곡 넣기·없음을 묻는다. 목소리는 늘 맨 위 질문으로 묻는다 — 보기 차례 로컬 Qwen3(`KF_QWEN3_TTS_URL` 이 있을 때)·ElevenLabs(키가 없으면 넣는 법)·자막만·그 밖 엔진(`kf narrate --voices`). 로컬도 ElevenLabs 도 없거나 생성 키가 없으면 다른 엔진·「자막만」·「곡 없이」로 넘어가지 말고 맨 위 질문대로 사람에게 묻는다(키 넣기가 권장). 묻지 않으려면 `--voice <엔진>:<목소리>|none`·`--music <곡>|gen:lyria-3.5|none`. 그다음은 아래 「내레이션 먼저」.
16
- - **용도·테마**: 용도는 확신이 낮을 때만 묻는다. 테마는 요청이 「리소 느낌으로」처럼 짚었거나 시리즈가 정했으면 그대로, 아니면 맨 위 질문으로 묻는다 — 테마는 「세계 × 변주」(세계 = 비유와 효과 코드, 변주 = 겉모습만 바꾼 판 `<세계>/<변주>`, 예 `og-measure/night-amber`)라 수백 판이고, 보기는 「알아서」(= `auto`, 첫 후보)와 요청·용도·분위기 낱말에 맞는 넷뿐이다. 질문 글에 넷만 담은 견본 시트 경로가 붙는다 — 그 그림을 사람에게 보인다. 사람이 보기 밖으로 분위기 한 마디나 그림·주소를 주면 `kf make --answer <폴더> --theme-mood "<말>"`·`--theme-ref <경로|URL>` 로 넣는다(후보 넷·시트·MAKE.md 를 다시 고쳐 쓰고 종료 3 — 다시 묻는다). 답이 오기 전 뼈대는 첫 후보로 깔려 있다. 못 박으려면 `--purpose <용도>`·`--theme <id>`, 테마 없이 프리셋만이면 `--theme none`. **시리즈**(`kf series list` — 예 「OG 쇼츠」)를 짚으면 용도·테마보다 먼저 그 묶음(용도·테마·목소리·곡·자막·길이·끝 카드·생성 답)으로 묻지 않고 간다 — 같은 시리즈면 매번 같다. 잘 나온 프로젝트를 묶음으로: `kf series new <id> --from <폴더> --match "…"`. 같은 말이 같은 결과를 내는지는 `kf bench "<요청>" --runs 3`. 묻는 것은 용도 확신이 낮을 때뿐(종료 코드 3).
16
+ - **용도·테마**: 용도는 확신이 낮을 때만 묻는다. 테마는 요청이 「리소 느낌으로」처럼 짚었거나 시리즈가 정했으면 그대로, 아니면 맨 위 질문으로 묻는다 — 테마는 「세계 × 변주」(세계 = 비유와 효과 코드, 변주 = 겉모습만 바꾼 판 `<세계>/<변주>`, 예 `og-measure/snow-blue`)라 수백 판이고, 보기는 「알아서」(= `auto`, 첫 후보)와 요청·용도·분위기 낱말에 맞는 넷뿐이다. 질문 글에 넷만 담은 견본 시트 경로가 붙는다 — 그 그림을 사람에게 보인다. 사람이 보기 밖으로 분위기 한 마디나 그림·주소를 주면 `kf make --answer <폴더> --theme-mood "<말>"`·`--theme-ref <경로|URL>` 로 넣는다(후보 넷·시트·MAKE.md 를 다시 고쳐 쓰고 종료 3 — 다시 묻는다). 답이 오기 전 뼈대는 첫 후보로 깔려 있다. 못 박으려면 `--purpose <용도>`·`--theme <id>`, 테마 없이 프리셋만이면 `--theme none`. **시리즈**(`kf series list` — 예 「OG 쇼츠」)를 짚으면 용도·테마보다 먼저 그 묶음(용도·테마·목소리·곡·자막·길이·끝 카드·생성 답)으로 묻지 않고 간다 — 같은 시리즈면 매번 같다. 잘 나온 프로젝트를 묶음으로: `kf series new <id> --from <폴더> --match "…"`. 같은 말이 같은 결과를 내는지는 `kf bench "<요청>" --runs 3`. 묻는 것은 용도 확신이 낮을 때뿐(종료 코드 3).
17
17
  - **작업실**: `kf app` 이 떠 있으면 `kf make` 가 거기에 등록하고 주소를 찍는다 — 사람은 페이지에서 실시간 미리보기·지난 작업을 본다.
18
18
  - **Claude Code 스킬**: `kf skill install` 하면 「영상 만들어」 같은 말에 kasaframe 으로 오는 스킬이 깔린다(`skills/kasaframe/SKILL.md`).
19
19
  - **생성 능력**(`kf doctor` 「생성 능력」): 계획은 그림 컷·주인공 3D 장면(Blender 툰 샷, 없으면 three.js)·이음매 3D 전환(three)·캐릭터가 실제로 움직이는 컷(영상 모델 — 요청에 캐릭터와 몸짓이 있거나 뮤비일 때)·곡·내레이션을 기본으로 넣는다. **묻는 것은 돈이 들거나 없는 능력뿐**이고 나머지는 틀·테마가 정한 기본값으로 간다 — 같은 말이면 같은 결과. **없는 능력은 조용히 대체하지 않는다** — 「키·도구 넣는 법(권장) · 지금 되는 다른 엔진 · 빼기(자막만·곡 없이)」를 사람에게 묻고 고른 값을 플래그로 넣는다. 네가 대신 길을 고르지 않는다(`--yes` 로도 안 넘어간다). 키는 `kf setup key <이름>` 이 숨겨 받는다. 묻지 않고 가려면 `--yes`(권장 답 — 돈도 쓴다) · `--no-gen`(돈 안 드는 길) · `--allow image,video,…`(목록 능력만 권장, 나머지는 돈 안 드는 길) · `--image`·`--video`·`--blender`·`--voice`·`--music <값>`(그 질문에 미리 답). OG 모드는 뼈대 전에 터미널에서 묻고, 터미널이 아니면 보기를 찍고 종료 코드 3.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kasaframe",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "말로 시키는 코드 영상 엔진 — 쇼츠·홍보·설명·뮤비를 장면 파일로 짜고 박에 맞춰 MP4 로 굽고 검사한다",
5
5
  "keywords": [
6
6
  "video",
@@ -5,14 +5,27 @@ import { join } from "node:path";
5
5
  import type { Command } from "../command.ts";
6
6
  import { checks, pad, report } from "../deps.ts";
7
7
  import { repoRoot } from "../serve.ts";
8
+ import { commandFor, isNewer, refresh } from "../update.ts";
9
+
10
+ async function versionLine(now: string): Promise<string> {
11
+ try {
12
+ const latest = await refresh(5000);
13
+ if (!isNewer(latest, now)) return `판: 지금 ${now} · 최신 ${latest} — 최신이다`;
14
+ const command = commandFor(latest);
15
+ return `판: 지금 ${now} · 최신 ${latest} · ${command ? `올리기 kf update (${command.join(" ")})` : "레포 체크아웃 — git pull"}`;
16
+ } catch (e) {
17
+ return `판: 지금 ${now} · 최신을 확인하지 못했다(${(e as Error).message}) — kf update --check`;
18
+ }
19
+ }
8
20
 
9
21
  const cmd: Command = {
10
- summary: "바깥 도구 점검 — ffmpeg·크롬(Playwright)·python3+librosa·OG 키, 없으면 까는 명령",
22
+ summary: "바깥 도구 점검 — 판(지금·최신)·ffmpeg·크롬(Playwright)·python3+librosa·OG 키, 없으면 까는 명령",
11
23
  usage: `kf doctor
12
24
  없음 은 렌더가 안 되는 것, 선택 은 그 기능만 빠지는 것. 크롬·librosa 는 kf setup 이 깐다. 종료 코드: 없음 이 있으면 1`,
13
25
  async run() {
14
26
  const version = JSON.parse(readFileSync(join(repoRoot, "package.json"), "utf8")).version ?? "?";
15
- console.log(`kasaframe ${version} · Node ${process.version} · ${platform()} ${arch()}\n`);
27
+ console.log(`kasaframe ${version} · Node ${process.version} · ${platform()} ${arch()}`);
28
+ console.log(`${await versionLine(version)}\n`);
16
29
  const list = await checks();
17
30
  report(list);
18
31
  const missing = list.filter((c) => c.required && !c.ok);
@@ -0,0 +1,118 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { basename, join, resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { type FontPair, fontGroups, fontPairs } from "@kasaframe/themes/fonts";
7
+ import { type Command, parseFlags } from "../command.ts";
8
+ import { checkFonts, fontCacheDir, fontSheet, noticeSection, type PairReport, replaceNotice } from "../fonts.ts";
9
+
10
+ const cmd: Command = {
11
+ summary: "글꼴 짝 검사·견본 격자 — 주소·판·라이선스 글·한글 덮음·굵기, 크롬으로 찍어 투명·두부·떨어짐",
12
+ usage: `kf fonts list [--group <무리>]
13
+ kf fonts check [--group <무리>[,…]] [--id <짝>[,…]] [--json] [--no-render] [--offline]
14
+ kf fonts sheet [--group <무리>[,…]] [--id <짝>[,…]] [--out 파일.png] [--share]
15
+ kf fonts notice [--write]
16
+
17
+ 짝 목록은 packages/themes/kit/fonts.json(무리 core)과 kit/fonts/<무리>.json 을 합친 것.
18
+ check 는 짝마다
19
+ - 칸: hangul(full|ks2350)·face 마다 license·source, 스택 첫 글꼴의 face, 모든 스택이 Pretendard Variable 로 끝남
20
+ - 주소: 파일·라이선스 글이 200, 판 박힘(jsdelivr gh@커밋|태그·npm@x.y.z — @main·@latest·@5 는 안 된다)
21
+ - 라이선스 글: OFL-1.1·Apache-2.0 은 글에 그 문구가 있는지. 목록 밖 이름은 사람이 읽을 것으로 남긴다
22
+ - 파일: 한글 음절 수(11,172 = full, KS X 1001 2,350 다 = ks2350, 그 아래는 탈락)와 적은 hangul 이 맞는지,
23
+ 적은 굵기 범위가 파일(wght 축·usWeightClass)과 맞는지, 제목 굵기 단이 있는지(없으면 가짜 굵기)
24
+ - 크롬: 스택마다 한글·라틴·숫자 견본 한 줄을 찍어 투명·두부·시스템 글꼴로 떨어짐·예상과 다른 face 를 잡는다
25
+ 받은 파일은 ${fontCacheDir()}/files 에 두고 다음부터는 주소가 살았는지만 묻는다. 문제가 있는 짝이 있으면 종료 1.
26
+ --json { pairs: [{ id, group, ok, hangul, syllables, boldest, licenses, problems, notes }], summary }
27
+ --no-render 크롬 없이(파일·주소만)
28
+ --offline 주소를 묻지 않고 캐시만(라이선스 글 대조도 건너뛴다)
29
+ sheet 는 짝마다 제목·본문·고정폭 견본 칸을 격자 한 장으로 — 기본 ${fontCacheDir()}/sheet[-<무리>].png.
30
+ --share 면 kasaterm 공유 폴더 kasaframe-글꼴 로 옮긴다.
31
+ notice 는 모든 무리를 합친 목록으로 NOTICE 의 글꼴 절(글꼴 이름 · 라이선스 · 라이선스 글)을 찍는다. --write 면 레포 NOTICE 에
32
+ 그 절을 갈아 끼운다 — 무리 파일을 고친 뒤 한 번.`,
33
+ async run(argv) {
34
+ const [sub, ...rest] = argv;
35
+ const { opts } = parseFlags(rest);
36
+ const list = pick(opts);
37
+ if (!list) return 2;
38
+ if (sub === "list" || !sub) {
39
+ for (const { group, pair } of list) console.log(`${group.padEnd(10)} ${pair.id.padEnd(26)} ${String(pair.hangul ?? "?").padEnd(7)} ${pair.tags.join(",").padEnd(30)} ${pair.name}`);
40
+ console.log(`짝 ${list.length}`);
41
+ return 0;
42
+ }
43
+ if (sub === "check") {
44
+ const reports = await checkFonts(list, { offline: !!opts.offline, render: !opts["no-render"], log: (l) => console.error(l) });
45
+ const summary = summarize(reports);
46
+ if (opts.json) console.log(JSON.stringify({ pairs: reports, summary }, null, 1));
47
+ else print(reports, summary);
48
+ return reports.every((r) => r.ok) ? 0 : 1;
49
+ }
50
+ if (sub === "notice") {
51
+ const section = noticeSection(fontPairs());
52
+ if (!opts.write) {
53
+ process.stdout.write(section);
54
+ return 0;
55
+ }
56
+ const file = fileURLToPath(new URL("../../../../NOTICE", import.meta.url));
57
+ writeFileSync(file, replaceNotice(readFileSync(file, "utf8"), section));
58
+ console.log(file);
59
+ return 0;
60
+ }
61
+ if (sub === "sheet") {
62
+ const groups = typeof opts.group === "string" ? opts.group.replace(/,/g, "+") : "";
63
+ const out = resolve(typeof opts.out === "string" ? opts.out : join(fontCacheDir(), `sheet${groups ? `-${groups}` : ""}.png`));
64
+ await fontSheet(list, out, { log: (l) => console.error(l) });
65
+ console.log(out);
66
+ if (opts.share) {
67
+ const r = spawnSync("kasaterm-cli", ["share", "new", "kasaframe-글꼴"], { encoding: "utf8" });
68
+ let dir = r.status === 0 ? (r.stdout.trim().split("\n").pop() ?? "") : "";
69
+ if (!dir || !existsSync(dir)) {
70
+ dir = join(homedir(), "Desktop", "kasaframe-글꼴");
71
+ mkdirSync(dir, { recursive: true });
72
+ }
73
+ copyFileSync(out, join(dir, basename(out)));
74
+ console.log(`공유 폴더 ${dir}`);
75
+ }
76
+ return 0;
77
+ }
78
+ console.error(`kf fonts: 모르는 하위 명령 ${sub} — list·check·sheet·notice`);
79
+ return 2;
80
+ },
81
+ };
82
+
83
+ function pick(opts: Record<string, string | boolean | undefined>): { group: string; pair: FontPair }[] | null {
84
+ const groups = fontGroups();
85
+ const want = typeof opts.group === "string" ? opts.group.split(",") : null;
86
+ const unknown = want?.filter((g) => !groups.some((x) => x.group === g));
87
+ if (unknown?.length) {
88
+ console.error(`kf fonts: 무리 ${unknown.join(",")} 가 없다 — 있는 무리: ${groups.map((g) => g.group).join(" ")}`);
89
+ return null;
90
+ }
91
+ const ids = typeof opts.id === "string" ? new Set(opts.id.split(",")) : null;
92
+ const list = groups.filter((g) => !want || want.includes(g.group)).flatMap((g) => g.pairs.map((pair) => ({ group: g.group, pair }))).filter(({ pair }) => !ids || ids.has(pair.id));
93
+ if (ids && list.length < ids.size) console.error(`kf fonts: 없는 짝 — ${[...ids].filter((i) => !list.some((x) => x.pair.id === i)).join(",")}`);
94
+ return list;
95
+ }
96
+
97
+ const tally = (xs: string[]) => Object.fromEntries([...new Set(xs)].sort().map((x) => [x, xs.filter((y) => y === x).length]));
98
+
99
+ function summarize(reports: PairReport[]) {
100
+ return {
101
+ pairs: reports.length,
102
+ ok: reports.filter((r) => r.ok).length,
103
+ hangul: tally(reports.map((r) => r.hangul ?? "?")),
104
+ licenses: tally(reports.flatMap((r) => r.licenses)),
105
+ };
106
+ }
107
+
108
+ function print(reports: PairReport[], s: ReturnType<typeof summarize>): void {
109
+ for (const r of reports) {
110
+ console.log(`${r.ok ? "ok " : "문제"} ${r.group.padEnd(10)} ${r.id.padEnd(26)} 한글 ${r.hangul ?? "?"}(${r.syllables ?? "?"}) · 굵은 단 ${r.boldest ?? "?"} · ${r.licenses.join(",")}`);
111
+ for (const p of r.problems) console.log(` ! ${p}`);
112
+ for (const n of r.notes) console.log(` · ${n}`);
113
+ }
114
+ const fmt = (o: Record<string, number>) => Object.entries(o).map(([k, v]) => `${k} ${v}`).join(" · ");
115
+ console.log(`\n짝 ${s.pairs} — 통과 ${s.ok} · 문제 ${s.pairs - s.ok} | 한글 ${fmt(s.hangul)} | 라이선스(짝 기준) ${fmt(s.licenses)}`);
116
+ }
117
+
118
+ export default cmd;