@12ui/design 0.2.81 → 0.2.83

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 (301) hide show
  1. package/README.md +11 -7
  2. package/SKILL.md +1 -1
  3. package/dist/branch-execution.d.ts.map +1 -1
  4. package/dist/branch-execution.js +6 -0
  5. package/dist/branch-execution.js.map +1 -1
  6. package/dist/branch-materialize.d.ts.map +1 -1
  7. package/dist/branch-materialize.js +6 -2
  8. package/dist/branch-materialize.js.map +1 -1
  9. package/dist/cli-capabilities.d.ts +4 -7
  10. package/dist/cli-capabilities.d.ts.map +1 -1
  11. package/dist/cli-capabilities.js +4 -4
  12. package/dist/cli-capabilities.js.map +1 -1
  13. package/dist/cli-help/conversion.d.ts +1 -1
  14. package/dist/cli-help/conversion.js +1 -1
  15. package/dist/cli-help/conversion.js.map +1 -1
  16. package/dist/cli-help/index.d.ts +3 -3
  17. package/dist/cli-help/workflow.d.ts +2 -2
  18. package/dist/cli-help/workflow.js +4 -4
  19. package/dist/cli-help/workflow.js.map +1 -1
  20. package/dist/cli-image-backend.d.ts +6 -1
  21. package/dist/cli-image-backend.d.ts.map +1 -1
  22. package/dist/cli-image-backend.js +8 -3
  23. package/dist/cli-image-backend.js.map +1 -1
  24. package/dist/cli-local-runtime.d.ts +6 -0
  25. package/dist/cli-local-runtime.d.ts.map +1 -1
  26. package/dist/cli-local-runtime.js +14 -1
  27. package/dist/cli-local-runtime.js.map +1 -1
  28. package/dist/cli-usage.d.ts.map +1 -1
  29. package/dist/cli-usage.js +8 -7
  30. package/dist/cli-usage.js.map +1 -1
  31. package/dist/cli-workspace-draw.d.ts.map +1 -1
  32. package/dist/cli-workspace-draw.js +2 -0
  33. package/dist/cli-workspace-draw.js.map +1 -1
  34. package/dist/cli-workspace-runner.d.ts.map +1 -1
  35. package/dist/cli-workspace-runner.js +2 -1
  36. package/dist/cli-workspace-runner.js.map +1 -1
  37. package/dist/legacy-skill-catalog.d.ts.map +1 -1
  38. package/dist/legacy-skill-catalog.js +13 -1
  39. package/dist/legacy-skill-catalog.js.map +1 -1
  40. package/dist/mcp-slate-tool-defs.d.ts.map +1 -1
  41. package/dist/mcp-slate-tool-defs.js +3 -2
  42. package/dist/mcp-slate-tool-defs.js.map +1 -1
  43. package/dist/mcp-slate-ui-copy.d.ts +10 -0
  44. package/dist/mcp-slate-ui-copy.d.ts.map +1 -1
  45. package/dist/mcp-slate-ui-copy.js +9 -0
  46. package/dist/mcp-slate-ui-copy.js.map +1 -1
  47. package/dist/mcp-slate-ui-locales/de-DE.d.ts.map +1 -1
  48. package/dist/mcp-slate-ui-locales/de-DE.js +5 -0
  49. package/dist/mcp-slate-ui-locales/de-DE.js.map +1 -1
  50. package/dist/mcp-slate-ui-locales/es-419.d.ts.map +1 -1
  51. package/dist/mcp-slate-ui-locales/es-419.js +5 -0
  52. package/dist/mcp-slate-ui-locales/es-419.js.map +1 -1
  53. package/dist/mcp-slate-ui-locales/es-ES.d.ts.map +1 -1
  54. package/dist/mcp-slate-ui-locales/es-ES.js +5 -0
  55. package/dist/mcp-slate-ui-locales/es-ES.js.map +1 -1
  56. package/dist/mcp-slate-ui-locales/fr-FR.d.ts.map +1 -1
  57. package/dist/mcp-slate-ui-locales/fr-FR.js +5 -0
  58. package/dist/mcp-slate-ui-locales/fr-FR.js.map +1 -1
  59. package/dist/mcp-slate-ui-locales/hi-IN.d.ts.map +1 -1
  60. package/dist/mcp-slate-ui-locales/hi-IN.js +5 -0
  61. package/dist/mcp-slate-ui-locales/hi-IN.js.map +1 -1
  62. package/dist/mcp-slate-ui-locales/it-IT.d.ts.map +1 -1
  63. package/dist/mcp-slate-ui-locales/it-IT.js +5 -0
  64. package/dist/mcp-slate-ui-locales/it-IT.js.map +1 -1
  65. package/dist/mcp-slate-ui-locales/ja-JP.d.ts.map +1 -1
  66. package/dist/mcp-slate-ui-locales/ja-JP.js +5 -0
  67. package/dist/mcp-slate-ui-locales/ja-JP.js.map +1 -1
  68. package/dist/mcp-slate-ui-locales/ko-KR.d.ts.map +1 -1
  69. package/dist/mcp-slate-ui-locales/ko-KR.js +5 -0
  70. package/dist/mcp-slate-ui-locales/ko-KR.js.map +1 -1
  71. package/dist/mcp-slate-ui-locales/pt-BR.d.ts.map +1 -1
  72. package/dist/mcp-slate-ui-locales/pt-BR.js +5 -0
  73. package/dist/mcp-slate-ui-locales/pt-BR.js.map +1 -1
  74. package/dist/mcp-slate-ui-locales/zh-CN.d.ts.map +1 -1
  75. package/dist/mcp-slate-ui-locales/zh-CN.js +5 -0
  76. package/dist/mcp-slate-ui-locales/zh-CN.js.map +1 -1
  77. package/dist/mcp-slate-ui-locales/zh-TW.d.ts.map +1 -1
  78. package/dist/mcp-slate-ui-locales/zh-TW.js +5 -0
  79. package/dist/mcp-slate-ui-locales/zh-TW.js.map +1 -1
  80. package/dist/mcp-slate-ui-script-board.d.ts +19 -0
  81. package/dist/mcp-slate-ui-script-board.d.ts.map +1 -0
  82. package/dist/mcp-slate-ui-script-board.js +126 -0
  83. package/dist/mcp-slate-ui-script-board.js.map +1 -0
  84. package/dist/mcp-slate-ui-script-designs.d.ts +1 -1
  85. package/dist/mcp-slate-ui-script-designs.d.ts.map +1 -1
  86. package/dist/mcp-slate-ui-script-designs.js +24 -15
  87. package/dist/mcp-slate-ui-script-designs.js.map +1 -1
  88. package/dist/mcp-slate-ui-script-inspiration-collage.d.ts +5 -2
  89. package/dist/mcp-slate-ui-script-inspiration-collage.d.ts.map +1 -1
  90. package/dist/mcp-slate-ui-script-inspiration-collage.js +9 -5
  91. package/dist/mcp-slate-ui-script-inspiration-collage.js.map +1 -1
  92. package/dist/mcp-slate-ui-script-inspiration-gallery.d.ts +7 -4
  93. package/dist/mcp-slate-ui-script-inspiration-gallery.d.ts.map +1 -1
  94. package/dist/mcp-slate-ui-script-inspiration-gallery.js +46 -5
  95. package/dist/mcp-slate-ui-script-inspiration-gallery.js.map +1 -1
  96. package/dist/mcp-slate-ui-script-inspiration-grid.d.ts.map +1 -1
  97. package/dist/mcp-slate-ui-script-inspiration-grid.js +4 -0
  98. package/dist/mcp-slate-ui-script-inspiration-grid.js.map +1 -1
  99. package/dist/mcp-slate-ui-script-pause.d.ts +4 -0
  100. package/dist/mcp-slate-ui-script-pause.d.ts.map +1 -1
  101. package/dist/mcp-slate-ui-script-pause.js +9 -2
  102. package/dist/mcp-slate-ui-script-pause.js.map +1 -1
  103. package/dist/mcp-slate-ui-script-peek.d.ts +16 -0
  104. package/dist/mcp-slate-ui-script-peek.d.ts.map +1 -0
  105. package/dist/mcp-slate-ui-script-peek.js +89 -0
  106. package/dist/mcp-slate-ui-script-peek.js.map +1 -0
  107. package/dist/mcp-slate-ui-script-references.d.ts +4 -2
  108. package/dist/mcp-slate-ui-script-references.d.ts.map +1 -1
  109. package/dist/mcp-slate-ui-script-references.js +39 -7
  110. package/dist/mcp-slate-ui-script-references.js.map +1 -1
  111. package/dist/mcp-slate-ui-script-remote.js +2 -2
  112. package/dist/mcp-slate-ui-script-viewer.d.ts +7 -2
  113. package/dist/mcp-slate-ui-script-viewer.d.ts.map +1 -1
  114. package/dist/mcp-slate-ui-script-viewer.js +183 -50
  115. package/dist/mcp-slate-ui-script-viewer.js.map +1 -1
  116. package/dist/mcp-slate-ui-script.d.ts.map +1 -1
  117. package/dist/mcp-slate-ui-script.js +4 -0
  118. package/dist/mcp-slate-ui-script.js.map +1 -1
  119. package/dist/mcp-slate-ui-styles-board.d.ts +7 -0
  120. package/dist/mcp-slate-ui-styles-board.d.ts.map +1 -0
  121. package/dist/mcp-slate-ui-styles-board.js +30 -0
  122. package/dist/mcp-slate-ui-styles-board.js.map +1 -0
  123. package/dist/mcp-slate-ui-styles-designs.d.ts +2 -1
  124. package/dist/mcp-slate-ui-styles-designs.d.ts.map +1 -1
  125. package/dist/mcp-slate-ui-styles-designs.js +10 -8
  126. package/dist/mcp-slate-ui-styles-designs.js.map +1 -1
  127. package/dist/mcp-slate-ui-styles-inspiration.d.ts.map +1 -1
  128. package/dist/mcp-slate-ui-styles-inspiration.js +13 -2
  129. package/dist/mcp-slate-ui-styles-inspiration.js.map +1 -1
  130. package/dist/mcp-slate-ui-styles-loading.d.ts +18 -0
  131. package/dist/mcp-slate-ui-styles-loading.d.ts.map +1 -0
  132. package/dist/mcp-slate-ui-styles-loading.js +37 -0
  133. package/dist/mcp-slate-ui-styles-loading.js.map +1 -0
  134. package/dist/mcp-slate-ui-styles-peek.d.ts +8 -0
  135. package/dist/mcp-slate-ui-styles-peek.d.ts.map +1 -0
  136. package/dist/mcp-slate-ui-styles-peek.js +13 -0
  137. package/dist/mcp-slate-ui-styles-peek.js.map +1 -0
  138. package/dist/mcp-slate-ui-styles.d.ts.map +1 -1
  139. package/dist/mcp-slate-ui-styles.js +0 -3
  140. package/dist/mcp-slate-ui-styles.js.map +1 -1
  141. package/dist/mcp-slate-ui.d.ts.map +1 -1
  142. package/dist/mcp-slate-ui.js +4 -1
  143. package/dist/mcp-slate-ui.js.map +1 -1
  144. package/dist/mcp-workflow-tools.js +2 -2
  145. package/dist/mcp-workflow-tools.js.map +1 -1
  146. package/dist/prototype-browsers.d.ts +10 -2
  147. package/dist/prototype-browsers.d.ts.map +1 -1
  148. package/dist/prototype-browsers.js +27 -2
  149. package/dist/prototype-browsers.js.map +1 -1
  150. package/dist/review-files-server.d.ts +8 -0
  151. package/dist/review-files-server.d.ts.map +1 -0
  152. package/dist/review-files-server.js +133 -0
  153. package/dist/review-files-server.js.map +1 -0
  154. package/dist/review-page-assets.d.ts +1 -1
  155. package/dist/review-page-assets.d.ts.map +1 -1
  156. package/dist/review-page-assets.js +3 -1
  157. package/dist/review-page-assets.js.map +1 -1
  158. package/dist/review-page.d.ts +8 -1
  159. package/dist/review-page.d.ts.map +1 -1
  160. package/dist/review-page.js +32 -21
  161. package/dist/review-page.js.map +1 -1
  162. package/dist/review-server-guard.d.ts +33 -0
  163. package/dist/review-server-guard.d.ts.map +1 -0
  164. package/dist/review-server-guard.js +65 -0
  165. package/dist/review-server-guard.js.map +1 -0
  166. package/dist/review-server.d.ts +2 -0
  167. package/dist/review-server.d.ts.map +1 -1
  168. package/dist/review-server.js +45 -74
  169. package/dist/review-server.js.map +1 -1
  170. package/dist/server.d.ts.map +1 -1
  171. package/dist/server.js +2 -1
  172. package/dist/server.js.map +1 -1
  173. package/dist/slate-actions.d.ts +6 -7
  174. package/dist/slate-actions.d.ts.map +1 -1
  175. package/dist/slate-actions.js +6 -9
  176. package/dist/slate-actions.js.map +1 -1
  177. package/dist/slate-branch-runner.d.ts +120 -0
  178. package/dist/slate-branch-runner.d.ts.map +1 -0
  179. package/dist/slate-branch-runner.js +312 -0
  180. package/dist/slate-branch-runner.js.map +1 -0
  181. package/dist/slate-captions-local.d.ts +14 -0
  182. package/dist/slate-captions-local.d.ts.map +1 -0
  183. package/dist/slate-captions-local.js +70 -0
  184. package/dist/slate-captions-local.js.map +1 -0
  185. package/dist/slate-captions-remote.d.ts +29 -0
  186. package/dist/slate-captions-remote.d.ts.map +1 -0
  187. package/dist/slate-captions-remote.js +65 -0
  188. package/dist/slate-captions-remote.js.map +1 -0
  189. package/dist/slate-captions.d.ts +41 -0
  190. package/dist/slate-captions.d.ts.map +1 -0
  191. package/dist/slate-captions.js +112 -0
  192. package/dist/slate-captions.js.map +1 -0
  193. package/dist/slate-commit.d.ts.map +1 -1
  194. package/dist/slate-commit.js +8 -6
  195. package/dist/slate-commit.js.map +1 -1
  196. package/dist/slate-image-executor.d.ts +18 -3
  197. package/dist/slate-image-executor.d.ts.map +1 -1
  198. package/dist/slate-image-executor.js +18 -5
  199. package/dist/slate-image-executor.js.map +1 -1
  200. package/dist/slate-paths.d.ts +3 -1
  201. package/dist/slate-paths.d.ts.map +1 -1
  202. package/dist/slate-paths.js +8 -2
  203. package/dist/slate-paths.js.map +1 -1
  204. package/dist/slate-round-prompt.d.ts +0 -12
  205. package/dist/slate-round-prompt.d.ts.map +1 -1
  206. package/dist/slate-round-prompt.js +0 -15
  207. package/dist/slate-round-prompt.js.map +1 -1
  208. package/dist/slate-round-runner.d.ts.map +1 -1
  209. package/dist/slate-round-runner.js +8 -14
  210. package/dist/slate-round-runner.js.map +1 -1
  211. package/dist/slate-runner-context.d.ts +3 -0
  212. package/dist/slate-runner-context.d.ts.map +1 -1
  213. package/dist/slate-runner-context.js.map +1 -1
  214. package/dist/slate-runner-main.d.ts +3 -0
  215. package/dist/slate-runner-main.d.ts.map +1 -1
  216. package/dist/slate-runner-main.js +5 -1
  217. package/dist/slate-runner-main.js.map +1 -1
  218. package/dist/slate-runner-spawn.js +2 -2
  219. package/dist/slate-runner-spawn.js.map +1 -1
  220. package/dist/slate-site-references-capture.d.ts +38 -1
  221. package/dist/slate-site-references-capture.d.ts.map +1 -1
  222. package/dist/slate-site-references-capture.js +25 -7
  223. package/dist/slate-site-references-capture.js.map +1 -1
  224. package/dist/slate-site-references-client.d.ts +13 -1
  225. package/dist/slate-site-references-client.d.ts.map +1 -1
  226. package/dist/slate-site-references-client.js +39 -14
  227. package/dist/slate-site-references-client.js.map +1 -1
  228. package/dist/slate-site-references-local.d.ts +3 -0
  229. package/dist/slate-site-references-local.d.ts.map +1 -1
  230. package/dist/slate-site-references-local.js +20 -1
  231. package/dist/slate-site-references-local.js.map +1 -1
  232. package/dist/slate-site-references-suggest.d.ts +25 -2
  233. package/dist/slate-site-references-suggest.d.ts.map +1 -1
  234. package/dist/slate-site-references-suggest.js +71 -12
  235. package/dist/slate-site-references-suggest.js.map +1 -1
  236. package/dist/slate-site-references.d.ts +11 -0
  237. package/dist/slate-site-references.d.ts.map +1 -1
  238. package/dist/slate-site-references.js +42 -3
  239. package/dist/slate-site-references.js.map +1 -1
  240. package/dist/slate-view-contract.d.ts +39 -1
  241. package/dist/slate-view-contract.d.ts.map +1 -1
  242. package/dist/slate-view.d.ts.map +1 -1
  243. package/dist/slate-view.js +8 -0
  244. package/dist/slate-view.js.map +1 -1
  245. package/dist/slate-workspace-parse.d.ts.map +1 -1
  246. package/dist/slate-workspace-parse.js +35 -0
  247. package/dist/slate-workspace-parse.js.map +1 -1
  248. package/dist/slate-workspace-types.d.ts +31 -2
  249. package/dist/slate-workspace-types.d.ts.map +1 -1
  250. package/dist/workflow/adapter-12ui.js +1 -1
  251. package/dist/workflow/adapter-12ui.js.map +1 -1
  252. package/dist/workflow/adapters.d.ts.map +1 -1
  253. package/dist/workflow/adapters.js +3 -3
  254. package/dist/workflow/adapters.js.map +1 -1
  255. package/dist/workflow/providers.js +2 -2
  256. package/dist/workflow/providers.js.map +1 -1
  257. package/dist/workflow/routing.d.ts +8 -1
  258. package/dist/workflow/routing.d.ts.map +1 -1
  259. package/dist/workflow/routing.js +9 -2
  260. package/dist/workflow/routing.js.map +1 -1
  261. package/dist/workflow/types.d.ts +5 -2
  262. package/dist/workflow/types.d.ts.map +1 -1
  263. package/dist/workflow/types.js.map +1 -1
  264. package/dist/workflow-transport.d.ts.map +1 -1
  265. package/dist/workflow-transport.js +4 -2
  266. package/dist/workflow-transport.js.map +1 -1
  267. package/dist/workspace-draw-branch.d.ts +27 -0
  268. package/dist/workspace-draw-branch.d.ts.map +1 -0
  269. package/dist/workspace-draw-branch.js +101 -0
  270. package/dist/workspace-draw-branch.js.map +1 -0
  271. package/dist/workspace-draw-client.d.ts +27 -0
  272. package/dist/workspace-draw-client.d.ts.map +1 -1
  273. package/dist/workspace-draw-client.js +30 -0
  274. package/dist/workspace-draw-client.js.map +1 -1
  275. package/dist/workspace-draw-codex.d.ts +5 -5
  276. package/dist/workspace-draw-codex.d.ts.map +1 -1
  277. package/dist/workspace-draw-codex.js +4 -3
  278. package/dist/workspace-draw-codex.js.map +1 -1
  279. package/dist/workspace-draw-run.d.ts +19 -3
  280. package/dist/workspace-draw-run.d.ts.map +1 -1
  281. package/dist/workspace-draw-run.js +44 -4
  282. package/dist/workspace-draw-run.js.map +1 -1
  283. package/dist/workspace-draw-types.d.ts +18 -2
  284. package/dist/workspace-draw-types.d.ts.map +1 -1
  285. package/dist/workspace-draw-types.js.map +1 -1
  286. package/dist/workspace-runner-main.d.ts +9 -2
  287. package/dist/workspace-runner-main.d.ts.map +1 -1
  288. package/dist/workspace-runner-main.js +21 -2
  289. package/dist/workspace-runner-main.js.map +1 -1
  290. package/dist/workspace-runner-spawn.js +1 -1
  291. package/dist/workspace-runner-spawn.js.map +1 -1
  292. package/open-design.json +2 -2
  293. package/package.json +1 -1
  294. package/runtime/codex-conversion/bin/convert.mjs +1 -1
  295. package/runtime/codex-conversion/src/codex/caller-home.mjs +95 -0
  296. package/runtime/codex-conversion/src/codex/home.mjs +8 -2
  297. package/runtime/codex-conversion/src/images/execute.mjs +1 -1
  298. package/runtime/codex-conversion/src/images/native-invoke.mjs +21 -13
  299. package/runtime/codex-conversion/src/images/native.mjs +42 -19
  300. package/runtime/codex-conversion/src/run.mjs +2 -1
  301. package/skills/12ui-design/SKILL.md +6 -6
@@ -3,8 +3,10 @@
3
3
  * and captured by the 12ui command line while a round waits on them. It is the Inspiration tab's gallery, large view
4
4
  * and tray (mcp-slate-ui-script-inspiration-gallery.ts, mcp-slate-ui-script-inspiration-grid.ts) over the sites:
5
5
  *
6
- * - The sites arrive one by one while the tab is open (the status poll brings each, or the tab's own short watch below)
7
- * and join the end of the grid; nothing already shown moves.
6
+ * - As soon as the agents have chosen the sites (`view.pendingSites`), each shows as a placeholder tile, the loading
7
+ * surface, with its name and domain under it; its screenshot fills that tile in place when it is captured (the status
8
+ * poll brings each, or the tab's own short watch below). A site keeps the place it first took, so nothing already
9
+ * shown moves; a site that was never planned joins the end. The name and domain stay under the picture.
8
10
  * - A click selects or deselects a site exactly like an Inspiration reference (`toggleRef`: the selection for the next
9
11
  * round, or, while a round waits on the person, that round's references), with the same ring, check and tray.
10
12
  * - The large view adds Open site, which opens the live page through the host.
@@ -35,6 +37,20 @@ export const SLATE_UI_REFERENCES = String.raw `
35
37
  }
36
38
 
37
39
  function siteList() { return (state.view && state.view.sites) || []; }
40
+ function pendingSiteList() { return (state.view && state.view.pendingSites) || []; }
41
+ // Every site's place in the grid, the first time it is seen (planned or landed), per workspace.
42
+ var siteOrder = { runDir: null, ids: [] };
43
+ function orderedSiteItems() {
44
+ var byId = {};
45
+ var fresh = [];
46
+ siteList().forEach(function (site) { byId[site.id] = siteItem(site); fresh.push(site.id); });
47
+ pendingSiteList().forEach(function (site) { if (!byId[site.id]) { byId[site.id] = pendingSiteItem(site); fresh.push(site.id); } });
48
+ if (siteOrder.runDir !== state.view.runDir) siteOrder = { runDir: state.view.runDir, ids: [] };
49
+ var ids = siteOrder.ids.filter(function (id) { return !!byId[id]; });
50
+ fresh.forEach(function (id) { if (ids.indexOf(id) < 0) ids.push(id); });
51
+ siteOrder.ids = ids;
52
+ return ids.map(function (id) { return byId[id]; });
53
+ }
38
54
  function siteById(id) {
39
55
  var sites = siteList();
40
56
  for (var i = 0; i < sites.length; i++) if (sites[i].id === id) return sites[i];
@@ -48,17 +64,31 @@ export const SLATE_UI_REFERENCES = String.raw `
48
64
  }
49
65
  // A site as the gallery shows it.
50
66
  function siteItem(site) {
51
- var item = { id: site.id, label: site.title + " (" + siteDomain(site) + ")", title: site.title, sourceUrl: site.sourceUrl,
67
+ var item = { id: site.id, label: site.title + " (" + siteDomain(site) + ")", title: site.title, sourceUrl: site.sourceUrl, domain: siteDomain(site),
52
68
  aspect: "landscape", width: 1600, height: 1000, thumbUrl: site.thumbUrl || null, imageUrl: site.imageUrl || site.thumbUrl || null, srcset: "" };
53
69
  if (!item.thumbUrl) item.load = function (img, size) { fillImage(img, wantReference(site.id, size === "thumb" ? "thumb" : "ref", false)); };
54
70
  return item;
55
71
  }
56
72
 
73
+ // A site the agents chose whose screenshot is still being captured: the same shape, so it fills in without a move.
74
+ function pendingSiteItem(site) {
75
+ return { id: site.id, label: site.title + " (" + siteDomain(site) + ")", title: site.title, sourceUrl: site.sourceUrl, domain: siteDomain(site),
76
+ aspect: "landscape", width: 1600, height: 1000, thumbUrl: null, imageUrl: null, srcset: "", pending: true };
77
+ }
78
+
57
79
  // ---- the tab ----
80
+ // The line at the top of a tab: the one the person's agent wrote for this brief, else the screen's own.
81
+ function tabCaption(tab) {
82
+ var written = state.view && state.view.captions && state.view.captions[tab];
83
+ return written || t(tab === "references" ? "referencesCaption" : "inspirationCaption");
84
+ }
58
85
  function buildReferencesShell(pane, where) {
59
86
  pane.__built = true;
60
87
  pane.__where = where;
61
88
  pane.classList.add("insp", "refs", where);
89
+ var caption = el("p", "tabcaption");
90
+ pane.__caption = caption;
91
+ pane.appendChild(caption);
62
92
  var status = el("div", "status");
63
93
  status.setAttribute("data-istatus", "");
64
94
  status.setAttribute("role", "status");
@@ -68,7 +98,8 @@ export const SLATE_UI_REFERENCES = String.raw `
68
98
  where: where,
69
99
  root: function () { return where === "card" ? results : null; },
70
100
  isSelected: function (id) { return activeSelection().indexOf(id) >= 0; },
71
- onToggle: toggleRef
101
+ onToggle: toggleRef,
102
+ caption: true
72
103
  });
73
104
  var empty = el("div", "placeholder");
74
105
  results.appendChild(gallery.node);
@@ -83,16 +114,17 @@ export const SLATE_UI_REFERENCES = String.raw `
83
114
  function renderReferences(pane, where) {
84
115
  if (!state.view) return;
85
116
  if (!pane.__built) buildReferencesShell(pane, where);
117
+ pane.__caption.textContent = pane.__caption.title = tabCaption("references");
86
118
  armSiteWatch();
87
- var sites = siteList();
88
- var has = sites.length > 0;
119
+ var items = orderedSiteItems();
120
+ var has = items.length > 0;
89
121
  var emptyText = has ? "" : stillFinding() ? t("referencesFinding") : t("referencesNone");
90
122
  pane.__empty.textContent = emptyText;
91
123
  if (emptyText && !pane.__empty.parentNode) pane.__results.insertBefore(pane.__empty, pane.__gallery.node);
92
124
  else if (!emptyText && pane.__empty.parentNode) pane.__empty.parentNode.removeChild(pane.__empty);
93
125
  pane.__gallery.node.classList.toggle("hidden", !has);
94
126
  // One list per workspace: a new site only joins its end.
95
- if (has) pane.__gallery.set(state.view.runDir + ":sites", sites.map(siteItem));
127
+ if (has) pane.__gallery.set(state.view.runDir + ":sites", items);
96
128
  pane.__gallery.layout();
97
129
  pane.__gallery.sync();
98
130
  syncTray(pane);
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui-script-references.js","sourceRoot":"","sources":["../src/mcp-slate-ui-script-references.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmF5C,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui-script-references.js","sourceRoot":"","sources":["../src/mcp-slate-ui-script-references.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiH5C,CAAC"}
@@ -45,7 +45,7 @@ export const SLATE_UI_REMOTE = String.raw `
45
45
  }
46
46
  if (action.mode === "branch") {
47
47
  var root = ver(action.fromVersionId);
48
- return "Draw more pages of " + (root ? root.label : "the design") + ".";
48
+ return (action.scope === "page" ? "Draw the full page of " : "Draw more pages of ") + (root ? root.label : "the design") + ".";
49
49
  }
50
50
  if (action.mode === "like") {
51
51
  var from = ver(action.fromVersionId);
@@ -64,7 +64,7 @@ export const SLATE_UI_REMOTE = String.raw `
64
64
  function remoteChoose(version, label) {
65
65
  var handoffId = uuid4();
66
66
  return callTool(TOOLS.handoff, {
67
- runDir: state.view.runDir, handoffId: handoffId, kind: "convert", versionId: version.versionId, options: { engine: "local", output: "html" }
67
+ runDir: state.view.runDir, handoffId: handoffId, kind: "convert", versionId: version.versionId, options: { engine: "service", output: "html" }
68
68
  }).then(function (result) {
69
69
  var sc = result.structuredContent || {};
70
70
  if (sc.view) applyView(sc.view, true);
@@ -8,8 +8,13 @@
8
8
  * - Edit: draw on the design (the scribble layer, mcp-slate-ui-script-scribble.ts; the view fits the design while
9
9
  * drawing) and/or type a change, then Enter. The edit runs at once and the view closes onto the Designs tab, where
10
10
  * the new version is already a loading tile next to its source.
11
- * - Branch: optional page names, comma separated, then Enter. It draws those pages (or four the model chooses) of the
12
- * same product from this design; they land as a branch section of the Designs tab.
11
+ * - Branch: Full page or More pages (page names optional, comma separated), then Enter. It runs the branch pipeline
12
+ * on this design: the full page continued below the fold, or other pages of the same product; each screen lands on
13
+ * the branch's board in the Designs tab (mcp-slate-ui-script-board.ts).
14
+ *
15
+ * Opened from a branch's board, the view shows the screen's whole column as the continuous page it is (a web page flush,
16
+ * app states framed one by one), at the port's width, scrolling down; left and right step across the board's columns.
17
+ * The actions act on the screen at the middle of the port, whose code the bar names as it scrolls.
13
18
  *
14
19
  * Keys: Escape leaves the bar, then the view; left and right step; plus, minus, 0 (fit) and 1 (100 percent) zoom.
15
20
  * In the workspace the view covers the frame; in a card whose host has no fullscreen it opens in the card instead.
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui-script-viewer.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-script-viewer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,eAAe,QAmY3B,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui-script-viewer.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-script-viewer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,QAmgB3B,CAAC"}
@@ -8,31 +8,37 @@
8
8
  * - Edit: draw on the design (the scribble layer, mcp-slate-ui-script-scribble.ts; the view fits the design while
9
9
  * drawing) and/or type a change, then Enter. The edit runs at once and the view closes onto the Designs tab, where
10
10
  * the new version is already a loading tile next to its source.
11
- * - Branch: optional page names, comma separated, then Enter. It draws those pages (or four the model chooses) of the
12
- * same product from this design; they land as a branch section of the Designs tab.
11
+ * - Branch: Full page or More pages (page names optional, comma separated), then Enter. It runs the branch pipeline
12
+ * on this design: the full page continued below the fold, or other pages of the same product; each screen lands on
13
+ * the branch's board in the Designs tab (mcp-slate-ui-script-board.ts).
14
+ *
15
+ * Opened from a branch's board, the view shows the screen's whole column as the continuous page it is (a web page flush,
16
+ * app states framed one by one), at the port's width, scrolling down; left and right step across the board's columns.
17
+ * The actions act on the screen at the middle of the port, whose code the bar names as it scrolls.
13
18
  *
14
19
  * Keys: Escape leaves the bar, then the view; left and right step; plus, minus, 0 (fit) and 1 (100 percent) zoom.
15
20
  * In the workspace the view covers the frame; in a card whose host has no fullscreen it opens in the card instead.
16
21
  */
17
22
  export const SLATE_UI_VIEWER = String.raw `
18
23
  var ZOOM_MAX = 8;
19
- var BRANCH_DEFAULT_PAGES = 4;
20
- var BRANCH_MAX_PAGES = 8;
24
+ var BRANCH_MAX_PAGES = 4;
21
25
  var PAGE_NAME_CHARS = 60;
22
26
 
23
27
  // Open the view on a version, optionally straight onto its edit or branch bar. From the card it asks for the workspace.
24
- function openViewer(versionId, mode) {
28
+ function openViewer(versionId, mode, board) {
25
29
  var v = ver(versionId);
26
30
  if (!v) return;
27
- state.lv = { versionId: versionId, mode: mode || null, scale: 1, x: 0, y: 0, fitted: true, prompt: "", pages: "", strokes: [], current: null, committing: false, error: "", id: uuid4(), els: {} };
31
+ state.lv = { scrollY: state.lv ? state.lv.scrollY : window.scrollY, versionId: versionId, mode: mode || null, board: board || null, focus: true, anchor: null, layout: null, scale: 1, x: 0, y: 0, fitted: true, prompt: "", pages: "", strokes: [], current: null, committing: false, error: "", id: uuid4(), els: {} };
28
32
  if (!isFullscreen() && canFullscreen()) { requestMode("fullscreen"); }
29
33
  renderAll();
30
34
  }
31
35
  function closeViewer() {
32
36
  if (!state.lv || state.lv.committing) return;
37
+ var y = state.lv.scrollY;
33
38
  state.lv = null;
34
39
  viewerHost().textContent = "";
35
40
  renderAll();
41
+ window.scrollTo(0, y);
36
42
  }
37
43
  function viewerHost() {
38
44
  if (isFullscreen()) { if (!stageBuilt) buildStageSkeleton(); return stageEls.viewer; }
@@ -40,9 +46,62 @@ export const SLATE_UI_VIEWER = String.raw `
40
46
  }
41
47
 
42
48
  function lvVersion() { return state.lv ? ver(state.lv.versionId) : null; }
49
+
50
+ function lvColumn() {
51
+ var lv = state.lv;
52
+ return lv && lv.board && !lv.mode ? boardColumn(lv.board.from, lv.board.column) : null;
53
+ }
54
+ function lvColumns() {
55
+ var lv = state.lv;
56
+ return lv && lv.board ? boardColumns(lv.board.from).filter(function (col) { return col.screens.some(boardScreenVersion); }) : [];
57
+ }
58
+ function columnLayout(col) {
59
+ var first = col.screens.map(boardScreenVersion).filter(sized)[0];
60
+ var w = first ? first.width : 1536;
61
+ var gap = col.flow === "states" ? Math.round(w * 0.03) : 0;
62
+ var bottom = 0;
63
+ var shots = col.screens.filter(function (s) { return boardScreenVersion(s) || !s.c || drawing(s.c); }).map(function (s, i) {
64
+ var v = boardScreenVersion(s);
65
+ var h = Math.round(w / (sized(v) ? v.width / v.height : boardRatio(state.lv.board.from)));
66
+ var shot = { s: s, v: v, top: bottom + (i ? gap : 0), height: h };
67
+ bottom = shot.top + h;
68
+ return shot;
69
+ });
70
+ return { w: w, h: bottom, flow: col.flow, shots: shots };
71
+ }
72
+ function stageSize() {
73
+ var lv = state.lv;
74
+ if (lv && lv.layout && !lv.mode) return { w: lv.layout.w, h: lv.layout.h };
75
+ var v = lvVersion();
76
+ return v ? { w: v.width, h: v.height } : null;
77
+ }
78
+ function scrolls() { var lv = state.lv; return !!(lv && lv.layout && !lv.mode && lv.layout.shots.length > 1); }
79
+ function followScroll() {
80
+ var lv = state.lv;
81
+ var size = portSize();
82
+ if (!lv || !lv.layout || lv.mode || !size) return;
83
+ var mid = (size.h / 2 - lv.y) / lv.scale;
84
+ var shown = lv.layout.shots.filter(function (sh) { return sh.v; });
85
+ var at = shown.filter(function (sh) { return sh.top <= mid; }).pop() || shown[0];
86
+ if (at && at.v.versionId !== lv.versionId) { lv.versionId = at.v.versionId; syncViewerTarget(); }
87
+ }
88
+
43
89
  function stepViewer(delta) {
44
90
  var lv = state.lv;
45
91
  if (!lv || lv.mode) return;
92
+ if (lv.board) {
93
+ var cols = lvColumns();
94
+ var col = cols[cols.findIndex(function (x) { return x.index === lv.board.column; }) + delta];
95
+ if (!col) return;
96
+ lv.board = { from: lv.board.from, column: col.index };
97
+ lv.versionId = col.screens.map(boardScreenVersion).filter(Boolean)[0].versionId;
98
+ lv.fitted = true;
99
+ lv.anchor = 0;
100
+ lv.error = "";
101
+ lv.built = null;
102
+ renderViewer();
103
+ return;
104
+ }
46
105
  var order = viewerOrder();
47
106
  var at = order.findIndex(function (x) { return x.versionId === lv.versionId; });
48
107
  var next = order[at + delta];
@@ -63,8 +122,12 @@ export const SLATE_UI_VIEWER = String.raw `
63
122
  var v = lvVersion();
64
123
  if (!v) { state.lv = null; host.textContent = ""; return; }
65
124
  var c = cand(v.candidateId);
66
- var sig = JSON.stringify([v.versionId, v.sha256, lv.mode, samePick(v), state.busy, v.editable, localImage().ready, moreBusy(), viewerOrder().map(function (x) { return x.versionId; })]);
67
- if (lv.built === sig && host.firstChild) { syncViewerForm(); return; }
125
+ var col = lvColumn();
126
+ lv.layout = col ? columnLayout(col) : null;
127
+ var sig = lv.layout
128
+ ? JSON.stringify([lv.board, lv.layout.flow, lv.layout.shots.map(function (sh) { return sh.v ? sh.v.sha256 : sh.height; }), lvColumns().length])
129
+ : JSON.stringify([v.versionId, v.sha256, lv.mode, lv.scope, samePick(v), state.busy, v.editable, localImage().ready, moreBusy(), viewerOrder().map(function (x) { return x.versionId; })]);
130
+ if (lv.built === sig && host.firstChild) { syncViewerTarget(); syncViewerForm(); return; }
68
131
  lv.built = sig;
69
132
  host.textContent = "";
70
133
  var box = el("div", "lv");
@@ -73,17 +136,13 @@ export const SLATE_UI_VIEWER = String.raw `
73
136
  box.setAttribute("aria-label", tileName(c, v));
74
137
 
75
138
  var bar = el("div", "lvbar");
76
- var tag = el("span", "dtag");
77
- tag.appendChild(el("b", "code", v.label));
78
- var from = parentLabel(v);
79
- if (from) tag.appendChild(el("span", "dfrom", t("fromLabel", { label: from })));
80
- var page = pageName(c);
81
- if (page) tag.appendChild(el("span", "dpage", page));
82
- if (samePick(v)) { var chosen = el("span", "dchosen inline"); chosen.innerHTML = svgIcon(ICON.choose, 13); chosen.appendChild(el("span", "sr", t("chosen"))); tag.appendChild(chosen); }
83
- bar.appendChild(tag);
139
+ lv.els.tag = viewerTag(v);
140
+ bar.appendChild(lv.els.tag);
84
141
  bar.appendChild(el("span", "spacer"));
85
- var order = viewerOrder();
86
- var at = order.findIndex(function (x) { return x.versionId === v.versionId; });
142
+ var order = lv.board ? lvColumns() : viewerOrder();
143
+ var at = lv.board
144
+ ? order.findIndex(function (x) { return x.index === lv.board.column; })
145
+ : order.findIndex(function (x) { return x.versionId === v.versionId; });
87
146
  var prev = iconAction(t("previous"), ICON.left, function () { stepViewer(-1); });
88
147
  prev.disabled = at <= 0 || !!lv.mode;
89
148
  var next = iconAction(t("next"), ICON.right, function () { stepViewer(1); });
@@ -95,17 +154,30 @@ export const SLATE_UI_VIEWER = String.raw `
95
154
  box.appendChild(bar);
96
155
 
97
156
  var port = el("div", "lvport" + (lv.mode === "edit" ? " drawing" : ""));
98
- port.style.setProperty("--ar", String(v.width / v.height));
157
+ var size = stageSize();
158
+ port.style.setProperty("--ar", String(lv.layout ? lv.layout.w / lv.layout.shots[0].height : v.width / v.height));
99
159
  var stageBox = el("div", "lvstage");
100
- stageBox.style.width = v.width + "px";
101
- stageBox.style.height = v.height + "px";
102
- var img = el("img", "lvimg empty");
103
- img.alt = tileName(c, v);
104
- img.setAttribute("draggable", "false");
105
- var cached = state.fulls[imageKey(v, "full")] || state.thumbs[imageKey(v, "thumb")];
106
- if (cached) { img.src = cached; img.classList.remove("empty"); }
107
- bindImage(img, v, "full", true);
108
- stageBox.appendChild(img);
160
+ stageBox.style.width = size.w + "px";
161
+ stageBox.style.height = size.h + "px";
162
+ if (lv.layout) {
163
+ stageBox.classList.add("column");
164
+ stageBox.setAttribute("data-flow", lv.layout.flow);
165
+ lv.layout.shots.forEach(function (sh) {
166
+ var part = el("div", "lvshot" + (sh.v ? "" : " loading shimmer"));
167
+ part.style.top = sh.top + "px";
168
+ part.style.height = sh.height + "px";
169
+ if (sh.v) part.appendChild(viewerImage(sh.v, sh.s.c ? tileName(sh.s.c, sh.v) : t("versionName", { label: sh.v.label })));
170
+ else part.appendChild(el("span", "spin"));
171
+ stageBox.appendChild(part);
172
+ });
173
+ if (lv.focus) {
174
+ var shot = lv.layout.shots.filter(function (sh) { return sh.v && sh.v.versionId === lv.versionId; })[0];
175
+ lv.anchor = shot ? shot.top : 0;
176
+ lv.focus = false;
177
+ }
178
+ } else {
179
+ stageBox.appendChild(viewerImage(v, tileName(c, v)));
180
+ }
109
181
  port.appendChild(stageBox);
110
182
  if (lv.mode === "edit") scribbleAttach(stageBox, lv);
111
183
  var zoom = el("div", "lvzoom");
@@ -125,7 +197,8 @@ export const SLATE_UI_VIEWER = String.raw `
125
197
  var foot = el("div", "lvfoot");
126
198
  if (lv.mode === "edit") foot.appendChild(editForm(v));
127
199
  else if (lv.mode === "branch") foot.appendChild(branchForm(v));
128
- else foot.appendChild(viewerActions(v));
200
+ else { lv.els.acts = viewerActions(v); foot.appendChild(lv.els.acts); }
201
+ lv.els.target = targetSig(v);
129
202
  lv.els.alert = el("p", "alert");
130
203
  lv.els.alert.setAttribute("role", "alert");
131
204
  foot.appendChild(lv.els.alert);
@@ -137,6 +210,40 @@ export const SLATE_UI_VIEWER = String.raw `
137
210
  if (first && first.focus && lv.mode) first.focus();
138
211
  }
139
212
 
213
+ function viewerImage(v, alt) {
214
+ var img = el("img", "lvimg empty");
215
+ img.alt = alt;
216
+ img.setAttribute("draggable", "false");
217
+ var cached = state.fulls[imageKey(v, "full")] || state.thumbs[imageKey(v, "thumb")];
218
+ if (cached) { img.src = cached; img.classList.remove("empty"); }
219
+ bindImage(img, v, "full", true);
220
+ return img;
221
+ }
222
+ function viewerTag(v) {
223
+ var tag = el("span", "dtag");
224
+ tag.appendChild(el("b", "code", v.label));
225
+ var from = parentLabel(v);
226
+ if (from) tag.appendChild(el("span", "dfrom", t("fromLabel", { label: from })));
227
+ var c = cand(v.candidateId);
228
+ var page = c ? pageName(c) : "";
229
+ if (page) tag.appendChild(el("span", "dpage", page));
230
+ if (samePick(v)) { var chosen = el("span", "dchosen inline"); chosen.innerHTML = svgIcon(ICON.choose, 13); chosen.appendChild(el("span", "sr", t("chosen"))); tag.appendChild(chosen); }
231
+ return tag;
232
+ }
233
+ function targetSig(v) { return JSON.stringify([v.versionId, samePick(v), state.busy, v.editable, localImage().ready]); }
234
+ function syncViewerTarget() {
235
+ var lv = state.lv;
236
+ var v = lvVersion();
237
+ if (!lv || !v || lv.mode || !lv.els.tag || !lv.els.acts || lv.els.target === targetSig(v)) return;
238
+ lv.els.target = targetSig(v);
239
+ var tag = viewerTag(v);
240
+ lv.els.tag.replaceWith(tag);
241
+ lv.els.tag = tag;
242
+ var acts = viewerActions(v);
243
+ lv.els.acts.replaceWith(acts);
244
+ lv.els.acts = acts;
245
+ }
246
+
140
247
  function viewerActions(v) {
141
248
  var row = el("div", "lvacts");
142
249
  row.setAttribute("role", "toolbar");
@@ -162,6 +269,7 @@ export const SLATE_UI_VIEWER = String.raw `
162
269
  lv.current = null;
163
270
  lv.fitted = true;
164
271
  lv.built = null;
272
+ if (!mode && lv.board) lv.focus = true;
165
273
  renderViewer();
166
274
  }
167
275
 
@@ -199,25 +307,44 @@ export const SLATE_UI_VIEWER = String.raw `
199
307
  form.addEventListener("submit", function (e) { e.preventDefault(); commitViewer(); });
200
308
  return form;
201
309
  }
202
- // ---- branch: optional page names ----
310
+ // ---- branch: the full page, or more pages (names optional) ----
203
311
  function branchPages(text) {
204
312
  return String(text || "").split(/[,\n;]/).map(function (p) { return p.replace(/\s+/g, " ").trim().slice(0, PAGE_NAME_CHARS); }).filter(Boolean).slice(0, BRANCH_MAX_PAGES);
205
313
  }
314
+ function branchScope() { var lv = state.lv; return lv && lv.scope === "site" ? "site" : "page"; }
206
315
  function branchForm(v) {
207
316
  var lv = state.lv;
208
317
  var form = el("form", "lvform");
209
318
  form.setAttribute("aria-label", t("branch"));
210
319
  form.appendChild(modeMark(ICON.branch));
211
- var input = el("input");
212
- input.type = "text";
213
- input.className = "lvinput";
214
- input.placeholder = t("branchPages");
215
- input.setAttribute("aria-label", t("branchPages"));
216
- input.value = lv.pages;
217
- input.addEventListener("input", function () { lv.pages = input.value; });
218
- enterApplies(input);
320
+ var seg = el("div", "seg lvscope");
321
+ seg.setAttribute("role", "radiogroup");
322
+ seg.setAttribute("aria-label", t("branch"));
323
+ [["page", t("fullPage")], ["site", t("morePages")]].forEach(function (choice) {
324
+ var b = button(choice[1], "segbtn", function () {
325
+ if (branchScope() === choice[0]) return;
326
+ lv.scope = choice[0];
327
+ renderViewer();
328
+ });
329
+ b.setAttribute("role", "radio");
330
+ b.setAttribute("aria-checked", branchScope() === choice[0] ? "true" : "false");
331
+ seg.appendChild(b);
332
+ });
333
+ form.appendChild(seg);
334
+ if (branchScope() === "site") {
335
+ var input = el("input");
336
+ input.type = "text";
337
+ input.className = "lvinput";
338
+ input.placeholder = t("branchPages");
339
+ input.setAttribute("aria-label", t("branchPages"));
340
+ input.value = lv.pages;
341
+ input.addEventListener("input", function () { lv.pages = input.value; });
342
+ enterApplies(input);
343
+ form.appendChild(input);
344
+ } else {
345
+ form.appendChild(el("span", "spacer"));
346
+ }
219
347
  lv.els.apply = iconAction(t("branch"), ICON.send, function () { commitViewer(); }, "go");
220
- form.appendChild(input);
221
348
  form.appendChild(lv.els.apply);
222
349
  form.appendChild(iconAction(t("cancel"), ICON.close, function () { setViewerMode(null); }));
223
350
  form.addEventListener("submit", function (e) { e.preventDefault(); commitViewer(); });
@@ -258,9 +385,9 @@ export const SLATE_UI_VIEWER = String.raw `
258
385
  var d = { versionId: v.versionId, prompt: lv.prompt, strokes: lv.strokes };
259
386
  work = editActionFor(d, v).then(function (action) { return runAction(action, lv.id); });
260
387
  } else {
261
- var pages = branchPages(lv.pages);
262
- var action = { kind: "round", mode: "branch", fromVersionId: v.versionId };
263
- if (pages.length) action.pages = pages; else action.count = BRANCH_DEFAULT_PAGES;
388
+ var action = { kind: "round", mode: "branch", fromVersionId: v.versionId, scope: branchScope() };
389
+ var pages = action.scope === "site" ? branchPages(lv.pages) : [];
390
+ if (pages.length) action.pages = pages;
264
391
  work = runAction(action, lv.id);
265
392
  }
266
393
  work.then(function () {
@@ -284,18 +411,19 @@ export const SLATE_UI_VIEWER = String.raw `
284
411
  return r && r.width > 0 && r.height > 0 ? { w: r.width, h: r.height } : null;
285
412
  }
286
413
  function fitScale() {
287
- var v = lvVersion();
414
+ var stage = stageSize();
288
415
  var size = portSize();
289
- if (!v || !size) return 1;
290
- return Math.min(size.w / v.width, size.h / v.height);
416
+ if (!stage || !size) return 1;
417
+ if (scrolls()) return Math.min(size.w / stage.w, 1);
418
+ return Math.min(size.w / stage.w, size.h / stage.h);
291
419
  }
292
420
  function clampPan() {
293
421
  var lv = state.lv;
294
- var v = lvVersion();
422
+ var stage = stageSize();
295
423
  var size = portSize();
296
- if (!v || !size) return;
297
- var w = v.width * lv.scale;
298
- var h = v.height * lv.scale;
424
+ if (!stage || !size) return;
425
+ var w = stage.w * lv.scale;
426
+ var h = stage.h * lv.scale;
299
427
  // Smaller than the port: centred on that axis. Larger: no gap at either edge.
300
428
  lv.x = w <= size.w ? (size.w - w) / 2 : Math.min(0, Math.max(size.w - w, lv.x));
301
429
  lv.y = h <= size.h ? (size.h - h) / 2 : Math.min(0, Math.max(size.h - h, lv.y));
@@ -304,9 +432,11 @@ export const SLATE_UI_VIEWER = String.raw `
304
432
  var lv = state.lv;
305
433
  if (!lv || !lv.els.stage) return;
306
434
  if (lv.fitted) lv.scale = fitScale();
435
+ if (lv.anchor !== null && lv.layout && !lv.mode) lv.y = -lv.anchor * lv.scale;
307
436
  clampPan();
308
437
  lv.els.stage.style.transform = "translate(" + lv.x + "px, " + lv.y + "px) scale(" + lv.scale + ")";
309
438
  if (lv.els.level) lv.els.level.textContent = Math.round(lv.scale * 100) + "%";
439
+ followScroll();
310
440
  }
311
441
  function fitViewer() { var lv = state.lv; if (!lv) return; lv.fitted = true; applyZoom(); }
312
442
  function zoomAround(next, cx, cy) {
@@ -322,6 +452,7 @@ export const SLATE_UI_VIEWER = String.raw `
322
452
  lv.y = py - (py - lv.y) * (scale / lv.scale);
323
453
  lv.scale = scale;
324
454
  lv.fitted = false;
455
+ lv.anchor = null;
325
456
  applyZoom();
326
457
  }
327
458
  function zoomBy(factor, cx, cy) { var lv = state.lv; if (lv) zoomAround(lv.scale * factor, cx, cy); }
@@ -339,7 +470,8 @@ export const SLATE_UI_VIEWER = String.raw `
339
470
  var dy = e.deltaMode === 1 ? e.deltaY * 16 : e.deltaY;
340
471
  // A trackpad pinch arrives as a wheel with ctrlKey; vertical zooms around the pointer; horizontal and Shift pan.
341
472
  if (e.ctrlKey) { zoomBy(Math.exp(-dy * 0.01), p.x, p.y); return; }
342
- if (e.shiftKey || Math.abs(dx) > Math.abs(dy)) { lv.x -= e.shiftKey && !dx ? 0 : dx; lv.y -= e.shiftKey ? dy : 0; lv.fitted = false; applyZoom(); return; }
473
+ if (scrolls() && !e.shiftKey && Math.abs(dy) >= Math.abs(dx)) { lv.anchor = null; lv.y -= dy; applyZoom(); return; }
474
+ if (e.shiftKey || Math.abs(dx) > Math.abs(dy)) { lv.anchor = null; lv.x -= e.shiftKey && !dx ? 0 : dx; lv.y -= e.shiftKey ? dy : 0; lv.fitted = false; applyZoom(); return; }
343
475
  zoomBy(Math.exp(-dy * 0.002), p.x, p.y);
344
476
  }, { passive: false });
345
477
  port.addEventListener("dblclick", function (e) {
@@ -375,6 +507,7 @@ export const SLATE_UI_VIEWER = String.raw `
375
507
  }
376
508
  lv.x += p.x - last.x;
377
509
  lv.y += p.y - last.y;
510
+ lv.anchor = null;
378
511
  lv.fitted = false;
379
512
  applyZoom();
380
513
  });
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui-script-viewer.js","sourceRoot":"","sources":["../src/mcp-slate-ui-script-viewer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmYxC,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui-script-viewer.js","sourceRoot":"","sources":["../src/mcp-slate-ui-script-viewer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmgBxC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui-script.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-script.ts"],"names":[],"mappings":"AAoBA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AA2B3D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,aAAa,KAAG,MAuB/C,CAAC;AAEb,eAAO,MAAM,eAAe,QAA8B,CAAC"}
1
+ {"version":3,"file":"mcp-slate-ui-script.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-script.ts"],"names":[],"mappings":"AAsBA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AA2B3D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,aAAa,KAAG,MAyB/C,CAAC;AAEb,eAAO,MAAM,eAAe,QAA8B,CAAC"}
@@ -3,12 +3,14 @@ import { SLATE_UI_LOCALES } from './mcp-slate-ui-locales/index.js';
3
3
  import { SLATE_EDIT_PROMPT_MAX_BYTES, SLATE_UI_TOOLS } from './slate-view-contract.js';
4
4
  import { SLATE_UI_BRIDGE } from './mcp-slate-ui-script-bridge.js';
5
5
  import { SLATE_UI_BROWSER } from './mcp-slate-ui-script-browser.js';
6
+ import { SLATE_UI_BOARD } from './mcp-slate-ui-script-board.js';
6
7
  import { SLATE_UI_DESIGNS } from './mcp-slate-ui-script-designs.js';
7
8
  import { SLATE_UI_EDIT } from './mcp-slate-ui-script-edit.js';
8
9
  import { SLATE_UI_INLINE } from './mcp-slate-ui-script-inline.js';
9
10
  import { SLATE_UI_INSPIRATION } from './mcp-slate-ui-script-inspiration.js';
10
11
  import { buildSlateUiL10n } from './mcp-slate-ui-script-l10n.js';
11
12
  import { SLATE_UI_MORE } from './mcp-slate-ui-script-more.js';
13
+ import { SLATE_UI_PEEK } from './mcp-slate-ui-script-peek.js';
12
14
  import { SLATE_UI_NO_PAUSE, SLATE_UI_PAUSE } from './mcp-slate-ui-script-pause.js';
13
15
  import { SLATE_UI_REFERENCES } from './mcp-slate-ui-script-references.js';
14
16
  import { SLATE_UI_REMOTE } from './mcp-slate-ui-script-remote.js';
@@ -59,6 +61,7 @@ export const buildSlateUiScript = (target) => [
59
61
  SLATE_UI_REFERENCES,
60
62
  target === 'remote' ? SLATE_UI_PAUSE : SLATE_UI_NO_PAUSE,
61
63
  SLATE_UI_DESIGNS,
64
+ SLATE_UI_BOARD,
62
65
  SLATE_UI_VIEWER,
63
66
  SLATE_UI_STAGE,
64
67
  SLATE_UI_EDIT.replace('__EDIT_PROMPT_MAX_BYTES__', () => JSON.stringify(SLATE_EDIT_PROMPT_MAX_BYTES)),
@@ -66,6 +69,7 @@ export const buildSlateUiScript = (target) => [
66
69
  SLATE_UI_SCRIBBLE,
67
70
  SLATE_UI_REMOTE,
68
71
  SLATE_UI_BROWSER,
72
+ SLATE_UI_PEEK,
69
73
  HANDSHAKE,
70
74
  '})();',
71
75
  ].join('\n');
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-slate-ui-script.js","sourceRoot":"","sources":["../src/mcp-slate-ui-script.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-slate-ui-script.js","sourceRoot":"","sources":["../src/mcp-slate-ui-script.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * A branch's board (mcp-slate-ui-script-board.ts) and its column in the large view. Columns run across and scroll when
3
+ * the board is wider than the frame: about two at the Codex inline width, four at 1440 px, one and a bit on a phone. A
4
+ * web page's column is one frame with its screens flush (no gap, no seam); an app's column frames each state on its own.
5
+ */
6
+ export declare const SLATE_UI_BOARD_STYLES: string;
7
+ //# sourceMappingURL=mcp-slate-ui-styles-board.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-slate-ui-styles-board.d.ts","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-board.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAuBjC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * A branch's board (mcp-slate-ui-script-board.ts) and its column in the large view. Columns run across and scroll when
3
+ * the board is wider than the frame: about two at the Codex inline width, four at 1440 px, one and a bit on a phone. A
4
+ * web page's column is one frame with its screens flush (no gap, no seam); an app's column frames each state on its own.
5
+ */
6
+ export const SLATE_UI_BOARD_STYLES = String.raw `
7
+ .dboard { display: flex; align-items: flex-start; gap: 20px; min-width: 0; overflow-x: auto; padding: 2px 2px 10px; scrollbar-width: thin; }
8
+ .bcol { flex: none; width: max(min(340px, 44%), min(260px, 80%)); min-width: 0; }
9
+ .bchead { display: flex; align-items: center; gap: 6px; min-width: 0; min-height: 24px; margin-bottom: 8px; }
10
+ .bctitle { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; font-weight: 600; }
11
+ .bctitle.waiting { width: 45%; height: 12px; border-radius: 6px; background: var(--fill); }
12
+ .bstack { position: relative; display: flex; flex-direction: column; border-radius: var(--radius); overflow: hidden; background: var(--fill); }
13
+ .bstack::after, .bcol[data-flow="states"] .bshot::after { content: ""; position: absolute; inset: 0; border-radius: inherit; box-shadow: inset 0 0 0 1px var(--border2); pointer-events: none; }
14
+ .bcol[data-flow="states"] .bstack { gap: 10px; border-radius: 0; overflow: visible; background: none; }
15
+ .bcol[data-flow="states"] .bstack::after { display: none; }
16
+ .bcol[data-flow="states"] .bshot { border-radius: var(--radius); overflow: hidden; background: var(--fill); }
17
+
18
+ .bshot { position: relative; min-width: 0; }
19
+ button.bface { position: relative; display: block; width: 100%; aspect-ratio: var(--ar, 1.5); padding: 0; border: 0; border-radius: 0; background: var(--fill); overflow: hidden; cursor: zoom-in; }
20
+ button.bface:disabled { opacity: 1; cursor: default; }
21
+ .bface .thumb { display: block; width: 100%; height: 100%; object-fit: cover; }
22
+ .bface .thumb:not([src]) { visibility: hidden; }
23
+ .bshot.chosen::before { content: ""; position: absolute; inset: 0; z-index: 1; box-shadow: inset 0 0 0 3px var(--ring); pointer-events: none; }
24
+ .bshot:hover .dpick, .bshot:focus-within .dpick { opacity: 1; }
25
+ .lvstage.column { box-shadow: none; }
26
+ .lvstage.column[data-flow="page"] { box-shadow: var(--elev-lg); }
27
+ .lvshot { position: absolute; left: 0; width: 100%; overflow: hidden; background: var(--bg); }
28
+ .lvstage.column[data-flow="states"] .lvshot { box-shadow: var(--elev-lg); }
29
+ `;
30
+ //# sourceMappingURL=mcp-slate-ui-styles-board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-slate-ui-styles-board.js","sourceRoot":"","sources":["../src/mcp-slate-ui-styles-board.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;CAuB9C,CAAC"}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * The Designs tab and the large view. Tiles are large and keep the frame's shape (`--ar` per tile); a grid's columns
3
3
  * are no narrower than `--tile` times the square root of its ratio (`--shape`), so a 3:2 design is about 160 px wide on
4
- * a phone (two across), 220 px in a card (three across) and 300 px in the workspace (four across at 1440 px). Under
4
+ * a phone (two across), 300 px in a card (two across in Codex's inline frame) and 400 px in the workspace (three across
5
+ * at 1440 px). A slot being drawn is the loading surface (mcp-slate-ui-styles-loading.ts). Under
5
6
  * each picture is one row: the code (and where it came from, or its page) at the left, the four icon actions at the
6
7
  * right, so nothing covers the design. The chosen design has the selection's own language: a thick ring in the host's
7
8
  * accent and a filled check on the picture.