@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
@@ -19,23 +19,16 @@
19
19
  import { reactive } from "../reactivity";
20
20
  import { mountSurface, registerSurface } from "../ui/surface";
21
21
  import deployDoc from "./settings-deploy.json";
22
- import type { JxDocument } from "@jxsuite/schema/types";
23
- import type { SurfaceHandle } from "../ui/surface";
22
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
24
23
 
25
- registerSurface("settings-deploy", deployDoc as unknown as JxDocument);
26
-
27
- /** One row of the adapter picker. */
28
- export interface DeployChoice {
29
- value: string;
30
- label: string;
31
- }
24
+ registerSurface("settings-deploy", deployDoc);
32
25
 
33
26
  /** What the section says the surface should be showing right now. */
34
27
  export interface DeployValues {
35
28
  /** The adapter the project is built with. */
36
29
  adapter: string;
37
30
  /** Every adapter it may be. */
38
- adapters: DeployChoice[];
31
+ adapters: SurfaceOption[];
39
32
  /** What the last write failed with, or `""`. */
40
33
  error: string;
41
34
  }
@@ -58,9 +51,9 @@ export interface DeploySurfaceHandle {
58
51
  * The scope the document reads. `hasError` is derived here: `$switch` is a document's only
59
52
  * conditional.
60
53
  */
61
- interface DeployScope extends Record<string, unknown> {
54
+ interface DeployScope {
62
55
  adapter: string;
63
- adapters: DeployChoice[];
56
+ adapters: SurfaceOption[];
64
57
  error: string;
65
58
  hasError: boolean;
66
59
  setAdapter: (value: string) => void;
@@ -91,13 +84,13 @@ export function mountDeploySurface(
91
84
  values: DeployValues,
92
85
  actions: DeployActions,
93
86
  ): DeploySurfaceHandle {
94
- const scope = reactive<DeployScope>({
87
+ const scope: DeployScope = reactive<DeployScope>({
95
88
  adapter: "",
96
89
  adapters: [],
97
90
  error: "",
98
91
  hasError: false,
99
92
  setAdapter: actions.setAdapter,
100
- }) as DeployScope;
93
+ });
101
94
  project(scope, values);
102
95
 
103
96
  container.replaceChildren();
@@ -125,7 +118,7 @@ export function mountDeploySurface(
125
118
  !disposed &&
126
119
  (mounted === null
127
120
  ? container.childNodes.length === 0
128
- : (mounted.root as Node).parentNode === container),
121
+ : mounted.root.parentNode === container),
129
122
  dispose() {
130
123
  disposed = true;
131
124
  mounted?.dispose();
@@ -26,10 +26,9 @@
26
26
  import { reactive } from "../reactivity";
27
27
  import { mountSurface, registerSurface } from "../ui/surface";
28
28
  import extensionsDoc from "./settings-extensions.json";
29
- import type { JxDocument } from "@jxsuite/schema/types";
30
29
  import type { SurfaceHandle } from "../ui/surface";
31
30
 
32
- registerSurface("settings-extensions", extensionsDoc as unknown as JxDocument);
31
+ registerSurface("settings-extensions", extensionsDoc);
33
32
 
34
33
  /** One `project.json` key an extension owns, as the chip repeater reads it. */
35
34
  export interface ExtensionSectionView {
@@ -117,7 +116,7 @@ export interface ExtensionsSurfaceHandle {
117
116
  * value already in the view, and a view that had to keep them in step would be a second place to
118
117
  * get it wrong.
119
118
  */
120
- interface ExtensionsScope extends Record<string, unknown>, ExtensionsView, ExtensionsActions {
119
+ interface ExtensionsScope extends ExtensionsView, ExtensionsActions {
121
120
  /** Whether to draw the groups or the sentence that says what this region is for. */
122
121
  listState: "empty" | "groups";
123
122
  hasError: boolean;
@@ -147,14 +146,14 @@ export function mountExtensionsSurface(
147
146
  view: ExtensionsView,
148
147
  actions: ExtensionsActions,
149
148
  ): ExtensionsSurfaceHandle {
150
- const scope = reactive<ExtensionsScope>({
149
+ const scope: ExtensionsScope = reactive<ExtensionsScope>({
151
150
  error: "",
152
151
  groups: [],
153
152
  hasError: false,
154
153
  listState: "empty",
155
154
  remove: actions.remove,
156
155
  toggle: actions.toggle,
157
- }) as ExtensionsScope;
156
+ });
158
157
  project(scope, view);
159
158
 
160
159
  container.replaceChildren();
@@ -182,7 +181,7 @@ export function mountExtensionsSurface(
182
181
  !disposed &&
183
182
  (mounted === null
184
183
  ? container.childNodes.length === 0
185
- : (mounted.root as Node).parentNode === container),
184
+ : mounted.root.parentNode === container),
186
185
  dispose() {
187
186
  disposed = true;
188
187
  mounted?.dispose();
@@ -18,6 +18,7 @@
18
18
  * @docs studio/projects/settings
19
19
  */
20
20
 
21
+ import { isString } from "@jxsuite/schema/guards";
21
22
  import { reactive } from "../reactivity";
22
23
  import { projectState } from "../store";
23
24
  import { updateSiteConfig } from "../site-context";
@@ -29,24 +30,15 @@ import {
29
30
  isGoogleFontEntry,
30
31
  } from "../utils/google-fonts";
31
32
  import { mountSurface, registerSurface } from "../ui/surface";
33
+ import { HEAD_EDIT_DEBOUNCE } from "../ui/timing";
32
34
  import headDoc from "./settings-head.json";
33
- import type { JxDocument, JxHeadEntry, ProjectConfig } from "@jxsuite/schema/types";
34
- import type { SurfaceHandle } from "../ui/surface";
35
+ import type { JsonValue, JxHeadEntry, ProjectConfig } from "@jxsuite/schema/types";
36
+ import type { SurfaceHandle, TaggedLabel } from "../ui/surface";
35
37
 
36
- registerSurface("settings-head", headDoc as unknown as JxDocument);
37
-
38
- /**
39
- * How long a keystroke waits before it is written.
40
- *
41
- * Every field commit is a `project.json` write, and the two body fields commit on `input` — one
42
- * write per keystroke without this. The lit editor debounced per ENTRY, with one timer shared by
43
- * that entry's fields, so editing `rel` and then `href` inside the window cancelled the first write
44
- * outright; the timers are per field here, which is why each edit lands.
45
- */
46
- const EDIT_DEBOUNCE_MS = 300;
38
+ registerSurface("settings-head", headDoc);
47
39
 
48
40
  /** One `$head` entry as the document draws it: which fields, and what is in them. */
49
- interface HeadRow extends Record<string, unknown> {
41
+ interface HeadRow {
50
42
  id: string;
51
43
  /** The tag name, drawn as `<link>` and named in the delete button. */
52
44
  tag: string;
@@ -64,18 +56,12 @@ interface HeadRow extends Record<string, unknown> {
64
56
  }
65
57
 
66
58
  /** One Google Fonts stylesheet link, by the family it loads. */
67
- interface FontRow extends Record<string, unknown> {
59
+ interface FontRow {
68
60
  id: string;
69
61
  family: string;
70
62
  }
71
63
 
72
- /** One of the four tags the section can add, and the button that adds it. */
73
- interface AddTag extends Record<string, unknown> {
74
- tag: string;
75
- label: string;
76
- }
77
-
78
- interface HeadScope extends Record<string, unknown> {
64
+ interface HeadScope {
79
65
  rows: HeadRow[];
80
66
  fonts: FontRow[];
81
67
  /**
@@ -85,7 +71,8 @@ interface HeadScope extends Record<string, unknown> {
85
71
  fontsState: "empty" | "listed";
86
72
  /** What is in the family field. The document reads it back, so clearing it is an assignment. */
87
73
  fontDraft: string;
88
- tags: AddTag[];
74
+ /** The four tags the section can add, each with the words on the button that adds it. */
75
+ tags: TaggedLabel[];
89
76
  add: (tag: string) => void;
90
77
  remove: (id: string) => void;
91
78
  edit: (id: string, key: string, value: string) => void;
@@ -94,7 +81,7 @@ interface HeadScope extends Record<string, unknown> {
94
81
  removeFont: (id: string) => void;
95
82
  }
96
83
 
97
- const ADD_TAGS: AddTag[] = [
84
+ const ADD_TAGS: TaggedLabel[] = [
98
85
  { label: "+ Link", tag: "link" },
99
86
  { label: "+ Meta", tag: "meta" },
100
87
  { label: "+ Script", tag: "script" },
@@ -137,7 +124,7 @@ let _entries: JxHeadEntry[] = [];
137
124
  * between would answer "no entries" and lose the tag that was just added.
138
125
  */
139
126
  function entries(): JxHeadEntry[] {
140
- const config = (projectState?.projectConfig ?? null) as ProjectConfig | null;
127
+ const config = projectState?.projectConfig ?? null;
141
128
  if (config !== _config) {
142
129
  _config = config;
143
130
  _entries = [];
@@ -150,7 +137,7 @@ function entries(): JxHeadEntry[] {
150
137
  }
151
138
  const declared = config?.$head;
152
139
  if (Array.isArray(declared)) {
153
- _entries = declared as JxHeadEntry[];
140
+ _entries = declared;
154
141
  }
155
142
  return _entries;
156
143
  }
@@ -161,8 +148,8 @@ function entryFor(id: string): JxHeadEntry | undefined {
161
148
  }
162
149
 
163
150
  /** A `$head` attribute as a field's text: anything that is not a string has none to show. */
164
- function text(value: unknown): string {
165
- return typeof value === "string" ? value : "";
151
+ function text(value: JsonValue | undefined): string {
152
+ return isString(value) ? value : "";
166
153
  }
167
154
 
168
155
  // ─── The projection ───────────────────────────────────────────────────────────
@@ -171,19 +158,21 @@ function text(value: unknown): string {
171
158
  function row(entry: JxHeadEntry): HeadRow {
172
159
  const attributes = entry.attributes ?? {};
173
160
  const src = text(attributes["src"]);
174
- const tag = String(entry.tagName ?? "");
175
- const kinds: Record<string, HeadRow["kind"]> = {
176
- link: "link",
177
- meta: "meta",
178
- script: src === "" ? "script-inline" : "script",
179
- style: "style",
180
- };
161
+ /* `project.json` is read off disk unvalidated, so an entry can arrive without a `tagName`; like
162
+ an attribute, a tag that is not a string has none to show. */
163
+ const tag = text(entry.tagName);
164
+ const kinds = new Map<string, HeadRow["kind"]>([
165
+ ["link", "link"],
166
+ ["meta", "meta"],
167
+ ["script", src === "" ? "script-inline" : "script"],
168
+ ["style", "style"],
169
+ ]);
181
170
  return {
182
171
  body: text(entry.textContent),
183
172
  content: text(attributes["content"]),
184
173
  href: text(attributes["href"]),
185
174
  id: idOf(entry),
186
- kind: kinds[tag] ?? "none",
175
+ kind: kinds.get(tag) ?? "none",
187
176
  name: text(attributes["name"]),
188
177
  rel: text(attributes["rel"]),
189
178
  src,
@@ -212,7 +201,12 @@ function save(): void {
212
201
  void updateSiteConfig({ $head: entries() });
213
202
  }
214
203
 
215
- /** Field edits waiting out {@link EDIT_DEBOUNCE_MS}, one per field. */
204
+ /**
205
+ * Field edits waiting out {@link HEAD_EDIT_DEBOUNCE}, one per field. The two body fields commit on
206
+ * `input`, so without the wait every keystroke would be a `project.json` write; the lit editor
207
+ * shared one timer per ENTRY, so editing `rel` and then `href` inside the window cancelled the
208
+ * first write outright.
209
+ */
216
210
  const _pending = new Map<string, { commit: () => void; timer: ReturnType<typeof setTimeout> }>();
217
211
 
218
212
  /**
@@ -302,7 +296,7 @@ function state(): HeadScope {
302
296
  _pending.delete(token);
303
297
  write(id, key, value);
304
298
  };
305
- _pending.set(token, { commit, timer: setTimeout(commit, EDIT_DEBOUNCE_MS) });
299
+ _pending.set(token, { commit, timer: setTimeout(commit, HEAD_EDIT_DEBOUNCE) });
306
300
  },
307
301
  fonts: [],
308
302
  fontDraft: "",
@@ -339,7 +333,7 @@ function state(): HeadScope {
339
333
  },
340
334
  rows: [],
341
335
  tags: ADD_TAGS,
342
- }) as HeadScope;
336
+ });
343
337
  return _scope;
344
338
  }
345
339
 
@@ -24,28 +24,16 @@
24
24
  import { reactive } from "../reactivity";
25
25
  import { mountSurface, registerSurface } from "../ui/surface";
26
26
  import localesDoc from "./settings-locales.json";
27
- import type { SurfaceHandle } from "../ui/surface";
28
- import type { JxDocument } from "@jxsuite/schema/types";
27
+ import type { SurfaceHandle, SurfaceOption, TaggedLabel } from "../ui/surface";
29
28
 
30
- registerSurface("settings-locales", localesDoc as unknown as JxDocument);
31
-
32
- /** One declared language: the tag as the author wrote it, and the name that language calls itself. */
33
- export interface LocaleRow {
34
- tag: string;
35
- label: string;
36
- }
37
-
38
- /** One row of a picker. */
39
- export interface LocaleChoice {
40
- value: string;
41
- label: string;
42
- }
29
+ registerSurface("settings-locales", localesDoc);
43
30
 
44
31
  /** What the section shows — the flow's projection of `project.json` and of the form beside it. */
45
32
  export interface LocalesView {
46
- locales: LocaleRow[];
47
- localeOptions: LocaleChoice[];
48
- routings: LocaleChoice[];
33
+ /** Each declared language: the tag as the author wrote it, and the name it calls itself. */
34
+ locales: TaggedLabel[];
35
+ localeOptions: SurfaceOption[];
36
+ routings: SurfaceOption[];
49
37
  defaultLocale: string;
50
38
  routing: string;
51
39
  /** The tag being typed, kept so an outside redraw does not take it away. */
@@ -80,7 +68,7 @@ interface LocalesFlags {
80
68
  hasError: boolean;
81
69
  }
82
70
 
83
- interface LocalesScope extends Record<string, unknown>, LocalesView, LocalesActions, LocalesFlags {}
71
+ interface LocalesScope extends LocalesView, LocalesActions, LocalesFlags {}
84
72
 
85
73
  interface Mounted {
86
74
  scope: LocalesScope;
@@ -124,7 +112,7 @@ export function renderLocalesSurface(
124
112
  }
125
113
  existing?.handle?.dispose();
126
114
  host.textContent = "";
127
- const scope = reactive({ ...derive(view), ...actions }) as LocalesScope;
115
+ const scope: LocalesScope = reactive<LocalesScope>({ ...derive(view), ...actions });
128
116
  const record: Mounted = { handle: null, scope };
129
117
  mounts.set(host, record);
130
118
  /* No race to arbitrate: a redraw arriving while this is in flight takes the branch above — a
@@ -24,10 +24,9 @@
24
24
  import { reactive } from "../reactivity";
25
25
  import { mountSurface, registerSurface } from "../ui/surface";
26
26
  import overviewDoc from "./settings-overview.json";
27
- import type { JxDocument } from "@jxsuite/schema/types";
28
27
  import type { SurfaceHandle } from "../ui/surface";
29
28
 
30
- registerSurface("settings-overview", overviewDoc as unknown as JxDocument);
29
+ registerSurface("settings-overview", overviewDoc);
31
30
 
32
31
  /** Which control a failure belongs under. `"section"` puts it at the top of the section. */
33
32
  export type OverviewErrorField = "name" | "description" | "url" | "favicon" | "section";
@@ -74,7 +73,7 @@ export interface OverviewSurfaceHandle {
74
73
  * The scope the document reads: one field per binding, because `$switch` is the only conditional a
75
74
  * document has and `error.field === "name"` is not a value it can switch on.
76
75
  */
77
- interface OverviewScope extends Record<string, unknown> {
76
+ interface OverviewScope {
78
77
  nameValue: string;
79
78
  nameError: string;
80
79
  nameInvalid: boolean;
@@ -157,7 +156,7 @@ export function mountOverviewSurface(
157
156
  values: OverviewValues,
158
157
  actions: OverviewActions,
159
158
  ): OverviewSurfaceHandle {
160
- const scope = reactive<OverviewScope>({
159
+ const scope: OverviewScope = reactive<OverviewScope>({
161
160
  descriptionError: "",
162
161
  descriptionInvalid: false,
163
162
  descriptionValue: "",
@@ -180,7 +179,7 @@ export function mountOverviewSurface(
180
179
  urlError: "",
181
180
  urlInvalid: false,
182
181
  urlValue: "",
183
- }) as OverviewScope;
182
+ });
184
183
  project(scope, values);
185
184
 
186
185
  container.replaceChildren();
@@ -208,7 +207,7 @@ export function mountOverviewSurface(
208
207
  !disposed &&
209
208
  (mounted === null
210
209
  ? container.childNodes.length === 0
211
- : (mounted.root as Node).parentNode === container),
210
+ : mounted.root.parentNode === container),
212
211
  dispose() {
213
212
  disposed = true;
214
213
  mounted?.dispose();
@@ -32,9 +32,8 @@ import { reactive } from "../reactivity";
32
32
  import { mountSurface, registerSurface } from "../ui/surface";
33
33
  import packagesDoc from "./settings-packages.json";
34
34
  import type { SurfaceHandle } from "../ui/surface";
35
- import type { JxDocument } from "@jxsuite/schema/types";
36
35
 
37
- registerSurface("settings-packages", packagesDoc as unknown as JxDocument);
36
+ registerSurface("settings-packages", packagesDoc);
38
37
 
39
38
  /** One dependency, as the table draws it. Every field is already a string the row can print. */
40
39
  export interface PackageRow {
@@ -79,7 +78,7 @@ export interface PackagesActions {
79
78
  }
80
79
 
81
80
  /** One row plus the flag its buttons switch on. */
82
- interface RowScope extends Record<string, unknown>, PackageRow {
81
+ interface RowScope extends PackageRow {
83
82
  /** Whether to draw the update button — `upgrade` said as something a `$switch` can read. */
84
83
  canUpdate: boolean;
85
84
  }
@@ -96,11 +95,13 @@ interface PackagesFlags {
96
95
  hasUpdates: boolean;
97
96
  }
98
97
 
99
- interface PackagesScope
100
- extends Record<string, unknown>, Omit<PackagesView, "rows">, PackagesActions, PackagesFlags {
98
+ /** Everything {@link derive} computes from a view: the scope minus the reader's actions. */
99
+ interface PackagesDerived extends Omit<PackagesView, "rows">, PackagesFlags {
101
100
  rows: RowScope[];
102
101
  }
103
102
 
103
+ interface PackagesScope extends PackagesDerived, PackagesActions {}
104
+
104
105
  interface Mounted {
105
106
  scope: PackagesScope;
106
107
  /** `null` while the mount is still in flight — which is a standing surface, not a missing one. */
@@ -110,7 +111,7 @@ interface Mounted {
110
111
  const mounts = new WeakMap<HTMLElement, Mounted>();
111
112
 
112
113
  /** The view plus the flags the document switches on. */
113
- function derive(view: PackagesView): Omit<PackagesScope, keyof PackagesActions> {
114
+ function derive(view: PackagesView): PackagesDerived {
114
115
  const rows = view.rows.map((row): RowScope => ({ ...row, canUpdate: row.upgrade !== "" }));
115
116
  return {
116
117
  addName: view.addName,
@@ -145,7 +146,7 @@ export function renderPackagesSurface(
145
146
  }
146
147
  existing?.handle?.dispose();
147
148
  host.textContent = "";
148
- const scope = reactive({ ...derive(view), ...actions }) as PackagesScope;
149
+ const scope: PackagesScope = reactive<PackagesScope>({ ...derive(view), ...actions });
149
150
  const record: Mounted = { handle: null, scope };
150
151
  mounts.set(host, record);
151
152
  /* No race to arbitrate: a redraw arriving while this is in flight takes the branch above — a
@@ -15,22 +15,14 @@
15
15
  * @docs studio/projects/settings
16
16
  */
17
17
 
18
+ import { isString } from "@jxsuite/schema/guards";
18
19
  import { reactive } from "../reactivity";
19
20
  import { mountSurface, registerSurface } from "../ui/surface";
20
21
  import settingsPaneDoc from "./settings-pane.json";
21
- import type { JxDocument, JxElement } from "@jxsuite/schema/types";
22
- import type { SurfaceHandle } from "../ui/surface";
22
+ import type { JxElement } from "@jxsuite/schema/types";
23
+ import type { SurfaceHandle, SurfaceTab } from "../ui/surface";
23
24
 
24
- registerSurface("settings-pane", settingsPaneDoc as unknown as JxDocument);
25
-
26
- /** One row of the section list, as the document draws it. */
27
- export interface SettingsNavView {
28
- /** The section key — the row's identity, its `value`, and what the strip compares `selected` to. */
29
- key: string;
30
- label: string;
31
- /** The row's own element id, which the one panel names as its `aria-labelledby`. */
32
- tabId: string;
33
- }
25
+ registerSurface("settings-pane", settingsPaneDoc);
34
26
 
35
27
  /** What the editor says right now. */
36
28
  export interface SettingsPaneValues {
@@ -40,7 +32,7 @@ export interface SettingsPaneValues {
40
32
  active: string;
41
33
  /** The current section's row id, so the body is named by the row that chose it. */
42
34
  activeTabId: string;
43
- sections: SettingsNavView[];
35
+ sections: SurfaceTab[];
44
36
  /**
45
37
  * Whether a renderer will draw into the island.
46
38
  *
@@ -75,13 +67,12 @@ export interface SettingsPaneHandle {
75
67
  dispose: () => void;
76
68
  }
77
69
 
78
- interface SettingsPaneScope
79
- extends Record<string, unknown>, SettingsPaneValues, SettingsPaneActions {}
70
+ interface SettingsPaneScope extends SettingsPaneValues, SettingsPaneActions {}
80
71
 
81
72
  /** The `part` a node was declared with, or the empty string. */
82
73
  function partOf(def: JxElement | string): string {
83
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
84
- return typeof part === "string" ? part : "";
74
+ const part = isString(def) ? undefined : def.attributes?.["part"];
75
+ return isString(part) ? part : "";
85
76
  }
86
77
 
87
78
  /**
@@ -101,7 +92,7 @@ export function mountSettingsPaneSurface(
101
92
  values: SettingsPaneValues,
102
93
  actions: SettingsPaneActions,
103
94
  ): SettingsPaneHandle {
104
- const scope = reactive<SettingsPaneScope>({ ...values, ...actions }) as SettingsPaneScope;
95
+ const scope: SettingsPaneScope = reactive<SettingsPaneScope>({ ...values, ...actions });
105
96
 
106
97
  container.textContent = "";
107
98
  // @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
@@ -16,10 +16,9 @@
16
16
  import { reactive } from "../reactivity";
17
17
  import { mountSurface, registerSurface } from "../ui/surface";
18
18
  import rawJsonDoc from "./settings-rawjson.json";
19
- import type { JxDocument } from "@jxsuite/schema/types";
20
19
  import type { SurfaceHandle } from "../ui/surface";
21
20
 
22
- registerSurface("settings-rawjson", rawJsonDoc as unknown as JxDocument);
21
+ registerSurface("settings-rawjson", rawJsonDoc);
23
22
 
24
23
  /** What the section says the surface should be showing right now. */
25
24
  export interface RawJsonValues {
@@ -43,7 +42,7 @@ export interface RawJsonSurfaceHandle {
43
42
  }
44
43
 
45
44
  /** The scope the document reads. */
46
- interface RawJsonScope extends Record<string, unknown> {
45
+ interface RawJsonScope {
47
46
  json: string;
48
47
  editAsCode: () => void;
49
48
  }
@@ -66,10 +65,10 @@ export function mountRawJsonSurface(
66
65
  values: RawJsonValues,
67
66
  actions: RawJsonActions,
68
67
  ): RawJsonSurfaceHandle {
69
- const scope = reactive<RawJsonScope>({
68
+ const scope: RawJsonScope = reactive<RawJsonScope>({
70
69
  editAsCode: actions.editAsCode,
71
70
  json: "",
72
- }) as RawJsonScope;
71
+ });
73
72
  project(scope, values);
74
73
 
75
74
  container.replaceChildren();
@@ -96,7 +95,7 @@ export function mountRawJsonSurface(
96
95
  !disposed &&
97
96
  (mounted === null
98
97
  ? container.childNodes.length === 0
99
- : (mounted.root as Node).parentNode === container),
98
+ : mounted.root.parentNode === container),
100
99
  dispose() {
101
100
  disposed = true;
102
101
  mounted?.dispose();
@@ -16,9 +16,8 @@
16
16
  import { mountSurface, registerSurface } from "../ui/surface";
17
17
  import shellDoc from "./shell.json";
18
18
  import type { SurfaceHandle } from "../ui/surface";
19
- import type { JxDocument } from "@jxsuite/schema/types";
20
19
 
21
- registerSurface("shell", shellDoc as unknown as JxDocument);
20
+ registerSurface("shell", shellDoc);
22
21
 
23
22
  /**
24
23
  * Render the frame into `host`, and resolve once its cells exist.
@@ -41,17 +41,16 @@ import { clearLayerSlot, getLayerSlot } from "../ui/layers";
41
41
  import { mountSurface, registerSurface } from "../ui/surface";
42
42
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
43
43
  import slashMenuDoc from "./slash-menu.json";
44
- import type { JxDocument } from "@jxsuite/schema/types";
45
44
  import type { JxScope } from "@jxsuite/runtime/types";
46
45
  import type { SurfaceHandle } from "../ui/surface";
47
46
 
48
- registerSurface("slash-menu", slashMenuDoc as unknown as JxDocument);
47
+ registerSurface("slash-menu", slashMenuDoc);
49
48
 
50
49
  /** The popover slot id; the region is `overlay.menu:slash-menu`, which is what the shots crop. */
51
50
  const SLOT = "slash-menu";
52
51
 
53
52
  /** One offer, as the document reads it. */
54
- export interface SlashMenuRow extends Record<string, unknown> {
53
+ export interface SlashMenuRow {
55
54
  /**
56
55
  * The element's tag — unique in the list, so it is the repeater's key AND the row's `value`,
57
56
  * which is what a picked row names in its `select` event.
@@ -103,7 +102,7 @@ export interface SlashMenuSurface {
103
102
  }
104
103
 
105
104
  /** The scope `slash-menu.json` reads. */
106
- interface SlashMenuScope extends Record<string, unknown> {
105
+ interface SlashMenuScope {
107
106
  x: number;
108
107
  y: number;
109
108
  showFilter: boolean;
@@ -168,7 +167,7 @@ export function openSlashMenuSurface(
168
167
  let mounted: SurfaceHandle | null = null;
169
168
  let closed = false;
170
169
 
171
- const scope = reactive<SlashMenuScope>({
170
+ const scope: SlashMenuScope = reactive<SlashMenuScope>({
172
171
  activeId: activeIdOf(view),
173
172
  expanded: view.rows.length > 0,
174
173
  filter: view.filter,
@@ -184,6 +183,9 @@ export function openSlashMenuSurface(
184
183
  one bubbling handler on the listbox replaces a closure per row, and the position the flow
185
184
  wants is resolved here against the list the panel is showing rather than baked into the
186
185
  row when it was drawn. */
186
+ /* SAFETY: `slash-menu.json` binds this handler to the listbox's `onselect` alone, and `select`
187
+ is raised by the `dispatchEvent` statement in `jx-option.json`, which the runtime always
188
+ constructs as a `CustomEvent` whose `detail` is the row's value. */
187
189
  const tag = String((event as CustomEvent<unknown>).detail);
188
190
  const index = scope.rows.findIndex((row) => row.key === tag);
189
191
  if (index !== -1) {
@@ -194,7 +196,7 @@ export function openSlashMenuSurface(
194
196
  showFilter: view.showFilter,
195
197
  x: view.x,
196
198
  y: view.y,
197
- }) as SlashMenuScope;
199
+ });
198
200
 
199
201
  const finish = (fromPlatform: boolean): void => {
200
202
  if (closed) {
@@ -210,12 +212,20 @@ export function openSlashMenuSurface(
210
212
  }
211
213
  };
212
214
 
215
+ /* Read through a call, not the property path: `close()` can abort the controller while the panel
216
+ is awaiting `jx-ready`, and a direct test after that `await` would be narrowed to the value the
217
+ test before it saw. */
218
+ const aborted = (): boolean => controller.signal.aborted;
219
+
213
220
  const ready = (async () => {
214
221
  const surface = await mountSurface("slash-menu", scope, slot, { signal: controller.signal });
215
- if (controller.signal.aborted) {
222
+ if (aborted()) {
216
223
  return;
217
224
  }
218
225
  mounted = surface;
226
+ /* SAFETY: `slash-menu.json`'s root definition carries `tagName: "jx-popover"`, so the mounted
227
+ root is the kit's popover element, which reflects `open` and inherits `showPopover` and
228
+ `hidePopover` from HTMLElement. */
219
229
  panel = surface.root as PopoverElement;
220
230
  /* The region rides on the PANEL as well as on the slot `getLayerSlot` stamped: a popover is
221
231
  `position: fixed` in the top layer, so the slot around it has a zero-height box and the
@@ -223,7 +233,7 @@ export function openSlashMenuSurface(
223
233
  takes the last match in document order, which is the panel. */
224
234
  panel.setAttribute(REGION_ATTR, overlayRegion("popover", SLOT));
225
235
  panel.addEventListener("toggle", (event) => {
226
- if ((event as { newState?: string }).newState === "closed") {
236
+ if (event.newState === "closed") {
227
237
  finish(true);
228
238
  }
229
239
  });
@@ -234,7 +244,7 @@ export function openSlashMenuSurface(
234
244
  panel!.addEventListener("jx-ready", () => resolve(), { once: true });
235
245
  });
236
246
  }
237
- if (controller.signal.aborted) {
247
+ if (aborted()) {
238
248
  return;
239
249
  }
240
250
  panel.showPopover(anchor instanceof HTMLElement ? { source: anchor } : undefined);