@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
@@ -3,14 +3,16 @@
3
3
  * Layers panel — the Outline: the document tree, with collapse, selection, drag-and-drop
4
4
  * reordering, and per-row actions that are RENDERINGS of the command registry.
5
5
  *
6
- * **One panel, two bodies, and both of them are documents now.** The tree is
7
- * `surfaces/panel-outline.json`; the Project Styles catalogue is
6
+ * **One panel, two bodies, and both of them are documents.** The tree is
7
+ * `surfaces/panel-outline.json`; the element catalogue a document's Elements view lists is
8
8
  * `surfaces/panel-stylebook-layers.json` (`panels/stylebook-layers-panel.ts`). This module renders
9
- * neither. It owns the record — only the record can know which body the pane is asking for — and
9
+ * neither. It owns the record (only the record can know which body the pane is asking for) and
10
10
  * everything that is a DECISION: which rows exist and in what order, what a row is called, what the
11
11
  * window onto them is, which verbs the registry places on which row, and the whole of the keyboard
12
12
  * model. The surface reads values. The two bodies are appended into the same `.panel-content`, so
13
- * each mode takes the other's document down on the way in; that symmetry is the whole of the seam.
13
+ * each mode takes the other's document down on the way in. The Variables view has no body here:
14
+ * `project.json`'s custom properties are listed by the Styles workspace's own Navigator panel
15
+ * (`panels/styles-panel.ts`, §7.1).
14
16
  *
15
17
  * Four things this file is deliberate about.
16
18
  *
@@ -27,7 +29,7 @@
27
29
  * **A row says something.** On a real page the tree was a wall of rows all reading "div": only
28
30
  * text-bearing nodes got a preview and containers got the tag they already wear as a coloured
29
31
  * badge. {@link outlineLabel} derives an identity instead — a title, an `$id`, a class, a landmark
30
- * name, the first text inside — and returns "" rather than repeat the badge.
32
+ * name, the text it owns (never a descendant row's) — and returns "" rather than repeat the badge.
31
33
  *
32
34
  * **It is a tree, and it is reachable.** `role="tree"` / `role="treeitem"` with a roving tabindex
33
35
  * and the arrow-key model ARIA specifies: ↑↓ walk the visible rows, → expands then descends, ←
@@ -47,7 +49,15 @@
47
49
  */
48
50
 
49
51
  import { nothing } from "lit-html";
50
- import { displayTagName, isTagExpression, tagNameCandidates } from "@jxsuite/schema/guards";
52
+ import {
53
+ displayTagName,
54
+ isMappedArray,
55
+ isNonNullObject,
56
+ isNumber,
57
+ isString,
58
+ isTagExpression,
59
+ tagNameCandidates,
60
+ } from "@jxsuite/schema/guards";
51
61
  import {
52
62
  VOID_ELEMENTS,
53
63
  childIndex,
@@ -60,7 +70,7 @@ import {
60
70
  } from "../store";
61
71
  import { activeTab } from "../workspace/workspace";
62
72
  import {
63
- isSelected as isPathSelected,
73
+ isSelected,
64
74
  primarySelection,
65
75
  rangeSelection,
66
76
  selectionAnchor,
@@ -72,8 +82,14 @@ import { mutateUpdateProperty, transactDoc } from "../tabs/transact";
72
82
  import { view } from "../view";
73
83
  import { setActivityTab } from "../shell";
74
84
  import { registerPanel } from "./panel-registry";
75
- import { detachStylebookLayers, mountStylebookLayersPanel } from "./stylebook-layers-panel";
85
+ import {
86
+ INDENT_BASE,
87
+ INDENT_STEP,
88
+ detachStylebookLayers,
89
+ mountStylebookLayersPanel,
90
+ } from "./stylebook-layers-panel";
76
91
  import { selectStylebookTag, stylebookMeta } from "./stylebook-panel";
92
+ import { PROJECT_STYLES_VIEW } from "../style/project-styles";
77
93
  import { isInlineElement } from "../editor/inline-edit";
78
94
  import { showContextMenu } from "../editor/context-menu";
79
95
  import { revealPathInCanvas } from "../canvas/popover-state";
@@ -115,17 +131,17 @@ const TEXT_PREVIEW_MAX = 40;
115
131
  * Deliberately short. `section`, `ul` and `table` are omitted: "Section" next to a `section` badge
116
132
  * is the repetition this function exists to remove.
117
133
  */
118
- const LANDMARK_NAMES: Readonly<Record<string, string>> = {
119
- article: "Article",
120
- aside: "Sidebar",
121
- dialog: "Dialog",
122
- figure: "Figure",
123
- footer: "Footer",
124
- form: "Form",
125
- header: "Header",
126
- main: "Main",
127
- nav: "Navigation",
128
- };
134
+ const LANDMARK_NAMES: ReadonlyMap<string, string> = new Map([
135
+ ["article", "Article"],
136
+ ["aside", "Sidebar"],
137
+ ["dialog", "Dialog"],
138
+ ["figure", "Figure"],
139
+ ["footer", "Footer"],
140
+ ["form", "Form"],
141
+ ["header", "Header"],
142
+ ["main", "Main"],
143
+ ["nav", "Navigation"],
144
+ ]);
129
145
 
130
146
  /** Trim and ellipsize to {@link LABEL_MAX}. */
131
147
  function truncate(text: string): string {
@@ -134,37 +150,38 @@ function truncate(text: string): string {
134
150
  }
135
151
 
136
152
  /**
137
- * The first text anywhere under `node`, or "".
153
+ * The text `node` OWNS, or "": its string children, and the text of its inline children.
138
154
  *
139
- * Bounded at three levels and short-circuited on the first hit: a container's identity is usually
140
- * its heading or its first line, and walking a whole subtree per row would cost the render what the
141
- * five-buttons-per-row build already cost it.
155
+ * Inline children (`strong`, `a`, …) never get a row of their own ({@link buildOutlineRows} skips
156
+ * them), so their words belong to the row that holds them. A block child's text does not: it is
157
+ * that child's row's to show. Borrowing it — what the bounded "first text under" walk did — made a
158
+ * `section > div > div > h2` read the heading four times over, one row above the other.
142
159
  */
143
- function firstText(node: JxMutableNode, depth = 0): string {
144
- if (typeof node.textContent === "string" && node.textContent.trim()) {
160
+ function ownText(node: JxMutableNode): string {
161
+ if (isString(node.textContent)) {
145
162
  return node.textContent.trim();
146
163
  }
147
- if (depth >= 3 || !Array.isArray(node.children)) {
164
+ if (!Array.isArray(node.children)) {
148
165
  return "";
149
166
  }
167
+ let text = "";
150
168
  for (const child of node.children) {
151
- if (typeof child === "string" && child.trim()) {
152
- return child.trim();
169
+ if (isString(child)) {
170
+ text += child;
171
+ } else if (isNonNullObject(child) && isInlineElement(child, node)) {
172
+ text += ownText(child);
153
173
  }
154
- if (child && typeof child === "object") {
155
- const found = firstText(child, depth + 1);
156
- if (found) {
157
- return found;
158
- }
174
+ if (text.length > LABEL_MAX * 2) {
175
+ break;
159
176
  }
160
177
  }
161
- return "";
178
+ return text.trim();
162
179
  }
163
180
 
164
181
  /** The node's first class name, when it has a plain (unbound) `class` attribute. */
165
182
  function firstClass(node: JxMutableNode): string {
166
183
  const value = node.attributes?.class;
167
- return typeof value === "string" ? (value.trim().split(/\s+/u)[0] ?? "") : "";
184
+ return isString(value) ? (value.trim().split(/\s+/u)[0] ?? "") : "";
168
185
  }
169
186
 
170
187
  /**
@@ -188,20 +205,20 @@ export function outlineLabel(node: JxMutableNode): string {
188
205
  if (node.$id) {
189
206
  return `#${truncate(node.$id)}`;
190
207
  }
191
- if (typeof node.textContent === "string" && node.textContent.trim()) {
208
+ if (isString(node.textContent) && node.textContent.trim()) {
192
209
  return truncate(node.textContent);
193
210
  }
194
211
  const cls = firstClass(node);
195
212
  if (cls) {
196
213
  return `.${truncate(cls)}`;
197
214
  }
198
- const landmark = LANDMARK_NAMES[displayTagName(node.tagName).toLowerCase()];
215
+ const landmark = LANDMARK_NAMES.get(displayTagName(node.tagName).toLowerCase());
199
216
  if (landmark) {
200
217
  return landmark;
201
218
  }
202
- const inner = firstText(node);
203
- if (inner) {
204
- return `“${truncate(inner)}”`;
219
+ const own = ownText(node);
220
+ if (own) {
221
+ return `“${truncate(own)}”`;
205
222
  }
206
223
  const count = Array.isArray(node.children) ? node.children.length : 0;
207
224
  return count > 0 ? `${count} item${count === 1 ? "" : "s"}` : "";
@@ -256,12 +273,11 @@ export function rowCommandViews(
256
273
  // ─── The tree, as a keyboard surface ─────────────────────────────────────────
257
274
 
258
275
  /**
259
- * Pixels of indent per level, the depth past which the column stops paying, and the row's own
260
- * gutter.
276
+ * The depth past which the column stops paying. The pixels per level and the row's own gutter are
277
+ * the Stylebook layers panel's {@link INDENT_STEP} and {@link INDENT_BASE}, so the two trees indent
278
+ * alike.
261
279
  */
262
- const INDENT_STEP = 16;
263
280
  const INDENT_MAX_DEPTH = 6;
264
- const INDENT_BASE = 8;
265
281
 
266
282
  /**
267
283
  * The indent for `depth`, capped.
@@ -275,7 +291,7 @@ export function indentWidth(depth: number): number {
275
291
 
276
292
  /** The inverse of {@link pathKey}: numeric segments come back as numbers, as the doc stores them. */
277
293
  function pathFromKey(key: string): JxPath {
278
- return key ? (key.split("/").map((s) => (/^\d+$/u.test(s) ? Number(s) : s)) as JxPath) : [];
294
+ return key ? key.split("/").map((s) => (/^\d+$/u.test(s) ? Number(s) : s)) : [];
279
295
  }
280
296
 
281
297
  // ─── The row model, and the window onto it ───────────────────────────────────
@@ -288,7 +304,7 @@ function pathFromKey(key: string): JxPath {
288
304
  * window only. Splitting the two is the whole saving — the expensive half is the kit elements a
289
305
  * row's cluster mounts, not the walk that finds it.
290
306
  */
291
- interface OutlineRow {
307
+ interface OutlineRowFacts {
292
308
  /** `pathKey(path)` — the drag-and-drop and roving-focus key, and the `$map`'s reconcile key. */
293
309
  key: string;
294
310
  path: JxPath;
@@ -303,7 +319,6 @@ interface OutlineRow {
303
319
  * than quietly start selecting text nodes.
304
320
  */
305
321
  item: boolean;
306
- node: JxMutableNode | string | number | boolean;
307
322
  nodeType: string;
308
323
  /** 1-based position among the row's `role="treeitem"` siblings — see {@link numberOutlineSets}. */
309
324
  posInSet: number;
@@ -311,6 +326,20 @@ interface OutlineRow {
311
326
  setSize: number;
312
327
  }
313
328
 
329
+ /** A `role="treeitem"` row: an element, a repeater, a template or a case, always an object node. */
330
+ interface OutlineItemRow extends OutlineRowFacts {
331
+ item: true;
332
+ node: JxMutableNode;
333
+ }
334
+
335
+ /** A text-node row: drawn, but not a tree item. Its node is the bare child primitive. */
336
+ interface OutlineTextRow extends OutlineRowFacts {
337
+ item: false;
338
+ node: JxMutableNode | string | number | boolean;
339
+ }
340
+
341
+ type OutlineRow = OutlineItemRow | OutlineTextRow;
342
+
314
343
  /**
315
344
  * The declared height of one row — `surfaces/panel-outline.json`'s `[part="row"] { block-size }`.
316
345
  *
@@ -456,6 +485,11 @@ function watchOutlineTree(): void {
456
485
  * reorder, canvas to Outline sync, a collaborator's cursor, a jump from Problems — needs the
457
486
  * unambiguous one.
458
487
  */
488
+ /** Whether a decoded `data-jx-path` is a path: an array of string and number segments. */
489
+ function isJxPath(value: unknown): value is JxPath {
490
+ return Array.isArray(value) && value.every((segment) => isString(segment) || isNumber(segment));
491
+ }
492
+
459
493
  export function outlineRowPath(el: Element | null): JxPath | null {
460
494
  const row = el?.closest<HTMLElement>("[data-jx-path]");
461
495
  if (!row?.dataset.jxPath) {
@@ -463,7 +497,7 @@ export function outlineRowPath(el: Element | null): JxPath | null {
463
497
  }
464
498
  try {
465
499
  const parsed: unknown = JSON.parse(row.dataset.jxPath);
466
- return Array.isArray(parsed) ? (parsed as JxPath) : null;
500
+ return isJxPath(parsed) ? parsed : null;
467
501
  } catch {
468
502
  return null;
469
503
  }
@@ -674,7 +708,7 @@ function outlineRowLabel(row: OutlineRow): string {
674
708
  const text = String(row.node);
675
709
  return text.length > TEXT_PREVIEW_MAX ? `${text.slice(0, TEXT_PREVIEW_MAX)}…` : text;
676
710
  }
677
- const node = row.node as JxMutableNode;
711
+ const { node } = row;
678
712
  return row.nodeType === "case-ref" ? node.$ref || "external" : outlineLabel(node);
679
713
  }
680
714
 
@@ -733,7 +767,7 @@ export function startLayerTitleEdit(path: JxPath, rerender: () => void) {
733
767
  /* The row's own node, not a second `getNodeAtPath` walk: the model already holds it, and reading
734
768
  it back off the model is what makes "a text line has no `$title` to write" a real branch rather
735
769
  than a defensive null check nothing can reach. */
736
- if (!row?.item || typeof row.node !== "object") {
770
+ if (!row?.item) {
737
771
  return;
738
772
  }
739
773
  _editing = { key: row.key, rerender, text: row.node.$title || "" };
@@ -827,9 +861,11 @@ function buildOutlineRows(doc: JxMutableNode, mode: string, collapsed: Set<strin
827
861
  }
828
862
 
829
863
  const isText = nodeType === "text";
864
+ /** The row's node when it is a tree item; `null` for a text-node row. */
865
+ let element: JxMutableNode | null = null;
830
866
  if (!isText) {
831
867
  // After the text-node branch, a row's node is a JxMutableNode or it is not a row at all.
832
- if (typeof node !== "object" || node === null) {
868
+ if (!isNonNullObject(node)) {
833
869
  continue;
834
870
  }
835
871
  if (path.length >= 2 && nodeType === "element") {
@@ -839,22 +875,28 @@ function buildOutlineRows(doc: JxMutableNode, mode: string, collapsed: Set<strin
839
875
  continue;
840
876
  }
841
877
  }
878
+ element = node;
842
879
  }
843
880
 
844
881
  while (ancestors.length > 0 && rows[ancestors.at(-1)!]!.depth >= depth) {
845
882
  ancestors.pop();
846
883
  }
847
- rows.push({
848
- depth,
849
- item: !isText,
850
- key,
851
- node,
852
- nodeType,
853
- parent: ancestors.at(-1) ?? -1,
854
- path,
855
- posInSet: 0,
856
- setSize: 0,
857
- });
884
+ const parent = ancestors.at(-1) ?? -1;
885
+ rows.push(
886
+ element === null
887
+ ? { depth, item: false, key, node, nodeType, parent, path, posInSet: 0, setSize: 0 }
888
+ : {
889
+ depth,
890
+ item: true,
891
+ key,
892
+ node: element,
893
+ nodeType,
894
+ parent,
895
+ path,
896
+ posInSet: 0,
897
+ setSize: 0,
898
+ },
899
+ );
858
900
  ancestors.push(rows.length - 1);
859
901
  }
860
902
  return numberOutlineSets(rows);
@@ -890,30 +932,20 @@ function numberOutlineSets(rows: OutlineRow[]): OutlineRow[] {
890
932
 
891
933
  /** Whether the row has anything under it — children, a map template, or `$switch` cases. */
892
934
  function isExpandable(row: OutlineRow): boolean {
893
- if (!row.item || typeof row.node !== "object") {
935
+ if (!row.item) {
894
936
  return false;
895
937
  }
896
- const node = row.node as JxMutableNode;
938
+ const { node } = row;
897
939
  const hasChildren = Array.isArray(node.children) && node.children.length > 0;
898
- const hasMapChildren =
899
- node.children !== undefined &&
900
- typeof node.children === "object" &&
901
- (node.children as unknown as Record<string, unknown>).$prototype === "Array";
940
+ const hasMapChildren = isMappedArray(node.children);
902
941
  const hasCases =
903
- Boolean(node.$switch) &&
904
- typeof node.cases === "object" &&
905
- node.cases !== null &&
906
- Object.keys(node.cases).length > 0;
942
+ Boolean(node.$switch) && isNonNullObject(node.cases) && Object.keys(node.cases).length > 0;
907
943
  return hasChildren || hasMapChildren || hasCases || (row.nodeType === "map" && Boolean(node.map));
908
944
  }
909
945
 
910
946
  /** The badge: what it says, which of the six drawings it gets, and what it says on hover. */
911
- function rowBadge(row: OutlineRow): {
912
- badge: string;
913
- badgeKind: string;
914
- badgeTitle: string | null;
915
- } {
916
- const node = row.node as JxMutableNode;
947
+ function rowBadge(row: OutlineItemRow): Pick<OutlineRowView, "badge" | "badgeKind" | "badgeTitle"> {
948
+ const { node } = row;
917
949
  if (row.nodeType === "map") {
918
950
  return { badge: "↻", badgeKind: "map", badgeTitle: "Repeating list — one copy per item" };
919
951
  }
@@ -930,9 +962,7 @@ function rowBadge(row: OutlineRow): {
930
962
  badge: "▣",
931
963
  badgeKind: "slot",
932
964
  badgeTitle:
933
- typeof slotName === "string" && slotName.trim()
934
- ? `Slot "${slotName.trim()}"`
935
- : "Default slot",
965
+ isString(slotName) && slotName.trim() ? `Slot "${slotName.trim()}"` : "Default slot",
936
966
  };
937
967
  }
938
968
  /* The ROW BADGE, which is the one place the tag is shown as itself rather than folded into a
@@ -994,10 +1024,9 @@ function outlineRowView(
994
1024
  if (!row.item) {
995
1025
  return textRowView(row);
996
1026
  }
997
- const { depth, key, nodeType, path } = row;
998
- const node = row.node as JxMutableNode;
1027
+ const { depth, key, node, nodeType, path } = row;
999
1028
 
1000
- const selected = isPathSelected(doc.selection, path);
1029
+ const selected = isSelected(doc.selection, path);
1001
1030
  const expandable = isExpandable(row);
1002
1031
  // Array nodes can't accept dropped children (their content is the single map template), so they
1003
1032
  // Block the make-child drop instruction like void elements do.
@@ -1006,8 +1035,7 @@ function outlineRowView(
1006
1035
  // Array (repeater) nodes are first-class structural nodes — movable/draggable/deletable like
1007
1036
  // Elements. Both sit at a numeric child index; templates (path tail "map") and case nodes do
1008
1037
  // Not, so they stay selectable/editable but not structurally manipulable.
1009
- const structural =
1010
- (nodeType === "element" || nodeType === "map") && typeof childIndex(path) === "number";
1038
+ const structural = (nodeType === "element" || nodeType === "map") && isNumber(childIndex(path));
1011
1039
  const isRoot = doc.mode === "content" ? path.length === 0 : path.length < 2;
1012
1040
  const grabbable = structural && !isRoot;
1013
1041
  const open = expandable && !collapsed.has(key);
@@ -1118,9 +1146,9 @@ export function outlineValues(): OutlineValues {
1118
1146
  /**
1119
1147
  * The surface standing in the Navigator, and the node it was mounted into.
1120
1148
  *
1121
- * One slot rather than a per-host map, for the reason `panels/stylebook-layers-panel.ts` gives:
1122
- * there is one Navigator, so a mount into a DIFFERENT node is the old one being replaced, and
1123
- * holding both would leave the first one's effects running against a scope nobody writes any more.
1149
+ * One slot rather than a per-host map, for the reason `panels/elements-panel.ts` gives: there is
1150
+ * one Navigator, so a mount into a DIFFERENT node is the old one being replaced, and holding both
1151
+ * would leave the first one's effects running against a scope nobody writes any more.
1124
1152
  */
1125
1153
  let standing: { host: HTMLElement; handle: OutlineSurfaceHandle } | null = null;
1126
1154
  /** Re-register drag-and-drop once the rows the projection asked for are actually in the DOM. */
@@ -1187,7 +1215,7 @@ function revealChangedSelection(): void {
1187
1215
  function revealSelectedRow(): void {
1188
1216
  const drawn = _outlineList?.querySelector(`${ROW_SELECTOR}[aria-selected="true"]`);
1189
1217
  if (drawn) {
1190
- drawn.scrollIntoView?.({ behavior: "smooth", block: "nearest" });
1218
+ drawn.scrollIntoView({ behavior: "smooth", block: "nearest" });
1191
1219
  return;
1192
1220
  }
1193
1221
  revealOutlineRow(outlineIndexOfPath(primarySelection(activeTab.value?.session.selection)));
@@ -1244,9 +1272,9 @@ export function mountOutlinePanel(
1244
1272
  standing = {
1245
1273
  handle: mountOutlineSurface(target, values, {
1246
1274
  contextMenu: (_scope, event) => {
1247
- const path = outlineRowPath(event.target as Element | null);
1248
- if (path) {
1249
- showContextMenu(event as MouseEvent, path, { rerender: () => _outlineRerender?.() });
1275
+ const path = outlineRowPath(event.target instanceof Element ? event.target : null);
1276
+ if (path && event instanceof MouseEvent) {
1277
+ showContextMenu(event, path, { rerender: () => _outlineRerender?.() });
1250
1278
  redrawOutline();
1251
1279
  }
1252
1280
  },
@@ -1260,10 +1288,9 @@ export function mountOutlinePanel(
1260
1288
  mount would, and the host decides when it is worth anything. An unconnected input
1261
1289
  cannot take focus. */
1262
1290
  queueMicrotask(() => {
1263
- const input = element as HTMLInputElement;
1264
- if (input.isConnected) {
1265
- input.focus();
1266
- input.select?.();
1291
+ if (element instanceof HTMLInputElement && element.isConnected) {
1292
+ element.focus();
1293
+ element.select();
1267
1294
  }
1268
1295
  });
1269
1296
  },
@@ -1330,7 +1357,7 @@ export function mountOutlinePanel(
1330
1357
  /**
1331
1358
  * Take the tree down.
1332
1359
  *
1333
- * Called by the record when the pane starts showing Project Styles. Without it the document
1360
+ * Called by the record when the pane starts showing an Elements view. Without it the document
1334
1361
  * survives its own irrelevance: both bodies are appended into the same `.panel-content`, so the one
1335
1362
  * nobody took down sits under the one that replaced it for the rest of the session.
1336
1363
  */
@@ -1365,18 +1392,20 @@ export function registerLayersPanel(): void {
1365
1392
  requiresDocument: "Open a page to see the elements it is built from.",
1366
1393
  /*
1367
1394
  * One panel, two bodies, and neither of them is lit's. The body is a document either way, so
1368
- * there is nothing for lit to draw here — a document CLEARS nothing and is APPENDED, and lit's
1395
+ * there is nothing for lit to draw here: a document CLEARS nothing and is APPENDED, and lit's
1369
1396
  * own comment markers inside `.panel-content` are what it finds its (empty) content by.
1370
1397
  */
1371
1398
  render: (): PanelBody => nothing,
1372
1399
  /*
1373
- * `afterRender` runs on every repaint, and both mounts are idempotent — the standing surface is
1400
+ * `afterRender` runs on every repaint, and both mounts are idempotent: the standing surface is
1374
1401
  * updated where it is still there and re-mounted only where something has taken it out. The
1375
1402
  * detach on each side is not symmetry for its own sake: the two documents are appended into the
1376
1403
  * same node, so a body nobody took down would sit under the one that replaced it.
1377
1404
  */
1378
1405
  afterRender: (ctx, host) => {
1379
- if (ctx.deps.getCanvasMode() === "stylebook") {
1406
+ /* A document's Elements view lists the element catalogue; every other view draws the tree,
1407
+ Variables and Code included. */
1408
+ if (ctx.deps.getCanvasMode() === PROJECT_STYLES_VIEW) {
1380
1409
  detachOutline();
1381
1410
  mountStylebookLayersPanel({ selectStylebookTag, stylebookMeta }, host);
1382
1411
  return;
@@ -27,7 +27,7 @@
27
27
  */
28
28
 
29
29
  import { render as litRender } from "lit-html";
30
- import { leftPanel } from "../store";
30
+ import { leftPanel, requireShellRef } from "../store";
31
31
  import { effect, effectScope } from "../reactivity";
32
32
  import { activeTab } from "../workspace/workspace";
33
33
  import { shell } from "../shell";
@@ -72,11 +72,28 @@ export function mount(deps: NavigatorPanelDeps) {
72
72
  _deps = deps;
73
73
  registerNavigatorPanels();
74
74
  _dock = mountNavigatorDock(
75
- leftPanel,
75
+ requireShellRef(leftPanel, "left-panel"),
76
76
  { panels: [panelView()] },
77
77
  {
78
78
  onContent: (panelId, host) => {
79
+ const switched = _content !== null && _content.panelId !== panelId;
79
80
  _content = { host, panelId };
81
+ /* `#left-panel` is the ONE scroller every panel draws in (the dock's root is `display:
82
+ contents`), so its offset outlived the panel it belonged to: scrolled down to the Site
83
+ panel's Components, a click on Outline opened the Outline that far down. A different
84
+ panel is a different list, and it opens at its top. A repaint of the same panel keeps
85
+ its place, because the box is keyed on the panel and is not announced again.
86
+ In the next FRAME, not here: this runs while the dock is still building the new panel,
87
+ and a scroll write lays out the half-built document to clamp the offset (a forced
88
+ recalculation on every Navigator panel switch in the perf trace). The frame lays it out
89
+ anyway, and resets the offset before anything is painted. */
90
+ if (switched) {
91
+ requestAnimationFrame(() => {
92
+ if (_content?.host === host) {
93
+ requireShellRef(leftPanel, "left-panel").scrollTop = 0;
94
+ }
95
+ });
96
+ }
80
97
  /* A MICROTASK, not this call. `onNodeCreated` fires the moment the element is CONSTRUCTED
81
98
  and the runtime applies its attributes on the next line, so a panel's `afterRender` run
82
99
  from here would be handed a content box with no `part` on it — and several panels find
@@ -93,20 +110,17 @@ export function mount(deps: NavigatorPanelDeps) {
93
110
  _scope = effectScope();
94
111
  _scope.run(() => {
95
112
  effect(() => {
96
- // Shell state is tracked with no tab open — which panel is showing, and the project-level
97
- // State the project-level panels draw from. A document-less rail tab still repaints.
113
+ // Shell state is tracked with no tab open: which panel is showing. A document-less rail tab
114
+ // Still repaints.
98
115
  void shell.leftTab;
99
- void shell.settingsTab;
100
- void shell.git.status;
101
- void shell.git.loading;
102
- void shell.git.error;
103
- void shell.git.subTab;
104
- void shell.git.logEntries;
105
116
  const tab = activeTab.value;
106
117
  if (tab) {
107
118
  // Track properties the Navigator's panels read
108
119
  void tab.doc.document;
109
120
  void tab.doc.mode;
121
+ // The editor too: the Outline draws the element catalogue beside a document's Elements
122
+ // View, and the tree beside every other.
123
+ void tab.session.ui.canvasMode;
110
124
  // The whole SET, joined — a bare property read would not re-trigger when the selection
111
125
  // Changes WITHIN the array, and §6.7's helpers always replace it but nothing enforces that.
112
126
  void tab.session.selection.map((path) => path.join("/")).join("|");
@@ -180,7 +194,7 @@ function navigatorDocument(): NavigatorDocument | null {
180
194
  return null;
181
195
  }
182
196
  return {
183
- canvas: aTab.session.canvas as Record<string, unknown> | null,
197
+ canvas: aTab.session.canvas,
184
198
  content: aTab.doc.content,
185
199
  document: aTab.doc.document,
186
200
  documentPath: aTab.documentPath,
@@ -7,8 +7,10 @@
7
7
  * Nothing here decides what a panel is called, what level it is, or what it draws — that would be
8
8
  * the second definition site the registry exists to prevent.
9
9
  *
10
- * **Registration order is rail order** within a level group: PROJECT (Files ⌘1 · Search ⌘2 · Source
11
- * Control ⌘3) above the divider, DOCUMENT (Outline ⌘4 · Page ⌘5 · Data ⌘6 · Packages ⌘7) below it.
10
+ * **Registration order is rail order** within a level group: PROJECT (Site, then Files with the
11
+ * developer panels on) above the divider, DOCUMENT (Outline · Data, then Packages with the
12
+ * developer panels on) below it (§5.1). Search, Languages and Insert are registered rail-less:
13
+ * reachable by `view.setActivity` and the palette, with no button.
12
14
  *
13
15
  * **Every rail button opens the Navigator.** Problems used to hold the fourth PROJECT slot while
14
16
  * its body was drawn in the Bottom dock, and paying for that took a per-dock branch in three
@@ -17,21 +19,22 @@
17
19
  * The count reaches the user from the status bar the moment there is one.
18
20
  *
19
21
  * **Search is declared and hidden.** It is a surface a later phase builds (the palette's project
20
- * index), and it holds a slot in the rail's four-tab budget (`studio-ui-guidelines.md` §12.2). A
22
+ * index), and it is off the rail like every other panel the Design rail does not list (§5.1). A
21
23
  * `when: () => false` record is the honest way to say "this exists in the design and not yet in the
22
- * app": the id is reserved, the budget already counts it, and the day it ships the only edit is
23
- * deleting one predicate — as opposed to a stub button that lies to whoever clicks it.
24
+ * app": the id is reserved, and the day it ships the only edit is deleting one predicate — as
25
+ * opposed to a stub button that lies to whoever clicks it.
24
26
  */
25
27
 
26
28
  import { registerFilesPanel } from "../files/files";
27
29
  import { registerDataPanel } from "./data-explorer";
28
30
  import { registerInsertPanel } from "./elements-panel";
29
- import { registerGitPanel } from "./git-panel";
30
31
  import { registerI18nPanel } from "./i18n-panel";
31
- import { registerPagePanel } from "./head-panel";
32
32
  import { registerPackagesPanel } from "./imports-panel";
33
33
  import { registerBottomPanels } from "./bottom-dock";
34
34
  import { registerLayersPanel } from "./layers-panel";
35
+ import { registerSitePanel } from "./site-panel";
36
+ import { registerCollectionsPanel } from "./collections-panel";
37
+ import { registerStylesPanel } from "./styles-panel";
35
38
  import { getPanel, listPanels, railPanelSet, registerPanel, resetPanels } from "./panel-registry";
36
39
  import type { PanelRecord } from "./panel-registry";
37
40
 
@@ -45,14 +48,21 @@ const NOT_YET_BUILT = () => false;
45
48
  * per window in the app, but a test suite mounts it per case.
46
49
  */
47
50
  export function registerNavigatorPanels(): void {
48
- // Keyed on Files rather than on `listPanels("navigator")`, because the Bottom dock composes
51
+ // Keyed on Site rather than on `listPanels("navigator")`, because the Bottom dock composes
49
52
  // Itself independently (`bottomPanelSet()` calls `registerBottomPanels()` directly) and either
50
53
  // Order has to leave this function still registering the Navigator's own eight.
51
- if (getPanel("files")) {
54
+ if (getPanel("site")) {
52
55
  return;
53
56
  }
54
57
 
55
58
  // ── PROJECT group ───────────────────────────────────────────────────────────
59
+ registerSitePanel();
60
+ /* The Content workspace's Navigator (§22.5): off the rail, because Content draws none, and opened
61
+ by that workspace's frame. */
62
+ registerCollectionsPanel();
63
+ /* The Styles workspace's Navigator (§7.1): variables, element defaults and color schemes, off the
64
+ rail for the same reason. */
65
+ registerStylesPanel();
56
66
  registerFilesPanel();
57
67
  registerPanel({
58
68
  id: "search",
@@ -60,10 +70,13 @@ export function registerNavigatorPanels(): void {
60
70
  level: "project",
61
71
  dock: "navigator",
62
72
  icon: "magnifying-glass",
73
+ rail: false,
63
74
  when: NOT_YET_BUILT,
64
75
  render: () => nothingYet(),
65
76
  });
66
- registerGitPanel();
77
+ /* No Source Control panel: its change list, commit and branch picker are the Publish workspace's
78
+ Review changes and Branches (§5.5, §22.8), and a Navigator beside that workspace would be a
79
+ second list of the same things. */
67
80
  /* Off the rail, and registered in the PROJECT group anyway: registration order is roster order,
68
81
  so this is what puts Languages beside the panels it belongs with in the palette and in
69
82
  `panel.focus.*`. Its `when` is `project.isMultilingual` — a project written in one language
@@ -72,7 +85,6 @@ export function registerNavigatorPanels(): void {
72
85
 
73
86
  // ── DOCUMENT group ──────────────────────────────────────────────────────────
74
87
  registerLayersPanel();
75
- registerPagePanel();
76
88
  registerDataPanel();
77
89
  registerPackagesPanel();
78
90