@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
@@ -0,0 +1,325 @@
1
+ /// <reference lib="dom" />
2
+ /**
3
+ * Add new as a mounted document.
4
+ *
5
+ * `create/add-new-flow.ts` is the flow — it holds the kind, the name and the options, reads the
6
+ * project into a `CreationContext`, lists the directories the result would write into, asks
7
+ * `deriveCreation` what that is and `creationProblem` whether it may, and performs the write — and
8
+ * this is the surface it draws into: the reactive scope the document reads, the few flags it
9
+ * branches on, and the mount that lives in the dialog layer until the flow takes it down.
10
+ *
11
+ * **The flow states facts; the surface derives the flags.** Whether the name field is drawn,
12
+ * whether the field is refused and whether the primary button can answer are each one comparison
13
+ * over the view, so they are made here rather than handed in beside the facts they restate.
14
+ *
15
+ * **Await the ELEMENT, not just the mount.** `mountSurface` resolving means the DOCUMENT rendered;
16
+ * a `jx-dialog`'s own template is one `connectedCallback` later, and `showModal` in between finds
17
+ * no `<dialog>` to open. `whenReady` is shared with `surfaces/dialog.ts` rather than
18
+ * reimplemented.
19
+ *
20
+ * @docs studio/projects/pages-layouts-components
21
+ */
22
+
23
+ import { reactive } from "../reactivity";
24
+ import { mountSurface, registerSurface } from "../ui/surface";
25
+ import { overlayRegion, REGION_ATTR } from "../ui/regions";
26
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
27
+ import { selectValue } from "@jxsuite/ui/behaviors/textfield";
28
+ import { whenReady } from "./dialog";
29
+ import addNewDoc from "./add-new.json";
30
+ import type { CreationKind } from "../create/add-new";
31
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
32
+
33
+ registerSurface("add-new", addNewDoc);
34
+
35
+ /** One kind in the left-hand list. */
36
+ export interface AddNewKindRow {
37
+ id: CreationKind;
38
+ label: string;
39
+ hint: string;
40
+ icon: string;
41
+ /** `"true"` for the chosen kind: the row is one radio of a radiogroup. */
42
+ checked: "true" | "false";
43
+ }
44
+
45
+ /** One card in a Start from / Wrap it in radiogroup. */
46
+ export interface AddNewChoiceRow {
47
+ value: string;
48
+ label: string;
49
+ /** The muted second line: "header + footer", "mostly writing", "2 elements". */
50
+ note: string;
51
+ checked: "true" | "false";
52
+ /** A choice that cannot be made now stays in the group, disabled, with `reason` as its tip. */
53
+ disabled: boolean;
54
+ reason: string;
55
+ }
56
+
57
+ /** One field preset chip. */
58
+ export interface AddNewPresetRow {
59
+ id: string;
60
+ label: string;
61
+ selected: boolean;
62
+ icon: string;
63
+ }
64
+
65
+ /** What the flow knows. Every one of these may change while the dialog is up. */
66
+ export interface AddNewView {
67
+ kind: CreationKind;
68
+ kinds: AddNewKindRow[];
69
+ /** The chosen kind's label, which names the detail region. */
70
+ kindLabel: string;
71
+ /** The sentence that introduces the chosen kind. */
72
+ kindHint: string;
73
+ /** Where the dialog can be opened from, said once at the foot of the list. */
74
+ chordNote: string;
75
+ nameLabel: string;
76
+ name: string;
77
+ placeholder: string;
78
+ /** The refusal under the name field; `""` until the reader has typed, and when there is none. */
79
+ error: string;
80
+ /** The derived result: "Saved as pages/pricing.json · opens at /pricing". */
81
+ saved: string;
82
+ /** The primary button's words. */
83
+ cta: string;
84
+ /** Whether the primary button can answer now. */
85
+ canConfirm: boolean;
86
+
87
+ // ── language (page, entry, collection) ────────────────────────────────────
88
+ /** Whether the Language picker is drawn: a page, or an entry of a localized collection. */
89
+ localeShown: boolean;
90
+ localeOptions: SurfaceOption[];
91
+ /** The chosen language, a declared tag. */
92
+ locale: string;
93
+ /** Whether the project declares languages, which is when a collection can be localized. */
94
+ localizable: boolean;
95
+ /** Collection: one folder per language. */
96
+ localized: boolean;
97
+ /** The declared tags, said on the collection's checkbox: "en, fr-CA, ar". */
98
+ localeSummary: string;
99
+
100
+ // ── page ──────────────────────────────────────────────────────────────────
101
+ route: string;
102
+ editingUrl: boolean;
103
+ url: string;
104
+ startChoices: AddNewChoiceRow[];
105
+
106
+ // ── collection ────────────────────────────────────────────────────────────
107
+ itemNoun: string;
108
+ presets: AddNewPresetRow[];
109
+ ownPage: boolean;
110
+ pattern: string;
111
+ templateOptions: SurfaceOption[];
112
+ pageTemplate: string;
113
+
114
+ // ── template ──────────────────────────────────────────────────────────────
115
+ wrapChoices: AddNewChoiceRow[];
116
+
117
+ // ── component ─────────────────────────────────────────────────────────────
118
+ componentChoices: AddNewChoiceRow[];
119
+ copying: boolean;
120
+ copyOptions: SurfaceOption[];
121
+ copyOf: string;
122
+
123
+ // ── entry ─────────────────────────────────────────────────────────────────
124
+ collectionOptions: SurfaceOption[];
125
+ collection: string;
126
+
127
+ // ── media ─────────────────────────────────────────────────────────────────
128
+ dropActive: "true" | "false";
129
+ uploadAccept: string;
130
+ fileSummary: string;
131
+ }
132
+
133
+ /** What the document can tell the flow. */
134
+ export interface AddNewActions {
135
+ pickKind: (kind: CreationKind) => void;
136
+ setName: (value: string) => void;
137
+ /** The primary button, or Enter in a field. The flow decides whether that creates anything. */
138
+ confirm: () => void;
139
+ toggleUrl: () => void;
140
+ setUrl: (value: string) => void;
141
+ pickStart: (value: string) => void;
142
+ togglePreset: (id: string) => void;
143
+ setOwnPage: (checked: boolean) => void;
144
+ pickPageTemplate: (value: string) => void;
145
+ pickWrap: (value: string) => void;
146
+ pickComponentStart: (value: string) => void;
147
+ pickCopy: (value: string) => void;
148
+ pickCollection: (value: string) => void;
149
+ pickLocale: (value: string) => void;
150
+ setLocalized: (checked: boolean) => void;
151
+ /**
152
+ * The file picker settled. The ELEMENT rather than its list, because a file input that is not
153
+ * cleared refuses the same file twice, and the input is this document's own control.
154
+ */
155
+ choose: (input: HTMLInputElement) => void;
156
+ drop: (files: FileList | null) => void;
157
+ dragOver: () => void;
158
+ dragOut: () => void;
159
+ /** The dialog closed, for any reason the platform owns as well as the flow's own `close`. */
160
+ closed: () => void;
161
+ }
162
+
163
+ export interface AddNewSurfaceOptions {
164
+ /** Where the dialog is mounted — the dialog layer, handed in so this module never reaches back. */
165
+ layer: HTMLElement;
166
+ view: AddNewView;
167
+ actions: AddNewActions;
168
+ }
169
+
170
+ export interface AddNewSurfaceHandle {
171
+ host: HTMLElement;
172
+ /** Resolves with the `jx-dialog` element once it has rendered and been opened. */
173
+ ready: Promise<HTMLElement>;
174
+ /** Redraw from the flow's current view. */
175
+ update: (view: AddNewView) => void;
176
+ /** Close the dialog (the platform restores focus) and dispose the document. Idempotent. */
177
+ close: () => void;
178
+ }
179
+
180
+ /** What the document branches on. Derived, never handed in. */
181
+ interface AddNewFlags {
182
+ /** Every kind but Media has a name. */
183
+ named: boolean;
184
+ invalid: boolean;
185
+ blocked: boolean;
186
+ }
187
+
188
+ type AddNewScope = AddNewView &
189
+ AddNewFlags &
190
+ Omit<AddNewActions, "setName" | "closed"> & {
191
+ setName: (value: string) => void;
192
+ closed: () => void;
193
+ };
194
+
195
+ /** The view plus the flags the document renders from. */
196
+ function derive(view: AddNewView): AddNewView & AddNewFlags {
197
+ return {
198
+ ...view,
199
+ blocked: !view.canConfirm,
200
+ invalid: view.error !== "",
201
+ named: view.kind !== "media",
202
+ };
203
+ }
204
+
205
+ /** Open the dialog. The handle's `ready` resolves once it is showing. */
206
+ export function openAddNewSurface(options: AddNewSurfaceOptions): AddNewSurfaceHandle {
207
+ const slot = document.createElement("div");
208
+ /* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
209
+ slot in it turns them back on for its own content. `pointer-events` INHERITS, and the top layer
210
+ changes paint order rather than inheritance, so a modal `<dialog>` in a slot that skipped this
211
+ is painted above everything and hit-tests to nothing. */
212
+ slot.style.pointerEvents = "auto";
213
+ slot.setAttribute(REGION_ATTR, overlayRegion("dialog", "add-new"));
214
+ options.layer.append(slot);
215
+
216
+ let closed = false;
217
+ /** Say it is over, once: the platform's own `close` and `close()` may each be first. */
218
+ const finish = (): void => {
219
+ if (closed) {
220
+ return;
221
+ }
222
+ closed = true;
223
+ options.actions.closed();
224
+ };
225
+ const isClosed = (): boolean => closed;
226
+
227
+ const { actions } = options;
228
+ const scope: AddNewScope = reactive<AddNewScope>({
229
+ ...derive(options.view),
230
+ choose: actions.choose,
231
+ closed: finish,
232
+ confirm: actions.confirm,
233
+ dragOut: actions.dragOut,
234
+ dragOver: actions.dragOver,
235
+ drop: actions.drop,
236
+ pickCollection: actions.pickCollection,
237
+ pickComponentStart: actions.pickComponentStart,
238
+ pickCopy: actions.pickCopy,
239
+ pickKind: actions.pickKind,
240
+ pickLocale: actions.pickLocale,
241
+ pickPageTemplate: actions.pickPageTemplate,
242
+ pickStart: actions.pickStart,
243
+ pickWrap: actions.pickWrap,
244
+ setName: (value: string) => {
245
+ /* What the control holds, first and unconditionally. A binding only writes when the scope
246
+ CHANGES, so a surface that did not echo the raw value would leave the field showing text
247
+ the scope does not have (`studio-ui-guidelines.md` §9.3). */
248
+ scope.name = value;
249
+ actions.setName(value);
250
+ },
251
+ setLocalized: actions.setLocalized,
252
+ setOwnPage: actions.setOwnPage,
253
+ setUrl: (value: string) => {
254
+ scope.url = value;
255
+ actions.setUrl(value);
256
+ },
257
+ toggleUrl: actions.toggleUrl,
258
+ togglePreset: actions.togglePreset,
259
+ });
260
+
261
+ let mounted: SurfaceHandle | null = null;
262
+
263
+ /**
264
+ * Put the caret in the name field, selected.
265
+ *
266
+ * On open only: the name is the only thing the dialog requires, so it is where the reader is
267
+ * about to type. A focus move is the one thing a surface may reach into its document for (`ui.md`
268
+ * §2 rule 5).
269
+ */
270
+ const focusName = (): void => {
271
+ setTimeout(() => {
272
+ const root = mounted?.root;
273
+ if (closed || !(root instanceof HTMLElement)) {
274
+ return;
275
+ }
276
+ const control = root.querySelector<HTMLElement>('jx-textfield[part="name"]');
277
+ if (control) {
278
+ selectValue(control, "all");
279
+ }
280
+ }, 0);
281
+ };
282
+
283
+ const ready = mountSurface("add-new", scope, slot).then(async (surface) => {
284
+ mounted = surface;
285
+ /* SAFETY: `add-new.json`'s root definition is a `jx-dialog` element, so the runtime mounts an
286
+ HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
287
+ const element = surface.root as HTMLElement;
288
+ if (isClosed()) {
289
+ surface.dispose();
290
+ return element;
291
+ }
292
+ await whenReady(element);
293
+ if (isClosed()) {
294
+ return element;
295
+ }
296
+ showModal(element);
297
+ if (scope.named) {
298
+ focusName();
299
+ }
300
+ return element;
301
+ });
302
+
303
+ return {
304
+ close() {
305
+ /* Idempotent line by line rather than guarded on `closed`: the platform's own `close` runs
306
+ `finish()` first, and a guard would leave this slot behind in the layer. */
307
+ const element = mounted?.root;
308
+ if (element instanceof HTMLElement) {
309
+ close(element);
310
+ }
311
+ mounted?.dispose();
312
+ mounted = null;
313
+ slot.remove();
314
+ finish();
315
+ },
316
+ host: slot,
317
+ ready,
318
+ update(view) {
319
+ /* Never a focus move here. A kind switch from the keyboard is an arrow key inside the kinds
320
+ radiogroup, and pulling the caret into the name field would end the walk after one step;
321
+ the name keeps its value across kinds and Tab reaches it next. */
322
+ Object.assign(scope, derive(view));
323
+ },
324
+ };
325
+ }
@@ -31,14 +31,13 @@
31
31
  import { reactive } from "../reactivity";
32
32
  import { mountSurface, registerSurface } from "../ui/surface";
33
33
  import { overlayRegion, REGION_ATTR } from "../ui/regions";
34
- import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
34
+ import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
35
35
  import { focusField } from "@jxsuite/ui/behaviors/textfield";
36
36
  import { whenReady } from "./dialog";
37
37
  import addRepoDoc from "./add-repo.json";
38
- import type { SurfaceHandle } from "../ui/surface";
39
- import type { JxDocument } from "@jxsuite/schema/types";
38
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
40
39
 
41
- registerSurface("add-repo", addRepoDoc as unknown as JxDocument);
40
+ registerSurface("add-repo", addRepoDoc);
42
41
 
43
42
  /** One repository, as the list draws it. Every field is already a string or a flag. */
44
43
  export interface AddRepoRow {
@@ -68,12 +67,6 @@ export interface AddRepoAccessLink {
68
67
  title: string;
69
68
  }
70
69
 
71
- /** One entry of the account filter. `""` is every account. */
72
- export interface AddRepoOwner {
73
- value: string;
74
- label: string;
75
- }
76
-
77
70
  /**
78
71
  * Why the repository list is empty, when it is.
79
72
  *
@@ -105,7 +98,7 @@ export interface AddRepoView {
105
98
  /** The account the list is narrowed to; `""` is every account. */
106
99
  owner: string;
107
100
  /** The account filter's entries, "All accounts" first; empty hides it (one account, or none). */
108
- owners: AddRepoOwner[];
101
+ owners: SurfaceOption[];
109
102
  /** The listing is in flight. Its own state, because "not yet asked" is not "reaches nothing". */
110
103
  loading: boolean;
111
104
  /** The repositories to draw, already filtered and ordered. */
@@ -226,8 +219,7 @@ interface AddRepoFlags {
226
219
  confirmDisabled: boolean;
227
220
  }
228
221
 
229
- interface AddRepoScope
230
- extends Record<string, unknown>, Omit<AddRepoView, "rows" | "locations">, AddRepoFlags {
222
+ interface AddRepoScope extends Omit<AddRepoView, "rows" | "locations">, AddRepoFlags {
231
223
  setFilter: (value: string) => void;
232
224
  setOwner: (value: string) => void;
233
225
  select: (fullName: string) => void;
@@ -277,7 +269,7 @@ function derive(view: AddRepoView): Omit<AddRepoView, "rows" | "locations"> & Ad
277
269
  ? "loading"
278
270
  : rows.length > 0
279
271
  ? "listed"
280
- : (`empty-${view.emptyState}` as AddRepoFlags["listState"]),
272
+ : (`empty-${view.emptyState}` as const),
281
273
  locations,
282
274
  refreshDisabled: view.loading || view.busy,
283
275
  rows,
@@ -309,8 +301,12 @@ export function openAddRepoSurface(options: AddRepoSurfaceOptions): AddRepoSurfa
309
301
  closed = true;
310
302
  options.onClosed();
311
303
  };
304
+ /* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
305
+ element, and a direct `closed` test after that `await` would be narrowed to the value the test
306
+ before it saw. */
307
+ const isClosed = (): boolean => closed;
312
308
 
313
- const scope = reactive({
309
+ const scope: AddRepoScope = reactive<AddRepoScope>({
314
310
  ...derive(options.view),
315
311
  closed: finish,
316
312
  confirm: () => {
@@ -350,18 +346,20 @@ export function openAddRepoSurface(options: AddRepoSurfaceOptions): AddRepoSurfa
350
346
  scope.owner = value;
351
347
  options.onOwner(value);
352
348
  },
353
- }) as AddRepoScope;
349
+ });
354
350
 
355
351
  let mounted: SurfaceHandle | null = null;
356
352
  const ready = mountSurface("add-repo", scope, slot).then(async (surface) => {
357
353
  mounted = surface;
354
+ // SAFETY: `add-repo.json`'s root definition carries `tagName: "jx-dialog"`, so the runtime mounts an
355
+ // HTMLElement; a `Text` root only comes from a document whose root is a bare string.
358
356
  const element = surface.root as HTMLElement;
359
- if (closed) {
357
+ if (isClosed()) {
360
358
  surface.dispose();
361
359
  return element;
362
360
  }
363
361
  await whenReady(element);
364
- if (closed) {
362
+ if (isClosed()) {
365
363
  return element;
366
364
  }
367
365
  showModal(element);
@@ -384,7 +382,7 @@ export function openAddRepoSurface(options: AddRepoSurfaceOptions): AddRepoSurfa
384
382
  const element = mounted?.root;
385
383
  if (element instanceof HTMLElement) {
386
384
  // The platform's close first, so focus goes back where it came from; then the document.
387
- closeDialog(element);
385
+ close(element);
388
386
  }
389
387
  // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
390
388
  mounted?.dispose();
@@ -27,15 +27,16 @@
27
27
  * @docs studio/ai/chat
28
28
  */
29
29
 
30
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
30
31
  import { reactive } from "../reactivity";
31
32
  import { trustedHtml } from "../services/trusted-types";
32
33
  import { mountSurface, registerSurface } from "../ui/surface";
33
34
  import aiChatDoc from "./ai-chat.json";
34
- import type { JxElement, JxDocument } from "@jxsuite/schema/types";
35
+ import type { JsonObject, JxElement } from "@jxsuite/schema/types";
35
36
  import type { JxScope } from "@jxsuite/runtime/types";
36
- import type { SurfaceHandle } from "../ui/surface";
37
+ import type { KeyedLabel, SurfaceHandle } from "../ui/surface";
37
38
 
38
- registerSurface("ai-chat", aiChatDoc as unknown as JxDocument);
39
+ registerSurface("ai-chat", aiChatDoc);
39
40
 
40
41
  /** How close (px) to the bottom of a scroller still counts as "following along". */
41
42
  const STICK_THRESHOLD = 48;
@@ -51,7 +52,7 @@ const LOG_STICK_THRESHOLD = 24;
51
52
  * rendering of the registry rather than a second place its capabilities are decided
52
53
  * (`studio-ui-guidelines.md` §12.5).
53
54
  */
54
- export interface ChatCommandView extends Record<string, unknown> {
55
+ export interface ChatCommandView {
55
56
  /** The reconcile key. The command id, because a button is drawn once per bar. */
56
57
  key: string;
57
58
  /** What `run` is given. */
@@ -68,14 +69,8 @@ export interface ChatCommandView extends Record<string, unknown> {
68
69
  disabled: boolean;
69
70
  }
70
71
 
71
- /** One answer an `ask_user` card offers as a shortcut. */
72
- export interface ChatAskOption extends Record<string, unknown> {
73
- key: string;
74
- label: string;
75
- }
76
-
77
72
  /** One line an import run has reported. */
78
- export interface ChatLogLine extends Record<string, unknown> {
73
+ export interface ChatLogLine {
79
74
  key: string;
80
75
  phase: string;
81
76
  message: string;
@@ -88,7 +83,7 @@ export interface ChatLogLine extends Record<string, unknown> {
88
83
  * `$switch` chooses on one: a chip that omitted `options` would leave the question case reading an
89
84
  * absent path.
90
85
  */
91
- export interface ChatChipView extends Record<string, unknown> {
86
+ export interface ChatChipView {
92
87
  /** The tool-call id — the reconcile key. */
93
88
  key: string;
94
89
  /** The tool's name, for a test and for the `data-tool` attribute. */
@@ -114,7 +109,8 @@ export interface ChatChipView extends Record<string, unknown> {
114
109
  hasContext: boolean;
115
110
  /** `pending`, `unanswered`, `answered`, `failed` or `none` — which half of the card to draw. */
116
111
  askState: string;
117
- options: ChatAskOption[];
112
+ /** The answers an `ask_user` card offers as shortcuts. */
113
+ options: KeyedLabel[];
118
114
  /** What the reader replied, once they have. */
119
115
  answer: string;
120
116
  /** `run` when this call has an import to report, `none` otherwise. */
@@ -133,7 +129,7 @@ export interface ChatChipView extends Record<string, unknown> {
133
129
  }
134
130
 
135
131
  /** One file a turn changed. */
136
- export interface ChatChangeView extends Record<string, unknown> {
132
+ export interface ChatChangeView {
137
133
  key: string;
138
134
  path: string;
139
135
  /** The tool that wrote it, or the sentence saying why it did not. */
@@ -143,14 +139,8 @@ export interface ChatChangeView extends Record<string, unknown> {
143
139
  disk: boolean;
144
140
  }
145
141
 
146
- /** One attached-context chip on a user turn. */
147
- export interface ChatContextChip extends Record<string, unknown> {
148
- key: string;
149
- label: string;
150
- }
151
-
152
142
  /** One line of the transcript. */
153
- export interface ChatRowView extends Record<string, unknown> {
143
+ export interface ChatRowView {
154
144
  /** The message id. The `$map` key, and what `restore` is given. */
155
145
  key: string;
156
146
  /** `user`, `assistant`, `streaming`, `typing` or `tool-error`. */
@@ -159,7 +149,8 @@ export interface ChatRowView extends Record<string, unknown> {
159
149
  body: string;
160
150
  /** Sanitized model output for an `assistant` row. Filled into the island, never bound. */
161
151
  markdown: string;
162
- contextChips: ChatContextChip[];
152
+ /** The attached-context chips on a user turn. */
153
+ contextChips: KeyedLabel[];
163
154
  hasContextChips: boolean;
164
155
  chips: ChatChipView[];
165
156
  hasChips: boolean;
@@ -172,7 +163,7 @@ export interface ChatRowView extends Record<string, unknown> {
172
163
  }
173
164
 
174
165
  /** One row of the chat history. */
175
- export interface ChatSessionView extends Record<string, unknown> {
166
+ export interface ChatSessionView {
176
167
  /** The session id — the key, and what a row opens or deletes. */
177
168
  key: string;
178
169
  title: string;
@@ -181,7 +172,7 @@ export interface ChatSessionView extends Record<string, unknown> {
181
172
  }
182
173
 
183
174
  /** One chip the composer is carrying. */
184
- export interface ChatComposerChip extends Record<string, unknown> {
175
+ export interface ChatComposerChip {
185
176
  /** The chip's kind — one chip per kind, so the kind IS the identity. */
186
177
  key: string;
187
178
  label: string;
@@ -277,7 +268,7 @@ export interface AiChatSurface {
277
268
  }
278
269
 
279
270
  /** The scope the document reads: the view, the flow's actions, and the scroller's own handler. */
280
- interface AiChatScope extends Record<string, unknown>, AiChatView, AiChatActions {
271
+ interface AiChatScope extends AiChatView, AiChatActions {
281
272
  scrolled: () => void;
282
273
  }
283
274
 
@@ -353,21 +344,21 @@ export function emptyAiChatView(): AiChatView {
353
344
 
354
345
  /** The `part` a node's definition carries, or "" for a text node or an unmarked element. */
355
346
  function partOf(def: JxElement | string): string {
356
- const part = typeof def === "string" ? undefined : def.attributes?.["part"];
357
- return typeof part === "string" ? part : "";
347
+ const part = isString(def) ? undefined : def.attributes?.["part"];
348
+ return isString(part) ? part : "";
358
349
  }
359
350
 
360
351
  /** The `$map` item a node was rendered inside, if it was rendered inside one. */
361
- function mapItem(state: JxScope | undefined): Record<string, unknown> | null {
362
- const map = state?.["$map"] as { item?: unknown } | undefined;
363
- const item = map?.item;
364
- return item !== null && typeof item === "object" ? (item as Record<string, unknown>) : null;
352
+ function mapItem(state: JxScope | undefined): JsonObject | null {
353
+ const map = state?.["$map"];
354
+ const item = isJsonObject(map) ? map["item"] : undefined;
355
+ return isJsonObject(item) ? item : null;
365
356
  }
366
357
 
367
358
  /** A string field off a `$map` item, or "". */
368
- function itemString(item: Record<string, unknown> | null, field: string): string {
359
+ function itemString(item: JsonObject | null, field: string): string {
369
360
  const value = item?.[field];
370
- return typeof value === "string" ? value : "";
361
+ return isString(value) ? value : "";
371
362
  }
372
363
 
373
364
  /** Keep a scroller pinned to its newest line, unless the reader has scrolled away from it. */
@@ -406,7 +397,7 @@ export function mountAiChatSurface(
406
397
  /** The import logs, by chip key. */
407
398
  const logs = new Map<string, HTMLElement>();
408
399
 
409
- const scope = reactive<AiChatScope>({
400
+ const scope: AiChatScope = reactive<AiChatScope>({
410
401
  ...emptyAiChatView(),
411
402
  ...actions,
412
403
  scrolled: () => {
@@ -416,7 +407,7 @@ export function mountAiChatSurface(
416
407
  STICK_THRESHOLD;
417
408
  }
418
409
  },
419
- }) as AiChatScope;
410
+ });
420
411
  project(scope, view);
421
412
 
422
413
  /**
@@ -451,7 +442,11 @@ export function mountAiChatSurface(
451
442
  * value assigned here is a `TrustedHTML`; without one the same assertion has still run.
452
443
  */
453
444
  function fillIsland(node: HTMLElement, html: string): void {
454
- (node as unknown as { innerHTML: unknown }).innerHTML = trustedHtml(html);
445
+ /* SAFETY: lib.dom declares `innerHTML` as `string`, but the setter's IDL type is
446
+ `(TrustedHTML or DOMString)`, and `trustedHtml` returns one of exactly those two: the policy's
447
+ `TrustedHTML`, or the asserted string where the API is absent. Widening the property to what
448
+ the sink accepts is an upcast of this HTMLElement, so the write reaches the same setter. */
449
+ (node as { innerHTML: unknown }).innerHTML = trustedHtml(html);
455
450
  }
456
451
 
457
452
  let mounted: SurfaceHandle | null = null;
@@ -519,8 +514,8 @@ export function mountAiChatSurface(
519
514
  }
520
515
  }
521
516
 
522
- /* There is no `connected()` here, where `doc-header.ts` and `panel-stylebook-layers.ts` both
523
- have one. Those two mount into a node LIT repaints, so "is my root still where I put it" is a
517
+ /* There is no `connected()` here, where `panel-stylebook-layers.ts` has one. That one mounts
518
+ into a node LIT repaints, so "is my root still where I put it" is a
524
519
  live question. The assistant's container is built once for the life of the window
525
520
  (`right-panel.ts`'s `_ensureContainers`) and nothing else ever writes into it, so the answer
526
521
  would be a constant — and a constant nobody reads is a second thing to keep in step. */
@@ -29,18 +29,9 @@
29
29
  import { reactive } from "../reactivity";
30
30
  import { mountSurface, registerSurface } from "../ui/surface";
31
31
  import credentialsDoc from "./ai-credentials-form.json";
32
- import type { SurfaceHandle } from "../ui/surface";
33
- import type { JxDocument } from "@jxsuite/schema/types";
32
+ import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
34
33
 
35
- registerSurface("ai-credentials-form", credentialsDoc as unknown as JxDocument);
36
-
37
- /** One row of the listed catalogue, as the combobox draws it. */
38
- export interface CredentialsModelRow {
39
- /** The model id — the row's key, and what a pick writes into the model draft. */
40
- value: string;
41
- /** What the row reads. */
42
- label: string;
43
- }
34
+ registerSurface("ai-credentials-form", credentialsDoc);
44
35
 
45
36
  /** What the form says right now. Every field is the flow's, never a state it derives. */
46
37
  export interface AiCredentialsView {
@@ -51,7 +42,7 @@ export interface AiCredentialsView {
51
42
  modelDraft: string;
52
43
  baseUrlDraft: string;
53
44
  /** The catalogue the last successful listing returned; empty draws no chevron on the field. */
54
- models: CredentialsModelRow[];
45
+ models: SurfaceOption[];
55
46
  /** A listing is in flight: the button says so and refuses a second one. */
56
47
  modelsLoading: boolean;
57
48
  /** What the fetch button reads — including while it is working, and once a list has landed. */
@@ -88,11 +79,10 @@ interface AiCredentialsFlags {
88
79
  /** Whether there is a refusal to draw beside the fetch button. */
89
80
  hasError: boolean;
90
81
  /** The catalogue as the kit's combobox draws it — the list, never a corpus it matches against. */
91
- modelOptions: CredentialsModelRow[];
82
+ modelOptions: SurfaceOption[];
92
83
  }
93
84
 
94
- interface AiCredentialsScope
95
- extends Record<string, unknown>, AiCredentialsView, AiCredentialsActions, AiCredentialsFlags {}
85
+ interface AiCredentialsScope extends AiCredentialsView, AiCredentialsActions, AiCredentialsFlags {}
96
86
 
97
87
  /** The view plus the flags the document renders from. */
98
88
  function derive(view: AiCredentialsView): AiCredentialsView & AiCredentialsFlags {
@@ -119,7 +109,7 @@ export function createAiCredentialsSurface(
119
109
  ): AiCredentialsSurface {
120
110
  const host = document.createElement("div");
121
111
  host.style.display = "contents";
122
- const scope = reactive({ ...derive(view), ...actions }) as AiCredentialsScope;
112
+ const scope: AiCredentialsScope = reactive<AiCredentialsScope>({ ...derive(view), ...actions });
123
113
 
124
114
  /** `null` while a mount is in flight — which is a standing surface, not a missing one. */
125
115
  let handle: SurfaceHandle | null = null;