@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
@@ -9,9 +9,17 @@
9
9
  * deletion. The server is authoritative — there are no file fingerprints; conflicts surface as
10
10
  * per-row API errors.
11
11
  */
12
+ import { isJsonPrimitive, isNumber, isString } from "@jxsuite/schema/guards";
13
+ import type { JsonObject, JsonValue } from "@jxsuite/schema/types";
12
14
  import { deleteRow, fetchRows, insertRow, updateRow } from "../../services/data-service";
13
15
  import { makeGridTabId } from "../grid-source";
14
- import type { DataColumnMeta, DataRowsQuery } from "../../types";
16
+ import type {
17
+ DataColumnMeta,
18
+ DataRowDelete,
19
+ DataRowInsert,
20
+ DataRowUpdate,
21
+ DataRowsQuery,
22
+ } from "../../types";
15
23
  import type {
16
24
  CommitResult,
17
25
  GridCellValue,
@@ -48,11 +56,11 @@ function editableColumn(column: DataColumnMeta): boolean {
48
56
  }
49
57
 
50
58
  /** DB value → grid cell value (JSON-ish values surface as text). */
51
- function toCellValue(value: unknown): GridCellValue {
52
- if (value === null || value === undefined) {
59
+ function toCellValue(value: JsonValue | undefined): GridCellValue {
60
+ if (value === undefined) {
53
61
  return null;
54
62
  }
55
- if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
63
+ if (isJsonPrimitive(value)) {
56
64
  return value;
57
65
  }
58
66
  return JSON.stringify(value);
@@ -72,17 +80,23 @@ export function createConnectorSource(connection: string | undefined, table: str
72
80
  }
73
81
  };
74
82
 
75
- const toQuery = (query?: GridQuery): DataRowsQuery => ({
76
- table,
77
- ...(connection ? { connection } : {}),
78
- limit: query?.limit ?? DATA_PAGE_SIZE,
79
- offset: query?.offset ?? 0,
80
- ...(query?.orderBy ? { dir: query.dir ?? "asc", orderBy: query.orderBy } : {}),
81
- });
83
+ const toQuery = (query?: GridQuery): DataRowsQuery => {
84
+ const rowsQuery: DataRowsQuery = { table };
85
+ if (connection) {
86
+ rowsQuery.connection = connection;
87
+ }
88
+ rowsQuery.limit = query?.limit ?? DATA_PAGE_SIZE;
89
+ rowsQuery.offset = query?.offset ?? 0;
90
+ if (query?.orderBy) {
91
+ rowsQuery.dir = query.dir ?? "asc";
92
+ rowsQuery.orderBy = query.orderBy;
93
+ }
94
+ return rowsQuery;
95
+ };
82
96
 
83
- const rowKeyOf = (row: Record<string, unknown>, index: number): string => {
97
+ const rowKeyOf = (row: JsonObject, index: number): string => {
84
98
  const pk = row[pkName];
85
- if (typeof pk === "string" || typeof pk === "number") {
99
+ if (isString(pk) || isNumber(pk)) {
86
100
  pkValues.set(String(pk), pk);
87
101
  return String(pk);
88
102
  }
@@ -132,11 +146,15 @@ export function createConnectorSource(connection: string | undefined, table: str
132
146
  continue;
133
147
  }
134
148
  try {
135
- const set: Record<string, unknown> = {};
149
+ const set: JsonObject = {};
136
150
  for (const patch of patches) {
137
151
  set[patch.field] = patch.value;
138
152
  }
139
- await updateRow({ pk, set, table, ...(connection ? { connection } : {}) });
153
+ const update: DataRowUpdate = { pk, set, table };
154
+ if (connection) {
155
+ update.connection = connection;
156
+ }
157
+ await updateRow(update);
140
158
  outcome(true);
141
159
  } catch (error) {
142
160
  outcome(false, error instanceof Error ? error.message : String(error));
@@ -145,16 +163,21 @@ export function createConnectorSource(connection: string | undefined, table: str
145
163
 
146
164
  for (const insert of batch.inserts) {
147
165
  try {
148
- const values: Record<string, unknown> = {};
166
+ const values: JsonObject = {};
149
167
  for (const [field, value] of Object.entries(insert.cells)) {
150
168
  if (value !== null) {
151
169
  values[field] = value;
152
170
  }
153
171
  }
154
- const { row } = await insertRow({ table, values, ...(connection ? { connection } : {}) });
172
+ const request: DataRowInsert = { table, values };
173
+ if (connection) {
174
+ request.connection = connection;
175
+ }
176
+ const { row } = await insertRow(request);
155
177
  const pk = row[pkName];
156
- const newKey = typeof pk === "string" || typeof pk === "number" ? String(pk) : undefined;
157
- if (newKey !== undefined && (typeof pk === "string" || typeof pk === "number")) {
178
+ let newKey: string | undefined;
179
+ if (isString(pk) || isNumber(pk)) {
180
+ newKey = String(pk);
158
181
  pkValues.set(newKey, pk);
159
182
  }
160
183
  result.inserts.push({ newKey, ok: true, tempKey: insert.tempKey });
@@ -178,7 +201,11 @@ export function createConnectorSource(connection: string | undefined, table: str
178
201
  continue;
179
202
  }
180
203
  try {
181
- await deleteRow({ pk, table, ...(connection ? { connection } : {}) });
204
+ const request: DataRowDelete = { pk, table };
205
+ if (connection) {
206
+ request.connection = connection;
207
+ }
208
+ await deleteRow(request);
182
209
  result.deletes.push({ ok: true, rowKey: del.rowKey });
183
210
  } catch (error) {
184
211
  result.deletes.push({
@@ -39,6 +39,10 @@ import {
39
39
  loadFormats,
40
40
  } from "../../format/format-host";
41
41
  import { parseSourceForPath } from "../../files/file-ops";
42
+ import { collectionForDirectory } from "../../content/collection-match";
43
+ import { collectionSourceFile } from "../../content/content-collections";
44
+ import { fileRecordIds as recordIdsOf } from "../../content/file-record-ids";
45
+ import { LOCALE_PLACEHOLDER } from "../../canvas/asset-resolve";
42
46
  import { columnsFromSchema, inferColumnsFromRows } from "../schema-columns";
43
47
  import { makeGridTabId } from "../grid-source";
44
48
  import type {
@@ -51,13 +55,16 @@ import type {
51
55
  GridSource,
52
56
  } from "../grid-source";
53
57
  import type { ContentSectionEntry } from "../../types";
58
+ import type { EntryFields } from "../../content/entry-fields";
59
+ import type { JxDocumentValue, JxMutableNode } from "@jxsuite/schema/types";
60
+ import { isJsonPrimitive, isNonNullObject, isString } from "@jxsuite/schema/guards";
54
61
 
55
62
  /** The synthetic identity column: the entry's project path. Editable only on pending inserts. */
56
63
  export const PATH_FIELD = "__path";
57
64
 
58
65
  interface EntryRecord {
59
- frontmatter: Record<string, unknown>;
60
- document: Record<string, unknown>;
66
+ frontmatter: EntryFields;
67
+ document: JxMutableNode;
61
68
  rawText: string;
62
69
  formatName: string;
63
70
  }
@@ -69,13 +76,17 @@ interface CollectionInfo {
69
76
  ext: string;
70
77
  }
71
78
 
79
+ /** The open project's `content` section (collection name → entry), or an empty one. */
80
+ function contentSection(): Record<string, ContentSectionEntry> {
81
+ /* SAFETY: `content` is the parser extension's section — collection name → entry object, its
82
+ project fragment schema the source of truth. `ContentSectionEntry` names only the fields Studio
83
+ reads, every one optional, and both readers below test `source` before using it. */
84
+ return (projectState?.projectConfig?.content ?? {}) as Record<string, ContentSectionEntry>;
85
+ }
86
+
72
87
  /** Resolve a content type's definition, source dir, and entry extension from project config. */
73
88
  export function collectionInfo(typeName: string): CollectionInfo | null {
74
- const content = (projectState?.projectConfig?.content ?? {}) as Record<
75
- string,
76
- ContentSectionEntry
77
- >;
78
- const def = content[typeName];
89
+ const def = contentSection()[typeName];
79
90
  if (!def?.source) {
80
91
  return null;
81
92
  }
@@ -91,11 +102,7 @@ export function collectionInfo(typeName: string): CollectionInfo | null {
91
102
 
92
103
  /** Directory-backed collections in the project (for "Edit collection in Grid" affordances). */
93
104
  export function collectionDirs(): { name: string; dir: string }[] {
94
- const content = (projectState?.projectConfig?.content ?? {}) as Record<
95
- string,
96
- ContentSectionEntry
97
- >;
98
- return Object.entries(content)
105
+ return Object.entries(contentSection())
99
106
  .filter(([, def]) => {
100
107
  const source = def.source?.replace(/^\.\//, "") ?? "";
101
108
  return source !== "" && !/\.[a-z0-9]+$/i.test(source);
@@ -126,14 +133,77 @@ async function listEntryFiles(dir: string, exts: string[]): Promise<string[]> {
126
133
  return results.toSorted();
127
134
  }
128
135
 
129
- /** Entry ids (file stems) of a collection — used by relationship cell editors. */
136
+ /**
137
+ * The real directories a collection's entries live in.
138
+ *
139
+ * A plain source is its one directory. A localized source (`content/exhibitions/{locale}`) is one
140
+ * directory per language, and the literal path with the placeholder is a directory nobody has:
141
+ * listing it is a 500 from the dev server and an empty collection on screen. So the placeholder's
142
+ * parent is listed, and each subdirectory is kept when the one collection matcher
143
+ * (`content/collection-match.ts`) says that directory IS this collection's, which is what keeps an
144
+ * undeclared language or a co-located `images/` folder out.
145
+ */
146
+ export async function collectionSourceDirs(info: { dir: string; name: string }): Promise<string[]> {
147
+ const cut = info.dir.indexOf(LOCALE_PLACEHOLDER);
148
+ if (cut === -1) {
149
+ return [info.dir];
150
+ }
151
+ const head = info.dir.slice(0, cut).replace(/\/$/, "");
152
+ const tail = info.dir.slice(cut + LOCALE_PLACEHOLDER.length);
153
+ let children;
154
+ try {
155
+ children = await getPlatform().listDirectory(head);
156
+ } catch {
157
+ return []; // No parent directory yet: a localized collection with no entries in any language.
158
+ }
159
+ return children
160
+ .filter((entry) => entry.type === "directory")
161
+ .map((entry) => `${entry.path}${tail}`.replace(/\/$/, ""))
162
+ .filter((dir) => collectionForDirectory(dir)?.name === info.name)
163
+ .toSorted();
164
+ }
165
+
166
+ /** Every entry file of a collection, across all of its directories. */
167
+ async function listCollectionFiles(info: CollectionInfo): Promise<string[]> {
168
+ const dirs = await collectionSourceDirs(info);
169
+ const lists = await Promise.all(dirs.map((dir) => listEntryFiles(dir, [info.ext])));
170
+ return lists.flat().toSorted();
171
+ }
172
+
173
+ /**
174
+ * The ids of a file-backed collection's records (`content/file-records.ts`), or `null` when the
175
+ * source is a directory. A source that names a file is read, never listed: listing a CSV as a
176
+ * directory is a 500 from the dev server and a collection of no entries on screen.
177
+ */
178
+ async function fileRecordIds(info: CollectionInfo): Promise<string[] | null> {
179
+ const file = collectionSourceFile(info.name);
180
+ if (file === null) {
181
+ return null;
182
+ }
183
+ let text: string;
184
+ try {
185
+ text = await getPlatform().readFile(file);
186
+ } catch {
187
+ return []; // A source file not written yet: an empty collection.
188
+ }
189
+ return recordIdsOf(file, text, info.def.idField);
190
+ }
191
+
192
+ /**
193
+ * Entry ids of a collection (file stems, or a file-backed collection's record ids), used by
194
+ * relationship cell editors and the Site panel's counts.
195
+ */
130
196
  export async function listCollectionEntryIds(typeName: string): Promise<string[]> {
131
197
  await loadFormats().catch(() => {}); // Extension resolution needs the format registry.
132
198
  const info = collectionInfo(typeName);
133
199
  if (!info) {
134
200
  return [];
135
201
  }
136
- const files = await listEntryFiles(info.dir, [info.ext]);
202
+ const recordIds = await fileRecordIds(info);
203
+ if (recordIds !== null) {
204
+ return recordIds;
205
+ }
206
+ const files = await listCollectionFiles(info);
137
207
  return files.map((path) => {
138
208
  const base = path.split("/").pop() ?? path;
139
209
  return base.slice(0, base.length - info.ext.length);
@@ -160,14 +230,14 @@ async function mapLimit<T, R>(
160
230
  }
161
231
 
162
232
  /** Frontmatter value → grid cell value. Nested objects surface as read-only JSON text. */
163
- function toCellValue(value: unknown): GridCellValue {
164
- if (value === null || value === undefined) {
233
+ function toCellValue(value: JxDocumentValue | undefined): GridCellValue {
234
+ if (value === undefined) {
165
235
  return null;
166
236
  }
167
- if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
237
+ if (isJsonPrimitive(value)) {
168
238
  return value;
169
239
  }
170
- if (Array.isArray(value) && value.every((v) => typeof v !== "object" || v === null)) {
240
+ if (Array.isArray(value) && value.every((v) => !isNonNullObject(v))) {
171
241
  return value.map(String);
172
242
  }
173
243
  return JSON.stringify(value);
@@ -187,9 +257,7 @@ function openTabFor(path: string) {
187
257
  function extraRowsAreStrings(rows: Record<string, GridCellValue>[], field: string): boolean {
188
258
  return rows.every((row) => {
189
259
  const value = row[field];
190
- return value === null || value === undefined || typeof value !== "string"
191
- ? true
192
- : !value.startsWith("{") && !value.startsWith("[");
260
+ return !isString(value) || (!value.startsWith("{") && !value.startsWith("["));
193
261
  });
194
262
  }
195
263
 
@@ -294,7 +362,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
294
362
  return {
295
363
  document: parsed.document,
296
364
  formatName: parsed.format.name,
297
- frontmatter: parsed.frontmatter ?? {},
365
+ frontmatter: parsed.frontmatter,
298
366
  rawText: text,
299
367
  };
300
368
  } catch {
@@ -393,7 +461,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
393
461
  };
394
462
 
395
463
  const rowFor = (path: string, entry: EntryRecord): GridRow => {
396
- const cells: Record<string, GridCellValue> = { [PATH_FIELD]: path };
464
+ const cells: GridRow["cells"] = { [PATH_FIELD]: path };
397
465
  for (const column of buildColumns()) {
398
466
  if (column.field === PATH_FIELD) {
399
467
  continue;
@@ -420,7 +488,11 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
420
488
  }
421
489
  const doc = entry.document;
422
490
  const fullDoc = { ...frontmatter, ...doc, children: doc.children ?? [] };
423
- const text = await formatSerialize(entry.formatName, fullDoc, { mode: "roundtrip" });
491
+ // The entry's own text, so only the patched keys are re-spelled.
492
+ const text = await formatSerialize(entry.formatName, fullDoc, {
493
+ mode: "roundtrip",
494
+ source: entry.rawText,
495
+ });
424
496
  markLocalMutation(path);
425
497
  await platform.writeFile(path, text);
426
498
  entries.set(path, { ...entry, frontmatter, rawText: text });
@@ -490,7 +562,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
490
562
  // Inserts: new entry files from the Path cell.
491
563
  for (const insert of batch.inserts) {
492
564
  const rawPath = insert.cells[PATH_FIELD];
493
- if (typeof rawPath !== "string" || rawPath.trim() === "") {
565
+ if (!isString(rawPath) || rawPath.trim() === "") {
494
566
  result.inserts.push({ error: "Path is required", ok: false, tempKey: insert.tempKey });
495
567
  continue;
496
568
  }
@@ -522,7 +594,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
522
594
  continue;
523
595
  }
524
596
  try {
525
- const frontmatter: Record<string, unknown> = {};
597
+ const frontmatter: Record<string, GridCellValue> = {};
526
598
  for (const [field, value] of Object.entries(insert.cells)) {
527
599
  if (field !== PATH_FIELD && value !== null) {
528
600
  frontmatter[field] = value;
@@ -539,7 +611,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
539
611
  entries.set(path, {
540
612
  document: parsed.document,
541
613
  formatName: parsed.format.name,
542
- frontmatter: parsed.frontmatter ?? {},
614
+ frontmatter: parsed.frontmatter,
543
615
  rawText: text,
544
616
  });
545
617
  result.inserts.push({ newKey: path, ok: true, tempKey: insert.tempKey });
@@ -627,10 +699,7 @@ export function createCollectionSource(typeName: string): GridSource {
627
699
  );
628
700
  },
629
701
  label: typeName,
630
- list: () => {
631
- const info = requireInfo();
632
- return listEntryFiles(info.dir, [info.ext]);
633
- },
702
+ list: () => listCollectionFiles(requireInfo()),
634
703
  resolveInsertPath: (raw) => {
635
704
  const info = requireInfo();
636
705
  let path = raw.trim().replace(/^\.\//, "").replace(/^\//, "");
@@ -84,7 +84,7 @@ function buildModel(text: string, path: string): CsvModel {
84
84
 
85
85
  // Typed columns when this CSV is a collection source; sniffed kinds otherwise.
86
86
  const contentType = findContentTypeSchema(path, projectState?.projectConfig);
87
- const schemaProps = contentType?.schema?.properties ?? {};
87
+ const schemaProps = contentType?.schema.properties ?? {};
88
88
  const sampleRows = doc.rows.slice(0, 50).map((row) => {
89
89
  const cells: Record<string, GridCellValue> = {};
90
90
  for (const [i, field] of fields.entries()) {
@@ -116,7 +116,7 @@ function buildModel(text: string, path: string): CsvModel {
116
116
  }
117
117
 
118
118
  /** Typed cell values for one matrix row. */
119
- function rowCells(model: CsvModel, rowIndex: number): Record<string, GridCellValue> {
119
+ function rowCells(model: CsvModel, rowIndex: number): GridRow["cells"] {
120
120
  const cells: Record<string, GridCellValue> = {};
121
121
  const row = model.doc.rows[rowIndex] ?? [];
122
122
  for (const [i, field] of model.fields.entries()) {
@@ -1,26 +1,35 @@
1
1
  /**
2
2
  * Minimal ambient types for tabulator-tables 6.x — the package ships no declarations. Only the
3
3
  * surface grid-view.ts touches is typed; extend here as usage grows.
4
+ *
5
+ * Every component is generic over `Value`, the type of one cell value. Tabulator stores the row
6
+ * objects it is handed (`data`, `replaceData`) and gives the same values back (`getValue`,
7
+ * `getData`, sorter and filter arguments), so the caller that builds the table names the value type
8
+ * once and reads it back from every component. Values written in (`setValue`, an editor's
9
+ * `success`, `selectableRangeClearCellsValue`) must be of that same type for the promise to hold.
4
10
  */
5
11
  declare module "tabulator-tables" {
6
- export interface CellComponent {
7
- getValue: () => unknown;
12
+ /** One row object as the table stores it: cell values keyed by field. */
13
+ export type RowData<Value> = Record<string, Value>;
14
+
15
+ export interface CellComponent<Value> {
16
+ getValue: () => Value;
8
17
  getField: () => string;
9
18
  getElement: () => HTMLElement;
10
- getRow: () => RowComponent;
11
- setValue: (value: unknown, mutate?: boolean) => void;
19
+ getRow: () => RowComponent<Value>;
20
+ setValue: (value: Value, mutate?: boolean) => void;
12
21
  }
13
22
 
14
- export interface RowComponent {
15
- getData: () => Record<string, unknown>;
23
+ export interface RowComponent<Value> {
24
+ getData: () => RowData<Value>;
16
25
  getElement: () => HTMLElement;
17
- getCells: () => CellComponent[];
26
+ getCells: () => CellComponent<Value>[];
18
27
  reformat: () => void;
19
28
  }
20
29
 
21
- export interface RangeComponent {
22
- getRows: () => RowComponent[];
23
- getCells: () => CellComponent[][];
30
+ export interface RangeComponent<Value> {
31
+ getRows: () => RowComponent<Value>[];
32
+ getCells: () => CellComponent<Value>[][];
24
33
  }
25
34
 
26
35
  export interface ColumnComponent {
@@ -28,28 +37,29 @@ declare module "tabulator-tables" {
28
37
  getWidth: () => number;
29
38
  }
30
39
 
31
- export type CellEditor = (
32
- cell: CellComponent,
40
+ export type CellEditor<Value> = (
41
+ cell: CellComponent<Value>,
33
42
  onRendered: (fn: () => void) => void,
34
- success: (value: unknown) => void,
43
+ success: (value: Value) => void,
35
44
  cancel: () => void,
36
45
  ) => HTMLElement | false;
37
46
 
38
- export type CellFormatter = (
39
- cell: CellComponent,
40
- formatterParams: Record<string, unknown>,
47
+ export type CellFormatter<Value> = (
48
+ cell: CellComponent<Value>,
49
+ /** Always `{}`: no column definition here declares `formatterParams`. */
50
+ formatterParams: Record<string, never>,
41
51
  onRendered: (fn: () => void) => void,
42
52
  ) => HTMLElement | string;
43
53
 
44
- export interface ColumnDefinition {
54
+ export interface ColumnDefinition<Value> {
45
55
  title: string;
46
56
  field?: string | undefined;
47
57
  width?: number | undefined;
48
58
  frozen?: boolean | undefined;
49
- editor?: CellEditor | undefined;
50
- editable?: boolean | ((cell: CellComponent) => boolean) | undefined;
51
- formatter?: CellFormatter | undefined;
52
- sorter?: string | ((a: unknown, b: unknown) => number) | undefined;
59
+ editor?: CellEditor<Value> | undefined;
60
+ editable?: boolean | ((cell: CellComponent<Value>) => boolean) | undefined;
61
+ formatter?: CellFormatter<Value> | undefined;
62
+ sorter?: string | ((a: Value, b: Value) => number) | undefined;
53
63
  headerSort?: boolean | undefined;
54
64
  headerFilter?: string | undefined;
55
65
  cssClass?: string | undefined;
@@ -57,9 +67,20 @@ declare module "tabulator-tables" {
57
67
  headerSortTristate?: boolean | undefined;
58
68
  }
59
69
 
60
- export interface Options {
61
- data?: Record<string, unknown>[];
62
- columns?: ColumnDefinition[];
70
+ /** Which table regions a clipboard copy includes. */
71
+ export interface ClipboardCopyConfig {
72
+ columnHeaders?: boolean;
73
+ columnGroups?: boolean;
74
+ rowHeaders?: boolean;
75
+ rowGroups?: boolean;
76
+ columnCalcs?: boolean;
77
+ dataTree?: boolean;
78
+ formatCells?: boolean;
79
+ }
80
+
81
+ export interface Options<Value> {
82
+ data?: RowData<Value>[];
83
+ columns?: ColumnDefinition<Value>[];
63
84
  index?: string;
64
85
  layout?: string;
65
86
  height?: string | number;
@@ -73,27 +94,33 @@ declare module "tabulator-tables" {
73
94
  selectableRangeColumns?: boolean;
74
95
  selectableRangeRows?: boolean;
75
96
  selectableRangeClearCells?: boolean;
76
- selectableRangeClearCellsValue?: unknown;
97
+ selectableRangeClearCellsValue?: Value;
77
98
  clipboard?: boolean;
78
99
  clipboardCopyStyled?: boolean;
79
- clipboardCopyConfig?: Record<string, unknown>;
100
+ clipboardCopyConfig?: ClipboardCopyConfig;
80
101
  clipboardCopyRowRange?: string;
81
102
  clipboardPasteParser?: string;
82
103
  clipboardPasteAction?: string;
83
104
  movableColumns?: boolean;
84
- columnDefaults?: Partial<ColumnDefinition>;
85
- rowFormatter?: (row: RowComponent) => void;
105
+ columnDefaults?: Partial<ColumnDefinition<Value>>;
106
+ rowFormatter?: (row: RowComponent<Value>) => void;
86
107
  placeholder?: string;
87
108
  }
88
109
 
89
- export class Tabulator {
90
- constructor(host: HTMLElement, options: Options);
110
+ export class Tabulator<Value> {
111
+ constructor(host: HTMLElement, options: Options<Value>);
91
112
  static registerModule(modules: unknown[]): void;
92
113
  on(event: string, callback: (...args: never[]) => void): void;
93
- replaceData(data: Record<string, unknown>[]): Promise<void>;
94
- getRows(activeOnly?: string): RowComponent[];
95
- getRanges(): RangeComponent[];
96
- setFilter(filter: (data: Record<string, unknown>) => boolean): void;
114
+ replaceData(data: RowData<Value>[]): Promise<void>;
115
+ getRows(activeOnly?: string): RowComponent<Value>[];
116
+ getRanges(): RangeComponent<Value>[];
117
+ /** The row whose `index` field holds `index`, or `false` for none. */
118
+ getRow(index: string): RowComponent<Value> | false;
119
+ /** Scroll a row into view; rejects when no row holds `index`. */
120
+ scrollToRow(index: string, position?: string, ifVisible?: boolean): Promise<void>;
121
+ /** Select the range between two cells, replacing the oldest range past `selectableRange`. */
122
+ addRange(start: CellComponent<Value>, end: CellComponent<Value>): RangeComponent<Value>;
123
+ setFilter(filter: (data: RowData<Value>) => boolean): void;
97
124
  clearFilter(includeHeaderFilters?: boolean): void;
98
125
  redraw(force?: boolean): void;
99
126
  destroy(): void;
@@ -109,8 +109,8 @@ export function studioShellHtml(options: DocumentOptions = {}): string {
109
109
  const boot = (options.boot ?? []).map((mod) => ` ${scriptTag(mod)}`).join("\n");
110
110
  /* Only when there IS a boot module: `packages/studio/index.html` is generated with none and CI
111
111
  diffs it byte for byte, and the dev server it is served by is the one host that should fall
112
- back. The `<head>` below stays a literal, attribute-free tag — Electrobun's macOS CEF path
113
- injects its preload by splicing after that exact string. */
112
+ back. The `<head>` below stays a literal, attribute-free tag — a host that
113
+ injects a preload splices it in after that exact string. */
114
114
  const bootMeta = boot
115
115
  ? ` <meta name="${BOOT_META.name}" content="${BOOT_META.content}" />\n`
116
116
  : "";
@@ -15,6 +15,7 @@ import { cp, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
15
15
  import { existsSync } from "node:fs";
16
16
  import { dirname, join, resolve } from "node:path";
17
17
  import { Glob } from "bun";
18
+ import { isNonNullObject } from "@jxsuite/schema/guards";
18
19
  import { STUDIO_ASSETS, STUDIO_CANVAS, STUDIO_SHELL } from "./layout";
19
20
  import type { AssetBase, StudioAsset, StudioAssetKind, StudioLayoutMode } from "./layout";
20
21
  import { canvasShellHtml } from "./document";
@@ -193,11 +194,10 @@ export async function writeAssetManifest(
193
194
  ): Promise<void> {
194
195
  const out = manifestPath(root);
195
196
  await mkdir(dirname(out), { recursive: true });
196
- const manifest = {
197
- assets: STUDIO_ASSETS,
198
- ...(extra.preload === undefined ? {} : { preload: extra.preload }),
199
- shell: STUDIO_SHELL,
200
- };
197
+ const manifest =
198
+ extra.preload === undefined
199
+ ? { assets: STUDIO_ASSETS, shell: STUDIO_SHELL }
200
+ : { assets: STUDIO_ASSETS, preload: extra.preload, shell: STUDIO_SHELL };
201
201
  await writeFile(out, `${JSON.stringify(manifest, null, 2)}\n`);
202
202
  }
203
203
 
@@ -231,8 +231,8 @@ export async function studioPreload(root: string = STUDIO_PACKAGE_DIR): Promise<
231
231
  if (!existsSync(path)) {
232
232
  return [];
233
233
  }
234
- const manifest = JSON.parse(await readFile(path, "utf8")) as { preload?: unknown };
235
- const { preload } = manifest;
234
+ const manifest: unknown = JSON.parse(await readFile(path, "utf8"));
235
+ const preload = isNonNullObject(manifest) && "preload" in manifest ? manifest.preload : undefined;
236
236
  if (!Array.isArray(preload)) {
237
237
  return [];
238
238
  }
@@ -47,7 +47,6 @@ import {
47
47
  } from "../commands/command-args";
48
48
  import type { CommandArgValues } from "../commands/command-args";
49
49
  import type { AnyCommand, CommandRegistry } from "../commands/registry";
50
- import type { Tab } from "../tabs/tab";
51
50
 
52
51
  /** The tags a translation verb may be asked for — the project's declared locales, read live. */
53
52
  function declaredLocales(): string[] {
@@ -98,7 +97,7 @@ function addressedDocument(commandId: string, args: CommandArgValues): string {
98
97
  }
99
98
  return path;
100
99
  }
101
- const tab = paneId === undefined ? (activeTab.value as Tab | null) : tabOfPane(paneId);
100
+ const tab = paneId === undefined ? activeTab.value : tabOfPane(paneId);
102
101
  if (!tab) {
103
102
  throw new RangeError(
104
103
  paneId === undefined
@@ -128,6 +127,7 @@ function siblingPath(documentPath: string, locale: string): string | null {
128
127
  if (i18n === null || !i18n.locales.includes(locale)) {
129
128
  notify.error(`This project does not declare ${localeLabel(locale)}.`, {
130
129
  action: "settings.open",
130
+ actionArgs: { section: "locales" },
131
131
  detail: "Add it in Settings › Locales, or with the Add Language command.",
132
132
  source: "Languages",
133
133
  });
@@ -322,7 +322,7 @@ export function i18nCommands(): AnyCommand[] {
322
322
  when: (ctx) => ctx.project.isMultilingual,
323
323
  /* No `aiTool`, by studio-ui-guidelines.md §12.4's first deletion rule: the panel is a surface
324
324
  for a person. */
325
- /* The panel is off the rail — it spends no rail slot and shifts no ⌘1-8 chord — so this
325
+ /* The panel is off the rail — it spends no rail slot — so this
326
326
  command and the generated `panel.focus.i18n` are its only two doors, and both open the
327
327
  same one. The TITLES must differ even though the behaviour does not: the palette is a flat
328
328
  searchable list where "View: Show Languages" twice is two rows a reader cannot choose