@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
@@ -8,20 +8,31 @@
8
8
  * path.
9
9
  */
10
10
 
11
+ import { isNonNullObject, isString } from "@jxsuite/schema/guards";
11
12
  import { getFormats, loadExtensions, loadFormats } from "../format/format-host";
12
- import { registerSettingsSection, unregisterSettingsSection } from "./section-registry";
13
+ import {
14
+ DEFAULT_SETTINGS_GROUP,
15
+ isSettingsGroupId,
16
+ registerSettingsSection,
17
+ unregisterSettingsSection,
18
+ } from "./section-registry";
13
19
  import { renderContributedSection } from "./contributed-section";
14
20
  import { dataSectionActions } from "../panels/data-grid";
15
21
  import type { ExtensionContributionInfo } from "../types";
16
22
  import type { JsonSchema } from "../ui/schema-form";
17
- import type { SettingsContribution } from "./contributed-section";
23
+ import type { ContributedSectionOptions, SettingsContribution } from "./contributed-section";
24
+ import type { SettingsGroupId } from "./section-registry";
18
25
 
19
26
  /** The `$studio.settings` block shape consumed here (nav metadata + the renderer inputs). */
20
27
  interface StudioSettingsBlock {
21
28
  icon?: string;
22
29
  label?: string;
30
+ /** The nav group: `general`, `integrations` (the default) or `advanced`. */
31
+ group?: string;
23
32
  order?: number;
24
33
  layout?: "map" | "form";
34
+ /** The sentence the section body opens with, in place of its group's (extensions.md §9.1). */
35
+ intro?: string;
25
36
  entry?: SettingsContribution["settings"]["entry"];
26
37
  }
27
38
 
@@ -29,7 +40,9 @@ interface StudioSettingsBlock {
29
40
  export interface DerivedSettingsSection {
30
41
  key: string;
31
42
  label: string;
43
+ group: SettingsGroupId;
32
44
  icon?: string | undefined;
45
+ intro?: string | undefined;
33
46
  order: number;
34
47
  contribution: SettingsContribution;
35
48
  }
@@ -49,34 +62,46 @@ const DEFAULT_SECTION_ORDER = 100;
49
62
  export function deriveSettingsSection(
50
63
  info: ExtensionContributionInfo,
51
64
  ): DerivedSettingsSection | null {
52
- const studio = info.studio as { settings?: StudioSettingsBlock } | null | undefined;
53
- const settings = studio?.settings;
65
+ /* SAFETY: `$studio.settings` is the extensions.md §9.1 vocabulary, served verbatim from the
66
+ class descriptor; every member read below is optional and falls back through `??`, so an
67
+ omitted member degrades to the section defaults rather than reaching the renderer. */
68
+ const settings = info.studio?.settings as StudioSettingsBlock | null | undefined;
54
69
  if (!settings) {
55
70
  return null;
56
71
  }
57
72
  const { key } = info.project;
58
73
  const layout = settings.layout ?? "form";
74
+ /* SAFETY: the backend fills `entrySchema` with `properties[<key>]` of the extension's shipped
75
+ project fragment (compiler `site/format-host.ts`), which is a JSON Schema by construction. */
59
76
  const sectionSchema = (info.entrySchema ?? {}) as JsonSchema & {
60
77
  additionalProperties?: JsonSchema | boolean;
61
78
  };
62
79
  const entrySchema =
63
80
  layout === "map"
64
- ? typeof sectionSchema.additionalProperties === "object"
81
+ ? isNonNullObject(sectionSchema.additionalProperties)
65
82
  ? sectionSchema.additionalProperties
66
83
  : {}
67
- : (sectionSchema as JsonSchema);
84
+ : sectionSchema;
68
85
  const label = settings.label ?? info.project.title ?? key;
86
+ const sectionSettings: SettingsContribution["settings"] = {};
87
+ if (settings.entry !== undefined) {
88
+ sectionSettings.entry = settings.entry;
89
+ }
90
+ if (settings.layout !== undefined) {
91
+ sectionSettings.layout = settings.layout;
92
+ }
69
93
  return {
70
94
  contribution: {
71
95
  entrySchema,
72
96
  key,
73
- settings: {
74
- ...(settings.entry === undefined ? {} : { entry: settings.entry }),
75
- ...(settings.layout === undefined ? {} : { layout: settings.layout }),
76
- },
97
+ settings: sectionSettings,
77
98
  title: label,
78
99
  },
100
+ /* A group the nav does not draw falls back to the default rather than hiding the section:
101
+ an extension naming a group from a later vocabulary still gets its section listed. */
102
+ group: isSettingsGroupId(settings.group) ? settings.group : DEFAULT_SETTINGS_GROUP,
79
103
  icon: settings.icon,
104
+ intro: isString(settings.intro) ? settings.intro : undefined,
80
105
  key,
81
106
  label,
82
107
  order: settings.order ?? DEFAULT_SECTION_ORDER,
@@ -135,7 +160,9 @@ async function runSync(): Promise<void> {
135
160
  }
136
161
  const { contribution } = derived;
137
162
  registerSettingsSection({
163
+ group: derived.group,
138
164
  icon: derived.icon,
165
+ intro: derived.intro,
139
166
  key: derived.key,
140
167
  label: derived.label,
141
168
  order: derived.order,
@@ -143,10 +170,11 @@ async function runSync(): Promise<void> {
143
170
  // Data-domain sections get the Test/Push/Data-grid actions slot when the platform
144
171
  // Implements the protocol's data routes; every other section renders actions-free.
145
172
  const actions = dataSectionActions(derived.key);
146
- renderContributedSection(container, contribution, {
147
- formats: getFormats(),
148
- ...(actions === null ? {} : { actions }),
149
- });
173
+ const opts: ContributedSectionOptions = { formats: getFormats() };
174
+ if (actions !== null) {
175
+ opts.actions = actions;
176
+ }
177
+ renderContributedSection(container, contribution, opts);
150
178
  },
151
179
  });
152
180
  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,12 +16,17 @@
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";
22
23
  import { activeRegistry } from "../commands/active-registry";
24
+ import { runActiveReported } from "../commands/run-reported";
25
+ import { closeSettingsDialog } from "./settings-dialog";
23
26
  import { getPlatform } from "../platform";
24
27
  import { mountOverviewSurface } from "../surfaces/settings-overview";
28
+ import { previewAssetSrcFor } from "../canvas/asset-refs";
29
+ import { PROJECT_CONFIG_PATH } from "../tabs/tab";
25
30
 
26
31
  import type {
27
32
  OverviewActions,
@@ -31,6 +36,7 @@ import type {
31
36
  OverviewValues,
32
37
  } from "../surfaces/settings-overview";
33
38
  import type { JxHeadEntry, ProjectConfig } from "@jxsuite/schema/types";
39
+ import type { ProjectConfigPatch } from "../site-context";
34
40
 
35
41
  /**
36
42
  * The last failed write, per rendered section.
@@ -49,7 +55,7 @@ const mounted = new WeakMap<HTMLElement, OverviewSurfaceHandle>();
49
55
 
50
56
  /** The live project configuration, read at the moment it is needed rather than at render time. */
51
57
  function config(): ProjectConfig {
52
- return (projectState?.projectConfig || {}) as ProjectConfig;
58
+ return projectState?.projectConfig || {};
53
59
  }
54
60
 
55
61
  // ─── Site description ($head meta) ───────────────────────────────────────────
@@ -66,7 +72,8 @@ function isDescriptionMeta(entry: JxHeadEntry): boolean {
66
72
  */
67
73
  function readDescription(cfg: ProjectConfig): string {
68
74
  const entry = (cfg.$head ?? []).find((e) => isDescriptionMeta(e));
69
- return typeof entry?.attributes?.content === "string" ? entry.attributes.content : "";
75
+ const content = entry?.attributes?.content;
76
+ return isString(content) ? content : "";
70
77
  }
71
78
 
72
79
  /** `$head` with the description meta upserted (or dropped, when cleared). */
@@ -87,41 +94,105 @@ function headWithDescription(head: JxHeadEntry[], text: string): JxHeadEntry[] {
87
94
  );
88
95
  }
89
96
 
97
+ // ─── Favicon ($head link) ───────────────────────────────────────────────────
98
+
99
+ /**
100
+ * True for a `<link>` whose `rel` names the `icon` relation.
101
+ *
102
+ * `rel` is a set of space-separated, ASCII case-insensitive tokens (HTML Standard, link types), so
103
+ * the legacy `rel="shortcut icon"` every favicon snippet still carries is the same relation as
104
+ * `rel="icon"`. `apple-touch-icon` is a different token and is not the favicon.
105
+ */
106
+ function isIconLink(entry: JxHeadEntry): boolean {
107
+ const rel = entry.attributes?.rel;
108
+ return (
109
+ entry.tagName === "link" &&
110
+ isString(rel) &&
111
+ rel
112
+ .toLowerCase()
113
+ .split(/\s+/u)
114
+ .some((token) => token === "icon")
115
+ );
116
+ }
117
+
118
+ /**
119
+ * The site favicon. Like the description it is not a top-level `project.json` key (the composed
120
+ * schema is closed, and no compiler stage reads one): it is the `<link rel="icon">` in `$head`,
121
+ * which is what every starter and `@jxsuite/create` write and what the browser reads
122
+ * (`site-architecture.md` §2).
123
+ */
124
+ function readFavicon(cfg: ProjectConfig): string {
125
+ const href = (cfg.$head ?? []).find((e) => isIconLink(e))?.attributes?.href;
126
+ return isString(href) ? href : "";
127
+ }
128
+
129
+ /**
130
+ * `$head` with the icon link pointing at `href`.
131
+ *
132
+ * The existing link is rewritten in place, so its position among the head entries and any other
133
+ * attribute an author gave it (`sizes`, a media query) survive. `type` is the one attribute that is
134
+ * dropped: it describes the file being replaced, and a new upload may be a different format.
135
+ */
136
+ function headWithFavicon(head: JxHeadEntry[], href: string): JxHeadEntry[] {
137
+ if (!head.some((e) => isIconLink(e))) {
138
+ return [...head, { attributes: { href, rel: "icon" }, tagName: "link" }];
139
+ }
140
+ return head.map((entry) => {
141
+ if (!isIconLink(entry)) {
142
+ return entry;
143
+ }
144
+ const { type: _type, ...attributes } = entry.attributes ?? {};
145
+ return { ...entry, attributes: { ...attributes, href } };
146
+ });
147
+ }
148
+
149
+ /** The file name an uploaded favicon is stored under: `favicon` plus the upload's own extension. */
150
+ function faviconFileName(file: File): string {
151
+ const dot = file.name.lastIndexOf(".");
152
+ const ext = dot > 0 ? file.name.slice(dot + 1).toLowerCase() : "";
153
+ return /^[a-z0-9]+$/u.test(ext) ? `favicon.${ext}` : "favicon.ico";
154
+ }
155
+
90
156
  /**
91
157
  * The patch that _removes_ `url`. `undefined` survives the object spread inside `updateSiteConfig`
92
158
  * and `JSON.stringify` then drops the key, so clearing the field clears the setting instead of
93
159
  * 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`.
160
+ * sitemap on `Boolean(url)` but still forwards `""` into the render context). A
161
+ * {@link ProjectConfigPatch} rather than a `Partial<ProjectConfig>`, because under
162
+ * `exactOptionalPropertyTypes` only the patch type can carry an `undefined` member.
97
163
  */
98
- const CLEAR_URL = { url: undefined } as unknown as Partial<ProjectConfig>;
164
+ const CLEAR_URL: ProjectConfigPatch = { url: undefined };
165
+
166
+ /** The record the Global Styles button is drawn from: **Go to Styles**, the workspace's ⌘4. */
167
+ const STYLES_COMMAND = "workspace.focus.styles";
99
168
 
100
169
  // ─── Projection ──────────────────────────────────────────────────────────────
101
170
 
102
171
  /**
103
172
  * What the surface should be showing, from the configuration and the registry as they stand now.
104
173
  *
105
- * The Project Styles button is rendered FROM the `styles.open` record, so it is disabled rather
106
- * than absent when it cannot act (`studio-ui-guidelines.md` §12.3) and it cannot drift from the
107
- * palette row or the gear menu. The record's TITLE, and nothing else off the registry:
174
+ * The Global Styles button is rendered FROM the `workspace.focus.styles` record (**Go to Styles**,
175
+ * ⌘4), whose run is `view.setWorkspace { workspace: "styles" }`, so it is disabled rather than
176
+ * absent when it cannot act (`studio-ui-guidelines.md` §12.3) and it cannot drift from the palette
177
+ * row or the switcher's tab. The record's TITLE, and nothing else off the registry:
108
178
  * `disabledReason` would be the `studio-ui-guidelines.md` §12.3 shape for a control that can be
109
- * inapplicable, but this one cannot be — `styles.open` is gated on `ctx.project.open` and Overview
110
- * is a section of the project's own configuration document, so by the time this renders the answer
111
- * is always yes. Asking anyway would also be a FOCUS read inside a function that was handed a
112
- * container, which is what `scripts/check-pane-singletons.ts` rule 4 forbids: a pane-scoped surface
113
- * must not report the focused pane's state. A project-level verb happens to read the same in every
114
- * pane, but the way to be right about that is not to ask. The one thing that can genuinely be
115
- * missing is the registry itself (bootstrap order, a test), and that is an existence check, not a
116
- * state read.
179
+ * inapplicable, but this one cannot be — the switch is gated on `ctx.project.open` and Overview is
180
+ * a section of the project's own configuration, so by the time this renders the answer is always
181
+ * yes. Asking anyway would also be a FOCUS read inside a function that was handed a container,
182
+ * which is what `scripts/check-pane-singletons.ts` rule 4 forbids: a pane-scoped surface must not
183
+ * report the focused pane's state. A project-level verb happens to read the same in every pane, but
184
+ * the way to be right about that is not to ask. The one thing that can genuinely be missing is the
185
+ * registry itself (bootstrap order, a test), and that is an existence check, not a state read.
117
186
  */
118
187
  function values(container: HTMLElement): OverviewValues {
119
188
  const cfg = config();
120
- const command = activeRegistry()?.get("styles.open");
189
+ const command = activeRegistry()?.get(STYLES_COMMAND);
121
190
  return {
122
191
  description: readDescription(cfg),
123
192
  error: errors.get(container) ?? null,
124
- favicon: typeof cfg.favicon === "string" ? cfg.favicon : "",
193
+ favicon: readFavicon(cfg),
194
+ // `project.json` authored it, whatever tab is in front: the section is project-level.
195
+ faviconSrc: previewAssetSrcFor(readFavicon(cfg), PROJECT_CONFIG_PATH),
125
196
  name: cfg.name ?? "",
126
197
  stylesDisabled: command === undefined,
127
198
  stylesTitle: command?.title ?? "",
@@ -145,7 +216,7 @@ function actions(container: HTMLElement): OverviewActions {
145
216
 
146
217
  /** Persist a patch, surfacing the rejection instead of swallowing it. */
147
218
  const persist = async (
148
- patch: Partial<ProjectConfig>,
219
+ patch: ProjectConfigPatch,
149
220
  field: OverviewErrorField = "section",
150
221
  ): Promise<void> => {
151
222
  try {
@@ -175,29 +246,31 @@ function actions(container: HTMLElement): OverviewActions {
175
246
  if (!file) {
176
247
  return;
177
248
  }
249
+ // `public/` is copied to the site root verbatim, so `public/favicon.svg` is `/favicon.svg`.
250
+ const name = faviconFileName(file);
178
251
  try {
179
- await getPlatform().uploadFile("public/favicon.ico", file);
252
+ await getPlatform().uploadFile(`public/${name}`, file);
180
253
  } catch (error) {
181
254
  reject("favicon", `Could not upload the favicon — ${errorMessage(error)}`);
182
255
  return;
183
256
  }
184
- await persist({ favicon: "/favicon.ico" }, "favicon");
257
+ await persist({ $head: headWithFavicon(config().$head ?? [], `/${name}`) }, "favicon");
185
258
  });
186
259
  input.click();
187
260
  };
188
261
 
189
262
  return {
190
263
  /*
191
- * Project Styles is the SAME document in a different editor, and `styles.open` is the one place
192
- * that says so. This used to write `session.ui.canvasMode` here directly — a second
264
+ * Global styles are the Styles workspace's, and the workspace switch is the one place that
265
+ * says how to get there. This used to write `session.ui.canvasMode` here directly — a second
193
266
  * implementation of a capability, `studio-ui-guidelines.md` §12.5's defect in miniature: the
194
267
  * button and the command could disagree about what "open Project Styles" means, and only one of
195
- * them was reachable by name. The mode is still a fact about the TAB, and there is exactly one
196
- * `project.json` tab, so `revealTab`'s `focusPane` puts the keyboard on whichever pane holds
197
- * it.
268
+ * them was reachable by name. Overview is drawn in the settings dialog, so the dialog closes
269
+ * first: left up, it would cover the workspace the reader just asked for.
198
270
  */
199
271
  openStyles: () => {
200
- void activeRegistry()?.run("styles.open");
272
+ closeSettingsDialog();
273
+ void runActiveReported("view.setWorkspace", { workspace: "styles" }, "Settings");
201
274
  },
202
275
  setDescription: (value: string) => {
203
276
  echo({ description: value });
@@ -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
@@ -11,7 +11,8 @@
11
11
  * Four sections, and each one closes a hole the shell redesign named:
12
12
  *
13
13
  * - **Appearance** — the chrome theme. `shell.theme` and `view.setTheme` already existed; nothing
14
- * rendered them, so the only way to change the theme was to run a command by hand.
14
+ * rendered them, so the only way to change the theme was to run a command by hand. Beside it,
15
+ * **Show developer panels**, which puts Files and Packages on the Design rail (§5.1).
15
16
  * - **Assistant** — the provider key. It used to live in `Assistant: Settings…`, a dialog reachable
16
17
  * only from inside the assistant panel, which meant a key had to be configured from the surface
17
18
  * that was broken for want of one. That dialog is deleted; this is where it went.
@@ -42,7 +43,7 @@
42
43
  * to paint. Preferences does not suspend the app.
43
44
  */
44
45
 
45
- import { CHROME_THEMES, setChromeTheme, shell } from "../shell";
46
+ import { CHROME_THEMES, isChromeTheme, setChromeTheme, shell } from "../shell";
46
47
  import { layerHost } from "../ui/layers";
47
48
  import { hydrateAccountStatus } from "../account-status";
48
49
  import { getPlatform, hasPlatform } from "../platform";
@@ -62,8 +63,8 @@ import {
62
63
  } from "./preferences-accounts";
63
64
  import { applyKeybindingOverrides, rebindCommand, resetKeybinding } from "./preferences-keymap";
64
65
  import { openPreferencesSurface } from "../surfaces/preferences";
66
+ import { developerPanelsShown, setDeveloperPanelsShown } from "./developer-panels";
65
67
 
66
- import type { ChromeTheme } from "../shell";
67
68
  import type { ShortcutRow } from "../commands/reference";
68
69
  import type { RebindResult } from "./preferences-keymap";
69
70
  import type { AnyCommand, CommandRegistry } from "../commands/registry";
@@ -88,6 +89,7 @@ import {
88
89
  isPreferencesSection,
89
90
  PREFERENCES_SECTIONS,
90
91
  } from "./preferences-sections";
92
+ import type { CommandArgValues } from "../commands/command-args";
91
93
 
92
94
  export {
93
95
  DEFAULT_PREFERENCES_SECTION,
@@ -232,7 +234,10 @@ function selectSection(id: string): void {
232
234
  }
233
235
 
234
236
  function setTheme(value: string): void {
235
- setChromeTheme(value as ChromeTheme);
237
+ // The theme rows are drawn from CHROME_THEMES, so a picked value is always one of them.
238
+ if (isChromeTheme(value)) {
239
+ setChromeTheme(value);
240
+ }
236
241
  repaint();
237
242
  }
238
243
 
@@ -547,6 +552,7 @@ function view(): PreferencesView {
547
552
  sectionTitle: active?.title ?? "",
548
553
  sections: sectionsView(),
549
554
  themes: themesView(),
555
+ developerPanels: developerPanelsShown(),
550
556
  ...(_section === "keyboard" ? keyboardView() : KEYBOARD_IDLE),
551
557
  };
552
558
  }
@@ -609,6 +615,10 @@ export function openPreferences(section?: string): Promise<null> {
609
615
  onResetBinding: resetBinding,
610
616
  onSelectSection: selectSection,
611
617
  onSetTheme: setTheme,
618
+ onSetDeveloperPanels: (show: boolean) => {
619
+ setDeveloperPanelsShown(show);
620
+ repaint();
621
+ },
612
622
  onShowConflict: showConflict,
613
623
  onToggleKeystroke: toggleKeystroke,
614
624
  onToggleRebind: toggleRebind,
@@ -652,8 +662,8 @@ export function preferencesCommands(): AnyCommand[] {
652
662
  keybinding: "mod+,",
653
663
  menus: ["commandbar/overflow", "settings/menu", "palette"],
654
664
  group: "7_settings",
655
- run: (_ctx, args) => {
656
- const section = (args as { section?: unknown } | undefined)?.section;
665
+ run: (_ctx, args?: CommandArgValues) => {
666
+ const section = args?.section;
657
667
  if (section !== undefined && !isPreferencesSection(section)) {
658
668
  throw new RangeError(
659
669
  `command "app.preferences" argument "section": "${String(section)}" is not a ` +
@@ -661,7 +671,7 @@ export function preferencesCommands(): AnyCommand[] {
661
671
  `${PREFERENCES_SECTIONS.map((candidate) => candidate.id).join(", ")}`,
662
672
  );
663
673
  }
664
- void openPreferences(section as string | undefined);
674
+ void openPreferences(section);
665
675
  },
666
676
  title: "Preferences…",
667
677
  },
@@ -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
  }