kasaframe 0.1.4 → 0.1.6

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 (374) hide show
  1. package/NOTICE +311 -0
  2. package/README.md +18 -5
  3. package/docs/AGENTS.md +2 -1
  4. package/package.json +1 -1
  5. package/packages/adapters/src/project.ts +2 -0
  6. package/packages/check/package.json +1 -0
  7. package/packages/check/src/check.ts +8 -2
  8. package/packages/check/src/rules/frames.ts +4 -5
  9. package/packages/cli/src/commands/doctor.ts +15 -2
  10. package/packages/cli/src/commands/fonts.ts +118 -0
  11. package/packages/cli/src/commands/make.ts +15 -5
  12. package/packages/cli/src/commands/render.ts +34 -7
  13. package/packages/cli/src/commands/update.ts +66 -0
  14. package/packages/cli/src/fonts.ts +405 -0
  15. package/packages/cli/src/kf.ts +5 -0
  16. package/packages/cli/src/mix.ts +66 -4
  17. package/packages/cli/src/segments.ts +1 -1
  18. package/packages/cli/src/sfx.ts +429 -0
  19. package/packages/cli/src/update.ts +250 -0
  20. package/packages/core/src/frame.ts +7 -4
  21. package/packages/core/src/index.ts +3 -1
  22. package/packages/core/src/project.ts +19 -0
  23. package/packages/core/src/sfx.ts +70 -0
  24. package/packages/director/src/assemble.ts +7 -4
  25. package/packages/director/src/index.ts +1 -1
  26. package/packages/director/src/pattern.ts +2 -0
  27. package/packages/director/src/scene.ts +14 -5
  28. package/packages/director/src/transitions.ts +21 -8
  29. package/packages/motion/src/enter.ts +7 -1
  30. package/packages/motion/src/impact.ts +5 -2
  31. package/packages/motion/src/moves/dress.ts +15 -2
  32. package/packages/motion/src/moves/menu.ts +11 -5
  33. package/packages/motion/src/transition.ts +3 -1
  34. package/packages/motion/src/transition3d/index.ts +3 -1
  35. package/packages/motion/src/transition3d/live.ts +5 -3
  36. package/packages/patterns/src/bars/rank.ts +6 -7
  37. package/packages/patterns/src/before-after/shrink.ts +3 -4
  38. package/packages/patterns/src/before-after/strike.ts +4 -5
  39. package/packages/patterns/src/code/terminal.ts +25 -16
  40. package/packages/patterns/src/end/lockup.ts +13 -10
  41. package/packages/patterns/src/end/slam.ts +7 -5
  42. package/packages/patterns/src/hook-number/counter.ts +15 -9
  43. package/packages/patterns/src/hook-number/slam.ts +6 -8
  44. package/packages/patterns/src/kit.ts +281 -58
  45. package/packages/patterns/src/limit/gauge.ts +16 -11
  46. package/packages/patterns/src/quote/karaoke.ts +17 -12
  47. package/packages/patterns/src/sfx.ts +80 -0
  48. package/packages/patterns/src/term-reveal/chips.ts +24 -10
  49. package/packages/patterns/src/term-reveal/expand.ts +17 -13
  50. package/packages/patterns/src/title/mask.ts +9 -8
  51. package/packages/patterns/src/title/slam.ts +1 -1
  52. package/packages/patterns/src/types.ts +1 -0
  53. package/packages/plan/src/asks.ts +1 -1
  54. package/packages/plan/src/brief.ts +5 -2
  55. package/packages/plan/src/themes.ts +8 -2
  56. package/packages/themes/kit/THEME-MAKE.md +2 -2
  57. package/packages/themes/kit/fonts/display.json +3517 -0
  58. package/packages/themes/kit/fonts/sans.json +5155 -0
  59. package/packages/themes/kit/fonts/serif.json +5229 -0
  60. package/packages/themes/kit/fonts.json +243 -79
  61. package/packages/themes/package.json +3 -1
  62. package/packages/themes/src/fontfile.ts +183 -0
  63. package/packages/themes/src/fonts.ts +296 -0
  64. package/packages/themes/src/index.ts +32 -2
  65. package/packages/themes/src/look.ts +34 -8
  66. package/packages/themes/src/slots.ts +32 -2
  67. package/packages/themes/src/types.ts +33 -0
  68. package/packages/themes/src/vary.ts +35 -34
  69. package/presets/kawaii-pastel.json +2 -2
  70. package/sfx/README.md +82 -0
  71. package/sfx/click/appear.wav +0 -0
  72. package/sfx/click/burst.wav +0 -0
  73. package/sfx/click/drop.wav +0 -0
  74. package/sfx/click/end.wav +0 -0
  75. package/sfx/click/hop.wav +0 -0
  76. package/sfx/click/land.wav +0 -0
  77. package/sfx/click/select.wav +0 -0
  78. package/sfx/click/stick.wav +0 -0
  79. package/sfx/click/tick.wav +0 -0
  80. package/sfx/click/type.wav +0 -0
  81. package/sfx/click/whoosh.wav +0 -0
  82. package/sfx/pop/appear.wav +0 -0
  83. package/sfx/pop/burst.wav +0 -0
  84. package/sfx/pop/drop.wav +0 -0
  85. package/sfx/pop/end.wav +0 -0
  86. package/sfx/pop/hop.wav +0 -0
  87. package/sfx/pop/land.wav +0 -0
  88. package/sfx/pop/select.wav +0 -0
  89. package/sfx/pop/stick.wav +0 -0
  90. package/sfx/pop/tick.wav +0 -0
  91. package/sfx/pop/type.wav +0 -0
  92. package/sfx/pop/whoosh.wav +0 -0
  93. package/sfx/tags.json +545 -0
  94. package/sfx/ui/appear.wav +0 -0
  95. package/sfx/ui/burst.wav +0 -0
  96. package/sfx/ui/drop.wav +0 -0
  97. package/sfx/ui/end.wav +0 -0
  98. package/sfx/ui/hop.wav +0 -0
  99. package/sfx/ui/land.wav +0 -0
  100. package/sfx/ui/select.wav +0 -0
  101. package/sfx/ui/stick.wav +0 -0
  102. package/sfx/ui/tick.wav +0 -0
  103. package/sfx/ui/type.wav +0 -0
  104. package/sfx/ui/whoosh.wav +0 -0
  105. package/skills/kasaframe/SKILL.md +1 -0
  106. package/themes/blueprint/sample/style.json +5 -5
  107. package/themes/blueprint/style.json +5 -5
  108. package/themes/blueprint/theme.json +3 -1
  109. package/themes/blueprint/variants/deep-rose-suit.json +1 -1
  110. package/themes/blueprint/variants/navy-coral-2.json +1 -1
  111. package/themes/blueprint/variants/navy-coral-suit.json +1 -1
  112. package/themes/blueprint/variants/navy-orange-2.json +1 -1
  113. package/themes/blueprint/variants/navy-orange-suit.json +1 -1
  114. package/themes/cartography/sample/style.json +2 -2
  115. package/themes/cartography/style.json +2 -2
  116. package/themes/cartography/theme.json +3 -1
  117. package/themes/cartography/variants/deep-plum.json +1 -1
  118. package/themes/cartography/variants/frost-teal.json +1 -1
  119. package/themes/cartography/variants/navy-green.json +1 -1
  120. package/themes/circuit-board/sample/style.json +2 -2
  121. package/themes/circuit-board/style.json +2 -2
  122. package/themes/circuit-board/theme.json +3 -1
  123. package/themes/circuit-board/variants/dusk-gold-pretendard.json +1 -1
  124. package/themes/circuit-board/variants/navy-gold-grain.json +1 -1
  125. package/themes/circuit-board/variants/wine-gold-pretendard.json +1 -1
  126. package/themes/clay-toy/sample/style.json +2 -2
  127. package/themes/clay-toy/style.json +2 -2
  128. package/themes/clay-toy/theme.json +3 -1
  129. package/themes/clay-toy/variants/blush-coral-grain.json +1 -1
  130. package/themes/clay-toy/variants/chalk-teal.json +1 -1
  131. package/themes/clay-toy/variants/frost-sky.json +1 -1
  132. package/themes/clay-toy/variants/frost-teal.json +1 -1
  133. package/themes/clay-toy/variants/lilac-plum-round.json +1 -1
  134. package/themes/clay-toy/variants/lilac-plum.json +1 -1
  135. package/themes/clay-toy/variants/sage-indigo.json +1 -1
  136. package/themes/conveyor-factory/sample/style.json +3 -3
  137. package/themes/conveyor-factory/style.json +3 -3
  138. package/themes/conveyor-factory/theme.json +3 -1
  139. package/themes/conveyor-factory/variants/cocoa-gold.json +1 -1
  140. package/themes/conveyor-factory/variants/navy-gold.json +1 -1
  141. package/themes/conveyor-factory/variants/slate-amber-2.json +1 -1
  142. package/themes/conveyor-factory/variants/slate-amber-suit.json +1 -1
  143. package/themes/conveyor-factory/variants/slate-gold-bold.json +1 -1
  144. package/themes/data-journal/theme.json +3 -1
  145. package/themes/data-journal/variants/deep-coral.json +1 -1
  146. package/themes/data-journal/variants/navy-lime.json +1 -1
  147. package/themes/data-journal/variants/wine-indigo.json +1 -1
  148. package/themes/debug-hud/sample/style.json +1 -1
  149. package/themes/debug-hud/style.json +1 -1
  150. package/themes/debug-hud/theme.json +2 -1
  151. package/themes/debug-hud/variants/cocoa-teal.json +2 -2
  152. package/themes/debug-hud/variants/deep-teal-scan.json +2 -2
  153. package/themes/debug-hud/variants/dusk-plum.json +2 -2
  154. package/themes/debug-hud/variants/forest-lime.json +2 -2
  155. package/themes/debug-hud/variants/slate-green.json +2 -2
  156. package/themes/debug-hud/variants/wine-gold.json +2 -2
  157. package/themes/depth-flight/sample/style.json +1 -1
  158. package/themes/depth-flight/style.json +1 -1
  159. package/themes/depth-flight/theme.json +3 -1
  160. package/themes/depth-flight/variants/cocoa-cyan.json +1 -1
  161. package/themes/depth-flight/variants/cocoa-violet.json +1 -1
  162. package/themes/depth-flight/variants/deep-sky.json +1 -1
  163. package/themes/depth-flight/variants/forest-blue.json +1 -1
  164. package/themes/depth-flight/variants/navy-sky-grain.json +1 -1
  165. package/themes/depth-flight/variants/navy-sky.json +1 -1
  166. package/themes/depth-flight/variants/night-teal.json +1 -1
  167. package/themes/depth-flight/variants/slate-indigo.json +1 -1
  168. package/themes/depth-flight/variants/slate-violet.json +1 -1
  169. package/themes/film-reel/sample/style.json +2 -2
  170. package/themes/film-reel/style.json +2 -2
  171. package/themes/film-reel/theme.json +3 -1
  172. package/themes/film-reel/variants/chalk-pink.json +1 -1
  173. package/themes/film-reel/variants/lilac-gold.json +1 -1
  174. package/themes/film-reel/variants/lilac-violet.json +1 -1
  175. package/themes/glass-light/sample/style.json +1 -1
  176. package/themes/glass-light/style.json +1 -1
  177. package/themes/glass-light/theme.json +3 -1
  178. package/themes/glass-light/variants/blush-pink.json +1 -1
  179. package/themes/glass-light/variants/blush-plum.json +1 -1
  180. package/themes/glass-light/variants/cream-violet.json +1 -1
  181. package/themes/glass-light/variants/frost-sky-suit.json +1 -1
  182. package/themes/glass-light/variants/frost-sky.json +1 -1
  183. package/themes/glass-light/variants/sage-green.json +1 -1
  184. package/themes/ink-wash/sample/style.json +3 -3
  185. package/themes/ink-wash/style.json +3 -3
  186. package/themes/ink-wash/theme.json +3 -1
  187. package/themes/iso-diorama/sample/style.json +1 -1
  188. package/themes/iso-diorama/style.json +1 -1
  189. package/themes/iso-diorama/theme.json +3 -1
  190. package/themes/iso-diorama/variants/chalk-plum.json +1 -1
  191. package/themes/iso-diorama/variants/cocoa-indigo.json +1 -1
  192. package/themes/iso-diorama/variants/dusk-blue.json +1 -1
  193. package/themes/iso-diorama/variants/dusk-coral.json +1 -1
  194. package/themes/iso-diorama/variants/dusk-jade.json +1 -1
  195. package/themes/iso-diorama/variants/forest-cyan.json +1 -1
  196. package/themes/iso-diorama/variants/frost-green.json +1 -1
  197. package/themes/iso-diorama/variants/frost-teal.json +1 -1
  198. package/themes/iso-diorama/variants/navy-amber.json +1 -1
  199. package/themes/isotype/sample/style.json +2 -2
  200. package/themes/isotype/style.json +2 -2
  201. package/themes/isotype/theme.json +2 -1
  202. package/themes/isotype/variants/blush-rose.json +1 -1
  203. package/themes/isotype/variants/chalk-coral.json +1 -1
  204. package/themes/isotype/variants/chalk-orange.json +1 -1
  205. package/themes/isotype/variants/frost-amber.json +1 -1
  206. package/themes/isotype/variants/frost-coral.json +1 -1
  207. package/themes/isotype/variants/frost-orange.json +1 -1
  208. package/themes/isotype/variants/sand-amber.json +1 -1
  209. package/themes/kawaii-sticker/effects.ts +15 -3
  210. package/themes/kawaii-sticker/sample/style.json +2 -2
  211. package/themes/kawaii-sticker/style.json +2 -2
  212. package/themes/kawaii-sticker/theme.json +4 -1
  213. package/themes/kawaii-sticker/variants/cream-gold.json +1 -1
  214. package/themes/kawaii-sticker/variants/dusk-green.json +1 -1
  215. package/themes/kawaii-sticker/variants/dusk-indigo.json +1 -1
  216. package/themes/kawaii-sticker/variants/dusk-sky.json +1 -1
  217. package/themes/kawaii-sticker/variants/dusk-teal.json +1 -1
  218. package/themes/kawaii-sticker/variants/frost-blue.json +1 -1
  219. package/themes/kawaii-sticker/variants/frost-plum.json +1 -1
  220. package/themes/kawaii-sticker/variants/lilac-violet.json +1 -1
  221. package/themes/kawaii-sticker/variants/navy-gold.json +1 -1
  222. package/themes/kawaii-sticker/variants/navy-plum.json +1 -1
  223. package/themes/lab-notebook/sample/style.json +3 -3
  224. package/themes/lab-notebook/style.json +3 -3
  225. package/themes/lab-notebook/theme.json +2 -1
  226. package/themes/lab-notebook/variants/blush-orange.json +1 -1
  227. package/themes/lab-notebook/variants/chalk-coral.json +1 -1
  228. package/themes/lab-notebook/variants/chalk-orange.json +1 -1
  229. package/themes/lab-notebook/variants/chalk-rose.json +1 -1
  230. package/themes/lab-notebook/variants/lilac-rose.json +1 -1
  231. package/themes/lab-notebook/variants/sage-rose.json +1 -1
  232. package/themes/lab-notebook/variants/sand-orange.json +1 -1
  233. package/themes/lab-notebook/variants/snow-orange.json +1 -1
  234. package/themes/lab-notebook/variants/snow-rose.json +1 -1
  235. package/themes/manga-panel/sample/style.json +3 -3
  236. package/themes/manga-panel/style.json +3 -3
  237. package/themes/manga-panel/theme.json +3 -1
  238. package/themes/manga-panel/variants/chalk-cyan-dots.json +1 -1
  239. package/themes/manga-panel/variants/chalk-rose.json +1 -1
  240. package/themes/manga-panel/variants/snow-cyan.json +1 -1
  241. package/themes/manga-panel/variants/snow-magenta-dots.json +1 -1
  242. package/themes/marble-run/sample/style.json +2 -2
  243. package/themes/marble-run/style.json +2 -2
  244. package/themes/marble-run/theme.json +3 -1
  245. package/themes/marble-run/variants/slate-orange.json +1 -1
  246. package/themes/neon-sign/sample/style.json +2 -2
  247. package/themes/neon-sign/style.json +2 -2
  248. package/themes/neon-sign/theme.json +2 -1
  249. package/themes/neon-sign/variants/dusk-plum.json +1 -1
  250. package/themes/neon-sign/variants/forest-magenta.json +1 -1
  251. package/themes/neon-sign/variants/night-pink.json +1 -1
  252. package/themes/neon-sign/variants/night-violet.json +1 -1
  253. package/themes/neon-sign/variants/slate-violet.json +1 -1
  254. package/themes/newspaper/sample/style.json +2 -2
  255. package/themes/newspaper/style.json +2 -2
  256. package/themes/newspaper/theme.json +2 -1
  257. package/themes/newspaper/variants/blush-amber.json +1 -1
  258. package/themes/newspaper/variants/chalk-magenta.json +1 -1
  259. package/themes/newspaper/variants/frost-sky.json +1 -1
  260. package/themes/newspaper/variants/lilac-green.json +1 -1
  261. package/themes/newspaper/variants/sage-lime.json +1 -1
  262. package/themes/og-measure/THEME.md +41 -6
  263. package/themes/og-measure/effects.ts +236 -115
  264. package/themes/og-measure/sample/assets/brand/og-logo.svg +11 -11
  265. package/themes/og-measure/sample/lib/data.ts +6 -0
  266. package/themes/og-measure/sample/scenes/end.ts +14 -10
  267. package/themes/og-measure/sample/scenes/gather.ts +4 -1
  268. package/themes/og-measure/sample/scenes/models.ts +5 -2
  269. package/themes/og-measure/sample/scenes/one.ts +9 -6
  270. package/themes/og-measure/sample/scenes/price.ts +8 -3
  271. package/themes/og-measure/sample/style.json +30 -35
  272. package/themes/og-measure/slots.ts +54 -30
  273. package/themes/og-measure/still.png +0 -0
  274. package/themes/og-measure/style.json +30 -35
  275. package/themes/og-measure/theme.json +72 -49
  276. package/themes/og-measure/variants/snow-blue.json +90 -0
  277. package/themes/orbit-system/sample/style.json +3 -3
  278. package/themes/orbit-system/style.json +3 -3
  279. package/themes/orbit-system/theme.json +3 -1
  280. package/themes/orbit-system/variants/cocoa-amber.json +1 -1
  281. package/themes/orbit-system/variants/cocoa-cyan.json +1 -1
  282. package/themes/orbit-system/variants/dusk-magenta.json +1 -1
  283. package/themes/orbit-system/variants/dusk-violet.json +1 -1
  284. package/themes/orbit-system/variants/forest-coral.json +1 -1
  285. package/themes/orbit-system/variants/wine-amber.json +1 -1
  286. package/themes/orbit-system/variants/wine-magenta.json +1 -1
  287. package/themes/origami-fold/sample/style.json +1 -1
  288. package/themes/origami-fold/style.json +1 -1
  289. package/themes/origami-fold/theme.json +3 -1
  290. package/themes/origami-fold/variants/deep-amber-sunflower.json +1 -1
  291. package/themes/origami-fold/variants/deep-orange.json +1 -1
  292. package/themes/origami-fold/variants/forest-coral.json +1 -1
  293. package/themes/origami-fold/variants/forest-pink.json +1 -1
  294. package/themes/origami-fold/variants/frost-amber-paper.json +1 -1
  295. package/themes/origami-fold/variants/sage-coral-sunflower.json +1 -1
  296. package/themes/origami-fold/variants/sage-coral.json +1 -1
  297. package/themes/origami-fold/variants/sage-pink-round.json +1 -1
  298. package/themes/origami-fold/variants/sage-pink.json +1 -1
  299. package/themes/paper-cutout/sample/style.json +2 -2
  300. package/themes/paper-cutout/style.json +2 -2
  301. package/themes/paper-cutout/theme.json +3 -1
  302. package/themes/paper-cutout/variants/blush-violet.json +1 -1
  303. package/themes/paper-cutout/variants/frost-lime.json +1 -1
  304. package/themes/paper-cutout/variants/lilac-gold.json +1 -1
  305. package/themes/paper-cutout/variants/sage-cyan.json +1 -1
  306. package/themes/paper-cutout/variants/sage-green.json +1 -1
  307. package/themes/paper-cutout/variants/sage-pink.json +1 -1
  308. package/themes/paper-cutout/variants/sand-blue.json +1 -1
  309. package/themes/pixel-quest/theme.json +2 -1
  310. package/themes/receipt/sample/style.json +2 -2
  311. package/themes/receipt/style.json +2 -2
  312. package/themes/riso-zine/sample/style.json +2 -2
  313. package/themes/riso-zine/style.json +2 -2
  314. package/themes/riso-zine/theme.json +3 -1
  315. package/themes/riso-zine/variants/chalk-lime.json +1 -1
  316. package/themes/riso-zine/variants/frost-green.json +1 -1
  317. package/themes/riso-zine/variants/lilac-plum.json +1 -1
  318. package/themes/riso-zine/variants/lilac-violet.json +1 -1
  319. package/themes/server-hall/sample/style.json +2 -2
  320. package/themes/server-hall/style.json +2 -2
  321. package/themes/server-hall/theme.json +3 -1
  322. package/themes/server-hall/variants/night-indigo.json +1 -1
  323. package/themes/server-hall/variants/wine-plum.json +1 -1
  324. package/themes/subway-map/sample/style.json +2 -2
  325. package/themes/subway-map/style.json +2 -2
  326. package/themes/subway-map/theme.json +3 -1
  327. package/themes/subway-map/variants/deep-green.json +1 -1
  328. package/themes/subway-map/variants/deep-teal.json +1 -1
  329. package/themes/subway-map/variants/frost-jade.json +1 -1
  330. package/themes/subway-map/variants/frost-teal.json +1 -1
  331. package/themes/subway-map/variants/slate-green.json +1 -1
  332. package/themes/subway-map/variants/snow-jade.json +1 -1
  333. package/themes/swiss-poster/sample/style.json +2 -2
  334. package/themes/swiss-poster/style.json +2 -2
  335. package/themes/swiss-poster/theme.json +3 -1
  336. package/themes/swiss-poster/variants/chalk-plum.json +1 -1
  337. package/themes/swiss-poster/variants/cocoa-cyan.json +1 -1
  338. package/themes/swiss-poster/variants/dusk-magenta.json +1 -1
  339. package/themes/swiss-poster/variants/frost-indigo.json +1 -1
  340. package/themes/swiss-poster/variants/slate-orange.json +1 -1
  341. package/themes/water-works/sample/style.json +1 -1
  342. package/themes/water-works/style.json +1 -1
  343. package/themes/water-works/theme.json +3 -1
  344. package/themes/water-works/variants/chalk-cyan.json +1 -1
  345. package/themes/water-works/variants/frost-indigo.json +1 -1
  346. package/themes/water-works/variants/sand-amber.json +1 -1
  347. package/themes/water-works/variants/sand-plum.json +1 -1
  348. package/themes/whiteboard/sample/style.json +2 -2
  349. package/themes/whiteboard/style.json +2 -2
  350. package/themes/whiteboard/theme.json +3 -1
  351. package/themes/whiteboard/variants/chalk-coral.json +1 -1
  352. package/themes/whiteboard/variants/cream-lime.json +1 -1
  353. package/themes/whiteboard/variants/frost-teal.json +1 -1
  354. package/themes/whiteboard/variants/lilac-indigo.json +1 -1
  355. package/themes/whiteboard/variants/sage-plum.json +1 -1
  356. package/themes/whiteboard/variants/snow-cyan.json +1 -1
  357. package/themes/whiteboard/variants/snow-green.json +1 -1
  358. package/themes/whiteboard/variants/snow-magenta.json +1 -1
  359. package/themes/og-measure/sample/assets/brand/og-logo-full.svg +0 -12
  360. package/themes/og-measure/variants/chalk-orange.json +0 -102
  361. package/themes/og-measure/variants/cocoa-amber.json +0 -138
  362. package/themes/og-measure/variants/cocoa-cyan.json +0 -138
  363. package/themes/og-measure/variants/cocoa-gold.json +0 -129
  364. package/themes/og-measure/variants/cream-lime.json +0 -137
  365. package/themes/og-measure/variants/deep-jade.json +0 -100
  366. package/themes/og-measure/variants/dusk-violet.json +0 -133
  367. package/themes/og-measure/variants/forest-cyan.json +0 -123
  368. package/themes/og-measure/variants/frost-amber.json +0 -129
  369. package/themes/og-measure/variants/frost-cyan.json +0 -133
  370. package/themes/og-measure/variants/lilac-plum.json +0 -127
  371. package/themes/og-measure/variants/lilac-violet.json +0 -139
  372. package/themes/og-measure/variants/sage-green.json +0 -137
  373. package/themes/og-measure/variants/wine-jade.json +0 -127
  374. package/themes/og-measure/variants/wine-plum.json +0 -127
package/NOTICE CHANGED
@@ -146,3 +146,314 @@ 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
+ 효과음 — sfx/<결>/<역할>.wav
152
+ Kenney(www.kenney.nl) 묶음 여섯에서 골라 다듬었다(몇은 두 소리를 꼭대기에 맞춰 겹침, 앞 무음·꼬리 자르기, 길이 상한, 페이드, 꼭대기 -1dBFS).
153
+ 모두 CC0 1.0 — 묶음마다 받은 zip 의 License.txt 로 확인했다(tools/sfx/build.ts 가 다시 지을 때도 본다). 출처 표기 의무는 없다.
154
+ 파일마다 원본 파일 이름은 sfx/tags.json·sfx/README.md.
155
+ Kenney UI SFX Set https://kenney.nl/assets/ui-audio
156
+ Kenney Interface Sounds 1.0 https://kenney.nl/assets/interface-sounds
157
+ Kenney Impact Sounds 1.0 https://kenney.nl/assets/impact-sounds
158
+ Kenney Digital Audio https://kenney.nl/assets/digital-audio
159
+ Kenney RPG Audio https://kenney.nl/assets/rpg-audio
160
+ Kenney Casino Audio 1.1 https://kenney.nl/assets/casino-audio
161
+ CC0 1.0 원문: https://creativecommons.org/publicdomain/zero/1.0/
162
+
163
+ ----------------------------------------------------------------------
164
+ 글꼴 짝 — packages/themes/kit/fonts.json · kit/fonts/<무리>.json (kf fonts notice --write 가 이 절을 짓는다)
165
+ 글꼴 파일은 싣지 않는다 — 영상을 구울 때 판을 박은 주소(jsdelivr gh@커밋·npm@판)에서 받는다. 모두 상업 이용·영상·
166
+ 웹 임베딩이 허용된 라이선스이고 출처 표기 의무가 없다. kf fonts check 가 라이선스 글이나 파일 name 13 에서 그 문구를 대 본다.
167
+ 짝 305 · 글꼴 287 — 이름 · 라이선스 · 라이선스 글
168
+
169
+ Abril Fatface OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/abrilfatface/OFL.txt
170
+ Albert Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/albertsans/OFL.txt
171
+ Alegreya OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/alegreya/OFL.txt
172
+ Alegreya Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/alegreyasans/OFL.txt
173
+ Aleo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/aleo/OFL.txt
174
+ Alfa Slab One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/alfaslabone/OFL.txt
175
+ Anton OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/anton/OFL.txt
176
+ Antonio OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/antonio/OFL.txt
177
+ Architects Daughter OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/architectsdaughter/OFL.txt
178
+ Archivo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/archivo/OFL.txt
179
+ Archivo Black OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/archivoblack/OFL.txt
180
+ Archivo Narrow OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/archivonarrow/OFL.txt
181
+ Arvo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/arvo/OFL.txt
182
+ Asta Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/astasans/OFL.txt
183
+ Atkinson Hyperlegible Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/atkinsonhyperlegiblemono/OFL.txt
184
+ Audiowide OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/audiowide/OFL.txt
185
+ Azeret Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/azeretmono/OFL.txt
186
+ Bagel Fat One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bagelfatone/OFL.txt
187
+ Bangers OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bangers/OFL.txt
188
+ Barlow OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/barlow/OFL.txt
189
+ Baskervville OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/baskervville/OFL.txt
190
+ Bebas Neue OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bebasneue/OFL.txt
191
+ Bellefair OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bellefair/OFL.txt
192
+ Besley OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/besley/OFL.txt
193
+ Big Shoulders Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bigshouldersdisplay/OFL.txt
194
+ Bitter OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bitter/OFL.txt
195
+ Black And White Picture OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/blackandwhitepicture/OFL.txt
196
+ Black Han Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/blackhansans/OFL.txt
197
+ Black Ops One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/blackopsone/OFL.txt
198
+ BM EULJIRO OFL-1.1 https://www.woowahan.com/fonts/license
199
+ BM Euljiro 10 years later OFL-1.1 https://www.woowahan.com/fonts/license
200
+ BM HANNA Air OFL-1.1 https://www.woowahan.com/fonts/license
201
+ BM HANNA Pro OFL-1.1 https://www.woowahan.com/fonts/license
202
+ Bodoni Moda OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bodonimoda/OFL.txt
203
+ Bricolage Grotesque OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bricolagegrotesque/OFL.txt
204
+ Brygada 1918 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/brygada1918/OFL.txt
205
+ Bungee OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bungee/OFL.txt
206
+ Bungee Inline OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bungeeinline/OFL.txt
207
+ Bungee Outline OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/bungeeoutline/OFL.txt
208
+ Cabin OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cabin/OFL.txt
209
+ Cafe24 ClassicType OFL-1.1 https://fonts.cafe24.com/
210
+ Cafe24 Danjunghae OFL-1.1 https://fonts.cafe24.com/
211
+ Cafe24 Dongdong OFL-1.1 https://fonts.cafe24.com/
212
+ Cafe24 Ohsquare OFL-1.1 https://fonts.cafe24.com/
213
+ Cafe24 Oneprettynight OFL-1.1 https://fonts.cafe24.com/
214
+ Cafe24 Shiningstar OFL-1.1 https://fonts.cafe24.com/
215
+ Cafe24 Simplehae OFL-1.1 https://fonts.cafe24.com/
216
+ Cafe24 Ssukssuk OFL-1.1 https://fonts.cafe24.com/
217
+ Cafe24 Ssurround OFL-1.1 https://fonts.cafe24.com/
218
+ Cafe24 Ssurround Air OFL-1.1 https://fonts.cafe24.com/
219
+ Cafe24 Syongsyong OFL-1.1 https://fonts.cafe24.com/
220
+ Caveat OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/caveat/OFL.txt
221
+ Chakra Petch OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/chakrapetch/OFL.txt
222
+ Chango OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/chango/OFL.txt
223
+ Chewy Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/chewy/LICENSE.txt
224
+ Chivo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/chivo/OFL.txt
225
+ Chivo Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/chivomono/OFL.txt
226
+ Cinzel OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cinzel/OFL.txt
227
+ Coiny OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/coiny/OFL.txt
228
+ Comfortaa OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/comfortaa/OFL.txt
229
+ Comic Neue OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/comicneue/OFL.txt
230
+ Commissioner OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/commissioner/OFL.txt
231
+ Cormorant OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cormorant/OFL.txt
232
+ Cormorant Garamond OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cormorantgaramond/OFL.txt
233
+ Courier Prime OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/courierprime/OFL.txt
234
+ Covered By Your Grace OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/coveredbyyourgrace/OFL.txt
235
+ Crimson Pro OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/crimsonpro/OFL.txt
236
+ Cute Font OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cutefont/OFL.txt
237
+ Cutive Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/cutivemono/OFL.txt
238
+ D2Coding OFL-1.1 https://raw.githubusercontent.com/naver/d2codingfont/b0dc372e28d7abdba7f3cba854855ceffbd490a8/OFL.txt
239
+ Diphylleia OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/diphylleia/OFL.txt
240
+ DM Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dmmono/OFL.txt
241
+ DM Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dmsans/OFL.txt
242
+ DM Serif Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dmserifdisplay/OFL.txt
243
+ Do Hyeon OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dohyeon/OFL.txt
244
+ Dokdo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dokdo/OFL.txt
245
+ Domine OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/domine/OFL.txt
246
+ Dongle OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dongle/OFL.txt
247
+ Doto OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/doto/OFL.txt
248
+ DynaPuff OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/dynapuff/OFL.txt
249
+ East Sea Dokdo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/eastseadokdo/OFL.txt
250
+ EB Garamond OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ebgaramond/OFL.txt
251
+ Epilogue OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/epilogue/OFL.txt
252
+ Exo 2 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/exo2/OFL.txt
253
+ Figtree OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/figtree/OFL.txt
254
+ Fira Code OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/firacode/OFL.txt
255
+ Fira Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/firamono/OFL.txt
256
+ Fjalla One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/fjallaone/OFL.txt
257
+ Forum OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/forum/OFL.txt
258
+ Fraunces OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/fraunces/OFL.txt
259
+ Fredoka OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/fredoka/OFL.txt
260
+ Freesentation OFL-1.1 https://cdn.jsdelivr.net/gh/Freesentation/freesentation@98f6b841fca55a23fbb0f9eb91acda0e16a676ea/OFL%20license.txt
261
+ Funnel Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/funneldisplay/OFL.txt
262
+ Gaegu OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gaegu/OFL.txt
263
+ Galmuri11 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
264
+ Galmuri11 Condensed OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
265
+ Galmuri14 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
266
+ Galmuri7 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
267
+ Galmuri9 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
268
+ GalmuriMono11 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
269
+ GalmuriMono7 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
270
+ GalmuriMono9 OFL-1.1 https://cdn.jsdelivr.net/npm/galmuri@2.40.3/dist/LICENSE.txt
271
+ Gamja Flower OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gamjaflower/OFL.txt
272
+ Gasoek One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gasoekone/OFL.txt
273
+ Geist OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/geist/OFL.txt
274
+ Geist OFL-1.1 https://cdn.jsdelivr.net/npm/geist@1.3.1/LICENSE.TXT
275
+ Geist Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/geistmono/OFL.txt
276
+ Geist Mono OFL-1.1 https://cdn.jsdelivr.net/npm/geist@1.3.1/LICENSE.TXT
277
+ Gelasio OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gelasio/OFL.txt
278
+ Geologica OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/geologica/OFL.txt
279
+ Gilda Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gildadisplay/OFL.txt
280
+ Gloock OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gloock/OFL.txt
281
+ Gochi Hand OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gochihand/OFL.txt
282
+ Golos Text OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/golostext/OFL.txt
283
+ goorm Sans OFL-1.1 https://cdn.jsdelivr.net/npm/goorm-sans@1.0.0/LICENSE.md
284
+ goorm Sans Code OFL-1.1 https://cdn.jsdelivr.net/npm/goorm-sans@1.0.0/LICENSE.md
285
+ Gothic A1 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gothica1/OFL.txt
286
+ Gowun Batang OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gowunbatang/OFL.txt
287
+ Gowun Dodum OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gowundodum/OFL.txt
288
+ Grandiflora One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/grandifloraone/OFL.txt
289
+ Grandstander OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/grandstander/OFL.txt
290
+ Gugi OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/gugi/OFL.txt
291
+ Hahmlet OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/hahmlet/OFL.txt
292
+ Hanken Grotesk OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/hankengrotesk/OFL.txt
293
+ Hepta Slab OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/heptaslab/OFL.txt
294
+ Hi Melody OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/himelody/OFL.txt
295
+ Host Grotesk OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/hostgrotesk/OFL.txt
296
+ Hubot Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/hubotsans/OFL.txt
297
+ IBM Plex Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ibmplexmono/OFL.txt
298
+ IBM Plex Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ibmplexsans/OFL.txt
299
+ IBM Plex Sans KR OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ibmplexsanskr/OFL.txt
300
+ IBM Plex Serif OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ibmplexserif/OFL.txt
301
+ IM Fell English OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/imfellenglish/OFL.txt
302
+ Inconsolata OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/inconsolata/OFL.txt
303
+ Indie Flower OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/indieflower/OFL.txt
304
+ Instrument Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/instrumentsans/OFL.txt
305
+ Instrument Serif OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/instrumentserif/OFL.txt
306
+ Inter OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/inter/OFL.txt
307
+ Inter Tight OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/intertight/OFL.txt
308
+ Iropke Batang OFL-1.1 https://cdn.jsdelivr.net/gh/iropke/font-iropke-batang@v1.2/README.md
309
+ Italiana OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/italiana/OFL.txt
310
+ Jersey 10 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/jersey10/OFL.txt
311
+ Jersey 15 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/jersey15/OFL.txt
312
+ JetBrains Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/jetbrainsmono/OFL.txt
313
+ JetBrains Mono OFL-1.1 https://cdn.jsdelivr.net/npm/@fontsource-variable/jetbrains-mono@5.3.0/LICENSE
314
+ Josefin Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/josefinsans/OFL.txt
315
+ Josefin Slab OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/josefinslab/OFL.txt
316
+ Jost OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/jost/OFL.txt
317
+ Jua OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/jua/OFL.txt
318
+ Kalam OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/kalam/OFL.txt
319
+ Kirang Haerang OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/kiranghaerang/OFL.txt
320
+ Kode Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/kodemono/OFL.txt
321
+ Kumbh Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/kumbhsans/OFL.txt
322
+ Lato OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/lato/OFL.txt
323
+ League Gothic OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/leaguegothic/OFL.txt
324
+ League Spartan OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/leaguespartan/OFL.txt
325
+ Lexend OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/lexend/OFL.txt
326
+ Libertinus Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/libertinusmono/OFL.txt
327
+ Libre Baskerville OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/librebaskerville/OFL.txt
328
+ Libre Bodoni OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/librebodoni/OFL.txt
329
+ Libre Caslon Text OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/librecaslontext/OFL.txt
330
+ Libre Franklin OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/librefranklin/OFL.txt
331
+ Lilita One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/lilitaone/OFL.txt
332
+ LINE Seed Sans KR OFL-1.1 https://raw.githubusercontent.com/line/seed/0564884c67ebdb3b31e90e2106c2d061f953b6a0/OFL.txt
333
+ Literata OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/literata/OFL.txt
334
+ Lora OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/lora/OFL.txt
335
+ Luckiest Guy Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/luckiestguy/LICENSE.txt
336
+ Manrope OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/manrope/OFL.txt
337
+ Mansalva OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/mansalva/OFL.txt
338
+ Marcellus OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/marcellus/OFL.txt
339
+ Martian Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/martianmono/OFL.txt
340
+ MaruBuri OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
341
+ Michroma OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/michroma/OFL.txt
342
+ Micro 5 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/micro5/OFL.txt
343
+ Moirai One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/moiraione/OFL.txt
344
+ Mona Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/monasans/OFL.txt
345
+ Monoton OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/monoton/OFL.txt
346
+ Montserrat OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/montserrat/OFL.txt
347
+ Nanum BaReunHiPi OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
348
+ Nanum Brush Script OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nanumbrushscript/OFL.txt
349
+ Nanum DaHaengCe OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
350
+ Nanum GarMaesGeur OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
351
+ Nanum GoDigANiGoGoDing OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
352
+ Nanum Gothic OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nanumgothic/OFL.txt
353
+ Nanum Gothic Coding OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nanumgothiccoding/OFL.txt
354
+ Nanum JungHagSaeng OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
355
+ Nanum KarGugSu OFL-1.1 https://help.naver.com/service/30016/contents/18088?osType=PC&lang=ko
356
+ Nanum Myeongjo OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nanummyeongjo/OFL.txt
357
+ Nanum Pen Script OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nanumpenscript/OFL.txt
358
+ NanumBarunGothic OFL-1.1 https://help.naver.com/service/30016/contents/18088?lang=ko&osType=PC
359
+ NanumSquare Neo OFL-1.1 https://help.naver.com/service/30016/contents/18088?lang=ko&osType=PC
360
+ NeoDunggeunmo OFL-1.1 https://cdn.jsdelivr.net/gh/Dalgona/neodgm@v1.601/LICENSE.txt
361
+ NeoDunggeunmo Code OFL-1.1 https://cdn.jsdelivr.net/gh/Dalgona/neodgm@v1.601/LICENSE.txt
362
+ Newsreader OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/newsreader/OFL.txt
363
+ Noticia Text OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/noticiatext/OFL.txt
364
+ Noto Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/notosans/OFL.txt
365
+ Noto Sans KR OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/notosanskr/OFL.txt
366
+ Noto Sans Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/notosansmono/OFL.txt
367
+ Noto Serif KR OFL-1.1 https://cdn.jsdelivr.net/gh/notofonts/noto-cjk@9b0f1436e455d902de067a2501422e5dc71ad16b/Serif/LICENSE
368
+ Nunito OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nunito/OFL.txt
369
+ Nunito Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/nunitosans/OFL.txt
370
+ Old Standard TT OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/oldstandardtt/OFL.txt
371
+ Onest OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/onest/OFL.txt
372
+ Open Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/opensans/OFL.txt
373
+ Orbit OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/orbit/OFL.txt
374
+ Orbitron OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/orbitron/OFL.txt
375
+ Oswald OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/oswald/OFL.txt
376
+ Outfit OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/outfit/OFL.txt
377
+ Overpass OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/overpass/OFL.txt
378
+ Overpass Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/overpassmono/OFL.txt
379
+ Paperlogy OFL-1.1 https://cdn.jsdelivr.net/gh/Freesentation/paperlogy@8ef35f53b318c7ca914c52b1b382b9a8bad07a61/OFL%20license.txt
380
+ Patrick Hand OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/patrickhand/OFL.txt
381
+ Paytone One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/paytoneone/OFL.txt
382
+ Permanent Marker Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/permanentmarker/LICENSE.txt
383
+ Petrona OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/petrona/OFL.txt
384
+ Pixelify Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/pixelifysans/OFL.txt
385
+ Playfair Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/playfairdisplay/OFL.txt
386
+ Playpen Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/playpensans/OFL.txt
387
+ Plus Jakarta Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/plusjakartasans/OFL.txt
388
+ Poor Story OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/poorstory/OFL.txt
389
+ Poppins OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/poppins/OFL.txt
390
+ Prata OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/prata/OFL.txt
391
+ Press Start 2P OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/pressstart2p/OFL.txt
392
+ Pretendard Variable OFL-1.1 https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/LICENSE
393
+ Pretendard Variable OFL-1.1 https://cdn.jsdelivr.net/npm/pretendard@1.3.9/dist/LICENSE.txt
394
+ PT Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ptmono/OFL.txt
395
+ PT Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ptsans/OFL.txt
396
+ PT Serif OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/ptserif/OFL.txt
397
+ Public Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/publicsans/OFL.txt
398
+ Quicksand OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/quicksand/OFL.txt
399
+ Red Hat Display OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/redhatdisplay/OFL.txt
400
+ Red Hat Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/redhatmono/OFL.txt
401
+ Reenie Beanie OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/reeniebeanie/OFL.txt
402
+ RIDIBatang OFL-1.1 https://cdn.jsdelivr.net/gh/fonts-archive/RIDIBatang@f1628238e56fd41c12451dfc7d975527b61ebfc7/README.md
403
+ Righteous OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/righteous/OFL.txt
404
+ Roboto OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/roboto/OFL.txt
405
+ Roboto Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/robotomono/OFL.txt
406
+ Roboto Slab Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/robotoslab/LICENSE.txt
407
+ Rokkitt OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/rokkitt/OFL.txt
408
+ Rozha One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/rozhaone/OFL.txt
409
+ Rubik Bubbles OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/rubikbubbles/OFL.txt
410
+ Russo One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/russoone/OFL.txt
411
+ Rye OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/rye/OFL.txt
412
+ Sacramento OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sacramento/OFL.txt
413
+ Saira OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/saira/OFL.txt
414
+ Schibsted Grotesk OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/schibstedgrotesk/OFL.txt
415
+ Schoolbell Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/schoolbell/LICENSE.txt
416
+ Sedgwick Ave OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sedgwickave/OFL.txt
417
+ Share Tech Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sharetechmono/OFL.txt
418
+ Short Stack OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/shortstack/OFL.txt
419
+ Shrikhand OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/shrikhand/OFL.txt
420
+ Silkscreen OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/silkscreen/OFL.txt
421
+ Single Day OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/singleday/OFL.txt
422
+ Sixtyfour OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sixtyfour/OFL.txt
423
+ Sniglet OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sniglet/OFL.txt
424
+ Sometype Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sometypemono/OFL.txt
425
+ Song Myung OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/songmyung/OFL.txt
426
+ Sora OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sora/OFL.txt
427
+ Source Code Pro OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sourcecodepro/OFL.txt
428
+ Source Sans 3 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sourcesans3/OFL.txt
429
+ Source Serif 4 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sourceserif4/OFL.txt
430
+ Space Grotesk OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/spacegrotesk/OFL.txt
431
+ Space Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/spacemono/OFL.txt
432
+ Special Elite Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/specialelite/LICENSE.txt
433
+ Spectral OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/spectral/OFL.txt
434
+ Spline Sans Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/splinesansmono/OFL.txt
435
+ Spoqa Han Sans Neo OFL-1.1 https://cdn.jsdelivr.net/npm/spoqa-han-sans@3.3.0/LICENSE
436
+ Stylish OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/stylish/OFL.txt
437
+ SUIT Variable OFL-1.1 https://cdn.jsdelivr.net/gh/sun-typeface/SUIT@2.0.5/LICENSE
438
+ SUITE Variable OFL-1.1 https://cdn.jsdelivr.net/gh/sun-typeface/SUITE@v2.0.4/LICENSE
439
+ Sunflower OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/sunflower/OFL.txt
440
+ Syne OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/syne/OFL.txt
441
+ Tilt Neon OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/tiltneon/OFL.txt
442
+ Tiny5 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/tiny5/OFL.txt
443
+ Titan One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/titanone/OFL.txt
444
+ Ultra Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/ultra/LICENSE.txt
445
+ Unbounded OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/unbounded/OFL.txt
446
+ Urbanist OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/urbanist/OFL.txt
447
+ Varela Round OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/varelaround/OFL.txt
448
+ Victor Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/victormono/OFL.txt
449
+ Vollkorn OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/vollkorn/OFL.txt
450
+ VT323 OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/vt323/OFL.txt
451
+ Wanted Sans Variable OFL-1.1 https://cdn.jsdelivr.net/npm/wanted-sans@1.0.3/fonts/OFL.txt
452
+ Work Sans OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/worksans/OFL.txt
453
+ Workbench OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/workbench/OFL.txt
454
+ Xanh Mono OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/xanhmono/OFL.txt
455
+ Yellowtail Apache-2.0 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/apache/yellowtail/LICENSE.txt
456
+ Yeon Sung OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/yeonsung/OFL.txt
457
+ Yeseva One OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/yesevaone/OFL.txt
458
+ Young Serif OFL-1.1 https://cdn.jsdelivr.net/gh/google/fonts@bd8f81ddb5c74d5c8897b36ad88b440266245103/ofl/youngserif/OFL.txt
459
+ 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
  | 무엇 | 왜 | 깔기 |
@@ -55,7 +67,7 @@ kf skill install # ~/.claude/skills/kasaframe 에 스킬 링
55
67
 
56
68
  ## 목소리·곡
57
69
 
58
- 쇼츠·설명은 차분한 TTS 내레이션과 깊은 앰비언트 곡(`deep`)이 기본이다. 목소리가 장면 길이를 정하고, 렌더가 곡을 말 아래로 덕킹해 -14 LUFS 로 섞는다. 곡은 틀이 박은 분위기(`deep`)대로 매번 같고, 목소리는 만들기 전에 묻는다(로컬 Qwen3·ElevenLabs·자막만·그 밖 차례). 엔진·곡이 없으면 다른 것으로 넘어가지 않고 키 넣기·다른 엔진·빼기를 묻는다.
70
+ 쇼츠·설명은 차분한 TTS 내레이션과 깊은 앰비언트 곡(`deep`)이 기본이다. 목소리가 장면 길이를 정하고, 렌더가 곡을 말 아래로 덕킹해 -14 LUFS 로 섞는다. 효과음도 기본으로 깐다 — 뜻 있는 자리(장면 바뀜·드롭·주인공 착지·짚개가 요점에 닿는 순간)에만 테마가 고른 결(`sfx/` 의 CC0 소리)을 둘레 곡과 비슷한 크기로, 그 순간 곡을 살짝 눌러 들리게(목소리가 있으면 더 낮게). 끄기는 `kf.json` 의 `sfx: false` 나 `kf render|make --sfx off`. 곡은 틀이 박은 분위기(`deep`)대로 매번 같고, 목소리는 만들기 전에 묻는다(로컬 Qwen3·ElevenLabs·자막만·그 밖 차례). 엔진·곡이 없으면 다른 것으로 넘어가지 않고 키 넣기·다른 엔진·빼기를 묻는다.
59
71
 
60
72
  | 쓰는 것 | 키 | 상태 |
61
73
  |---|---|---|
@@ -73,7 +85,7 @@ kf skill install # ~/.claude/skills/kasaframe 에 스킬 링
73
85
  | `kf new` | 용도 틀에서 프로젝트 뼈대 — 곡 분석·박에 맞춘 장면 시간표·장면 파일 |
74
86
  | `kf make` | 요청 한 줄로 끝까지 — 용도 판별·계획·장면·렌더·검사 |
75
87
  | `kf preview` | 미리보기 — 곡이 기준 시계, 타임라인·박·드롭·프레임 이동 |
76
- | `kf render` | MP4(또는 ProRes·PNG 묶음)로 굽기 — 탭 병렬, 곡 얹기, 자막 |
88
+ | `kf render` | MP4(또는 ProRes·PNG 묶음)로 굽기 — 탭 병렬, 곡·목소리·효과음 얹기, 자막 |
77
89
  | `kf check` | 검사 — 멈춤·빈 화면·글 깨짐·화면 밖 글·대비·섬광·박 경계·움직임 규칙 |
78
90
  | `kf still` · `kf sheet` · `kf look` | 한 장 · 장면 모음 · 장면별 확인표 |
79
91
  | `kf beats` | 곡을 재서 `beats.json` — 박·마디·프레이즈·구간·드롭·대역 에너지 |
@@ -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.
@@ -101,6 +101,7 @@ export default {
101
101
  - DOM 은 `build` 에서 한 번 짓고, `(t) => …` 에서는 글·스타일만 바꾼다.
102
102
  - 박자는 `ctx.beats`(`drop(0)`·`nearestBeat`·`phrase`·`inDrop`), 그림은 `ctx.asset("x.png")`, 글은 `ctx.safe` 안에.
103
103
  - 움직임은 `@kasaframe/motion` 부품을 쓴다 — 손으로 짠 흔들림·펄스는 검사가 셀 수 없다. 부품 표와 Remotion 대응표: [`packages/motion/README.md`](../packages/motion/README.md).
104
+ - 효과음은 렌더가 깐다 — 부품(등장·드롭·전환·테마 효과·패턴)이 움직임 시작 자리를 저절로 남긴다. 손으로 지은 움직임만 `ctx.sfx("land", 1.2)`(역할: appear·stick·land·hop·whoosh·tick·select·type·drop·burst·end, 시각은 장면 초). 끄기는 `kf.json` `sfx: false`.
104
105
  - React 장면: `export default { react: Component }`, `Component({ t, ctx })`.
105
106
 
106
107
  하지 말 것:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kasaframe",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "말로 시키는 코드 영상 엔진 — 쇼츠·홍보·설명·뮤비를 장면 파일로 짜고 박에 맞춰 MP4 로 굽고 검사한다",
5
5
  "keywords": [
6
6
  "video",
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  createBeats,
3
3
  cssVars,
4
+ cueAt,
4
5
  fontCss,
5
6
  setBeats,
6
7
  silentBeats,
@@ -169,6 +170,7 @@ export function mountProject(o: MountOptions): KfPage {
169
170
  style: style as KfStyle,
170
171
  safe: caps?.safe ?? kf.safeArea ?? ZERO,
171
172
  asset: assetUrl,
173
+ sfx: (role, at, so) => cueAt(role, entry.from + at, { ...so, source: so?.source ?? `ctx:${role}`, scene: entry.id }),
172
174
  };
173
175
  let draw: SceneDraw;
174
176
  if (mod.react) {
@@ -13,6 +13,7 @@
13
13
  "@kasaframe/cli": "*",
14
14
  "@kasaframe/clock": "*",
15
15
  "@kasaframe/core": "*",
16
+ "@kasaframe/themes": "*",
16
17
  "playwright": "^1.64.0",
17
18
  "pngjs": "^7.0.0"
18
19
  }
@@ -2,6 +2,8 @@ import { existsSync, readFileSync, statSync } from "node:fs";
2
2
  import { basename, dirname, extname, join, resolve } from "node:path";
3
3
  import { clockScript } from "@kasaframe/clock";
4
4
  import { openProject, repoRoot } from "@kasaframe/cli";
5
+ import { freezeLimits } from "@kasaframe/core";
6
+ import { themeFreezeSec } from "@kasaframe/themes";
5
7
  import { scanPage } from "./scan.ts";
6
8
  import { serveStatic } from "./serve.ts";
7
9
  import { probeVideo, videoText, videoThumbs } from "./video.ts";
@@ -41,6 +43,8 @@ interface Project {
41
43
  kf: any | null;
42
44
  beats: Beats | null;
43
45
  rules: MotionRules;
46
+ /** 멈춤 경고·오류 기준(초) — 틀·style.json 값과 테마가 늘린 값(freezeLimits) */
47
+ freeze: { warn: number; error: number };
44
48
  safe?: SafeArea;
45
49
  text: TextPolicy;
46
50
  allowText: string[];
@@ -75,12 +79,14 @@ function loadProject(dir: string | null, o: CheckOptions): Project {
75
79
  // 틀의 motion 이 style.json 위에 덮인다(SPEC 계약 7).
76
80
  const template = kf?.template ? readJson(join(repoRoot, "templates", kf.template, "template.json")) : null;
77
81
  const rules: MotionRules = { ...(style?.motion ?? {}), ...(template?.motion ?? {}) };
82
+ // 테마는 멈춤 오류 기준을 늘리기만 한다 — 테마 없는 프로젝트·기준을 안 정한 테마는 틀·style.json 값 그대로
78
83
  const scenes: number[] = Array.isArray(kf?.scenes) ? kf.scenes.map((s: any) => Number(s.from)).filter((t: number) => Number.isFinite(t)) : [];
79
84
  return {
80
85
  dir,
81
86
  kf,
82
87
  beats: beats && Array.isArray(beats.beats) ? beats : null,
83
88
  rules,
89
+ freeze: freezeLimits(rules.maxFreezeSec, themeFreezeSec(kf?.theme)),
84
90
  safe: kf?.safeArea,
85
91
  text: { ...(template?.text ?? {}), ...(kf?.text ?? {}) },
86
92
  allowText: kf?.check?.allowText ?? [],
@@ -184,7 +190,7 @@ async function checkPage(o: CheckOptions): Promise<Report> {
184
190
  f.push(...contrast(r.contrast, { shotFps: o.shotFps ?? 2 }));
185
191
  if (proj.text.minPx || proj.text.maxOnScreen) f.push(...textPolicy(r.texts, proj.text, { fps: meta.fps }));
186
192
  if (projDir) f.push(...genAssets(projDir));
187
- f.push(...freezes(r.thumbs, { errorSec: proj.rules.maxFreezeSec }));
193
+ f.push(...freezes(r.thumbs, { errorSec: proj.freeze.error, warnSec: proj.freeze.warn }));
188
194
  f.push(...blanks(r.thumbs, meta.duration));
189
195
  f.push(...spikes(r.thumbs, { exclude: [...sceneSpans(proj.kf).map((s) => s.from), ...(proj.beats?.drops ?? []), ...r.markers.filter((m) => m.kind === "scene" || m.kind === "drop").map((m) => m.t)] }));
190
196
  f.push(...flashes(r.thumbs, { maxPerSec: proj.rules.maxFlashPerSec, cuts: [...sceneSpans(proj.kf).map((s) => s.from), ...cuts(r.thumbs)] }));
@@ -236,7 +242,7 @@ async function checkVideo(o: CheckOptions): Promise<Report> {
236
242
 
237
243
  log(`프레임 읽기: ${from.toFixed(2)}–${to.toFixed(2)}초 · ${info.width}×${info.height} · ${info.fps.toFixed(2)}fps`);
238
244
  const thumbs = await videoThumbs(file, info, from, to);
239
- f.push(...freezes(thumbs, { errorSec: proj.rules.maxFreezeSec }));
245
+ f.push(...freezes(thumbs, { errorSec: proj.freeze.error, warnSec: proj.freeze.warn }));
240
246
  f.push(...blanks(thumbs, info.duration));
241
247
  f.push(...spikes(thumbs, { exclude: [...sceneSpans(proj.kf).map((s) => s.from), ...(proj.beats?.drops ?? [])] }));
242
248
  f.push(...flashes(thumbs, { maxPerSec: proj.rules.maxFlashPerSec, cuts: [...sceneSpans(proj.kf).map((s) => s.from), ...cuts(thumbs)] }));
@@ -1,10 +1,11 @@
1
+ import { MAX_FREEZE_SEC } from "@kasaframe/core";
1
2
  import { meanAbsDiff, type Thumb } from "../image.ts";
2
3
  import type { Finding } from "../types.ts";
3
4
 
4
5
  export interface FreezeOptions {
5
6
  // 160×90 회색조 평균 절대차(0..255). 커서 깜빡임 한 번이면 넘는 정도.
6
7
  threshold?: number;
7
- // 틀·style.json 의 motion.maxFreezeSec(틀이 이긴다) — 고정 관찰 화면(설명·뮤비)은 틀에서 늘려 허용한다. 없으면 0.1초
8
+ // 틀·style.json 의 motion.maxFreezeSec(틀이 이긴다)와 테마 값 중 큰 쪽(freezeLimits) — 고정 관찰 화면은 늘려 허용한다. 없으면 0.1초
8
9
  errorSec?: number;
9
10
  warnSec?: number;
10
11
  }
@@ -24,9 +25,7 @@ export function diffs(thumbs: Thumb[]): number[] {
24
25
 
25
26
  // 이웃 프레임끼리 비교하면 60fps 의 느린 움직임이 멈춤으로 보인다. 멈춤이 시작된 프레임(닻)과 비교해
26
27
  // 닻에서 얼마나 멀어졌는지로 잰다 — 10fps 로 찍든 60fps 로 읽든 같은 답이 나온다.
27
- // 공통 규칙: 단 0.1초도 쉬지 않는다 — 끝 카드·큰 숫자·로고도 예외 없이 0.1초(60fps 6프레임) 넘게 멈추면 오류
28
- export const MAX_FREEZE_SEC = 0.1;
29
-
28
+ // 공통 규칙: 단 0.1초도 쉬지 않는다(MAX_FREEZE_SEC) — 끝 카드·큰 숫자·로고도 예외 없이. 테마가 늘린 만큼만 경고로 남긴다
30
29
  export function freezes(thumbs: Thumb[], o: FreezeOptions = {}): Finding[] {
31
30
  const thr = o.threshold ?? 0.35;
32
31
  const errorSec = o.errorSec ?? MAX_FREEZE_SEC;
@@ -47,7 +46,7 @@ export function freezes(thumbs: Thumb[], o: FreezeOptions = {}): Finding[] {
47
46
  severity,
48
47
  from: thumbs[a].t,
49
48
  to: thumbs[end].t,
50
- message: `화면이 ${len.toFixed(2)}초 ${area > 0 ? `거의 멈췄다(바뀐 면적 ${(area * 100).toFixed(1)}%)` : "멈췄다"}${severity === "warn" ? ` — 경고 기준 ${warnSec}초 넘음` : ` — 기준 ${errorSec}초(틀·style.json maxFreezeSec)`} — 그 사이에 눈에 띄는 움직임 하나를 둔다`,
49
+ message: `화면이 ${len.toFixed(2)}초 ${area > 0 ? `거의 멈췄다(바뀐 면적 ${(area * 100).toFixed(1)}%)` : "멈췄다"}${severity === "warn" ? ` — 경고 기준 ${warnSec}초 넘음` : ` — 기준 ${errorSec}초(틀·style.json·테마 maxFreezeSec)`} — 그 사이에 눈에 띄는 움직임 하나를 둔다`,
51
50
  detail: { seconds: Math.round(len * 100) / 100, changedArea: Math.round(area * 10000) / 10000 },
52
51
  });
53
52
  }
@@ -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);