@jxsuite/studio 6.1.1 → 6.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/dist/chunks/{2020-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
  2. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  3. package/dist/chunks/adapter-4912g339.js +4 -0
  4. package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
  5. package/dist/chunks/cf-settings-br6105tr.js +4 -0
  6. package/dist/chunks/color-28ksk2qm.js +4 -0
  7. package/dist/chunks/color-area-0fj8a4ga.js +4 -0
  8. package/dist/chunks/color-field-xch8kx2g.js +4 -0
  9. package/dist/chunks/color-slider-jxd8v350.js +4 -0
  10. package/dist/chunks/combobox-p0efwjke.js +4 -0
  11. package/dist/chunks/components-db68vsn7.js +4 -0
  12. package/dist/chunks/content-source-1449qesq.js +4 -0
  13. package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
  14. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  15. package/dist/chunks/editor-x9jn86a7.js +4 -0
  16. package/dist/chunks/entry-commands-may24cpt.js +4 -0
  17. package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
  18. package/dist/chunks/file-ops-x9v54pcj.js +4 -0
  19. package/dist/chunks/files-j3knqf0s.js +4 -0
  20. package/dist/chunks/format-host-tyre2trb.js +4 -0
  21. package/dist/chunks/fs-events-64ma9htc.js +4 -0
  22. package/dist/chunks/git-panel-84ps5dex.js +4 -0
  23. package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
  24. package/dist/chunks/icons-pnfz478q.js +4 -0
  25. package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
  26. package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
  27. package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
  28. package/dist/chunks/iframe-entry-zap785cw.js +5 -0
  29. package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
  30. package/dist/chunks/index-b8xw3vy9.js +4 -0
  31. package/dist/chunks/{index-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
  32. package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
  33. package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
  34. package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
  35. package/dist/chunks/layers-h4xp1pss.js +4 -0
  36. package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
  37. package/dist/chunks/listbox-e74qjyq6.js +4 -0
  38. package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
  39. package/dist/chunks/media-picker-2cweexc5.js +4 -0
  40. package/dist/chunks/menu-n6yzswmy.js +4 -0
  41. package/dist/chunks/menu-ynw13y0s.js +4 -0
  42. package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
  43. package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
  44. package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
  45. package/dist/chunks/notify-cj5zbrs2.js +4 -0
  46. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  47. package/dist/chunks/parse-b7ddhr8m.js +4 -0
  48. package/dist/chunks/platform-3dfws9js.js +4 -0
  49. package/dist/chunks/popover-jt2gxmzs.js +4 -0
  50. package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
  51. package/dist/chunks/quick-search-0dajrwqg.js +4 -0
  52. package/dist/chunks/references-49qgt404.js +4 -0
  53. package/dist/chunks/right-panel-jm1bwe53.js +4 -0
  54. package/dist/chunks/section-registry-6kwc4fky.js +4 -0
  55. package/dist/chunks/select-rzds841e.js +4 -0
  56. package/dist/chunks/split-n2gfpm5m.js +4 -0
  57. package/dist/chunks/{studio-1q1sh2ax.js → studio-0q988f9w.js} +3 -3
  58. package/dist/chunks/studio-0rt52vpq.js +5 -0
  59. package/dist/chunks/studio-18vgbhs5.js +5 -0
  60. package/dist/chunks/{studio-h46vtzk8.js → studio-1fxkaaea.js} +4 -4
  61. package/dist/chunks/studio-24mccdrj.js +5 -0
  62. package/dist/chunks/studio-2eh507zk.js +9 -0
  63. package/dist/chunks/studio-2hcbccfv.js +5 -0
  64. package/dist/chunks/studio-2j1cb95x.js +5 -0
  65. package/dist/chunks/studio-2jbs3rxv.js +5 -0
  66. package/dist/chunks/{studio-rv11kfwa.js → studio-485046te.js} +7 -7
  67. package/dist/chunks/studio-4h8k4dw9.js +5 -0
  68. package/dist/chunks/studio-5f6n18kx.js +5 -0
  69. package/dist/chunks/studio-5gthpky6.js +5 -0
  70. package/dist/chunks/studio-5ve6bbep.js +5 -0
  71. package/dist/chunks/studio-6ep3js6b.js +9 -0
  72. package/dist/chunks/studio-6wkmf3wz.js +9 -0
  73. package/dist/chunks/studio-841rf3cg.js +5 -0
  74. package/dist/chunks/studio-8gmwgheg.js +5 -0
  75. package/dist/chunks/studio-8qm0ep50.js +5 -0
  76. package/dist/chunks/{studio-8grwxtqk.js → studio-90pq9km1.js} +4 -4
  77. package/dist/chunks/studio-924p1tm1.js +6 -0
  78. package/dist/chunks/{studio-pre0skq6.js → studio-a3g98wjr.js} +4 -4
  79. package/dist/chunks/studio-a3shpz9y.js +5 -0
  80. package/dist/chunks/studio-amsbaaar.js +6 -0
  81. package/dist/chunks/studio-at5spjbc.js +7 -0
  82. package/dist/chunks/studio-b2xv945e.js +5 -0
  83. package/dist/chunks/studio-bn5nkafw.js +5 -0
  84. package/dist/chunks/studio-bw6q5xjf.js +9 -0
  85. package/dist/chunks/studio-c7q0t9x1.js +5 -0
  86. package/dist/chunks/studio-camnhc96.js +6 -0
  87. package/dist/chunks/studio-cffqvnzd.js +5 -0
  88. package/dist/chunks/studio-d81xfh1g.js +5 -0
  89. package/dist/chunks/studio-dgz8d0c1.js +5 -0
  90. package/dist/chunks/studio-efvfrsf8.js +5 -0
  91. package/dist/chunks/studio-er30bpcx.js +5 -0
  92. package/dist/chunks/studio-ezscgr64.js +5 -0
  93. package/dist/chunks/studio-ffrrncvz.js +5 -0
  94. package/dist/chunks/studio-fpphgn8y.js +10 -0
  95. package/dist/chunks/studio-j1kvhdjk.js +4 -0
  96. package/dist/chunks/{studio-vrmcjf9g.js → studio-j430n16g.js} +5 -5
  97. package/dist/chunks/studio-jjkg84nj.js +5 -0
  98. package/dist/chunks/studio-m0q32ars.js +4 -0
  99. package/dist/chunks/studio-m6bdst11.js +5 -0
  100. package/dist/chunks/studio-nv2cptd4.js +64 -0
  101. package/dist/chunks/studio-nwfrc98n.js +5 -0
  102. package/dist/chunks/studio-p1wgvp7r.js +5 -0
  103. package/dist/chunks/studio-pag2wncm.js +5 -0
  104. package/dist/chunks/studio-qvanvzfd.js +5 -0
  105. package/dist/chunks/studio-qwa64kt7.js +5 -0
  106. package/dist/chunks/studio-rk1zc4x3.js +928 -0
  107. package/dist/chunks/studio-se2r3ptc.js +5 -0
  108. package/dist/chunks/studio-sg2a0dh0.js +5 -0
  109. package/dist/chunks/studio-tjzjhe68.js +5 -0
  110. package/dist/chunks/{studio-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
  111. package/dist/chunks/{studio-kggey1jt.js → studio-v0jzqdjm.js} +4 -4
  112. package/dist/chunks/studio-v2w7q8r1.js +7 -0
  113. package/dist/chunks/studio-v5vjq1h0.js +4 -0
  114. package/dist/chunks/studio-v8aga3vp.js +14 -0
  115. package/dist/chunks/studio-vfcdrfmv.js +5 -0
  116. package/dist/chunks/studio-vmfkgdjf.js +5 -0
  117. package/dist/chunks/studio-wt1816jj.js +5 -0
  118. package/dist/chunks/studio-wz73q5kq.js +4 -0
  119. package/dist/chunks/studio-y04qtxvp.js +7 -0
  120. package/dist/chunks/studio-y21g8zzg.js +5 -0
  121. package/dist/chunks/{studio-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
  122. package/dist/chunks/studio-ynn90f58.js +16 -0
  123. package/dist/chunks/studio-yxz682sx.js +5 -0
  124. package/dist/chunks/studio-zp7snvkq.js +5 -0
  125. package/dist/chunks/studio-zq4z6tm6.js +5 -0
  126. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  127. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  128. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  129. package/dist/chunks/toast-c9fn075p.js +4 -0
  130. package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
  131. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  132. package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
  133. package/dist/chunks/tree-mdq3v5cw.js +4 -0
  134. package/dist/chunks/{tsMode-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
  135. package/dist/chunks/workspace-jtfahpee.js +4 -0
  136. package/dist/chunks/ws-client-nze0k6mv.js +4 -0
  137. package/dist/iframe-entry.js +16 -16
  138. package/dist/manifest.json +63 -63
  139. package/dist/studio.js +97 -97
  140. package/package.json +6 -6
  141. package/src/about/about-modal.ts +4 -3
  142. package/src/account/action-flow.ts +45 -38
  143. package/src/account-status.ts +7 -2
  144. package/src/browse/library-layouts.ts +8 -5
  145. package/src/browse/library-model.ts +18 -6
  146. package/src/browse/library-pane.ts +37 -21
  147. package/src/browse/library-preview.ts +14 -9
  148. package/src/browse/library-source.ts +1 -1
  149. package/src/canvas/asset-refs.ts +24 -9
  150. package/src/canvas/asset-resolve.ts +19 -23
  151. package/src/canvas/canvas-helpers.ts +7 -6
  152. package/src/canvas/canvas-live-render.ts +44 -53
  153. package/src/canvas/canvas-patcher.ts +30 -30
  154. package/src/canvas/canvas-perf.ts +11 -5
  155. package/src/canvas/canvas-render.ts +62 -41
  156. package/src/canvas/canvas-surface.ts +5 -3
  157. package/src/canvas/canvas-utils.ts +90 -49
  158. package/src/canvas/dialog-path.ts +9 -4
  159. package/src/canvas/dialog-state.ts +1 -2
  160. package/src/canvas/diff-marks.ts +9 -16
  161. package/src/canvas/diff-toolbar.ts +8 -7
  162. package/src/canvas/edit-width-drag.ts +4 -1
  163. package/src/canvas/edit-width.ts +1 -3
  164. package/src/canvas/iframe-channel.ts +27 -13
  165. package/src/canvas/iframe-drop.ts +13 -12
  166. package/src/canvas/iframe-editable-root.ts +29 -16
  167. package/src/canvas/iframe-entry.ts +80 -63
  168. package/src/canvas/iframe-eval.ts +73 -49
  169. package/src/canvas/iframe-host.ts +135 -96
  170. package/src/canvas/iframe-inline-edit.ts +49 -30
  171. package/src/canvas/iframe-insert.ts +5 -4
  172. package/src/canvas/iframe-interaction.ts +30 -25
  173. package/src/canvas/iframe-overlay.ts +1 -1
  174. package/src/canvas/iframe-patch.ts +18 -15
  175. package/src/canvas/iframe-position.ts +12 -6
  176. package/src/canvas/iframe-protocol.ts +12 -16
  177. package/src/canvas/iframe-render.ts +36 -34
  178. package/src/canvas/iframe-slash.ts +24 -11
  179. package/src/canvas/iframe-subtree.ts +6 -2
  180. package/src/canvas/path-mapping.ts +19 -12
  181. package/src/canvas/popover-path.ts +7 -3
  182. package/src/canvas/popover-state.ts +1 -2
  183. package/src/canvas/serialize-scope.ts +13 -5
  184. package/src/canvas/stage-scrollbar.ts +2 -1
  185. package/src/canvas/surface-registry.ts +21 -3
  186. package/src/collab/collab-commands.ts +7 -2
  187. package/src/collab/collab-session.ts +84 -45
  188. package/src/collab/collab-state.ts +4 -3
  189. package/src/collab/monaco-binding.ts +16 -13
  190. package/src/collab/monaco-cursors.ts +5 -2
  191. package/src/commands/budget.ts +3 -3
  192. package/src/commands/command-args.ts +103 -71
  193. package/src/commands/context.ts +22 -20
  194. package/src/commands/keymap.ts +47 -43
  195. package/src/commands/levels.ts +3 -3
  196. package/src/commands/live-context.ts +7 -7
  197. package/src/commands/reference.ts +2 -1
  198. package/src/commands/registry.ts +12 -10
  199. package/src/commands/run-reported.ts +15 -10
  200. package/src/component-props.ts +46 -30
  201. package/src/content/collection-match.ts +5 -4
  202. package/src/content/draft-state.ts +4 -3
  203. package/src/content/entry-commands.ts +3 -2
  204. package/src/content/entry-editor.ts +29 -17
  205. package/src/content/entry-fields.ts +12 -7
  206. package/src/content/entry-model.ts +21 -12
  207. package/src/editor/canvas-context-menu.ts +1 -2
  208. package/src/editor/canvas-slash-bridge.ts +3 -6
  209. package/src/editor/content-slice.ts +16 -14
  210. package/src/editor/context-menu.ts +35 -22
  211. package/src/editor/convert-targets.ts +30 -35
  212. package/src/editor/convert-to-component.ts +11 -5
  213. package/src/editor/convert-to-repeater.ts +34 -22
  214. package/src/editor/editable-tags.ts +17 -2
  215. package/src/editor/file-drop-action.ts +21 -22
  216. package/src/editor/inline-edit-apply.ts +35 -17
  217. package/src/editor/inline-edit.ts +66 -50
  218. package/src/editor/inline-format.ts +59 -56
  219. package/src/editor/inline-link.ts +40 -15
  220. package/src/editor/insert-zone-action.ts +1 -1
  221. package/src/editor/merge-tags.ts +58 -19
  222. package/src/editor/repeater-scope.ts +39 -28
  223. package/src/editor/shortcuts.ts +32 -20
  224. package/src/editor/slash-menu.ts +1 -6
  225. package/src/files/asset-versions.ts +4 -4
  226. package/src/files/components.ts +15 -10
  227. package/src/files/elements.ts +5 -6
  228. package/src/files/file-ops.ts +77 -36
  229. package/src/files/files.ts +90 -95
  230. package/src/files/media-meta.ts +2 -1
  231. package/src/files/media-paths.ts +3 -0
  232. package/src/files/serialize-document.ts +2 -2
  233. package/src/format/constraints.ts +1 -1
  234. package/src/format/convert-file.ts +27 -13
  235. package/src/format/format-choices.ts +2 -1
  236. package/src/format/format-host.ts +76 -50
  237. package/src/github/github-auth-status.ts +27 -3
  238. package/src/github/github-auth.ts +19 -9
  239. package/src/github/github-publish.ts +24 -20
  240. package/src/grid/cell-editors.ts +46 -31
  241. package/src/grid/cell-popovers.ts +5 -3
  242. package/src/grid/edit-buffer.ts +10 -9
  243. package/src/grid/grid-controller.ts +20 -22
  244. package/src/grid/grid-layout.ts +21 -5
  245. package/src/grid/grid-open.ts +3 -6
  246. package/src/grid/grid-panel.ts +11 -4
  247. package/src/grid/grid-source.ts +8 -8
  248. package/src/grid/grid-view.ts +14 -17
  249. package/src/grid/redirects-grid.ts +14 -5
  250. package/src/grid/redirects.ts +16 -14
  251. package/src/grid/schema-columns.ts +25 -19
  252. package/src/grid/sources/connector-source.ts +47 -20
  253. package/src/grid/sources/content-source.ts +25 -24
  254. package/src/grid/sources/csv-file-source.ts +2 -2
  255. package/src/grid/tabulator-tables.d.ts +55 -34
  256. package/src/hosting/stage.ts +7 -7
  257. package/src/i18n/i18n-commands.ts +1 -2
  258. package/src/media/media-pane.ts +4 -1
  259. package/src/new-project/add-repo-modal.ts +20 -19
  260. package/src/new-project/import-tab.ts +10 -14
  261. package/src/new-project/location-fields.ts +2 -1
  262. package/src/new-project/new-project-modal.ts +12 -9
  263. package/src/packages/jxsuite-update.ts +4 -3
  264. package/src/packages/pull-package-sync.ts +26 -25
  265. package/src/page-params.ts +97 -68
  266. package/src/panels/activity-panel.ts +17 -9
  267. package/src/panels/ai-chat/attached-context.ts +13 -7
  268. package/src/panels/ai-chat/chat-view.ts +80 -73
  269. package/src/panels/ai-chat/composer.ts +30 -33
  270. package/src/panels/ai-chat/sessions-view.ts +1 -2
  271. package/src/panels/ai-panel.ts +23 -20
  272. package/src/panels/block-action-bar.ts +46 -35
  273. package/src/panels/bottom-dock.ts +5 -3
  274. package/src/panels/canvas-dnd-bridge.ts +31 -24
  275. package/src/panels/data-explorer.ts +62 -25
  276. package/src/panels/data-grid.ts +14 -11
  277. package/src/panels/dnd.ts +108 -118
  278. package/src/panels/editors.ts +52 -21
  279. package/src/panels/elements-panel.ts +10 -3
  280. package/src/panels/events-panel.ts +84 -69
  281. package/src/panels/formula-workspace.ts +76 -51
  282. package/src/panels/frontmatter-fields.ts +24 -19
  283. package/src/panels/frontmatter-panel.ts +44 -34
  284. package/src/panels/git-diff-open.ts +4 -4
  285. package/src/panels/git-panel.ts +49 -61
  286. package/src/panels/head-panel.ts +131 -111
  287. package/src/panels/i18n-panel.ts +10 -3
  288. package/src/panels/imports-panel.ts +23 -47
  289. package/src/panels/jump-bar.ts +48 -29
  290. package/src/panels/layers-panel.ts +97 -74
  291. package/src/panels/left-panel.ts +3 -3
  292. package/src/panels/pane-context.ts +31 -22
  293. package/src/panels/pane-grid.ts +49 -20
  294. package/src/panels/panel-registry.ts +22 -37
  295. package/src/panels/properties-panel.ts +175 -121
  296. package/src/panels/quick-search.ts +53 -31
  297. package/src/panels/right-panel.ts +3 -3
  298. package/src/panels/seo-modal.ts +13 -17
  299. package/src/panels/settings-menu.ts +15 -15
  300. package/src/panels/signals-panel.ts +153 -131
  301. package/src/panels/statement-editor.ts +230 -140
  302. package/src/panels/style-panel.ts +218 -205
  303. package/src/panels/style-utils.ts +114 -51
  304. package/src/panels/stylebook-doc.ts +57 -54
  305. package/src/panels/stylebook-layers-panel.ts +9 -9
  306. package/src/panels/stylebook-panel.ts +13 -17
  307. package/src/panels/tab-drop.ts +27 -11
  308. package/src/panels/tab-strip.ts +36 -26
  309. package/src/platform-errors.ts +57 -43
  310. package/src/platform.ts +58 -30
  311. package/src/platforms/cloud.ts +345 -175
  312. package/src/platforms/default-platform.ts +10 -4
  313. package/src/platforms/devserver.ts +129 -117
  314. package/src/platforms/read-batcher.ts +16 -8
  315. package/src/project-list.ts +2 -1
  316. package/src/publish/deploy-checklist.ts +8 -2
  317. package/src/publish/pages-service.ts +28 -13
  318. package/src/publish/publish-commands.ts +5 -4
  319. package/src/publish/publish-panel.ts +10 -6
  320. package/src/recent-projects.ts +15 -8
  321. package/src/resize-edges.ts +26 -36
  322. package/src/services/a11y-report.ts +26 -19
  323. package/src/services/agent-seed.ts +23 -11
  324. package/src/services/ai-ask.ts +9 -12
  325. package/src/services/ai-command-tools.ts +68 -62
  326. package/src/services/ai-import-tools.ts +80 -67
  327. package/src/services/ai-models.ts +17 -13
  328. package/src/services/ai-project-tools.ts +68 -32
  329. package/src/services/ai-session-store.ts +19 -10
  330. package/src/services/ai-system-prompt.ts +46 -20
  331. package/src/services/ai-tools.ts +71 -27
  332. package/src/services/ai-write-report.ts +20 -12
  333. package/src/services/ai-writes.ts +4 -4
  334. package/src/services/automation.ts +58 -31
  335. package/src/services/cem-export.ts +149 -58
  336. package/src/services/clock.ts +6 -1
  337. package/src/services/code-services.ts +37 -31
  338. package/src/services/context-manager.ts +14 -10
  339. package/src/services/context-resolver.ts +20 -8
  340. package/src/services/data-service.ts +19 -15
  341. package/src/services/directory-picker.ts +18 -12
  342. package/src/services/document-assistant.ts +39 -19
  343. package/src/services/gated-registry.ts +10 -6
  344. package/src/services/harness/chat-reducer.ts +23 -1
  345. package/src/services/import-client.ts +91 -38
  346. package/src/services/import-seed.ts +8 -2
  347. package/src/services/jx-validate.ts +28 -31
  348. package/src/services/live-preview.ts +0 -0
  349. package/src/services/live-surfaces.ts +6 -3
  350. package/src/services/model-uri.ts +10 -2
  351. package/src/services/module-preloads.ts +12 -8
  352. package/src/services/monaco-buffer.ts +43 -24
  353. package/src/services/monaco-lazy.ts +7 -8
  354. package/src/services/monaco-setup.ts +23 -16
  355. package/src/services/notify.ts +44 -17
  356. package/src/services/popover-report.ts +25 -10
  357. package/src/services/preview-eval.ts +20 -8
  358. package/src/services/profile.ts +13 -6
  359. package/src/services/project-path.ts +13 -10
  360. package/src/services/references.ts +0 -0
  361. package/src/services/render-critic.ts +8 -7
  362. package/src/services/settings/kernel.ts +13 -4
  363. package/src/services/settings/write-queue.ts +9 -9
  364. package/src/services/token-lint.ts +12 -10
  365. package/src/services/tool-executor.ts +17 -5
  366. package/src/services/tool-outcomes.ts +44 -24
  367. package/src/services/trusted-types.ts +24 -7
  368. package/src/settings/contexts-section.ts +11 -8
  369. package/src/settings/contributed-section.ts +79 -60
  370. package/src/settings/css-vars-editor.ts +37 -16
  371. package/src/settings/defs-editor.ts +38 -35
  372. package/src/settings/extension-rows.ts +16 -8
  373. package/src/settings/extension-sections.ts +23 -13
  374. package/src/settings/extensions-section.ts +4 -1
  375. package/src/settings/general-settings.ts +11 -8
  376. package/src/settings/locales-section.ts +20 -12
  377. package/src/settings/preferences-dialog.ts +9 -6
  378. package/src/settings/preferences-keymap.ts +7 -5
  379. package/src/settings/preferences-sections.ts +11 -5
  380. package/src/settings/project-sections.ts +1 -1
  381. package/src/settings/schema-field-ui.ts +9 -0
  382. package/src/settings/settings-document.ts +5 -5
  383. package/src/shell/tree.ts +6 -5
  384. package/src/shell.ts +104 -81
  385. package/src/site-context.ts +37 -22
  386. package/src/state.ts +41 -49
  387. package/src/store.ts +54 -34
  388. package/src/studio.ts +25 -75
  389. package/src/style/live-preview.ts +1 -1
  390. package/src/style/project-styles.ts +6 -7
  391. package/src/style/token-ref.ts +5 -4
  392. package/src/surfaces/about.ts +18 -19
  393. package/src/surfaces/add-repo.ts +17 -19
  394. package/src/surfaces/ai-chat.ts +31 -36
  395. package/src/surfaces/ai-credentials-form.ts +6 -16
  396. package/src/surfaces/ai-managed-connect.ts +3 -4
  397. package/src/surfaces/ai-model-picker.ts +3 -5
  398. package/src/surfaces/block-action-bar.ts +22 -11
  399. package/src/surfaces/boot-failure.ts +4 -5
  400. package/src/surfaces/bottom-dock.ts +9 -18
  401. package/src/surfaces/canvas-stage.ts +12 -11
  402. package/src/surfaces/cf-account-picker.ts +17 -18
  403. package/src/surfaces/commandbar.ts +14 -9
  404. package/src/surfaces/convert-repeater.ts +17 -19
  405. package/src/surfaces/data-actions.ts +9 -7
  406. package/src/surfaces/dialog.ts +26 -28
  407. package/src/surfaces/diff-toolbar.ts +9 -7
  408. package/src/surfaces/doc-header.ts +10 -19
  409. package/src/surfaces/empty-state.ts +7 -10
  410. package/src/surfaces/entry-editor.ts +14 -11
  411. package/src/surfaces/expression-editor.ts +11 -25
  412. package/src/surfaces/files-panel.ts +27 -14
  413. package/src/surfaces/formula-palette.ts +4 -5
  414. package/src/surfaces/git-panel.ts +7 -15
  415. package/src/surfaces/github-auth.ts +16 -20
  416. package/src/surfaces/github-publish.ts +17 -22
  417. package/src/surfaces/grid-cell.ts +30 -31
  418. package/src/surfaces/grid-open.ts +10 -14
  419. package/src/surfaces/grid-panel.ts +13 -9
  420. package/src/surfaces/grid-replace.ts +13 -13
  421. package/src/surfaces/grid-views.ts +15 -18
  422. package/src/surfaces/inspector-dock.ts +13 -12
  423. package/src/surfaces/jump-bar.ts +5 -6
  424. package/src/surfaces/jxsuite-update.ts +16 -22
  425. package/src/surfaces/library-pane.ts +19 -20
  426. package/src/surfaces/logic-panel.ts +17 -30
  427. package/src/surfaces/logic-workspace.ts +13 -15
  428. package/src/surfaces/media-browser.ts +11 -10
  429. package/src/surfaces/media-field.ts +4 -5
  430. package/src/surfaces/media-pane.ts +8 -7
  431. package/src/surfaces/menu.ts +29 -23
  432. package/src/surfaces/navigator-dock.ts +11 -12
  433. package/src/surfaces/new-project.ts +27 -26
  434. package/src/surfaces/pane-context.ts +20 -25
  435. package/src/surfaces/pane-grid.ts +15 -10
  436. package/src/surfaces/panel-activity.ts +5 -6
  437. package/src/surfaces/panel-data.ts +3 -4
  438. package/src/surfaces/panel-deploy-checklist.ts +5 -6
  439. package/src/surfaces/panel-elements.ts +5 -7
  440. package/src/surfaces/panel-i18n.ts +5 -7
  441. package/src/surfaces/panel-imports.ts +6 -13
  442. package/src/surfaces/panel-outline.ts +25 -19
  443. package/src/surfaces/panel-page.ts +11 -18
  444. package/src/surfaces/panel-problems.ts +5 -7
  445. package/src/surfaces/panel-signals.ts +20 -34
  446. package/src/surfaces/panel-stylebook-layers.ts +5 -8
  447. package/src/surfaces/preferences.ts +21 -11
  448. package/src/surfaces/progress-modal.ts +15 -9
  449. package/src/surfaces/properties-panel.json +1 -1
  450. package/src/surfaces/properties-panel.ts +20 -42
  451. package/src/surfaces/publish.ts +18 -18
  452. package/src/surfaces/push-plan.ts +7 -8
  453. package/src/surfaces/rail.ts +13 -13
  454. package/src/surfaces/reference-field.ts +11 -15
  455. package/src/surfaces/schema-builder.ts +16 -22
  456. package/src/surfaces/schema-form.ts +15 -25
  457. package/src/surfaces/secret-field.ts +9 -6
  458. package/src/surfaces/seo.ts +21 -15
  459. package/src/surfaces/settings-contexts.ts +9 -7
  460. package/src/surfaces/settings-contributed.ts +14 -10
  461. package/src/surfaces/settings-css-vars.ts +5 -12
  462. package/src/surfaces/settings-defs.json +2 -2
  463. package/src/surfaces/settings-defs.ts +17 -21
  464. package/src/surfaces/settings-deploy.ts +8 -15
  465. package/src/surfaces/settings-extensions.ts +5 -6
  466. package/src/surfaces/settings-head.ts +33 -39
  467. package/src/surfaces/settings-locales.ts +8 -20
  468. package/src/surfaces/settings-overview.ts +5 -6
  469. package/src/surfaces/settings-packages.ts +8 -7
  470. package/src/surfaces/settings-pane.ts +9 -18
  471. package/src/surfaces/settings-rawjson.ts +5 -6
  472. package/src/surfaces/shell.ts +1 -2
  473. package/src/surfaces/slash-menu.ts +19 -9
  474. package/src/surfaces/statements.ts +13 -18
  475. package/src/surfaces/statusbar.ts +17 -14
  476. package/src/surfaces/style-panel.ts +18 -31
  477. package/src/surfaces/stylebook-chrome.ts +3 -5
  478. package/src/surfaces/tab-strip.ts +14 -13
  479. package/src/surfaces/target-line.ts +6 -7
  480. package/src/surfaces/welcome.ts +5 -7
  481. package/src/tabs/patch-ops.ts +4 -3
  482. package/src/tabs/project-config.ts +32 -21
  483. package/src/tabs/selection.ts +36 -8
  484. package/src/tabs/tab.ts +52 -41
  485. package/src/tabs/transact.ts +98 -53
  486. package/src/types.ts +32 -17
  487. package/src/ui/ai-credentials-form.ts +10 -13
  488. package/src/ui/ai-model-picker.ts +3 -3
  489. package/src/ui/cf-account-picker.ts +7 -9
  490. package/src/ui/color-selector.ts +9 -5
  491. package/src/ui/dynamic-slot.ts +7 -8
  492. package/src/ui/expression-editor.ts +112 -105
  493. package/src/ui/form-controls.ts +57 -48
  494. package/src/ui/formula-catalog.ts +239 -230
  495. package/src/ui/formula-chips.ts +33 -18
  496. package/src/ui/layers.ts +44 -31
  497. package/src/ui/media-picker.ts +18 -9
  498. package/src/ui/popover-surface.ts +20 -12
  499. package/src/ui/progress-modal.ts +13 -8
  500. package/src/ui/regions.ts +7 -6
  501. package/src/ui/schema-form.ts +113 -70
  502. package/src/ui/surface.ts +71 -8
  503. package/src/ui/timing.ts +9 -0
  504. package/src/ui/value-source.ts +44 -31
  505. package/src/ui/virtual-window.ts +3 -2
  506. package/src/utils/base64.ts +3 -1
  507. package/src/utils/edit-display.ts +73 -73
  508. package/src/utils/element-selectors.ts +3 -2
  509. package/src/utils/google-fonts.ts +15 -14
  510. package/src/utils/inherited-style.ts +18 -20
  511. package/src/utils/link-target.ts +1 -1
  512. package/src/utils/preview-format.ts +25 -3
  513. package/src/utils/strip-events.ts +49 -22
  514. package/src/utils/studio-utils.ts +29 -14
  515. package/src/view.ts +2 -3
  516. package/src/workspace/pane-derive.ts +10 -12
  517. package/src/workspace/session.ts +53 -43
  518. package/src/workspace/workspace.ts +40 -36
  519. package/dist/chunks/adapter-f93pafd7.js +0 -4
  520. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  521. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  522. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  523. package/dist/chunks/color-field-embq5ctg.js +0 -4
  524. package/dist/chunks/color-fpezvnkt.js +0 -4
  525. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  526. package/dist/chunks/combobox-773hdzyj.js +0 -4
  527. package/dist/chunks/components-ax2f1fnn.js +0 -4
  528. package/dist/chunks/content-source-108aqtk1.js +0 -4
  529. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  530. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  531. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  532. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  533. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  534. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  535. package/dist/chunks/files-44vp8a2s.js +0 -4
  536. package/dist/chunks/format-host-7q1petb9.js +0 -4
  537. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  538. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  539. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  540. package/dist/chunks/icons-p44xhjf0.js +0 -4
  541. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  542. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  543. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  544. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  545. package/dist/chunks/index-wkyfjeqz.js +0 -4
  546. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  547. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  548. package/dist/chunks/layers-xd92fg8d.js +0 -4
  549. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  550. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  551. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  552. package/dist/chunks/menu-37d07z9m.js +0 -4
  553. package/dist/chunks/menu-5c55ea3d.js +0 -4
  554. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  555. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  556. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  557. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  558. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  559. package/dist/chunks/parse-897fvqah.js +0 -4
  560. package/dist/chunks/platform-v1qctbe6.js +0 -4
  561. package/dist/chunks/popover-8htra4er.js +0 -4
  562. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  563. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  564. package/dist/chunks/references-gmqp82fs.js +0 -4
  565. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  566. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  567. package/dist/chunks/select-n3v7gwas.js +0 -4
  568. package/dist/chunks/split-pff8f3ze.js +0 -4
  569. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  570. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  571. package/dist/chunks/studio-1b04pd0j.js +0 -64
  572. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  573. package/dist/chunks/studio-4tanh828.js +0 -5
  574. package/dist/chunks/studio-55h4mstj.js +0 -4
  575. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  576. package/dist/chunks/studio-60dqgb0c.js +0 -5
  577. package/dist/chunks/studio-61dp09qg.js +0 -9
  578. package/dist/chunks/studio-63epcrj2.js +0 -5
  579. package/dist/chunks/studio-74k29dy9.js +0 -5
  580. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  581. package/dist/chunks/studio-7zx31knw.js +0 -9
  582. package/dist/chunks/studio-8bxk97km.js +0 -5
  583. package/dist/chunks/studio-933e30n4.js +0 -5
  584. package/dist/chunks/studio-98wnwhbg.js +0 -5
  585. package/dist/chunks/studio-9mccjwjh.js +0 -14
  586. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  587. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  588. package/dist/chunks/studio-e81q1vb9.js +0 -5
  589. package/dist/chunks/studio-epgrmqqm.js +0 -5
  590. package/dist/chunks/studio-ery42sqr.js +0 -4
  591. package/dist/chunks/studio-g1shz58g.js +0 -5
  592. package/dist/chunks/studio-gf0fz03c.js +0 -5
  593. package/dist/chunks/studio-gjtpe62q.js +0 -6
  594. package/dist/chunks/studio-gkskhg7m.js +0 -5
  595. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  596. package/dist/chunks/studio-j03zga3y.js +0 -9
  597. package/dist/chunks/studio-jhpxeckz.js +0 -5
  598. package/dist/chunks/studio-k01r7ykp.js +0 -5
  599. package/dist/chunks/studio-kk7h30ne.js +0 -7
  600. package/dist/chunks/studio-kt1zqney.js +0 -5
  601. package/dist/chunks/studio-m3cwhvye.js +0 -5
  602. package/dist/chunks/studio-mcayt6hz.js +0 -5
  603. package/dist/chunks/studio-myjcghv3.js +0 -5
  604. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  605. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  606. package/dist/chunks/studio-nj5a01jy.js +0 -928
  607. package/dist/chunks/studio-pcgz8heb.js +0 -5
  608. package/dist/chunks/studio-qcsq0t15.js +0 -5
  609. package/dist/chunks/studio-qkstvve9.js +0 -5
  610. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  611. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  612. package/dist/chunks/studio-s8dmmz66.js +0 -5
  613. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  614. package/dist/chunks/studio-szsjbj0g.js +0 -5
  615. package/dist/chunks/studio-t1xzawhr.js +0 -16
  616. package/dist/chunks/studio-t6b6qe31.js +0 -5
  617. package/dist/chunks/studio-tdcprbqb.js +0 -5
  618. package/dist/chunks/studio-vyc0b4he.js +0 -10
  619. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  620. package/dist/chunks/studio-w3hskzqk.js +0 -5
  621. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  622. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  623. package/dist/chunks/studio-y6n42tgs.js +0 -5
  624. package/dist/chunks/studio-yb560vxr.js +0 -5
  625. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  626. package/dist/chunks/studio-yw05w8f0.js +0 -7
  627. package/dist/chunks/studio-z16sgavc.js +0 -5
  628. package/dist/chunks/studio-zyqn40w4.js +0 -5
  629. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  630. package/dist/chunks/tabs-jwthg40w.js +0 -4
  631. package/dist/chunks/textfield-spy3hc77.js +0 -4
  632. package/dist/chunks/toast-4d35zd64.js +0 -4
  633. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  634. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  635. package/dist/chunks/tree-h19v1jfz.js +0 -4
  636. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  637. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
@@ -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({
@@ -51,13 +51,16 @@ import type {
51
51
  GridSource,
52
52
  } from "../grid-source";
53
53
  import type { ContentSectionEntry } from "../../types";
54
+ import type { EntryFields } from "../../content/entry-fields";
55
+ import type { JxDocumentValue, JxMutableNode } from "@jxsuite/schema/types";
56
+ import { isJsonPrimitive, isNonNullObject, isString } from "@jxsuite/schema/guards";
54
57
 
55
58
  /** The synthetic identity column: the entry's project path. Editable only on pending inserts. */
56
59
  export const PATH_FIELD = "__path";
57
60
 
58
61
  interface EntryRecord {
59
- frontmatter: Record<string, unknown>;
60
- document: Record<string, unknown>;
62
+ frontmatter: EntryFields;
63
+ document: JxMutableNode;
61
64
  rawText: string;
62
65
  formatName: string;
63
66
  }
@@ -69,13 +72,17 @@ interface CollectionInfo {
69
72
  ext: string;
70
73
  }
71
74
 
75
+ /** The open project's `content` section (collection name → entry), or an empty one. */
76
+ function contentSection(): Record<string, ContentSectionEntry> {
77
+ /* SAFETY: `content` is the parser extension's section — collection name → entry object, its
78
+ project fragment schema the source of truth. `ContentSectionEntry` names only the fields Studio
79
+ reads, every one optional, and both readers below test `source` before using it. */
80
+ return (projectState?.projectConfig?.content ?? {}) as Record<string, ContentSectionEntry>;
81
+ }
82
+
72
83
  /** Resolve a content type's definition, source dir, and entry extension from project config. */
73
84
  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];
85
+ const def = contentSection()[typeName];
79
86
  if (!def?.source) {
80
87
  return null;
81
88
  }
@@ -91,11 +98,7 @@ export function collectionInfo(typeName: string): CollectionInfo | null {
91
98
 
92
99
  /** Directory-backed collections in the project (for "Edit collection in Grid" affordances). */
93
100
  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)
101
+ return Object.entries(contentSection())
99
102
  .filter(([, def]) => {
100
103
  const source = def.source?.replace(/^\.\//, "") ?? "";
101
104
  return source !== "" && !/\.[a-z0-9]+$/i.test(source);
@@ -160,14 +163,14 @@ async function mapLimit<T, R>(
160
163
  }
161
164
 
162
165
  /** 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) {
166
+ function toCellValue(value: JxDocumentValue | undefined): GridCellValue {
167
+ if (value === undefined) {
165
168
  return null;
166
169
  }
167
- if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
170
+ if (isJsonPrimitive(value)) {
168
171
  return value;
169
172
  }
170
- if (Array.isArray(value) && value.every((v) => typeof v !== "object" || v === null)) {
173
+ if (Array.isArray(value) && value.every((v) => !isNonNullObject(v))) {
171
174
  return value.map(String);
172
175
  }
173
176
  return JSON.stringify(value);
@@ -187,9 +190,7 @@ function openTabFor(path: string) {
187
190
  function extraRowsAreStrings(rows: Record<string, GridCellValue>[], field: string): boolean {
188
191
  return rows.every((row) => {
189
192
  const value = row[field];
190
- return value === null || value === undefined || typeof value !== "string"
191
- ? true
192
- : !value.startsWith("{") && !value.startsWith("[");
193
+ return !isString(value) || (!value.startsWith("{") && !value.startsWith("["));
193
194
  });
194
195
  }
195
196
 
@@ -294,7 +295,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
294
295
  return {
295
296
  document: parsed.document,
296
297
  formatName: parsed.format.name,
297
- frontmatter: parsed.frontmatter ?? {},
298
+ frontmatter: parsed.frontmatter,
298
299
  rawText: text,
299
300
  };
300
301
  } catch {
@@ -393,7 +394,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
393
394
  };
394
395
 
395
396
  const rowFor = (path: string, entry: EntryRecord): GridRow => {
396
- const cells: Record<string, GridCellValue> = { [PATH_FIELD]: path };
397
+ const cells: GridRow["cells"] = { [PATH_FIELD]: path };
397
398
  for (const column of buildColumns()) {
398
399
  if (column.field === PATH_FIELD) {
399
400
  continue;
@@ -490,7 +491,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
490
491
  // Inserts: new entry files from the Path cell.
491
492
  for (const insert of batch.inserts) {
492
493
  const rawPath = insert.cells[PATH_FIELD];
493
- if (typeof rawPath !== "string" || rawPath.trim() === "") {
494
+ if (!isString(rawPath) || rawPath.trim() === "") {
494
495
  result.inserts.push({ error: "Path is required", ok: false, tempKey: insert.tempKey });
495
496
  continue;
496
497
  }
@@ -522,7 +523,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
522
523
  continue;
523
524
  }
524
525
  try {
525
- const frontmatter: Record<string, unknown> = {};
526
+ const frontmatter: Record<string, GridCellValue> = {};
526
527
  for (const [field, value] of Object.entries(insert.cells)) {
527
528
  if (field !== PATH_FIELD && value !== null) {
528
529
  frontmatter[field] = value;
@@ -539,7 +540,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
539
540
  entries.set(path, {
540
541
  document: parsed.document,
541
542
  formatName: parsed.format.name,
542
- frontmatter: parsed.frontmatter ?? {},
543
+ frontmatter: parsed.frontmatter,
543
544
  rawText: text,
544
545
  });
545
546
  result.inserts.push({ newKey: path, ok: true, tempKey: insert.tempKey });
@@ -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,27 @@ 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
+ setFilter(filter: (data: RowData<Value>) => boolean): void;
97
118
  clearFilter(includeHeaderFilters?: boolean): void;
98
119
  redraw(force?: boolean): void;
99
120
  destroy(): void;
@@ -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
@@ -228,7 +228,10 @@ export function renderMediaMode(surface: CanvasSurface, tab: Tab): void {
228
228
  const scope = effectScope();
229
229
  const mounted = mountMediaSurface(canvasWrap, view(), {
230
230
  copyRef: () => {
231
- void navigator.clipboard?.writeText(ref);
231
+ // `navigator.clipboard` is [SecureContext]: a plain-http host has none, whatever lib.dom says.
232
+ if ("clipboard" in navigator) {
233
+ void navigator.clipboard.writeText(ref);
234
+ }
232
235
  },
233
236
  imageLoaded: (width, height) => {
234
237
  /* The only honest source of pixel dimensions in a browser is an image that has loaded, and
@@ -35,6 +35,7 @@
35
35
 
36
36
  import { actIfRequired } from "../account/action-flow";
37
37
  import { errorMessage } from "@jxsuite/schema/parse";
38
+ import { isFunction } from "@jxsuite/schema/guards";
38
39
  import {
39
40
  getAccountStatus,
40
41
  getRepoAccessLinks,
@@ -90,7 +91,7 @@ let _resolve: ((result: { root: string } | null) => void) | null = null;
90
91
  /** True when the active platform can browse + adopt existing repositories. */
91
92
  export function platformSupportsAddRepo(): boolean {
92
93
  const platform = getPlatform();
93
- return typeof platform.listRepos === "function" && typeof platform.importProject === "function";
94
+ return isFunction(platform.listRepos) && isFunction(platform.importProject);
94
95
  }
95
96
 
96
97
  /** True when the active platform routes Open Project through this repo picker. */
@@ -207,7 +208,7 @@ function loadRepos(): void {
207
208
  requestScan(_selected, "now");
208
209
  }
209
210
  })
210
- .catch((error: unknown) => {
211
+ .catch((error) => {
211
212
  _repos = [];
212
213
  _error = errorMessage(error);
213
214
  })
@@ -492,11 +493,8 @@ async function adopt(fullName: string, dir: string, retried = false): Promise<vo
492
493
  _error = "";
493
494
  redraw();
494
495
  try {
495
- const imported = await getPlatform().importProject?.({
496
- name: repo.name,
497
- owner: repo.owner,
498
- ...(dir ? { dir } : {}),
499
- });
496
+ const request = { name: repo.name, owner: repo.owner };
497
+ const imported = await getPlatform().importProject?.(dir ? { ...request, dir } : request);
500
498
  if (_handle !== handle) {
501
499
  return;
502
500
  }
@@ -604,13 +602,16 @@ function accessOf(): AddRepoView["access"] {
604
602
  ];
605
603
  }
606
604
 
607
- /** The chosen repository's pane: its state, its rows, and the sentence under the folder field. */
608
- function detailOf(repo: RepoInfo | undefined): Pick<
605
+ /** The chosen repository's pane, plus the branch it is read at. */
606
+ interface RepoDetail extends Pick<
609
607
  AddRepoView,
610
608
  "detailState" | "detailName" | "detailMeta" | "locations" | "folderHelp"
611
- > & {
609
+ > {
612
610
  branch: string;
613
- } {
611
+ }
612
+
613
+ /** The chosen repository's pane: its state, its rows, and the sentence under the folder field. */
614
+ function detailOf(repo: RepoInfo | undefined): RepoDetail {
614
615
  if (!repo) {
615
616
  return {
616
617
  branch: "",
@@ -623,12 +624,13 @@ function detailOf(repo: RepoInfo | undefined): Pick<
623
624
  }
624
625
  const scanned = _scans.get(repo.fullName);
625
626
  const branch = scanned?.status === "done" ? scanned.projects.branch : repo.defaultBranch;
627
+ const noLocations: AddRepoLocation[] = [];
626
628
  const base = {
627
629
  branch,
628
630
  detailMeta: [branch, repo.permission, ...(repo.private ? ["private"] : [])].join(" · "),
629
631
  detailName: repo.fullName,
630
632
  folderHelp: "The folder that holds project.json. Leave it empty for the repository root.",
631
- locations: [] as AddRepoLocation[],
633
+ locations: noLocations,
632
634
  };
633
635
  if (!getPlatform().listRepoProjects) {
634
636
  return { ...base, detailState: "unlisted" };
@@ -640,17 +642,16 @@ function detailOf(repo: RepoInfo | undefined): Pick<
640
642
  return { ...base, detailState: "failed" };
641
643
  }
642
644
  const { locations, truncated } = scanned.projects;
643
- return {
645
+ const detail: RepoDetail = {
644
646
  ...base,
645
647
  detailState: locations.length > 0 ? "listed" : "empty",
646
- ...(truncated
647
- ? {
648
- folderHelp:
649
- "This repository is too large to scan in full. Name the folder if its project isn't listed.",
650
- }
651
- : {}),
652
648
  locations: locations.map((location) => locationOf(location, repo)),
653
649
  };
650
+ if (truncated) {
651
+ detail.folderHelp =
652
+ "This repository is too large to scan in full. Name the folder if its project isn't listed.";
653
+ }
654
+ return detail;
654
655
  }
655
656
 
656
657
  /** Everything the dialog draws, as one record. The only place this module's state becomes a view. */
@@ -25,7 +25,9 @@ import { createModelPicker } from "../ui/ai-model-picker";
25
25
  import { destinationPath } from "./location-fields";
26
26
  import type { CreateProjectDestination, ImportBreakpointPolicy } from "../types";
27
27
 
28
- import { setPendingImportBrief } from "../services/import-seed";
28
+ import { IMPORT_MAX_BREAKPOINTS } from "@jxsuite/protocol";
29
+
30
+ import { MAX_IMPORT_DEPTH, setPendingImportBrief } from "../services/import-seed";
29
31
  import type { ImportBrief } from "../services/import-seed";
30
32
 
31
33
  /** The three answers the Breakpoints control offers. */
@@ -34,17 +36,6 @@ type BreakpointMode = "all" | "limit" | "explicit";
34
36
  /** How a kept width matches one the site declared. */
35
37
  type BreakpointRounding = "nearest" | "down" | "up";
36
38
 
37
- /** The most breakpoints the control will offer to keep — `@jxsuite/import`'s own ceiling. */
38
- const MAX_BREAKPOINTS = 12;
39
-
40
- /**
41
- * The deepest crawl the pipeline accepts.
42
- *
43
- * The field said 2 while `import_site` and the endpoint both clamped to 5, so the wizard could not
44
- * ask for a depth the backend was willing to run.
45
- */
46
- const MAX_DEPTH = 5;
47
-
48
39
  export interface ImportTabCtx {
49
40
  /** The wizard's shared name/directory state (the import destination slug). */
50
41
  form: { name: string; directory: string };
@@ -383,8 +374,8 @@ export function importView(ctx: ImportTabCtx): ImportView {
383
374
  canVerify: canVerify(),
384
375
  depth: String(_depth),
385
376
  error: _errorMsg,
386
- maxBreakpoints: String(MAX_BREAKPOINTS),
387
- maxDepth: String(MAX_DEPTH),
377
+ maxBreakpoints: String(IMPORT_MAX_BREAKPOINTS),
378
+ maxDepth: String(MAX_IMPORT_DEPTH),
388
379
  maxPages: String(_maxPages),
389
380
  minFidelity: String(_minFidelity),
390
381
  prompt: _prompt,
@@ -438,6 +429,8 @@ export function setImportMaxPages(value: string): void {
438
429
 
439
430
  /** Which of the three breakpoint answers the reader chose. */
440
431
  export function setBreakpointMode(value: string): void {
432
+ /* SAFETY: Studio's one caller is the `bp-mode` select's change handler (surfaces/new-project.json),
433
+ and that select's options are `importView().breakpointModes`: "limit", "explicit" and "all". */
441
434
  _breakpointMode = value as BreakpointMode;
442
435
  }
443
436
 
@@ -453,6 +446,9 @@ export function setBreakpointWidths(value: string): void {
453
446
 
454
447
  /** Which declared width backs a kept one. */
455
448
  export function setBreakpointRounding(value: string): void {
449
+ /* SAFETY: Studio's one caller is the `bp-rounding` select's change handler (surfaces/
450
+ new-project.json), and that select's options are `importView().roundings`: "nearest", "down"
451
+ and "up". */
456
452
  _breakpointRounding = value as BreakpointRounding;
457
453
  }
458
454
 
@@ -22,6 +22,7 @@
22
22
  */
23
23
 
24
24
  import { errorMessage } from "@jxsuite/schema/parse";
25
+ import { isFunction } from "@jxsuite/schema/guards";
25
26
  import { getPlatform } from "../platform";
26
27
  import type { CreateProjectDestination, RepoInfo } from "../types";
27
28
 
@@ -211,7 +212,7 @@ export function locationView(slug: string): LocationView {
211
212
  return {
212
213
  browseLabel: _browsing ? "Choosing…" : "Browse…",
213
214
  browsing: _browsing,
214
- canBrowse: typeof platform.pickDirectory === "function",
215
+ canBrowse: isFunction(platform.pickDirectory),
215
216
  destination: isRepo ? "repo" : "path",
216
217
  error: _error,
217
218
  owner: _owner,