@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
@@ -1,5 +1,6 @@
1
1
  /** Google Fonts helpers — shared between head-panel (per-page) and head-editor (project-level). */
2
2
 
3
+ import { isString } from "@jxsuite/schema/guards";
3
4
  import type { JxHeadEntry } from "@jxsuite/schema/types";
4
5
 
5
6
  export const GFONTS_CSS_PREFIX = "https://fonts.googleapis.com/css2?";
@@ -11,29 +12,30 @@ export const GFONTS_PRECONNECT_ORIGINS = [
11
12
  /**
12
13
  * Check if a `$head` entry is a Google Fonts stylesheet link.
13
14
  *
14
- * @param {JxHeadEntry} entry
15
+ * @param {JxHeadEntry | null | undefined} entry A `$head` slot; a JSON array can hold `null`.
15
16
  * @returns {boolean}
16
17
  */
17
- export function isGoogleFontEntry(entry: JxHeadEntry) {
18
+ export function isGoogleFontEntry(entry: JxHeadEntry | null | undefined) {
18
19
  return (
19
20
  entry?.tagName === "link" &&
20
- entry?.attributes?.rel === "stylesheet" &&
21
- typeof entry?.attributes?.href === "string" &&
22
- (entry.attributes.href as string).startsWith(GFONTS_CSS_PREFIX)
21
+ entry.attributes?.rel === "stylesheet" &&
22
+ isString(entry.attributes.href) &&
23
+ entry.attributes.href.startsWith(GFONTS_CSS_PREFIX)
23
24
  );
24
25
  }
25
26
 
26
27
  /**
27
28
  * Check if a `$head` entry is a Google Fonts preconnect link.
28
29
  *
29
- * @param {JxHeadEntry} entry
30
+ * @param {JxHeadEntry | null | undefined} entry A `$head` slot; a JSON array can hold `null`.
30
31
  * @returns {boolean}
31
32
  */
32
- export function isGoogleFontPreconnect(entry: JxHeadEntry) {
33
+ export function isGoogleFontPreconnect(entry: JxHeadEntry | null | undefined) {
33
34
  return (
34
35
  entry?.tagName === "link" &&
35
- entry?.attributes?.rel === "preconnect" &&
36
- GFONTS_PRECONNECT_ORIGINS.includes(entry?.attributes?.href as string)
36
+ entry.attributes?.rel === "preconnect" &&
37
+ isString(entry.attributes.href) &&
38
+ GFONTS_PRECONNECT_ORIGINS.includes(entry.attributes.href)
37
39
  );
38
40
  }
39
41
 
@@ -68,14 +70,13 @@ export function buildGoogleFontUrl(family: string) {
68
70
  */
69
71
  export function ensureGoogleFontPreconnects(head: JxHeadEntry[]) {
70
72
  for (const origin of GFONTS_PRECONNECT_ORIGINS) {
73
+ // A `$head` array is JSON, so a slot can hold `null` whatever the element type says.
71
74
  const exists = head.some(
72
- (e: JxHeadEntry) =>
73
- e?.tagName === "link" &&
74
- e?.attributes?.rel === "preconnect" &&
75
- e?.attributes?.href === origin,
75
+ (e: JxHeadEntry | null | undefined) =>
76
+ e?.tagName === "link" && e.attributes?.rel === "preconnect" && e.attributes.href === origin,
76
77
  );
77
78
  if (!exists) {
78
- const attrs: Record<string, string | boolean> = {
79
+ const attrs: NonNullable<JxHeadEntry["attributes"]> = {
79
80
  href: origin,
80
81
  rel: "preconnect",
81
82
  };
@@ -13,6 +13,7 @@
13
13
  * that drops it, for callers that only want the value.
14
14
  */
15
15
 
16
+ import { getNestedStyle, isNumber, isString } from "@jxsuite/schema/guards";
16
17
  import type { JxStyle } from "@jxsuite/schema/types";
17
18
 
18
19
  /** One inherited property: the value that shows through, and the breakpoint it was set on. */
@@ -42,30 +43,29 @@ export function computeInheritedSources(
42
43
  return {};
43
44
  }
44
45
 
45
- const inherited: Record<string, InheritedSource> = {};
46
+ // A Map re-set keeps the key's first position, exactly as reassigning an object property does.
47
+ const inherited = new Map<string, InheritedSource>();
46
48
 
47
49
  /** Layer one block over the accumulator, recording `donor` for everything it contributes. */
48
- const layer = (block: JxStyle, donor: string | null) => {
49
- for (const [p, v] of Object.entries(block)) {
50
- if (typeof v !== "object") {
51
- inherited[p] = { donor, value: (v as string | number) ?? "" };
50
+ const layer = (block: JxStyle | undefined, donor: string | null) => {
51
+ for (const [p, v] of Object.entries(block ?? {})) {
52
+ // Declarations only: nested blocks, block lists and `$ref` objects are not inherited values.
53
+ if (v === undefined || isString(v) || isNumber(v)) {
54
+ inherited.set(p, { donor, value: v ?? "" });
52
55
  }
53
56
  }
54
57
  };
55
58
 
56
59
  if (activeSelector) {
57
60
  // Selector inheritance: base selector → each media's selector block, in cascade order.
58
- layer((style[activeSelector] || {}) as JxStyle, null);
61
+ layer(getNestedStyle(style, activeSelector), null);
59
62
  for (const name of mediaNames) {
60
63
  if (name === activeTab) {
61
64
  break;
62
65
  }
63
- layer(
64
- (((style[`@${name}`] || {}) as Record<string, unknown>)[activeSelector] || {}) as JxStyle,
65
- name,
66
- );
66
+ layer(getNestedStyle(getNestedStyle(style, `@${name}`), activeSelector), name);
67
67
  }
68
- return inherited;
68
+ return Object.fromEntries(inherited);
69
69
  }
70
70
 
71
71
  // Base flat props first, then each media block in order until the current tab.
@@ -74,9 +74,9 @@ export function computeInheritedSources(
74
74
  if (name === activeTab) {
75
75
  break;
76
76
  }
77
- layer((style[`@${name}`] || {}) as JxStyle, name);
77
+ layer(getNestedStyle(style, `@${name}`), name);
78
78
  }
79
- return inherited;
79
+ return Object.fromEntries(inherited);
80
80
  }
81
81
 
82
82
  /**
@@ -95,11 +95,9 @@ export function computeInheritedStyle(
95
95
  activeTab: string | null,
96
96
  activeSelector: string | null = null,
97
97
  ): Record<string, string | number> {
98
- const values: Record<string, string | number> = {};
99
- for (const [prop, source] of Object.entries(
100
- computeInheritedSources(style, mediaNames, activeTab, activeSelector),
101
- )) {
102
- values[prop] = source.value;
103
- }
104
- return values;
98
+ return Object.fromEntries(
99
+ Object.entries(computeInheritedSources(style, mediaNames, activeTab, activeSelector)).map(
100
+ ([prop, source]) => [prop, source.value],
101
+ ),
102
+ );
105
103
  }
@@ -71,7 +71,7 @@ export function classifyHref(href = ""): LinkTarget {
71
71
  * @param value The bare value for that kind (address/number/fragment/path/href)
72
72
  */
73
73
  export function composeHref(kind: LinkKind, value: string): string {
74
- const bare = (value ?? "").trim();
74
+ const bare = value.trim();
75
75
  if (!bare) {
76
76
  return "";
77
77
  }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * An instant as the calendar day it is where Studio runs.
3
+ *
4
+ * A file's modification time, an upload's, "today": each is an instant, and the day a reader means
5
+ * by it is their own. `toISOString().slice(0, 10)` answers in UTC, so a file saved at 9 pm in
6
+ * Denver was listed as edited tomorrow. A date the author WROTE (`2026-06-03`) is not an instant
7
+ * and never goes through here: it is taken as written (`content/entry-summaries.ts` `entryDay`).
8
+ */
9
+
10
+ /** `date` as `YYYY-MM-DD` in the local time zone, or "" for an invalid date. */
11
+ export function localDay(date: Date): string {
12
+ if (Number.isNaN(date.getTime())) {
13
+ return "";
14
+ }
15
+ const month = String(date.getMonth() + 1).padStart(2, "0");
16
+ const day = String(date.getDate()).padStart(2, "0");
17
+ return `${String(date.getFullYear()).padStart(4, "0")}-${month}-${day}`;
18
+ }
@@ -5,17 +5,39 @@
5
5
  * strip-events pattern) so importing it never grows the iframe bundle.
6
6
  */
7
7
 
8
+ import type { JsonPrimitive } from "@jxsuite/schema/types";
9
+
8
10
  const MAX_BADGE_LENGTH = 48;
9
11
 
12
+ /**
13
+ * A value an expression evaluated to, as a badge has to show it: JSON from state, a bigint or
14
+ * symbol a helper returned, a function, and arrays and records of those. A record can be cyclic,
15
+ * and a bigint cannot be stringified at all, which is why formatting falls back to `String()`.
16
+ */
17
+ export type PreviewValue =
18
+ | JsonPrimitive
19
+ | undefined
20
+ | bigint
21
+ | symbol
22
+ | ((...args: never[]) => void)
23
+ | PreviewValue[]
24
+ | PreviewRecord;
25
+
26
+ /** An object an expression evaluated to, read key by key. */
27
+ export interface PreviewRecord {
28
+ [key: string]: PreviewValue;
29
+ }
30
+
10
31
  /** Format a runtime value as a short badge string. */
11
- export function formatPreviewValue(value?: unknown): string {
32
+ export function formatPreviewValue(value?: PreviewValue): string {
12
33
  if (value === undefined) {
13
34
  return "undefined";
14
35
  }
15
36
  let text: string;
16
37
  try {
17
- text =
18
- typeof value === "string" ? JSON.stringify(value) : (JSON.stringify(value) ?? "undefined");
38
+ // SAFETY: lib.d.ts declares a string, but JSON.stringify answers undefined for a function or a symbol.
39
+ const json = JSON.stringify(value) as string | undefined;
40
+ text = json ?? "undefined";
19
41
  } catch {
20
42
  text = String(value);
21
43
  }
@@ -8,44 +8,71 @@
8
8
  * editor's reactive `store.ts`; `store.ts` re-exports it for the legacy in-realm patcher.
9
9
  */
10
10
 
11
- import { isEventBinding } from "@jxsuite/schema/guards";
12
- import type { JxMutableNode } from "@jxsuite/schema/types";
11
+ import {
12
+ isEventBinding,
13
+ isJsonObject,
14
+ isNodeObject,
15
+ isNonNullObject,
16
+ } from "@jxsuite/schema/guards";
17
+ import type { JxDocumentValue, JxMutableNode } from "@jxsuite/schema/types";
13
18
 
14
- /** Strip all `on*` event-handler properties (and server-timed state) from a document tree. */
15
- export function stripEventHandlers(node: JxMutableNode): JxMutableNode {
16
- if (!node || typeof node !== "object") {
17
- return node;
18
- }
19
+ /**
20
+ * A node object as a document walker rebuilds it. Every key holds a document value, including the
21
+ * keys {@link JxMutableNode} names, because a walker copies whatever the source document holds;
22
+ * `undefined` is a key an editor cleared.
23
+ */
24
+ export type RebuiltNode = Record<string, JxDocumentValue | undefined>;
25
+
26
+ /**
27
+ * Whether a walker descends into `value`: any object, arrays included. A document is JSON, so every
28
+ * own value of such an object is itself a document value.
29
+ *
30
+ * @param value A value read out of a document.
31
+ */
32
+ export function isDocumentContainer(
33
+ value: JxDocumentValue | undefined,
34
+ ): value is JxDocumentValue[] | Readonly<RebuiltNode> {
35
+ return isNonNullObject(value);
36
+ }
37
+
38
+ /**
39
+ * Strip all `on*` event-handler properties (and server-timed state) from a document tree. Arrays
40
+ * are stripped member by member, and primitives and a cleared (`undefined`) key return unchanged,
41
+ * so the walk can recurse through any document value.
42
+ */
43
+ export function stripEventHandlers(node: JxMutableNode): JxMutableNode;
44
+ export function stripEventHandlers(node: JxDocumentValue): JxDocumentValue;
45
+ export function stripEventHandlers(node: JxDocumentValue | undefined): JxDocumentValue | undefined;
46
+ export function stripEventHandlers(node: JxDocumentValue | undefined): JxDocumentValue | undefined {
19
47
  if (Array.isArray(node)) {
20
48
  // Arrays of nodes round-trip element-wise; the array itself is not a node.
21
- return node.map((n: JxMutableNode) => stripEventHandlers(n)) as unknown as JxMutableNode;
49
+ return node.map((n) => stripEventHandlers(n));
22
50
  }
23
- const out: Record<string, unknown> = {};
51
+ if (!isNodeObject(node)) {
52
+ return node;
53
+ }
54
+ const out: RebuiltNode = {};
24
55
  for (const [k, v] of Object.entries(node)) {
25
56
  if (k.startsWith("on") && isEventBinding(v)) {
26
57
  continue;
27
58
  }
28
59
  if (k === "children") {
29
- out.children = Array.isArray(v)
30
- ? v.map((c: JxMutableNode) => stripEventHandlers(c))
31
- : stripEventHandlers(v as JxMutableNode);
32
- } else if (k === "cases" && typeof v === "object") {
33
- const cases: Record<string, unknown> = {};
34
- for (const [ck, cv] of Object.entries(v as Record<string, unknown>)) {
35
- cases[ck] = stripEventHandlers(cv as JxMutableNode);
60
+ out.children = Array.isArray(v) ? v.map((c) => stripEventHandlers(c)) : stripEventHandlers(v);
61
+ } else if (k === "cases" && isDocumentContainer(v)) {
62
+ const cases: RebuiltNode = {};
63
+ for (const [ck, cv] of Object.entries(v)) {
64
+ cases[ck] = stripEventHandlers(cv);
36
65
  }
37
66
  out.cases = cases;
38
- } else if (k === "state" && typeof v === "object" && v !== null) {
39
- const state: Record<string, unknown> = {};
40
- for (const [sk, sv] of Object.entries(v as Record<string, unknown>)) {
41
- if (sv && typeof sv === "object" && (sv as Record<string, unknown>).timing === "server") {
67
+ } else if (k === "state" && isDocumentContainer(v)) {
68
+ const state: RebuiltNode = {};
69
+ for (const [sk, sv] of Object.entries(v)) {
70
+ if (isJsonObject(sv) && sv.timing === "server") {
42
71
  continue;
43
72
  }
44
73
  state[sk] = sv;
45
74
  }
46
75
  out.state = state;
47
- } else if (k === "style" || k === "attributes" || k === "$media") {
48
- out[k] = v;
49
76
  } else {
50
77
  out[k] = v;
51
78
  }
@@ -6,7 +6,8 @@
6
6
 
7
7
  import { collectionForFile } from "../content/collection-match";
8
8
  import { defaultContentFormat } from "../format/format-host";
9
- import type { ProjectConfig } from "@jxsuite/schema/types";
9
+ import type { JsonValue, ProjectConfig } from "@jxsuite/schema/types";
10
+ import type { CssFontPreset } from "../panels/style-utils";
10
11
 
11
12
  /**
12
13
  * Convert camelCase property name to "Title Case" label (e.g. "backgroundColor" → "Background
@@ -39,31 +40,42 @@ export function kebabToLabel(val: string) {
39
40
  );
40
41
  }
41
42
 
43
+ /**
44
+ * What a css-meta or html-meta entry says about the field that edits it: its label, and the keys
45
+ * {@link inferInputType} picks the control from. Every other key an entry carries is ignored here.
46
+ */
47
+ export interface FieldControlMeta {
48
+ readonly $label?: string | undefined;
49
+ /** `true` on a shorthand row; css-meta puts the shorthand's own name on each longhand. */
50
+ readonly $shorthand?: string | boolean | undefined;
51
+ readonly $input?: string | undefined;
52
+ readonly $units?: readonly string[] | undefined;
53
+ readonly format?: string | undefined;
54
+ readonly type?: string | undefined;
55
+ readonly enum?: readonly JsonValue[] | undefined;
56
+ readonly examples?: readonly JsonValue[] | undefined;
57
+ readonly presets?: readonly (CssFontPreset | JsonValue)[] | undefined;
58
+ }
59
+
42
60
  /**
43
61
  * Get display label from metadata entry or prop name
44
62
  *
45
- * @param {{ $label?: string; [key: string]: unknown } | null | undefined} entry
63
+ * @param {FieldControlMeta | null | undefined} entry
46
64
  * @param {string} prop
47
65
  * @returns {string}
48
66
  */
49
- export function propLabel(
50
- entry: { $label?: string; [key: string]: unknown } | null | undefined,
51
- prop: string,
52
- ) {
67
+ export function propLabel(entry: FieldControlMeta | null | undefined, prop: string) {
53
68
  return entry?.$label || camelToLabel(prop);
54
69
  }
55
70
 
56
71
  /**
57
72
  * Label for HTML attributes — handles kebab-case (aria-label → "Aria Label")
58
73
  *
59
- * @param {{ $label?: string; [key: string]: unknown } | null | undefined} entry
74
+ * @param {FieldControlMeta | null | undefined} entry
60
75
  * @param {string} attr
61
76
  * @returns {string}
62
77
  */
63
- export function attrLabel(
64
- entry: { $label?: string; [key: string]: unknown } | null | undefined,
65
- attr: string,
66
- ) {
78
+ export function attrLabel(entry: FieldControlMeta | null | undefined, attr: string) {
67
79
  if (entry?.$label) {
68
80
  return entry.$label;
69
81
  }
@@ -92,17 +104,17 @@ export function attrLabel(
92
104
  * @param {unknown} format - A schema entry's `format`
93
105
  * @returns {boolean}
94
106
  */
95
- export function isMediaFormat(format: unknown): boolean {
107
+ export function isMediaFormat(format: unknown): format is "image" | "uri-reference" {
96
108
  return format === "image" || format === "uri-reference";
97
109
  }
98
110
 
99
111
  /**
100
112
  * Determine input widget type from a css-meta entry
101
113
  *
102
- * @param {Record<string, unknown>} entry
114
+ * @param {FieldControlMeta} entry
103
115
  * @returns {string}
104
116
  */
105
- export function inferInputType(entry: Record<string, unknown>) {
117
+ export function inferInputType(entry: FieldControlMeta) {
106
118
  if (entry.$shorthand === true) {
107
119
  return "shorthand";
108
120
  }
@@ -248,6 +260,9 @@ export function parseCemType(typeText: string | undefined | null) {
248
260
  * both required for document snapshots and clipboard payloads.
249
261
  */
250
262
  export function jsonClone<T>(value: T): T {
263
+ /* SAFETY: callers pass documents and clipboard payloads, which are JSON-shaped, and a JSON round
264
+ trip rebuilds such a value with the same structure. The only keys it loses hold undefined or a
265
+ function, which is the normalization this helper exists to perform. */
251
266
  // oxlint-disable-next-line unicorn/prefer-structured-clone -- structuredClone throws on reactive proxies; JSON normalization is the point
252
267
  return JSON.parse(JSON.stringify(value)) as T;
253
268
  }
package/src/view.ts CHANGED
@@ -66,8 +66,8 @@ export type MonacoSurface = editor.IStandaloneCodeEditor & {
66
66
  * offsets, the source-view Monaco and the render generation were all fields of "the canvas" — a
67
67
  * singular that stopped existing when the shell grew a pane grid. They are fields of a
68
68
  * {@link import("./canvas/canvas-surface").CanvasSurface} now, one record per pane, and
69
- * `scripts/check-pane-singletons.ts` fails the build if one grows back: the index signature below
70
- * means `view.panX` is not a type error, only a silently-`unknown` read.
69
+ * `scripts/check-pane-singletons.ts` fails the build if one grows back, and with no index signature
70
+ * on this record a read of `view.panX` is a type error as well.
71
71
  */
72
72
  interface ViewState {
73
73
  /**
@@ -103,7 +103,6 @@ interface ViewState {
103
103
  layerDragSourceHeight: number;
104
104
  _completionRegistered: boolean;
105
105
  _layersCollapsed: Set<string> | null;
106
- [key: string]: unknown;
107
106
  }
108
107
 
109
108
  export const view: ViewState = {
@@ -31,12 +31,13 @@
31
31
 
32
32
  import { effect } from "../reactivity";
33
33
  import { componentRegistry } from "../files/components";
34
- import { getNodeAtPath, parentElementPath } from "../store";
34
+ import { parentElementPath } from "../store";
35
35
 
36
36
  import { canvasPerf } from "../canvas/canvas-perf";
37
37
  import { canvasModeOfTab, tabOfPane } from "../canvas/canvas-surface";
38
38
  import { parseMediaEntries } from "../utils/canvas-media";
39
39
  import { getEffectiveLayoutPath, getEffectiveLocales, getEffectiveMedia } from "../site-context";
40
+ import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
40
41
  import { localeLabel, translationPathFor } from "@jxsuite/schema/locale";
41
42
  import { shell } from "../shell";
42
43
  import {
@@ -78,10 +79,10 @@ export type DerivePreset = (typeof DERIVE_PRESETS)[number];
78
79
  * The canvas mode a preset needs the SOURCE document to DECLARE, for the presets that need one.
79
80
  *
80
81
  * `tab.capabilities.modes` is the format's own answer to "what can this document be shown as", and
81
- * the preset menu consulted it nowhere: over a document that declares `["settings", "stylebook",
82
- * "source"]` it still offered "Same page at Base" — a lens whose stage can only draw an empty
83
- * artboard — and "Component definition", whose rule can never resolve because nothing in a settings
84
- * form is a component instance. Both produced a pane the author then had to close.
82
+ * the preset menu consulted it nowhere: over a document that declares `["stylebook", "source"]` it
83
+ * still offered "Same page at Base" — a lens whose stage can only draw an empty artboard — and
84
+ * "Component definition", whose rule can never resolve because nothing in a configuration object is
85
+ * a component instance. Both produced a pane the author then had to close.
85
86
  *
86
87
  * Two presets are absent, for two different reasons. `diff` needs no mode: a comparison is two
87
88
  * texts and every document has those, and it is already gated on the file having changes. `layout`
@@ -97,14 +98,14 @@ export type DerivePreset = (typeof DERIVE_PRESETS)[number];
97
98
  * pinned by a test (`per-preset refusals` · "Layout's gate is the layout RESOLVING") instead of
98
99
  * being asserted here in prose.
99
100
  */
100
- const MODE_FOR_PRESET: Readonly<Partial<Record<DerivePreset, string>>> = {
101
+ const MODE_FOR_PRESET: Readonly<Partial<Record<DerivePreset, keyof typeof MODE_WORDS>>> = {
101
102
  breakpoint: "design",
102
103
  code: "source",
103
104
  component: "design",
104
105
  };
105
106
 
106
107
  /** How a mode is spelled in a refusal — the words on the Editor axis, not the internal ids. */
107
- const MODE_WORDS: Readonly<Record<string, string>> = { design: "Design", source: "Code" };
108
+ const MODE_WORDS = { design: "Design", source: "Code" } as const;
108
109
 
109
110
  /** Said by a diff lens whose comparison came back empty. One sentence, one home. */
110
111
  const DIFF_UNREADABLE = "Could not read this file's comparison against HEAD.";
@@ -399,9 +400,7 @@ function companionTarget(
399
400
  hit is transient — `iframe-host.ts` clears it the moment the author clicks page content —
400
401
  so the page's own layout remains the answer for a derivation created from the preset menu. */
401
402
  const hit = shell.layoutSelection;
402
- const path =
403
- hit?.layoutFile ??
404
- getEffectiveLayoutPath(source.doc.document.$layout as string | false | undefined);
403
+ const path = hit?.layoutFile ?? getEffectiveLayoutPath(source.doc.document.$layout);
405
404
  return path === null
406
405
  ? {
407
406
  ...base,
@@ -421,7 +420,7 @@ function companionTarget(
421
420
  was a condition with no false branch, and an unreachable branch is a claim nobody can
422
421
  check. What stops a node path from layout A landing inside layout B is
423
422
  {@link selectInPane}, which compares against the document actually on screen. */
424
- select: hit ? (hit.layoutPath as JxPath) : null,
423
+ select: hit ? hit.layoutPath : null,
425
424
  status: "ready",
426
425
  };
427
426
  }
@@ -534,7 +533,7 @@ export function componentPathUnderSelection(tab: Tab | null): string | null {
534
533
  if (entry?.path) {
535
534
  return entry.path;
536
535
  }
537
- path = parentElementPath(path) as JxPath | null;
536
+ path = parentElementPath(path);
538
537
  }
539
538
  return null;
540
539
  }
@@ -758,7 +757,7 @@ function loadDiffFor(paneId: string, target: DerivedTarget, deps: DerivationDeps
758
757
  cannot re-enter, because neither of those answers carries a `diffPath`. */
759
758
  applyDerivation(paneId, deps);
760
759
  })
761
- .catch((error: unknown) => {
760
+ .catch((error) => {
762
761
  console.error("loadDiff error:", error);
763
762
  });
764
763
  }
@@ -808,7 +807,7 @@ function probeTranslationFor(paneId: string, target: DerivedTarget, deps: Deriva
808
807
  them carries a `probePath`, so this cannot re-enter. */
809
808
  applyDerivation(paneId, deps);
810
809
  })
811
- .catch((error: unknown) => {
810
+ .catch((error) => {
812
811
  console.error("fileExists error:", error);
813
812
  });
814
813
  }
@@ -1016,8 +1015,7 @@ export function presetRefusal(
1016
1015
  which `paneIsEmpty` will not collapse, whose strip drew nothing and whose stage drew nothing.
1017
1016
  `component` is deliberately NOT refused the same way — "select an element inside a component"
1018
1017
  is a rule that resolves on the next click, which is the whole point of leaving it open. */
1019
- return getEffectiveLayoutPath(source.doc.document.$layout as string | false | undefined) ===
1020
- null
1018
+ return getEffectiveLayoutPath(source.doc.document.$layout) === null
1021
1019
  ? "a page with a layout — this one declares none"
1022
1020
  : null;
1023
1021
  }