@jxsuite/studio 6.1.1 → 6.1.2

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 (637) hide show
  1. package/dist/chunks/{2020-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
  2. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  3. package/dist/chunks/adapter-4912g339.js +4 -0
  4. package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
  5. package/dist/chunks/cf-settings-br6105tr.js +4 -0
  6. package/dist/chunks/color-28ksk2qm.js +4 -0
  7. package/dist/chunks/color-area-0fj8a4ga.js +4 -0
  8. package/dist/chunks/color-field-xch8kx2g.js +4 -0
  9. package/dist/chunks/color-slider-jxd8v350.js +4 -0
  10. package/dist/chunks/combobox-p0efwjke.js +4 -0
  11. package/dist/chunks/components-db68vsn7.js +4 -0
  12. package/dist/chunks/content-source-1449qesq.js +4 -0
  13. package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
  14. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  15. package/dist/chunks/editor-x9jn86a7.js +4 -0
  16. package/dist/chunks/entry-commands-may24cpt.js +4 -0
  17. package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
  18. package/dist/chunks/file-ops-x9v54pcj.js +4 -0
  19. package/dist/chunks/files-j3knqf0s.js +4 -0
  20. package/dist/chunks/format-host-tyre2trb.js +4 -0
  21. package/dist/chunks/fs-events-64ma9htc.js +4 -0
  22. package/dist/chunks/git-panel-84ps5dex.js +4 -0
  23. package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
  24. package/dist/chunks/icons-pnfz478q.js +4 -0
  25. package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
  26. package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
  27. package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
  28. package/dist/chunks/iframe-entry-zap785cw.js +5 -0
  29. package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
  30. package/dist/chunks/index-b8xw3vy9.js +4 -0
  31. package/dist/chunks/{index-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
  32. package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
  33. package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
  34. package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
  35. package/dist/chunks/layers-h4xp1pss.js +4 -0
  36. package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
  37. package/dist/chunks/listbox-e74qjyq6.js +4 -0
  38. package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
  39. package/dist/chunks/media-picker-2cweexc5.js +4 -0
  40. package/dist/chunks/menu-n6yzswmy.js +4 -0
  41. package/dist/chunks/menu-ynw13y0s.js +4 -0
  42. package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
  43. package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
  44. package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
  45. package/dist/chunks/notify-cj5zbrs2.js +4 -0
  46. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  47. package/dist/chunks/parse-b7ddhr8m.js +4 -0
  48. package/dist/chunks/platform-3dfws9js.js +4 -0
  49. package/dist/chunks/popover-jt2gxmzs.js +4 -0
  50. package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
  51. package/dist/chunks/quick-search-0dajrwqg.js +4 -0
  52. package/dist/chunks/references-49qgt404.js +4 -0
  53. package/dist/chunks/right-panel-jm1bwe53.js +4 -0
  54. package/dist/chunks/section-registry-6kwc4fky.js +4 -0
  55. package/dist/chunks/select-rzds841e.js +4 -0
  56. package/dist/chunks/split-n2gfpm5m.js +4 -0
  57. package/dist/chunks/{studio-1q1sh2ax.js → studio-0q988f9w.js} +3 -3
  58. package/dist/chunks/studio-0rt52vpq.js +5 -0
  59. package/dist/chunks/studio-18vgbhs5.js +5 -0
  60. package/dist/chunks/{studio-h46vtzk8.js → studio-1fxkaaea.js} +4 -4
  61. package/dist/chunks/studio-24mccdrj.js +5 -0
  62. package/dist/chunks/studio-2eh507zk.js +9 -0
  63. package/dist/chunks/studio-2hcbccfv.js +5 -0
  64. package/dist/chunks/studio-2j1cb95x.js +5 -0
  65. package/dist/chunks/studio-2jbs3rxv.js +5 -0
  66. package/dist/chunks/{studio-rv11kfwa.js → studio-485046te.js} +7 -7
  67. package/dist/chunks/studio-4h8k4dw9.js +5 -0
  68. package/dist/chunks/studio-5f6n18kx.js +5 -0
  69. package/dist/chunks/studio-5gthpky6.js +5 -0
  70. package/dist/chunks/studio-5ve6bbep.js +5 -0
  71. package/dist/chunks/studio-6ep3js6b.js +9 -0
  72. package/dist/chunks/studio-6wkmf3wz.js +9 -0
  73. package/dist/chunks/studio-841rf3cg.js +5 -0
  74. package/dist/chunks/studio-8gmwgheg.js +5 -0
  75. package/dist/chunks/studio-8qm0ep50.js +5 -0
  76. package/dist/chunks/{studio-8grwxtqk.js → studio-90pq9km1.js} +4 -4
  77. package/dist/chunks/studio-924p1tm1.js +6 -0
  78. package/dist/chunks/{studio-pre0skq6.js → studio-a3g98wjr.js} +4 -4
  79. package/dist/chunks/studio-a3shpz9y.js +5 -0
  80. package/dist/chunks/studio-amsbaaar.js +6 -0
  81. package/dist/chunks/studio-at5spjbc.js +7 -0
  82. package/dist/chunks/studio-b2xv945e.js +5 -0
  83. package/dist/chunks/studio-bn5nkafw.js +5 -0
  84. package/dist/chunks/studio-bw6q5xjf.js +9 -0
  85. package/dist/chunks/studio-c7q0t9x1.js +5 -0
  86. package/dist/chunks/studio-camnhc96.js +6 -0
  87. package/dist/chunks/studio-cffqvnzd.js +5 -0
  88. package/dist/chunks/studio-d81xfh1g.js +5 -0
  89. package/dist/chunks/studio-dgz8d0c1.js +5 -0
  90. package/dist/chunks/studio-efvfrsf8.js +5 -0
  91. package/dist/chunks/studio-er30bpcx.js +5 -0
  92. package/dist/chunks/studio-ezscgr64.js +5 -0
  93. package/dist/chunks/studio-ffrrncvz.js +5 -0
  94. package/dist/chunks/studio-fpphgn8y.js +10 -0
  95. package/dist/chunks/studio-j1kvhdjk.js +4 -0
  96. package/dist/chunks/{studio-vrmcjf9g.js → studio-j430n16g.js} +5 -5
  97. package/dist/chunks/studio-jjkg84nj.js +5 -0
  98. package/dist/chunks/studio-m0q32ars.js +4 -0
  99. package/dist/chunks/studio-m6bdst11.js +5 -0
  100. package/dist/chunks/studio-nv2cptd4.js +64 -0
  101. package/dist/chunks/studio-nwfrc98n.js +5 -0
  102. package/dist/chunks/studio-p1wgvp7r.js +5 -0
  103. package/dist/chunks/studio-pag2wncm.js +5 -0
  104. package/dist/chunks/studio-qvanvzfd.js +5 -0
  105. package/dist/chunks/studio-qwa64kt7.js +5 -0
  106. package/dist/chunks/studio-rk1zc4x3.js +928 -0
  107. package/dist/chunks/studio-se2r3ptc.js +5 -0
  108. package/dist/chunks/studio-sg2a0dh0.js +5 -0
  109. package/dist/chunks/studio-tjzjhe68.js +5 -0
  110. package/dist/chunks/{studio-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
  111. package/dist/chunks/{studio-kggey1jt.js → studio-v0jzqdjm.js} +4 -4
  112. package/dist/chunks/studio-v2w7q8r1.js +7 -0
  113. package/dist/chunks/studio-v5vjq1h0.js +4 -0
  114. package/dist/chunks/studio-v8aga3vp.js +14 -0
  115. package/dist/chunks/studio-vfcdrfmv.js +5 -0
  116. package/dist/chunks/studio-vmfkgdjf.js +5 -0
  117. package/dist/chunks/studio-wt1816jj.js +5 -0
  118. package/dist/chunks/studio-wz73q5kq.js +4 -0
  119. package/dist/chunks/studio-y04qtxvp.js +7 -0
  120. package/dist/chunks/studio-y21g8zzg.js +5 -0
  121. package/dist/chunks/{studio-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
  122. package/dist/chunks/studio-ynn90f58.js +16 -0
  123. package/dist/chunks/studio-yxz682sx.js +5 -0
  124. package/dist/chunks/studio-zp7snvkq.js +5 -0
  125. package/dist/chunks/studio-zq4z6tm6.js +5 -0
  126. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  127. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  128. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  129. package/dist/chunks/toast-c9fn075p.js +4 -0
  130. package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
  131. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  132. package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
  133. package/dist/chunks/tree-mdq3v5cw.js +4 -0
  134. package/dist/chunks/{tsMode-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
  135. package/dist/chunks/workspace-jtfahpee.js +4 -0
  136. package/dist/chunks/ws-client-nze0k6mv.js +4 -0
  137. package/dist/iframe-entry.js +16 -16
  138. package/dist/manifest.json +63 -63
  139. package/dist/studio.js +97 -97
  140. package/package.json +6 -6
  141. package/src/about/about-modal.ts +4 -3
  142. package/src/account/action-flow.ts +45 -38
  143. package/src/account-status.ts +7 -2
  144. package/src/browse/library-layouts.ts +8 -5
  145. package/src/browse/library-model.ts +18 -6
  146. package/src/browse/library-pane.ts +37 -21
  147. package/src/browse/library-preview.ts +14 -9
  148. package/src/browse/library-source.ts +1 -1
  149. package/src/canvas/asset-refs.ts +24 -9
  150. package/src/canvas/asset-resolve.ts +19 -23
  151. package/src/canvas/canvas-helpers.ts +7 -6
  152. package/src/canvas/canvas-live-render.ts +44 -53
  153. package/src/canvas/canvas-patcher.ts +30 -30
  154. package/src/canvas/canvas-perf.ts +11 -5
  155. package/src/canvas/canvas-render.ts +62 -41
  156. package/src/canvas/canvas-surface.ts +5 -3
  157. package/src/canvas/canvas-utils.ts +90 -49
  158. package/src/canvas/dialog-path.ts +9 -4
  159. package/src/canvas/dialog-state.ts +1 -2
  160. package/src/canvas/diff-marks.ts +9 -16
  161. package/src/canvas/diff-toolbar.ts +8 -7
  162. package/src/canvas/edit-width-drag.ts +4 -1
  163. package/src/canvas/edit-width.ts +1 -3
  164. package/src/canvas/iframe-channel.ts +27 -13
  165. package/src/canvas/iframe-drop.ts +13 -12
  166. package/src/canvas/iframe-editable-root.ts +29 -16
  167. package/src/canvas/iframe-entry.ts +80 -63
  168. package/src/canvas/iframe-eval.ts +73 -49
  169. package/src/canvas/iframe-host.ts +135 -96
  170. package/src/canvas/iframe-inline-edit.ts +49 -30
  171. package/src/canvas/iframe-insert.ts +5 -4
  172. package/src/canvas/iframe-interaction.ts +30 -25
  173. package/src/canvas/iframe-overlay.ts +1 -1
  174. package/src/canvas/iframe-patch.ts +18 -15
  175. package/src/canvas/iframe-position.ts +12 -6
  176. package/src/canvas/iframe-protocol.ts +12 -16
  177. package/src/canvas/iframe-render.ts +36 -34
  178. package/src/canvas/iframe-slash.ts +24 -11
  179. package/src/canvas/iframe-subtree.ts +6 -2
  180. package/src/canvas/path-mapping.ts +19 -12
  181. package/src/canvas/popover-path.ts +7 -3
  182. package/src/canvas/popover-state.ts +1 -2
  183. package/src/canvas/serialize-scope.ts +13 -5
  184. package/src/canvas/stage-scrollbar.ts +2 -1
  185. package/src/canvas/surface-registry.ts +21 -3
  186. package/src/collab/collab-commands.ts +7 -2
  187. package/src/collab/collab-session.ts +84 -45
  188. package/src/collab/collab-state.ts +4 -3
  189. package/src/collab/monaco-binding.ts +16 -13
  190. package/src/collab/monaco-cursors.ts +5 -2
  191. package/src/commands/budget.ts +3 -3
  192. package/src/commands/command-args.ts +103 -71
  193. package/src/commands/context.ts +22 -20
  194. package/src/commands/keymap.ts +47 -43
  195. package/src/commands/levels.ts +3 -3
  196. package/src/commands/live-context.ts +7 -7
  197. package/src/commands/reference.ts +2 -1
  198. package/src/commands/registry.ts +12 -10
  199. package/src/commands/run-reported.ts +15 -10
  200. package/src/component-props.ts +46 -30
  201. package/src/content/collection-match.ts +5 -4
  202. package/src/content/draft-state.ts +4 -3
  203. package/src/content/entry-commands.ts +3 -2
  204. package/src/content/entry-editor.ts +29 -17
  205. package/src/content/entry-fields.ts +12 -7
  206. package/src/content/entry-model.ts +21 -12
  207. package/src/editor/canvas-context-menu.ts +1 -2
  208. package/src/editor/canvas-slash-bridge.ts +3 -6
  209. package/src/editor/content-slice.ts +16 -14
  210. package/src/editor/context-menu.ts +35 -22
  211. package/src/editor/convert-targets.ts +30 -35
  212. package/src/editor/convert-to-component.ts +11 -5
  213. package/src/editor/convert-to-repeater.ts +34 -22
  214. package/src/editor/editable-tags.ts +17 -2
  215. package/src/editor/file-drop-action.ts +21 -22
  216. package/src/editor/inline-edit-apply.ts +35 -17
  217. package/src/editor/inline-edit.ts +66 -50
  218. package/src/editor/inline-format.ts +59 -56
  219. package/src/editor/inline-link.ts +40 -15
  220. package/src/editor/insert-zone-action.ts +1 -1
  221. package/src/editor/merge-tags.ts +58 -19
  222. package/src/editor/repeater-scope.ts +39 -28
  223. package/src/editor/shortcuts.ts +32 -20
  224. package/src/editor/slash-menu.ts +1 -6
  225. package/src/files/asset-versions.ts +4 -4
  226. package/src/files/components.ts +15 -10
  227. package/src/files/elements.ts +5 -6
  228. package/src/files/file-ops.ts +77 -36
  229. package/src/files/files.ts +90 -95
  230. package/src/files/media-meta.ts +2 -1
  231. package/src/files/media-paths.ts +3 -0
  232. package/src/files/serialize-document.ts +2 -2
  233. package/src/format/constraints.ts +1 -1
  234. package/src/format/convert-file.ts +27 -13
  235. package/src/format/format-choices.ts +2 -1
  236. package/src/format/format-host.ts +76 -50
  237. package/src/github/github-auth-status.ts +27 -3
  238. package/src/github/github-auth.ts +19 -9
  239. package/src/github/github-publish.ts +24 -20
  240. package/src/grid/cell-editors.ts +46 -31
  241. package/src/grid/cell-popovers.ts +5 -3
  242. package/src/grid/edit-buffer.ts +10 -9
  243. package/src/grid/grid-controller.ts +20 -22
  244. package/src/grid/grid-layout.ts +21 -5
  245. package/src/grid/grid-open.ts +3 -6
  246. package/src/grid/grid-panel.ts +11 -4
  247. package/src/grid/grid-source.ts +8 -8
  248. package/src/grid/grid-view.ts +14 -17
  249. package/src/grid/redirects-grid.ts +14 -5
  250. package/src/grid/redirects.ts +16 -14
  251. package/src/grid/schema-columns.ts +25 -19
  252. package/src/grid/sources/connector-source.ts +47 -20
  253. package/src/grid/sources/content-source.ts +25 -24
  254. package/src/grid/sources/csv-file-source.ts +2 -2
  255. package/src/grid/tabulator-tables.d.ts +55 -34
  256. package/src/hosting/stage.ts +7 -7
  257. package/src/i18n/i18n-commands.ts +1 -2
  258. package/src/media/media-pane.ts +4 -1
  259. package/src/new-project/add-repo-modal.ts +20 -19
  260. package/src/new-project/import-tab.ts +10 -14
  261. package/src/new-project/location-fields.ts +2 -1
  262. package/src/new-project/new-project-modal.ts +12 -9
  263. package/src/packages/jxsuite-update.ts +4 -3
  264. package/src/packages/pull-package-sync.ts +26 -25
  265. package/src/page-params.ts +97 -68
  266. package/src/panels/activity-panel.ts +17 -9
  267. package/src/panels/ai-chat/attached-context.ts +13 -7
  268. package/src/panels/ai-chat/chat-view.ts +80 -73
  269. package/src/panels/ai-chat/composer.ts +30 -33
  270. package/src/panels/ai-chat/sessions-view.ts +1 -2
  271. package/src/panels/ai-panel.ts +23 -20
  272. package/src/panels/block-action-bar.ts +46 -35
  273. package/src/panels/bottom-dock.ts +5 -3
  274. package/src/panels/canvas-dnd-bridge.ts +31 -24
  275. package/src/panels/data-explorer.ts +62 -25
  276. package/src/panels/data-grid.ts +14 -11
  277. package/src/panels/dnd.ts +108 -118
  278. package/src/panels/editors.ts +52 -21
  279. package/src/panels/elements-panel.ts +10 -3
  280. package/src/panels/events-panel.ts +84 -69
  281. package/src/panels/formula-workspace.ts +76 -51
  282. package/src/panels/frontmatter-fields.ts +24 -19
  283. package/src/panels/frontmatter-panel.ts +44 -34
  284. package/src/panels/git-diff-open.ts +4 -4
  285. package/src/panels/git-panel.ts +49 -61
  286. package/src/panels/head-panel.ts +131 -111
  287. package/src/panels/i18n-panel.ts +10 -3
  288. package/src/panels/imports-panel.ts +23 -47
  289. package/src/panels/jump-bar.ts +48 -29
  290. package/src/panels/layers-panel.ts +97 -74
  291. package/src/panels/left-panel.ts +3 -3
  292. package/src/panels/pane-context.ts +31 -22
  293. package/src/panels/pane-grid.ts +49 -20
  294. package/src/panels/panel-registry.ts +22 -37
  295. package/src/panels/properties-panel.ts +175 -121
  296. package/src/panels/quick-search.ts +53 -31
  297. package/src/panels/right-panel.ts +3 -3
  298. package/src/panels/seo-modal.ts +13 -17
  299. package/src/panels/settings-menu.ts +15 -15
  300. package/src/panels/signals-panel.ts +153 -131
  301. package/src/panels/statement-editor.ts +230 -140
  302. package/src/panels/style-panel.ts +218 -205
  303. package/src/panels/style-utils.ts +114 -51
  304. package/src/panels/stylebook-doc.ts +57 -54
  305. package/src/panels/stylebook-layers-panel.ts +9 -9
  306. package/src/panels/stylebook-panel.ts +13 -17
  307. package/src/panels/tab-drop.ts +27 -11
  308. package/src/panels/tab-strip.ts +36 -26
  309. package/src/platform-errors.ts +57 -43
  310. package/src/platform.ts +58 -30
  311. package/src/platforms/cloud.ts +345 -175
  312. package/src/platforms/default-platform.ts +10 -4
  313. package/src/platforms/devserver.ts +129 -117
  314. package/src/platforms/read-batcher.ts +16 -8
  315. package/src/project-list.ts +2 -1
  316. package/src/publish/deploy-checklist.ts +8 -2
  317. package/src/publish/pages-service.ts +28 -13
  318. package/src/publish/publish-commands.ts +5 -4
  319. package/src/publish/publish-panel.ts +10 -6
  320. package/src/recent-projects.ts +15 -8
  321. package/src/resize-edges.ts +26 -36
  322. package/src/services/a11y-report.ts +26 -19
  323. package/src/services/agent-seed.ts +23 -11
  324. package/src/services/ai-ask.ts +9 -12
  325. package/src/services/ai-command-tools.ts +68 -62
  326. package/src/services/ai-import-tools.ts +80 -67
  327. package/src/services/ai-models.ts +17 -13
  328. package/src/services/ai-project-tools.ts +68 -32
  329. package/src/services/ai-session-store.ts +19 -10
  330. package/src/services/ai-system-prompt.ts +46 -20
  331. package/src/services/ai-tools.ts +71 -27
  332. package/src/services/ai-write-report.ts +20 -12
  333. package/src/services/ai-writes.ts +4 -4
  334. package/src/services/automation.ts +58 -31
  335. package/src/services/cem-export.ts +149 -58
  336. package/src/services/clock.ts +6 -1
  337. package/src/services/code-services.ts +37 -31
  338. package/src/services/context-manager.ts +14 -10
  339. package/src/services/context-resolver.ts +20 -8
  340. package/src/services/data-service.ts +19 -15
  341. package/src/services/directory-picker.ts +18 -12
  342. package/src/services/document-assistant.ts +39 -19
  343. package/src/services/gated-registry.ts +10 -6
  344. package/src/services/harness/chat-reducer.ts +23 -1
  345. package/src/services/import-client.ts +91 -38
  346. package/src/services/import-seed.ts +8 -2
  347. package/src/services/jx-validate.ts +28 -31
  348. package/src/services/live-preview.ts +0 -0
  349. package/src/services/live-surfaces.ts +6 -3
  350. package/src/services/model-uri.ts +10 -2
  351. package/src/services/module-preloads.ts +12 -8
  352. package/src/services/monaco-buffer.ts +43 -24
  353. package/src/services/monaco-lazy.ts +7 -8
  354. package/src/services/monaco-setup.ts +23 -16
  355. package/src/services/notify.ts +44 -17
  356. package/src/services/popover-report.ts +25 -10
  357. package/src/services/preview-eval.ts +20 -8
  358. package/src/services/profile.ts +13 -6
  359. package/src/services/project-path.ts +13 -10
  360. package/src/services/references.ts +0 -0
  361. package/src/services/render-critic.ts +8 -7
  362. package/src/services/settings/kernel.ts +13 -4
  363. package/src/services/settings/write-queue.ts +9 -9
  364. package/src/services/token-lint.ts +12 -10
  365. package/src/services/tool-executor.ts +17 -5
  366. package/src/services/tool-outcomes.ts +44 -24
  367. package/src/services/trusted-types.ts +24 -7
  368. package/src/settings/contexts-section.ts +11 -8
  369. package/src/settings/contributed-section.ts +79 -60
  370. package/src/settings/css-vars-editor.ts +37 -16
  371. package/src/settings/defs-editor.ts +38 -35
  372. package/src/settings/extension-rows.ts +16 -8
  373. package/src/settings/extension-sections.ts +23 -13
  374. package/src/settings/extensions-section.ts +4 -1
  375. package/src/settings/general-settings.ts +11 -8
  376. package/src/settings/locales-section.ts +20 -12
  377. package/src/settings/preferences-dialog.ts +9 -6
  378. package/src/settings/preferences-keymap.ts +7 -5
  379. package/src/settings/preferences-sections.ts +11 -5
  380. package/src/settings/project-sections.ts +1 -1
  381. package/src/settings/schema-field-ui.ts +9 -0
  382. package/src/settings/settings-document.ts +5 -5
  383. package/src/shell/tree.ts +6 -5
  384. package/src/shell.ts +104 -81
  385. package/src/site-context.ts +37 -22
  386. package/src/state.ts +41 -49
  387. package/src/store.ts +54 -34
  388. package/src/studio.ts +25 -75
  389. package/src/style/live-preview.ts +1 -1
  390. package/src/style/project-styles.ts +6 -7
  391. package/src/style/token-ref.ts +5 -4
  392. package/src/surfaces/about.ts +18 -19
  393. package/src/surfaces/add-repo.ts +17 -19
  394. package/src/surfaces/ai-chat.ts +31 -36
  395. package/src/surfaces/ai-credentials-form.ts +6 -16
  396. package/src/surfaces/ai-managed-connect.ts +3 -4
  397. package/src/surfaces/ai-model-picker.ts +3 -5
  398. package/src/surfaces/block-action-bar.ts +22 -11
  399. package/src/surfaces/boot-failure.ts +4 -5
  400. package/src/surfaces/bottom-dock.ts +9 -18
  401. package/src/surfaces/canvas-stage.ts +12 -11
  402. package/src/surfaces/cf-account-picker.ts +17 -18
  403. package/src/surfaces/commandbar.ts +14 -9
  404. package/src/surfaces/convert-repeater.ts +17 -19
  405. package/src/surfaces/data-actions.ts +9 -7
  406. package/src/surfaces/dialog.ts +26 -28
  407. package/src/surfaces/diff-toolbar.ts +9 -7
  408. package/src/surfaces/doc-header.ts +10 -19
  409. package/src/surfaces/empty-state.ts +7 -10
  410. package/src/surfaces/entry-editor.ts +14 -11
  411. package/src/surfaces/expression-editor.ts +11 -25
  412. package/src/surfaces/files-panel.ts +27 -14
  413. package/src/surfaces/formula-palette.ts +4 -5
  414. package/src/surfaces/git-panel.ts +7 -15
  415. package/src/surfaces/github-auth.ts +16 -20
  416. package/src/surfaces/github-publish.ts +17 -22
  417. package/src/surfaces/grid-cell.ts +30 -31
  418. package/src/surfaces/grid-open.ts +10 -14
  419. package/src/surfaces/grid-panel.ts +13 -9
  420. package/src/surfaces/grid-replace.ts +13 -13
  421. package/src/surfaces/grid-views.ts +15 -18
  422. package/src/surfaces/inspector-dock.ts +13 -12
  423. package/src/surfaces/jump-bar.ts +5 -6
  424. package/src/surfaces/jxsuite-update.ts +16 -22
  425. package/src/surfaces/library-pane.ts +19 -20
  426. package/src/surfaces/logic-panel.ts +17 -30
  427. package/src/surfaces/logic-workspace.ts +13 -15
  428. package/src/surfaces/media-browser.ts +11 -10
  429. package/src/surfaces/media-field.ts +4 -5
  430. package/src/surfaces/media-pane.ts +8 -7
  431. package/src/surfaces/menu.ts +29 -23
  432. package/src/surfaces/navigator-dock.ts +11 -12
  433. package/src/surfaces/new-project.ts +27 -26
  434. package/src/surfaces/pane-context.ts +20 -25
  435. package/src/surfaces/pane-grid.ts +15 -10
  436. package/src/surfaces/panel-activity.ts +5 -6
  437. package/src/surfaces/panel-data.ts +3 -4
  438. package/src/surfaces/panel-deploy-checklist.ts +5 -6
  439. package/src/surfaces/panel-elements.ts +5 -7
  440. package/src/surfaces/panel-i18n.ts +5 -7
  441. package/src/surfaces/panel-imports.ts +6 -13
  442. package/src/surfaces/panel-outline.ts +25 -19
  443. package/src/surfaces/panel-page.ts +11 -18
  444. package/src/surfaces/panel-problems.ts +5 -7
  445. package/src/surfaces/panel-signals.ts +20 -34
  446. package/src/surfaces/panel-stylebook-layers.ts +5 -8
  447. package/src/surfaces/preferences.ts +21 -11
  448. package/src/surfaces/progress-modal.ts +15 -9
  449. package/src/surfaces/properties-panel.json +1 -1
  450. package/src/surfaces/properties-panel.ts +20 -42
  451. package/src/surfaces/publish.ts +18 -18
  452. package/src/surfaces/push-plan.ts +7 -8
  453. package/src/surfaces/rail.ts +13 -13
  454. package/src/surfaces/reference-field.ts +11 -15
  455. package/src/surfaces/schema-builder.ts +16 -22
  456. package/src/surfaces/schema-form.ts +15 -25
  457. package/src/surfaces/secret-field.ts +9 -6
  458. package/src/surfaces/seo.ts +21 -15
  459. package/src/surfaces/settings-contexts.ts +9 -7
  460. package/src/surfaces/settings-contributed.ts +14 -10
  461. package/src/surfaces/settings-css-vars.ts +5 -12
  462. package/src/surfaces/settings-defs.json +2 -2
  463. package/src/surfaces/settings-defs.ts +17 -21
  464. package/src/surfaces/settings-deploy.ts +8 -15
  465. package/src/surfaces/settings-extensions.ts +5 -6
  466. package/src/surfaces/settings-head.ts +33 -39
  467. package/src/surfaces/settings-locales.ts +8 -20
  468. package/src/surfaces/settings-overview.ts +5 -6
  469. package/src/surfaces/settings-packages.ts +8 -7
  470. package/src/surfaces/settings-pane.ts +9 -18
  471. package/src/surfaces/settings-rawjson.ts +5 -6
  472. package/src/surfaces/shell.ts +1 -2
  473. package/src/surfaces/slash-menu.ts +19 -9
  474. package/src/surfaces/statements.ts +13 -18
  475. package/src/surfaces/statusbar.ts +17 -14
  476. package/src/surfaces/style-panel.ts +18 -31
  477. package/src/surfaces/stylebook-chrome.ts +3 -5
  478. package/src/surfaces/tab-strip.ts +14 -13
  479. package/src/surfaces/target-line.ts +6 -7
  480. package/src/surfaces/welcome.ts +5 -7
  481. package/src/tabs/patch-ops.ts +4 -3
  482. package/src/tabs/project-config.ts +32 -21
  483. package/src/tabs/selection.ts +36 -8
  484. package/src/tabs/tab.ts +52 -41
  485. package/src/tabs/transact.ts +98 -53
  486. package/src/types.ts +32 -17
  487. package/src/ui/ai-credentials-form.ts +10 -13
  488. package/src/ui/ai-model-picker.ts +3 -3
  489. package/src/ui/cf-account-picker.ts +7 -9
  490. package/src/ui/color-selector.ts +9 -5
  491. package/src/ui/dynamic-slot.ts +7 -8
  492. package/src/ui/expression-editor.ts +112 -105
  493. package/src/ui/form-controls.ts +57 -48
  494. package/src/ui/formula-catalog.ts +239 -230
  495. package/src/ui/formula-chips.ts +33 -18
  496. package/src/ui/layers.ts +44 -31
  497. package/src/ui/media-picker.ts +18 -9
  498. package/src/ui/popover-surface.ts +20 -12
  499. package/src/ui/progress-modal.ts +13 -8
  500. package/src/ui/regions.ts +7 -6
  501. package/src/ui/schema-form.ts +113 -70
  502. package/src/ui/surface.ts +71 -8
  503. package/src/ui/timing.ts +9 -0
  504. package/src/ui/value-source.ts +44 -31
  505. package/src/ui/virtual-window.ts +3 -2
  506. package/src/utils/base64.ts +3 -1
  507. package/src/utils/edit-display.ts +73 -73
  508. package/src/utils/element-selectors.ts +3 -2
  509. package/src/utils/google-fonts.ts +15 -14
  510. package/src/utils/inherited-style.ts +18 -20
  511. package/src/utils/link-target.ts +1 -1
  512. package/src/utils/preview-format.ts +25 -3
  513. package/src/utils/strip-events.ts +49 -22
  514. package/src/utils/studio-utils.ts +29 -14
  515. package/src/view.ts +2 -3
  516. package/src/workspace/pane-derive.ts +10 -12
  517. package/src/workspace/session.ts +53 -43
  518. package/src/workspace/workspace.ts +40 -36
  519. package/dist/chunks/adapter-f93pafd7.js +0 -4
  520. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  521. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  522. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  523. package/dist/chunks/color-field-embq5ctg.js +0 -4
  524. package/dist/chunks/color-fpezvnkt.js +0 -4
  525. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  526. package/dist/chunks/combobox-773hdzyj.js +0 -4
  527. package/dist/chunks/components-ax2f1fnn.js +0 -4
  528. package/dist/chunks/content-source-108aqtk1.js +0 -4
  529. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  530. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  531. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  532. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  533. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  534. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  535. package/dist/chunks/files-44vp8a2s.js +0 -4
  536. package/dist/chunks/format-host-7q1petb9.js +0 -4
  537. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  538. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  539. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  540. package/dist/chunks/icons-p44xhjf0.js +0 -4
  541. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  542. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  543. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  544. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  545. package/dist/chunks/index-wkyfjeqz.js +0 -4
  546. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  547. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  548. package/dist/chunks/layers-xd92fg8d.js +0 -4
  549. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  550. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  551. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  552. package/dist/chunks/menu-37d07z9m.js +0 -4
  553. package/dist/chunks/menu-5c55ea3d.js +0 -4
  554. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  555. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  556. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  557. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  558. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  559. package/dist/chunks/parse-897fvqah.js +0 -4
  560. package/dist/chunks/platform-v1qctbe6.js +0 -4
  561. package/dist/chunks/popover-8htra4er.js +0 -4
  562. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  563. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  564. package/dist/chunks/references-gmqp82fs.js +0 -4
  565. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  566. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  567. package/dist/chunks/select-n3v7gwas.js +0 -4
  568. package/dist/chunks/split-pff8f3ze.js +0 -4
  569. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  570. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  571. package/dist/chunks/studio-1b04pd0j.js +0 -64
  572. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  573. package/dist/chunks/studio-4tanh828.js +0 -5
  574. package/dist/chunks/studio-55h4mstj.js +0 -4
  575. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  576. package/dist/chunks/studio-60dqgb0c.js +0 -5
  577. package/dist/chunks/studio-61dp09qg.js +0 -9
  578. package/dist/chunks/studio-63epcrj2.js +0 -5
  579. package/dist/chunks/studio-74k29dy9.js +0 -5
  580. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  581. package/dist/chunks/studio-7zx31knw.js +0 -9
  582. package/dist/chunks/studio-8bxk97km.js +0 -5
  583. package/dist/chunks/studio-933e30n4.js +0 -5
  584. package/dist/chunks/studio-98wnwhbg.js +0 -5
  585. package/dist/chunks/studio-9mccjwjh.js +0 -14
  586. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  587. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  588. package/dist/chunks/studio-e81q1vb9.js +0 -5
  589. package/dist/chunks/studio-epgrmqqm.js +0 -5
  590. package/dist/chunks/studio-ery42sqr.js +0 -4
  591. package/dist/chunks/studio-g1shz58g.js +0 -5
  592. package/dist/chunks/studio-gf0fz03c.js +0 -5
  593. package/dist/chunks/studio-gjtpe62q.js +0 -6
  594. package/dist/chunks/studio-gkskhg7m.js +0 -5
  595. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  596. package/dist/chunks/studio-j03zga3y.js +0 -9
  597. package/dist/chunks/studio-jhpxeckz.js +0 -5
  598. package/dist/chunks/studio-k01r7ykp.js +0 -5
  599. package/dist/chunks/studio-kk7h30ne.js +0 -7
  600. package/dist/chunks/studio-kt1zqney.js +0 -5
  601. package/dist/chunks/studio-m3cwhvye.js +0 -5
  602. package/dist/chunks/studio-mcayt6hz.js +0 -5
  603. package/dist/chunks/studio-myjcghv3.js +0 -5
  604. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  605. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  606. package/dist/chunks/studio-nj5a01jy.js +0 -928
  607. package/dist/chunks/studio-pcgz8heb.js +0 -5
  608. package/dist/chunks/studio-qcsq0t15.js +0 -5
  609. package/dist/chunks/studio-qkstvve9.js +0 -5
  610. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  611. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  612. package/dist/chunks/studio-s8dmmz66.js +0 -5
  613. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  614. package/dist/chunks/studio-szsjbj0g.js +0 -5
  615. package/dist/chunks/studio-t1xzawhr.js +0 -16
  616. package/dist/chunks/studio-t6b6qe31.js +0 -5
  617. package/dist/chunks/studio-tdcprbqb.js +0 -5
  618. package/dist/chunks/studio-vyc0b4he.js +0 -10
  619. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  620. package/dist/chunks/studio-w3hskzqk.js +0 -5
  621. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  622. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  623. package/dist/chunks/studio-y6n42tgs.js +0 -5
  624. package/dist/chunks/studio-yb560vxr.js +0 -5
  625. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  626. package/dist/chunks/studio-yw05w8f0.js +0 -7
  627. package/dist/chunks/studio-z16sgavc.js +0 -5
  628. package/dist/chunks/studio-zyqn40w4.js +0 -5
  629. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  630. package/dist/chunks/tabs-jwthg40w.js +0 -4
  631. package/dist/chunks/textfield-spy3hc77.js +0 -4
  632. package/dist/chunks/toast-4d35zd64.js +0 -4
  633. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  634. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  635. package/dist/chunks/tree-h19v1jfz.js +0 -4
  636. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  637. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
@@ -8,13 +8,14 @@
8
8
  * path.
9
9
  */
10
10
 
11
+ import { isNonNullObject } from "@jxsuite/schema/guards";
11
12
  import { getFormats, loadExtensions, loadFormats } from "../format/format-host";
12
13
  import { registerSettingsSection, unregisterSettingsSection } from "./section-registry";
13
14
  import { renderContributedSection } from "./contributed-section";
14
15
  import { dataSectionActions } from "../panels/data-grid";
15
16
  import type { ExtensionContributionInfo } from "../types";
16
17
  import type { JsonSchema } from "../ui/schema-form";
17
- import type { SettingsContribution } from "./contributed-section";
18
+ import type { ContributedSectionOptions, SettingsContribution } from "./contributed-section";
18
19
 
19
20
  /** The `$studio.settings` block shape consumed here (nav metadata + the renderer inputs). */
20
21
  interface StudioSettingsBlock {
@@ -49,31 +50,39 @@ const DEFAULT_SECTION_ORDER = 100;
49
50
  export function deriveSettingsSection(
50
51
  info: ExtensionContributionInfo,
51
52
  ): DerivedSettingsSection | null {
52
- const studio = info.studio as { settings?: StudioSettingsBlock } | null | undefined;
53
- const settings = studio?.settings;
53
+ /* SAFETY: `$studio.settings` is the extensions.md §9.1 vocabulary, served verbatim from the
54
+ class descriptor; every member read below is optional and falls back through `??`, so an
55
+ omitted member degrades to the section defaults rather than reaching the renderer. */
56
+ const settings = info.studio?.settings as StudioSettingsBlock | null | undefined;
54
57
  if (!settings) {
55
58
  return null;
56
59
  }
57
60
  const { key } = info.project;
58
61
  const layout = settings.layout ?? "form";
62
+ /* SAFETY: the backend fills `entrySchema` with `properties[<key>]` of the extension's shipped
63
+ project fragment (compiler `site/format-host.ts`), which is a JSON Schema by construction. */
59
64
  const sectionSchema = (info.entrySchema ?? {}) as JsonSchema & {
60
65
  additionalProperties?: JsonSchema | boolean;
61
66
  };
62
67
  const entrySchema =
63
68
  layout === "map"
64
- ? typeof sectionSchema.additionalProperties === "object"
69
+ ? isNonNullObject(sectionSchema.additionalProperties)
65
70
  ? sectionSchema.additionalProperties
66
71
  : {}
67
- : (sectionSchema as JsonSchema);
72
+ : sectionSchema;
68
73
  const label = settings.label ?? info.project.title ?? key;
74
+ const sectionSettings: SettingsContribution["settings"] = {};
75
+ if (settings.entry !== undefined) {
76
+ sectionSettings.entry = settings.entry;
77
+ }
78
+ if (settings.layout !== undefined) {
79
+ sectionSettings.layout = settings.layout;
80
+ }
69
81
  return {
70
82
  contribution: {
71
83
  entrySchema,
72
84
  key,
73
- settings: {
74
- ...(settings.entry === undefined ? {} : { entry: settings.entry }),
75
- ...(settings.layout === undefined ? {} : { layout: settings.layout }),
76
- },
85
+ settings: sectionSettings,
77
86
  title: label,
78
87
  },
79
88
  icon: settings.icon,
@@ -143,10 +152,11 @@ async function runSync(): Promise<void> {
143
152
  // Data-domain sections get the Test/Push/Data-grid actions slot when the platform
144
153
  // Implements the protocol's data routes; every other section renders actions-free.
145
154
  const actions = dataSectionActions(derived.key);
146
- renderContributedSection(container, contribution, {
147
- formats: getFormats(),
148
- ...(actions === null ? {} : { actions }),
149
- });
155
+ const opts: ContributedSectionOptions = { formats: getFormats() };
156
+ if (actions !== null) {
157
+ opts.actions = actions;
158
+ }
159
+ renderContributedSection(container, contribution, opts);
150
160
  },
151
161
  });
152
162
  next.add(derived.key);
@@ -90,7 +90,10 @@ const mounted = new WeakMap<HTMLElement, ExtensionsSurfaceHandle>();
90
90
  const errors = new WeakMap<HTMLElement, string>();
91
91
 
92
92
  /** The sentence a row's state deserves, and the tone it is said in. */
93
- function noteFor(row: ExtensionRow): { note: string; noteTone: ExtensionRowView["noteTone"] } {
93
+ type RowNote = Pick<ExtensionRowView, "note" | "noteTone">;
94
+
95
+ /** Answer {@link RowNote} for one row. */
96
+ function noteFor(row: ExtensionRow): RowNote {
94
97
  if (row.unavailable !== undefined) {
95
98
  return { note: row.unavailable, noteTone: "warn" };
96
99
  }
@@ -16,6 +16,7 @@
16
16
  * container to a `render`, and this one mounts a document into it instead of rendering lit.
17
17
  */
18
18
 
19
+ import { isString } from "@jxsuite/schema/guards";
19
20
  import { errorMessage } from "@jxsuite/schema/parse";
20
21
  import { projectState } from "../store";
21
22
  import { updateSiteConfig } from "../site-context";
@@ -31,6 +32,7 @@ import type {
31
32
  OverviewValues,
32
33
  } from "../surfaces/settings-overview";
33
34
  import type { JxHeadEntry, ProjectConfig } from "@jxsuite/schema/types";
35
+ import type { ProjectConfigPatch } from "../site-context";
34
36
 
35
37
  /**
36
38
  * The last failed write, per rendered section.
@@ -49,7 +51,7 @@ const mounted = new WeakMap<HTMLElement, OverviewSurfaceHandle>();
49
51
 
50
52
  /** The live project configuration, read at the moment it is needed rather than at render time. */
51
53
  function config(): ProjectConfig {
52
- return (projectState?.projectConfig || {}) as ProjectConfig;
54
+ return projectState?.projectConfig || {};
53
55
  }
54
56
 
55
57
  // ─── Site description ($head meta) ───────────────────────────────────────────
@@ -66,7 +68,8 @@ function isDescriptionMeta(entry: JxHeadEntry): boolean {
66
68
  */
67
69
  function readDescription(cfg: ProjectConfig): string {
68
70
  const entry = (cfg.$head ?? []).find((e) => isDescriptionMeta(e));
69
- return typeof entry?.attributes?.content === "string" ? entry.attributes.content : "";
71
+ const content = entry?.attributes?.content;
72
+ return isString(content) ? content : "";
70
73
  }
71
74
 
72
75
  /** `$head` with the description meta upserted (or dropped, when cleared). */
@@ -91,11 +94,11 @@ function headWithDescription(head: JxHeadEntry[], text: string): JxHeadEntry[] {
91
94
  * The patch that _removes_ `url`. `undefined` survives the object spread inside `updateSiteConfig`
92
95
  * and `JSON.stringify` then drops the key, so clearing the field clears the setting instead of
93
96
  * persisting an empty string the build would have to special-case (`site-build.ts` gates the
94
- * sitemap on `Boolean(url)` but still forwards `""` into the render context). The cast is the price
95
- * of `exactOptionalPropertyTypes` — `ProjectConfig["url"]` is `string`, never `string |
96
- * undefined`.
97
+ * sitemap on `Boolean(url)` but still forwards `""` into the render context). A
98
+ * {@link ProjectConfigPatch} rather than a `Partial<ProjectConfig>`, because under
99
+ * `exactOptionalPropertyTypes` only the patch type can carry an `undefined` member.
97
100
  */
98
- const CLEAR_URL = { url: undefined } as unknown as Partial<ProjectConfig>;
101
+ const CLEAR_URL: ProjectConfigPatch = { url: undefined };
99
102
 
100
103
  // ─── Projection ──────────────────────────────────────────────────────────────
101
104
 
@@ -121,7 +124,7 @@ function values(container: HTMLElement): OverviewValues {
121
124
  return {
122
125
  description: readDescription(cfg),
123
126
  error: errors.get(container) ?? null,
124
- favicon: typeof cfg.favicon === "string" ? cfg.favicon : "",
127
+ favicon: isString(cfg.favicon) ? cfg.favicon : "",
125
128
  name: cfg.name ?? "",
126
129
  stylesDisabled: command === undefined,
127
130
  stylesTitle: command?.title ?? "",
@@ -145,7 +148,7 @@ function actions(container: HTMLElement): OverviewActions {
145
148
 
146
149
  /** Persist a patch, surfacing the rejection instead of swallowing it. */
147
150
  const persist = async (
148
- patch: Partial<ProjectConfig>,
151
+ patch: ProjectConfigPatch,
149
152
  field: OverviewErrorField = "section",
150
153
  ): Promise<void> => {
151
154
  try {
@@ -30,6 +30,7 @@ import { updateSiteConfig } from "../site-context";
30
30
  import type { LocalesActions, LocalesView } from "../surfaces/settings-locales";
31
31
  import type { LocaleRouting } from "@jxsuite/schema/locale";
32
32
  import type { ProjectConfig } from "@jxsuite/schema/types";
33
+ import type { ProjectConfigPatch } from "../site-context";
33
34
 
34
35
  /**
35
36
  * The form beside the file: the tag being typed, and the last write that failed.
@@ -67,9 +68,9 @@ function form(container: HTMLElement): Form {
67
68
  * value the file still holds.
68
69
  *
69
70
  * @param {HTMLElement} container
70
- * @param {Partial<ProjectConfig>} patch
71
+ * @param {ProjectConfigPatch} patch
71
72
  */
72
- async function persist(container: HTMLElement, patch: Partial<ProjectConfig>): Promise<void> {
73
+ async function persist(container: HTMLElement, patch: ProjectConfigPatch): Promise<void> {
73
74
  try {
74
75
  await updateSiteConfig(patch);
75
76
  form(container).error = "";
@@ -81,7 +82,7 @@ async function persist(container: HTMLElement, patch: Partial<ProjectConfig>): P
81
82
 
82
83
  /** The live project configuration, or an empty one before a project is open. */
83
84
  function config(): ProjectConfig {
84
- return (projectState?.projectConfig ?? {}) as ProjectConfig;
85
+ return projectState?.projectConfig ?? {};
85
86
  }
86
87
 
87
88
  /**
@@ -90,10 +91,10 @@ function config(): ProjectConfig {
90
91
  * `undefined` survives the object spread inside `updateSiteConfig` and `JSON.stringify` then drops
91
92
  * the key, so removing the last locale leaves a project with no `i18n` at all rather than one
92
93
  * declaring an empty list — which `resolveI18n` reports as "declared with no usable locale", a
93
- * build error for a state the author reached by deleting things. The cast is the price of
94
- * `exactOptionalPropertyTypes`, the same one `general-settings.ts`'s `CLEAR_URL` pays.
94
+ * build error for a state the author reached by deleting things. A {@link ProjectConfigPatch}, the
95
+ * same as `general-settings.ts`'s `CLEAR_URL`, because only the patch type can carry `undefined`.
95
96
  */
96
- const CLEAR_I18N = { i18n: undefined } as unknown as Partial<ProjectConfig>;
97
+ const CLEAR_I18N: ProjectConfigPatch = { i18n: undefined };
97
98
 
98
99
  /** The routing modes, with the sentence that says what each does to a URL. */
99
100
  export const LOCALE_ROUTINGS: readonly { value: LocaleRouting; label: string }[] = [
@@ -242,9 +243,12 @@ function remove(container: HTMLElement, tag: string): void {
242
243
  const orphaned =
243
244
  current?.defaultLocale !== undefined &&
244
245
  canonicalizeLocale(current.defaultLocale) === canonicalizeLocale(tag);
245
- void persist(container, {
246
- i18n: { ...current, ...(orphaned ? { defaultLocale: kept[0]! } : {}), locales: kept },
247
- });
246
+ const i18n: NonNullable<ProjectConfig["i18n"]> = { ...current };
247
+ if (orphaned) {
248
+ i18n.defaultLocale = kept[0]!;
249
+ }
250
+ i18n.locales = kept;
251
+ void persist(container, { i18n });
248
252
  }
249
253
 
250
254
  /**
@@ -266,9 +270,13 @@ function actions(container: HTMLElement): LocalesActions {
266
270
  void persist(container, { i18n: { ...config().i18n, defaultLocale: value } });
267
271
  },
268
272
  chooseRouting: (value: string) => {
269
- void persist(container, {
270
- i18n: { ...config().i18n, routing: value as LocaleRouting },
271
- });
273
+ /* The picker's options are LOCALE_ROUTINGS, so the lookup always finds the mode; it is what
274
+ turns the control's string back into the routing it was drawn from. */
275
+ const routing = LOCALE_ROUTINGS.find((mode) => mode.value === value)?.value;
276
+ if (routing === undefined) {
277
+ return;
278
+ }
279
+ void persist(container, { i18n: { ...config().i18n, routing } });
272
280
  },
273
281
  edit: (value: string) => {
274
282
  /* Every keystroke, with no verdict check in front of it. The lit form re-rendered only when
@@ -42,7 +42,7 @@
42
42
  * to paint. Preferences does not suspend the app.
43
43
  */
44
44
 
45
- import { CHROME_THEMES, setChromeTheme, shell } from "../shell";
45
+ import { CHROME_THEMES, isChromeTheme, setChromeTheme, shell } from "../shell";
46
46
  import { layerHost } from "../ui/layers";
47
47
  import { hydrateAccountStatus } from "../account-status";
48
48
  import { getPlatform, hasPlatform } from "../platform";
@@ -63,7 +63,6 @@ import {
63
63
  import { applyKeybindingOverrides, rebindCommand, resetKeybinding } from "./preferences-keymap";
64
64
  import { openPreferencesSurface } from "../surfaces/preferences";
65
65
 
66
- import type { ChromeTheme } from "../shell";
67
66
  import type { ShortcutRow } from "../commands/reference";
68
67
  import type { RebindResult } from "./preferences-keymap";
69
68
  import type { AnyCommand, CommandRegistry } from "../commands/registry";
@@ -88,6 +87,7 @@ import {
88
87
  isPreferencesSection,
89
88
  PREFERENCES_SECTIONS,
90
89
  } from "./preferences-sections";
90
+ import type { CommandArgValues } from "../commands/command-args";
91
91
 
92
92
  export {
93
93
  DEFAULT_PREFERENCES_SECTION,
@@ -232,7 +232,10 @@ function selectSection(id: string): void {
232
232
  }
233
233
 
234
234
  function setTheme(value: string): void {
235
- setChromeTheme(value as ChromeTheme);
235
+ // The theme rows are drawn from CHROME_THEMES, so a picked value is always one of them.
236
+ if (isChromeTheme(value)) {
237
+ setChromeTheme(value);
238
+ }
236
239
  repaint();
237
240
  }
238
241
 
@@ -652,8 +655,8 @@ export function preferencesCommands(): AnyCommand[] {
652
655
  keybinding: "mod+,",
653
656
  menus: ["commandbar/overflow", "settings/menu", "palette"],
654
657
  group: "7_settings",
655
- run: (_ctx, args) => {
656
- const section = (args as { section?: unknown } | undefined)?.section;
658
+ run: (_ctx, args?: CommandArgValues) => {
659
+ const section = args?.section;
657
660
  if (section !== undefined && !isPreferencesSection(section)) {
658
661
  throw new RangeError(
659
662
  `command "app.preferences" argument "section": "${String(section)}" is not a ` +
@@ -661,7 +664,7 @@ export function preferencesCommands(): AnyCommand[] {
661
664
  `${PREFERENCES_SECTIONS.map((candidate) => candidate.id).join(", ")}`,
662
665
  );
663
666
  }
664
- void openPreferences(section as string | undefined);
667
+ void openPreferences(section);
665
668
  },
666
669
  title: "Preferences…",
667
670
  },
@@ -33,9 +33,11 @@
33
33
  * during boot.
34
34
  */
35
35
 
36
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
36
37
  import { normalizeChord, overlappingScopes, parseChord } from "../commands/keymap";
37
38
  import { SETTINGS } from "../services/settings/definitions";
38
39
  import { clearSettings, readStoredSetting, setSetting } from "../services/settings/kernel";
40
+ import type { JsonValue } from "@jxsuite/schema/types";
39
41
  import type { KeybindingOverrides } from "../commands/keymap";
40
42
  import type { KeyScope } from "../commands/levels";
41
43
  import type { AnyCommand, CommandRegistry } from "../commands/registry";
@@ -120,13 +122,13 @@ function readRaw(): string {
120
122
  }
121
123
 
122
124
  /** Every chord in one stored entry, canonicalised — or `null` if any of them is not a chord. */
123
- function canonicalise(chords: unknown): string[] | null {
125
+ function canonicalise(chords: JsonValue): string[] | null {
124
126
  if (!Array.isArray(chords)) {
125
127
  return null;
126
128
  }
127
129
  const canonical: string[] = [];
128
- for (const chord of chords as unknown[]) {
129
- if (typeof chord !== "string") {
130
+ for (const chord of chords) {
131
+ if (!isString(chord)) {
130
132
  return null;
131
133
  }
132
134
  try {
@@ -159,10 +161,10 @@ export function loadKeybindingOverrides(): Map<string, string[]> {
159
161
  // Corrupt store: the defaults are the whole keymap.
160
162
  return layer;
161
163
  }
162
- if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
164
+ if (!isJsonObject(parsed)) {
163
165
  return layer;
164
166
  }
165
- for (const [id, chords] of Object.entries(parsed as Record<string, unknown>)) {
167
+ for (const [id, chords] of Object.entries(parsed)) {
166
168
  const canonical = canonicalise(chords);
167
169
  if (canonical) {
168
170
  layer.set(id, canonical);
@@ -29,7 +29,7 @@ export interface PreferencesSection {
29
29
  * Four are built; a section is added here when it has something to configure, never before — an
30
30
  * empty pane is the "declared but unbuilt" state the rail already refuses to render.
31
31
  */
32
- export const PREFERENCES_SECTIONS: readonly PreferencesSection[] = [
32
+ const SECTIONS = [
33
33
  { id: "appearance", title: "Appearance", blurb: "How the Studio chrome looks." },
34
34
  {
35
35
  id: "assistant",
@@ -46,12 +46,18 @@ export const PREFERENCES_SECTIONS: readonly PreferencesSection[] = [
46
46
  title: "Keyboard",
47
47
  blurb: "Generated from the command registry — the app's own record of every chord.",
48
48
  },
49
- ];
49
+ ] as const satisfies readonly PreferencesSection[];
50
+
51
+ /** The id of one built section: the literal set `app.preferences { section }` accepts. */
52
+ export type PreferencesSectionId = (typeof SECTIONS)[number]["id"];
53
+
54
+ /** {@link SECTIONS}, as the sheet and the rail read it. */
55
+ export const PREFERENCES_SECTIONS: readonly PreferencesSection[] = SECTIONS;
50
56
 
51
57
  /** The section the sheet opens on when none is named. */
52
58
  export const DEFAULT_PREFERENCES_SECTION = PREFERENCES_SECTIONS[0]!.id;
53
59
 
54
- /** Whether a string names a section. */
55
- export function isPreferencesSection(id: unknown): boolean {
56
- return PREFERENCES_SECTIONS.some((section) => section.id === id);
60
+ /** Whether a value names a section. */
61
+ export function isPreferencesSection(id: unknown): id is PreferencesSectionId {
62
+ return SECTIONS.some((section) => section.id === id);
57
63
  }
@@ -54,7 +54,7 @@ const errors = new WeakMap<HTMLElement, string>();
54
54
 
55
55
  /** The live project configuration, or an empty one before a project is open. */
56
56
  function config(): ProjectConfig {
57
- return (projectState?.projectConfig ?? {}) as ProjectConfig;
57
+ return projectState?.projectConfig ?? {};
58
58
  }
59
59
 
60
60
  // ─── Deploy ───────────────────────────────────────────────────────────────────
@@ -26,6 +26,15 @@ export const FIELD_TYPES = ["string", "number", "boolean", "array", "object", "r
26
26
 
27
27
  export const FORMAT_OPTIONS = ["", "image", "date", "color"];
28
28
 
29
+ /** What a new field's add row starts as. Spread it: every add row edits its own copy. */
30
+ export const BLANK_FIELD = { format: "", name: "", required: false, type: "string" };
31
+
32
+ /** One object field's unsubmitted nested field. */
33
+ export interface NestedFieldDraft {
34
+ name: string;
35
+ type: string;
36
+ }
37
+
29
38
  /**
30
39
  * Detect the studio field type from a JSON Schema property definition.
31
40
  *
@@ -26,7 +26,7 @@
26
26
  import { errorMessage } from "@jxsuite/schema/parse";
27
27
  import { optionalStringArg, stringProperty } from "../commands/command-args";
28
28
  import { notify } from "../services/notify";
29
- import { requireProjectState } from "../state";
29
+ import { projectState } from "../state";
30
30
  import { PROJECT_CONFIG_PATH } from "../tabs/tab";
31
31
  import { lendProjectConfigLayout } from "../tabs/project-config";
32
32
  import { activeTab, focusPane, openTab, workspace } from "../workspace/workspace";
@@ -181,7 +181,7 @@ export function activeSettingsSection(): string | null {
181
181
 
182
182
  /** Whether the active tab is the configuration document in its settings editor. */
183
183
  export function settingsDocumentOpen(): boolean {
184
- const tab = activeTab.value as Tab | null;
184
+ const tab = activeTab.value;
185
185
  return tab?.documentPath === PROJECT_CONFIG_PATH && tab.session.ui.canvasMode === SETTINGS_MODE;
186
186
  }
187
187
 
@@ -197,7 +197,7 @@ export function settingsDocumentOpen(): boolean {
197
197
  * @returns {Tab | null} The tab, or null when no project is open
198
198
  */
199
199
  export function showSettingsDocument(mode: string = SETTINGS_MODE): Tab | null {
200
- const state = requireProjectState();
200
+ const state = projectState;
201
201
  if (!state) {
202
202
  return null;
203
203
  }
@@ -210,11 +210,11 @@ export function showSettingsDocument(mode: string = SETTINGS_MODE): Tab | null {
210
210
  }
211
211
  existing.session.ui.canvasMode = mode;
212
212
  existing.session.ui.preview = false;
213
- return revealTab(existing as unknown as Tab);
213
+ return revealTab(existing);
214
214
  }
215
215
  const tab = openTab({
216
216
  capabilities: { modes: [...SETTINGS_TAB_MODES] },
217
- document: (state.projectConfig ?? {}) as unknown as Record<string, unknown>,
217
+ document: state.projectConfig ?? {},
218
218
  documentPath: PROJECT_CONFIG_PATH,
219
219
  id: PROJECT_CONFIG_PATH,
220
220
  });
package/src/shell/tree.ts CHANGED
@@ -13,7 +13,7 @@
13
13
  * the real shell instead of describing one.
14
14
  */
15
15
 
16
- import { html, render as litRender } from "lit-html";
16
+ import { html, render } from "lit-html";
17
17
  import type { TemplateResult } from "lit-html";
18
18
  import { mountShellSurface } from "../surfaces/shell";
19
19
  import { mountBootFailureSurface } from "../surfaces/boot-failure";
@@ -82,7 +82,7 @@ export async function mountShellTree(host: ParentNode = document.body): Promise<
82
82
  await mountShellSurface(root);
83
83
  /* After the frame, so the layers are its siblings in the order they always were. lit's `render`
84
84
  manages only the range between its own markers, so appending here leaves `#app` alone. */
85
- litRender(overlayLayers(), root);
85
+ render(overlayLayers(), root);
86
86
  }
87
87
 
88
88
  /**
@@ -128,12 +128,13 @@ export async function mountBootFailureTree(
128
128
  * containing block here would move all four of them, silently.
129
129
  */
130
130
  function shellRoot(host: ParentNode): HTMLElement {
131
- const existing = host.querySelector?.("#shell-root");
131
+ // The only `#shell-root` is the div made below, so the element found is an HTMLElement.
132
+ const existing = host.querySelector<HTMLElement>("#shell-root");
132
133
  if (existing) {
133
- return existing as HTMLElement;
134
+ return existing;
134
135
  }
135
136
  const root = document.createElement("div");
136
137
  root.id = "shell-root";
137
- (host as HTMLElement).append(root);
138
+ host.append(root);
138
139
  return root;
139
140
  }