@jxsuite/studio 6.1.1 → 8.0.0

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 (785) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  4. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  5. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  6. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  7. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  8. package/dist/chunks/color-area-6rbra5dy.js +4 -0
  9. package/dist/chunks/color-field-gy56c94g.js +4 -0
  10. package/dist/chunks/color-m7r1vk54.js +4 -0
  11. package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
  12. package/dist/chunks/combobox-72h32ejk.js +4 -0
  13. package/dist/chunks/components-r22xca09.js +4 -0
  14. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  15. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  16. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  17. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  18. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  19. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  20. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  21. package/dist/chunks/files-rcn56qvm.js +4 -0
  22. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  23. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  24. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  25. package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
  26. package/dist/chunks/icons-63bjtbs7.js +4 -0
  27. package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
  28. package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
  29. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  30. package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
  31. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  32. package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
  33. package/dist/chunks/index-f0jn7nnp.js +4 -0
  34. package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
  35. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  36. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  37. package/dist/chunks/layers-bgyr11tr.js +4 -0
  38. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  39. package/dist/chunks/listbox-c421cf8c.js +4 -0
  40. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  41. package/dist/chunks/media-library-sq468wts.js +4 -0
  42. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  43. package/dist/chunks/menu-bdpzbfvs.js +4 -0
  44. package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
  45. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  46. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  47. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  48. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  49. package/dist/chunks/parse-v77xtwv7.js +4 -0
  50. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  51. package/dist/chunks/popover-b89sfej7.js +4 -0
  52. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  53. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  54. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  55. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  56. package/dist/chunks/references-9547rg5s.js +4 -0
  57. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  58. package/dist/chunks/select-rzds841e.js +4 -0
  59. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  60. package/dist/chunks/split-c9zfdgxf.js +4 -0
  61. package/dist/chunks/studio-03ct6yfv.js +9 -0
  62. package/dist/chunks/studio-07rcfje3.js +5 -0
  63. package/dist/chunks/studio-3e54qh39.js +7 -0
  64. package/dist/chunks/studio-3exxhz5g.js +5 -0
  65. package/dist/chunks/studio-3q40e3rj.js +5 -0
  66. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  67. package/dist/chunks/studio-3qqjeep5.js +6 -0
  68. package/dist/chunks/studio-43sd2mam.js +4 -0
  69. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  70. package/dist/chunks/studio-58xg6j2q.js +9 -0
  71. package/dist/chunks/studio-5g0rprdt.js +7 -0
  72. package/dist/chunks/studio-6m380wp7.js +5 -0
  73. package/dist/chunks/studio-80jyh1xh.js +4 -0
  74. package/dist/chunks/studio-83mk4bgg.js +9 -0
  75. package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
  76. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  77. package/dist/chunks/studio-8tr6cfrc.js +5 -0
  78. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  79. package/dist/chunks/studio-9tmebf0s.js +5 -0
  80. package/dist/chunks/studio-a2bvaptz.js +5 -0
  81. package/dist/chunks/studio-b7y5mr30.js +5 -0
  82. package/dist/chunks/studio-bavb31r0.js +5 -0
  83. package/dist/chunks/studio-bbe4c90a.js +5 -0
  84. package/dist/chunks/studio-c05wdnt3.js +5 -0
  85. package/dist/chunks/studio-ccv2svc6.js +5 -0
  86. package/dist/chunks/studio-d5grtb9e.js +16 -0
  87. package/dist/chunks/studio-df0baea9.js +5 -0
  88. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  89. package/dist/chunks/studio-e1g64q43.js +5 -0
  90. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  91. package/dist/chunks/studio-ed3xx40h.js +7 -0
  92. package/dist/chunks/studio-f14e1zdj.js +5 -0
  93. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  94. package/dist/chunks/studio-fyh0jc96.js +5 -0
  95. package/dist/chunks/studio-gcxk20n7.js +5 -0
  96. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  97. package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
  98. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  99. package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
  100. package/dist/chunks/studio-k7evxqh4.js +5 -0
  101. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  102. package/dist/chunks/studio-m8g16bgz.js +5 -0
  103. package/dist/chunks/studio-mn0476ag.js +5 -0
  104. package/dist/chunks/studio-mx1smyq0.js +5 -0
  105. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  106. package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
  107. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  108. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  109. package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
  110. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  111. package/dist/chunks/studio-ph84avkf.js +5 -0
  112. package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
  113. package/dist/chunks/studio-q0tccd43.js +5 -0
  114. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  115. package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
  116. package/dist/chunks/studio-qmn1xc24.js +5 -0
  117. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  118. package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
  119. package/dist/chunks/studio-rj9eamf8.js +5 -0
  120. package/dist/chunks/studio-rptgsk96.js +5 -0
  121. package/dist/chunks/studio-rthyg42z.js +928 -0
  122. package/dist/chunks/studio-s19tp1xr.js +5 -0
  123. package/dist/chunks/studio-s32578pn.js +5 -0
  124. package/dist/chunks/studio-svb7yyve.js +5 -0
  125. package/dist/chunks/studio-syreb644.js +5 -0
  126. package/dist/chunks/studio-tf9jryb1.js +10 -0
  127. package/dist/chunks/studio-tfkznv39.js +5 -0
  128. package/dist/chunks/studio-tft6r105.js +5 -0
  129. package/dist/chunks/studio-txf2kysx.js +5 -0
  130. package/dist/chunks/studio-v8867ddv.js +12 -0
  131. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  132. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  133. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  134. package/dist/chunks/studio-wc649wss.js +5 -0
  135. package/dist/chunks/studio-wys23mxz.js +5 -0
  136. package/dist/chunks/studio-x1x167jh.js +5 -0
  137. package/dist/chunks/studio-x9hsze61.js +5 -0
  138. package/dist/chunks/studio-y0n7yxea.js +9 -0
  139. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  140. package/dist/chunks/studio-z97c48fk.js +5 -0
  141. package/dist/chunks/studio-zat62m0c.js +5 -0
  142. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  143. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  144. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  145. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  146. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  147. package/dist/chunks/toast-1gv0h53h.js +4 -0
  148. package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
  149. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  150. package/dist/chunks/tooltip-yypz28gq.js +4 -0
  151. package/dist/chunks/tree-9xa4hm7n.js +4 -0
  152. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  153. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  154. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  155. package/dist/chunks/ws-client-bv552sfx.js +4 -0
  156. package/dist/iframe-entry.js +20 -16
  157. package/dist/manifest.json +77 -63
  158. package/dist/studio.js +106 -107
  159. package/dist/workers/ts.worker.js +3 -3
  160. package/package.json +17 -16
  161. package/src/about/about-modal.ts +4 -3
  162. package/src/account/action-flow.ts +45 -38
  163. package/src/account-status.ts +7 -2
  164. package/src/browse/component-examples.ts +272 -0
  165. package/src/browse/library-commands.ts +64 -104
  166. package/src/browse/library-layouts.ts +270 -53
  167. package/src/browse/library-model.ts +194 -134
  168. package/src/browse/library-pane.ts +748 -440
  169. package/src/browse/library-preview.ts +161 -26
  170. package/src/browse/library-source.ts +308 -41
  171. package/src/browse/preview-root.ts +78 -0
  172. package/src/browse/preview-style.ts +155 -0
  173. package/src/canvas/asset-refs.ts +40 -10
  174. package/src/canvas/asset-resolve.ts +19 -23
  175. package/src/canvas/canvas-helpers.ts +7 -6
  176. package/src/canvas/canvas-live-render.ts +260 -77
  177. package/src/canvas/canvas-origin.ts +37 -12
  178. package/src/canvas/canvas-page-context.ts +112 -0
  179. package/src/canvas/canvas-patcher.ts +30 -30
  180. package/src/canvas/canvas-perf.ts +11 -5
  181. package/src/canvas/canvas-render.ts +175 -148
  182. package/src/canvas/canvas-surface.ts +5 -3
  183. package/src/canvas/canvas-utils.ts +147 -61
  184. package/src/canvas/dialog-path.ts +9 -4
  185. package/src/canvas/dialog-state.ts +1 -2
  186. package/src/canvas/diff-marks.ts +9 -16
  187. package/src/canvas/diff-toolbar.ts +8 -7
  188. package/src/canvas/edit-width-drag.ts +4 -1
  189. package/src/canvas/edit-width.ts +1 -3
  190. package/src/canvas/iframe-channel.ts +27 -13
  191. package/src/canvas/iframe-drop.ts +120 -12
  192. package/src/canvas/iframe-editable-root.ts +29 -16
  193. package/src/canvas/iframe-entry.ts +104 -75
  194. package/src/canvas/iframe-eval.ts +73 -49
  195. package/src/canvas/iframe-host.ts +269 -158
  196. package/src/canvas/iframe-inline-edit.ts +49 -30
  197. package/src/canvas/iframe-insert.ts +5 -4
  198. package/src/canvas/iframe-interaction.ts +30 -25
  199. package/src/canvas/iframe-keys.ts +11 -0
  200. package/src/canvas/iframe-overlay.ts +1 -1
  201. package/src/canvas/iframe-patch.ts +25 -21
  202. package/src/canvas/iframe-position.ts +12 -6
  203. package/src/canvas/iframe-protocol.ts +36 -21
  204. package/src/canvas/iframe-render.ts +84 -35
  205. package/src/canvas/iframe-slash.ts +24 -11
  206. package/src/canvas/iframe-subtree.ts +10 -3
  207. package/src/canvas/npm-modules.ts +22 -0
  208. package/src/canvas/path-mapping.ts +19 -12
  209. package/src/canvas/popover-path.ts +7 -3
  210. package/src/canvas/popover-state.ts +1 -2
  211. package/src/canvas/preview-navigate.ts +16 -0
  212. package/src/canvas/repeater-sources.ts +200 -0
  213. package/src/canvas/serialize-scope.ts +13 -5
  214. package/src/canvas/stage-scrollbar.ts +7 -2
  215. package/src/canvas/surface-registry.ts +27 -3
  216. package/src/collab/collab-commands.ts +7 -2
  217. package/src/collab/collab-session.ts +84 -45
  218. package/src/collab/collab-state.ts +4 -3
  219. package/src/collab/monaco-binding.ts +16 -13
  220. package/src/collab/monaco-cursors.ts +5 -2
  221. package/src/commands/app-commands.ts +16 -6
  222. package/src/commands/budget.ts +13 -11
  223. package/src/commands/command-args.ts +103 -71
  224. package/src/commands/context.ts +55 -28
  225. package/src/commands/defaults.ts +69 -45
  226. package/src/commands/keymap.ts +56 -43
  227. package/src/commands/levels.ts +14 -8
  228. package/src/commands/live-context.ts +9 -7
  229. package/src/commands/reference.ts +2 -1
  230. package/src/commands/registry.ts +22 -11
  231. package/src/commands/run-reported.ts +15 -10
  232. package/src/component-props.ts +46 -30
  233. package/src/content/collection-match.ts +11 -9
  234. package/src/content/collection-pages.ts +412 -0
  235. package/src/content/content-collections.ts +270 -0
  236. package/src/content/draft-state.ts +4 -3
  237. package/src/content/entry-commands.ts +54 -62
  238. package/src/content/entry-editor.ts +137 -32
  239. package/src/content/entry-fields.ts +25 -8
  240. package/src/content/entry-inspector.ts +225 -0
  241. package/src/content/entry-model.ts +38 -15
  242. package/src/content/entry-open.ts +80 -0
  243. package/src/content/entry-summaries.ts +440 -0
  244. package/src/content/file-record-ids.ts +80 -0
  245. package/src/content/file-records.ts +125 -0
  246. package/src/content/page-summaries.ts +129 -0
  247. package/src/content/record-entry.ts +201 -0
  248. package/src/content/writing-banner.ts +177 -0
  249. package/src/create/add-new-commands.ts +185 -0
  250. package/src/create/add-new-flow.ts +1116 -0
  251. package/src/create/add-new.ts +1014 -0
  252. package/src/create/element-name.ts +121 -0
  253. package/src/editor/canvas-context-menu.ts +1 -2
  254. package/src/editor/canvas-slash-bridge.ts +3 -6
  255. package/src/editor/content-slice.ts +16 -14
  256. package/src/editor/context-menu.ts +35 -22
  257. package/src/editor/convert-targets.ts +30 -35
  258. package/src/editor/convert-to-component.ts +78 -48
  259. package/src/editor/convert-to-repeater.ts +34 -22
  260. package/src/editor/editable-tags.ts +17 -2
  261. package/src/editor/file-drop-action.ts +29 -22
  262. package/src/editor/inline-edit-apply.ts +79 -17
  263. package/src/editor/inline-edit.ts +76 -50
  264. package/src/editor/inline-format.ts +59 -56
  265. package/src/editor/inline-link.ts +40 -15
  266. package/src/editor/insert-component.ts +91 -0
  267. package/src/editor/insert-zone-action.ts +14 -5
  268. package/src/editor/merge-tags.ts +58 -19
  269. package/src/editor/repeater-scope.ts +39 -28
  270. package/src/editor/shortcuts.ts +76 -42
  271. package/src/editor/slash-menu.ts +52 -14
  272. package/src/files/asset-versions.ts +4 -4
  273. package/src/files/components.ts +89 -20
  274. package/src/files/elements.ts +5 -6
  275. package/src/files/file-ops.ts +92 -41
  276. package/src/files/files.ts +248 -239
  277. package/src/files/fs-events.ts +18 -7
  278. package/src/files/media-meta.ts +97 -2
  279. package/src/files/media-paths.ts +3 -0
  280. package/src/files/media-types.ts +55 -0
  281. package/src/files/media-upload.ts +209 -52
  282. package/src/files/new-file-name.ts +156 -0
  283. package/src/files/serialize-document.ts +15 -5
  284. package/src/format/constraints.ts +1 -1
  285. package/src/format/convert-file.ts +27 -13
  286. package/src/format/format-choices.ts +2 -1
  287. package/src/format/format-host.ts +91 -50
  288. package/src/github/github-auth-status.ts +27 -3
  289. package/src/github/github-auth.ts +21 -11
  290. package/src/github/github-publish.ts +28 -23
  291. package/src/grid/cell-editors.ts +46 -31
  292. package/src/grid/cell-popovers.ts +5 -3
  293. package/src/grid/edit-buffer.ts +10 -9
  294. package/src/grid/grid-controller.ts +25 -23
  295. package/src/grid/grid-layout.ts +21 -5
  296. package/src/grid/grid-open.ts +3 -33
  297. package/src/grid/grid-panel.ts +65 -6
  298. package/src/grid/grid-reveal.ts +34 -0
  299. package/src/grid/grid-source.ts +9 -31
  300. package/src/grid/grid-view.ts +45 -23
  301. package/src/grid/redirects-grid.ts +14 -5
  302. package/src/grid/redirects.ts +16 -14
  303. package/src/grid/schema-columns.ts +25 -19
  304. package/src/grid/sources/connector-source.ts +47 -20
  305. package/src/grid/sources/content-source.ts +100 -31
  306. package/src/grid/sources/csv-file-source.ts +2 -2
  307. package/src/grid/tabulator-tables.d.ts +61 -34
  308. package/src/hosting/document.ts +2 -2
  309. package/src/hosting/stage.ts +7 -7
  310. package/src/i18n/i18n-commands.ts +3 -3
  311. package/src/media/media-commands.ts +181 -0
  312. package/src/media/media-library-model.ts +232 -0
  313. package/src/media/media-library.ts +1283 -0
  314. package/src/media/media-pane.ts +51 -20
  315. package/src/new-project/add-repo-modal.ts +20 -19
  316. package/src/new-project/import-tab.ts +10 -14
  317. package/src/new-project/location-fields.ts +2 -1
  318. package/src/new-project/new-project-modal.ts +12 -9
  319. package/src/packages/jxsuite-update.ts +4 -3
  320. package/src/packages/pull-package-sync.ts +26 -25
  321. package/src/page-params.ts +97 -68
  322. package/src/panels/activity-panel.ts +38 -14
  323. package/src/panels/ai-chat/attached-context.ts +13 -7
  324. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  325. package/src/panels/ai-chat/chat-view.ts +80 -73
  326. package/src/panels/ai-chat/composer.ts +30 -33
  327. package/src/panels/ai-chat/sessions-view.ts +1 -2
  328. package/src/panels/ai-panel.ts +23 -20
  329. package/src/panels/block-action-bar.ts +57 -46
  330. package/src/panels/bottom-dock.ts +5 -3
  331. package/src/panels/canvas-dnd-bridge.ts +36 -26
  332. package/src/panels/chat-panel.ts +6 -6
  333. package/src/panels/collections-panel.ts +306 -0
  334. package/src/panels/component-preview.ts +35 -13
  335. package/src/panels/data-explorer.ts +63 -26
  336. package/src/panels/data-grid.ts +18 -11
  337. package/src/panels/dnd.ts +115 -138
  338. package/src/panels/editors.ts +52 -21
  339. package/src/panels/elements-panel.ts +19 -5
  340. package/src/panels/empty-state.ts +2 -2
  341. package/src/panels/events-panel.ts +84 -69
  342. package/src/panels/formula-workspace.ts +78 -54
  343. package/src/panels/frontmatter-fields.ts +33 -28
  344. package/src/panels/git-diff-open.ts +10 -6
  345. package/src/panels/head-panel.ts +488 -202
  346. package/src/panels/i18n-panel.ts +20 -12
  347. package/src/panels/imports-panel.ts +25 -47
  348. package/src/panels/jump-bar.ts +75 -31
  349. package/src/panels/layers-panel.ts +130 -101
  350. package/src/panels/left-panel.ts +25 -11
  351. package/src/panels/navigator-panels.ts +23 -11
  352. package/src/panels/pane-context.ts +140 -49
  353. package/src/panels/pane-grid.ts +55 -26
  354. package/src/panels/panel-registry.ts +36 -46
  355. package/src/panels/properties-panel.ts +182 -124
  356. package/src/panels/quick-search.ts +53 -31
  357. package/src/panels/right-panel.ts +201 -45
  358. package/src/panels/seo-modal.ts +54 -125
  359. package/src/panels/settings-menu.ts +63 -61
  360. package/src/panels/settings-pane.ts +268 -162
  361. package/src/panels/signals-panel.ts +156 -135
  362. package/src/panels/site-model.ts +367 -0
  363. package/src/panels/site-panel.ts +638 -0
  364. package/src/panels/statement-editor.ts +230 -140
  365. package/src/panels/style-panel.ts +253 -206
  366. package/src/panels/style-utils.ts +114 -51
  367. package/src/panels/stylebook-doc.ts +195 -60
  368. package/src/panels/stylebook-layers-panel.ts +48 -89
  369. package/src/panels/stylebook-panel.ts +60 -27
  370. package/src/panels/styles-panel.ts +327 -0
  371. package/src/panels/tab-drop.ts +27 -11
  372. package/src/panels/tab-strip.ts +143 -49
  373. package/src/platform-errors.ts +57 -43
  374. package/src/platform.ts +59 -31
  375. package/src/platforms/cloud.ts +373 -176
  376. package/src/platforms/default-platform.ts +14 -8
  377. package/src/platforms/devserver.ts +180 -142
  378. package/src/platforms/read-batcher.ts +16 -8
  379. package/src/project-list.ts +2 -1
  380. package/src/publish/deploy-checklist.ts +20 -9
  381. package/src/publish/pages-service.ts +66 -27
  382. package/src/publish/publish-changes.ts +491 -0
  383. package/src/publish/publish-commands.ts +88 -22
  384. package/src/publish/publish-ids.ts +49 -0
  385. package/src/publish/publish-panel.ts +10 -6
  386. package/src/publish/publish-quick.ts +148 -0
  387. package/src/publish/publish-workspace.ts +926 -0
  388. package/src/publish/source-control.ts +907 -0
  389. package/src/recent-projects.ts +15 -8
  390. package/src/resize-edges.ts +26 -36
  391. package/src/services/a11y-report.ts +26 -19
  392. package/src/services/agent-seed.ts +23 -11
  393. package/src/services/ai-ask.ts +9 -12
  394. package/src/services/ai-command-tools.ts +68 -62
  395. package/src/services/ai-import-tools.ts +80 -67
  396. package/src/services/ai-models.ts +17 -13
  397. package/src/services/ai-project-tools.ts +68 -32
  398. package/src/services/ai-session-store.ts +19 -10
  399. package/src/services/ai-system-prompt.ts +46 -20
  400. package/src/services/ai-tools.ts +71 -27
  401. package/src/services/ai-write-report.ts +20 -12
  402. package/src/services/ai-writes.ts +4 -4
  403. package/src/services/automation.ts +74 -51
  404. package/src/services/cem-export.ts +149 -58
  405. package/src/services/cf-settings.ts +4 -4
  406. package/src/services/clock.ts +6 -1
  407. package/src/services/code-services.ts +37 -31
  408. package/src/services/connection.ts +2 -2
  409. package/src/services/context-manager.ts +14 -10
  410. package/src/services/context-resolver.ts +20 -8
  411. package/src/services/data-service.ts +19 -15
  412. package/src/services/directory-picker.ts +20 -14
  413. package/src/services/document-assistant.ts +39 -19
  414. package/src/services/gated-registry.ts +10 -6
  415. package/src/services/harness/chat-reducer.ts +23 -1
  416. package/src/services/import-client.ts +91 -38
  417. package/src/services/import-seed.ts +8 -2
  418. package/src/services/jx-validate.ts +28 -31
  419. package/src/services/live-preview.ts +0 -0
  420. package/src/services/live-surfaces.ts +6 -3
  421. package/src/services/model-uri.ts +10 -2
  422. package/src/services/module-preloads.ts +12 -8
  423. package/src/services/monaco-buffer.ts +43 -24
  424. package/src/services/monaco-lazy.ts +7 -8
  425. package/src/services/monaco-setup.ts +23 -16
  426. package/src/services/notify.ts +44 -17
  427. package/src/services/popover-report.ts +25 -10
  428. package/src/services/preview-eval.ts +20 -8
  429. package/src/services/profile.ts +13 -6
  430. package/src/services/project-path.ts +13 -10
  431. package/src/services/references.ts +0 -0
  432. package/src/services/render-critic.ts +29 -9
  433. package/src/services/settings/definitions.ts +25 -14
  434. package/src/services/settings/kernel.ts +13 -4
  435. package/src/services/settings/write-queue.ts +9 -9
  436. package/src/services/token-lint.ts +12 -10
  437. package/src/services/tool-executor.ts +17 -5
  438. package/src/services/tool-outcomes.ts +44 -24
  439. package/src/services/trusted-types.ts +24 -7
  440. package/src/settings/contexts-section.ts +11 -8
  441. package/src/settings/contributed-section.ts +128 -70
  442. package/src/settings/css-vars-editor.ts +119 -32
  443. package/src/settings/defs-editor.ts +38 -35
  444. package/src/settings/developer-panels.ts +43 -0
  445. package/src/settings/extension-rows.ts +16 -8
  446. package/src/settings/extension-sections.ts +42 -14
  447. package/src/settings/extensions-section.ts +4 -1
  448. package/src/settings/general-settings.ts +101 -28
  449. package/src/settings/locales-section.ts +20 -12
  450. package/src/settings/preferences-dialog.ts +17 -7
  451. package/src/settings/preferences-keymap.ts +7 -5
  452. package/src/settings/preferences-sections.ts +11 -5
  453. package/src/settings/project-sections.ts +28 -11
  454. package/src/settings/schema-field-ui.ts +12 -1
  455. package/src/settings/section-registry.ts +116 -11
  456. package/src/settings/settings-dialog.ts +192 -0
  457. package/src/settings/settings-document.ts +186 -166
  458. package/src/shell/tree.ts +6 -5
  459. package/src/shell.ts +536 -477
  460. package/src/site-context.ts +101 -32
  461. package/src/state.ts +68 -57
  462. package/src/store.ts +54 -34
  463. package/src/studio.ts +219 -116
  464. package/src/style/live-preview.ts +1 -1
  465. package/src/style/project-styles.ts +40 -7
  466. package/src/style/stylebook-specimens.ts +89 -0
  467. package/src/style/stylebook-target.ts +26 -0
  468. package/src/style/tag-inheritance.ts +105 -0
  469. package/src/style/token-ref.ts +5 -4
  470. package/src/style/variables-focus.ts +61 -0
  471. package/src/style/variables-view.ts +235 -0
  472. package/src/surfaces/about.ts +18 -19
  473. package/src/surfaces/add-new.json +1482 -0
  474. package/src/surfaces/add-new.ts +325 -0
  475. package/src/surfaces/add-repo.ts +17 -19
  476. package/src/surfaces/ai-chat.ts +33 -38
  477. package/src/surfaces/ai-credentials-form.ts +6 -16
  478. package/src/surfaces/ai-managed-connect.ts +3 -4
  479. package/src/surfaces/ai-model-picker.ts +3 -5
  480. package/src/surfaces/block-action-bar.ts +22 -11
  481. package/src/surfaces/boot-failure.json +4 -3
  482. package/src/surfaces/boot-failure.ts +4 -5
  483. package/src/surfaces/bottom-dock.json +1 -1
  484. package/src/surfaces/bottom-dock.ts +9 -18
  485. package/src/surfaces/canvas-stage.json +30 -19
  486. package/src/surfaces/canvas-stage.ts +17 -16
  487. package/src/surfaces/cf-account-picker.ts +17 -18
  488. package/src/surfaces/collections-panel.json +615 -0
  489. package/src/surfaces/collections-panel.ts +168 -0
  490. package/src/surfaces/commandbar.json +241 -96
  491. package/src/surfaces/commandbar.ts +145 -105
  492. package/src/surfaces/convert-repeater.ts +17 -19
  493. package/src/surfaces/data-actions.ts +9 -7
  494. package/src/surfaces/dialog.ts +26 -28
  495. package/src/surfaces/diff-toolbar.ts +9 -7
  496. package/src/surfaces/empty-state.json +1 -1
  497. package/src/surfaces/empty-state.ts +7 -10
  498. package/src/surfaces/entry-editor.json +136 -0
  499. package/src/surfaces/entry-editor.ts +35 -11
  500. package/src/surfaces/entry-inspector.json +371 -0
  501. package/src/surfaces/entry-inspector.ts +143 -0
  502. package/src/surfaces/expression-editor.ts +11 -25
  503. package/src/surfaces/files-panel.ts +27 -14
  504. package/src/surfaces/formula-palette.ts +4 -5
  505. package/src/surfaces/github-auth.ts +16 -20
  506. package/src/surfaces/github-publish.ts +17 -22
  507. package/src/surfaces/grid-cell.ts +30 -31
  508. package/src/surfaces/grid-open.ts +10 -14
  509. package/src/surfaces/grid-panel.ts +13 -9
  510. package/src/surfaces/grid-replace.ts +13 -13
  511. package/src/surfaces/grid-views.ts +15 -18
  512. package/src/surfaces/inspector-dock.json +162 -14
  513. package/src/surfaces/inspector-dock.ts +59 -31
  514. package/src/surfaces/jump-bar.ts +5 -6
  515. package/src/surfaces/jxsuite-update.ts +16 -22
  516. package/src/surfaces/library-pane.json +670 -437
  517. package/src/surfaces/library-pane.ts +111 -77
  518. package/src/surfaces/logic-panel.ts +17 -30
  519. package/src/surfaces/logic-workspace.ts +13 -15
  520. package/src/surfaces/media-browser.json +62 -6
  521. package/src/surfaces/media-browser.ts +26 -11
  522. package/src/surfaces/media-field.json +1 -1
  523. package/src/surfaces/media-field.ts +4 -5
  524. package/src/surfaces/media-library.json +1586 -0
  525. package/src/surfaces/media-library.ts +282 -0
  526. package/src/surfaces/media-pane.ts +8 -7
  527. package/src/surfaces/media-pick-dialog.json +71 -0
  528. package/src/surfaces/media-pick-dialog.ts +132 -0
  529. package/src/surfaces/menu.ts +47 -23
  530. package/src/surfaces/navigator-dock.ts +11 -12
  531. package/src/surfaces/new-project.ts +27 -26
  532. package/src/surfaces/pane-context.json +144 -77
  533. package/src/surfaces/pane-context.ts +44 -25
  534. package/src/surfaces/pane-grid.ts +15 -10
  535. package/src/surfaces/panel-activity.ts +5 -6
  536. package/src/surfaces/panel-data.ts +3 -4
  537. package/src/surfaces/panel-deploy-checklist.json +12 -6
  538. package/src/surfaces/panel-deploy-checklist.ts +8 -7
  539. package/src/surfaces/panel-elements.ts +5 -7
  540. package/src/surfaces/panel-i18n.ts +5 -7
  541. package/src/surfaces/panel-imports.ts +6 -13
  542. package/src/surfaces/panel-outline.ts +25 -19
  543. package/src/surfaces/panel-page.json +72 -2
  544. package/src/surfaces/panel-page.ts +49 -25
  545. package/src/surfaces/panel-problems.ts +5 -7
  546. package/src/surfaces/panel-signals.json +1 -1
  547. package/src/surfaces/panel-signals.ts +25 -39
  548. package/src/surfaces/panel-stylebook-layers.json +71 -204
  549. package/src/surfaces/panel-stylebook-layers.ts +5 -29
  550. package/src/surfaces/preferences.json +120 -48
  551. package/src/surfaces/preferences.ts +29 -11
  552. package/src/surfaces/progress-modal.ts +15 -9
  553. package/src/surfaces/properties-panel.json +1 -1
  554. package/src/surfaces/properties-panel.ts +20 -42
  555. package/src/surfaces/publish-quick.json +428 -0
  556. package/src/surfaces/publish-quick.ts +165 -0
  557. package/src/surfaces/publish-workspace.json +2892 -0
  558. package/src/surfaces/publish-workspace.ts +391 -0
  559. package/src/surfaces/publish.ts +18 -18
  560. package/src/surfaces/push-plan.ts +7 -8
  561. package/src/surfaces/rail.json +1 -159
  562. package/src/surfaces/rail.ts +22 -79
  563. package/src/surfaces/reference-field.ts +11 -15
  564. package/src/surfaces/schema-builder.ts +16 -22
  565. package/src/surfaces/schema-form.json +10 -2
  566. package/src/surfaces/schema-form.ts +17 -25
  567. package/src/surfaces/secret-field.ts +9 -6
  568. package/src/surfaces/seo.json +1 -1
  569. package/src/surfaces/seo.ts +21 -15
  570. package/src/surfaces/settings-contexts.ts +9 -7
  571. package/src/surfaces/settings-contributed.json +5 -5
  572. package/src/surfaces/settings-contributed.ts +32 -12
  573. package/src/surfaces/settings-css-vars.json +44 -36
  574. package/src/surfaces/settings-css-vars.ts +82 -16
  575. package/src/surfaces/settings-defs.json +2 -2
  576. package/src/surfaces/settings-defs.ts +17 -21
  577. package/src/surfaces/settings-deploy.json +2 -15
  578. package/src/surfaces/settings-deploy.ts +9 -16
  579. package/src/surfaces/settings-dialog.json +51 -0
  580. package/src/surfaces/settings-dialog.ts +169 -0
  581. package/src/surfaces/settings-extensions.ts +5 -6
  582. package/src/surfaces/settings-head.ts +33 -39
  583. package/src/surfaces/settings-locales.ts +8 -20
  584. package/src/surfaces/settings-overview.json +3 -3
  585. package/src/surfaces/settings-overview.ts +14 -8
  586. package/src/surfaces/settings-packages.ts +8 -7
  587. package/src/surfaces/settings-pane.json +269 -46
  588. package/src/surfaces/settings-pane.ts +88 -36
  589. package/src/surfaces/settings-rawjson.ts +5 -6
  590. package/src/surfaces/shell.json +2 -1
  591. package/src/surfaces/shell.ts +1 -2
  592. package/src/surfaces/site-panel.json +1029 -0
  593. package/src/surfaces/site-panel.ts +233 -0
  594. package/src/surfaces/slash-menu.json +63 -21
  595. package/src/surfaces/slash-menu.ts +42 -9
  596. package/src/surfaces/statements.ts +13 -18
  597. package/src/surfaces/statusbar.ts +56 -29
  598. package/src/surfaces/style-panel.ts +18 -31
  599. package/src/surfaces/stylebook-chrome.ts +3 -5
  600. package/src/surfaces/styles-panel.json +735 -0
  601. package/src/surfaces/styles-panel.ts +195 -0
  602. package/src/surfaces/styles-variables.json +149 -0
  603. package/src/surfaces/styles-variables.ts +145 -0
  604. package/src/surfaces/tab-strip.json +4 -4
  605. package/src/surfaces/tab-strip.ts +14 -13
  606. package/src/surfaces/target-line.ts +6 -7
  607. package/src/surfaces/welcome.ts +6 -8
  608. package/src/surfaces/writing-banner.json +94 -0
  609. package/src/surfaces/writing-banner.ts +80 -0
  610. package/src/tabs/bare-repeaters.ts +101 -0
  611. package/src/tabs/patch-ops.ts +4 -3
  612. package/src/tabs/project-config.ts +32 -21
  613. package/src/tabs/selection.ts +36 -8
  614. package/src/tabs/tab.ts +99 -48
  615. package/src/tabs/transact.ts +98 -53
  616. package/src/types.ts +53 -43
  617. package/src/ui/ai-credentials-form.ts +10 -13
  618. package/src/ui/ai-model-picker.ts +3 -3
  619. package/src/ui/cf-account-picker.ts +7 -9
  620. package/src/ui/color-selector.ts +9 -5
  621. package/src/ui/dynamic-slot.ts +7 -8
  622. package/src/ui/expression-editor.ts +112 -105
  623. package/src/ui/form-controls.ts +104 -56
  624. package/src/ui/formula-catalog.ts +239 -230
  625. package/src/ui/formula-chips.ts +33 -18
  626. package/src/ui/layers.ts +57 -31
  627. package/src/ui/media-picker.ts +300 -47
  628. package/src/ui/popover-surface.ts +20 -12
  629. package/src/ui/progress-modal.ts +13 -8
  630. package/src/ui/regions.ts +14 -12
  631. package/src/ui/schema-form.ts +372 -97
  632. package/src/ui/surface.ts +71 -8
  633. package/src/ui/timing.ts +9 -0
  634. package/src/ui/value-source.ts +44 -31
  635. package/src/ui/virtual-window.ts +29 -3
  636. package/src/utils/base64.ts +6 -4
  637. package/src/utils/edit-display.ts +366 -111
  638. package/src/utils/element-selectors.ts +3 -2
  639. package/src/utils/google-fonts.ts +15 -14
  640. package/src/utils/inherited-style.ts +18 -20
  641. package/src/utils/link-target.ts +1 -1
  642. package/src/utils/local-day.ts +18 -0
  643. package/src/utils/preview-format.ts +25 -3
  644. package/src/utils/strip-events.ts +49 -22
  645. package/src/utils/studio-utils.ts +29 -14
  646. package/src/view.ts +2 -3
  647. package/src/workspace/pane-derive.ts +14 -16
  648. package/src/workspace/session.ts +81 -50
  649. package/src/workspace/tab-workspace.ts +137 -0
  650. package/src/workspace/workspace-back.ts +189 -0
  651. package/src/workspace/workspace-home.ts +133 -0
  652. package/src/workspace/workspace-ids.ts +129 -0
  653. package/src/workspace/workspace-switch.ts +372 -0
  654. package/src/workspace/workspace.ts +165 -47
  655. package/styles/shell-frame.css +30 -7
  656. package/styles/shell-frame.json +15 -3
  657. package/dist/chunks/2020-va2wwra4.js +0 -4
  658. package/dist/chunks/adapter-f93pafd7.js +0 -4
  659. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  660. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  661. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  662. package/dist/chunks/color-field-embq5ctg.js +0 -4
  663. package/dist/chunks/color-fpezvnkt.js +0 -4
  664. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  665. package/dist/chunks/combobox-773hdzyj.js +0 -4
  666. package/dist/chunks/components-ax2f1fnn.js +0 -4
  667. package/dist/chunks/content-source-108aqtk1.js +0 -4
  668. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  669. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  670. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  671. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  672. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  673. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  674. package/dist/chunks/files-44vp8a2s.js +0 -4
  675. package/dist/chunks/format-host-7q1petb9.js +0 -4
  676. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  677. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  678. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  679. package/dist/chunks/icons-p44xhjf0.js +0 -4
  680. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  681. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  682. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  683. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  684. package/dist/chunks/index-wkyfjeqz.js +0 -4
  685. package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
  686. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  687. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  688. package/dist/chunks/layers-xd92fg8d.js +0 -4
  689. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  690. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  691. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  692. package/dist/chunks/menu-37d07z9m.js +0 -4
  693. package/dist/chunks/menu-5c55ea3d.js +0 -4
  694. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  695. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  696. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  697. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  698. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  699. package/dist/chunks/parse-897fvqah.js +0 -4
  700. package/dist/chunks/platform-v1qctbe6.js +0 -4
  701. package/dist/chunks/popover-8htra4er.js +0 -4
  702. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  703. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  704. package/dist/chunks/references-gmqp82fs.js +0 -4
  705. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  706. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  707. package/dist/chunks/select-n3v7gwas.js +0 -4
  708. package/dist/chunks/split-pff8f3ze.js +0 -4
  709. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  710. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  711. package/dist/chunks/studio-1b04pd0j.js +0 -64
  712. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  713. package/dist/chunks/studio-4tanh828.js +0 -5
  714. package/dist/chunks/studio-55h4mstj.js +0 -4
  715. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  716. package/dist/chunks/studio-60dqgb0c.js +0 -5
  717. package/dist/chunks/studio-61dp09qg.js +0 -9
  718. package/dist/chunks/studio-63epcrj2.js +0 -5
  719. package/dist/chunks/studio-74k29dy9.js +0 -5
  720. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  721. package/dist/chunks/studio-7zx31knw.js +0 -9
  722. package/dist/chunks/studio-8bxk97km.js +0 -5
  723. package/dist/chunks/studio-933e30n4.js +0 -5
  724. package/dist/chunks/studio-98wnwhbg.js +0 -5
  725. package/dist/chunks/studio-9mccjwjh.js +0 -14
  726. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  727. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  728. package/dist/chunks/studio-e81q1vb9.js +0 -5
  729. package/dist/chunks/studio-epgrmqqm.js +0 -5
  730. package/dist/chunks/studio-ery42sqr.js +0 -4
  731. package/dist/chunks/studio-g1shz58g.js +0 -5
  732. package/dist/chunks/studio-gf0fz03c.js +0 -5
  733. package/dist/chunks/studio-gjtpe62q.js +0 -6
  734. package/dist/chunks/studio-gkskhg7m.js +0 -5
  735. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  736. package/dist/chunks/studio-j03zga3y.js +0 -9
  737. package/dist/chunks/studio-jhpxeckz.js +0 -5
  738. package/dist/chunks/studio-k01r7ykp.js +0 -5
  739. package/dist/chunks/studio-kk7h30ne.js +0 -7
  740. package/dist/chunks/studio-kt1zqney.js +0 -5
  741. package/dist/chunks/studio-m3cwhvye.js +0 -5
  742. package/dist/chunks/studio-mcayt6hz.js +0 -5
  743. package/dist/chunks/studio-myjcghv3.js +0 -5
  744. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  745. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  746. package/dist/chunks/studio-nj5a01jy.js +0 -928
  747. package/dist/chunks/studio-pcgz8heb.js +0 -5
  748. package/dist/chunks/studio-qcsq0t15.js +0 -5
  749. package/dist/chunks/studio-qkstvve9.js +0 -5
  750. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  751. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  752. package/dist/chunks/studio-s8dmmz66.js +0 -5
  753. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  754. package/dist/chunks/studio-szsjbj0g.js +0 -5
  755. package/dist/chunks/studio-t1xzawhr.js +0 -16
  756. package/dist/chunks/studio-tdcprbqb.js +0 -5
  757. package/dist/chunks/studio-vrmcjf9g.js +0 -7
  758. package/dist/chunks/studio-vyc0b4he.js +0 -10
  759. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  760. package/dist/chunks/studio-w3hskzqk.js +0 -5
  761. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  762. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  763. package/dist/chunks/studio-y6n42tgs.js +0 -5
  764. package/dist/chunks/studio-yb560vxr.js +0 -5
  765. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  766. package/dist/chunks/studio-yw05w8f0.js +0 -7
  767. package/dist/chunks/studio-z16sgavc.js +0 -5
  768. package/dist/chunks/studio-zey7zsdw.js +0 -12
  769. package/dist/chunks/studio-zyqn40w4.js +0 -5
  770. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  771. package/dist/chunks/tabs-jwthg40w.js +0 -4
  772. package/dist/chunks/textfield-spy3hc77.js +0 -4
  773. package/dist/chunks/toast-4d35zd64.js +0 -4
  774. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  775. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  776. package/dist/chunks/tree-h19v1jfz.js +0 -4
  777. package/dist/chunks/tsMode-2frah6h1.js +0 -14
  778. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  779. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
  780. package/src/panels/frontmatter-panel.ts +0 -701
  781. package/src/panels/git-panel.ts +0 -1120
  782. package/src/surfaces/doc-header.json +0 -776
  783. package/src/surfaces/doc-header.ts +0 -231
  784. package/src/surfaces/git-panel.json +0 -1880
  785. package/src/surfaces/git-panel.ts +0 -272
@@ -27,9 +27,8 @@ import { reactive } from "../reactivity";
27
27
  import { mountSurface, registerSurface } from "../ui/surface";
28
28
  import connectDoc from "./ai-managed-connect.json";
29
29
  import type { SurfaceHandle } from "../ui/surface";
30
- import type { JxDocument } from "@jxsuite/schema/types";
31
30
 
32
- registerSurface("ai-managed-connect", connectDoc as unknown as JxDocument);
31
+ registerSurface("ai-managed-connect", connectDoc);
33
32
 
34
33
  /** What the offer says right now. Every field is the flow's wording, never a state it derives. */
35
34
  export interface ManagedConnectView {
@@ -63,7 +62,7 @@ interface ManagedConnectFlags {
63
62
  }
64
63
 
65
64
  interface ManagedConnectScope
66
- extends Record<string, unknown>, ManagedConnectView, ManagedConnectActions, ManagedConnectFlags {}
65
+ extends ManagedConnectView, ManagedConnectActions, ManagedConnectFlags {}
67
66
 
68
67
  /** The view plus the flag the document switches on. */
69
68
  function derive(view: ManagedConnectView): ManagedConnectView & ManagedConnectFlags {
@@ -87,7 +86,7 @@ export function createManagedConnectSurface(
87
86
  ): ManagedConnectSurface {
88
87
  const host = document.createElement("div");
89
88
  host.style.display = "contents";
90
- const scope = reactive({ ...derive(view), ...actions }) as ManagedConnectScope;
89
+ const scope: ManagedConnectScope = reactive<ManagedConnectScope>({ ...derive(view), ...actions });
91
90
 
92
91
  /** `null` while a mount is in flight — which is a standing surface, not a missing one. */
93
92
  let handle: SurfaceHandle | null = null;
@@ -25,9 +25,8 @@ import { reactive } from "../reactivity";
25
25
  import { mountSurface, registerSurface } from "../ui/surface";
26
26
  import pickerDoc from "./ai-model-picker.json";
27
27
  import type { SurfaceHandle } from "../ui/surface";
28
- import type { JxDocument } from "@jxsuite/schema/types";
29
28
 
30
- registerSurface("ai-model-picker", pickerDoc as unknown as JxDocument);
29
+ registerSurface("ai-model-picker", pickerDoc);
31
30
 
32
31
  /** One row the control offers. Already a label — the flow decides what a row is called. */
33
32
  export interface ModelPickerRow {
@@ -79,8 +78,7 @@ interface ModelPickerFlags {
79
78
  hasFailure: boolean;
80
79
  }
81
80
 
82
- interface ModelPickerScope
83
- extends Record<string, unknown>, ModelPickerView, ModelPickerActions, ModelPickerFlags {}
81
+ interface ModelPickerScope extends ModelPickerView, ModelPickerActions, ModelPickerFlags {}
84
82
 
85
83
  /** The view plus the flag the document switches on. */
86
84
  function derive(view: ModelPickerView): ModelPickerView & ModelPickerFlags {
@@ -103,7 +101,7 @@ export function createModelPickerSurface(
103
101
  ): ModelPickerSurface {
104
102
  const host = document.createElement("div");
105
103
  host.style.display = "contents";
106
- const scope = reactive({ ...derive(view), ...actions }) as ModelPickerScope;
104
+ const scope: ModelPickerScope = reactive<ModelPickerScope>({ ...derive(view), ...actions });
107
105
 
108
106
  /** `null` while a mount is in flight — which is a standing surface, not a missing one. */
109
107
  let handle: SurfaceHandle | null = null;
@@ -29,15 +29,16 @@
29
29
  * @docs studio/editing/writing
30
30
  */
31
31
 
32
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
32
33
  import { reactive } from "../reactivity";
33
34
  import { mountSurface, registerSurface } from "../ui/surface";
34
35
  import blockActionBarDoc from "./block-action-bar.json";
35
36
 
36
37
  import type { JxScope } from "@jxsuite/runtime/types";
37
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
38
+ import type { JxElement } from "@jxsuite/schema/types";
38
39
  import { rectOf } from "../utils/geometry";
39
40
 
40
- registerSurface("block-action-bar", blockActionBarDoc as unknown as JxDocument);
41
+ registerSurface("block-action-bar", blockActionBarDoc);
41
42
 
42
43
  /** One button, already decided: what it is called, what it draws, and why it cannot act. */
43
44
  export interface BlockBarTool {
@@ -116,7 +117,7 @@ export interface BlockBarActions {
116
117
  }
117
118
 
118
119
  /** The scope `block-action-bar.json` reads. */
119
- interface BlockBarScope extends BlockBarView, Record<string, unknown> {
120
+ interface BlockBarScope extends BlockBarView {
120
121
  linkValue: string;
121
122
  linkExisting: boolean;
122
123
  linkApplyLabel: string;
@@ -167,8 +168,8 @@ export function emptyBlockBarView(): BlockBarView {
167
168
 
168
169
  /** A node definition's `part`, as written in the document. */
169
170
  function partOf(def: JxElement | string): string {
170
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
171
- return typeof part === "string" ? part : "";
171
+ const part = isString(def) ? undefined : def.attributes?.["part"];
172
+ return isString(part) ? part : "";
172
173
  }
173
174
 
174
175
  /**
@@ -180,9 +181,10 @@ function partOf(def: JxElement | string): string {
180
181
  * same shape `surfaces/schema-form.ts` and `surfaces/properties-panel.ts` use.
181
182
  */
182
183
  function commandIdOf(state: JxScope | undefined): string {
183
- const item = (state?.["$map"] as { item?: Record<string, unknown> } | undefined)?.item;
184
- const id = item?.["id"];
185
- return typeof id === "string" ? id : "";
184
+ const map = state?.["$map"];
185
+ const item = isJsonObject(map) ? map["item"] : undefined;
186
+ const id = isJsonObject(item) ? item["id"] : undefined;
187
+ return isString(id) ? id : "";
186
188
  }
187
189
 
188
190
  /** The bar's mounted surface, and every handle the flow is allowed to reach back through. */
@@ -250,22 +252,29 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
250
252
  linkApplyLabel: "Apply",
251
253
  linkExisting: false,
252
254
  linkInput: (_scope: JxScope, event: Event) => {
253
- const value = (event.target as { value?: unknown } | null)?.value;
254
- scope.linkValue = typeof value === "string" ? value : "";
255
+ const { target } = event;
256
+ const value = target !== null && "value" in target ? target.value : undefined;
257
+ scope.linkValue = isString(value) ? value : "";
255
258
  },
256
259
  linkValue: "",
257
260
  linkX: 0,
258
261
  linkY: 0,
259
262
  openMergeTags: (_scope: JxScope, event: Event) => {
260
263
  event.stopPropagation();
264
+ // SAFETY: Only the merge-tags `jx-action-button`'s `onclick` binds this handler, and during
265
+ // Dispatch `currentTarget` is the element the listener sits on.
261
266
  actions.openMergeTags(event.currentTarget as HTMLElement);
262
267
  },
263
268
  openOverflow: (_scope: JxScope, event: Event) => {
264
269
  event.stopPropagation();
270
+ // SAFETY: Only the overflow `jx-action-button`'s `onclick` binds this handler, and during
271
+ // Dispatch `currentTarget` is the element the listener sits on.
265
272
  actions.openOverflow(event.currentTarget as HTMLElement);
266
273
  },
267
274
  openTagMenu: (_scope: JxScope, event: Event) => {
268
275
  event.stopPropagation();
276
+ // SAFETY: Only the tag `jx-action-button`'s `onclick` binds this handler, and during
277
+ // Dispatch `currentTarget` is the element the listener sits on.
269
278
  actions.openTagMenu(event.currentTarget as HTMLElement);
270
279
  },
271
280
  removeLink: () => {
@@ -274,7 +283,7 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
274
283
  },
275
284
  run: (id: string) => actions.run(id),
276
285
  selectParent: () => actions.selectParent(),
277
- }) as BlockBarScope;
286
+ });
278
287
 
279
288
  /* One mount for the life of the window, and no teardown to write. The bar is chrome the app
280
289
  never takes down: `dismissBlockActionBar` hides it through `visible`, and its layer slot is
@@ -295,6 +304,8 @@ export function mountBlockActionBar(host: HTMLElement, actions: BlockBarActions)
295
304
  return;
296
305
  }
297
306
  if (part === "link") {
307
+ // SAFETY: `part: "link"` is the document's `jx-popover`, whose class carries `open` and the
308
+ // `showPopover({ source })` overload that PopoverElement names.
298
309
  linkEl = element as PopoverElement;
299
310
  return;
300
311
  }
@@ -21,12 +21,13 @@
21
21
  "fontFamily": "var(--jx-font-sans)",
22
22
  "color": "var(--jx-fg)",
23
23
  "& > [part=\"drag-strip\"]": {
24
- "$description": "The window's handle. Electrobun's preload recognises the class and supplies the drag behaviour itself, so the rule here only sizes the strip: as tall as the hidden title bar would have been.",
24
+ "$description": "The window's handle. The `app-region-drag` class (shell-frame) makes the strip drag the frameless window, so the rule here sizes it, as tall as the hidden title bar would have been, and repeats the drag region so the strip works even before the shell stylesheet loads.",
25
25
  "position": "absolute",
26
26
  "top": "0",
27
27
  "left": "0",
28
28
  "right": "0",
29
- "height": "calc(var(--jx-control-h) + var(--jx-space-3))"
29
+ "height": "calc(var(--jx-control-h) + var(--jx-space-3))",
30
+ "-webkit-app-region": "drag"
30
31
  },
31
32
  "& > [part=\"content\"]": {
32
33
  "position": "relative",
@@ -88,7 +89,7 @@
88
89
  "tagName": "div",
89
90
  "attributes": {
90
91
  "part": "drag-strip",
91
- "class": "electrobun-webkit-app-region-drag",
92
+ "class": "app-region-drag",
92
93
  "aria-hidden": "true"
93
94
  }
94
95
  },
@@ -28,9 +28,8 @@ import { APP_NAME, GIT_COMMIT, VERSION } from "../version";
28
28
  import bootFailureDoc from "./boot-failure.json";
29
29
  import type { BootRefusal } from "../platforms/default-platform";
30
30
  import type { SurfaceHandle } from "../ui/surface";
31
- import type { JxDocument } from "@jxsuite/schema/types";
32
31
 
33
- registerSurface("boot-failure", bootFailureDoc as unknown as JxDocument);
32
+ registerSurface("boot-failure", bootFailureDoc);
34
33
 
35
34
  /** The page the failure happened on — `location`, or a stand-in with the one field read. */
36
35
  export interface BootFailurePage {
@@ -49,7 +48,7 @@ export interface BootFailureView {
49
48
  }
50
49
 
51
50
  /** The scope `boot-failure.json` reads. */
52
- interface BootFailureScope extends Record<string, unknown>, BootFailureView {
51
+ interface BootFailureScope extends BootFailureView {
53
52
  /** The last Copy landed on the clipboard; the button says so. */
54
53
  copied: boolean;
55
54
  reload: () => void;
@@ -135,7 +134,7 @@ export function mountBootFailureSurface(
135
134
  page: BootFailurePage = location,
136
135
  ): Promise<SurfaceHandle> {
137
136
  const view = bootFailureView(refusal, page);
138
- const scope = reactive<BootFailureScope>({
137
+ const scope: BootFailureScope = reactive<BootFailureScope>({
139
138
  ...view,
140
139
  copied: false,
141
140
  async copy() {
@@ -151,6 +150,6 @@ export function mountBootFailureSurface(
151
150
  reload() {
152
151
  location.reload();
153
152
  },
154
- }) as BootFailureScope;
153
+ });
155
154
  return mountSurface("boot-failure", scope, host);
156
155
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://jxsuite.com/schema/v1",
3
3
  "$id": "StudioBottomDock",
4
- "$description": "The Bottom dock's chrome (studio.md §16.3) as a Jx document over the kit: a real `tablist` of the dock's tabs, the button that shuts it, and ONE `tabpanel` for whichever tab is showing. Every tab names that one panel — the dock draws the selected tab's body and no other, so there is exactly one panel element and its `aria-labelledby` follows the selection, which is the same shape `surfaces/git-panel.json` uses for its two sub-tabs. It draws no tab BODY: `panels/bottom-dock.ts` keeps the panel registry, the `when` filter, the badge in each tab's label, the Logic reveal and every tab's `afterRender`, and renders the active record into the one empty `[part=\"dock-body\"]` island this document leaves for it (studio-ui-guidelines.md §9.4).",
4
+ "$description": "The Bottom dock's chrome (studio.md §16.3) as a Jx document over the kit: a real `tablist` of the dock's tabs, the button that shuts it, and ONE `tabpanel` for whichever tab is showing. Every tab names that one panel — the dock draws the selected tab's body and no other, so there is exactly one panel element and its `aria-labelledby` follows the selection, which is the same shape `surfaces/publish-workspace.json` uses for its four sub-tabs. It draws no tab BODY: `panels/bottom-dock.ts` keeps the panel registry, the `when` filter, the badge in each tab's label, the Logic reveal and every tab's `afterRender`, and renders the active record into the one empty `[part=\"dock-body\"]` island this document leaves for it (studio-ui-guidelines.md §9.4).",
5
5
  "tagName": "div",
6
6
  "attributes": {
7
7
  "part": "bottom-dock"
@@ -15,23 +15,14 @@
15
15
  * @docs studio/interface
16
16
  */
17
17
 
18
+ import { isString } from "@jxsuite/schema/guards";
18
19
  import { reactive } from "../reactivity";
19
20
  import { mountSurface, registerSurface } from "../ui/surface";
20
21
  import bottomDockDoc from "./bottom-dock.json";
21
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
22
- import type { SurfaceHandle } from "../ui/surface";
22
+ import type { JxElement } from "@jxsuite/schema/types";
23
+ import type { SurfaceHandle, SurfaceTab } from "../ui/surface";
23
24
 
24
- registerSurface("bottom-dock", bottomDockDoc as unknown as JxDocument);
25
-
26
- /** One tab of the strip, as the document draws it. */
27
- export interface BottomTabView {
28
- /** The panel id — the row's identity, the strip's `selected` value, and `data-tab`. */
29
- key: string;
30
- /** The record's title with its badge already appended ("Problems 2"). */
31
- label: string;
32
- /** The tab element's own id, which the one panel names as its `aria-labelledby`. */
33
- tabId: string;
34
- }
25
+ registerSurface("bottom-dock", bottomDockDoc);
35
26
 
36
27
  /** What the dock says right now. */
37
28
  export interface BottomDockValues {
@@ -41,7 +32,7 @@ export interface BottomDockValues {
41
32
  tabId: string;
42
33
  /** `dock.bottom/panel:<id>`, or empty when no tab is showing and the body has no identity. */
43
34
  bodyRegion: string;
44
- tabs: BottomTabView[];
35
+ tabs: SurfaceTab[];
45
36
  }
46
37
 
47
38
  export interface BottomDockActions {
@@ -62,7 +53,7 @@ export interface BottomDockHandle {
62
53
  dispose: () => void;
63
54
  }
64
55
 
65
- interface BottomDockScope extends Record<string, unknown>, BottomDockValues, BottomDockActions {}
56
+ interface BottomDockScope extends BottomDockValues, BottomDockActions {}
66
57
 
67
58
  function project(scope: BottomDockScope, values: BottomDockValues): void {
68
59
  scope.tab = values.tab;
@@ -73,8 +64,8 @@ function project(scope: BottomDockScope, values: BottomDockValues): void {
73
64
 
74
65
  /** The `part` a node was declared with, or the empty string. */
75
66
  function partOf(def: JxElement | string): string {
76
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
77
- return typeof part === "string" ? part : "";
67
+ const part = isString(def) ? undefined : def.attributes?.["part"];
68
+ return isString(part) ? part : "";
78
69
  }
79
70
 
80
71
  /**
@@ -90,7 +81,7 @@ export function mountBottomDockSurface(
90
81
  actions: BottomDockActions,
91
82
  options: BottomDockOptions,
92
83
  ): BottomDockHandle {
93
- const scope = reactive<BottomDockScope>({ ...values, ...actions }) as BottomDockScope;
84
+ const scope: BottomDockScope = reactive<BottomDockScope>({ ...values, ...actions });
94
85
 
95
86
  container.textContent = "";
96
87
  // @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
@@ -1,22 +1,26 @@
1
1
  {
2
2
  "$schema": "https://jxsuite.com/schema/v1",
3
3
  "$id": "StudioCanvasStage",
4
- "$description": "The canvas's own chrome: the artboards, the boxes around them, and the empty hosts the islands attach to. `canvas/canvas-render.ts` keeps every decision — which mode this pane is in, which breakpoints the document declares, how wide Edit's column is, whether a comparison has a visual half — and `canvas/canvas-utils.ts` keeps the geometry; this document owns the markup and the style, and it draws NOTHING it decides for itself.\n\n**Every island stays an island** (studio-ui-guidelines.md §9.4). Monaco gets `[part=\"source-editor\"]` or `[part=\"diff-code-editor\"]`, the artboard's iframe gets `[part=\"panel-canvas\"]`, the Document Header card gets `[part=\"doc-header\"]`, the Compare bar gets `[part=\"diff-toolbar\"]` and the Project Styles bar gets `[part=\"chrome-host\"]` — each drawn empty and announced through `onNodeCreated`, one reconcile step before it is in the page.\n\n**Three of the five frames share one artboard vocabulary**, which is why `framePart` and `innerPart` are bound rather than written: Preview, the pan/zoom surface and Edit's column are all \"a box holding N artboards\", differing only in what the box is and what else stands in it. Writing the artboard three times would be three places for a breakpoint's viewport to drift.\n\n**The stage draws no box of its own.** Its root is `display: contents`, so the frame and whatever leads it are the flex items of the pane's own stage cell — the axis `canvas-render.ts` sets on that cell still reaches them, and no depth was added between the stage and the artboards for the pan maths to have to account for.",
4
+ "$description": "The canvas's own chrome: the artboards, the boxes around them, and the empty hosts the islands attach to. `canvas/canvas-render.ts` keeps every decision — which mode this pane is in, which breakpoints the document declares, how wide Edit's column is, whether a comparison has a visual half — and `canvas/canvas-utils.ts` keeps the geometry; this document owns the markup and the style, and it draws NOTHING it decides for itself.\n\n**Every island stays an island** (studio-ui-guidelines.md §9.4). Monaco gets `[part=\"source-editor\"]` or `[part=\"diff-code-editor\"]`, the artboard's iframe gets `[part=\"panel-canvas\"]`, the writing-mode banner gets `[part=\"writing-banner\"]`, the Compare bar gets `[part=\"diff-toolbar\"]` and the Project Styles bar gets `[part=\"chrome-host\"]` — each drawn empty and announced through `onNodeCreated`, one reconcile step before it is in the page.\n\n**Three of the five frames share one artboard vocabulary**, which is why `framePart` and `innerPart` are bound rather than written: Preview, the pan/zoom surface and Edit's column are all \"a box holding N artboards\", differing only in what the box is and what else stands in it. Writing the artboard three times would be three places for a breakpoint's viewport to drift.\n\n**The stage draws no box of its own.** Its root is `display: contents`, so the frame and whatever leads it are the flex items of the pane's own stage cell — the axis `canvas-render.ts` sets on that cell still reaches them, and no depth was added between the stage and the artboards for the pan maths to have to account for.",
5
5
  "tagName": "div",
6
6
  "attributes": {
7
7
  "part": "stage"
8
8
  },
9
9
  "style": {
10
- "$description": "`styles/canvas.css`'s `.panzoom-wrap`, `.canvas-panel*`, `.source-*`, `.content-edit-*`, `.edit-width-handle`, `.preview-stage` and `.diff-code-*` rules, keyed on `part`, plus the Document Header card's host. One selector reaches FOREIGN DOM and says so where it stands: `.is-resizing` is written by `canvas/edit-width-drag.ts` onto the column this document draws — the same shape `grid-panel.json` uses for Tabulator's theme. The width handles are `jx-split` elements, which paint their own hover, drag and focus states; this sheet says only where they stand and how wide they are.",
10
+ "$description": "`styles/canvas.css`'s `.panzoom-wrap`, `.canvas-panel*`, `.source-*`, `.content-edit-*`, `.edit-width-handle`, `.preview-stage` and `.diff-code-*` rules, keyed on `part`, plus the writing-mode banner's host. One selector reaches FOREIGN DOM and says so where it stands: `.is-resizing` is written by `canvas/edit-width-drag.ts` onto the column this document draws — the same shape `grid-panel.json` uses for Tabulator's theme. The width handles are `jx-split` elements, which paint their own hover, drag and focus states; this sheet says only where they stand and how wide they are.",
11
11
  "display": "contents",
12
12
  "& [part=\"panzoom\"]": {
13
- "$description": "The transformed surface. `applyTransform` writes `transform` on it imperatively, so only the origin is declared here. `--boards-inset` is the Project Styles bar's clearance: that bar floats over the stage, so the boards start below it.",
13
+ "$description": "The transformed surface. `applyTransform` writes `transform` on it imperatively, so only the origin is declared here. `--boards-inset` is the Project Styles bar's clearance: that bar floats over the stage, so the boards start below it. It is a MARGIN, not padding: padding sits inside the box the transform scales, so at a 25% fit a 40px clearance drew as 10px and the bar covered the first specimen. A margin is outside the transform and stays 40 screen pixels at every zoom, and `applyGeometricFit` subtracts the same length from the height it fits into.",
14
14
  "display": "inline-flex",
15
15
  "gap": "24px",
16
16
  "alignItems": "flex-start",
17
17
  "transformOrigin": "0 0",
18
18
  "marginBlock": "auto",
19
- "paddingTop": "var(--boards-inset, 0)"
19
+ "marginTop": "var(--boards-inset, auto)"
20
+ },
21
+ "& [part=\"chrome-host\"]": {
22
+ "$description": "The Project Styles bar's host generates no box. The bar inside it is absolutely positioned over the stage, but an empty host in flow is a flex item of the stage cell, whose `gap` then pushed the artboards 24px right of where the fit arithmetic put them, so the last board ran off the pane's edge.",
23
+ "display": "contents"
20
24
  },
21
25
  "& [part=\"panel\"]": {
22
26
  "flexShrink": "0"
@@ -97,13 +101,6 @@
97
101
  "left": "50%",
98
102
  "transform": "translateX(-50%)"
99
103
  },
100
- "& [part=\"doc-header\"]": {
101
- "$description": "Edit only: the card is docked above the page's scroller as a band across the pane at 1:1, so its width is the pane's rather than the breakpoint's, and the page scrolls under it rather than taking it along. It used to be a block of Edit's column, which made it exactly as wide as the column's breakpoint or dragged width and scrolled it off with the first screen of the page. `canvas-render.ts` stacks the stage cell when it draws one — and closes its gap, so the band's own bottom border is where the scroller clips; `flex-shrink: 0` keeps the band whole while the scroller below takes the squeeze. THE CAP IS TWO CAPS, because the band has two ways to eat the page: `40vh` is the tall-pane answer, and `50%` is the short-pane one — a percentage `max-height` resolves against this flex container, the stage cell, whose height is definite (row 2 of the pane's `auto minmax(0, 1fr)` grid), so the page always keeps half the pane however little of it the dock and the bars have left. `40vh` alone is a share of the WINDOW: with the bottom dock open in a 650px window it is most of a 280px stage, and the page was a sliver. No `z-index`: the one it had was for Design, where the band's sibling was a pan/zoom surface whose boards could paint over it. Edit's sibling is the scroller, which clips its own content, and Design draws no card at all. The shadow is the same one-edge idiom as `panel-outline.json`'s verb cluster — it reaches over the scroller's top padding, so the page reads as passing under a docked band rather than ending at a rule. No `display`, so `hidden` on the host still hides it.",
102
- "flexShrink": "0",
103
- "maxHeight": "min(40vh, 50%)",
104
- "overflowY": "auto",
105
- "boxShadow": "0 8px 8px -8px rgb(0 0 0 / 0.35)"
106
- },
107
104
  "& [part=\"edit-canvas\"]": {
108
105
  "$description": "The side gutter is LOAD-BEARING, not breathing room: the resize handles hang outside the column's own box — flex siblings with a negative margin, so they take no width from it — and this container clips horizontally, so without it the handles would be unreachable at exactly the width where dragging inward matters most. It must stay at least as wide as `EDIT_CANVAS_GUTTER` in `canvas/edit-width.ts`, which is what the drag's own ceiling subtracts. This box is also the TRACK the two `jx-split`s measure: the first ancestor of a handle that generates a box, which is why the handles are drawn here beside the column rather than inside it — inside, the column would have been the track, and the track cannot be the thing being resized.",
109
106
  "width": "100%",
@@ -185,11 +182,15 @@
185
182
  },
186
183
  "& [part=\"preview-stage\"] [part=\"panel-canvas\"]": {
187
184
  "height": "100%"
185
+ },
186
+ "& [part=\"writing-banner\"]": {
187
+ "$description": "A band across the pane at 1:1, so its width is the pane's rather than the breakpoint's and the page scrolls under it. It never shrinks: it is one line.",
188
+ "flexShrink": "0"
188
189
  }
189
190
  },
190
191
  "children": [
191
192
  {
192
- "$description": "What stands over the frame, and only ever one of the three: the Document Header card docked above Edit's scrolling column, the Compare bar over a comparison, or the Project Styles bar over the catalogue. Each is an empty host — the surface that fills it is mounted by the module that owns it.",
193
+ "$description": "What stands over the frame: the writing-mode banner above Edit's scrolling column for a collection entry (whose fields are the Inspector's), the Compare bar over a comparison, or the Project Styles bar over the catalogue. Each is an empty host — the surface that fills it is mounted by the module that owns it.",
193
194
  "tagName": "div",
194
195
  "attributes": {
195
196
  "part": "lead-slot"
@@ -201,11 +202,11 @@
201
202
  "$ref": "#/state/lead"
202
203
  },
203
204
  "cases": {
204
- "header": {
205
- "$description": "The card has ONE place, so the host says nothing about where it is. It used to carry `data-placement`, one of two, and the card read it back as the host was announced — which is before the runtime writes a node's attributes, so the card read no attribute at all and drew `in-column` even where the host said `pinned`.",
205
+ "banner": {
206
+ "$description": "The writing-mode banner over a collection entry written on the canvas (studio.md §22.5): an empty host the banner surface is mounted into by `content/writing-banner.ts`. An entry's fields are edited in the Inspector's Entry tab; the banner only says the layout is locked and where to edit it.",
206
207
  "tagName": "div",
207
208
  "attributes": {
208
- "part": "doc-header"
209
+ "part": "writing-banner"
209
210
  }
210
211
  },
211
212
  "toolbar": {
@@ -288,8 +289,12 @@
288
289
  "children": [
289
290
  {
290
291
  "$prototype": "Array",
291
- "items": { "$ref": "#/state/panels" },
292
- "key": { "$ref": "$map/item/key" },
292
+ "items": {
293
+ "$ref": "#/state/panels"
294
+ },
295
+ "key": {
296
+ "$ref": "$map/item/key"
297
+ },
293
298
  "map": {
294
299
  "$description": "One artboard: its breakpoint's name, the white page under it, and the empty box the iframe mounts into. Keyed on the breakpoint, because each board owns a live iframe and the declared set changes with the document's `$media` — position-based reuse would hand one breakpoint's frame to another's width, which is a live document rendered at the wrong viewport rather than a cosmetic diff.",
295
300
  "tagName": "div",
@@ -323,8 +328,14 @@
323
328
  "body": [
324
329
  {
325
330
  "operator": "call",
326
- "target": { "$ref": "#/state/pickPanel" },
327
- "value": [{ "$ref": "$map/item/key" }]
331
+ "target": {
332
+ "$ref": "#/state/pickPanel"
333
+ },
334
+ "value": [
335
+ {
336
+ "$ref": "$map/item/key"
337
+ }
338
+ ]
328
339
  }
329
340
  ]
330
341
  },
@@ -23,20 +23,21 @@
23
23
  *
24
24
  * **Every island stays an island** (specs/studio-ui-guidelines.md §9.4). The document draws each
25
25
  * host empty and this module announces it the moment it is CREATED, one reconcile step before it is
26
- * in the page; Monaco, the artboard iframes, the Document Header card, the Compare bar and the
26
+ * in the page; Monaco, the artboard iframes, the writing-mode banner, the Compare bar and the
27
27
  * Project Styles bar are all attached by the modules that own them.
28
28
  *
29
29
  * @docs studio/interface/canvas
30
30
  */
31
31
 
32
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
32
33
  import { reactive } from "../reactivity";
33
34
  import { mountSurface, registerSurface } from "../ui/surface";
34
35
  import canvasStageDoc from "./canvas-stage.json";
35
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
36
+ import type { JxElement } from "@jxsuite/schema/types";
36
37
  import type { JxScope } from "@jxsuite/runtime/types";
37
38
  import type { SurfaceHandle } from "../ui/surface";
38
39
 
39
- registerSurface("canvas-stage", canvasStageDoc as unknown as JxDocument);
40
+ registerSurface("canvas-stage", canvasStageDoc);
40
41
 
41
42
  /** One artboard, as the document reads it. Every field is already a string or a boolean. */
42
43
  export interface CanvasStagePanelItem {
@@ -65,11 +66,11 @@ export interface CanvasStageView {
65
66
  /** Whether Edit's column hugs its content — a component definition rather than a page. */
66
67
  hug: boolean;
67
68
  /**
68
- * What stands over the frame, and only ever one of the three: the Document Header card docked
69
- * above Edit's scrolling column, the Compare bar over a comparison, or the Project Styles bar
70
- * over the catalogue.
69
+ * What stands over the frame: the writing-mode banner above Edit's scrolling column for a
70
+ * collection entry (`banner`), the Compare bar over a comparison, or the Project Styles bar over
71
+ * the catalogue. Edit draws nothing over an ordinary page (studio.md §4.2).
71
72
  */
72
- lead: "none" | "header" | "toolbar" | "chrome";
73
+ lead: "none" | "banner" | "toolbar" | "chrome";
73
74
  /** Whether the column has its two width handles. */
74
75
  handles: "hidden" | "shown";
75
76
  panels: CanvasStagePanelItem[];
@@ -104,7 +105,7 @@ export interface CanvasStageHandle {
104
105
  }
105
106
 
106
107
  /** The scope the document reads: {@link CanvasStageView} plus the one control it draws. */
107
- interface CanvasStageScope extends Record<string, unknown>, CanvasStageView {
108
+ interface CanvasStageScope extends CanvasStageView {
108
109
  pickPanel: (key: string) => void;
109
110
  }
110
111
 
@@ -117,16 +118,16 @@ interface CanvasStageScope extends Record<string, unknown>, CanvasStageView {
117
118
  * `data-side` tells the two width handles apart — the one part the document draws twice.
118
119
  */
119
120
  function attrOf(def: JxElement | string, name: string): string {
120
- const value = typeof def === "string" ? undefined : def.attributes?.[name];
121
- return typeof value === "string" ? value : "";
121
+ const value = isString(def) ? undefined : def.attributes?.[name];
122
+ return isString(value) ? value : "";
122
123
  }
123
124
 
124
125
  /** The `key` of the `$map` item a node was rendered inside, or "". */
125
126
  function itemKey(state: JxScope | undefined): string {
126
- const item = (state?.["$map"] as { item?: unknown } | undefined)?.item;
127
- const key =
128
- item !== null && typeof item === "object" ? (item as Record<string, unknown>).key : "";
129
- return typeof key === "string" ? key : "";
127
+ const map = state?.["$map"];
128
+ const item = isJsonObject(map) ? map["item"] : undefined;
129
+ const key = isJsonObject(item) ? item["key"] : "";
130
+ return isString(key) ? key : "";
130
131
  }
131
132
 
132
133
  /** The three parts an artboard is made of; everything else is a singleton host. */
@@ -180,7 +181,7 @@ export function mountCanvasStage(
180
181
  "the iframe survives" means — so the record a fresh render builds is filled from here rather
181
182
  than from a callback that will not fire again. */
182
183
  const boards = new Map<string, Map<string, HTMLElement>>();
183
- const scope = reactive<CanvasStageScope>({
184
+ const scope: CanvasStageScope = reactive<CanvasStageScope>({
184
185
  frame: "boards",
185
186
  framePart: "panzoom",
186
187
  frameVars: "",
@@ -190,7 +191,7 @@ export function mountCanvasStage(
190
191
  lead: "none",
191
192
  panels: [],
192
193
  pickPanel: actions.pickPanel,
193
- }) as CanvasStageScope;
194
+ });
194
195
  project(scope, view);
195
196
 
196
197
  let mounted: SurfaceHandle | null = null;
@@ -25,25 +25,19 @@
25
25
  import { reactive } from "../reactivity";
26
26
  import { mountSurface, registerSurface } from "../ui/surface";
27
27
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
28
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
28
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
29
29
  import { whenReady } from "./dialog";
30
30
  import pickerDoc from "./cf-account-picker.json";
31
31
  import type { SurfaceHandle } from "../ui/surface";
32
- import type { JxDocument } from "@jxsuite/schema/types";
32
+ import type { CfAccount } from "../publish/pages-service";
33
33
 
34
- registerSurface("cf-account-picker", pickerDoc as unknown as JxDocument);
35
-
36
- /** One account the grant reaches, as the list draws it. */
37
- export interface CfAccountPickerRow {
38
- id: string;
39
- name: string;
40
- }
34
+ registerSurface("cf-account-picker", pickerDoc);
41
35
 
42
36
  /** What the flow knows. Every one of these may change while the dialog is up. */
43
37
  export interface CfAccountPickerView {
44
38
  /** The listing is in flight. Its own state, because "not yet asked" is not "reaches nothing". */
45
39
  loading: boolean;
46
- accounts: CfAccountPickerRow[];
40
+ accounts: CfAccount[];
47
41
  /** The last refusal — a listing that failed, or an account the broker would not accept. */
48
42
  failure: string;
49
43
  /** The id being committed, so its own row can say so rather than the whole list going grey. */
@@ -88,15 +82,14 @@ interface CfAccountPickerFlags {
88
82
  }
89
83
 
90
84
  /** One row, as the document reads it: what it says, and whether it may be pressed. */
91
- interface CfAccountPickerScopeRow extends CfAccountPickerRow {
85
+ interface CfAccountPickerScopeRow extends CfAccount {
92
86
  /** This row's own button text — "Selecting…" while it is the one being committed. */
93
87
  label: string;
94
88
  /** Every row is disabled while any commit is in flight: one answer at a time. */
95
89
  busy: boolean;
96
90
  }
97
91
 
98
- interface CfAccountPickerScope
99
- extends Record<string, unknown>, CfAccountPickerView, CfAccountPickerFlags {
92
+ interface CfAccountPickerScope extends CfAccountPickerView, CfAccountPickerFlags {
100
93
  choose: (id: string) => void;
101
94
  retry: () => void;
102
95
  closed: () => void;
@@ -150,8 +143,12 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
150
143
  closed = true;
151
144
  options.onClosed();
152
145
  };
146
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
147
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
148
+ before it saw. */
149
+ const isClosed = (): boolean => closed;
153
150
 
154
- const scope = reactive({
151
+ const scope: CfAccountPickerScope = reactive<CfAccountPickerScope>({
155
152
  ...derive({ accounts: [], choosing: "", failure: "", loading: true }),
156
153
  choose: (id: string) => {
157
154
  options.onChoose(id);
@@ -160,18 +157,20 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
160
157
  retry: () => {
161
158
  options.onRetry();
162
159
  },
163
- }) as CfAccountPickerScope;
160
+ });
164
161
 
165
162
  let mounted: SurfaceHandle | null = null;
166
163
  const ready = mountSurface("cf-account-picker", scope, slot).then(async (surface) => {
167
164
  mounted = surface;
165
+ /* SAFETY: `cf-account-picker.json`'s root definition is a `jx-dialog` element, so the runtime
166
+ mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
168
167
  const element = surface.root as HTMLElement;
169
- if (closed) {
168
+ if (isClosed()) {
170
169
  surface.dispose();
171
170
  return element;
172
171
  }
173
172
  await whenReady(element);
174
- if (closed) {
173
+ if (isClosed()) {
175
174
  return element;
176
175
  }
177
176
  showModal(element);
@@ -186,7 +185,7 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
186
185
  const element = mounted?.root;
187
186
  if (element instanceof HTMLElement) {
188
187
  // The platform's close first, so focus goes back where it came from; then the document.
189
- closeDialog(element);
188
+ close(element);
190
189
  }
191
190
  mounted?.dispose();
192
191
  mounted = null;