@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
@@ -31,6 +31,7 @@
31
31
  * find-replace in those two call sites.
32
32
  */
33
33
 
34
+ import { isJsonPrimitive, isString } from "@jxsuite/schema/guards";
34
35
  import { getPlatform } from "../platform";
35
36
  import { flattenTree, nodeLabel, projectState } from "../store";
36
37
  import { documentExtensions, formatByExtension, loadFormats } from "../format/format-host";
@@ -45,7 +46,7 @@ import { activeRegistry } from "../commands/active-registry";
45
46
  import { runActiveReported, runReported } from "../commands/run-reported";
46
47
  import type { PaletteMode } from "../commands/defaults";
47
48
  import type { AnyCommand, CommandRegistry } from "../commands/registry";
48
- import type { JxDocument, JxMutableNode } from "@jxsuite/schema/types";
49
+ import type { CommandArgValues } from "../commands/command-args";
49
50
  import type { SurfaceHandle } from "../ui/surface";
50
51
  import type { JxPath } from "../state";
51
52
 
@@ -123,6 +124,12 @@ export function modeSpec(mode: PaletteMode): PaletteModeSpec {
123
124
  return MODE_SPEC.get(mode) ?? PALETTE_MODES[0]!;
124
125
  }
125
126
 
127
+ /** The mode an input resolves to, and the query left once a prefix has moved into the chip. */
128
+ export interface ResolvedPaletteMode {
129
+ mode: PaletteMode;
130
+ query: string;
131
+ }
132
+
126
133
  /**
127
134
  * The mode a raw input actually addresses.
128
135
  *
@@ -139,7 +146,7 @@ export function resolvePaletteMode(
139
146
  requested: PaletteMode,
140
147
  raw: string,
141
148
  projectOpen: boolean,
142
- ): { mode: PaletteMode; query: string } {
149
+ ): ResolvedPaletteMode {
143
150
  const prefixed = PREFIXED_MODES.find((spec) => raw.startsWith(spec.prefix));
144
151
  if (prefixed) {
145
152
  return resolvePaletteMode(prefixed.mode, raw.slice(1), projectOpen);
@@ -220,7 +227,7 @@ export function rankBy<T>(items: readonly T[], query: string, key: (item: T) =>
220
227
 
221
228
  /** One offered value for a command's single argument. */
222
229
  export interface PaletteArgChoice {
223
- value: unknown;
230
+ value: string | boolean;
224
231
  label: string;
225
232
  }
226
233
 
@@ -230,11 +237,6 @@ export type PaletteArgs =
230
237
  | { kind: "choice"; name: string; choices: PaletteArgChoice[] }
231
238
  | { kind: "unsupported" };
232
239
 
233
- interface ArgsSchemaShape {
234
- properties?: Record<string, { type?: string; enum?: readonly unknown[]; description?: string }>;
235
- required?: readonly string[];
236
- }
237
-
238
240
  /**
239
241
  * How a command's arguments are asked for.
240
242
  *
@@ -246,7 +248,7 @@ interface ArgsSchemaShape {
246
248
  * a command that gains an enum argument becomes promptable without anyone editing this file.
247
249
  */
248
250
  export function paletteArgs(command: AnyCommand): PaletteArgs {
249
- const schema = command.args as ArgsSchemaShape | undefined;
251
+ const schema = command.args;
250
252
  const properties = schema?.properties;
251
253
  if (!schema || !properties) {
252
254
  return { kind: "none" };
@@ -308,7 +310,7 @@ const RECENT_COMMANDS_MAX = 6;
308
310
  export function getRecentCommands(): string[] {
309
311
  try {
310
312
  const raw: unknown = JSON.parse(localStorage.getItem(RECENT_COMMANDS_KEY) || "[]");
311
- return Array.isArray(raw) ? raw.filter((id) => typeof id === "string") : [];
313
+ return Array.isArray(raw) ? raw.filter((id) => isString(id)) : [];
312
314
  } catch {
313
315
  return [];
314
316
  }
@@ -370,7 +372,7 @@ interface ArgRow {
370
372
  kind: "arg";
371
373
  commandId: string;
372
374
  argName: string;
373
- value: unknown;
375
+ value: string | boolean;
374
376
  name: string;
375
377
  detail: string;
376
378
  }
@@ -437,7 +439,7 @@ export function isQuickSearchOpen(): boolean {
437
439
 
438
440
  /** The project root scoping the palette, or null when no project is open. */
439
441
  function scopeRoot(): string | null {
440
- return projectState ? (projectState.projectRoot ?? null) : null;
442
+ return projectState ? projectState.projectRoot : null;
441
443
  }
442
444
 
443
445
  function hasProject(): boolean {
@@ -445,7 +447,7 @@ function hasProject(): boolean {
445
447
  }
446
448
 
447
449
  /** The mode and query the current input resolves to. */
448
- function current(): { mode: PaletteMode; query: string } {
450
+ function current(): ResolvedPaletteMode {
449
451
  return resolvePaletteMode(_requested, _query, hasProject());
450
452
  }
451
453
 
@@ -465,6 +467,15 @@ function shortenPath(path: string) {
465
467
  return path;
466
468
  }
467
469
 
470
+ /**
471
+ * What a file row reads from a search hit. `name` is optional because the cloud adapter hands back
472
+ * its response body unvalidated, so a hit without one falls back to the path's last segment.
473
+ */
474
+ interface SearchHit {
475
+ path: string;
476
+ name?: string;
477
+ }
478
+
468
479
  /**
469
480
  * Fetch the project's document set once per open.
470
481
  *
@@ -480,7 +491,7 @@ async function ensureFiles(): Promise<void> {
480
491
  renderOverlay();
481
492
  try {
482
493
  await loadFormats();
483
- const hits = await getPlatform().searchFiles("", documentExtensions());
494
+ const hits: readonly SearchHit[] = await getPlatform().searchFiles("", documentExtensions());
484
495
  _files = hits.map((hit) => ({
485
496
  kind: "file" as const,
486
497
  path: hit.path,
@@ -566,23 +577,27 @@ function nodeRows(query: string): NodeRow[] {
566
577
  const rows: NodeRow[] = flattenTree(tab.doc.document).map((row) => ({
567
578
  kind: "node" as const,
568
579
  path: row.path,
569
- name:
570
- row.nodeType === "text"
571
- ? String(row.node).slice(0, 60)
572
- : nodeLabel(row.node as JxMutableNode),
580
+ // A primitive is exactly what `flattenTree` emits as a "text" row; every other row is a node.
581
+ name: isJsonPrimitive(row.node) ? String(row.node).slice(0, 60) : nodeLabel(row.node),
573
582
  detail: row.nodeType,
574
583
  }));
575
584
  return rankBy(rows, query.trim(), (row) => row.name);
576
585
  }
577
586
 
578
587
  function modeRows(): ModeRow[] {
579
- return PALETTE_MODES.filter((spec) => spec.mode !== "picker").map((spec) => ({
580
- kind: "mode" as const,
581
- mode: spec.mode,
582
- name: spec.chip,
583
- detail: spec.description,
584
- chord: spec.prefix,
585
- }));
588
+ return PALETTE_MODES.flatMap((spec) =>
589
+ spec.mode === "picker"
590
+ ? []
591
+ : [
592
+ {
593
+ kind: "mode" as const,
594
+ mode: spec.mode,
595
+ name: spec.chip,
596
+ detail: spec.description,
597
+ chord: spec.prefix,
598
+ },
599
+ ],
600
+ );
586
601
  }
587
602
 
588
603
  function argRows(query: string): ArgRow[] {
@@ -598,8 +613,14 @@ function argRows(query: string): ArgRow[] {
598
613
  return rankBy(rows, query.trim(), (row) => row.name);
599
614
  }
600
615
 
616
+ /** What the list draws: its rows, and whether they are a "recent" listing rather than a search. */
617
+ interface CurrentRows {
618
+ rows: PaletteRow[];
619
+ showingRecent: boolean;
620
+ }
621
+
601
622
  /** The rows for the current input, and whether they are a "recent" listing rather than a search. */
602
- function currentRows(): { rows: PaletteRow[]; showingRecent: boolean } {
623
+ function currentRows(): CurrentRows {
603
624
  const { mode, query } = current();
604
625
  if (_pending) {
605
626
  return { rows: argRows(query), showingRecent: false };
@@ -669,7 +690,7 @@ function enterMode(mode: PaletteMode) {
669
690
  void ensureFiles();
670
691
  }
671
692
 
672
- function runCommand(command: AnyCommand, args?: Record<string, unknown>) {
693
+ function runCommand(command: AnyCommand, args?: CommandArgValues) {
673
694
  const registry = activeRegistry();
674
695
  if (!registry) {
675
696
  return;
@@ -838,7 +859,7 @@ export interface PaletteRowProjection {
838
859
  chord: string;
839
860
  }
840
861
 
841
- interface PaletteScope extends Record<string, unknown> {
862
+ interface PaletteScope {
842
863
  open: boolean;
843
864
  hasChip: boolean;
844
865
  chipLabel: string;
@@ -863,10 +884,11 @@ interface PaletteScope extends Record<string, unknown> {
863
884
  activate: () => void;
864
885
  clearMode: () => void;
865
886
  hover: (index: number) => void;
866
- activateRow: (value: unknown) => void;
887
+ /** The `select` detail of the picked `jx-option`: its `value` attribute, a string. */
888
+ activateRow: (value: string) => void;
867
889
  }
868
890
 
869
- registerSurface("palette", paletteDoc as unknown as JxDocument);
891
+ registerSurface("palette", paletteDoc);
870
892
 
871
893
  let _scope: PaletteScope | null = null;
872
894
  let _mount: Promise<SurfaceHandle> | null = null;
@@ -924,7 +946,7 @@ function scope(): PaletteScope {
924
946
  rows: [],
925
947
  sectionLabel: "",
926
948
  showSection: false,
927
- }) as PaletteScope;
949
+ });
928
950
  return _scope;
929
951
  }
930
952
 
@@ -1,17 +1,27 @@
1
1
  /// <reference lib="dom" />
2
2
  /**
3
- * Right panel — the Inspector dock: four tabs, one dock, one column.
3
+ * Right panel — the Inspector dock: three tabs, five views, one column (§6).
4
4
  *
5
- * **Content · Style · Logic · Assistant**, text-labelled. Three of those are renames of what was
6
- * here (Properties→Content, Events→Logic) and the fourth is the assistant, folded in from the fifth
7
- * grid column it used to own — which is the point of §3.1's "no assistant column": an inspector tab
8
- * costs zero additional width, so the canvas gets the ~300px back and the assistant is still one
9
- * key away.
5
+ * **Page · Element · Assistant**, text-labelled. Page is the open document's own settings (the
6
+ * former Navigator Page panel, re-hosted), titled for what the document is: Page, Template,
7
+ * Component, Entry or Document. Element is the selected node, and keeps the three views the strip
8
+ * used to spend three tabs on — Content, Style, Logic — behind a sub-switch in its body. The
9
+ * Assistant is folded in from the grid column it used to own, which is the point of §3.1's "no
10
+ * assistant column": an inspector tab costs zero additional width.
11
+ *
12
+ * The five LEAVES stay addressable (`shell.ts`'s `INSPECTOR_TAB_IDS`): `view.setRightTab { tab:
13
+ * "style" }` shows Element with Style chosen, and ⌘⇧1–5 follow the leaves left to right.
14
+ *
15
+ * **The strip follows the selection, and yields to the author.** When the selection goes from empty
16
+ * to non-empty while Page is showing, the strip switches to Element on the leaf last used there;
17
+ * when it becomes empty while Element is showing, it switches to Page. Only the TRANSITION
18
+ * switches: a tab the author clicks is kept until the selection next crosses empty, and the
19
+ * Assistant is never switched away from.
10
20
  *
11
21
  * **This file no longer draws anything.** The dock's markup, its ARIA and its style are
12
22
  * `surfaces/inspector-dock.json`, mounted through `surfaces/inspector-dock.ts`; what is left here
13
- * is the flow — which tab is selected, what the tab is pointed at, and which of the four seams each
14
- * body host is handed to. Two things came out of the move:
23
+ * is the flow — which leaf is selected, what the tab is pointed at, and which of the five seams
24
+ * each body host is handed to. Two things came out of the move:
15
25
  *
16
26
  * - **The strip is a real `tablist`.** It was `sp-tabs` with no `tabpanel` on the other end, so the
17
27
  * four bodies were anonymous scrolling divs: a screen reader was told a tab was selected and
@@ -27,21 +37,31 @@
27
37
  * already holds, so there is nothing to withhold.
28
38
  */
29
39
 
30
- import { getNodeAtPath, nodeLabel, rightPanel } from "../store";
40
+ import { getNodeAtPath, nodeLabel, requireShellRef, rightPanel } from "../store";
31
41
  import { effect, effectScope, reactive } from "../reactivity";
32
42
  import { activeTab } from "../workspace/workspace";
33
43
  import { primarySelection } from "../tabs/selection";
44
+ import { stylebookTarget } from "../style/stylebook-target";
34
45
  import { bindLogicPanelHost } from "./events-panel";
35
46
  import { bindContentHost } from "./properties-panel";
36
47
 
37
- import { DEFAULT_INSPECTOR_TAB, isInspectorTabId, shell } from "../shell";
38
- import { INSPECTOR_TABS } from "../commands/defaults";
48
+ import {
49
+ DEFAULT_ELEMENT_TAB,
50
+ DEFAULT_INSPECTOR_TAB,
51
+ isElementTabId,
52
+ isInspectorTabId,
53
+ shell,
54
+ } from "../shell";
55
+ import { INSPECTOR_STRIP, INSPECTOR_TABS } from "../commands/defaults";
56
+ import { bindPageHost, PAGE_TAB_EMPTY, pageTabTitle, renderPageTab } from "./head-panel";
39
57
  import { inspectorTabRegion } from "../ui/regions";
40
58
  import { bindStyleHost } from "./style-panel";
41
59
  import { mountInspectorDock } from "../surfaces/inspector-dock";
42
60
 
43
61
  import type { InspectorDockHandle, InspectorTabView } from "../surfaces/inspector-dock";
44
- import type { InspectorTabId } from "../shell";
62
+ import type { ElementTabId, InspectorTabId } from "../shell";
63
+ import type { InspectorStripId } from "../commands/defaults";
64
+ import type { Tab } from "../tabs/tab";
45
65
  import type { EffectScope } from "@vue/reactivity";
46
66
 
47
67
  interface RightPanelCtx {
@@ -74,7 +94,17 @@ let _dock: InspectorDockHandle | null = null;
74
94
  * reports whether the assistant is showing, and a plain field would leave that button lying on the
75
95
  * welcome screen — which is the whole class of bug `shell.ts` was split out to end.
76
96
  */
77
- const _detached = reactive({ tab: DEFAULT_INSPECTOR_TAB as InspectorTabId });
97
+ const _detached = reactive<{ tab: InspectorTabId; element: ElementTabId }>({
98
+ element: DEFAULT_ELEMENT_TAB,
99
+ tab: DEFAULT_INSPECTOR_TAB,
100
+ });
101
+
102
+ /**
103
+ * Whether each document had a selection the last time the dock looked, so the strip switches on a
104
+ * TRANSITION through empty rather than on every repaint (§6). Keyed on the tab, so focusing another
105
+ * document is not mistaken for its selection appearing.
106
+ */
107
+ const _hadSelection = new WeakMap<Tab, boolean>();
78
108
 
79
109
  /**
80
110
  * Hand one tab's body host to its owner, once, and never let that stop the dock.
@@ -95,15 +125,21 @@ function bindBody(ctx: RightPanelCtx, tabId: string, host: HTMLElement): void {
95
125
  }
96
126
 
97
127
  /**
98
- * The four seams, keyed by the tab whose body feeds them.
128
+ * The five seams, keyed by the leaf whose body feeds them.
99
129
  *
100
130
  * A table rather than a chain of `if`s so that the ONE thing this module still does with a body
101
- * host is stated in one place. Every entry is a binder another module published: three of them
102
- * mount a document of their own into the host, and the assistant's arrives from `studio.ts` because
103
- * a matching import here would be a cycle.
131
+ * host is stated in one place. Every entry is a binder another module published: four of them mount
132
+ * a document of their own into the host, and the assistant's arrives from `studio.ts` because a
133
+ * matching import here would be a cycle.
104
134
  */
105
135
  function bindBodyUnguarded(ctx: RightPanelCtx, tabId: string, host: HTMLElement): void {
106
136
  switch (tabId) {
137
+ case "page": {
138
+ /* The former Navigator Page panel, re-hosted unchanged: `head-panel.ts` draws it against the
139
+ focused document and empties it when nothing is open. */
140
+ bindPageHost(host);
141
+ break;
142
+ }
107
143
  case "assistant": {
108
144
  /* The assistant owns its container for the life of the window: it is the mount point for the
109
145
  Assistant's own Jx document, and rebuilding it would drop the transcript and the composer
@@ -127,7 +163,10 @@ function bindBodyUnguarded(ctx: RightPanelCtx, tabId: string, host: HTMLElement)
127
163
  /* The canvas mode is what the tab cannot read for itself — Stylebook edits a tag catalogue
128
164
  entry and Edit edits the selection — so it comes in from `studio.ts` the same way the
129
165
  Content tab's navigation door does. */
130
- bindStyleHost(host, { getCanvasMode: ctx.getCanvasMode });
166
+ bindStyleHost(host, {
167
+ getCanvasMode: ctx.getCanvasMode,
168
+ isShowing: () => inspectorTab() === "style",
169
+ });
131
170
  break;
132
171
  }
133
172
  default: {
@@ -139,16 +178,49 @@ function bindBodyUnguarded(ctx: RightPanelCtx, tabId: string, host: HTMLElement)
139
178
  }
140
179
  }
141
180
 
142
- /** The tab rows the document draws, with the selection resolved onto them. */
181
+ /** Which strip tab hosts a leaf. */
182
+ export function stripOf(leaf: InspectorTabId): InspectorStripId {
183
+ return INSPECTOR_TABS.find((tab) => tab.id === leaf)?.strip ?? "page";
184
+ }
185
+
186
+ /** The Page tab's title for the focused document (§6), or "Page" with nothing open. */
187
+ function pageTitle(): string {
188
+ const tab = activeTab.value;
189
+ return tab ? pageTabTitle(tab.documentPath) : "Page";
190
+ }
191
+
192
+ /** What a strip tab is called on screen: Page's title is the document's kind. */
193
+ function stripTitle(id: InspectorStripId): string {
194
+ return id === "page" ? pageTitle() : (INSPECTOR_STRIP.find((tab) => tab.id === id)?.title ?? id);
195
+ }
196
+
197
+ /** The tab rows the document draws, with the selected leaf resolved onto them. */
143
198
  function tabViews(selected: InspectorTabId): InspectorTabView[] {
144
- return INSPECTOR_TABS.map((tab) => ({
145
- active: tab.id === selected,
146
- key: tab.id,
147
- panelId: `inspector-panel-${tab.id}`,
148
- region: inspectorTabRegion(tab.id),
149
- tabId: `inspector-tab-${tab.id}`,
150
- title: tab.title,
151
- }));
199
+ const strip = stripOf(selected);
200
+ const noDocument = activeTab.value === null;
201
+ return INSPECTOR_STRIP.map((tab) => {
202
+ const leaves = INSPECTOR_TABS.filter((leaf) => leaf.strip === tab.id).map((leaf) => {
203
+ const empty = leaf.id === "page" && noDocument ? PAGE_TAB_EMPTY : "";
204
+ return {
205
+ active: leaf.id === selected,
206
+ empty,
207
+ hasEmpty: empty !== "",
208
+ key: leaf.id,
209
+ region: inspectorTabRegion(leaf.id),
210
+ shown: leaf.id === selected ? ("true" as const) : ("false" as const),
211
+ title: leaf.title,
212
+ };
213
+ });
214
+ return {
215
+ active: tab.id === strip,
216
+ hasLeaves: leaves.length > 1,
217
+ key: tab.id,
218
+ leaves,
219
+ panelId: `inspector-panel-${tab.id}`,
220
+ tabId: `inspector-tab-${tab.id}`,
221
+ title: stripTitle(tab.id),
222
+ };
223
+ });
152
224
  }
153
225
 
154
226
  /**
@@ -158,7 +230,7 @@ function tabViews(selected: InspectorTabId): InspectorTabView[] {
158
230
  */
159
231
  export function mount(ctx: RightPanelCtx) {
160
232
  _dock = mountInspectorDock(
161
- rightPanel,
233
+ requireShellRef(rightPanel, "right-panel"),
162
234
  values(),
163
235
  { selectTab: (id) => selectFromStrip(id) },
164
236
  { onBody: (tabId, host) => bindBody(ctx, tabId, host) },
@@ -176,10 +248,15 @@ export function mount(ctx: RightPanelCtx) {
176
248
  if (tab) {
177
249
  // Track properties the right panel reads
178
250
  void tab.doc.document;
251
+ // The Page tab reads the realm a content page keeps its head in, and its kind.
252
+ void tab.doc.mode;
253
+ void tab.doc.content;
254
+ void tab.documentPath;
179
255
  // The whole SET, joined — a bare property read would not re-trigger when the selection
180
256
  // Changes WITHIN the array, and §6.7's helpers always replace it but nothing enforces that.
181
257
  void tab.session.selection.map((path) => path.join("/")).join("|");
182
258
  void tab.session.ui.rightTab;
259
+ followSelection(tab);
183
260
  }
184
261
  void _detached.tab;
185
262
  render();
@@ -197,33 +274,89 @@ export function unmount() {
197
274
  bindLogicPanelHost(null);
198
275
  bindContentHost(null);
199
276
  bindStyleHost(null);
277
+ bindPageHost(null);
200
278
  _detached.tab = DEFAULT_INSPECTOR_TAB;
279
+ _detached.element = DEFAULT_ELEMENT_TAB;
280
+ }
281
+
282
+ /**
283
+ * Switch the strip on a selection transition through empty (§6), and only then.
284
+ *
285
+ * Empty → non-empty while Page shows: Element, on the leaf last used there. Non-empty → empty while
286
+ * an Element leaf shows: Page. The first look at a document records its state and switches nothing,
287
+ * so focusing another tab is not a transition, and the Assistant is never left by this. Layout
288
+ * chrome counts as a selection: the Content view is what explains it. So does a Styles specimen's
289
+ * tag, which is a selection of the catalogue rather than of the document.
290
+ */
291
+ function followSelection(tab: Tab): void {
292
+ // A tag picked in the Styles workspace's Elements view is a selection too: it is what the Style
293
+ // Leaf is editing, and it leaves the document selection empty (`selectStylebookTag`).
294
+ const has =
295
+ tab.session.selection.length > 0 ||
296
+ shell.layoutSelection !== null ||
297
+ stylebookTarget(tab) !== null;
298
+ const had = _hadSelection.get(tab);
299
+ _hadSelection.set(tab, has);
300
+ if (had === undefined || had === has) {
301
+ return;
302
+ }
303
+ const current = inspectorTab();
304
+ if (has && current === "page") {
305
+ setInspectorTab(lastElementTab());
306
+ } else if (!has && isElementTabId(current)) {
307
+ setInspectorTab("page");
308
+ }
309
+ }
310
+
311
+ /**
312
+ * The tab the strip rests on when nothing chose one (§6): Page with nothing selected, otherwise the
313
+ * Element leaf last used. What closing the Assistant steps onto.
314
+ */
315
+ export function restingInspectorTab(): InspectorTabId {
316
+ const tab = activeTab.value;
317
+ const has = tab !== null && (tab.session.selection.length > 0 || shell.layoutSelection !== null);
318
+ return has ? lastElementTab() : "page";
319
+ }
320
+
321
+ /** The Element leaf last shown for the focused document, or with nothing open. */
322
+ function lastElementTab(): ElementTabId {
323
+ const tab = activeTab.value;
324
+ const stored: unknown = tab ? tab.session.ui.elementTab : _detached.element;
325
+ return isElementTabId(stored) ? stored : DEFAULT_ELEMENT_TAB;
201
326
  }
202
327
 
203
328
  /** The whole projection the document reads, built fresh from the state it names. */
204
329
  function values() {
205
330
  const tab = inspectorTab();
331
+ const strip = stripOf(tab);
206
332
  return {
207
- tab,
333
+ tab: strip,
208
334
  tabs: tabViews(tab),
209
- target: inspectorTarget(),
210
- title: INSPECTOR_TABS.find((t) => t.id === tab)?.title ?? tab,
335
+ target: inspectorTarget(tab),
336
+ title: stripTitle(strip),
211
337
  };
212
338
  }
213
339
 
214
340
  /**
215
341
  * Bring the dock up to date. Synchronous, and idempotent: the runtime skips a binding whose value
216
342
  * did not move, so an explicit caller can never take a control mid-interaction.
343
+ *
344
+ * The Page body is redrawn only while it is the leaf showing: it builds a merged-head preview per
345
+ * paint, and a hidden one would pay for that on every selection change. Showing it draws it.
217
346
  */
218
347
  export function render() {
219
- _dock?.update(values());
348
+ const view = values();
349
+ _dock?.update(view);
350
+ if (inspectorTab() === "page") {
351
+ renderPageTab();
352
+ }
220
353
  }
221
354
 
222
355
  /**
223
- * The tab showing right now — the stored value, coerced to a declared one.
356
+ * The leaf showing right now — the stored value, coerced to a declared one.
224
357
  *
225
358
  * Coercion rather than trust because the value is persisted session state: a build that spelled a
226
- * tab differently, or an automation step that guessed, must land on Content rather than on a blank
359
+ * tab differently, or an automation step that guessed, must land on Page rather than on a blank
227
360
  * dock with no tab selected.
228
361
  */
229
362
  export function inspectorTab(): InspectorTabId {
@@ -243,38 +376,51 @@ export function setInspectorTab(tab: InspectorTabId): void {
243
376
  const aTab = activeTab.value;
244
377
  if (aTab) {
245
378
  aTab.session.ui.rightTab = tab;
379
+ if (isElementTabId(tab)) {
380
+ aTab.session.ui.elementTab = tab;
381
+ }
246
382
  } else {
247
383
  _detached.tab = tab;
384
+ if (isElementTabId(tab)) {
385
+ _detached.element = tab;
386
+ }
248
387
  }
249
388
  render();
250
389
  }
251
390
 
252
391
  /**
253
- * A pick from the strip.
392
+ * A pick from the strip, or from Element's sub-switch.
254
393
  *
255
394
  * The strip states a value and this decides what it means, which is why the document dispatches an
256
- * id rather than writing one: an id the enum does not declare is refused here rather than becoming
257
- * a dock with no tab selected.
395
+ * id rather than writing one. `element` is a strip id with no leaf of its own: it means "the
396
+ * Element view I last used". Any other id must be a declared leaf, so an id the enum does not
397
+ * declare is refused here rather than becoming a dock with no tab selected.
258
398
  */
259
399
  function selectFromStrip(id: string): void {
260
- if (id !== "" && id !== inspectorTab() && isInspectorTabId(id)) {
261
- setInspectorTab(id);
400
+ const leaf = id === "element" ? lastElementTab() : id;
401
+ if (leaf !== "" && leaf !== inspectorTab() && isInspectorTabId(leaf)) {
402
+ setInspectorTab(leaf);
262
403
  }
263
404
  }
264
405
 
265
406
  /**
266
407
  * What the selected tab is pointed AT, in the fewest words that are true.
267
408
  *
268
- * A tag name when a node is selected, the document's own name when nothing is, and "no document"
269
- * when there is nothing open. The dock spent its whole life unable to answer this — three icon tabs
270
- * and no statement of target anywhere — which is how "why is this field disabled" became a question
271
- * with no on-screen answer.
409
+ * A tag name when a node is selected, the document's own name when nothing is or when the Page tab
410
+ * is showing (it edits the document, whatever is selected), and "no document" when there is nothing
411
+ * open. The dock spent its whole life unable to answer this — three icon tabs and no statement of
412
+ * target anywhere — which is how "why is this field disabled" became a question with no on-screen
413
+ * answer.
272
414
  */
273
- function inspectorTarget(): string {
415
+ function inspectorTarget(showing: InspectorTabId): string {
274
416
  const tab = activeTab.value;
275
417
  if (!tab) {
276
418
  return "no document";
277
419
  }
420
+ // The Page tab edits the document whatever is selected, so it is pointed at the document.
421
+ if (showing === "page") {
422
+ return documentName(tab.documentPath);
423
+ }
278
424
  // Layout chrome first: it is mutually exclusive with a document selection, and it is the one
279
425
  // Target whose name has to say where it came FROM — "<header> in layouts/base.json" is the whole
280
426
  // Answer to "why can I not edit this".
@@ -282,6 +428,12 @@ function inspectorTarget(): string {
282
428
  if (layout) {
283
429
  return `<${layout.tagName || "element"}> in ${layout.layoutFile || "the layout"}`;
284
430
  }
431
+ // The Styles workspace's Elements view styles a TAG: name it, as the Style body's `h1 · Base`
432
+ // Does, rather than whatever node the document selection happens to hold.
433
+ const tag = stylebookTarget(tab);
434
+ if (tag) {
435
+ return tag;
436
+ }
285
437
  const paths = tab.session.selection;
286
438
  const selection = primarySelection(paths);
287
439
  if (selection) {
@@ -291,6 +443,10 @@ function inspectorTarget(): string {
291
443
  ? `${paths.length} elements`
292
444
  : nodeLabel(getNodeAtPath(tab.doc.document, selection));
293
445
  }
294
- const path = tab.documentPath;
446
+ return documentName(tab.documentPath);
447
+ }
448
+
449
+ /** A document's own name in the header: its file name, or "document" for an unsaved one. */
450
+ function documentName(path: string | null | undefined): string {
295
451
  return path ? (path.split("/").at(-1) ?? "document") : "document";
296
452
  }