@biunow/agent-biuart 0.0.0-stage → 0.1.1

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 (377) hide show
  1. package/bin/server.mjs +575 -0
  2. package/data/styles.json +533 -0
  3. package/engine/audit_clip.py +46 -0
  4. package/engine/clip.html +24 -0
  5. package/engine/clip.js +104 -0
  6. package/engine/clip_schema.json +19 -0
  7. package/engine/clips/t1_3b1b.js +203 -0
  8. package/engine/clips/t2_keynote_ui.js +347 -0
  9. package/engine/clips/t3_finance_chart.js +206 -0
  10. package/engine/clips/y1_kurzgesagt.js +183 -0
  11. package/engine/clips/y2_vox.js +150 -0
  12. package/engine/clips/y3_whiteboard.js +209 -0
  13. package/engine/clips/y4_storytime.js +194 -0
  14. package/engine/clips/y5_kinetic_type.js +134 -0
  15. package/engine/compare.py +19 -0
  16. package/engine/demos/_shared/hero/c1_0.png +0 -0
  17. package/engine/demos/_shared/hero/c1_1.png +0 -0
  18. package/engine/demos/_shared/hero/c1_2.png +0 -0
  19. package/engine/demos/_shared/hero/c3_line.png +0 -0
  20. package/engine/demos/_shared/hero.js +96 -0
  21. package/engine/demos/long_scroll/eras.js +23 -0
  22. package/engine/demos/long_scroll/frames/8bit_act/01.png +0 -0
  23. package/engine/demos/long_scroll/frames/8bit_act/02.png +0 -0
  24. package/engine/demos/long_scroll/frames/8bit_act/03.png +0 -0
  25. package/engine/demos/long_scroll/frames/8bit_act/04.png +0 -0
  26. package/engine/demos/long_scroll/frames/8bit_act/05.png +0 -0
  27. package/engine/demos/long_scroll/frames/8bit_act/06.png +0 -0
  28. package/engine/demos/long_scroll/frames/8bit_act/07.png +0 -0
  29. package/engine/demos/long_scroll/frames/8bit_act/08.png +0 -0
  30. package/engine/demos/long_scroll/frames/8bit_act/meta.json +69 -0
  31. package/engine/demos/long_scroll/frames/8bit_walk/01.png +0 -0
  32. package/engine/demos/long_scroll/frames/8bit_walk/02.png +0 -0
  33. package/engine/demos/long_scroll/frames/8bit_walk/03.png +0 -0
  34. package/engine/demos/long_scroll/frames/8bit_walk/04.png +0 -0
  35. package/engine/demos/long_scroll/frames/8bit_walk/05.png +0 -0
  36. package/engine/demos/long_scroll/frames/8bit_walk/06.png +0 -0
  37. package/engine/demos/long_scroll/frames/8bit_walk/07.png +0 -0
  38. package/engine/demos/long_scroll/frames/8bit_walk/08.png +0 -0
  39. package/engine/demos/long_scroll/frames/8bit_walk/meta.json +69 -0
  40. package/engine/demos/long_scroll/frames/egypt_dodge/01.png +0 -0
  41. package/engine/demos/long_scroll/frames/egypt_dodge/02.png +0 -0
  42. package/engine/demos/long_scroll/frames/egypt_dodge/03.png +0 -0
  43. package/engine/demos/long_scroll/frames/egypt_dodge/04.png +0 -0
  44. package/engine/demos/long_scroll/frames/egypt_dodge/05.png +0 -0
  45. package/engine/demos/long_scroll/frames/egypt_dodge/06.png +0 -0
  46. package/engine/demos/long_scroll/frames/egypt_dodge/07.png +0 -0
  47. package/engine/demos/long_scroll/frames/egypt_dodge/08.png +0 -0
  48. package/engine/demos/long_scroll/frames/egypt_dodge/meta.json +69 -0
  49. package/engine/demos/long_scroll/frames/egypt_walk8/01.png +0 -0
  50. package/engine/demos/long_scroll/frames/egypt_walk8/02.png +0 -0
  51. package/engine/demos/long_scroll/frames/egypt_walk8/03.png +0 -0
  52. package/engine/demos/long_scroll/frames/egypt_walk8/04.png +0 -0
  53. package/engine/demos/long_scroll/frames/egypt_walk8/05.png +0 -0
  54. package/engine/demos/long_scroll/frames/egypt_walk8/06.png +0 -0
  55. package/engine/demos/long_scroll/frames/egypt_walk8/07.png +0 -0
  56. package/engine/demos/long_scroll/frames/egypt_walk8/08.png +0 -0
  57. package/engine/demos/long_scroll/frames/egypt_walk8/meta.json +69 -0
  58. package/engine/demos/long_scroll/frames/monet_throw/01.png +0 -0
  59. package/engine/demos/long_scroll/frames/monet_throw/02.png +0 -0
  60. package/engine/demos/long_scroll/frames/monet_throw/03.png +0 -0
  61. package/engine/demos/long_scroll/frames/monet_throw/04.png +0 -0
  62. package/engine/demos/long_scroll/frames/monet_throw/05.png +0 -0
  63. package/engine/demos/long_scroll/frames/monet_throw/06.png +0 -0
  64. package/engine/demos/long_scroll/frames/monet_throw/07.png +0 -0
  65. package/engine/demos/long_scroll/frames/monet_throw/08.png +0 -0
  66. package/engine/demos/long_scroll/frames/monet_throw/meta.json +71 -0
  67. package/engine/demos/long_scroll/frames/monet_walk/01.png +0 -0
  68. package/engine/demos/long_scroll/frames/monet_walk/02.png +0 -0
  69. package/engine/demos/long_scroll/frames/monet_walk/03.png +0 -0
  70. package/engine/demos/long_scroll/frames/monet_walk/04.png +0 -0
  71. package/engine/demos/long_scroll/frames/monet_walk/05.png +0 -0
  72. package/engine/demos/long_scroll/frames/monet_walk/06.png +0 -0
  73. package/engine/demos/long_scroll/frames/monet_walk/07.png +0 -0
  74. package/engine/demos/long_scroll/frames/monet_walk/08.png +0 -0
  75. package/engine/demos/long_scroll/frames/monet_walk/meta.json +71 -0
  76. package/engine/demos/long_scroll/lib/acts.js +87 -0
  77. package/engine/demos/long_scroll/lib/crossing.js +463 -0
  78. package/engine/demos/long_scroll/lib/world.js +143 -0
  79. package/engine/demos/long_scroll/lib/xing2_ding.js +42 -0
  80. package/engine/demos/long_scroll/lib/xing2_jia.js +114 -0
  81. package/engine/demos/long_scroll/lib/xing2_yi.js +133 -0
  82. package/engine/demos/long_scroll/segments/02_egypt.js +234 -0
  83. package/engine/demos/long_scroll/segments/14_8bit.js +118 -0
  84. package/engine/demos/long_scroll/segments/28_monet.js +86 -0
  85. package/engine/demos/t1_3b1b/eras.js +11 -0
  86. package/engine/demos/t1_3b1b/t1_s1.js +101 -0
  87. package/engine/demos/t1_3b1b/t1_s2.js +74 -0
  88. package/engine/demos/t1_3b1b/t1_s3.js +65 -0
  89. package/engine/demos/t2_keynote_ui/eras.js +10 -0
  90. package/engine/demos/t2_keynote_ui/t2_s1.js +57 -0
  91. package/engine/demos/t2_keynote_ui/t2_s2.js +70 -0
  92. package/engine/demos/t2_keynote_ui/t2_s3.js +61 -0
  93. package/engine/demos/t3_finance_chart/eras.js +11 -0
  94. package/engine/demos/t3_finance_chart/t3_s1.js +48 -0
  95. package/engine/demos/t3_finance_chart/t3_s2.js +42 -0
  96. package/engine/demos/t3_finance_chart/t3_s3.js +51 -0
  97. package/engine/demos/y1_kurzgesagt/eras.js +10 -0
  98. package/engine/demos/y1_kurzgesagt/kurzgesagt.js +347 -0
  99. package/engine/demos/y2_vox/eras.js +10 -0
  100. package/engine/demos/y2_vox/vox.js +240 -0
  101. package/engine/demos/y3_whiteboard/eras.js +10 -0
  102. package/engine/demos/y3_whiteboard/whiteboard.js +162 -0
  103. package/engine/demos/y4_storytime/eras.js +14 -0
  104. package/engine/demos/y4_storytime/s1_desk.js +18 -0
  105. package/engine/demos/y4_storytime/s2_screen.js +82 -0
  106. package/engine/demos/y4_storytime/s3_react.js +39 -0
  107. package/engine/demos/y4_storytime/s4_wide.js +16 -0
  108. package/engine/demos/y4_storytime/s5_close.js +18 -0
  109. package/engine/demos/y4_storytime/story.js +25 -0
  110. package/engine/demos/y4_storytime/vo_env.js +2 -0
  111. package/engine/demos/y4_storytime/world.js +73 -0
  112. package/engine/demos/y5_kinetic_type/eras.js +16 -0
  113. package/engine/demos/y5_kinetic_type/k1_title.js +38 -0
  114. package/engine/demos/y5_kinetic_type/k2_complete.js +55 -0
  115. package/engine/demos/y5_kinetic_type/k3_chat.js +47 -0
  116. package/engine/demos/y5_kinetic_type/k4_agent.js +49 -0
  117. package/engine/demos/y5_kinetic_type/kinetic.js +52 -0
  118. package/engine/engine.js +277 -0
  119. package/engine/eras.js +60 -0
  120. package/engine/eras_gallery.js +115 -0
  121. package/engine/eras_style_studies.js +20 -0
  122. package/engine/examples/assets/K/347/272/277/345/233/276_/346/250/252/345/261/217.png +0 -0
  123. package/engine/examples/assets//347/273/210/347/253/257_for/345/276/252/347/216/257/346/261/202/345/222/214.png +0 -0
  124. package/engine/examples/assets//347/273/210/347/253/257_sum/346/261/202/345/222/214.png +0 -0
  125. package/engine/examples/assets//350/220/245/346/224/266/345/233/276_/347/253/226/345/261/217.png +0 -0
  126. package/engine/examples/assets//350/264/242/347/273/217/345/233/276/350/241/250_/346/250/252/345/261/217.png +0 -0
  127. package/engine/examples/t1_3b1b.json +19 -0
  128. package/engine/examples/t2_fullbleed_pulse.json +15 -0
  129. package/engine/examples/t2_keynote_ui.json +15 -0
  130. package/engine/examples/t3_finance_chart.json +29 -0
  131. package/engine/examples/y1_kurzgesagt.json +16 -0
  132. package/engine/examples/y2_vox.json +14 -0
  133. package/engine/examples/y3_whiteboard.json +17 -0
  134. package/engine/examples/y4_storytime.json +52 -0
  135. package/engine/examples/y5_kinetic_type.json +14 -0
  136. package/engine/index.html +42 -0
  137. package/engine/lib/THREE_LICENSE.txt +21 -0
  138. package/engine/lib/brush.js +149 -0
  139. package/engine/lib/camera.js +99 -0
  140. package/engine/lib/chart.js +152 -0
  141. package/engine/lib/collage.js +97 -0
  142. package/engine/lib/diagram.js +264 -0
  143. package/engine/lib/finish.js +70 -0
  144. package/engine/lib/fonts/AlfaSlabOne-400.woff +0 -0
  145. package/engine/lib/fonts/Anton-400.woff +0 -0
  146. package/engine/lib/fonts/ArchivoBlack-400.woff +0 -0
  147. package/engine/lib/fonts/Bangers-400.woff +0 -0
  148. package/engine/lib/fonts/Caveat-600.woff +0 -0
  149. package/engine/lib/fonts/Cinzel-400.woff +0 -0
  150. package/engine/lib/fonts/Cinzel-700.woff +0 -0
  151. package/engine/lib/fonts/CormorantGaramond-500.woff +0 -0
  152. package/engine/lib/fonts/CormorantGaramond-500i.woff +0 -0
  153. package/engine/lib/fonts/CormorantGaramond-700.woff +0 -0
  154. package/engine/lib/fonts/EBGaramond-400.woff +0 -0
  155. package/engine/lib/fonts/EBGaramond-400i.woff +0 -0
  156. package/engine/lib/fonts/EBGaramond-600.woff +0 -0
  157. package/engine/lib/fonts/Exo2-800i.woff +0 -0
  158. package/engine/lib/fonts/GochiHand-400.woff +0 -0
  159. package/engine/lib/fonts/IMFellEnglish-400.woff +0 -0
  160. package/engine/lib/fonts/IMFellEnglish-400i.woff +0 -0
  161. package/engine/lib/fonts/Inter-var.woff +0 -0
  162. package/engine/lib/fonts/JosefinSans-700.woff +0 -0
  163. package/engine/lib/fonts/Kalam-700.woff +0 -0
  164. package/engine/lib/fonts/LICENSES.md +40 -0
  165. package/engine/lib/fonts/LXGWWenKai-500.woff +0 -0
  166. package/engine/lib/fonts/LibreBaskerville-400.woff +0 -0
  167. package/engine/lib/fonts/LibreBaskerville-700.woff +0 -0
  168. package/engine/lib/fonts/LilitaOne-400.woff +0 -0
  169. package/engine/lib/fonts/Marcellus-400.woff +0 -0
  170. package/engine/lib/fonts/NotoSansSC-500.woff +0 -0
  171. package/engine/lib/fonts/NotoSansSC-700.woff +0 -0
  172. package/engine/lib/fonts/NotoSansSC-800.woff +0 -0
  173. package/engine/lib/fonts/NotoSansSC-900.woff +0 -0
  174. package/engine/lib/fonts/NotoSansSC-sub.woff +0 -0
  175. package/engine/lib/fonts/NotoSerifJP-600.woff +0 -0
  176. package/engine/lib/fonts/NotoSerifSC-sub.woff +0 -0
  177. package/engine/lib/fonts/OFL.txt +94 -0
  178. package/engine/lib/fonts/PlayfairDisplay-400i.woff +0 -0
  179. package/engine/lib/fonts/PlayfairDisplay-700.woff +0 -0
  180. package/engine/lib/fonts/PlayfairDisplay-700i.woff +0 -0
  181. package/engine/lib/fonts/Poppins-600.woff +0 -0
  182. package/engine/lib/fonts/Poppins-700.woff +0 -0
  183. package/engine/lib/fonts/Poppins-800.woff +0 -0
  184. package/engine/lib/fonts/PressStart2P-400.woff +0 -0
  185. package/engine/lib/fonts/Righteous-400.woff +0 -0
  186. package/engine/lib/fonts/RobotoCondensed-var.woff +0 -0
  187. package/engine/lib/fonts/Rye-400.woff +0 -0
  188. package/engine/lib/fonts/UnifrakturMaguntia-400.woff +0 -0
  189. package/engine/lib/fonts/cmunrm.woff +0 -0
  190. package/engine/lib/fonts/cmunti.woff +0 -0
  191. package/engine/lib/fonts/index.json +1 -0
  192. package/engine/lib/fonts.js +56 -0
  193. package/engine/lib/kit.js +91 -0
  194. package/engine/lib/media.js +118 -0
  195. package/engine/lib/medium.js +258 -0
  196. package/engine/lib/motion.js +111 -0
  197. package/engine/lib/paint.js +200 -0
  198. package/engine/lib/palettes.js +57 -0
  199. package/engine/lib/post.js +108 -0
  200. package/engine/lib/render.js +189 -0
  201. package/engine/lib/rig.js +390 -0
  202. package/engine/lib/rig_huashu.js +171 -0
  203. package/engine/lib/three.min.js +7 -0
  204. package/engine/lib/toon.js +186 -0
  205. package/engine/lib/typo.js +136 -0
  206. package/engine/lib/ui.js +141 -0
  207. package/engine/lib/util.js +92 -0
  208. package/engine/render.py +157 -0
  209. package/engine/scenes/01_cave.js +364 -0
  210. package/engine/scenes/02_egypt.js +524 -0
  211. package/engine/scenes/03_greek.js +448 -0
  212. package/engine/scenes/04_roman.js +555 -0
  213. package/engine/scenes/05_gothic.js +522 -0
  214. package/engine/scenes/06_renaissance.js +338 -0
  215. package/engine/scenes/08_impressionism.js +206 -0
  216. package/engine/scenes/09_postimp.js +183 -0
  217. package/engine/scenes/10_nouveau.js +334 -0
  218. package/engine/scenes/11_cubism.js +265 -0
  219. package/engine/scenes/12_bauhaus.js +214 -0
  220. package/engine/scenes/13_pop.js +269 -0
  221. package/engine/scenes/14_8bit.js +238 -0
  222. package/engine/scenes/15_raytrace.js +300 -0
  223. package/engine/scenes/16_2026.js +565 -0
  224. package/engine/scenes/17_ink.js +273 -0
  225. package/engine/scenes/18_klimt.js +227 -0
  226. package/engine/scenes/19_munch.js +153 -0
  227. package/engine/scenes/20_dunhuang.js +215 -0
  228. package/engine/scenes/21_kusama.js +124 -0
  229. package/engine/scenes/22_constructivism.js +205 -0
  230. package/engine/scenes/23_dali.js +221 -0
  231. package/engine/scenes/24_hopper.js +150 -0
  232. package/engine/scenes/25_ghibli.js +251 -0
  233. package/engine/scenes/26_vaporwave.js +191 -0
  234. package/engine/scenes/27_kirby.js +255 -0
  235. package/engine/scenes/28_monet.js +176 -0
  236. package/engine/scenes/29_seurat.js +104 -0
  237. package/engine/scenes/30_matisse.js +151 -0
  238. package/engine/scenes/31_haring.js +109 -0
  239. package/engine/scenes/32_rembrandt.js +217 -0
  240. package/engine/scenes/33_rubberhose.js +219 -0
  241. package/engine/scenes/34_shadowpuppet.js +195 -0
  242. package/engine/scenes/35_shinkai.js +197 -0
  243. package/engine/scenes/36_picasso_blue.js +123 -0
  244. package/engine/scenes/38_giotto.js +133 -0
  245. package/engine/scenes/39_piero.js +53 -0
  246. package/engine/scenes/40_raphael.js +96 -0
  247. package/engine/scenes/41_michelangelo.js +112 -0
  248. package/engine/scenes/42_guardi.js +70 -0
  249. package/engine/scenes/43_lorenzetti.js +145 -0
  250. package/engine/scenes/44_cortona.js +86 -0
  251. package/engine/scenes/45_renoir.js +86 -0
  252. package/engine/scenes/46_pissarro.js +82 -0
  253. package/engine/scenes/47_sisley.js +94 -0
  254. package/engine/scenes/48_gauguin.js +107 -0
  255. package/engine/scenes/49_chagall.js +60 -0
  256. package/engine/scenes/50_ma_yuan.js +131 -0
  257. package/engine/scenes/51_persian_miniature.js +149 -0
  258. package/engine/scenes/52_south_park.js +105 -0
  259. package/engine/scenes/53_pixar.js +60 -0
  260. package/engine/scenes/54_ghibli_lab.js +68 -0
  261. package/engine/scenes/55_dunhuang.js +161 -0
  262. package/engine/scenes/index.js +28 -0
  263. package/engine/spec_assets.py +76 -0
  264. package/engine/transitions.js +929 -0
  265. package/engine//346/227/266/344/273/243/344/275/234/350/200/205/350/247/204/350/214/203.md +49 -0
  266. package/lib/host.mjs +754 -0
  267. package/lib/render-bridge.mjs +543 -0
  268. package/lib/render-cli.mjs +98 -0
  269. package/lib/storyboard-lint.mjs +54 -0
  270. package/manifest.json +52 -0
  271. package/package.json +8 -4
  272. package/runtime/package.json +8 -0
  273. package/skills/biuart/SKILL.md +154 -0
  274. package/skills/biuart/references/01-/346/213/206/350/247/243.md +55 -0
  275. package/skills/biuart/references/02-/346/234/272/345/210/266.md +41 -0
  276. package/skills/biuart/references/03-/344/270/200/345/270/247/345/205/210/350/241/214/345/233/233/346/235/241/350/267/257/347/272/277.md +39 -0
  277. package/skills/biuart/references/04-/347/272/257/344/273/243/347/240/201/347/273/230/345/210/266.md +92 -0
  278. package/skills/biuart/references/05-/350/212/202/345/245/217/344/270/216/351/205/215/344/271/220.md +19 -0
  279. package/skills/biuart/references/06-/345/217/243/346/222/255/351/251/261/345/212/250/347/232/204/350/211/272/346/234/257/347/237/255/347/211/207.md +31 -0
  280. package/skills/biuart/references/07-/346/255/243/351/235/242/347/273/217/351/252/214.md +196 -0
  281. package/skills/biuart/references/08-/351/243/216/346/240/274/344/275/234/350/200/205/350/247/204/350/214/203.md +61 -0
  282. package/skills/biuart/references/09-/350/247/206/351/242/221/345/212/250/347/224/273/350/257/255/346/263/225.md +382 -0
  283. package/skills/biuart/references/10-/350/247/222/350/211/262.md +34 -0
  284. package/skills/biuart/references/11-/351/225/277/345/215/267/347/251/277/350/266/212/347/211/207.md +43 -0
  285. package/skills/biuart/references/12-/345/217/243/346/222/255/346/225/264/347/211/207/344/270/216/347/273/217/351/252/214/345/233/236/346/265/201.md +25 -0
  286. package/skills/biuart/references/13-/345/217/243/346/222/255/344/270/216/350/257/255/351/237/263/345/244/215/345/210/273.md +7 -0
  287. package/skills/biuart/references/15-/350/267/250/345/234/272/346/231/257/351/243/216/346/240/274/346/217/220/347/202/274.md +48 -0
  288. package/skills/biuart/references/16-/351/243/216/346/240/274/346/274/224/347/244/27295/345/210/206/345/215/217/350/256/256.md +103 -0
  289. package/skills/biuart/references/about-author.md +99 -0
  290. package/skills/biuart/references/capabilities.md +91 -0
  291. package/skills/biuart/references/compatibility.md +34 -0
  292. package/skills/biuart/references/images.md +97 -0
  293. package/skills/biuart/references/voice-model-review.md +18 -0
  294. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/t1_3b1b.md +122 -0
  295. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/t2_keynote_ui.md +117 -0
  296. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/t3_finance_chart.md +116 -0
  297. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y1_kurzgesagt.md +193 -0
  298. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y2_vox.md +195 -0
  299. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y3_whiteboard.md +190 -0
  300. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y4_storytime.md +166 -0
  301. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y5_kinetic_type.md +158 -0
  302. package/skills/biuart/references//345/212/250/347/224/273/350/257/255/346/263/225/y6_presenter_explainer.md +24 -0
  303. package/skills/biuart/references//345/217/243/346/222/255API.md +125 -0
  304. package/skills/biuart/references//350/211/262/346/235/277.md +38 -0
  305. package/skills/biuart/references//350/247/222/350/211/262/347/262/276/347/273/206/345/272/246.md +61 -0
  306. package/skills/biuart/references//351/225/234/345/244/264/350/241/250/346/250/241/346/235/277.md +80 -0
  307. package/skills/biuart/references//351/225/234/345/244/264/350/257/255/350/250/200.md +73 -0
  308. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/01_cave.md +46 -0
  309. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/02_egypt.md +64 -0
  310. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/03_greek.md +50 -0
  311. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/04_roman.md +99 -0
  312. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/05_gothic.md +32 -0
  313. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/06_renaissance.md +41 -0
  314. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/08_impressionism.md +34 -0
  315. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/09_postimp.md +17 -0
  316. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/10_nouveau.md +31 -0
  317. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/11_cubism.md +30 -0
  318. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/12_bauhaus.md +30 -0
  319. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/13_pop.md +29 -0
  320. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/14_8bit.md +27 -0
  321. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/15_raytrace.md +32 -0
  322. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/16_2026.md +55 -0
  323. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/17_ink.md +50 -0
  324. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/18_klimt.md +37 -0
  325. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/19_munch.md +42 -0
  326. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/20_dunhuang.md +49 -0
  327. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/21_kusama.md +32 -0
  328. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/22_constructivism.md +35 -0
  329. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/23_dali.md +29 -0
  330. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/24_hopper.md +30 -0
  331. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/25_ghibli.md +55 -0
  332. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/26_vaporwave.md +27 -0
  333. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/27_kirby.md +30 -0
  334. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/28_monet.md +39 -0
  335. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/29_seurat.md +31 -0
  336. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/30_matisse.md +26 -0
  337. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/31_haring.md +22 -0
  338. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/32_rembrandt.md +29 -0
  339. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/33_rubberhose.md +31 -0
  340. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/34_shadowpuppet.md +40 -0
  341. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/35_shinkai.md +34 -0
  342. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/36_picasso_blue.md +25 -0
  343. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/37_rick_morty.md +48 -0
  344. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/38_giotto.md +67 -0
  345. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/39_piero.md +59 -0
  346. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/40_raphael.md +65 -0
  347. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/41_michelangelo.md +65 -0
  348. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/42_guardi.md +65 -0
  349. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/43_lorenzetti.md +69 -0
  350. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/44_cortona.md +66 -0
  351. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/45_renoir.md +66 -0
  352. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/46_pissarro.md +66 -0
  353. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/47_sisley.md +67 -0
  354. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/48_gauguin.md +66 -0
  355. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/49_chagall.md +59 -0
  356. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/50_ma_yuan.md +68 -0
  357. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/51_persian_miniature.md +66 -0
  358. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/52_south_park.md +65 -0
  359. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/53_pixar.md +61 -0
  360. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/55_dunhuang.md +41 -0
  361. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/INDEX.md +89 -0
  362. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/_/350/275/254/345/234/272_/350/277/201/347/247/273/346/265/213/350/257/225.md +53 -0
  363. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/_/351/207/215/345/201/232/350/277/233/345/272/246.md +37 -0
  364. package/skills/biuart/references//351/243/216/346/240/274/351/205/215/346/226/271/_/351/237/263/350/275/250_/350/211/272/346/234/257/345/217/262/351/200/237/351/200/232.md +135 -0
  365. package/studio/app.js +380 -0
  366. package/studio/assert-panel-permit.mjs +67 -0
  367. package/studio/composer.css +465 -0
  368. package/studio/composer.js +480 -0
  369. package/studio/index.html +97 -0
  370. package/studio/optimize-prompt.mjs +84 -0
  371. package/studio/optimize-prompt.test.mjs +47 -0
  372. package/studio/recipes.mjs +87 -0
  373. package/studio/select-menu.js +450 -0
  374. package/studio/styles.css +71 -0
  375. package/studio/to-english-prompt.mjs +149 -0
  376. package/studio/to-english-prompt.test.mjs +72 -0
  377. package/README.md +0 -3
@@ -0,0 +1,465 @@
1
+ :root {
2
+ --ink: #000;
3
+ --ink-soft: #1a1a1a;
4
+ --accent: #d4f07a;
5
+ --accent-soft: #eef8c4;
6
+ --accent-deep: #b8d94a;
7
+ --paper: #f3f3f1;
8
+ --paper-2: #e9e9e6;
9
+ --surface: #fff;
10
+ --muted: #6b6b6b;
11
+ --muted-2: #9a9a9a;
12
+ --line: #e2e2df;
13
+ --line-strong: #d0d0cc;
14
+ --danger: #c23b2e;
15
+ --success: #2f6b4f;
16
+ --warn: #9a6b00;
17
+ --radius: 18px;
18
+ --radius-sm: 12px;
19
+ --shadow: 0 1px 2px rgb(0 0 0 / 4%), 0 12px 36px rgb(0 0 0 / 6%);
20
+ --font: "Plus Jakarta Sans", "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
21
+ --display: "Fraunces", "Songti SC", "SimSun", serif;
22
+ }
23
+ * { box-sizing: border-box; }
24
+ body {
25
+ margin: 0;
26
+ font: 13.5px/1.5 var(--font);
27
+ color: var(--ink);
28
+ background:
29
+ radial-gradient(1200px 600px at 10% -10%, rgb(212 240 122 / 24%), transparent 55%),
30
+ radial-gradient(900px 500px at 100% 0%, rgb(0 0 0 / 4%), transparent 50%),
31
+ linear-gradient(180deg, #f5f5f2 0%, #fafaf8 48%, #fff 100%);
32
+ min-height: 100vh;
33
+ }
34
+ button, input, textarea, select { font-family: inherit; }
35
+ button { cursor: pointer; }
36
+ button:disabled { cursor: not-allowed; opacity: .5; }
37
+
38
+ .desk {
39
+ max-width: 1180px; margin: 0 auto;
40
+ padding: 28px 28px 48px;
41
+ }
42
+ .hero {
43
+ display: flex; align-items: flex-end; justify-content: space-between; gap: 28px;
44
+ margin-bottom: 20px; padding: 22px 24px 20px;
45
+ background: #fff; border: 1px solid var(--line); border-radius: var(--radius);
46
+ box-shadow: var(--shadow);
47
+ }
48
+ .hero-copy { min-width: 0; flex: 1; }
49
+ .eyebrow {
50
+ display: block; font-size: 10px; letter-spacing: .18em; font-weight: 700;
51
+ color: var(--muted); margin-bottom: 10px;
52
+ }
53
+ .hero h1 {
54
+ font-family: var(--display); font-size: clamp(28px, 3.6vw, 44px);
55
+ line-height: 1.05; letter-spacing: -.03em; margin: 0 0 10px; font-weight: 700;
56
+ }
57
+ .hero-desc { margin: 0; color: var(--muted); font-size: 14px; line-height: 1.55; max-width: 52ch; }
58
+ .sub { color: var(--muted-2); font-size: 11px; margin-top: 10px; word-break: break-all; }
59
+ .hero-aside { display: flex; flex-direction: column; align-items: flex-end; gap: 10px; flex: none; }
60
+ .hero-badge {
61
+ background: #111; color: #fff; border-radius: 14px; padding: 12px 16px 11px;
62
+ min-width: 132px; text-align: left; box-shadow: 0 10px 28px rgb(0 0 0 / 12%);
63
+ }
64
+ .hero-badge span { font-size: 10px; letter-spacing: .14em; color: #8a8a8a; }
65
+ .hero-badge strong { display: block; font-family: var(--display); font-size: 22px; margin: 3px 0 2px; color: var(--accent); }
66
+ .hero-badge em { font-size: 10px; color: #9a9a9a; font-style: normal; }
67
+ .chips { display: flex; gap: 6px; flex-wrap: wrap; justify-content: flex-end; }
68
+ .chip {
69
+ border-radius: 999px; padding: 3px 9px; font-size: 11px;
70
+ background: var(--accent-soft); color: var(--ink);
71
+ }
72
+ .chip.warn { background: #f5e6c8; color: var(--warn); }
73
+ .chip.bad { background: #f7dcd7; color: var(--danger); }
74
+ @media (max-width: 720px) {
75
+ .hero { flex-direction: column; align-items: stretch; }
76
+ .hero-aside { align-items: flex-start; }
77
+ .chips { justify-content: flex-start; }
78
+ }
79
+
80
+ .layout {
81
+ display: grid; grid-template-columns: minmax(0, 1.55fr) minmax(260px, .7fr);
82
+ gap: 16px; align-items: start;
83
+ }
84
+ @media (max-width: 920px) { .layout { grid-template-columns: 1fr; } }
85
+
86
+ .composer {
87
+ background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
88
+ box-shadow: var(--shadow); overflow: visible; position: relative;
89
+ }
90
+ .link-bar {
91
+ display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
92
+ padding: 12px 16px 8px;
93
+ }
94
+ .need-flags { display: flex; flex-wrap: wrap; gap: 6px; margin-left: auto; }
95
+ .need-flag {
96
+ font-size: 11px; font-weight: 650; border-radius: 99px; padding: 2px 8px;
97
+ background: #f4f4ef; color: var(--ink);
98
+ }
99
+ .need-flag.required { background: var(--ink); color: var(--accent); }
100
+ .need-flag.off { color: var(--muted); }
101
+ .link-input {
102
+ flex: 1; min-width: 200px; border: 1px solid var(--line); border-radius: 10px;
103
+ padding: 8px 12px; font-size: 12px; background: #fafaf7; color: var(--ink); outline: 0;
104
+ }
105
+ .link-input:focus { border-color: var(--accent-deep); background: #fff; }
106
+ .link-add {
107
+ border: 0; background: var(--ink); color: var(--accent); border-radius: 99px;
108
+ padding: 8px 14px; font-size: 12px; font-weight: 600;
109
+ }
110
+ .link-add:disabled { opacity: 0.4; }
111
+ .composer textarea {
112
+ width: 100%; min-height: 190px; border: 0; resize: vertical; outline: 0;
113
+ padding: 18px 22px 8px; font-size: 15px; line-height: 1.7; background: transparent; color: var(--ink);
114
+ }
115
+ .composer textarea::placeholder { color: #a3a39f; }
116
+
117
+ .prompt-stage { position: relative; }
118
+ .prompt-stage textarea { padding-bottom: 48px; }
119
+ .optimize {
120
+ position: absolute; right: 14px; bottom: 12px; z-index: 2;
121
+ border: 1px solid var(--line-strong); background: #fff; color: var(--ink);
122
+ border-radius: 999px; padding: 6px 12px; font-size: 12px; font-weight: 650;
123
+ box-shadow: 0 1px 2px rgb(0 0 0 / 6%);
124
+ }
125
+ .optimize:hover { background: var(--accent-soft); border-color: var(--accent-deep); }
126
+ .optimize.is-locked { opacity: .55; }
127
+ .optimize.is-locked:hover { background: #fff; border-color: var(--line-strong); }
128
+ .optimize-tip {
129
+ position: absolute; right: 14px; bottom: 48px; z-index: 3;
130
+ background: #111; color: #fff; border-radius: 10px; padding: 8px 10px;
131
+ font-size: 12px; line-height: 1.4; white-space: nowrap;
132
+ box-shadow: 0 8px 24px rgb(0 0 0 / 18%);
133
+ }
134
+ .optimize-tip[hidden] { display: none !important; }
135
+
136
+ .composer-foot {
137
+ display: flex; align-items: center; justify-content: space-between; gap: 12px;
138
+ padding: 10px 12px 12px 14px; border-top: 1px solid #f0f0ed; flex-wrap: wrap;
139
+ }
140
+ .left-tools, .right-tools { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
141
+ .count { color: var(--muted-2); font-size: 11px; }
142
+ .plus-wrap { position: relative; }
143
+ .plus {
144
+ width: 38px; height: 38px; border-radius: 50%; border: 1px solid var(--line);
145
+ background: var(--paper); display: inline-grid; place-items: center;
146
+ color: var(--ink); padding: 0; line-height: 0; font-size: 0;
147
+ }
148
+ .plus svg { width: 16px; height: 16px; display: block; }
149
+ .plus:hover, .plus.on { background: var(--accent-soft); border-color: var(--accent-deep); }
150
+ .plus-menu {
151
+ position: absolute; left: 0; bottom: 52px; width: 320px; z-index: 30;
152
+ background: var(--surface); border: 1px solid var(--line); border-radius: 15px;
153
+ box-shadow: 0 2px 6px rgb(0 0 0 / 5%), 0 24px 60px rgb(0 0 0 / 16%);
154
+ padding: 8px; animation: sm-in .14s ease-out;
155
+ }
156
+ .plus-menu > button, .menu-row {
157
+ width: 100%; display: flex; gap: 11px; align-items: flex-start; text-align: left;
158
+ border: 0; background: transparent; padding: 10px; border-radius: 11px; color: var(--ink);
159
+ font: inherit; cursor: pointer;
160
+ }
161
+ .plus-menu > button:hover, .menu-row:hover { background: #f6f6f2; }
162
+ .plus-menu > button > span, .menu-row > span {
163
+ display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0;
164
+ }
165
+ .plus-menu strong { font-size: 12px; }
166
+ .plus-menu small { color: var(--muted); font-size: 10px; }
167
+ .plus-ico {
168
+ width: 28px; height: 28px; border-radius: 8px; background: var(--accent-soft);
169
+ display: inline-flex; align-items: center; justify-content: center; flex: none;
170
+ font-size: 14px;
171
+ }
172
+ .size-label { font-size: 11px; color: var(--muted-2); margin-left: 4px; }
173
+ .size-pick { width: 200px; flex: none; }
174
+ .theme-pick { width: 186px; flex: none; }
175
+ .primary {
176
+ border: 0; background: var(--ink); color: var(--accent); border-radius: 99px;
177
+ padding: 11px 20px; font-weight: 700; font-size: 13px;
178
+ display: inline-flex; align-items: center; gap: 8px;
179
+ }
180
+ .primary:hover { background: #1b1b1b; }
181
+ .assets {
182
+ display: flex; flex-wrap: wrap; gap: 6px; padding: 0 14px 14px;
183
+ align-items: center;
184
+ }
185
+ .assets:has(+ .file-hidden + .err:not([hidden])) { padding-bottom: 8px; }
186
+ .assets-label { font-size: 10px; color: var(--muted-2); margin-right: 2px; }
187
+ .asset {
188
+ display: inline-flex; align-items: center; gap: 6px;
189
+ background: var(--accent-soft); border-radius: 99px; padding: 5px 9px; font-size: 11px;
190
+ }
191
+ .asset.bad { background: #f7dcd7; color: var(--danger); }
192
+ .asset button {
193
+ border: 0; background: transparent; color: var(--muted); font-size: 15px; line-height: 1; padding: 0;
194
+ }
195
+ .color-row {
196
+ display: none; flex-wrap: wrap; gap: 10px; align-items: center;
197
+ padding: 0 16px 10px;
198
+ }
199
+ .color-row.on { display: flex; }
200
+ .color-row label {
201
+ display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--muted);
202
+ }
203
+ .color-row input[type="color"] {
204
+ width: 32px; height: 24px; padding: 0; border: 1px solid var(--line);
205
+ border-radius: 6px; background: #fff; cursor: pointer;
206
+ }
207
+ .look-swatch {
208
+ width: 54px; height: 24px; border-radius: 6px; border: 1px solid var(--line);
209
+ display: inline-grid; grid-template-columns: 1.4fr 1fr 1fr; overflow: hidden; flex: none;
210
+ }
211
+ .look-swatch i { display: block; min-width: 0; }
212
+ .style-lock-thumb {
213
+ width: 28px; height: 28px; border-radius: 7px; object-fit: cover;
214
+ border: 1px solid var(--line); flex: none; background: #111;
215
+ }
216
+ .lock-tag {
217
+ font-size: 10px; font-weight: 600; color: var(--ink);
218
+ background: var(--accent-soft); border-radius: 999px; padding: 3px 8px;
219
+ }
220
+ .err {
221
+ display: flex; align-items: flex-start; gap: 8px;
222
+ margin: 0 14px 14px; padding: 8px 12px;
223
+ color: #8a3a32; background: #fdf4f2; border: 1px solid #f0d5d0;
224
+ border-radius: 12px; font-size: 12px; line-height: 1.45;
225
+ }
226
+ .err[hidden] { display: none; }
227
+ .err::before {
228
+ content: ""; width: 6px; height: 6px; margin-top: 6px; border-radius: 50%;
229
+ background: var(--danger); flex: none;
230
+ }
231
+ .warn-box {
232
+ margin: 12px 2px 0; color: #8a5a12; background: #fff7e6; border: 1px solid #f1ddb3;
233
+ padding: 10px 13px; border-radius: 11px; font-size: 12px;
234
+ }
235
+
236
+ .side {
237
+ background: rgb(255 255 255 / 72%); border: 1px solid var(--line);
238
+ border-radius: 16px; padding: 14px; box-shadow: var(--shadow);
239
+ }
240
+ .side h2 { margin: 0 0 12px; font-size: 13px; }
241
+ .jobs { display: flex; flex-direction: column; gap: 8px; max-height: 70vh; overflow: auto; }
242
+ .job {
243
+ border: 1px solid var(--line); border-radius: 12px; padding: 10px 12px; background: #fff;
244
+ cursor: pointer;
245
+ }
246
+ .job:hover { border-color: #c8c8c2; }
247
+ .job.run { border-left: 3px solid var(--accent-deep); }
248
+ .job.ok { border-left: 3px solid var(--success); }
249
+ .job.bad { border-left: 3px solid var(--danger); }
250
+ .job.warn { border-left: 3px solid var(--warn); }
251
+ .job-top { display: flex; align-items: center; gap: 6px; min-width: 0; }
252
+ .job-actions { margin-left: auto; display: flex; align-items: center; gap: 4px; flex: none; }
253
+ .job-chip {
254
+ min-width: 0; font-size: 10px; color: var(--muted);
255
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
256
+ }
257
+ .job .t {
258
+ margin-top: 6px; font-weight: 600; font-size: 12px; line-height: 1.45;
259
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
260
+ }
261
+ .job-del {
262
+ flex: none; width: 22px; height: 22px; border-radius: 7px; border: 1px solid transparent;
263
+ background: transparent; color: var(--muted-2); font-size: 16px; line-height: 1;
264
+ display: inline-grid; place-items: center; padding: 0;
265
+ }
266
+ .job-del:hover { background: #f7dcd7; color: var(--danger); border-color: #f0c4bc; }
267
+ .job-open {
268
+ flex: none; border: 1px solid var(--line); background: #fff; color: var(--ink);
269
+ border-radius: 999px; font-size: 11px; padding: 2px 8px; cursor: pointer; white-space: nowrap;
270
+ }
271
+ .job-open:hover:not(:disabled) { background: var(--accent-soft); }
272
+ .job-open:disabled { opacity: .4; cursor: not-allowed; }
273
+ .job .badge {
274
+ flex: 0 0 auto; font-size: 10px; padding: 2px 7px; border-radius: 999px;
275
+ background: #ececea; color: var(--muted);
276
+ }
277
+ .job .badge.run { background: var(--accent-soft); color: var(--ink); }
278
+ .job .badge.ok { background: rgba(47,107,79,.12); color: var(--success); }
279
+ .job .badge.bad { background: #f7dcd7; color: var(--danger); }
280
+ .job .m {
281
+ color: var(--muted); font-size: 11px; margin-top: 4px;
282
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
283
+ }
284
+ .job .result {
285
+ margin-top: 6px; display: flex; gap: 6px; align-items: flex-start; min-width: 0;
286
+ }
287
+ .job .result.dim { opacity: .75; }
288
+ .job .result .lab { flex: 0 0 auto; font-size: 10px; color: var(--muted-2); margin-top: 2px; }
289
+ .job .result code {
290
+ flex: 1; min-width: 0; font-size: 10px; line-height: 1.35; word-break: break-all;
291
+ background: #f6f6f4; border-radius: 6px; padding: 3px 5px;
292
+ }
293
+ .bar { height: 4px; background: #ececea; border-radius: 99px; overflow: hidden; margin-top: 8px; }
294
+ .bar i { display: block; height: 100%; background: var(--accent-deep); width: 0; }
295
+ .muted { color: var(--muted); font-size: 12px; }
296
+ .film-stage {
297
+ margin: 0 0 12px; border: 1px solid var(--line); border-radius: 12px;
298
+ overflow: hidden; background: #111;
299
+ }
300
+ .film-stage[hidden] { display: none; }
301
+ .film-video { display: block; width: 100%; max-height: 220px; background: #000; }
302
+ .film-bar {
303
+ display: flex; align-items: center; gap: 8px;
304
+ padding: 8px 10px; background: #fff;
305
+ }
306
+ .film-title {
307
+ flex: 1; min-width: 0; font-size: 12px; font-weight: 600;
308
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
309
+ }
310
+ .film-pop {
311
+ flex: none; border: 1px solid var(--line); background: #fff; color: var(--ink);
312
+ border-radius: 999px; font: inherit; font-size: 11px; padding: 3px 10px; cursor: pointer;
313
+ }
314
+ .film-pop:hover { background: var(--accent-soft); }
315
+ .job.playable { cursor: pointer; }
316
+ .job.on { outline: 2px solid var(--accent-deep); outline-offset: 1px; }
317
+ .film-modal {
318
+ position: fixed; inset: 0; z-index: 80; background: rgba(10,10,10,.72);
319
+ display: grid; place-items: center; padding: 24px;
320
+ }
321
+ .film-modal[hidden] { display: none; }
322
+ .film-modal-card { width: min(960px, 100%); background: #111; border-radius: 16px; overflow: hidden; }
323
+ .film-modal-bar { display: flex; align-items: center; gap: 8px; padding: 10px 12px; color: #f4f1ea; }
324
+ .film-modal-bar strong {
325
+ flex: 1; min-width: 0; font-size: 13px; font-weight: 600;
326
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
327
+ }
328
+ .film-modal-x {
329
+ width: 28px; height: 28px; border: 0; border-radius: 8px; background: transparent;
330
+ color: #f4f1ea; font-size: 20px; line-height: 1; cursor: pointer;
331
+ }
332
+ .film-modal video { display: block; width: 100%; max-height: min(72vh, 640px); background: #000; }
333
+
334
+ /* SelectMenu */
335
+ .sm { position: relative; display: block; min-width: 0; }
336
+ .sm-trigger {
337
+ width: 100%; display: flex; align-items: center; gap: 8px; text-align: left;
338
+ background: #fff; border: 1px solid var(--line-strong); border-radius: var(--radius-sm);
339
+ padding: 0 11px; color: var(--ink); font-size: 12px; font-weight: 500;
340
+ transition: border-color .15s, box-shadow .15s;
341
+ }
342
+ .sm-md { height: 40px; }
343
+ .sm-sm { height: 30px; padding: 0 8px; font-size: 11px; border-radius: 9px; }
344
+ .sm-trigger:hover { border-color: #b9b9b4; }
345
+ .sm-trigger.on { border-color: var(--ink); box-shadow: 0 0 0 3px rgb(212 240 122 / 45%); }
346
+ .sm-value { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
347
+ .sm-value.placeholder { color: var(--muted-2); }
348
+ .sm-hint {
349
+ flex: none; font-size: 10px; color: var(--muted); background: #f4f4ef;
350
+ padding: 2px 7px; border-radius: 99px; max-width: 46%; overflow: hidden;
351
+ text-overflow: ellipsis; white-space: nowrap;
352
+ }
353
+ .sm-sm .sm-hint { font-size: 9px; padding: 1px 5px; max-width: 58%; }
354
+ .sm-chevron {
355
+ color: var(--muted); transition: transform .18s; flex: none;
356
+ width: 14px; height: 14px;
357
+ }
358
+ .sm-chevron.on { transform: rotate(180deg); color: var(--ink); }
359
+ .sm-panel {
360
+ position: fixed; z-index: 300; outline: none;
361
+ background: var(--surface); border: 1px solid var(--line); border-radius: 15px;
362
+ box-shadow: 0 2px 6px rgb(0 0 0 / 5%), 0 24px 60px rgb(0 0 0 / 16%);
363
+ padding: 5px; animation: sm-in .14s ease-out;
364
+ }
365
+ @keyframes sm-in {
366
+ from { opacity: 0; transform: translateY(-4px) scale(.985); }
367
+ to { opacity: 1; transform: none; }
368
+ }
369
+ .sm-scroll { max-height: 292px; overflow-y: auto; overscroll-behavior: contain; }
370
+ .sm-option {
371
+ width: 100%; display: flex; align-items: center; gap: 8px; text-align: left;
372
+ border: 0; background: transparent; color: var(--ink); cursor: pointer;
373
+ padding: 8px 10px; border-radius: 9px; font-size: 12px; font-weight: 500;
374
+ }
375
+ .sm-option + .sm-option { margin-top: 1px; }
376
+ .sm-option.on { background: #f2f2ed; }
377
+ .sm-option.picked { background: var(--accent-soft); }
378
+ .sm-option.picked.on { background: #e4f4a8; }
379
+ .sm-opt-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
380
+ .sm-opt-hint { flex: none; font-size: 10px; color: var(--muted); }
381
+ .sm-check { flex: none; color: #5e7a17; font-weight: 700; }
382
+ .sm-scroll.grid {
383
+ display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 7px;
384
+ padding: 5px; max-height: 430px;
385
+ }
386
+ .sm-scroll.grid .sm-option {
387
+ flex-direction: column; align-items: stretch; gap: 5px; padding: 5px; border-radius: 11px;
388
+ }
389
+ .sm-scroll.grid .sm-option + .sm-option { margin-top: 0; }
390
+ .sm-scroll.grid .sm-option.tile { position: relative; }
391
+ .sm-scroll.grid .sm-opt-label {
392
+ flex: none; white-space: normal; font-size: 11px; line-height: 1.25;
393
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
394
+ }
395
+ .sm-scroll.grid .sm-check {
396
+ position: absolute; top: 8px; right: 8px; background: #fff; border-radius: 99px;
397
+ padding: 1px 4px; box-shadow: 0 1px 4px rgb(0 0 0 / 22%); font-size: 11px;
398
+ }
399
+ .sm-thumb {
400
+ display: block; width: 100%; aspect-ratio: 16 / 9; border-radius: 7px;
401
+ overflow: hidden; background: #ecece6;
402
+ }
403
+ .sm-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
404
+ .sm-thumb-ph {
405
+ display: flex; align-items: center; justify-content: center; width: 100%; height: 100%;
406
+ font-size: 17px; font-weight: 600; color: var(--muted);
407
+ }
408
+ .sm-thumb-trigger { flex: none; width: 26px; border-radius: 4px; aspect-ratio: 16/9; }
409
+ .sm-preview {
410
+ position: fixed; z-index: 310; pointer-events: none;
411
+ background: var(--surface); border: 1px solid var(--line); border-radius: 16px;
412
+ box-shadow: 0 4px 14px rgb(0 0 0 / 8%), 0 28px 70px rgb(0 0 0 / 20%);
413
+ overflow: hidden; animation: sm-in .16s ease-out;
414
+ }
415
+ .sm-preview-img { width: 100%; aspect-ratio: 16 / 9; background: #ecece6; }
416
+ .sm-preview-img img { width: 100%; height: 100%; object-fit: cover; display: block; }
417
+ .sm-preview-body { padding: 11px 14px 13px; }
418
+ .sm-preview-title { display: flex; align-items: baseline; gap: 8px; }
419
+ .sm-preview-title strong {
420
+ font-size: 14px; font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
421
+ }
422
+ .sm-preview-hint {
423
+ flex: none; font-size: 10px; color: var(--muted); background: #f4f4ef;
424
+ padding: 2px 7px; border-radius: 99px;
425
+ }
426
+ .sm-preview-desc {
427
+ margin: 6px 0 0; font-size: 11px; line-height: 1.55; color: var(--muted);
428
+ display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
429
+ }
430
+
431
+ .sm-panel.has-cats { padding: 0; overflow: hidden; }
432
+ .sm-cats {
433
+ display: flex; flex-wrap: wrap; gap: 6px 5px;
434
+ padding: 10px 10px 9px;
435
+ background: #f7f7f4;
436
+ border-bottom: 1px solid var(--line);
437
+ }
438
+ .sm-cat {
439
+ appearance: none; border: 1px solid var(--line-strong); background: #fff; color: var(--ink);
440
+ border-radius: 99px; padding: 4px 10px; font-size: 11px; font-weight: 600; line-height: 16px;
441
+ white-space: nowrap; cursor: pointer;
442
+ }
443
+ .sm-cat:hover { border-color: #b9b9b4; }
444
+ .sm-cat.on { background: var(--ink); color: var(--accent); border-color: var(--ink); }
445
+ .sm-cat.on:hover { background: #1b1b1b; }
446
+ .sm-panel.has-cats .sm-scroll.grid { margin: 0; padding: 8px; }
447
+ .sm-entry {
448
+ display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
449
+ padding: 8px; border-top: 1px solid var(--line);
450
+ }
451
+ .sm-entry input {
452
+ flex: 1; min-width: 0; height: 30px; border: 1px solid var(--line-strong);
453
+ border-radius: 8px; padding: 0 10px; font-size: 12px; color: var(--ink); background: #fff; outline: none;
454
+ }
455
+ .sm-entry input:focus { border-color: var(--ink); }
456
+ .sm-entry input.bad { border-color: var(--danger); }
457
+ .sm-entry .unit { flex: none; font-size: 12px; color: var(--muted); }
458
+ .sm-entry button {
459
+ flex: none; height: 30px; border: 0; background: var(--ink); color: var(--accent);
460
+ border-radius: 99px; padding: 0 12px; font-size: 12px; font-weight: 700;
461
+ }
462
+ .sm-entry button:hover { background: #1b1b1b; }
463
+ .sm-entry-err { flex: 1 0 100%; margin: 0; font-size: 11px; line-height: 1.3; color: var(--danger); }
464
+
465
+ .file-hidden { position: absolute; width: 0; height: 0; opacity: 0; pointer-events: none; }