@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
@@ -0,0 +1,306 @@
1
+ /// <reference lib="dom" />
2
+ /**
3
+ * The Collections panel — the Content workspace's Navigator panel (`specs/studio.md` §22.5).
4
+ *
5
+ * Two lists, chosen by what the focused pane shows:
6
+ *
7
+ * - **The collections.** The built-in Pages and every collection `project.json` declares, in
8
+ * declaration order, each with its entry count (from the Content home's scan,
9
+ * `browse/library-pane.ts`) and its saved grid views beneath it (`grid/grid-layout.ts`), and **+
10
+ * New collection** at the foot. Choosing one shows it in the Content home
11
+ * (`content.showCollection`); choosing a saved view opens the collection's grid on it.
12
+ * - **One collection's entries**, while an entry of it is the focused document: thumbnail, title and
13
+ * status (`content/entry-summaries.ts`), under **‹ <Collection>** to go back, with **+ New
14
+ * <item>** at the foot. Choosing one opens it where it is written (`content/entry-open.ts`).
15
+ *
16
+ * The markup is `surfaces/collections-panel.json`; this module is the flow. It is registered with
17
+ * no rail button: Content has no rail, and the workspace's frame opens the Navigator on it
18
+ * (`shell.ts`'s `WORKSPACE_PRESETS`).
19
+ *
20
+ * @docs studio/projects/browse
21
+ */
22
+
23
+ import { nothing } from "lit-html";
24
+ import { projectState, renderOnly } from "../store";
25
+ import { activeTab } from "../workspace/workspace";
26
+ import { runActiveReported } from "../commands/run-reported";
27
+ import {
28
+ PAGES_COLLECTION,
29
+ collectionKeyOfPath,
30
+ contentCollection,
31
+ contentCollections,
32
+ } from "../content/content-collections";
33
+ import {
34
+ collectionCounts,
35
+ collectionEntryPaths,
36
+ collectionView,
37
+ shownCollectionKey,
38
+ } from "../browse/library-pane";
39
+ import { localeLabel, localeOfPath, resolveI18n } from "@jxsuite/schema/locale";
40
+ import { entryLocale } from "../content/collection-pages";
41
+ import { onEntrySummariesRead, peekEntrySummaries } from "../content/entry-summaries";
42
+ import { openEntry } from "../content/entry-open";
43
+ import { workspaceHomeTabId } from "../workspace/workspace-ids";
44
+ import { makeGridTabId, parseGridTabId } from "../grid/grid-source";
45
+ import { applySavedView, listSavedViews } from "../grid/grid-layout";
46
+ import {
47
+ emptyCollectionsPanelValues,
48
+ mountCollectionsPanelSurface,
49
+ } from "../surfaces/collections-panel";
50
+ import { registerPanel } from "./panel-registry";
51
+ import type {
52
+ CollectionEntryRow,
53
+ CollectionRow,
54
+ CollectionsPanelActions,
55
+ CollectionsPanelSurfaceHandle,
56
+ CollectionsPanelValues,
57
+ } from "../surfaces/collections-panel";
58
+ import type { Tab } from "../tabs/tab";
59
+
60
+ /** The `source` every command run from here reports under. */
61
+ const SOURCE = "Collections";
62
+
63
+ /** The grid tab id a collection's saved views are stored under. */
64
+ export function collectionGridId(key: string): string {
65
+ return key === PAGES_COLLECTION
66
+ ? makeGridTabId({ kind: "pages" })
67
+ : makeGridTabId({ kind: "collection", name: key });
68
+ }
69
+
70
+ /**
71
+ * The declared collection an entry tab is writing, or `null`: the focused document is a file a
72
+ * declared collection owns. Pages are Design's, so a page tab lists the collections. A file-backed
73
+ * collection's file is no entry either: its grid lists its records, so the panel lists the
74
+ * collections with that one selected.
75
+ */
76
+ export function writingCollection(tab: Tab | null): string | null {
77
+ const key = collectionKeyOfPath(tab?.documentPath);
78
+ return key !== null && key !== PAGES_COLLECTION && !contentCollection(key)?.fileBacked
79
+ ? key
80
+ : null;
81
+ }
82
+
83
+ /** The file-backed collection whose file a tab holds, or `null`. */
84
+ function fileCollectionOf(tab: Tab): string | null {
85
+ const key = collectionKeyOfPath(tab.documentPath);
86
+ return key !== null && contentCollection(key)?.fileBacked === true ? key : null;
87
+ }
88
+
89
+ /** The collection the focused pane is showing, for the list's selected row, or `null`. */
90
+ function shownKey(tab: Tab | null): string | null {
91
+ if (!tab) {
92
+ return null;
93
+ }
94
+ if (tab.id === workspaceHomeTabId("content")) {
95
+ return shownCollectionKey();
96
+ }
97
+ const grid = parseGridTabId(tab.id);
98
+ if (grid?.kind === "pages") {
99
+ return PAGES_COLLECTION;
100
+ }
101
+ return grid?.kind === "collection" ? grid.name : fileCollectionOf(tab);
102
+ }
103
+
104
+ /** The collection list. */
105
+ function collectionRows(tab: Tab | null): CollectionRow[] {
106
+ const counts = collectionCounts();
107
+ const selected = shownKey(tab);
108
+ return contentCollections().map((collection) => {
109
+ const count = counts?.get(collection.key);
110
+ return {
111
+ count: counts === null ? "" : String(count ?? 0),
112
+ key: collection.key,
113
+ selected: collection.key === selected ? "true" : "false",
114
+ title: collection.title,
115
+ views: listSavedViews(collectionGridId(collection.key)).map((view) => ({
116
+ key: `${collection.key}\n${view.name}`,
117
+ name: view.name,
118
+ })),
119
+ };
120
+ });
121
+ }
122
+
123
+ /** Everything the panel draws right now. */
124
+ export function collectionsPanelValues(): CollectionsPanelValues {
125
+ const values = emptyCollectionsPanelValues();
126
+ if (!projectState) {
127
+ return values;
128
+ }
129
+ const tab = activeTab.value;
130
+ const writing = writingCollection(tab);
131
+ if (writing === null) {
132
+ return { ...values, body: "list", collections: collectionRows(tab) };
133
+ }
134
+ const collection = contentCollection(writing);
135
+ const counts = collectionCounts();
136
+ const paths = collectionEntryPaths(writing);
137
+ const summaries = counts === null ? null : peekEntrySummaries(writing, paths);
138
+ /* A multilingual collection's entries say which language each is in, and the list keeps to the
139
+ language the collection's view is filtered to: three translations of one exhibition are three
140
+ rows, and an unlabelled list of them reads as one entry listed thrice. */
141
+ const filter = collectionView(writing).locale;
142
+ const entries: CollectionEntryRow[] = (summaries ?? []).flatMap((entry) => {
143
+ const locale = entryLocale(entry.path) ?? "";
144
+ if (filter !== "" && locale !== filter) {
145
+ return [];
146
+ }
147
+ return [
148
+ {
149
+ art: entry.thumb === "" ? "glyph" : "image",
150
+ lang: locale,
151
+ locale: locale === "" ? "" : localeLabel(locale),
152
+ path: entry.path,
153
+ selected: entry.path === tab?.documentPath ? "true" : "false",
154
+ status: entry.status,
155
+ thumb: entry.thumb,
156
+ title: entry.title,
157
+ },
158
+ ];
159
+ });
160
+ return {
161
+ ...values,
162
+ backTitle: collection?.title ?? writing,
163
+ backCount: counts === null ? "" : String(paths.length),
164
+ body: "entries",
165
+ entries,
166
+ entriesState: summaries === null ? "loading" : entries.length === 0 ? "empty" : "listed",
167
+ newLabel: `New ${collection?.item ?? "entry"}`,
168
+ };
169
+ }
170
+
171
+ // ─── Actions ─────────────────────────────────────────────────────────────────
172
+
173
+ /**
174
+ * Open a collection's grid on a saved view.
175
+ *
176
+ * The view is written onto the grid's working layout first, so a grid opened now loads it. A grid
177
+ * already on screen has loaded its layout, so it is told through `grid.applyView`, the command the
178
+ * grid's own picker runs.
179
+ */
180
+ async function applyCollectionView(key: string, name: string): Promise<void> {
181
+ const gridId = collectionGridId(key);
182
+ const showing = activeTab.value?.id === gridId;
183
+ applySavedView(gridId, name);
184
+ if (showing) {
185
+ await runActiveReported("grid.applyView", { name }, SOURCE);
186
+ return;
187
+ }
188
+ const { openCollectionGrid, openPagesGrid } = await import("../grid/grid-open");
189
+ if (key === PAGES_COLLECTION) {
190
+ openPagesGrid();
191
+ } else {
192
+ openCollectionGrid(key);
193
+ }
194
+ }
195
+
196
+ const ACTIONS: CollectionsPanelActions = {
197
+ applyView: (key, name) => {
198
+ const [collection = ""] = key.split("\n");
199
+ void applyCollectionView(collection, name);
200
+ },
201
+ back: () => {
202
+ const writing = writingCollection(activeTab.value);
203
+ if (writing !== null) {
204
+ void runActiveReported("content.showCollection", { collection: writing }, SOURCE);
205
+ }
206
+ },
207
+ newCollection: () => {
208
+ void runActiveReported("file.new", { kind: "collection" }, SOURCE);
209
+ },
210
+ newEntry: () => {
211
+ const writing = writingCollection(activeTab.value);
212
+ void runActiveReported(
213
+ "file.new",
214
+ writing === null
215
+ ? { kind: "entry" }
216
+ : { collection: writing, kind: "entry", ...newEntryLocale(writing) },
217
+ SOURCE,
218
+ );
219
+ },
220
+ openEntry: (path) => {
221
+ void openEntry(path);
222
+ },
223
+ showCollection: (key) => {
224
+ void runActiveReported("content.showCollection", { collection: key }, SOURCE);
225
+ },
226
+ };
227
+
228
+ /**
229
+ * The language a new entry starts in from the entries list: the one the entry being written is in,
230
+ * else the one the collection's view is filtered to. Nothing when neither says, which leaves the
231
+ * dialog on the site's default.
232
+ */
233
+ export function newEntryLocale(collection: string): { locale?: string } {
234
+ const { i18n } = resolveI18n(projectState?.projectConfig ?? {});
235
+ const path = activeTab.value?.documentPath ?? null;
236
+ const own = path === null ? null : localeOfPath(path, i18n);
237
+ const locale = own ?? collectionView(collection).locale;
238
+ return locale === "" ? {} : { locale };
239
+ }
240
+
241
+ // ─── Mounting ────────────────────────────────────────────────────────────────
242
+
243
+ interface StandingPanel {
244
+ host: HTMLElement;
245
+ handle: CollectionsPanelSurfaceHandle;
246
+ }
247
+
248
+ let _standing: StandingPanel | null = null;
249
+ let _unlisten: (() => void) | null = null;
250
+
251
+ /** Repaint the Navigator, which repaints this panel when it is the one showing. */
252
+ function repaint(): void {
253
+ renderOnly("leftPanel");
254
+ }
255
+
256
+ /** Mount the surface into `host`, or bring the one already there up to date. */
257
+ function mountInto(host: HTMLElement): void {
258
+ _unlisten ??= onEntrySummariesRead(repaint);
259
+ if (_standing && (_standing.host !== host || !_standing.handle.connected())) {
260
+ _standing.handle.dispose();
261
+ _standing = null;
262
+ }
263
+ if (_standing) {
264
+ _standing.handle.update(collectionsPanelValues());
265
+ return;
266
+ }
267
+ _standing = {
268
+ handle: mountCollectionsPanelSurface(host, collectionsPanelValues(), ACTIONS),
269
+ host,
270
+ };
271
+ }
272
+
273
+ /**
274
+ * The Navigator's content area inside a panel body, where a mounted document goes (the reason is
275
+ * `panels/elements-panel.ts`'s: the body is lit's part, and its child is the box a panel owns).
276
+ */
277
+ function contentArea(body: HTMLElement): HTMLElement {
278
+ return body.querySelector<HTMLElement>(".panel-content") ?? body;
279
+ }
280
+
281
+ /**
282
+ * Contribute the Collections panel: project level (it lists the project's collections), no rail
283
+ * button (Content has no rail), the Content workspace's Navigator.
284
+ */
285
+ export function registerCollectionsPanel(): void {
286
+ registerPanel({
287
+ id: "collections",
288
+ title: "Collections",
289
+ level: "project",
290
+ dock: "navigator",
291
+ icon: "stack",
292
+ rail: false,
293
+ render: () => nothing,
294
+ afterRender: (_ctx, host) => {
295
+ mountInto(contentArea(host));
296
+ },
297
+ });
298
+ }
299
+
300
+ /** Forget the mounted panel — tests, and a project switch. */
301
+ export function resetCollectionsPanel(): void {
302
+ _standing?.handle.dispose();
303
+ _standing = null;
304
+ _unlisten?.();
305
+ _unlisten = null;
306
+ }
@@ -9,28 +9,25 @@
9
9
  import { defineElement, setSkipServerFunctions } from "@jxsuite/runtime";
10
10
  import { projectState } from "../store";
11
11
  import type { ComponentEntry } from "../files/components";
12
+ import type { JsonValue } from "@jxsuite/schema/types";
12
13
 
13
14
  /**
14
15
  * Render a live component preview by registering its custom element and instantiating it.
15
16
  *
16
17
  * @param {ComponentEntry} comp
18
+ * @param {ReadonlyMap<string, JsonValue>} [props] - Sample props (`browse/component-examples.ts`),
19
+ * set as properties before the instance connects, the way a parent's `$props` reach it (spec.md
20
+ * §16.2)
17
21
  * @returns {Promise<HTMLElement>}
18
22
  */
19
- export async function renderComponentPreview(comp: ComponentEntry) {
23
+ export async function renderComponentPreview(
24
+ comp: ComponentEntry,
25
+ props: ReadonlyMap<string, JsonValue> = new Map(),
26
+ ) {
20
27
  setSkipServerFunctions(true);
21
28
  try {
22
- if (comp.source === "npm") {
23
- if (!customElements.get(comp.tagName)) {
24
- return _componentFallback(comp.tagName);
25
- }
26
- } else {
27
- if (comp.path && !comp.path.endsWith(".json")) {
28
- // Format-class component sources (e.g. markdown) can't be imported as modules
29
- return _componentFallback(comp.tagName);
30
- }
31
- const root = projectState?.projectRoot;
32
- const url = `${location.origin}/${root ? `${root}/` : ""}${comp.path}`;
33
- await defineElement(url);
29
+ if (!(await defineComponent(comp))) {
30
+ return _componentFallback(comp.tagName);
34
31
  }
35
32
  const el = document.createElement(comp.tagName);
36
33
  for (const p of comp.props || []) {
@@ -39,6 +36,13 @@ export async function renderComponentPreview(comp: ComponentEntry) {
39
36
  el.setAttribute(p.name, val);
40
37
  }
41
38
  }
39
+ // Read at connection as the instance's own props, ahead of the attribute defaults above.
40
+ /* SAFETY: an element is an ordinary extensible object, so any string key can be written; the
41
+ instance reads each declared prop back off itself when it connects. */
42
+ const properties = el as HTMLElement & Record<string, JsonValue>;
43
+ for (const [name, value] of props) {
44
+ properties[name] = value;
45
+ }
42
46
  return el;
43
47
  } catch (error) {
44
48
  console.warn("Component preview failed:", comp.tagName, error);
@@ -46,6 +50,24 @@ export async function renderComponentPreview(comp: ComponentEntry) {
46
50
  }
47
51
  }
48
52
 
53
+ /**
54
+ * Make sure a component's element is defined in this window, registering a project definition from
55
+ * its file. Answers whether the tag can now be instantiated: a package's element only when its
56
+ * package already defined it, and a format-class source (Markdown) never, since it cannot be
57
+ * imported as a module.
58
+ */
59
+ export async function defineComponent(comp: ComponentEntry): Promise<boolean> {
60
+ if (comp.source === "npm") {
61
+ return Boolean(customElements.get(comp.tagName));
62
+ }
63
+ if (comp.path && !comp.path.endsWith(".json")) {
64
+ return false;
65
+ }
66
+ const root = projectState?.projectRoot;
67
+ await defineElement(`${location.origin}/${root ? `${root}/` : ""}${comp.path}`);
68
+ return true;
69
+ }
70
+
49
71
  /** @param {string} tagName */
50
72
  function _componentFallback(tagName: string) {
51
73
  const fallback = document.createElement("div");
@@ -2,6 +2,15 @@
2
2
  // ─── Data Explorer ──────────────────────────────────────────────────────────
3
3
 
4
4
  import { nothing } from "lit-html";
5
+ import {
6
+ isBigInt,
7
+ isBoolean,
8
+ isFunction,
9
+ isNonNullObject,
10
+ isNumber,
11
+ isString,
12
+ isSymbol,
13
+ } from "@jxsuite/schema/guards";
5
14
  import { activeTab } from "../workspace/workspace";
6
15
  import { booleanArg, stringArg, stringProperty } from "../commands/command-args";
7
16
  import { renderDataTreeSurface } from "../surfaces/panel-data";
@@ -9,6 +18,8 @@ import { registerPanel } from "./panel-registry";
9
18
  import type { PanelBody } from "./panel-registry";
10
19
  import type { DataTreeRow } from "../surfaces/panel-data";
11
20
  import type { AnyCommand, CommandRegistry } from "../commands/registry";
21
+ import type { CommandArgValues } from "../commands/command-args";
22
+ import type { ScopeRecord, ScopeValue } from "../editor/merge-tags";
12
23
 
13
24
  /**
14
25
  * The focused tab's expansion record, created on first write.
@@ -22,7 +33,7 @@ function rowsUi(): Record<string, boolean> | null {
22
33
  if (!ui) {
23
34
  return null;
24
35
  }
25
- return (ui.dataRows ??= {});
36
+ return ui.dataRows;
26
37
  }
27
38
 
28
39
  /*
@@ -44,7 +55,7 @@ function limitsUi(): Record<string, number> | null {
44
55
  if (!ui) {
45
56
  return null;
46
57
  }
47
- return (ui.dataLimits ??= {});
58
+ return ui.dataLimits;
48
59
  }
49
60
 
50
61
  /** The cap for one marker: the default, plus whatever the reader has asked for. */
@@ -89,34 +100,60 @@ function moreRow(
89
100
  };
90
101
  }
91
102
 
92
- /** A value as the tree prints it, capped at `max` characters. `undefined` prints as nothing. */
93
- function valueText(value: unknown, max: number): string {
94
- if (typeof value === "string" && value.length > max) {
103
+ /**
104
+ * A value as the tree prints it, capped at `max` characters. `undefined` prints as nothing, and so
105
+ * do a function and a symbol: those are the values `JSON.stringify` answers with no text at all.
106
+ */
107
+ function valueText(value: ScopeValue, max: number): string {
108
+ if (isString(value) && value.length > max) {
95
109
  return `"${value.slice(0, max)}…"`;
96
110
  }
97
- return JSON.stringify(value) ?? "";
111
+ return value === undefined || isFunction(value) || isSymbol(value) ? "" : JSON.stringify(value);
112
+ }
113
+
114
+ /** Each primitive kind, in the spelling `typeof` gives it, with the guard that establishes it. */
115
+ const PRIMITIVE_KINDS: readonly (readonly [string, (value: ScopeValue) => boolean])[] = [
116
+ ["string", isString],
117
+ ["number", isNumber],
118
+ ["boolean", isBoolean],
119
+ ["bigint", isBigInt],
120
+ ["symbol", isSymbol],
121
+ ["function", isFunction],
122
+ ];
123
+
124
+ /** The `typeof` name of a value that is neither `null` nor an object. */
125
+ function primitiveKind(value: ScopeValue): string {
126
+ return PRIMITIVE_KINDS.find(([, test]) => test(value))?.[0] ?? "undefined";
98
127
  }
99
128
 
100
129
  /** Which colour a value takes. `null` and a summary label are the two the tree actually paints. */
101
- function toneOf(value: unknown): string {
102
- return value === null ? "null" : typeof value;
130
+ function toneOf(value: ScopeValue): string {
131
+ return value === null ? "null" : primitiveKind(value);
132
+ }
133
+
134
+ /**
135
+ * A value the tree can open: an array or a record. `isNonNullObject` is a `typeof "object"` test,
136
+ * so it already refuses a function; this predicate is what tells the type checker so.
137
+ */
138
+ function isOpenable(value: ScopeValue): value is ScopeValue[] | ScopeRecord {
139
+ return isNonNullObject(value);
103
140
  }
104
141
 
105
142
  /** `Array(3)` or `{2}` — what a value you can open says while it is closed. */
106
- function summaryLabel(value: object): string {
143
+ function summaryLabel(value: ScopeValue[] | ScopeRecord): string {
107
144
  return Array.isArray(value) ? `Array(${value.length})` : `{${Object.keys(value).length}}`;
108
145
  }
109
146
 
110
147
  /** Unwrap a Vue ref (has .value and .__v_isRef) to get the underlying value. */
111
- export function unwrapSignal(value: unknown) {
112
- if (value && typeof value === "object" && (value as Record<string, unknown>).__v_isRef) {
113
- return (value as Record<string, unknown>).value;
148
+ export function unwrapSignal(value: ScopeValue): ScopeValue {
149
+ if (isOpenable(value) && !Array.isArray(value) && value.__v_isRef) {
150
+ return value.value;
114
151
  }
115
152
  return value;
116
153
  }
117
154
 
118
155
  /** Type label for a signal value in the data explorer. */
119
- export function dataTypeLabel(value: unknown) {
156
+ export function dataTypeLabel(value: ScopeValue): string {
120
157
  const v = unwrapSignal(value);
121
158
  if (v === null) {
122
159
  return "null";
@@ -127,10 +164,10 @@ export function dataTypeLabel(value: unknown) {
127
164
  if (Array.isArray(v)) {
128
165
  return `Array(${v.length})`;
129
166
  }
130
- if (typeof v === "object") {
167
+ if (isOpenable(v)) {
131
168
  return `{${Object.keys(v).length}}`;
132
169
  }
133
- return typeof v;
170
+ return primitiveKind(v);
134
171
  }
135
172
 
136
173
  /* THE VALUE LIST IS GONE, AND ITS ROWS ARE THE DEFINITION ROWS — `panels/signals-panel.ts`.
@@ -148,14 +185,14 @@ export function dataTypeLabel(value: unknown) {
148
185
  * each carry their own indent. Nothing else changed: the caps are the same caps, the text is
149
186
  * truncated at the same lengths, and a capped list still ends in a marker.
150
187
  *
151
- * @param {unknown} value The resolved value to read.
188
+ * @param {ScopeValue} value The resolved value to read.
152
189
  * @param {number} depth How deep this call already is; the indent is derived from it.
153
190
  * @param {number} [maxDepth] The default depth cap, before whatever the reader has raised.
154
191
  * @param {string} path This subtree's path, which is what a raised limit is remembered against.
155
192
  * @returns {DataTreeRow[]}
156
193
  */
157
194
  export function dataTreeRows(
158
- value: unknown,
195
+ value: ScopeValue,
159
196
  depth: number,
160
197
  maxDepth = 5,
161
198
  path = "",
@@ -182,21 +219,21 @@ export function dataTreeRows(
182
219
  if (value === null || value === undefined) {
183
220
  return [row("", String(value), "null", path)];
184
221
  }
185
- if (typeof value !== "object") {
222
+ if (!isOpenable(value)) {
186
223
  return [row("", valueText(value, 200), toneOf(value), path)];
187
224
  }
188
225
 
189
226
  const array = Array.isArray(value);
190
- const entries: [string, string, unknown][] = array
227
+ const entries: [string, string, ScopeValue][] = array
191
228
  ? value.map((item, i) => [`${i}`, `[${i}] `, item])
192
- : Object.keys(value).map((key) => [key, `${key}: `, (value as Record<string, unknown>)[key]]);
229
+ : Object.keys(value).map((key) => [key, `${key}: `, value[key]]);
193
230
  const limit = array ? "items" : "keys";
194
231
  const cap = capFor(path, limit, array ? 20 : 30);
195
232
 
196
233
  const rows: DataTreeRow[] = [];
197
234
  for (const [segment, label, item] of entries.slice(0, cap)) {
198
235
  const childPath = `${path}/${segment}`;
199
- if (item === null || item === undefined || typeof item !== "object") {
236
+ if (!isOpenable(item)) {
200
237
  rows.push(row(label, valueText(item, 80), toneOf(item), childPath));
201
238
  continue;
202
239
  }
@@ -222,14 +259,14 @@ export function dataTreeRows(
222
259
  * repaint instead of this sweeping per host.
223
260
  *
224
261
  * @param {HTMLElement} host The node the tree is drawn into.
225
- * @param {unknown} value What the canvas resolved this entry to.
262
+ * @param {ScopeValue} value What the canvas resolved this entry to.
226
263
  * @param {string} path The subtree's path, which is what a raised limit is remembered against.
227
264
  * @param {() => void} rerender Repaint the panel, so that a raised limit is drawn.
228
265
  * @param {number} [maxDepth] The default depth cap, before whatever the reader has raised.
229
266
  */
230
267
  export function paintDataTree(
231
268
  host: HTMLElement,
232
- value: unknown,
269
+ value: ScopeValue,
233
270
  path: string,
234
271
  rerender: () => void,
235
272
  maxDepth = 5,
@@ -327,7 +364,7 @@ export function dataExplorerCommands(deps: DataExplorerCommandDeps): AnyCommand[
327
364
  group: "5_data",
328
365
  requires: "an open document that defines data",
329
366
  when: (ctx) => ctx.document.open,
330
- run: (_commandCtx, args) => {
367
+ run: (_commandCtx, args: CommandArgValues) => {
331
368
  const name = stringArg("data.expandRow", args, "name");
332
369
  const defined = definedDataNames();
333
370
  if (!defined.includes(name)) {
@@ -336,7 +373,7 @@ export function dataExplorerCommands(deps: DataExplorerCommandDeps): AnyCommand[
336
373
  `document — it defines: ${defined.length > 0 ? defined.join(", ") : "nothing"}`,
337
374
  );
338
375
  }
339
- const { expanded } = args as { expanded?: unknown };
376
+ const { expanded } = args;
340
377
  // `expanded` defaults to true but is never COERCED: `{ expanded: "no" }` would otherwise
341
378
  // Read as a collapse, which is the class of silent wrong answer this whole record exists
342
379
  // To stop.
@@ -382,7 +419,7 @@ export function registerDataExplorerCommands(
382
419
  * **Both halves are documents now** — `surfaces/panel-signals.{json,ts}` for the entry list and its
383
420
  * editors, `surfaces/panel-data.{json,ts}` for the value tree under an open row. So lit draws
384
421
  * nothing at all here: `render` returns `nothing` and `afterRender` mounts against the painted DOM,
385
- * which is the seam `panels/git-panel.ts` uses for the same reason. The mount comes through `deps`
422
+ * which is the seam every document-bodied Navigator panel uses. The mount comes through `deps`
386
423
  * rather than an import — this module owns the expansion store that one reads, so importing it back
387
424
  * would close a cycle — and it is idempotent, so running on every repaint is what keeps the
388
425
  * projection current.
@@ -23,10 +23,11 @@ import { mountDataActionsSurface } from "../surfaces/data-actions";
23
23
  import { mountPushPlanSurface } from "../surfaces/push-plan";
24
24
  import { dataSurfaceAvailable, pushSchema, testConnection } from "../services/data-service";
25
25
  import { openGridSourcePicker } from "../grid/grid-open";
26
+ import { closeSettingsDialog } from "../settings/settings-dialog";
26
27
  import type { DataActionsSurfaceHandle, DataActionsView } from "../surfaces/data-actions";
27
28
  import type { DialogSurfaceHandle } from "../surfaces/dialog";
28
29
  import type { PushPlanSurfaceHandle, PushPlanView } from "../surfaces/push-plan";
29
- import type { DataConnectionTestResult, DataPushResult } from "../types";
30
+ import type { DataConnectionTestResult, DataPushRequest, DataPushResult } from "../types";
30
31
  import type { SectionActionsContext } from "../settings/contributed-section";
31
32
 
32
33
  // ─── Grid opening (delegates to the grid-tab source picker) ──────────────────
@@ -75,7 +76,7 @@ function noteRows(texts: readonly string[], prefix: string) {
75
76
  }
76
77
 
77
78
  /** What the body lists: the dry run until it has been applied, then what actually happened. */
78
- function planView(state: PushDialogState): PushPlanView {
79
+ function planView(state: Pick<PushDialogState, "dryRun" | "phase" | "result">): PushPlanView {
79
80
  const shown = state.phase === "done" ? state.result : state.dryRun;
80
81
  return {
81
82
  errors: noteRows(shown?.errors ?? [], "error"),
@@ -129,27 +130,28 @@ export async function startPush(connection: string | undefined, onDone: () => vo
129
130
  if (pushDialog) {
130
131
  return;
131
132
  }
132
- const state: PushDialogState = {
133
+ /* The dialog's callbacks need the state record and the record needs the dialog's handle, so the
134
+ record is built first and completed with the handle below; it stays one object throughout. */
135
+ const pending: Omit<PushDialogState, "handle"> = {
133
136
  connection,
134
137
  dryRun: null,
135
- handle: null as unknown as DialogSurfaceHandle,
136
138
  onDone,
137
139
  phase: "loading",
138
140
  plan: null,
139
141
  result: null,
140
142
  };
141
- state.handle = openDialogSurface({
143
+ const handle = openDialogSurface({
142
144
  cancelLabel: "Cancel",
143
145
  confirmLabel: "",
144
146
  headline: connection ? `Push Schema — ${connection}` : "Push Schema",
145
147
  island: (host) => {
146
- state.plan = mountPushPlanSurface(host, planView(state));
148
+ pending.plan = mountPushPlanSurface(host, planView(pending));
147
149
  },
148
150
  layer: layerHost("dialog"),
149
151
  message: "Compiling plan…",
150
152
  onCancel: closePushDialog,
151
153
  onClosed: () => {
152
- if (pushDialog === state) {
154
+ if (pushDialog === pending) {
153
155
  closePushDialog();
154
156
  }
155
157
  },
@@ -158,12 +160,14 @@ export async function startPush(connection: string | undefined, onDone: () => vo
158
160
  },
159
161
  region: "data/push",
160
162
  });
163
+ const state: PushDialogState = Object.assign(pending, { handle });
161
164
  pushDialog = state;
162
165
 
163
- const plan = await pushSchema({
164
- dryRun: true,
165
- ...(connection === undefined ? {} : { connection }),
166
- });
166
+ const request: DataPushRequest = { dryRun: true };
167
+ if (connection !== undefined) {
168
+ request.connection = connection;
169
+ }
170
+ const plan = await pushSchema(request);
167
171
  if (pushDialog !== state) {
168
172
  return;
169
173
  }
@@ -274,6 +278,9 @@ function paintSectionActions(
274
278
  host,
275
279
  mountDataActionsSurface(host, projectActions(sectionKey, selected), {
276
280
  openGrid: () => {
281
+ /* The actions row is drawn in the settings dialog, and a grid opens as a TAB: left up, the
282
+ dialog would cover the very tab the reader asked for (§17.1). */
283
+ closeSettingsDialog();
277
284
  void openGridSourcePicker();
278
285
  },
279
286
  push: () => {