@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
@@ -105,8 +105,8 @@
105
105
  },
106
106
  "& [part=\"step-icon\"]": {
107
107
  "flex": "none",
108
- "width": "10px",
109
- "textAlign": "center"
108
+ "--jx-icon-size": "1em",
109
+ "marginBlockEnd": "-0.15em"
110
110
  },
111
111
  "& [part=\"action\"]": {
112
112
  "marginTop": "var(--jx-space-1)"
@@ -205,12 +205,18 @@
205
205
  },
206
206
  "children": [
207
207
  {
208
- "tagName": "span",
208
+ "tagName": "jx-icon",
209
209
  "attributes": {
210
- "part": "step-icon",
211
- "aria-hidden": "true"
210
+ "part": "step-icon"
212
211
  },
213
- "textContent": "${$map.item.icon}"
212
+ "$props": {
213
+ "name": {
214
+ "$ref": "$map/item/icon"
215
+ },
216
+ "label": {
217
+ "$ref": "$map/item/iconLabel"
218
+ }
219
+ }
214
220
  },
215
221
  {
216
222
  "tagName": "span",
@@ -31,10 +31,9 @@ import { effect, effectScope, reactive } from "../reactivity";
31
31
  import { mountSurface, registerSurface } from "../ui/surface";
32
32
  import checklistDoc from "./panel-deploy-checklist.json";
33
33
  import type { EffectScope } from "@vue/reactivity";
34
- import type { JxDocument } from "@jxsuite/schema/types";
35
34
  import type { SurfaceHandle } from "../ui/surface";
36
35
 
37
- registerSurface("panel-deploy-checklist", checklistDoc as unknown as JxDocument);
36
+ registerSurface("panel-deploy-checklist", checklistDoc);
38
37
 
39
38
  /** One prerequisite, as the document draws it. Every field is a value: no records, no closures. */
40
39
  export interface DeployStepRowView {
@@ -42,8 +41,10 @@ export interface DeployStepRowView {
42
41
  id: string;
43
42
  /** `done` | `todo` | `unknown`, as `data-state`. `unknown` is not a third kind of "no". */
44
43
  state: string;
45
- /** The one-character glyph the checklist chose for that state. */
44
+ /** The kit icon the checklist chose for that state (`check`, `warning-circle`, `question`). */
46
45
  icon: string;
46
+ /** The state in words, the icon's accessible name: "Done", "To do", "Not checked yet". */
47
+ iconLabel: string;
47
48
  /** The label, and — unless the link is forged — the sentence that says what is missing. */
48
49
  text: string;
49
50
  }
@@ -81,7 +82,7 @@ export interface DeployChecklistDeps {
81
82
  }
82
83
 
83
84
  /** The scope the document reads: the projection, flattened, beside the one callback. */
84
- interface DeployChecklistScope extends Record<string, unknown>, DeployChecklistView {
85
+ interface DeployChecklistScope extends DeployChecklistView {
85
86
  runAction: () => void;
86
87
  }
87
88
 
@@ -109,7 +110,7 @@ function standingIn(container: HTMLElement): boolean {
109
110
  return false;
110
111
  }
111
112
  // Still mounting into this very container: a second call must not start a second mount.
112
- return _handle === null ? _mount !== null : (_handle.root as Node).parentNode === container;
113
+ return _handle === null ? _mount !== null : _handle.root.parentNode === container;
113
114
  }
114
115
 
115
116
  /**
@@ -127,7 +128,7 @@ export function mountDeployChecklistSurface(
127
128
  }
128
129
  disposeDeployChecklistSurface();
129
130
  _container = container;
130
- const scope = reactive<DeployChecklistScope>({
131
+ const scope: DeployChecklistScope = reactive<DeployChecklistScope>({
131
132
  actionDisabled: false,
132
133
  actionLabel: "",
133
134
  actionTitle: "",
@@ -138,7 +139,7 @@ export function mountDeployChecklistSurface(
138
139
  runAction: deps.runAction,
139
140
  steps: [],
140
141
  summary: "",
141
- }) as DeployChecklistScope;
142
+ });
142
143
  _scope = effectScope();
143
144
  _scope.run(() => {
144
145
  effect(() => {
@@ -32,10 +32,9 @@
32
32
  import { reactive } from "../reactivity";
33
33
  import { mountSurface, registerSurface } from "../ui/surface";
34
34
  import elementsDoc from "./panel-elements.json";
35
- import type { JxDocument } from "@jxsuite/schema/types";
36
35
  import type { SurfaceHandle } from "../ui/surface";
37
36
 
38
- registerSurface("panel-elements", elementsDoc as unknown as JxDocument);
37
+ registerSurface("panel-elements", elementsDoc);
39
38
 
40
39
  /** One insertable HTML element: the tag is its identity, its caption and what a click inserts. */
41
40
  export interface ElementCardView {
@@ -103,7 +102,7 @@ export interface ElementsSurfaceHandle {
103
102
  }
104
103
 
105
104
  /** The scope the document reads: {@link ElementsValues} plus the actions its controls call. */
106
- interface ElementsScope extends Record<string, unknown>, ElementsValues, ElementsActions {}
105
+ interface ElementsScope extends ElementsValues, ElementsActions {}
107
106
 
108
107
  /** Write a projection into the scope. */
109
108
  function project(scope: ElementsScope, values: ElementsValues): void {
@@ -128,7 +127,7 @@ export function mountElementsSurface(
128
127
  values: ElementsValues,
129
128
  actions: ElementsActions,
130
129
  ): ElementsSurfaceHandle {
131
- const scope = reactive<ElementsScope>({
130
+ const scope: ElementsScope = reactive<ElementsScope>({
132
131
  categories: [],
133
132
  clearFilter: actions.clearFilter,
134
133
  components: [],
@@ -141,7 +140,7 @@ export function mountElementsSurface(
141
140
  setComponentsOpen: actions.setComponentsOpen,
142
141
  setFilter: actions.setFilter,
143
142
  setSectionOpen: actions.setSectionOpen,
144
- }) as ElementsScope;
143
+ });
145
144
  project(scope, values);
146
145
 
147
146
  let mounted: SurfaceHandle | null = null;
@@ -163,8 +162,7 @@ export function mountElementsSurface(
163
162
  taken away, and answering no would start a second mount racing the first. Once mounted the
164
163
  question is whether the root is still in the container — a panel that was switched away from
165
164
  had its document cleared out from under it by lit. */
166
- connected: () =>
167
- !disposed && (mounted === null || (mounted.root as Node).parentNode === container),
165
+ connected: () => !disposed && (mounted === null || mounted.root.parentNode === container),
168
166
  dispose() {
169
167
  disposed = true;
170
168
  mounted?.dispose();
@@ -24,10 +24,9 @@
24
24
  import { reactive } from "../reactivity";
25
25
  import { mountSurface, registerSurface } from "../ui/surface";
26
26
  import i18nDoc from "./panel-i18n.json";
27
- import type { JxDocument } from "@jxsuite/schema/types";
28
27
  import type { SurfaceHandle } from "../ui/surface";
29
28
 
30
- registerSurface("panel-i18n", i18nDoc as unknown as JxDocument);
29
+ registerSurface("panel-i18n", i18nDoc);
31
30
 
32
31
  /** Which of the three bodies the panel is showing. */
33
32
  export type I18nMode =
@@ -105,7 +104,7 @@ export interface I18nSurfaceHandle {
105
104
  * Each `has*` is the flattening of a presence test: a document switches on a VALUE, so "is there a
106
105
  * failure to report" has to arrive as a boolean rather than as a string the markup could measure.
107
106
  */
108
- interface I18nScope extends Record<string, unknown> {
107
+ interface I18nScope {
109
108
  mode: I18nMode;
110
109
  settingsDisabled: boolean;
111
110
  summary: string;
@@ -166,7 +165,7 @@ export function mountI18nSurface(
166
165
  values: I18nValues,
167
166
  actions: I18nActions,
168
167
  ): I18nSurfaceHandle {
169
- const scope = reactive<I18nScope>({
168
+ const scope: I18nScope = reactive<I18nScope>({
170
169
  hasIncomplete: false,
171
170
  hasRows: false,
172
171
  hasTruncated: false,
@@ -180,7 +179,7 @@ export function mountI18nSurface(
180
179
  settingsDisabled: false,
181
180
  summary: "",
182
181
  truncated: "",
183
- }) as I18nScope;
182
+ });
184
183
  project(scope, values);
185
184
 
186
185
  let mounted: SurfaceHandle | null = null;
@@ -201,8 +200,7 @@ export function mountI18nSurface(
201
200
  /* In flight the answer is yes: nothing has landed yet, so there is nothing that could have been
202
201
  taken away. Once mounted the question is simply whether the root is still in the container —
203
202
  a panel that was switched away from had its document cleared out from under it by lit. */
204
- connected: () =>
205
- !disposed && (mounted === null || (mounted.root as Node).parentNode === container),
203
+ connected: () => !disposed && (mounted === null || mounted.root.parentNode === container),
206
204
  dispose() {
207
205
  disposed = true;
208
206
  mounted?.dispose();
@@ -33,10 +33,9 @@
33
33
  import { reactive } from "../reactivity";
34
34
  import { mountSurface, registerSurface } from "../ui/surface";
35
35
  import importsDoc from "./panel-imports.json";
36
- import type { SurfaceHandle } from "../ui/surface";
37
- import type { JxDocument } from "@jxsuite/schema/types";
36
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
38
37
 
39
- registerSurface("panel-imports", importsDoc as unknown as JxDocument);
38
+ registerSurface("panel-imports", importsDoc);
40
39
 
41
40
  /** One imported module: the name a document refers to it by, and the path it is loaded from. */
42
41
  export interface ModuleRow {
@@ -70,12 +69,6 @@ export interface PackageRow {
70
69
  components: ComponentRow[];
71
70
  }
72
71
 
73
- /** One row of the component picker: a project component this document has not imported yet. */
74
- export interface PickerOption {
75
- value: string;
76
- label: string;
77
- }
78
-
79
72
  /** What the panel shows — the flow's projection of the project and the open document. */
80
73
  export interface ImportsView {
81
74
  /**
@@ -94,7 +87,7 @@ export interface ImportsView {
94
87
  /** What the component picker currently shows. `""` is its own empty row, never a component. */
95
88
  pickerValue: string;
96
89
  /** The components this document could still import. Empty when there are none to offer. */
97
- pickerOptions: PickerOption[];
90
+ pickerOptions: SurfaceOption[];
98
91
  /**
99
92
  * The sentence drawn where the `$ref` list would be. The flow chooses it: "pick one below" and
100
93
  * "this project has none yet" are two different absences, and only the flow knows which it is
@@ -135,7 +128,7 @@ interface ImportsFlags {
135
128
  hasOptions: boolean;
136
129
  }
137
130
 
138
- interface ImportsScope extends Record<string, unknown>, ImportsView, ImportsActions, ImportsFlags {}
131
+ interface ImportsScope extends ImportsView, ImportsActions, ImportsFlags {}
139
132
 
140
133
  interface Mounted {
141
134
  scope: ImportsScope;
@@ -152,7 +145,7 @@ const mounts = new WeakMap<HTMLElement, Mounted>();
152
145
  * control lies about what it holds — and the row is what the closed control reads as, which is why
153
146
  * it is worded as the invitation rather than as a blank.
154
147
  */
155
- const PICK_NOTHING: PickerOption = { label: "Add component…", value: "" };
148
+ const PICK_NOTHING: SurfaceOption = { label: "Add component…", value: "" };
156
149
 
157
150
  /** The view plus the flags the document switches on. */
158
151
  function derive(view: ImportsView): ImportsView & ImportsFlags {
@@ -191,7 +184,7 @@ export function renderImportsSurface(
191
184
  }
192
185
  existing?.handle?.dispose();
193
186
  host.textContent = "";
194
- const scope = reactive({ ...derive(view), ...actions }) as ImportsScope;
187
+ const scope: ImportsScope = reactive<ImportsScope>({ ...derive(view), ...actions });
195
188
  const record: Mounted = { handle: null, scope };
196
189
  mounts.set(host, record);
197
190
  /* No race to arbitrate: a redraw arriving while this is in flight takes the branch above — a
@@ -40,14 +40,15 @@
40
40
  * @docs studio/design/layers
41
41
  */
42
42
 
43
+ import { isString } from "@jxsuite/schema/guards";
43
44
  import { reactive } from "../reactivity";
44
45
  import { mountSurface, registerSurface } from "../ui/surface";
45
46
  import outlineDoc from "./panel-outline.json";
46
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
47
+ import type { JxElement } from "@jxsuite/schema/types";
47
48
  import type { JxScope } from "@jxsuite/runtime/types";
48
49
  import type { SurfaceHandle } from "../ui/surface";
49
50
 
50
- registerSurface("panel-outline", outlineDoc as unknown as JxDocument);
51
+ registerSurface("panel-outline", outlineDoc);
51
52
 
52
53
  /**
53
54
  * One verb on a row, already resolved against THAT ROW'S node.
@@ -193,10 +194,13 @@ export interface OutlineActions {
193
194
  * `data-jx-path` is for.
194
195
  */
195
196
  contextMenu: (scope: JxScope, event: Event) => void;
196
- /** Run one of the row's verbs, against the row rather than against the selection. */
197
- runRow: (id: string, row: string, control: unknown) => void;
198
- /** Open the `⋮` menu under its own button. */
199
- overflowRow: (key: string, opener: unknown) => void;
197
+ /**
198
+ * Run one of the row's verbs, against the row rather than against the selection. `control` is the
199
+ * pressed button's `event.currentTarget`.
200
+ */
201
+ runRow: (id: string, row: string, control: EventTarget | null) => void;
202
+ /** Open the `⋮` menu under its own button, which arrives as the press's `event.currentTarget`. */
203
+ overflowRow: (key: string, opener: EventTarget | null) => void;
200
204
  /** The rename input's three moments. */
201
205
  editInput: (value: string) => void;
202
206
  editCommit: () => void;
@@ -221,7 +225,7 @@ export interface OutlineSurfaceHandle {
221
225
  }
222
226
 
223
227
  /** The scope the document reads: the projection, plus everything its controls can call. */
224
- interface OutlineScope extends Record<string, unknown>, OutlineValues, OutlineActions {}
228
+ interface OutlineScope extends OutlineValues, OutlineActions {}
225
229
 
226
230
  /** Write a projection into the scope. */
227
231
  function project(scope: OutlineScope, values: OutlineValues): void {
@@ -236,8 +240,8 @@ function project(scope: OutlineScope, values: OutlineValues): void {
236
240
 
237
241
  /** The `part` a node's definition carries, or "" for a text node or an unmarked element. */
238
242
  function partOf(def: JxElement | string): string {
239
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
240
- return typeof part === "string" ? part : "";
243
+ const part = isString(def) ? undefined : def.attributes?.["part"];
244
+ return isString(part) ? part : "";
241
245
  }
242
246
 
243
247
  /**
@@ -253,7 +257,7 @@ export function mountOutlineSurface(
253
257
  values: OutlineValues,
254
258
  actions: OutlineActions,
255
259
  ): OutlineSurfaceHandle {
256
- const scope = reactive<OutlineScope>({
260
+ const scope: OutlineScope = reactive<OutlineScope>({
257
261
  contextMenu: actions.contextMenu,
258
262
  current: "",
259
263
  editCancel: actions.editCancel,
@@ -278,7 +282,7 @@ export function mountOutlineSurface(
278
282
  treeReady: actions.treeReady,
279
283
  typeahead: actions.typeahead,
280
284
  view: "empty",
281
- }) as OutlineScope;
285
+ });
282
286
  project(scope, values);
283
287
 
284
288
  let mounted: SurfaceHandle | null = null;
@@ -290,12 +294,15 @@ export function mountOutlineSurface(
290
294
  const ready = mountSurface("panel-outline", scope, container, {
291
295
  onNodeCreated: (element, _path, def) => {
292
296
  /* A text node carries no `part`, so narrowing and asking are the same question — asked once,
293
- rather than as a guard clause whose only reachable answer is the one below. */
294
- const part = element instanceof HTMLElement ? partOf(def) : "";
295
- if (part === "tree") {
296
- actions.treeReady(element as HTMLElement);
297
- } else if (part === "title-input") {
298
- actions.editReady(element as HTMLElement);
297
+ as the condition around the lookup rather than as a guard clause whose only reachable
298
+ answer is the one below. */
299
+ if (element instanceof HTMLElement) {
300
+ const part = partOf(def);
301
+ if (part === "tree") {
302
+ actions.treeReady(element);
303
+ } else if (part === "title-input") {
304
+ actions.editReady(element);
305
+ }
299
306
  }
300
307
  },
301
308
  }).then((surface) => {
@@ -312,8 +319,7 @@ export function mountOutlineSurface(
312
319
  mount racing the first. Once mounted, the question is whether the root is still where it was
313
320
  put: a Navigator that painted another panel, or the stylebook's own catalogue, cleared this
314
321
  document out from under it. */
315
- connected: () =>
316
- !disposed && (mounted === null || (mounted.root as Node).parentNode === container),
322
+ connected: () => !disposed && (mounted === null || mounted.root.parentNode === container),
317
323
  dispose() {
318
324
  disposed = true;
319
325
  mounted?.dispose();
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "$schema": "https://jxsuite.com/schema/v1",
3
3
  "$id": "StudioPanelPage",
4
- "$description": "The Navigator's Page panel: everything the open document says about itself before anybody reads its body — its frontmatter, the layout it is poured into, its title, description, viewport and icon, its OpenGraph card, and the raw `$head` tags no structured control owns. ONE row vocabulary across the first four sections, told apart by `kind`, because a Title, a Layout picker and a schema-driven frontmatter field differ in what they COMMIT rather than in what they look like — and what they commit is `panels/head-panel.ts`'s decision, reached by the row's `key`. Nothing here knows what a `$head` entry is, which of them are managed, what a content collection is or that a page has a layout: the flow hands over sections whose every field is already a string and this draws them. The Custom Tags section is the one different shape — a read-only list plus the form that adds to it — because those rows are markup a reader is being SHOWN rather than a value they are editing.",
4
+ "$description": "The Inspector's Page tab (specs/studio.md §6), the former Navigator Page panel: everything the open document says about itself before anybody reads its body — its frontmatter, the layout it is poured into, its title, description, viewport and icon, its OpenGraph card, and the raw `$head` tags no structured control owns. ONE row vocabulary across the first four sections, told apart by `kind`, because a Title, a Layout picker and a schema-driven frontmatter field differ in what they COMMIT rather than in what they look like — and what they commit is `panels/head-panel.ts`'s decision, reached by the row's `key`. Nothing here knows what a `$head` entry is, which of them are managed, what a content collection is or that a page has a layout: the flow hands over sections whose every field is already a string and this draws them. The Custom Tags section is the one different shape — a read-only list plus the form that adds to it — because those rows are markup a reader is being SHOWN rather than a value they are editing.",
5
5
  "tagName": "div",
6
6
  "attributes": {
7
7
  "part": "page"
8
8
  },
9
9
  "style": {
10
- "$description": "The eleven `.imports-*` and four `.head-*` rules in `styles/panels.css` plus the row vocabulary the panel used to borrow from `styles/inspector.css` (`.style-row`, `.style-row-label`, `.set-dot`) and `styles/overlays.css` (`.media-picker`, `.media-picker-thumb`). The borrowed ones are TRANSCRIBED rather than shared, for the reason `doc-header.json` gives: a document emits no class, so a class cannot style it, and the lit panels that still draw a `.style-row` go on owning those rules until they convert. Four token repairs travel with them. `--spectrum-font-size-50` resolved only inside `<sp-theme>` and a document is mounted outside it, so every rule that read it would silently have taken its 11px fallback and stopped following the theme; each is `--jx-text-sm` here, and the two bare `10px` literals are `--jx-text-xs`. `.imports-count` read `--text-hint`, a name NO stylesheet in this package defines — an unresolvable custom property makes the whole declaration invalid at computed-value time, so the count has been inheriting its colour rather than taking the one written for it, and it says `--fg-dim`, which is what it was drawing anyway. And `.head-section-body .style-row > sp-textfield` reached INSIDE another component to widen it, which a part cannot do and no longer has to: `[part=\"widget\"]` is the field itself. Two things changed on purpose. THE CLEAR DOT IS A BUTTON — it was a `<span>` with a click handler and no role, so a row's only route to clearing its value could not be reached from the keyboard at all. AND THE ADD FORM IS STATE, not three `ref()` handles read at submit time: a document binding writes only when the scope moves, so the flow states what each field holds and clearing one after a successful add is a real change the runtime carries back.",
10
+ "$description": "The eleven `.imports-*` and four `.head-*` rules in `styles/panels.css` plus the row vocabulary the panel used to borrow from `styles/inspector.css` (`.style-row`, `.style-row-label`, `.set-dot`) and `styles/overlays.css` (`.media-picker`, `.media-picker-thumb`). The borrowed ones are TRANSCRIBED rather than shared, because a document emits no class, so a class cannot style it, and the lit panels that still draw a `.style-row` go on owning those rules until they convert. Four token repairs travel with them. `--spectrum-font-size-50` resolved only inside `<sp-theme>` and a document is mounted outside it, so every rule that read it would silently have taken its 11px fallback and stopped following the theme; each is `--jx-text-sm` here, and the two bare `10px` literals are `--jx-text-xs`. `.imports-count` read `--text-hint`, a name NO stylesheet in this package defines — an unresolvable custom property makes the whole declaration invalid at computed-value time, so the count has been inheriting its colour rather than taking the one written for it, and it says `--fg-dim`, which is what it was drawing anyway. And `.head-section-body .style-row > sp-textfield` reached INSIDE another component to widen it, which a part cannot do and no longer has to: `[part=\"widget\"]` is the field itself. Two things changed on purpose. THE CLEAR DOT IS A BUTTON — it was a `<span>` with a click handler and no role, so a row's only route to clearing its value could not be reached from the keyboard at all. AND THE ADD FORM IS STATE, not three `ref()` handles read at submit time: a document binding writes only when the scope moves, so the flow states what each field holds and clearing one after a successful add is a real change the runtime carries back.",
11
11
  "display": "block",
12
12
  "overflowY": "auto",
13
13
  "padding": "var(--jx-space-2)",
@@ -85,6 +85,19 @@
85
85
  "width": "100%",
86
86
  "minWidth": "0"
87
87
  },
88
+ "& [part=\"readout\"]": {
89
+ "$description": "A derived value set as text in the field's place, monospaced because a URL is read character by character.",
90
+ "display": "block",
91
+ "padding": "2px 0",
92
+ "overflow": "hidden",
93
+ "textOverflow": "ellipsis",
94
+ "whiteSpace": "nowrap",
95
+ "fontFamily": "var(--font-mono, monospace)",
96
+ "fontSize": "var(--jx-text-sm)"
97
+ },
98
+ "& [part=\"row-action\"]": {
99
+ "alignSelf": "flex-start"
100
+ },
88
101
  "& [part=\"note\"]": {
89
102
  "$description": "What the row could not find out — the entries of a referenced collection that is empty, or the reason listing it failed. A sentence under the control, in the row's own label size, so it reads as part of the field rather than as an error banner.",
90
103
  "margin": "0",
@@ -501,6 +514,15 @@
501
514
  ]
502
515
  }
503
516
  },
517
+ "readout": {
518
+ "$description": "A value the document derives rather than stores, such as a page's URL, which is its file's place under `pages/`. Shown, never edited here: an editable URL would be a rename, and a rename is the file tree's.",
519
+ "tagName": "output",
520
+ "attributes": {
521
+ "part": "readout",
522
+ "aria-label": "${$map.item.label}"
523
+ },
524
+ "textContent": "${$map.item.value}"
525
+ },
504
526
  "select": {
505
527
  "tagName": "jx-select",
506
528
  "attributes": {
@@ -682,6 +704,54 @@
682
704
  }
683
705
  }
684
706
  },
707
+ {
708
+ "tagName": "div",
709
+ "attributes": {
710
+ "part": "action-slot",
711
+ "role": "none"
712
+ },
713
+ "style": {
714
+ "display": "contents"
715
+ },
716
+ "$switch": {
717
+ "$ref": "$map/item/hasAction"
718
+ },
719
+ "cases": {
720
+ "true": {
721
+ "$description": "The row's one door elsewhere, named for what it opens: the Layout row's Edit template opens the layout in Design.",
722
+ "tagName": "jx-button",
723
+ "attributes": {
724
+ "part": "row-action"
725
+ },
726
+ "$props": {
727
+ "size": "sm",
728
+ "variant": "secondary"
729
+ },
730
+ "onclick": {
731
+ "$prototype": "Function",
732
+ "body": [
733
+ {
734
+ "operator": "call",
735
+ "target": {
736
+ "$ref": "#/state/runRowAction"
737
+ },
738
+ "value": [
739
+ {
740
+ "$ref": "$map/item/key"
741
+ }
742
+ ]
743
+ }
744
+ ]
745
+ },
746
+ "children": [
747
+ {
748
+ "tagName": "span",
749
+ "textContent": "${$map.item.action}"
750
+ }
751
+ ]
752
+ }
753
+ }
754
+ },
685
755
  {
686
756
  "tagName": "div",
687
757
  "attributes": {
@@ -1,6 +1,6 @@
1
1
  /// <reference lib="dom" />
2
2
  /**
3
- * The Navigator's Page panel, as a mounted document.
3
+ * The Page panel — the Inspector's Page tab (§6) — as a mounted document.
4
4
  *
5
5
  * `panels/head-panel.ts` is the flow — what a `$head` entry means, which of them a structured
6
6
  * control already owns, what the layout cascade resolves to, which realm a title lives in and what
@@ -26,16 +26,9 @@
26
26
  import { reactive } from "../reactivity";
27
27
  import { mountSurface, registerSurface } from "../ui/surface";
28
28
  import pagePanelDoc from "./panel-page.json";
29
- import type { JxDocument } from "@jxsuite/schema/types";
30
- import type { SurfaceHandle } from "../ui/surface";
29
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
31
30
 
32
- registerSurface("panel-page", pagePanelDoc as unknown as JxDocument);
33
-
34
- /** One choice in a row's picker, or in the add form's tag picker. */
35
- export interface PageChoice {
36
- value: string;
37
- label: string;
38
- }
31
+ registerSurface("panel-page", pagePanelDoc);
39
32
 
40
33
  /**
41
34
  * One row of one section, as the document reads it.
@@ -44,20 +37,27 @@ export interface PageChoice {
44
37
  * `$switch` chooses on one: a row that omitted `options` would leave the picker case reading an
45
38
  * absent path.
46
39
  *
47
- * {@link PageRow.key} and {@link PageRow.prop} are two fields for the reason the Document Header
48
- * card gives: `key` is the identity the repeater and every action use, `prop` is the name a reader,
49
- * a screenshot region and `ui/regions.ts`'s `field:<prop>` grammar see. A collection whose schema
50
- * declares a `layout` property would otherwise share an identity with the Layout picker.
40
+ * {@link PageRow.key} and {@link PageRow.prop} are two fields: `key` is the identity the repeater
41
+ * and every action use, `prop` is the name a reader, a screenshot region and `ui/regions.ts`'s
42
+ * `field:<prop>` grammar see. A collection whose schema declares a `layout` property would
43
+ * otherwise share an identity with the Layout picker.
51
44
  */
52
- export interface PageRow extends Record<string, unknown> {
45
+ export interface PageRow {
53
46
  /** The row's identity: the repeater's key, and the argument every action is given. */
54
47
  key: string;
55
48
  /** The name on `data-prop`. */
56
49
  prop: string;
57
50
  /** The visible label, already carrying the required marker where a schema asks for one. */
58
51
  label: string;
59
- /** Which control the row draws. `textarea` is a multiline text field, not a second element. */
60
- kind: "text" | "textarea" | "number" | "boolean" | "select" | "media";
52
+ /**
53
+ * Which control the row draws. `textarea` is a multiline text field, not a second element;
54
+ * `readout` is no control at all, a value the document derives (a page's URL) shown as text.
55
+ */
56
+ kind: "text" | "textarea" | "number" | "boolean" | "select" | "media" | "readout";
57
+ /** The row's one button, named for what it opens. Empty draws none. */
58
+ action: string;
59
+ /** Whether {@link PageRow.action} has anything in it; `$switch` is the document's conditional. */
60
+ hasAction: boolean;
61
61
  /**
62
62
  * Whether the value is set on this document — studio-ui-guidelines.md §4.2's dot, and the row's
63
63
  * only clear affordance.
@@ -72,7 +72,7 @@ export interface PageRow extends Record<string, unknown> {
72
72
  /** A text row's placeholder. Empty draws none. */
73
73
  placeholder: string;
74
74
  /** A picker's rows, in the order they are offered. Empty on every other kind. */
75
- options: PageChoice[];
75
+ options: SurfaceOption[];
76
76
  /** A sentence under the control — an empty collection, or a listing that failed. */
77
77
  note: string;
78
78
  /** Whether {@link PageRow.note} has anything in it; `$switch` is the document's conditional. */
@@ -84,7 +84,7 @@ export interface PageRow extends Record<string, unknown> {
84
84
  }
85
85
 
86
86
  /** One band of the panel: a heading, and the rows under it. */
87
- export interface PageSection extends Record<string, unknown> {
87
+ export interface PageSection {
88
88
  /** The repeater's key, and the `data-section` a test or a shot addresses the band by. */
89
89
  key: string;
90
90
  /** The heading, already carrying the collection's name where there is one. */
@@ -95,7 +95,7 @@ export interface PageSection extends Record<string, unknown> {
95
95
  }
96
96
 
97
97
  /** One `$head` entry no structured control owns, as the list draws it. */
98
- export interface PageTagRow extends Record<string, unknown> {
98
+ export interface PageTagRow {
99
99
  /** Unique within one projection — the repeater's key, and what Remove hands back. */
100
100
  key: string;
101
101
  /** The entry as markup, e.g. `<meta name="author">`. */
@@ -120,7 +120,7 @@ export interface PagePanelView {
120
120
  addAttr: string;
121
121
  addValue: string;
122
122
  /** The element names the add form offers. */
123
- tagOptions: PageChoice[];
123
+ tagOptions: SurfaceOption[];
124
124
  }
125
125
 
126
126
  /**
@@ -142,10 +142,12 @@ export interface PagePanelActions {
142
142
  setChoice: (key: string, value: string) => void;
143
143
  /** Open the OS file picker for a media row and assign what comes back. */
144
144
  upload: (key: string) => void;
145
- /** Open the media browser under the button that was pressed. */
146
- browse: (key: string, anchor: unknown) => void;
145
+ /** Open the media browser under the button that was pressed — the press's `event.currentTarget`. */
146
+ browse: (key: string, anchor: EventTarget | null) => void;
147
147
  /** Run the `document.openSeo` command — the door to Search appearance. */
148
148
  openSeo: () => void;
149
+ /** Press the row's own button ({@link PageRow.action}). */
150
+ runRowAction: (key: string) => void;
149
151
  /** Take one custom `$head` entry away. */
150
152
  removeEntry: (key: string) => void;
151
153
  /** State what the add form's tag picker now holds, before anything is decided about it. */
@@ -159,7 +161,7 @@ export interface PagePanelActions {
159
161
  }
160
162
 
161
163
  /** The scope the document reads: the projection, plus everything a control can ask for. */
162
- interface PagePanelScope extends Record<string, unknown>, PagePanelView, PagePanelActions {}
164
+ interface PagePanelScope extends PagePanelView, PagePanelActions {}
163
165
 
164
166
  /** Write a projection into the scope. Assignment by assignment, so an unchanged field is inert. */
165
167
  function project(scope: PagePanelScope, view: PagePanelView): void {
@@ -223,7 +225,7 @@ export function renderPagePanelSurface(
223
225
  }
224
226
  existing?.handle?.dispose();
225
227
  host.textContent = "";
226
- const scope = reactive({ ...emptyView(), ...actions }) as PagePanelScope;
228
+ const scope: PagePanelScope = reactive<PagePanelScope>({ ...emptyView(), ...actions });
227
229
  project(scope, view);
228
230
  const record: Mounted = { handle: null, scope };
229
231
  mounts.set(host, record);
@@ -238,6 +240,28 @@ export function renderPagePanelSurface(
238
240
  the next `afterRender` sees a disconnected handle and remakes the surface through the branch
239
241
  above. */
240
242
  void mountSurface("panel-page", scope, host).then((handle) => {
243
+ /* Unmounted while in flight (the Inspector's Page tab lost its document in the same turn): the
244
+ record is no longer the host's, so the surface that just landed is taken straight back out. */
245
+ if (mounts.get(host) !== record) {
246
+ handle.dispose();
247
+ return;
248
+ }
241
249
  record.handle = handle;
242
250
  });
243
251
  }
252
+
253
+ /**
254
+ * Take the panel out of `host`, if it is there — the Inspector's Page tab with no document open.
255
+ * Idempotent: a host with no mount is left as it is.
256
+ *
257
+ * @param {HTMLElement} host The panel's content area.
258
+ */
259
+ export function unmountPagePanelSurface(host: HTMLElement): void {
260
+ const existing = mounts.get(host);
261
+ if (!existing) {
262
+ return;
263
+ }
264
+ mounts.delete(host);
265
+ existing.handle?.dispose();
266
+ host.textContent = "";
267
+ }