@12ui/design 0.2.75 → 0.2.77

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 (447) hide show
  1. package/README.md +126 -116
  2. package/SKILL.md +33 -28
  3. package/dist/cli-arguments.d.ts.map +1 -1
  4. package/dist/cli-arguments.js +21 -7
  5. package/dist/cli-arguments.js.map +1 -1
  6. package/dist/cli-capabilities.d.ts +3 -2
  7. package/dist/cli-capabilities.d.ts.map +1 -1
  8. package/dist/cli-capabilities.js +2 -1
  9. package/dist/cli-capabilities.js.map +1 -1
  10. package/dist/cli-codex-readiness.d.ts +6 -0
  11. package/dist/cli-codex-readiness.d.ts.map +1 -1
  12. package/dist/cli-codex-readiness.js +12 -12
  13. package/dist/cli-codex-readiness.js.map +1 -1
  14. package/dist/cli-help/design.d.ts +2 -2
  15. package/dist/cli-help/design.d.ts.map +1 -1
  16. package/dist/cli-help/design.js +3 -1
  17. package/dist/cli-help/design.js.map +1 -1
  18. package/dist/cli-help/index.d.ts +19 -9
  19. package/dist/cli-help/index.d.ts.map +1 -1
  20. package/dist/cli-help/scene.d.ts +15 -5
  21. package/dist/cli-help/scene.d.ts.map +1 -1
  22. package/dist/cli-help/scene.js +44 -0
  23. package/dist/cli-help/scene.js.map +1 -1
  24. package/dist/cli-help/workflow.d.ts +2 -2
  25. package/dist/cli-help/workflow.d.ts.map +1 -1
  26. package/dist/cli-help/workflow.js +4 -3
  27. package/dist/cli-help/workflow.js.map +1 -1
  28. package/dist/cli-review-command.d.ts.map +1 -1
  29. package/dist/cli-review-command.js +2 -0
  30. package/dist/cli-review-command.js.map +1 -1
  31. package/dist/cli-run.d.ts.map +1 -1
  32. package/dist/cli-run.js +6 -0
  33. package/dist/cli-run.js.map +1 -1
  34. package/dist/cli-scene-command.d.ts.map +1 -1
  35. package/dist/cli-scene-command.js +39 -6
  36. package/dist/cli-scene-command.js.map +1 -1
  37. package/dist/cli-usage.d.ts.map +1 -1
  38. package/dist/cli-usage.js +8 -6
  39. package/dist/cli-usage.js.map +1 -1
  40. package/dist/cli-workspace-draw.d.ts +1 -11
  41. package/dist/cli-workspace-draw.d.ts.map +1 -1
  42. package/dist/cli-workspace-draw.js +17 -18
  43. package/dist/cli-workspace-draw.js.map +1 -1
  44. package/dist/cli-workspace-runner.d.ts +30 -0
  45. package/dist/cli-workspace-runner.d.ts.map +1 -0
  46. package/dist/cli-workspace-runner.js +105 -0
  47. package/dist/cli-workspace-runner.js.map +1 -0
  48. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  49. package/dist/legacy-skill-catalog.js +26 -2
  50. package/dist/legacy-skill-catalog.js.map +1 -1
  51. package/dist/mcp-slate-command.d.ts +9 -0
  52. package/dist/mcp-slate-command.d.ts.map +1 -1
  53. package/dist/mcp-slate-command.js +19 -5
  54. package/dist/mcp-slate-command.js.map +1 -1
  55. package/dist/mcp-slate-image.js +1 -1
  56. package/dist/mcp-slate-image.js.map +1 -1
  57. package/dist/mcp-slate-tool-defs.js +1 -1
  58. package/dist/mcp-slate-tool-defs.js.map +1 -1
  59. package/dist/mcp-slate-ui-copy.d.ts +403 -33
  60. package/dist/mcp-slate-ui-copy.d.ts.map +1 -1
  61. package/dist/mcp-slate-ui-copy.js +247 -57
  62. package/dist/mcp-slate-ui-copy.js.map +1 -1
  63. package/dist/mcp-slate-ui-icu.d.ts +47 -0
  64. package/dist/mcp-slate-ui-icu.d.ts.map +1 -0
  65. package/dist/mcp-slate-ui-icu.js +229 -0
  66. package/dist/mcp-slate-ui-icu.js.map +1 -0
  67. package/dist/mcp-slate-ui-locale-match.d.ts +12 -0
  68. package/dist/mcp-slate-ui-locale-match.d.ts.map +1 -0
  69. package/dist/mcp-slate-ui-locale-match.js +34 -0
  70. package/dist/mcp-slate-ui-locale-match.js.map +1 -0
  71. package/dist/mcp-slate-ui-locales/de-DE.d.ts +9 -0
  72. package/dist/mcp-slate-ui-locales/de-DE.d.ts.map +1 -0
  73. package/dist/mcp-slate-ui-locales/de-DE.js +217 -0
  74. package/dist/mcp-slate-ui-locales/de-DE.js.map +1 -0
  75. package/dist/mcp-slate-ui-locales/es-419.d.ts +9 -0
  76. package/dist/mcp-slate-ui-locales/es-419.d.ts.map +1 -0
  77. package/dist/mcp-slate-ui-locales/es-419.js +217 -0
  78. package/dist/mcp-slate-ui-locales/es-419.js.map +1 -0
  79. package/dist/mcp-slate-ui-locales/es-ES.d.ts +9 -0
  80. package/dist/mcp-slate-ui-locales/es-ES.d.ts.map +1 -0
  81. package/dist/mcp-slate-ui-locales/es-ES.js +217 -0
  82. package/dist/mcp-slate-ui-locales/es-ES.js.map +1 -0
  83. package/dist/mcp-slate-ui-locales/fr-FR.d.ts +9 -0
  84. package/dist/mcp-slate-ui-locales/fr-FR.d.ts.map +1 -0
  85. package/dist/mcp-slate-ui-locales/fr-FR.js +217 -0
  86. package/dist/mcp-slate-ui-locales/fr-FR.js.map +1 -0
  87. package/dist/mcp-slate-ui-locales/hi-IN.d.ts +9 -0
  88. package/dist/mcp-slate-ui-locales/hi-IN.d.ts.map +1 -0
  89. package/dist/mcp-slate-ui-locales/hi-IN.js +217 -0
  90. package/dist/mcp-slate-ui-locales/hi-IN.js.map +1 -0
  91. package/dist/mcp-slate-ui-locales/index.d.ts +11 -0
  92. package/dist/mcp-slate-ui-locales/index.d.ts.map +1 -0
  93. package/dist/mcp-slate-ui-locales/index.js +34 -0
  94. package/dist/mcp-slate-ui-locales/index.js.map +1 -0
  95. package/dist/mcp-slate-ui-locales/it-IT.d.ts +9 -0
  96. package/dist/mcp-slate-ui-locales/it-IT.d.ts.map +1 -0
  97. package/dist/mcp-slate-ui-locales/it-IT.js +217 -0
  98. package/dist/mcp-slate-ui-locales/it-IT.js.map +1 -0
  99. package/dist/mcp-slate-ui-locales/ja-JP.d.ts +9 -0
  100. package/dist/mcp-slate-ui-locales/ja-JP.d.ts.map +1 -0
  101. package/dist/mcp-slate-ui-locales/ja-JP.js +217 -0
  102. package/dist/mcp-slate-ui-locales/ja-JP.js.map +1 -0
  103. package/dist/mcp-slate-ui-locales/ko-KR.d.ts +9 -0
  104. package/dist/mcp-slate-ui-locales/ko-KR.d.ts.map +1 -0
  105. package/dist/mcp-slate-ui-locales/ko-KR.js +217 -0
  106. package/dist/mcp-slate-ui-locales/ko-KR.js.map +1 -0
  107. package/dist/mcp-slate-ui-locales/pt-BR.d.ts +9 -0
  108. package/dist/mcp-slate-ui-locales/pt-BR.d.ts.map +1 -0
  109. package/dist/mcp-slate-ui-locales/pt-BR.js +217 -0
  110. package/dist/mcp-slate-ui-locales/pt-BR.js.map +1 -0
  111. package/dist/mcp-slate-ui-locales/zh-CN.d.ts +9 -0
  112. package/dist/mcp-slate-ui-locales/zh-CN.d.ts.map +1 -0
  113. package/dist/mcp-slate-ui-locales/zh-CN.js +217 -0
  114. package/dist/mcp-slate-ui-locales/zh-CN.js.map +1 -0
  115. package/dist/mcp-slate-ui-locales/zh-TW.d.ts +9 -0
  116. package/dist/mcp-slate-ui-locales/zh-TW.d.ts.map +1 -0
  117. package/dist/mcp-slate-ui-locales/zh-TW.js +217 -0
  118. package/dist/mcp-slate-ui-locales/zh-TW.js.map +1 -0
  119. package/dist/mcp-slate-ui-script-bridge.d.ts.map +1 -1
  120. package/dist/mcp-slate-ui-script-bridge.js +8 -9
  121. package/dist/mcp-slate-ui-script-bridge.js.map +1 -1
  122. package/dist/mcp-slate-ui-script-dialog.d.ts.map +1 -1
  123. package/dist/mcp-slate-ui-script-dialog.js +60 -30
  124. package/dist/mcp-slate-ui-script-dialog.js.map +1 -1
  125. package/dist/mcp-slate-ui-script-inline.d.ts +9 -6
  126. package/dist/mcp-slate-ui-script-inline.d.ts.map +1 -1
  127. package/dist/mcp-slate-ui-script-inline.js +91 -46
  128. package/dist/mcp-slate-ui-script-inline.js.map +1 -1
  129. package/dist/mcp-slate-ui-script-inspiration-collage.d.ts +20 -0
  130. package/dist/mcp-slate-ui-script-inspiration-collage.d.ts.map +1 -0
  131. package/dist/mcp-slate-ui-script-inspiration-collage.js +68 -0
  132. package/dist/mcp-slate-ui-script-inspiration-collage.js.map +1 -0
  133. package/dist/mcp-slate-ui-script-inspiration-grid.d.ts +26 -0
  134. package/dist/mcp-slate-ui-script-inspiration-grid.d.ts.map +1 -0
  135. package/dist/mcp-slate-ui-script-inspiration-grid.js +246 -0
  136. package/dist/mcp-slate-ui-script-inspiration-grid.js.map +1 -0
  137. package/dist/mcp-slate-ui-script-inspiration.d.ts +10 -9
  138. package/dist/mcp-slate-ui-script-inspiration.d.ts.map +1 -1
  139. package/dist/mcp-slate-ui-script-inspiration.js +161 -120
  140. package/dist/mcp-slate-ui-script-inspiration.js.map +1 -1
  141. package/dist/mcp-slate-ui-script-l10n.d.ts +29 -0
  142. package/dist/mcp-slate-ui-script-l10n.d.ts.map +1 -0
  143. package/dist/mcp-slate-ui-script-l10n.js +135 -0
  144. package/dist/mcp-slate-ui-script-l10n.js.map +1 -0
  145. package/dist/mcp-slate-ui-script-more.d.ts +3 -2
  146. package/dist/mcp-slate-ui-script-more.d.ts.map +1 -1
  147. package/dist/mcp-slate-ui-script-more.js +19 -18
  148. package/dist/mcp-slate-ui-script-more.js.map +1 -1
  149. package/dist/mcp-slate-ui-script-pause.d.ts +33 -0
  150. package/dist/mcp-slate-ui-script-pause.d.ts.map +1 -0
  151. package/dist/mcp-slate-ui-script-pause.js +217 -0
  152. package/dist/mcp-slate-ui-script-pause.js.map +1 -0
  153. package/dist/mcp-slate-ui-script-remote.d.ts +2 -0
  154. package/dist/mcp-slate-ui-script-remote.d.ts.map +1 -1
  155. package/dist/mcp-slate-ui-script-remote.js +39 -6
  156. package/dist/mcp-slate-ui-script-remote.js.map +1 -1
  157. package/dist/mcp-slate-ui-script-scribble.js +1 -1
  158. package/dist/mcp-slate-ui-script-select.js +6 -6
  159. package/dist/mcp-slate-ui-script-stage.d.ts +3 -2
  160. package/dist/mcp-slate-ui-script-stage.d.ts.map +1 -1
  161. package/dist/mcp-slate-ui-script-stage.js +31 -19
  162. package/dist/mcp-slate-ui-script-stage.js.map +1 -1
  163. package/dist/mcp-slate-ui-script-state.d.ts.map +1 -1
  164. package/dist/mcp-slate-ui-script-state.js +77 -57
  165. package/dist/mcp-slate-ui-script-state.js.map +1 -1
  166. package/dist/mcp-slate-ui-script.d.ts +2 -2
  167. package/dist/mcp-slate-ui-script.d.ts.map +1 -1
  168. package/dist/mcp-slate-ui-script.js +21 -7
  169. package/dist/mcp-slate-ui-script.js.map +1 -1
  170. package/dist/mcp-slate-ui-styles-dialog.d.ts +6 -7
  171. package/dist/mcp-slate-ui-styles-dialog.d.ts.map +1 -1
  172. package/dist/mcp-slate-ui-styles-dialog.js +13 -29
  173. package/dist/mcp-slate-ui-styles-dialog.js.map +1 -1
  174. package/dist/mcp-slate-ui-styles-inspiration.d.ts +18 -0
  175. package/dist/mcp-slate-ui-styles-inspiration.d.ts.map +1 -0
  176. package/dist/mcp-slate-ui-styles-inspiration.js +43 -0
  177. package/dist/mcp-slate-ui-styles-inspiration.js.map +1 -0
  178. package/dist/mcp-slate-ui-styles-pause.d.ts +10 -0
  179. package/dist/mcp-slate-ui-styles-pause.d.ts.map +1 -0
  180. package/dist/mcp-slate-ui-styles-pause.js +25 -0
  181. package/dist/mcp-slate-ui-styles-pause.js.map +1 -0
  182. package/dist/mcp-slate-ui-styles-stage.d.ts +10 -6
  183. package/dist/mcp-slate-ui-styles-stage.d.ts.map +1 -1
  184. package/dist/mcp-slate-ui-styles-stage.js +24 -16
  185. package/dist/mcp-slate-ui-styles-stage.js.map +1 -1
  186. package/dist/mcp-slate-ui-styles.d.ts +12 -5
  187. package/dist/mcp-slate-ui-styles.d.ts.map +1 -1
  188. package/dist/mcp-slate-ui-styles.js +38 -21
  189. package/dist/mcp-slate-ui-styles.js.map +1 -1
  190. package/dist/mcp-slate-ui.d.ts +11 -3
  191. package/dist/mcp-slate-ui.d.ts.map +1 -1
  192. package/dist/mcp-slate-ui.js +24 -16
  193. package/dist/mcp-slate-ui.js.map +1 -1
  194. package/dist/mcp-workflow-tools.js +3 -3
  195. package/dist/mcp-workflow-tools.js.map +1 -1
  196. package/dist/mosaic-bands.d.ts +44 -0
  197. package/dist/mosaic-bands.d.ts.map +1 -0
  198. package/dist/mosaic-bands.js +153 -0
  199. package/dist/mosaic-bands.js.map +1 -0
  200. package/dist/review-discovery.d.ts.map +1 -1
  201. package/dist/review-discovery.js +36 -54
  202. package/dist/review-discovery.js.map +1 -1
  203. package/dist/review-page.d.ts.map +1 -1
  204. package/dist/review-page.js +2 -1
  205. package/dist/review-page.js.map +1 -1
  206. package/dist/review-run-roots.d.ts +40 -0
  207. package/dist/review-run-roots.d.ts.map +1 -0
  208. package/dist/review-run-roots.js +94 -0
  209. package/dist/review-run-roots.js.map +1 -0
  210. package/dist/review-server.d.ts +2 -0
  211. package/dist/review-server.d.ts.map +1 -1
  212. package/dist/review-server.js +2 -0
  213. package/dist/review-server.js.map +1 -1
  214. package/dist/review-types.d.ts +10 -0
  215. package/dist/review-types.d.ts.map +1 -1
  216. package/dist/scene/camera-diagnostics.d.ts +61 -0
  217. package/dist/scene/camera-diagnostics.d.ts.map +1 -0
  218. package/dist/scene/camera-diagnostics.js +166 -0
  219. package/dist/scene/camera-diagnostics.js.map +1 -0
  220. package/dist/scene/camera-solve.d.ts +2 -0
  221. package/dist/scene/camera-solve.d.ts.map +1 -1
  222. package/dist/scene/camera-solve.js +59 -42
  223. package/dist/scene/camera-solve.js.map +1 -1
  224. package/dist/scene/capture.d.ts +24 -0
  225. package/dist/scene/capture.d.ts.map +1 -1
  226. package/dist/scene/capture.js +53 -2
  227. package/dist/scene/capture.js.map +1 -1
  228. package/dist/scene/convert-run.d.ts +30 -0
  229. package/dist/scene/convert-run.d.ts.map +1 -0
  230. package/dist/scene/convert-run.js +135 -0
  231. package/dist/scene/convert-run.js.map +1 -0
  232. package/dist/scene/media-query.d.ts +21 -0
  233. package/dist/scene/media-query.d.ts.map +1 -0
  234. package/dist/scene/media-query.js +208 -0
  235. package/dist/scene/media-query.js.map +1 -0
  236. package/dist/scene/page-css.d.ts +38 -0
  237. package/dist/scene/page-css.d.ts.map +1 -0
  238. package/dist/scene/page-css.js +210 -0
  239. package/dist/scene/page-css.js.map +1 -0
  240. package/dist/scene/page-images.d.ts +33 -0
  241. package/dist/scene/page-images.d.ts.map +1 -0
  242. package/dist/scene/page-images.js +53 -0
  243. package/dist/scene/page-images.js.map +1 -0
  244. package/dist/scene/page-merge.d.ts +41 -0
  245. package/dist/scene/page-merge.d.ts.map +1 -0
  246. package/dist/scene/page-merge.js +197 -0
  247. package/dist/scene/page-merge.js.map +1 -0
  248. package/dist/scene/responsive-bands.d.ts +19 -0
  249. package/dist/scene/responsive-bands.d.ts.map +1 -0
  250. package/dist/scene/responsive-bands.js +25 -0
  251. package/dist/scene/responsive-bands.js.map +1 -0
  252. package/dist/scene/scene-index.d.ts +10 -0
  253. package/dist/scene/scene-index.d.ts.map +1 -0
  254. package/dist/scene/scene-index.js +43 -0
  255. package/dist/scene/scene-index.js.map +1 -0
  256. package/dist/scene/scene-merge.d.ts +29 -0
  257. package/dist/scene/scene-merge.d.ts.map +1 -0
  258. package/dist/scene/scene-merge.js +130 -0
  259. package/dist/scene/scene-merge.js.map +1 -0
  260. package/dist/scene/scene-verbs.d.ts +1 -1
  261. package/dist/scene/scene-verbs.d.ts.map +1 -1
  262. package/dist/scene/scene-verbs.js +1 -1
  263. package/dist/scene/scene-verbs.js.map +1 -1
  264. package/dist/scene/serve-detach.d.ts +23 -0
  265. package/dist/scene/serve-detach.d.ts.map +1 -0
  266. package/dist/scene/serve-detach.js +92 -0
  267. package/dist/scene/serve-detach.js.map +1 -0
  268. package/dist/scene/static-server.d.ts +2 -0
  269. package/dist/scene/static-server.d.ts.map +1 -1
  270. package/dist/scene/static-server.js +3 -0
  271. package/dist/scene/static-server.js.map +1 -1
  272. package/dist/scene/symmetric-eigen.d.ts +12 -0
  273. package/dist/scene/symmetric-eigen.d.ts.map +1 -0
  274. package/dist/scene/symmetric-eigen.js +43 -0
  275. package/dist/scene/symmetric-eigen.js.map +1 -0
  276. package/dist/slate-actions.d.ts +3 -3
  277. package/dist/slate-actions.d.ts.map +1 -1
  278. package/dist/slate-actions.js +9 -8
  279. package/dist/slate-actions.js.map +1 -1
  280. package/dist/slate-browser-host-script.d.ts +4 -0
  281. package/dist/slate-browser-host-script.d.ts.map +1 -1
  282. package/dist/slate-browser-host-script.js +25 -6
  283. package/dist/slate-browser-host-script.js.map +1 -1
  284. package/dist/slate-browser-host.d.ts +2 -1
  285. package/dist/slate-browser-host.d.ts.map +1 -1
  286. package/dist/slate-browser-host.js +18 -5
  287. package/dist/slate-browser-host.js.map +1 -1
  288. package/dist/slate-commit.js +7 -7
  289. package/dist/slate-commit.js.map +1 -1
  290. package/dist/slate-corpus.d.ts.map +1 -1
  291. package/dist/slate-corpus.js +3 -2
  292. package/dist/slate-corpus.js.map +1 -1
  293. package/dist/slate-edit-runner.d.ts.map +1 -1
  294. package/dist/slate-edit-runner.js +5 -4
  295. package/dist/slate-edit-runner.js.map +1 -1
  296. package/dist/slate-editability.d.ts +2 -0
  297. package/dist/slate-editability.d.ts.map +1 -1
  298. package/dist/slate-editability.js +1 -1
  299. package/dist/slate-editability.js.map +1 -1
  300. package/dist/slate-errors.d.ts +7 -1
  301. package/dist/slate-errors.d.ts.map +1 -1
  302. package/dist/slate-errors.js +3 -2
  303. package/dist/slate-errors.js.map +1 -1
  304. package/dist/slate-handoff-options.d.ts +2 -1
  305. package/dist/slate-handoff-options.d.ts.map +1 -1
  306. package/dist/slate-handoff-options.js +2 -2
  307. package/dist/slate-handoff-options.js.map +1 -1
  308. package/dist/slate-handoff.js +1 -1
  309. package/dist/slate-handoff.js.map +1 -1
  310. package/dist/slate-image-executor.d.ts +18 -1
  311. package/dist/slate-image-executor.d.ts.map +1 -1
  312. package/dist/slate-image-executor.js +1 -0
  313. package/dist/slate-image-executor.js.map +1 -1
  314. package/dist/slate-inspiration.js +2 -2
  315. package/dist/slate-inspiration.js.map +1 -1
  316. package/dist/slate-local-image.d.ts.map +1 -1
  317. package/dist/slate-local-image.js +4 -1
  318. package/dist/slate-local-image.js.map +1 -1
  319. package/dist/slate-lock.js +1 -1
  320. package/dist/slate-lock.js.map +1 -1
  321. package/dist/slate-resume.js +6 -6
  322. package/dist/slate-resume.js.map +1 -1
  323. package/dist/slate-round-params.d.ts +3 -0
  324. package/dist/slate-round-params.d.ts.map +1 -1
  325. package/dist/slate-round-params.js +5 -0
  326. package/dist/slate-round-params.js.map +1 -1
  327. package/dist/slate-round-queries.d.ts +18 -0
  328. package/dist/slate-round-queries.d.ts.map +1 -0
  329. package/dist/slate-round-queries.js +29 -0
  330. package/dist/slate-round-queries.js.map +1 -0
  331. package/dist/slate-round-runner.d.ts.map +1 -1
  332. package/dist/slate-round-runner.js +12 -9
  333. package/dist/slate-round-runner.js.map +1 -1
  334. package/dist/slate-round-search.js +5 -5
  335. package/dist/slate-round-search.js.map +1 -1
  336. package/dist/slate-run-action.d.ts.map +1 -1
  337. package/dist/slate-run-action.js +2 -1
  338. package/dist/slate-run-action.js.map +1 -1
  339. package/dist/slate-runner-context.d.ts +3 -1
  340. package/dist/slate-runner-context.d.ts.map +1 -1
  341. package/dist/slate-runner-context.js +4 -3
  342. package/dist/slate-runner-context.js.map +1 -1
  343. package/dist/slate-runner-failure.d.ts +7 -1
  344. package/dist/slate-runner-failure.d.ts.map +1 -1
  345. package/dist/slate-runner-failure.js +6 -5
  346. package/dist/slate-runner-failure.js.map +1 -1
  347. package/dist/slate-runtime.d.ts.map +1 -1
  348. package/dist/slate-runtime.js +1 -0
  349. package/dist/slate-runtime.js.map +1 -1
  350. package/dist/slate-versions.js +3 -3
  351. package/dist/slate-versions.js.map +1 -1
  352. package/dist/slate-view-contract.d.ts +62 -1
  353. package/dist/slate-view-contract.d.ts.map +1 -1
  354. package/dist/slate-view-contract.js +30 -0
  355. package/dist/slate-view-contract.js.map +1 -1
  356. package/dist/slate-view.d.ts.map +1 -1
  357. package/dist/slate-view.js +19 -3
  358. package/dist/slate-view.js.map +1 -1
  359. package/dist/slate-workspace-parse.d.ts.map +1 -1
  360. package/dist/slate-workspace-parse.js +22 -0
  361. package/dist/slate-workspace-parse.js.map +1 -1
  362. package/dist/slate-workspace-types.d.ts +2 -0
  363. package/dist/slate-workspace-types.d.ts.map +1 -1
  364. package/dist/workflow/adapter-12ui.d.ts.map +1 -1
  365. package/dist/workflow/adapter-12ui.js +3 -5
  366. package/dist/workflow/adapter-12ui.js.map +1 -1
  367. package/dist/workflow/providers.d.ts.map +1 -1
  368. package/dist/workflow/providers.js +5 -2
  369. package/dist/workflow/providers.js.map +1 -1
  370. package/dist/workflow/recipes.d.ts +1 -2
  371. package/dist/workflow/recipes.d.ts.map +1 -1
  372. package/dist/workflow/recipes.js +6 -18
  373. package/dist/workflow/recipes.js.map +1 -1
  374. package/dist/workflow/routing.d.ts.map +1 -1
  375. package/dist/workflow/routing.js +3 -1
  376. package/dist/workflow/routing.js.map +1 -1
  377. package/dist/workflow/types.d.ts +7 -0
  378. package/dist/workflow/types.d.ts.map +1 -1
  379. package/dist/workflow/types.js +7 -0
  380. package/dist/workflow/types.js.map +1 -1
  381. package/dist/workspace-draw-client.d.ts +42 -1
  382. package/dist/workspace-draw-client.d.ts.map +1 -1
  383. package/dist/workspace-draw-client.js +56 -7
  384. package/dist/workspace-draw-client.js.map +1 -1
  385. package/dist/workspace-draw-codex.d.ts +9 -4
  386. package/dist/workspace-draw-codex.d.ts.map +1 -1
  387. package/dist/workspace-draw-codex.js +17 -3
  388. package/dist/workspace-draw-codex.js.map +1 -1
  389. package/dist/workspace-draw-messages.d.ts +24 -0
  390. package/dist/workspace-draw-messages.d.ts.map +1 -1
  391. package/dist/workspace-draw-messages.js +26 -2
  392. package/dist/workspace-draw-messages.js.map +1 -1
  393. package/dist/workspace-draw-run.d.ts +19 -1
  394. package/dist/workspace-draw-run.d.ts.map +1 -1
  395. package/dist/workspace-draw-run.js +76 -3
  396. package/dist/workspace-draw-run.js.map +1 -1
  397. package/dist/workspace-draw-store.d.ts +2 -0
  398. package/dist/workspace-draw-store.d.ts.map +1 -1
  399. package/dist/workspace-draw-store.js +3 -1
  400. package/dist/workspace-draw-store.js.map +1 -1
  401. package/dist/workspace-draw-types.d.ts +1 -0
  402. package/dist/workspace-draw-types.d.ts.map +1 -1
  403. package/dist/workspace-draw-types.js +1 -0
  404. package/dist/workspace-draw-types.js.map +1 -1
  405. package/dist/workspace-origin.d.ts +15 -0
  406. package/dist/workspace-origin.d.ts.map +1 -0
  407. package/dist/workspace-origin.js +36 -0
  408. package/dist/workspace-origin.js.map +1 -0
  409. package/dist/workspace-runner-children.d.ts +28 -0
  410. package/dist/workspace-runner-children.d.ts.map +1 -0
  411. package/dist/workspace-runner-children.js +112 -0
  412. package/dist/workspace-runner-children.js.map +1 -0
  413. package/dist/workspace-runner-client.d.ts +41 -0
  414. package/dist/workspace-runner-client.d.ts.map +1 -0
  415. package/dist/workspace-runner-client.js +63 -0
  416. package/dist/workspace-runner-client.js.map +1 -0
  417. package/dist/workspace-runner-main.d.ts +56 -0
  418. package/dist/workspace-runner-main.d.ts.map +1 -0
  419. package/dist/workspace-runner-main.js +350 -0
  420. package/dist/workspace-runner-main.js.map +1 -0
  421. package/dist/workspace-runner-policy.d.ts +40 -0
  422. package/dist/workspace-runner-policy.d.ts.map +1 -0
  423. package/dist/workspace-runner-policy.js +47 -0
  424. package/dist/workspace-runner-policy.js.map +1 -0
  425. package/dist/workspace-runner-spawn.d.ts +42 -0
  426. package/dist/workspace-runner-spawn.d.ts.map +1 -0
  427. package/dist/workspace-runner-spawn.js +60 -0
  428. package/dist/workspace-runner-spawn.js.map +1 -0
  429. package/dist/workspace-runner-stop.d.ts +25 -0
  430. package/dist/workspace-runner-stop.d.ts.map +1 -0
  431. package/dist/workspace-runner-stop.js +44 -0
  432. package/dist/workspace-runner-stop.js.map +1 -0
  433. package/dist/workspace-runner-store.d.ts +26 -0
  434. package/dist/workspace-runner-store.d.ts.map +1 -0
  435. package/dist/workspace-runner-store.js +114 -0
  436. package/dist/workspace-runner-store.js.map +1 -0
  437. package/open-design.json +2 -2
  438. package/package.json +2 -2
  439. package/runtime/codex-conversion/src/images/native-invoke.mjs +24 -5
  440. package/runtime/codex-conversion/src/images/native.mjs +3 -2
  441. package/skills/12ui-design/SKILL.md +79 -19
  442. package/skills/12ui-design/agents/openai.yaml +2 -0
  443. package/skills/12ui-design/improve.md +1 -5
  444. package/skills/12ui-design/inspire.md +5 -8
  445. package/skills/12ui-design/outputs.md +2 -23
  446. package/skills/12ui-design/scene.md +27 -156
  447. package/skills/12ui-design/session.md +0 -161
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Media queries decided against a fixed frame: the source image's size, which
3
+ * is the page frame `#stage` holds in a scene. Only the frame's own features
4
+ * (width, height, aspect ratio, orientation) are decided. Everything that
5
+ * depends on the viewer instead of the frame (colour scheme, hover, pointer,
6
+ * resolution, an unknown feature or media type) is `undefined`: the caller
7
+ * keeps that block as written and lets the browser decide it.
8
+ */
9
+ const and = (values) => (values.includes(false) ? false : values.every((value) => value === true) ? true : undefined);
10
+ const or = (values) => (values.includes(true) ? true : values.every((value) => value === false) ? false : undefined);
11
+ const not = (value) => (value === undefined ? undefined : !value);
12
+ const ROOT_FONT_PX = 16;
13
+ /** A media-query length in px; undefined for units the frame does not fix. */
14
+ const lengthPx = (text) => {
15
+ const match = /^(-?(?:\d+\.?\d*|\.\d+))(px|em|rem)?$/u.exec(text.trim());
16
+ if (!match)
17
+ return undefined;
18
+ const value = Number(match[1]);
19
+ if (!match[2])
20
+ return value === 0 ? 0 : undefined;
21
+ return match[2] === 'px' ? value : value * ROOT_FONT_PX;
22
+ };
23
+ const ratio = (text) => {
24
+ const match = /^(\d+\.?\d*|\.\d+)\s*(?:\/\s*(\d+\.?\d*|\.\d+))?$/u.exec(text.trim());
25
+ if (!match)
26
+ return undefined;
27
+ const value = Number(match[1]) / Number(match[2] ?? 1);
28
+ return Number.isFinite(value) ? value : undefined;
29
+ };
30
+ const RANGE_FEATURES = {
31
+ width: { measure: (frame) => frame.width, parse: lengthPx },
32
+ height: { measure: (frame) => frame.height, parse: lengthPx },
33
+ 'device-width': { measure: (frame) => frame.width, parse: lengthPx },
34
+ 'device-height': { measure: (frame) => frame.height, parse: lengthPx },
35
+ 'aspect-ratio': { measure: (frame) => frame.width / frame.height, parse: ratio },
36
+ 'device-aspect-ratio': { measure: (frame) => frame.width / frame.height, parse: ratio },
37
+ };
38
+ const compare = (left, operator, right) => {
39
+ switch (operator) {
40
+ case '<': return left < right;
41
+ case '<=': return left <= right;
42
+ case '>': return left > right;
43
+ case '>=': return left >= right;
44
+ default: return left === right;
45
+ }
46
+ };
47
+ /** One `( ... )` feature: `name: value`, `name`, or the level-4 range forms. */
48
+ const evaluateFeature = (text, frame) => {
49
+ const body = text.trim();
50
+ const range = /^(.+?)\s*(<=|>=|<|>|=)\s*(.+?)(?:\s*(<=|>=|<|>|=)\s*(.+))?$/u.exec(body);
51
+ if (range && !body.includes(':')) {
52
+ const [, first, op1, second, op2, third] = range;
53
+ const named = (value) => RANGE_FEATURES[value.trim()];
54
+ if (third !== undefined && op2 !== undefined) {
55
+ const feature = named(second);
56
+ const low = feature?.parse(first);
57
+ const high = feature?.parse(third);
58
+ if (!feature || low === undefined || high === undefined)
59
+ return undefined;
60
+ const measured = feature.measure(frame);
61
+ return compare(low, op1, measured) && compare(measured, op2, high);
62
+ }
63
+ const left = named(first);
64
+ if (left) {
65
+ const value = left.parse(second);
66
+ return value === undefined ? undefined : compare(left.measure(frame), op1, value);
67
+ }
68
+ const right = named(second);
69
+ const value = right?.parse(first);
70
+ return right && value !== undefined ? compare(value, op1, right.measure(frame)) : undefined;
71
+ }
72
+ const colon = body.indexOf(':');
73
+ const name = (colon < 0 ? body : body.slice(0, colon)).trim();
74
+ const valueText = colon < 0 ? undefined : body.slice(colon + 1).trim();
75
+ if (name === 'orientation') {
76
+ if (valueText === undefined)
77
+ return true;
78
+ const portrait = frame.height >= frame.width;
79
+ return valueText === 'portrait' ? portrait : valueText === 'landscape' ? !portrait : undefined;
80
+ }
81
+ const prefix = /^(min|max)-/u.exec(name)?.[1];
82
+ const feature = RANGE_FEATURES[prefix ? name.slice(prefix.length + 1) : name];
83
+ if (!feature)
84
+ return undefined;
85
+ if (valueText === undefined)
86
+ return prefix ? undefined : feature.measure(frame) !== 0;
87
+ const value = feature.parse(valueText);
88
+ if (value === undefined)
89
+ return undefined;
90
+ return compare(feature.measure(frame), prefix === 'min' ? '>=' : prefix === 'max' ? '<=' : '=', value);
91
+ };
92
+ /** Splits a query into bare words and the raw text of each top-level `( ... )`. */
93
+ const tokenize = (text) => {
94
+ const tokens = [];
95
+ let index = 0;
96
+ while (index < text.length) {
97
+ const char = text[index];
98
+ if (/\s/u.test(char)) {
99
+ index += 1;
100
+ continue;
101
+ }
102
+ if (char === '(') {
103
+ let depth = 0;
104
+ let end = index;
105
+ for (; end < text.length; end += 1) {
106
+ if (text[end] === '(')
107
+ depth += 1;
108
+ if (text[end] === ')') {
109
+ depth -= 1;
110
+ if (depth === 0)
111
+ break;
112
+ }
113
+ }
114
+ if (depth !== 0)
115
+ return undefined;
116
+ tokens.push({ kind: 'group', value: text.slice(index + 1, end) });
117
+ index = end + 1;
118
+ continue;
119
+ }
120
+ const word = /^[^\s()]+/u.exec(text.slice(index))[0];
121
+ tokens.push({ kind: 'word', value: word });
122
+ index += word.length;
123
+ }
124
+ return tokens;
125
+ };
126
+ /** A condition: `not <in-parens>`, or in-parens joined by all-`and` or all-`or`. */
127
+ const evaluateCondition = (tokens, frame) => {
128
+ if (tokens.length === 0)
129
+ return undefined;
130
+ const first = tokens[0];
131
+ if (first.kind === 'word' && first.value === 'not') {
132
+ return tokens.length === 2 ? not(evaluateInParens(tokens[1], frame)) : undefined;
133
+ }
134
+ const operands = [];
135
+ const joiners = new Set();
136
+ for (const [index, token] of tokens.entries()) {
137
+ if (index % 2 === 0)
138
+ operands.push(evaluateInParens(token, frame));
139
+ else if (token.kind === 'word' && (token.value === 'and' || token.value === 'or'))
140
+ joiners.add(token.value);
141
+ else
142
+ return undefined;
143
+ }
144
+ if (tokens.length % 2 === 0 || joiners.size > 1)
145
+ return undefined;
146
+ return joiners.has('or') ? or(operands) : and(operands);
147
+ };
148
+ const evaluateInParens = (token, frame) => {
149
+ if (token.kind !== 'group')
150
+ return undefined;
151
+ const inner = token.value.trim();
152
+ if (inner.startsWith('(') || /^not\s*\(/u.test(inner)) {
153
+ const nested = tokenize(inner);
154
+ return nested ? evaluateCondition(nested, frame) : undefined;
155
+ }
156
+ return evaluateFeature(inner, frame);
157
+ };
158
+ const MATCHING_MEDIA_TYPES = new Set(['all', 'screen']);
159
+ /** One query of a comma list: `[not|only] type [and condition]`, or a bare condition. */
160
+ const evaluateQuery = (query, frame) => {
161
+ const tokens = tokenize(query.trim());
162
+ if (!tokens || tokens.length === 0)
163
+ return undefined;
164
+ const first = tokens[0];
165
+ if (first.kind === 'group' || (first.value === 'not' && tokens[1]?.kind === 'group')) {
166
+ return evaluateCondition(tokens, frame);
167
+ }
168
+ let rest = tokens;
169
+ let negate = false;
170
+ if (first.value === 'not' || first.value === 'only') {
171
+ negate = first.value === 'not';
172
+ rest = tokens.slice(1);
173
+ }
174
+ const type = rest[0];
175
+ if (type?.kind !== 'word')
176
+ return undefined;
177
+ const typeTruth = MATCHING_MEDIA_TYPES.has(type.value) ? true : undefined;
178
+ let result = typeTruth;
179
+ if (rest.length > 1) {
180
+ if (rest[1]?.kind !== 'word' || rest[1].value !== 'and')
181
+ return undefined;
182
+ result = and([typeTruth, evaluateCondition(rest.slice(2), frame)]);
183
+ }
184
+ return negate ? not(result) : result;
185
+ };
186
+ /**
187
+ * Whether a media query list applies at the frame. Comma-separated queries
188
+ * match when any one does. Case-insensitive, as CSS is.
189
+ */
190
+ export const mediaQueryMatchesFrame = (list, frame) => {
191
+ const queries = [];
192
+ let depth = 0;
193
+ let start = 0;
194
+ const text = list.toLowerCase();
195
+ for (let index = 0; index < text.length; index += 1) {
196
+ if (text[index] === '(')
197
+ depth += 1;
198
+ if (text[index] === ')')
199
+ depth -= 1;
200
+ if (text[index] === ',' && depth === 0) {
201
+ queries.push(text.slice(start, index));
202
+ start = index + 1;
203
+ }
204
+ }
205
+ queries.push(text.slice(start));
206
+ return or(queries.map((query) => evaluateQuery(query, frame)));
207
+ };
208
+ //# sourceMappingURL=media-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-query.js","sourceRoot":"","sources":["../../src/scene/media-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type Frame } from './media-query.js';
2
+ /** The value inside a `url(...)` piece, unquoted. */
3
+ export declare const urlValue: (piece: string) => string;
4
+ /** Every `url(...)` value in the CSS, in order. */
5
+ export declare const cssUrls: (css: string) => string[];
6
+ /**
7
+ * Every `url(...)` value with the prelude of the block it sits in: the selector
8
+ * of its rule (`.generated-screen`), an at-rule (`@font-face`), or '' for a
9
+ * declaration list such as a style attribute.
10
+ */
11
+ export declare const cssUrlsInRules: (css: string) => Array<{
12
+ value: string;
13
+ rule: string;
14
+ }>;
15
+ /** Rewrites each `url(...)` whose value `replace` maps to a string (the whole token is replaced). */
16
+ export declare const replaceCssUrls: (css: string, replace: (value: string) => string | undefined) => string;
17
+ /**
18
+ * Viewport units in code (never in strings, comments or url()) become pixels of
19
+ * the frame: `100vh` is the source height, `50vw` half the source width.
20
+ */
21
+ export declare const viewportUnitsToPx: (css: string, frame: Frame) => string;
22
+ export type MediaDecisions = {
23
+ /** Blocks that apply at the frame: their rules stay, unwrapped. */
24
+ applied: string[];
25
+ /** Blocks that do not apply at the frame: removed. */
26
+ removed: string[];
27
+ /** Blocks the frame does not decide (they depend on the viewer): kept as written. */
28
+ undecided: string[];
29
+ };
30
+ export declare const emptyMediaDecisions: () => MediaDecisions;
31
+ /**
32
+ * Decides every `@media` block at the frame: one that applies is unwrapped in
33
+ * place (cascade order is unchanged), one that does not is removed, and one the
34
+ * frame cannot decide stays as written. `@supports` and `@layer` bodies are
35
+ * decided the same way; other at-rules are left alone.
36
+ */
37
+ export declare const resolveMediaAtFrame: (css: string, frame: Frame, decisions: MediaDecisions) => string;
38
+ //# sourceMappingURL=page-css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-css.d.ts","sourceRoot":"","sources":["../../src/scene/page-css.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAsEtE,qDAAqD;AACrD,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,MAIxC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,KAAG,MAAM,EAAqD,CAAC;AAElG;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,KAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAsBjF,CAAC;AAEF,qGAAqG;AACrG,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,KAAG,MAMlF,CAAC;AAMZ;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,OAAO,KAAK,KAAG,MAYnD,CAAC;AAEZ,MAAM,MAAM,cAAc,GAAG;IAC3B,mEAAmE;IACnE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sDAAsD;IACtD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qFAAqF;IACrF,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,cAA+D,CAAC;AAkBvG;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,EAAE,OAAO,KAAK,EAAE,WAAW,cAAc,KAAG,MAsC1F,CAAC"}
@@ -0,0 +1,210 @@
1
+ import { mediaQueryMatchesFrame } from './media-query.js';
2
+ const stringEnd = (css, start) => {
3
+ const quote = css[start];
4
+ for (let index = start + 1; index < css.length; index += 1) {
5
+ if (css[index] === '\\') {
6
+ index += 1;
7
+ continue;
8
+ }
9
+ if (css[index] === quote || css[index] === '\n')
10
+ return index + 1;
11
+ }
12
+ return css.length;
13
+ };
14
+ const lex = (css) => {
15
+ const pieces = [];
16
+ let codeStart = 0;
17
+ const push = (kind, start, end) => {
18
+ if (codeStart < start)
19
+ pieces.push({ kind: 'code', start: codeStart, end: start });
20
+ pieces.push({ kind, start, end });
21
+ codeStart = end;
22
+ };
23
+ let index = 0;
24
+ while (index < css.length) {
25
+ const char = css[index];
26
+ if (char === '/' && css[index + 1] === '*') {
27
+ const close = css.indexOf('*/', index + 2);
28
+ const end = close < 0 ? css.length : close + 2;
29
+ push('comment', index, end);
30
+ index = end;
31
+ }
32
+ else if (char === '"' || char === "'") {
33
+ const end = stringEnd(css, index);
34
+ push('string', index, end);
35
+ index = end;
36
+ }
37
+ else if ((char === 'u' || char === 'U') && /^url\(/iu.test(css.slice(index, index + 4))
38
+ && !/[\w-]/u.test(css[index - 1] ?? '')) {
39
+ let inner = index + 4;
40
+ while (/\s/u.test(css[inner] ?? ''))
41
+ inner += 1;
42
+ let end;
43
+ if (css[inner] === '"' || css[inner] === "'") {
44
+ let after = stringEnd(css, inner);
45
+ while (/\s/u.test(css[after] ?? ''))
46
+ after += 1;
47
+ end = css[after] === ')' ? after + 1 : after;
48
+ }
49
+ else {
50
+ const close = css.indexOf(')', inner);
51
+ end = close < 0 ? css.length : close + 1;
52
+ }
53
+ push('url', index, end);
54
+ index = end;
55
+ }
56
+ else {
57
+ index += 1;
58
+ }
59
+ }
60
+ if (codeStart < css.length)
61
+ pieces.push({ kind: 'code', start: codeStart, end: css.length });
62
+ return pieces;
63
+ };
64
+ /** The CSS with every string, comment and url() blanked to spaces, so indices line up. */
65
+ const maskOf = (css, pieces = lex(css)) => pieces
66
+ .map((piece) => (piece.kind === 'code' ? css.slice(piece.start, piece.end) : ' '.repeat(piece.end - piece.start)))
67
+ .join('');
68
+ /** The value inside a `url(...)` piece, unquoted. */
69
+ export const urlValue = (piece) => {
70
+ const inner = piece.slice(4, piece.endsWith(')') ? -1 : undefined).trim();
71
+ const quote = inner[0];
72
+ return (quote === '"' || quote === "'") && inner.endsWith(quote) ? inner.slice(1, -1) : inner;
73
+ };
74
+ /** Every `url(...)` value in the CSS, in order. */
75
+ export const cssUrls = (css) => cssUrlsInRules(css).map((entry) => entry.value);
76
+ /**
77
+ * Every `url(...)` value with the prelude of the block it sits in: the selector
78
+ * of its rule (`.generated-screen`), an at-rule (`@font-face`), or '' for a
79
+ * declaration list such as a style attribute.
80
+ */
81
+ export const cssUrlsInRules = (css) => {
82
+ const found = [];
83
+ const stack = [];
84
+ let preludeStart = 0;
85
+ for (const piece of lex(css)) {
86
+ if (piece.kind === 'url') {
87
+ found.push({ value: urlValue(css.slice(piece.start, piece.end)), rule: stack.at(-1) ?? '' });
88
+ continue;
89
+ }
90
+ if (piece.kind !== 'code')
91
+ continue;
92
+ for (let index = piece.start; index < piece.end; index += 1) {
93
+ const char = css[index];
94
+ if (char === '{') {
95
+ stack.push(css.slice(preludeStart, index).trim().replace(/\s+/gu, ' '));
96
+ preludeStart = index + 1;
97
+ }
98
+ else if (char === '}' || char === ';') {
99
+ if (char === '}')
100
+ stack.pop();
101
+ preludeStart = index + 1;
102
+ }
103
+ }
104
+ }
105
+ return found;
106
+ };
107
+ /** Rewrites each `url(...)` whose value `replace` maps to a string (the whole token is replaced). */
108
+ export const replaceCssUrls = (css, replace) => lex(css)
109
+ .map((piece) => {
110
+ const text = css.slice(piece.start, piece.end);
111
+ if (piece.kind !== 'url')
112
+ return text;
113
+ return replace(urlValue(text)) ?? text;
114
+ })
115
+ .join('');
116
+ const formatPx = (value) => `${Number(value.toFixed(3))}px`;
117
+ const VIEWPORT_UNIT = /(?<![\w.])(?<!\w-)(\d*\.?\d+(?:e[+-]?\d+)?)([sld]?)(vw|vh|vi|vb|vmin|vmax)(?![\w-])/giu;
118
+ /**
119
+ * Viewport units in code (never in strings, comments or url()) become pixels of
120
+ * the frame: `100vh` is the source height, `50vw` half the source width.
121
+ */
122
+ export const viewportUnitsToPx = (css, frame) => lex(css)
123
+ .map((piece) => {
124
+ const text = css.slice(piece.start, piece.end);
125
+ if (piece.kind !== 'code')
126
+ return text;
127
+ return text.replace(VIEWPORT_UNIT, (_match, number, _variant, unit) => {
128
+ const lower = unit.toLowerCase();
129
+ const basis = lower === 'vw' || lower === 'vi' ? frame.width
130
+ : lower === 'vh' || lower === 'vb' ? frame.height
131
+ : lower === 'vmin' ? Math.min(frame.width, frame.height) : Math.max(frame.width, frame.height);
132
+ return formatPx((Number(number) * basis) / 100);
133
+ });
134
+ })
135
+ .join('');
136
+ export const emptyMediaDecisions = () => ({ applied: [], removed: [], undecided: [] });
137
+ /** Index of the `}` closing the block whose `{` is at `open`, in the masked text. */
138
+ const matchingBrace = (mask, open) => {
139
+ let depth = 0;
140
+ for (let index = open; index < mask.length; index += 1) {
141
+ if (mask[index] === '{')
142
+ depth += 1;
143
+ if (mask[index] === '}') {
144
+ depth -= 1;
145
+ if (depth === 0)
146
+ return index;
147
+ }
148
+ }
149
+ return mask.length;
150
+ };
151
+ /** At-rules whose bodies hold rules, so `@media` inside them is decided too. */
152
+ const RULE_CONTAINERS = new Set(['supports', 'layer']);
153
+ /**
154
+ * Decides every `@media` block at the frame: one that applies is unwrapped in
155
+ * place (cascade order is unchanged), one that does not is removed, and one the
156
+ * frame cannot decide stays as written. `@supports` and `@layer` bodies are
157
+ * decided the same way; other at-rules are left alone.
158
+ */
159
+ export const resolveMediaAtFrame = (css, frame, decisions) => {
160
+ const mask = maskOf(css);
161
+ let output = '';
162
+ let copied = 0;
163
+ let depth = 0;
164
+ for (let index = 0; index < mask.length; index += 1) {
165
+ const char = mask[index];
166
+ if (char === '{') {
167
+ depth += 1;
168
+ continue;
169
+ }
170
+ if (char === '}') {
171
+ depth -= 1;
172
+ continue;
173
+ }
174
+ if (char !== '@' || depth !== 0)
175
+ continue;
176
+ const name = /^@([a-z-]+)/iu.exec(mask.slice(index, index + 40))?.[1]?.toLowerCase();
177
+ if (name !== 'media' && !RULE_CONTAINERS.has(name ?? ''))
178
+ continue;
179
+ const open = mask.indexOf('{', index);
180
+ const statementEnd = mask.indexOf(';', index);
181
+ if (open < 0 || (statementEnd >= 0 && statementEnd < open))
182
+ continue;
183
+ const close = matchingBrace(mask, open);
184
+ const prelude = css.slice(index + 1 + name.length, open).trim();
185
+ const body = css.slice(open + 1, close);
186
+ output += css.slice(copied, index);
187
+ if (name === 'media') {
188
+ const applies = mediaQueryMatchesFrame(prelude, frame);
189
+ const label = `@media ${prelude.replace(/\s+/gu, ' ')}`;
190
+ if (applies === true) {
191
+ decisions.applied.push(label);
192
+ output += resolveMediaAtFrame(body, frame, decisions);
193
+ }
194
+ else if (applies === false) {
195
+ decisions.removed.push(label);
196
+ }
197
+ else {
198
+ decisions.undecided.push(label);
199
+ output += css.slice(index, close + 1);
200
+ }
201
+ }
202
+ else {
203
+ output += `${css.slice(index, open + 1)}${resolveMediaAtFrame(body, frame, decisions)}}`;
204
+ }
205
+ copied = Math.min(close + 1, css.length);
206
+ index = copied - 1;
207
+ }
208
+ return output + css.slice(copied);
209
+ };
210
+ //# sourceMappingURL=page-css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-css.js","sourceRoot":"","sources":["../../src/scene/page-css.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The images a converted page paints, named the way `12ui scene merge` prints
3
+ * them and `--drop` takes them back: a page-relative file path, `inline:<sha>`
4
+ * for a data URI, or the URL of a remote image.
5
+ */
6
+ export type Box = [number, number, number, number];
7
+ export type ImageRef = {
8
+ ref: string;
9
+ kind: 'file' | 'inline' | 'remote';
10
+ /** The value as written in the page (a data URI is not repeated in output). */
11
+ value: string;
12
+ };
13
+ export type PageImage = ImageRef & {
14
+ usedBy: string[];
15
+ box?: Box;
16
+ };
17
+ /** Classifies one reference; undefined for fragments and empty values, which load nothing. */
18
+ export declare const classifyRef: (value: string) => ImageRef | undefined;
19
+ /** The URLs of a srcset, without their descriptors. */
20
+ export declare const srcsetUrls: (srcset: string) => string[];
21
+ /** Image references of a CSS text (`url()` values), classified. */
22
+ export declare const cssImageRefs: (css: string) => ImageRef[];
23
+ /** The same references, each with the selector (or at-rule) of the rule that holds it. */
24
+ export declare const cssImageRefsInRules: (css: string) => Array<ImageRef & {
25
+ rule: string;
26
+ }>;
27
+ /** Replaces every `url()` naming a dropped image with `none`, which keeps a shorthand valid. */
28
+ export declare const dropCssImages: (css: string, dropped: ReadonlySet<string>) => string;
29
+ /** Whether a reference is an image (not a font file or stylesheet loaded through url()). */
30
+ export declare const isImageRef: (ref: ImageRef) => boolean;
31
+ /** The source box as printed: x0,y0,x1,y1 in source pixels, like `scene colors --box`. */
32
+ export declare const formatBox: (box: Box) => string;
33
+ //# sourceMappingURL=page-images.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-images.d.ts","sourceRoot":"","sources":["../../src/scene/page-images.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnD,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACnC,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC;AAInE,8FAA8F;AAC9F,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,QAAQ,GAAG,SAWtD,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,KAAG,MAAM,EAGhC,CAAC;AAEnB,mEAAmE;AACnE,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,QAAQ,EAEG,CAAC;AAEvD,0FAA0F;AAC1F,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,KAAG,KAAK,CAAC,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAI/E,CAAC;AAEL,gGAAgG;AAChG,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,EAAE,SAAS,WAAW,CAAC,MAAM,CAAC,KAAG,MAGxE,CAAC;AAKH,4FAA4F;AAC5F,eAAO,MAAM,UAAU,GAAI,KAAK,QAAQ,KAAG,OAI1C,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,SAAS,GAAI,KAAK,GAAG,KAAG,MAAgE,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { cssUrls, cssUrlsInRules, replaceCssUrls } from './page-css.js';
3
+ const REMOTE = /^(?:[a-z][a-z0-9+.-]*:)?\/\//iu;
4
+ /** Classifies one reference; undefined for fragments and empty values, which load nothing. */
5
+ export const classifyRef = (value) => {
6
+ const trimmed = value.trim();
7
+ if (!trimmed || trimmed.startsWith('#'))
8
+ return undefined;
9
+ if (/^data:/iu.test(trimmed)) {
10
+ return { ref: `inline:${createHash('sha256').update(trimmed).digest('hex').slice(0, 12)}`, kind: 'inline', value: trimmed };
11
+ }
12
+ if (REMOTE.test(trimmed) || /^[a-z][a-z0-9+.-]*:/iu.test(trimmed))
13
+ return { ref: trimmed, kind: 'remote', value: trimmed };
14
+ const withoutQuery = trimmed.split(/[?#]/u)[0];
15
+ let decoded = withoutQuery;
16
+ try {
17
+ decoded = decodeURIComponent(withoutQuery);
18
+ }
19
+ catch { /* keep the raw path */ }
20
+ return { ref: decoded.replace(/^\/+/u, ''), kind: 'file', value: trimmed };
21
+ };
22
+ /** The URLs of a srcset, without their descriptors. */
23
+ export const srcsetUrls = (srcset) => srcset
24
+ .split(',')
25
+ .map((candidate) => candidate.trim().split(/\s+/u)[0] ?? '')
26
+ .filter(Boolean);
27
+ /** Image references of a CSS text (`url()` values), classified. */
28
+ export const cssImageRefs = (css) => cssUrls(css)
29
+ .map(classifyRef)
30
+ .filter((ref) => ref !== undefined);
31
+ /** The same references, each with the selector (or at-rule) of the rule that holds it. */
32
+ export const cssImageRefsInRules = (css) => cssUrlsInRules(css)
33
+ .flatMap(({ value, rule }) => {
34
+ const ref = classifyRef(value);
35
+ return ref ? [{ ...ref, rule }] : [];
36
+ });
37
+ /** Replaces every `url()` naming a dropped image with `none`, which keeps a shorthand valid. */
38
+ export const dropCssImages = (css, dropped) => replaceCssUrls(css, (value) => {
39
+ const ref = classifyRef(value);
40
+ return ref && dropped.has(ref.ref) ? 'none' : undefined;
41
+ });
42
+ const FONT_FILE = /\.(?:woff2?|ttf|otf|eot)$/iu;
43
+ const STYLESHEET_FILE = /\.css$/iu;
44
+ /** Whether a reference is an image (not a font file or stylesheet loaded through url()). */
45
+ export const isImageRef = (ref) => {
46
+ if (ref.kind === 'inline')
47
+ return /^data:image\//iu.test(ref.value);
48
+ const path = ref.kind === 'file' ? ref.ref : ref.value.split(/[?#]/u)[0];
49
+ return !FONT_FILE.test(path) && !STYLESHEET_FILE.test(path);
50
+ };
51
+ /** The source box as printed: x0,y0,x1,y1 in source pixels, like `scene colors --box`. */
52
+ export const formatBox = (box) => box.map((value) => Number(value.toFixed(1))).join(',');
53
+ //# sourceMappingURL=page-images.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-images.js","sourceRoot":"","sources":["../../src/scene/page-images.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAmBxE,MAAM,MAAM,GAAG,gCAAgC,CAAC;AAEhD,8FAA8F;AAC9F,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAwB,EAAE;IACjE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1D,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,GAAG,EAAE,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC9H,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC3H,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,CAAC;IAChD,IAAI,OAAO,GAAG,YAAY,CAAC;IAC3B,IAAI,CAAC;QAAC,OAAO,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;IACrF,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC7E,CAAC,CAAC;AAEF,uDAAuD;AACvD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAc,EAAY,EAAE,CAAC,MAAM;KAC3D,KAAK,CAAC,GAAG,CAAC;KACV,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;KAC3D,MAAM,CAAC,OAAO,CAAC,CAAC;AAEnB,mEAAmE;AACnE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAc,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;KAClE,GAAG,CAAC,WAAW,CAAC;KAChB,MAAM,CAAC,CAAC,GAAG,EAAmB,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;AAEvD,0FAA0F;AAC1F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAsC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC;KACxG,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;IAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvC,CAAC,CAAC,CAAC;AAEL,gGAAgG;AAChG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,OAA4B,EAAU,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE;IAChH,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,6BAA6B,CAAC;AAChD,MAAM,eAAe,GAAG,UAAU,CAAC;AAEnC,4FAA4F;AAC5F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAa,EAAW,EAAE;IACnD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,CAAC;IAC1E,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC,CAAC;AAEF,0FAA0F;AAC1F,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAQ,EAAU,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { Frame } from './media-query.js';
2
+ import { type MediaDecisions } from './page-css.js';
3
+ import { type Box, type PageImage } from './page-images.js';
4
+ /**
5
+ * A converted page made ready for a scene's `#stage`, which holds the page at
6
+ * its source frame: `@media` decided at that frame, viewport units in frame
7
+ * pixels, the API engine's hidden layout bands removed, remote scripts removed,
8
+ * and the images the agent names with `--drop` taken out. Pure: HTML in, HTML
9
+ * pieces and facts out. `scene-merge.ts` does the reading and writing.
10
+ */
11
+ export type MergeEngine = 'codex' | 'api';
12
+ export type MergedPage = {
13
+ /** The page's stylesheets and style elements, for the scene's <head>. */
14
+ head: string;
15
+ /** The page's <body> content, for #stage. */
16
+ body: string;
17
+ images: PageImage[];
18
+ dropped: string[];
19
+ /** Page-relative files the merged page loads, to copy beside the scene's index.html. */
20
+ files: string[];
21
+ /** Remote font stylesheets (fonts.googleapis.com) the page links. */
22
+ fonts: string[];
23
+ /** Other remote resources the page loads; capture blocks them. */
24
+ remote: string[];
25
+ removedScripts: string[];
26
+ media: MediaDecisions;
27
+ bands?: {
28
+ shown: string[];
29
+ removed: string[];
30
+ };
31
+ /** Head elements and <body> attributes that do not carry into the scene. */
32
+ notCarried: string[];
33
+ };
34
+ export declare const mergePage: (input: {
35
+ html: string;
36
+ frame: Frame;
37
+ engine: MergeEngine;
38
+ boxes: ReadonlyMap<string, Box>;
39
+ drop: readonly string[];
40
+ }) => MergedPage;
41
+ //# sourceMappingURL=page-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-merge.d.ts","sourceRoot":"","sources":["../../src/scene/page-merge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAA+D,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACjH,OAAO,EAEL,KAAK,GAAG,EAAiB,KAAK,SAAS,EACxC,MAAM,kBAAkB,CAAC;AAG1B;;;;;;GAMG;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,KAAK,CAAC;AAE1C,MAAM,MAAM,UAAU,GAAG;IACvB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,wFAAwF;IACxF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qEAAqE;IACrE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,kEAAkE;IAClE,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC/C,4EAA4E;IAC5E,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAkDF,eAAO,MAAM,SAAS,GAAI,OAAO;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB,KAAG,UAyIH,CAAC"}