@jxsuite/studio 5.3.0 → 5.4.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 (389) hide show
  1. package/data/css-meta.json +28 -27
  2. package/dist/chunks/{cf-account-picker-nwnwdm6p.js → cf-account-picker-3f08rry6.js} +21 -18
  3. package/dist/chunks/{cf-settings-adg74qsk.js → cf-settings-m79r7p5y.js} +4 -4
  4. package/dist/chunks/{components-5y78e05d.js → components-xm826zjw.js} +3 -3
  5. package/dist/chunks/{content-source-4rzvmp0m.js → content-source-jt7rbcbc.js} +22 -22
  6. package/dist/chunks/{convert-to-repeater-jxsv62v7.js → convert-to-repeater-vg38bq99.js} +22 -22
  7. package/dist/chunks/{editor-3qhbg51x.js → editor-ddy019sn.js} +2 -2
  8. package/dist/chunks/entry-commands-64nb2a9a.js +42 -0
  9. package/dist/chunks/{extension-sections-2mrptyek.js → extension-sections-r73an5s6.js} +30 -29
  10. package/dist/chunks/{file-ops-knfqshrm.js → file-ops-3xan8mnj.js} +21 -21
  11. package/dist/chunks/{files-y6fr4he9.js → files-egsb0ry8.js} +28 -28
  12. package/dist/chunks/{format-host-1k4qrcqd.js → format-host-mym8qnd0.js} +3 -3
  13. package/dist/chunks/{fs-events-3y6y0nrm.js → fs-events-z2gg8qjt.js} +4 -4
  14. package/dist/chunks/{git-panel-2rkrsjva.js → git-panel-a05atk6q.js} +20 -20
  15. package/dist/chunks/{grid-view-1p6hsyjx.css → grid-view-3g1h2re8.css} +956 -139
  16. package/dist/chunks/{grid-view-a7b87n2c.js → grid-view-qaqer9kr.js} +24 -24
  17. package/dist/chunks/{icons-yy10wk9r.js → icons-drxq9q10.js} +8 -2
  18. package/dist/chunks/{iframe-host-scpw01h8.js → iframe-host-psetcv20.js} +11 -11
  19. package/dist/chunks/{index-n4j7qxyr.js → index-9yjae3hz.js} +4 -4
  20. package/dist/chunks/{javascript-4abzjcy9.css → javascript-bc9z461d.css} +688 -54
  21. package/dist/chunks/{javascript-xvrfrpkb.js → javascript-hr5sg57n.js} +2 -2
  22. package/dist/chunks/{jsonMode-vvmpmk34.css → jsonMode-qqd9nm1t.css} +1120 -303
  23. package/dist/chunks/{jsonMode-tyx2kj6p.js → jsonMode-zs88v0wr.js} +4 -4
  24. package/dist/chunks/layers-panel-83a16ytx.js +41 -0
  25. package/dist/chunks/{layers-jnvdbqva.js → layers-s6mc01ry.js} +3 -3
  26. package/dist/chunks/{media-picker-f66nav16.js → media-picker-nhn6rv4w.js} +11 -11
  27. package/dist/chunks/{menu-1dfhry4s.js → menu-8j4qxjrp.js} +4 -4
  28. package/dist/chunks/{monaco-binding-sw6en4dw.js → monaco-binding-e8d9wzyk.js} +3 -3
  29. package/dist/chunks/{monaco-buffer-pykwbm92.js → monaco-buffer-jaq1t9zj.js} +2 -2
  30. package/dist/chunks/{monaco-setup-8vbyqnhr.css → monaco-setup-ey9cjcm3.css} +954 -137
  31. package/dist/chunks/{monaco-setup-km6abc6q.js → monaco-setup-gsjdysze.js} +6 -6
  32. package/dist/chunks/{platform-ts9cg1a4.js → platform-fnchmhy7.js} +5 -3
  33. package/dist/chunks/publish-panel-ak6hxfma.js +27 -0
  34. package/dist/chunks/quick-search-c63mkt3b.js +47 -0
  35. package/dist/chunks/{references-h69xp9zz.js → references-f7bdv3z5.js} +3 -3
  36. package/dist/chunks/right-panel-t5n8wttg.js +45 -0
  37. package/dist/chunks/{studio-ze46gzjh.js → studio-01269reb.js} +7 -7
  38. package/dist/chunks/{studio-rnyf3f8e.js → studio-0a4gncx0.js} +3 -3
  39. package/dist/chunks/{studio-e1f24eff.js → studio-0d4p4wxj.js} +6778 -2993
  40. package/dist/chunks/{studio-4wbb9ct0.js → studio-1tejxvba.js} +3006 -1855
  41. package/dist/chunks/{studio-d1n2bykn.js → studio-3nprwbd9.js} +117 -25
  42. package/dist/chunks/{studio-4c041r8y.js → studio-40z39dme.js} +3 -3
  43. package/dist/chunks/{studio-151w0xnh.js → studio-482eeazk.js} +20 -20
  44. package/dist/chunks/{studio-cgprcdxn.js → studio-4998spet.js} +10 -9
  45. package/dist/chunks/{studio-nq5yf5mp.js → studio-557bmn0x.js} +2 -2
  46. package/dist/chunks/{studio-rtskkm43.js → studio-5w26wza5.js} +3 -3
  47. package/dist/chunks/{studio-6nzaktvy.js → studio-6pwn9j8c.js} +6 -3
  48. package/dist/chunks/{studio-wnsyffg1.js → studio-6vg0x5fz.js} +3 -2
  49. package/dist/chunks/{studio-vn5hske5.js → studio-7d3c1m59.js} +12 -5
  50. package/dist/chunks/{studio-6gryj0sg.js → studio-9vsvz7w7.js} +6 -6
  51. package/dist/chunks/{studio-50wfwy44.js → studio-9wm0xzpf.js} +19 -19
  52. package/dist/chunks/{studio-0j7r7s9g.js → studio-ag3z6shb.js} +10 -4
  53. package/dist/chunks/studio-aj9drheq.js +177 -0
  54. package/dist/chunks/{studio-xajk70w0.js → studio-apv9x70c.js} +189 -130
  55. package/dist/chunks/{studio-c04nzbby.js → studio-b9q3znz8.js} +2 -2
  56. package/dist/chunks/{studio-nfx354t1.js → studio-bh47w0cy.js} +9 -10
  57. package/dist/chunks/{studio-gk2twyh4.js → studio-dgdm6vvt.js} +264 -52
  58. package/dist/chunks/{studio-gtfq1dkz.js → studio-dwdcr2e8.js} +4 -4
  59. package/dist/chunks/{studio-nqgawfks.js → studio-fbcyz234.js} +146 -139
  60. package/dist/chunks/{studio-27q131j3.js → studio-fqpkpq1t.js} +7 -4
  61. package/dist/chunks/{studio-c0qgc3tn.js → studio-fy320dfc.js} +62 -68
  62. package/dist/chunks/{studio-zjjde71a.js → studio-gjj4bbfx.js} +2 -2
  63. package/dist/chunks/{studio-g33v4fe9.js → studio-jfhxy8h3.js} +7 -7
  64. package/dist/chunks/{studio-ab87phj1.js → studio-kwewmhhq.js} +4 -4
  65. package/dist/chunks/{studio-7rrb1esn.js → studio-m58xn8at.js} +25 -24
  66. package/dist/chunks/{studio-fzjx96t2.js → studio-mfkh1q8d.js} +17 -17
  67. package/dist/chunks/{studio-drg8qj9k.js → studio-mrh0a92f.js} +17 -17
  68. package/dist/chunks/{studio-jt27ta6x.js → studio-mt79tn56.js} +3 -3
  69. package/dist/chunks/{studio-b66rsh78.js → studio-ne593z1j.js} +38 -31
  70. package/dist/chunks/{studio-h4nvnjvz.js → studio-ptfcxkz5.js} +418 -232
  71. package/dist/chunks/{studio-dd1qqkry.js → studio-qxye31h7.js} +7 -7
  72. package/dist/chunks/{studio-ye9drbk8.js → studio-rav5bpmp.js} +73 -52
  73. package/dist/chunks/{studio-6kvgrkrp.js → studio-rwmmbrth.js} +6 -6
  74. package/dist/chunks/{studio-b7xacrwe.js → studio-sceg8ws0.js} +8 -8
  75. package/dist/chunks/{studio-msc1ee1m.js → studio-sjas5b3a.js} +19 -13
  76. package/dist/chunks/{studio-a65w20ex.js → studio-vd67b66d.js} +3 -3
  77. package/dist/chunks/{studio-7144epdr.js → studio-w475cbf9.js} +10 -10
  78. package/dist/chunks/{studio-4f3psrk1.js → studio-w7gpcvfj.js} +9 -9
  79. package/dist/chunks/{studio-nsgw7dbk.js → studio-xrbfdxgk.js} +7 -7
  80. package/dist/chunks/{studio-ke09tn9k.js → studio-y49b6mjv.js} +35 -35
  81. package/dist/chunks/{studio-j0w60gft.js → studio-ygvr9e4q.js} +10 -10
  82. package/dist/chunks/{studio-z2smx5ce.js → studio-yxmmjy2a.js} +9 -6
  83. package/dist/chunks/{tsMode-jy4m86rv.js → tsMode-ay4c78ne.js} +4 -4
  84. package/dist/chunks/{tsMode-hnxxb73h.css → tsMode-c72wyz27.css} +954 -137
  85. package/dist/chunks/{workspace-np10mayv.js → workspace-b9k2frks.js} +5 -5
  86. package/dist/chunks/{ws-client-ny4zc51r.js → ws-client-erze4czt.js} +356 -20
  87. package/dist/codicon.ttf +0 -0
  88. package/dist/iframe-entry.js +18 -16
  89. package/dist/studio.css +956 -139
  90. package/dist/studio.js +1453 -830
  91. package/dist/workers/editor.worker.js +196 -107
  92. package/dist/workers/json.worker.js +196 -107
  93. package/dist/workers/ts.worker.js +196 -107
  94. package/package.json +15 -14
  95. package/src/about/about-modal.ts +4 -3
  96. package/src/browse/library-commands.ts +15 -13
  97. package/src/browse/library-pane.ts +2 -2
  98. package/src/canvas/canvas-render.ts +97 -83
  99. package/src/canvas/canvas-surface.ts +2 -2
  100. package/src/canvas/canvas-utils.ts +42 -32
  101. package/src/canvas/diff-toolbar.ts +21 -2
  102. package/src/canvas/diff-view.ts +30 -6
  103. package/src/canvas/iframe-entry.ts +2 -2
  104. package/src/canvas/iframe-host.ts +5 -5
  105. package/src/canvas/iframe-interaction.ts +7 -6
  106. package/src/canvas/iframe-overlay.ts +1 -1
  107. package/src/canvas/iframe-protocol.ts +6 -5
  108. package/src/canvas/iframe-render.ts +3 -3
  109. package/src/canvas/popover-state.ts +1 -1
  110. package/src/canvas/stage-scrollbar.ts +112 -0
  111. package/src/canvas/surface-registry.ts +9 -2
  112. package/src/collab/collab-commands.ts +8 -6
  113. package/src/collab/collab-session.ts +4 -4
  114. package/src/collab/collab-state.ts +4 -4
  115. package/src/collab/presence-chips.ts +3 -3
  116. package/src/commands/app-commands.ts +7 -7
  117. package/src/commands/budget.ts +17 -16
  118. package/src/commands/command-args.ts +10 -9
  119. package/src/commands/context.ts +20 -10
  120. package/src/commands/defaults.ts +30 -29
  121. package/src/commands/levels.ts +8 -6
  122. package/src/commands/live-context.ts +12 -10
  123. package/src/commands/reference.ts +5 -5
  124. package/src/commands/registry.ts +2 -2
  125. package/src/content/draft-state.ts +9 -8
  126. package/src/content/entry-commands.ts +16 -14
  127. package/src/content/entry-editor.ts +2 -2
  128. package/src/content/entry-fields.ts +1 -1
  129. package/src/editor/context-menu.ts +4 -4
  130. package/src/editor/convert-to-component.ts +6 -5
  131. package/src/editor/inline-edit.ts +3 -3
  132. package/src/editor/shortcuts.ts +88 -20
  133. package/src/editor/slash-menu.ts +11 -10
  134. package/src/files/elements.ts +4 -5
  135. package/src/files/file-ops.ts +1 -1
  136. package/src/files/files.ts +21 -17
  137. package/src/files/serialize-document.ts +1 -1
  138. package/src/format/convert-file.ts +5 -5
  139. package/src/github/github-auth-status.ts +107 -0
  140. package/src/github/github-auth.ts +18 -82
  141. package/src/github/github-publish.ts +7 -6
  142. package/src/grid/cell-editors.ts +8 -7
  143. package/src/grid/grid-layout.ts +1 -1
  144. package/src/grid/grid-open.ts +6 -5
  145. package/src/grid/grid-panel.ts +13 -12
  146. package/src/grid/redirects-grid.ts +14 -11
  147. package/src/grid/redirects.ts +10 -5
  148. package/src/grid/sources/content-source.ts +10 -9
  149. package/src/hosting/document.ts +28 -1
  150. package/src/hosting/stage.ts +15 -4
  151. package/src/i18n/i18n-commands.ts +9 -7
  152. package/src/new-project/location-fields.ts +16 -3
  153. package/src/new-project/new-project-modal.ts +23 -7
  154. package/src/page-params.ts +6 -6
  155. package/src/panels/activity-panel.ts +11 -10
  156. package/src/panels/ai-chat/chat-view.ts +27 -14
  157. package/src/panels/ai-chat/composer.ts +10 -3
  158. package/src/panels/ai-panel.ts +87 -29
  159. package/src/panels/block-action-bar.ts +59 -33
  160. package/src/panels/bottom-dock.ts +22 -22
  161. package/src/panels/data-explorer.ts +9 -9
  162. package/src/panels/data-grid.ts +1 -1
  163. package/src/panels/editors.ts +8 -8
  164. package/src/panels/elements-panel.ts +7 -8
  165. package/src/panels/empty-state.ts +1 -1
  166. package/src/panels/events-panel.ts +13 -12
  167. package/src/panels/formula-workspace.ts +8 -5
  168. package/src/panels/frontmatter-fields.ts +4 -1
  169. package/src/panels/frontmatter-panel.ts +18 -18
  170. package/src/panels/git-panel.ts +19 -13
  171. package/src/panels/head-panel.ts +9 -10
  172. package/src/panels/i18n-panel.ts +6 -4
  173. package/src/panels/imports-panel.ts +1 -1
  174. package/src/panels/jump-bar.ts +20 -18
  175. package/src/panels/layers-panel.ts +19 -17
  176. package/src/panels/left-panel.ts +3 -3
  177. package/src/panels/navigator-panels.ts +8 -8
  178. package/src/panels/overlays.ts +1 -1
  179. package/src/panels/pane-context.ts +56 -28
  180. package/src/panels/pane-grid.ts +9 -8
  181. package/src/panels/panel-registry.ts +47 -19
  182. package/src/panels/problems-panel.ts +11 -12
  183. package/src/panels/properties-panel.ts +21 -20
  184. package/src/panels/provenance.ts +3 -3
  185. package/src/panels/quick-search.ts +15 -11
  186. package/src/panels/right-panel.ts +4 -3
  187. package/src/panels/seo-modal.ts +5 -4
  188. package/src/panels/settings-menu.ts +9 -9
  189. package/src/panels/settings-pane.ts +3 -3
  190. package/src/panels/signals-panel.ts +16 -9
  191. package/src/panels/statement-editor.ts +12 -9
  192. package/src/panels/style-panel.ts +45 -41
  193. package/src/panels/stylebook-panel.ts +0 -1
  194. package/src/panels/tab-strip.ts +26 -23
  195. package/src/platform-errors.ts +2 -2
  196. package/src/platform.ts +44 -4
  197. package/src/platforms/cloud.ts +11 -1
  198. package/src/platforms/default-platform.ts +141 -4
  199. package/src/platforms/devserver.ts +23 -3
  200. package/src/publish/deploy-checklist.ts +11 -10
  201. package/src/publish/publish-commands.ts +9 -8
  202. package/src/services/a11y-report.ts +1 -1
  203. package/src/services/ai-ask.ts +39 -16
  204. package/src/services/ai-command-tools.ts +28 -14
  205. package/src/services/ai-import-tools.ts +43 -29
  206. package/src/services/ai-project-tools.ts +20 -38
  207. package/src/services/ai-settings.ts +55 -2
  208. package/src/services/ai-tools.ts +69 -58
  209. package/src/services/ai-write-report.ts +4 -4
  210. package/src/services/ai-writes.ts +74 -55
  211. package/src/services/automation.ts +12 -12
  212. package/src/services/clock.ts +2 -1
  213. package/src/services/connection.ts +2 -2
  214. package/src/services/context-manager.ts +69 -6
  215. package/src/services/directory-picker.ts +93 -27
  216. package/src/services/document-assistant.ts +86 -17
  217. package/src/services/gated-registry.ts +4 -3
  218. package/src/services/idle.ts +5 -4
  219. package/src/services/live-surfaces.ts +2 -1
  220. package/src/services/notify.ts +9 -7
  221. package/src/services/popover-report.ts +3 -3
  222. package/src/services/preview-eval.ts +1 -1
  223. package/src/services/project-adoption.ts +34 -1
  224. package/src/services/project-path.ts +53 -0
  225. package/src/services/settings/kernel.ts +13 -2
  226. package/src/services/tool-executor.ts +135 -30
  227. package/src/services/tool-outcomes.ts +143 -0
  228. package/src/settings/contexts-section.ts +8 -8
  229. package/src/settings/contributed-section.ts +6 -6
  230. package/src/settings/css-vars-editor.ts +6 -5
  231. package/src/settings/extension-commands.ts +19 -18
  232. package/src/settings/extension-sections.ts +7 -7
  233. package/src/settings/extensions-section.ts +3 -3
  234. package/src/settings/general-settings.ts +21 -18
  235. package/src/settings/preferences-accounts.ts +3 -3
  236. package/src/settings/preferences-dialog.ts +9 -8
  237. package/src/settings/preferences-sections.ts +1 -1
  238. package/src/settings/project-sections.ts +2 -2
  239. package/src/settings/section-registry.ts +7 -6
  240. package/src/settings/settings-document.ts +41 -43
  241. package/src/shell/tree.ts +29 -0
  242. package/src/shell.ts +63 -55
  243. package/src/site-context.ts +1 -1
  244. package/src/store.ts +2 -2
  245. package/src/studio.ts +46 -28
  246. package/src/style/live-preview.ts +8 -8
  247. package/src/style/project-styles.ts +8 -9
  248. package/src/style/token-ref.ts +2 -2
  249. package/src/surfaces/about.json +6 -2
  250. package/src/surfaces/add-repo.json +2 -2
  251. package/src/surfaces/add-repo.ts +2 -2
  252. package/src/surfaces/ai-chat.json +14 -6
  253. package/src/surfaces/ai-chat.ts +4 -2
  254. package/src/surfaces/ai-credentials-form.json +53 -49
  255. package/src/surfaces/ai-credentials-form.ts +18 -4
  256. package/src/surfaces/ai-managed-connect.json +4 -4
  257. package/src/surfaces/block-action-bar.json +4 -4
  258. package/src/surfaces/block-action-bar.ts +3 -3
  259. package/src/surfaces/boot-failure.json +228 -0
  260. package/src/surfaces/boot-failure.ts +156 -0
  261. package/src/surfaces/bottom-dock.json +1 -1
  262. package/src/surfaces/canvas-stage.json +9 -40
  263. package/src/surfaces/canvas-stage.ts +9 -9
  264. package/src/surfaces/cf-account-picker.json +11 -8
  265. package/src/surfaces/commandbar.ts +11 -10
  266. package/src/surfaces/convert-repeater.ts +3 -2
  267. package/src/surfaces/dialog.json +7 -1
  268. package/src/surfaces/dialog.ts +2 -2
  269. package/src/surfaces/doc-header.json +6 -13
  270. package/src/surfaces/doc-header.ts +4 -5
  271. package/src/surfaces/entry-editor.json +1 -1
  272. package/src/surfaces/entry-editor.ts +2 -1
  273. package/src/surfaces/expression-editor.json +5 -5
  274. package/src/surfaces/files-panel.json +4 -3
  275. package/src/surfaces/files-panel.ts +1 -1
  276. package/src/surfaces/formula-palette.json +2 -2
  277. package/src/surfaces/formula-palette.ts +1 -1
  278. package/src/surfaces/git-panel.json +167 -109
  279. package/src/surfaces/git-panel.ts +2 -2
  280. package/src/surfaces/github-auth.json +2 -1
  281. package/src/surfaces/github-publish.ts +3 -3
  282. package/src/surfaces/grid-open.json +1 -1
  283. package/src/surfaces/grid-panel.json +2 -2
  284. package/src/surfaces/grid-views.json +1 -1
  285. package/src/surfaces/inspector-dock.json +2 -2
  286. package/src/surfaces/jump-bar.json +1 -1
  287. package/src/surfaces/jump-bar.ts +1 -1
  288. package/src/surfaces/library-pane.ts +2 -1
  289. package/src/surfaces/logic-panel.json +7 -7
  290. package/src/surfaces/logic-panel.ts +6 -4
  291. package/src/surfaces/logic-workspace.json +2 -2
  292. package/src/surfaces/logic-workspace.ts +2 -2
  293. package/src/surfaces/media-browser.ts +3 -3
  294. package/src/surfaces/media-pane.ts +2 -1
  295. package/src/surfaces/menu.ts +5 -5
  296. package/src/surfaces/new-project.json +1 -1
  297. package/src/surfaces/pane-context.json +86 -57
  298. package/src/surfaces/pane-context.ts +2 -1
  299. package/src/surfaces/pane-grid.json +3 -3
  300. package/src/surfaces/panel-activity.json +2 -1
  301. package/src/surfaces/panel-deploy-checklist.json +1 -1
  302. package/src/surfaces/panel-elements.ts +2 -1
  303. package/src/surfaces/panel-i18n.ts +2 -1
  304. package/src/surfaces/panel-outline.json +1 -1
  305. package/src/surfaces/panel-outline.ts +4 -3
  306. package/src/surfaces/panel-page.json +2 -2
  307. package/src/surfaces/panel-page.ts +4 -1
  308. package/src/surfaces/panel-problems.json +4 -3
  309. package/src/surfaces/panel-problems.ts +2 -2
  310. package/src/surfaces/panel-signals.json +23 -8
  311. package/src/surfaces/panel-signals.ts +5 -1
  312. package/src/surfaces/panel-stylebook-layers.json +1 -1
  313. package/src/surfaces/panel-stylebook-layers.ts +2 -2
  314. package/src/surfaces/preferences.json +21 -8
  315. package/src/surfaces/preferences.ts +9 -1
  316. package/src/surfaces/properties-panel.json +4 -4
  317. package/src/surfaces/properties-panel.ts +2 -2
  318. package/src/surfaces/publish.json +1 -1
  319. package/src/surfaces/publish.ts +2 -1
  320. package/src/surfaces/push-plan.json +4 -3
  321. package/src/surfaces/rail.json +2 -2
  322. package/src/surfaces/rail.ts +10 -4
  323. package/src/surfaces/reference-field.json +1 -1
  324. package/src/surfaces/schema-form.json +2 -2
  325. package/src/surfaces/schema-form.ts +1 -1
  326. package/src/surfaces/seo.json +1 -1
  327. package/src/surfaces/seo.ts +2 -2
  328. package/src/surfaces/settings-contributed.ts +2 -1
  329. package/src/surfaces/settings-css-vars.json +4 -4
  330. package/src/surfaces/settings-deploy.json +4 -4
  331. package/src/surfaces/settings-deploy.ts +2 -1
  332. package/src/surfaces/settings-extensions.json +6 -6
  333. package/src/surfaces/settings-extensions.ts +6 -2
  334. package/src/surfaces/settings-locales.json +4 -4
  335. package/src/surfaces/settings-overview.ts +2 -1
  336. package/src/surfaces/settings-pane.ts +3 -2
  337. package/src/surfaces/settings-rawjson.ts +1 -1
  338. package/src/surfaces/slash-menu.ts +4 -4
  339. package/src/surfaces/statements.json +3 -3
  340. package/src/surfaces/statusbar.ts +23 -23
  341. package/src/surfaces/style-panel.json +9 -5
  342. package/src/surfaces/style-panel.ts +3 -3
  343. package/src/surfaces/tab-strip.json +2 -2
  344. package/src/surfaces/target-line.json +1 -1
  345. package/src/surfaces/target-line.ts +12 -10
  346. package/src/surfaces/welcome.json +7 -2
  347. package/src/tabs/doc-op-apply.ts +5 -5
  348. package/src/tabs/patch-ops.ts +3 -3
  349. package/src/tabs/project-config.ts +10 -10
  350. package/src/tabs/selection.ts +1 -1
  351. package/src/tabs/tab.ts +13 -14
  352. package/src/tabs/transact.ts +18 -24
  353. package/src/types.ts +27 -3
  354. package/src/ui/ai-credentials-form.ts +74 -16
  355. package/src/ui/ai-managed-connect.ts +68 -19
  356. package/src/ui/color-selector.ts +1 -1
  357. package/src/ui/expression-editor.ts +3 -3
  358. package/src/ui/form-controls.ts +6 -5
  359. package/src/ui/formula-catalog.ts +4 -4
  360. package/src/ui/formula-chips.ts +2 -2
  361. package/src/ui/layers.ts +20 -18
  362. package/src/ui/panel-resize.ts +5 -5
  363. package/src/ui/popover-surface.ts +2 -2
  364. package/src/ui/progress-modal.ts +3 -3
  365. package/src/ui/regions.ts +14 -9
  366. package/src/ui/schema-form.ts +10 -9
  367. package/src/ui/timing.ts +9 -7
  368. package/src/ui/value-source.ts +4 -4
  369. package/src/ui/virtual-window.ts +1 -1
  370. package/src/utils/base64.ts +20 -1
  371. package/src/utils/canvas-media.ts +1 -1
  372. package/src/utils/studio-utils.ts +0 -31
  373. package/src/view.ts +4 -3
  374. package/src/workspace/pane-derive.ts +14 -13
  375. package/src/workspace/session.ts +7 -6
  376. package/src/workspace/workspace.ts +49 -39
  377. package/styles/canvas.css +1 -27
  378. package/styles/inspector.css +4 -3
  379. package/styles/overlays.css +1 -1
  380. package/styles/tokens.css +17 -1
  381. package/styles/tokens.json +6 -1
  382. package/dist/chunks/entry-commands-1wnsqn5d.js +0 -42
  383. package/dist/chunks/layers-panel-73gfkcga.js +0 -41
  384. package/dist/chunks/publish-panel-z1zd2da1.js +0 -27
  385. package/dist/chunks/quick-search-zdv7h8ht.js +0 -47
  386. package/dist/chunks/right-panel-889vbnm5.js +0 -45
  387. package/dist/chunks/studio-727xh0e3.js +0 -76
  388. package/src/files/json-layout.ts +0 -474
  389. package/src/services/ai-turn-signal.ts +0 -70
@@ -2,23 +2,23 @@ import {
2
2
  githubTokenStored,
3
3
  githubTokenLocation,
4
4
  clearGithubToken
5
- } from "./studio-msc1ee1m.js";
5
+ } from "./studio-sjas5b3a.js";
6
6
  import {
7
7
  getPlatform2,
8
8
  hasPlatform2
9
- } from "./studio-6nzaktvy.js";
9
+ } from "./studio-6pwn9j8c.js";
10
10
  import {
11
11
  getCfToken2,
12
12
  getCfAccountId2,
13
13
  clearCfConnection2
14
- } from "./studio-c04nzbby.js";
14
+ } from "./studio-b9q3znz8.js";
15
15
  import {
16
16
  hasOpenAiKey,
17
17
  getBaseUrl,
18
18
  clearAiProvider,
19
19
  resetModelCache,
20
20
  preferredModel
21
- } from "./studio-vn5hske5.js";
21
+ } from "./studio-7d3c1m59.js";
22
22
  import {
23
23
  __preload
24
24
  } from "./studio-5te5tqng.js";
@@ -56,7 +56,7 @@ function resetCfConnectionCache() {
56
56
  async function hostedConnect() {
57
57
  const outcome = await getPlatform2().cfConnect?.();
58
58
  if (outcome?.status === "connected" && !outcome.connection.accountId) {
59
- const { openCfAccountPicker } = await (__preload("nwnwdm6p"), import("./cf-account-picker-nwnwdm6p.js"));
59
+ const { openCfAccountPicker } = await (__preload("3f08rry6"), import("./cf-account-picker-3f08rry6.js"));
60
60
  await openCfAccountPicker();
61
61
  }
62
62
  resetModelCache();
@@ -111,7 +111,7 @@ function brokeredCloudflareRecord() {
111
111
  id: "choose-account",
112
112
  label: "Choose account",
113
113
  run: async () => {
114
- const { openCfAccountPicker } = await (__preload("nwnwdm6p"), import("./cf-account-picker-nwnwdm6p.js"));
114
+ const { openCfAccountPicker } = await (__preload("3f08rry6"), import("./cf-account-picker-3f08rry6.js"));
115
115
  if (await openCfAccountPicker()) {
116
116
  resetModelCache();
117
117
  await refreshCfConnection();
@@ -192,4 +192,4 @@ function notifyCredentialsChanged() {
192
192
  export { platformBrokersCf, refreshCfConnection, ensureCfConnection, resetCfConnectionCache, listAccounts, revokeAccount, onCredentialsChanged, notifyCredentialsChanged };
193
193
 
194
194
  //# debugId=5A4E8AE3D8A598C464756E2164756E21
195
- //# sourceMappingURL=studio-dd1qqkry.js.map
195
+ //# sourceMappingURL=studio-qxye31h7.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getPlatform2
3
- } from "./studio-6nzaktvy.js";
3
+ } from "./studio-6pwn9j8c.js";
4
4
  import {
5
5
  isJsonObject,
6
6
  isRef,
@@ -21,7 +21,7 @@ import {
21
21
  } from "./studio-m1p9b6c3.js";
22
22
  import {
23
23
  componentRegistry2
24
- } from "./studio-zjjde71a.js";
24
+ } from "./studio-gjj4bbfx.js";
25
25
  import {
26
26
  tabOfPane,
27
27
  canvasModeOfTab,
@@ -32,7 +32,7 @@ import {
32
32
  attachInstruction,
33
33
  extractInstruction,
34
34
  requestCanvasEval2
35
- } from "./studio-drg8qj9k.js";
35
+ } from "./studio-mrh0a92f.js";
36
36
  import {
37
37
  effectScope,
38
38
  effect,
@@ -49,13 +49,7 @@ import {
49
49
  cancelBufferWrites2,
50
50
  bufferIsLive2,
51
51
  bufferMovedOn2
52
- } from "./studio-wnsyffg1.js";
53
- import {
54
- loadMonaco,
55
- mountStillWanted,
56
- loadExtensions2,
57
- getExtensions2
58
- } from "./studio-6gryj0sg.js";
52
+ } from "./studio-6vg0x5fz.js";
59
53
  import {
60
54
  localeLabel,
61
55
  translationPathFor,
@@ -94,7 +88,13 @@ import {
94
88
  insertIntoPane2,
95
89
  tabIsLive2,
96
90
  promoteTab2
97
- } from "./studio-gk2twyh4.js";
91
+ } from "./studio-dgdm6vvt.js";
92
+ import {
93
+ loadMonaco,
94
+ mountStillWanted,
95
+ loadExtensions2,
96
+ getExtensions2
97
+ } from "./studio-9vsvz7w7.js";
98
98
  import {
99
99
  PURE_METHOD_OPS,
100
100
  BLESSED_OPERATORS,
@@ -104,7 +104,7 @@ import {
104
104
  popoverIdsIn,
105
105
  POPOVER_TAGS,
106
106
  activeRegistry
107
- } from "./studio-d1n2bykn.js";
107
+ } from "./studio-3nprwbd9.js";
108
108
  import {
109
109
  getEffectiveMedia,
110
110
  getEffectiveStyle,
@@ -113,7 +113,7 @@ import {
113
113
  shell,
114
114
  monacoTheme,
115
115
  setBottomTab
116
- } from "./studio-fzjx96t2.js";
116
+ } from "./studio-mfkh1q8d.js";
117
117
  import {
118
118
  nothing2
119
119
  } from "./studio-1k325pwf.js";
@@ -125,17 +125,17 @@ import {
125
125
  mountSurface,
126
126
  showPromptDialog2,
127
127
  getLayerSlot2
128
- } from "./studio-0j7r7s9g.js";
128
+ } from "./studio-ag3z6shb.js";
129
129
  import {
130
130
  registerPanel
131
- } from "./studio-27q131j3.js";
131
+ } from "./studio-fqpkpq1t.js";
132
132
  import {
133
133
  codeService,
134
134
  pluginSchemaCache,
135
135
  fetchPluginSchema,
136
136
  setLintMarkers,
137
137
  getFunctionArgs
138
- } from "./studio-a65w20ex.js";
138
+ } from "./studio-vd67b66d.js";
139
139
  import {
140
140
  VALUE_SOURCE_LABELS,
141
141
  slotMode,
@@ -148,27 +148,27 @@ import {
148
148
  switchSlotMode,
149
149
  mountSchemaForm,
150
150
  resolveContextPointer
151
- } from "./studio-4f3psrk1.js";
151
+ } from "./studio-w7gpcvfj.js";
152
152
  import {
153
153
  combine
154
154
  } from "./studio-esrxgwh6.js";
155
155
  import {
156
156
  openMenu2
157
- } from "./studio-jt27ta6x.js";
157
+ } from "./studio-mt79tn56.js";
158
158
  import {
159
159
  mountMediaPicker2,
160
160
  unmountMediaPicker2
161
- } from "./studio-6kvgrkrp.js";
161
+ } from "./studio-rwmmbrth.js";
162
162
  import {
163
163
  peekUsages2,
164
164
  loadUsages2,
165
165
  retryUsages2,
166
166
  usageHeadline2,
167
167
  usageFiles2
168
- } from "./studio-nq5yf5mp.js";
168
+ } from "./studio-557bmn0x.js";
169
169
  import {
170
170
  cloneValue2
171
- } from "./studio-727xh0e3.js";
171
+ } from "./studio-aj9drheq.js";
172
172
  import {
173
173
  rectOf
174
174
  } from "./studio-rs76k67r.js";
@@ -2213,7 +2213,7 @@ function formulaChipStrip(node, opts = {}) {
2213
2213
  var formula_palette_default = {
2214
2214
  $schema: "https://jxsuite.com/schema/v1",
2215
2215
  $id: "StudioFormulaPalette",
2216
- $description: "The formula palette (spec §19.9): a search field over the formula catalog, its results grouped by the catalog's own group order, and one pick that hands an entry back to whoever opened it. The same shape as `palette.json` — a scrim, a framed panel, a borderless field, a listbox — because it is the same gesture over a different corpus, and the two used to share a stylesheet by sharing its class names. `groups` is the filtered catalog already grouped; `activeId` is the highlight, and it is ONE string — the id the field points `aria-activedescendant` at and the id the listbox is handed as `active` — kept apart from the rows so a key moves it without the list reconciling, which is why every row carries the FLAT index it would otherwise have to be asked for. Panel position is the caller's: centred under the top edge by default, and pinned under an anchor control when one was named, which is the only thing about this surface a document cannot decide for itself — it arrives as `anchorLeft`/`anchorTop`, two numbers the `style` object below binds, because a style declaration may read state like any other value (spec §9.1).",
2216
+ $description: "The formula palette (spec.md §19.9): a search field over the formula catalog, its results grouped by the catalog's own group order, and one pick that hands an entry back to whoever opened it. The same shape as `palette.json` — a scrim, a framed panel, a borderless field, a listbox — because it is the same gesture over a different corpus, and the two used to share a stylesheet by sharing its class names. `groups` is the filtered catalog already grouped; `activeId` is the highlight, and it is ONE string — the id the field points `aria-activedescendant` at and the id the listbox is handed as `active` — kept apart from the rows so a key moves it without the list reconciling, which is why every row carries the FLAT index it would otherwise have to be asked for. Panel position is the caller's: centred under the top edge by default, and pinned under an anchor control when one was named, which is the only thing about this surface a document cannot decide for itself — it arrives as `anchorLeft`/`anchorTop`, two numbers the `style` object below binds, because a style declaration may read state like any other value (spec.md §9.1).",
2217
2217
  tagName: "div",
2218
2218
  attributes: {
2219
2219
  part: "palette"
@@ -2251,7 +2251,7 @@ var formula_palette_default = {
2251
2251
  overflow: "hidden"
2252
2252
  },
2253
2253
  '& [part="panel"][data-anchored]': {
2254
- $description: "Opened from a control rather than from a chord: the panel hangs under that control instead of sitting under the top edge. The two custom properties are the only measured numbers in the surface — a rect belongs to the moment it was taken, so the adapter measures it once per open and this document binds the result. They used to travel as a `style` ATTRIBUTE the adapter assembled into one string, on the belief that a document cannot bind a style declaration to state; it can, and always could. They are declared at the top of this object rather than here because a reactive custom property in a rule targeting the element ITSELF is written inline under the author's own name (spec §9.1), and the panel then reads them by inheritance — the root is `display: contents`, so nothing sits between the two.",
2254
+ $description: "Opened from a control rather than from a chord: the panel hangs under that control instead of sitting under the top edge. The two custom properties are the only measured numbers in the surface — a rect belongs to the moment it was taken, so the adapter measures it once per open and this document binds the result. They used to travel as a `style` ATTRIBUTE the adapter assembled into one string, on the belief that a document cannot bind a style declaration to state; it can, and always could. They are declared at the top of this object rather than here because a reactive custom property in a rule targeting the element ITSELF is written inline under the author's own name (spec.md §9.1), and the panel then reads them by inheritance — the root is `display: contents`, so nothing sits between the two.",
2255
2255
  position: "fixed",
2256
2256
  left: "var(--formula-palette-left)",
2257
2257
  top: "var(--formula-palette-top)",
@@ -2750,7 +2750,7 @@ function closeFormulaPalette() {
2750
2750
  var expression_editor_default = {
2751
2751
  $schema: "https://jxsuite.com/schema/v1",
2752
2752
  $id: "StudioExpressionEditor",
2753
- $description: "The expression editor (spec §19.9): a `$expression` node edited as STRUCTURE — an operator, the operands that operator needs, and the live value of each. The rows arrive FLAT. An expression nests to any depth (an operand may be another expression, an aggregate's per-item body is one, and either may hold more of both) while a document's one repeater is `$prototype: \"Array\"` over a list, so `ui/expression-editor.ts` walks the tree once and hands over rows that already carry their own indent — recursion is a property of the walk, exactly as it is for the statement tree and the Data panel's value tree. Six kinds of row come out of that walk: the CHIP strip that summarises the whole pipeline, the preview's ERROR line, the OPERATOR row, an OPERAND row (the workhorse, which carries the value ladder and every literal control), a section LABEL, and an ACTION that grows the node. Five surfaces draw this — the Inspector's Content and Logic tabs, the Navigator's State panel, the statement editor and the Logic dock — and none of them is named here: each host has already said where it is, so this document stamps no region of its own.",
2753
+ $description: "The expression editor (spec.md §19.9): a `$expression` node edited as STRUCTURE — an operator, the operands that operator needs, and the live value of each. The rows arrive FLAT. An expression nests to any depth (an operand may be another expression, an aggregate's per-item body is one, and either may hold more of both) while a document's one repeater is `$prototype: \"Array\"` over a list, so `ui/expression-editor.ts` walks the tree once and hands over rows that already carry their own indent — recursion is a property of the walk, exactly as it is for the statement tree and the Data panel's value tree. Six kinds of row come out of that walk: the CHIP strip that summarises the whole pipeline, the preview's ERROR line, the OPERATOR row, an OPERAND row (the workhorse, which carries the value ladder and every literal control), a section LABEL, and an ACTION that grows the node. Five surfaces draw this — the Inspector's Content and Logic tabs, the Navigator's State panel, the statement editor and the Logic dock — and none of them is named here: each host has already said where it is, so this document stamps no region of its own.",
2754
2754
  tagName: "div",
2755
2755
  attributes: {
2756
2756
  part: "expression"
@@ -2807,7 +2807,7 @@ var expression_editor_default = {
2807
2807
  textOverflow: "ellipsis"
2808
2808
  },
2809
2809
  '& [part="row"]': {
2810
- $description: "§4.1's standard form row, stacked, with its own indent. `display: flex` rather than `block` because an operand row carries a leading cell (an argument's name, a case's key) beside the field.",
2810
+ $description: "studio-ui-guidelines.md §4.1's standard form row, stacked, with its own indent. `display: flex` rather than `block` because an operand row carries a leading cell (an argument's name, a case's key) beside the field.",
2811
2811
  boxSizing: "border-box",
2812
2812
  display: "flex",
2813
2813
  alignItems: "flex-start",
@@ -2856,7 +2856,7 @@ var expression_editor_default = {
2856
2856
  fontSize: "var(--jx-text-xs)"
2857
2857
  },
2858
2858
  '& [part="badge"]': {
2859
- $description: "The live value (spec §19.9). A resolved formula is arbitrary text — an object, a URL, a paragraph — so it ellipsizes inside the line it annotates and never sets that line's width.",
2859
+ $description: "The live value (spec.md §19.9). A resolved formula is arbitrary text — an object, a URL, a paragraph — so it ellipsizes inside the line it annotates and never sets that line's width.",
2860
2860
  flex: "0 1 auto",
2861
2861
  minWidth: "0",
2862
2862
  maxWidth: "120px",
@@ -2872,7 +2872,7 @@ var expression_editor_default = {
2872
2872
  textOverflow: "ellipsis"
2873
2873
  },
2874
2874
  '& [part="preview-error"]': {
2875
- $description: "§7.1's inline tier: not a toast and not a problem record, because it is a property of the value currently in the editor and lives exactly as long as that value does.",
2875
+ $description: "§16.1's inline tier: not a toast and not a problem record, because it is a property of the value currently in the editor and lives exactly as long as that value does.",
2876
2876
  margin: "0",
2877
2877
  padding: "2px 0",
2878
2878
  minWidth: "0",
@@ -3278,7 +3278,7 @@ var expression_editor_default = {
3278
3278
  },
3279
3279
  children: [
3280
3280
  {
3281
- $description: "The value ladder (§6.3), in the one vocabulary `ui/value-source.ts` owns. It is absent where the position admits a single shape — an assignment target, a `call`'s callee — because a picker with one entry is a control that asks a question with one answer.",
3281
+ $description: "The value ladder (§6.6), in the one vocabulary `ui/value-source.ts` owns. It is absent where the position admits a single shape — an assignment target, a `call`'s callee — because a picker with one entry is a control that asks a question with one answer.",
3282
3282
  tagName: "span",
3283
3283
  attributes: {
3284
3284
  part: "source-slot",
@@ -4565,7 +4565,7 @@ function scheduleLiveRefresh(tab, targetId, node, contextPath, key, onUpdate) {
4565
4565
  var logic_workspace_default = {
4566
4566
  $schema: "https://jxsuite.com/schema/v1",
4567
4567
  $id: "StudioLogicWorkspace",
4568
- $description: '⑪ · Logic — the Bottom dock tab where a formula and a function body are edited BESIDE the page they compute. One tab, two surfaces, one header: `panels/formula-workspace.ts` decides which of them is open (a `$expression` or a Monaco body), what it is called and what its verbs are, and this draws both. The chip pipeline is a projection of `ui/formula-chips.ts`\'s model — the expression tree read left to right — and a chip click reports its key back; nothing here unrolls a tree, reads a document or evaluates anything. Three ISLANDS, each an empty host this document draws and the flow fills (studio-ui-guidelines.md §9.4): `[part="code-host"]` takes Monaco, `[part="editor-host"]` takes the expression editor, which is a lit surface of its own and another conversion\'s to move, and one `[part="tree-host"]` per data-rail entry takes the value tree, which is a mounted document of its own (`surfaces/panel-data.json`). The rail\'s trees had been empty since that tree became a document, because the lit takeover rendered a host nothing ever filled; announcing them is what fills them.',
4568
+ $description: 'Logic — the Bottom dock tab where a formula and a function body are edited BESIDE the page they compute. One tab, two surfaces, one header: `panels/formula-workspace.ts` decides which of them is open (a `$expression` or a Monaco body), what it is called and what its verbs are, and this draws both. The chip pipeline is a projection of `ui/formula-chips.ts`\'s model — the expression tree read left to right — and a chip click reports its key back; nothing here unrolls a tree, reads a document or evaluates anything. Three ISLANDS, each an empty host this document draws and the flow fills (studio-ui-guidelines.md §9.4): `[part="code-host"]` takes Monaco, `[part="editor-host"]` takes the expression editor, which is a lit surface of its own and another conversion\'s to move, and one `[part="tree-host"]` per data-rail entry takes the value tree, which is a mounted document of its own (`surfaces/panel-data.json`). The rail\'s trees had been empty since that tree became a document, because the lit takeover rendered a host nothing ever filled; announcing them is what fills them.',
4569
4569
  tagName: "div",
4570
4570
  attributes: {
4571
4571
  part: "workspace"
@@ -4658,7 +4658,7 @@ var logic_workspace_default = {
4658
4658
  textOverflow: "ellipsis"
4659
4659
  },
4660
4660
  '& [part="badge"]': {
4661
- $description: "The live value (spec §19.9). A resolved formula is arbitrary text — an object, a URL, a paragraph — so it ellipsizes inside the chip it annotates and never sets the chip's width.",
4661
+ $description: "The live value (spec.md §19.9). A resolved formula is arbitrary text — an object, a URL, a paragraph — so it ellipsizes inside the chip it annotates and never sets the chip's width.",
4662
4662
  flex: "0 1 auto",
4663
4663
  minWidth: "0",
4664
4664
  maxWidth: "120px",
@@ -5921,7 +5921,7 @@ function openPageAction(label = "Open a page…") {
5921
5921
  return {
5922
5922
  label,
5923
5923
  run: () => {
5924
- (__preload("zdv7h8ht"), import("./quick-search-zdv7h8ht.js")).then((m) => {
5924
+ (__preload("c63mkt3b"), import("./quick-search-c63mkt3b.js")).then((m) => {
5925
5925
  m.openQuickSearch();
5926
5926
  });
5927
5927
  }
@@ -6449,7 +6449,7 @@ var properties_panel_default = {
6449
6449
  minWidth: "0"
6450
6450
  },
6451
6451
  '& [part="section-body"] > [part="row"], & [part="layout-class-slot"] > [part="row"]': {
6452
- $description: '§4.1\'s standard form row, stacked: the label sits above a control that takes the whole width. `min-width: 0` is what keeps it honest in a narrow dock — a field refuses to shrink below its own min-content without it. Scoped to the tab\'s OWN rows rather than to every `part="row"` beneath it, which a colour row made load-bearing: the kit is light DOM and one cascade, so a bare descendant selector also matches `jx-color-field`\'s internal row — and at equal specificity with the kit\'s own `& > [part="row"]` the winner is whichever sheet was interned later, which is not a thing a stylesheet may depend on. `[part="chip"]` moved under `[part="chip-slot"]` for the same reason and a sharper one: its `background: transparent` and its border would otherwise have erased a swatch\'s colour and drawn a box round it. The `layout-class-slot` half of the pair is there because that slot is `display: contents`, so its row is a grandchild in the DOM even though it is a child in the box tree.',
6452
+ $description: 'studio-ui-guidelines.md §4.1\'s standard form row, stacked: the label sits above a control that takes the whole width. `min-width: 0` is what keeps it honest in a narrow dock — a field refuses to shrink below its own min-content without it. Scoped to the tab\'s OWN rows rather than to every `part="row"` beneath it, which a colour row made load-bearing: the kit is light DOM and one cascade, so a bare descendant selector also matches `jx-color-field`\'s internal row — and at equal specificity with the kit\'s own `& > [part="row"]` the winner is whichever sheet was interned later, which is not a thing a stylesheet may depend on. `[part="chip"]` moved under `[part="chip-slot"]` for the same reason and a sharper one: its `background: transparent` and its border would otherwise have erased a swatch\'s colour and drawn a box round it. The `layout-class-slot` half of the pair is there because that slot is `display: contents`, so its row is a grandchild in the DOM even though it is a child in the box tree.',
6453
6453
  display: "flex",
6454
6454
  flexDirection: "column",
6455
6455
  alignItems: "stretch",
@@ -6493,7 +6493,7 @@ var properties_panel_default = {
6493
6493
  minInlineSize: "0"
6494
6494
  },
6495
6495
  '& [part="chip-slot"] > [part="chip"]': {
6496
- $description: "§6.2's provenance chip. `set` is the 6px accent dot it has always been — a circle is not a button, whatever element draws it — and the three states that carry a donor are bordered chips naming it. The fourth state, `default`, draws nothing at all: a ghost dot on every unset row says less than silence.",
6496
+ $description: "§6.7's provenance chip. `set` is the 6px accent dot it has always been — a circle is not a button, whatever element draws it — and the three states that carry a donor are bordered chips naming it. The fourth state, `default`, draws nothing at all: a ghost dot on every unset row says less than silence.",
6497
6497
  flexShrink: "0",
6498
6498
  display: "inline-flex",
6499
6499
  alignItems: "center",
@@ -6986,7 +6986,7 @@ var properties_panel_default = {
6986
6986
  },
6987
6987
  children: [
6988
6988
  {
6989
- $description: "§6.2's collapsed-header tally. It is an indicator and not a control: the heading's own click already toggles the section, so a second meaning for the same click would be worse than the silence. It says how many values in the section are set, which is what a closed section otherwise cannot say.",
6989
+ $description: "§6.7's collapsed-header tally. It is an indicator and not a control: the heading's own click already toggles the section, so a second meaning for the same click would be worse than the silence. It says how many values in the section are set, which is what a closed section otherwise cannot say.",
6990
6990
  tagName: "span",
6991
6991
  attributes: {
6992
6992
  slot: "heading",
@@ -7145,7 +7145,7 @@ var properties_panel_default = {
7145
7145
  },
7146
7146
  cases: {
7147
7147
  true: {
7148
- $description: "§6.3's Value Source chip: the rung this value is produced at, in plain language, opening a picker of every rung the POSITION permits. The rungs are derived from the schema at that position and the picker is the kit menu every other list in the shell opens, so neither is decided here.",
7148
+ $description: "§6.6's Value Source chip: the rung this value is produced at, in plain language, opening a picker of every rung the POSITION permits. The rungs are derived from the schema at that position and the picker is the kit menu every other list in the shell opens, so neither is decided here.",
7149
7149
  tagName: "jx-action-button",
7150
7150
  attributes: {
7151
7151
  part: "source",
@@ -8475,10 +8475,10 @@ function openSourceMenu(key, anchor) {
8475
8475
  });
8476
8476
  }
8477
8477
  function openUsage(path) {
8478
- (__preload("y6fr4he9"), import("./files-y6fr4he9.js")).then((m) => m.openFileInTab(path));
8478
+ (__preload("egsb0ry8"), import("./files-egsb0ry8.js")).then((m) => m.openFileInTab(path));
8479
8479
  }
8480
8480
  function showLogicTab() {
8481
- (__preload("889vbnm5"), import("./right-panel-889vbnm5.js")).then((m) => m.setInspectorTab("events"));
8481
+ (__preload("t5n8wttg"), import("./right-panel-t5n8wttg.js")).then((m) => m.setInspectorTab("events"));
8482
8482
  }
8483
8483
  function withPlan(row, plan) {
8484
8484
  plans.set(row.key, plan);
@@ -9196,7 +9196,7 @@ function registerInspectorCommands(registry) {
9196
9196
  var statements_default = {
9197
9197
  $schema: "https://jxsuite.com/schema/v1",
9198
9198
  $id: "StudioStatements",
9199
- $description: "The statement editor (spec §20): a Function entry's `body: JxStatement[]` edited as STRUCTURE rather than as text. The rows arrive FLAT. A statement tree nests to any depth — an `if` holds two lanes, a `$switch` holds one per case plus a default, and either may hold another of both — while a document's one repeater is `$prototype: \"Array\"` over a list, so `panels/statement-editor.ts` walks the tree once and hands over rows that already carry their own indent; recursion is a property of the walk, exactly as it is for the Data panel's value tree. Four kinds of row come out of that walk: a statement CARD (its header, and the fields that statement is made of), a LANE header naming a branch, the ADD control that ends every lane, and an ACTION that grows the statement itself (`+ Add else`, `+ Add case`). Two hosts draw this — the Navigator's State panel and the Inspector's Logic tab — and neither is named here: the region is stamped on the host, because a shared control cannot know where it is. An operand is an ISLAND: the document renders `[part=\"control-host\"]` and nothing inside it, and the flow fills it with the expression editor (studio-ui-guidelines.md §9.4).",
9199
+ $description: "The statement editor (spec.md §20): a Function entry's `body: JxStatement[]` edited as STRUCTURE rather than as text. The rows arrive FLAT. A statement tree nests to any depth — an `if` holds two lanes, a `$switch` holds one per case plus a default, and either may hold another of both — while a document's one repeater is `$prototype: \"Array\"` over a list, so `panels/statement-editor.ts` walks the tree once and hands over rows that already carry their own indent; recursion is a property of the walk, exactly as it is for the Data panel's value tree. Four kinds of row come out of that walk: a statement CARD (its header, and the fields that statement is made of), a LANE header naming a branch, the ADD control that ends every lane, and an ACTION that grows the statement itself (`+ Add else`, `+ Add case`). Two hosts draw this — the Navigator's State panel and the Inspector's Logic tab — and neither is named here: the region is stamped on the host, because a shared control cannot know where it is. An operand is an ISLAND: the document renders `[part=\"control-host\"]` and nothing inside it, and the flow fills it with the expression editor (studio-ui-guidelines.md §9.4).",
9200
9200
  tagName: "div",
9201
9201
  attributes: {
9202
9202
  part: "statements"
@@ -9413,7 +9413,7 @@ var statements_default = {
9413
9413
  $ref: "$map/item/key"
9414
9414
  },
9415
9415
  map: {
9416
- $description: "One operand of the statement. Every field is `span` — the Inspector is 280px and the guidelines' standard row is vertically stacked (§4.1) — and every field carries `data-prop`, which is what `inspector/field:<prop>` addresses. The key is `<row>::<prop>`, self-contained because this `$map` shadows the row's own `$map.item`.",
9416
+ $description: "One operand of the statement. Every field is `span` — the Inspector is 280px and the standard row is vertically stacked (studio-ui-guidelines.md §4.1) — and every field carries `data-prop`, which is what `inspector/field:<prop>` addresses. The key is `<row>::<prop>`, self-contained because this `$map` shadows the row's own `$map.item`.",
9417
9417
  tagName: "jx-field",
9418
9418
  attributes: {
9419
9419
  part: "field",
@@ -9695,7 +9695,7 @@ var statements_default = {
9695
9695
  ]
9696
9696
  },
9697
9697
  add: {
9698
- $description: "The end of every lane. It opens the kit's menu rather than being a picker of its own: a select that has to snap back to its placeholder after each pick is a control fighting the runtime's skip-an-equal-write, and §12.5 asks for one list of actions rather than a second.",
9698
+ $description: "The end of every lane. It opens the kit's menu rather than being a picker of its own: a select that has to snap back to its placeholder after each pick is a control fighting the runtime's skip-an-equal-write, and studio-ui-guidelines.md §12.5 asks for one list of actions rather than a second.",
9699
9699
  tagName: "div",
9700
9700
  attributes: {
9701
9701
  part: "add",
@@ -10568,7 +10568,11 @@ var panel_signals_default = {
10568
10568
  fontSize: "var(--jx-text-xs)",
10569
10569
  color: "var(--fg-dim)"
10570
10570
  },
10571
- '& [part="bar-segments"], & [part="bar-buttons"]': {
10571
+ '& [part="bar-segments"]': {
10572
+ $description: "The Body switch is the kit's segmented control, which draws its own row, frame and selected segment; all the bar asks of it is not to shrink.",
10573
+ flex: "none"
10574
+ },
10575
+ '& [part="bar-buttons"]': {
10572
10576
  display: "flex",
10573
10577
  flex: "none",
10574
10578
  alignItems: "center"
@@ -11577,11 +11581,17 @@ var panel_signals_default = {
11577
11581
  textContent: "${$map.item.label}"
11578
11582
  },
11579
11583
  {
11580
- tagName: "span",
11584
+ $description: "The mode switch is the kit's radiogroup, as the Logic panel's Handler body is. It was a `span` with `role=group` over buttons that carried `selected` alone: the one Spectrum `compact` group the conversion never reached, so it drew as two loose words and announced neither which mode was on nor that the two exclude each other. `checked` makes each segment a radio, so the caret roves and `aria-checked` is the element's own.",
11585
+ tagName: "jx-action-group",
11581
11586
  attributes: {
11582
- part: "bar-segments",
11583
- role: "group",
11584
- "aria-label": "${$map.item.label}"
11587
+ part: "bar-segments"
11588
+ },
11589
+ $props: {
11590
+ selects: "single",
11591
+ compact: true,
11592
+ label: {
11593
+ $ref: "$map/item/label"
11594
+ }
11585
11595
  },
11586
11596
  children: [
11587
11597
  {
@@ -11603,11 +11613,16 @@ var panel_signals_default = {
11603
11613
  label: {
11604
11614
  $ref: "$map/item/label"
11605
11615
  },
11606
- selected: {
11607
- $ref: "$map/item/selected"
11616
+ checked: {
11617
+ $ref: "$map/item/checked"
11608
11618
  }
11609
11619
  },
11610
- textContent: "${$map.item.label}",
11620
+ children: [
11621
+ {
11622
+ tagName: "span",
11623
+ textContent: "${$map.item.label}"
11624
+ }
11625
+ ],
11611
11626
  onclick: {
11612
11627
  $prototype: "Function",
11613
11628
  body: [
@@ -13147,13 +13162,19 @@ function functionFields(S, name, def) {
13147
13162
  prop: "Body",
13148
13163
  segments: [
13149
13164
  {
13165
+ checked: statements ? "true" : "false",
13150
13166
  field: "body",
13151
13167
  key: "statements",
13152
13168
  label: "Statements",
13153
- selected: statements,
13154
13169
  signal: name
13155
13170
  },
13156
- { field: "body", key: "code", label: "Code", selected: !statements, signal: name }
13171
+ {
13172
+ checked: statements ? "false" : "true",
13173
+ field: "body",
13174
+ key: "code",
13175
+ label: "Code",
13176
+ signal: name
13177
+ }
13157
13178
  ],
13158
13179
  signal: name
13159
13180
  }, {
@@ -13612,5 +13633,5 @@ function registerSignalsCommands(registry) {
13612
13633
 
13613
13634
  export { DERIVE_PRESETS, PRESET_LABELS, declaredMedia, clearPaneDerivation, installDerivationEffects, presetRefusal, deriveRefusal, pinRefusal, derivationCommands, mountExpressionEditor, unwrapSignal, dataTypeLabel, registerDataExplorerCommands, registerDataPanel, livePreviewExpression, closeFunctionEditor, logicTarget, revealLogicPanel, openLogicTarget, registerLogicPanel, registerFormulaEditorCommands, provenanceText, provenanceTitle, countProvenance, provenanceSummaryText, clickAnythingTo, staleSelectionMessage, openPageAction, tokenRefName, toTokenRef, resolveTokenValue, colorTokens, resolvedColor, mountStatementEditor, mapSignalsFor, bindableSignalNames, defaultAsString, invalidatePageRouteCache, isInspectorSectionOpen, setInspectorSection, renderPropertiesPanel, bindContentHost, inspectorCommands, registerInspectorCommands, defCategory, defBadgeLabel, isCustomElementDoc, collectCssParts, mountSignalsPanel, registerSignalsCommands };
13614
13635
 
13615
- //# debugId=49338A5759B4E59A64756E2164756E21
13616
- //# sourceMappingURL=studio-ye9drbk8.js.map
13636
+ //# debugId=A1EC7A96E45C85E664756E2164756E21
13637
+ //# sourceMappingURL=studio-rav5bpmp.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getPlatform2
3
- } from "./studio-6nzaktvy.js";
3
+ } from "./studio-6pwn9j8c.js";
4
4
  import {
5
5
  debouncedStyleCommit,
6
6
  renderOnly
@@ -11,7 +11,7 @@ import {
11
11
  registerSurface,
12
12
  mountSurface,
13
13
  layerHost2
14
- } from "./studio-0j7r7s9g.js";
14
+ } from "./studio-ag3z6shb.js";
15
15
  import {
16
16
  reactive
17
17
  } from "./studio-d8z5bajd.js";
@@ -23,17 +23,17 @@ import {
23
23
  uploadAssets,
24
24
  mediaSiteUrl,
25
25
  previewFileSrc
26
- } from "./studio-b7xacrwe.js";
26
+ } from "./studio-sceg8ws0.js";
27
27
  import {
28
28
  peekMediaMeta,
29
29
  seedMediaMeta,
30
30
  recordImageSize,
31
31
  invalidateMediaMeta,
32
32
  mediaMetaSummary
33
- } from "./studio-gtfq1dkz.js";
33
+ } from "./studio-dwdcr2e8.js";
34
34
  import {
35
35
  previewAssetSrc
36
- } from "./studio-ab87phj1.js";
36
+ } from "./studio-kwewmhhq.js";
37
37
  import {
38
38
  rectOf
39
39
  } from "./studio-rs76k67r.js";
@@ -836,4 +836,4 @@ function unmountMediaPicker2(host) {
836
836
  export { openPopoverSurface, invalidateMediaCache2, showMediaPickerPopover2, uploadAndAssign2, pickAndUpload2, mountMediaPicker2, unmountMediaPicker2 };
837
837
 
838
838
  //# debugId=9A676D8FC549E4AE64756E2164756E21
839
- //# sourceMappingURL=studio-6kvgrkrp.js.map
839
+ //# sourceMappingURL=studio-rwmmbrth.js.map
@@ -4,27 +4,27 @@ import {
4
4
  import {
5
5
  getPlatform2,
6
6
  hasPlatform2
7
- } from "./studio-6nzaktvy.js";
7
+ } from "./studio-6pwn9j8c.js";
8
8
  import {
9
9
  notify2
10
10
  } from "./studio-d8z5bajd.js";
11
+ import {
12
+ activeTab2
13
+ } from "./studio-dgdm6vvt.js";
11
14
  import {
12
15
  projectState
13
16
  } from "./studio-m1p9b6c3.js";
14
- import {
15
- activeTab2
16
- } from "./studio-gk2twyh4.js";
17
17
  import {
18
18
  PUBLIC_DIR,
19
19
  normalizeProjectPath,
20
20
  encodeProjectPath
21
- } from "./studio-d1n2bykn.js";
21
+ } from "./studio-3nprwbd9.js";
22
22
  import {
23
23
  contentMountFor,
24
24
  loopbackAssetSrc,
25
25
  projectLocales2,
26
26
  hostAssetDeclarations
27
- } from "./studio-ab87phj1.js";
27
+ } from "./studio-kwewmhhq.js";
28
28
 
29
29
  // src/files/media-upload.ts
30
30
  var IMAGE_EXTENSIONS = new Set([
@@ -236,5 +236,5 @@ function previewFileSrc(path) {
236
236
 
237
237
  export { IMAGE_EXTENSIONS, MEDIA_EXTENSIONS, uploadAccept, extensionOf, isImage, isMediaFile, mediaKind, setMediaChangedHandler, uploadAssets, baseName, dirName, mediaSiteUrl, previewFileSrc };
238
238
 
239
- //# debugId=4C51950010FE40AA64756E2164756E21
240
- //# sourceMappingURL=studio-b7xacrwe.js.map
239
+ //# debugId=BDC1B0ADAA9E564764756E2164756E21
240
+ //# sourceMappingURL=studio-sceg8ws0.js.map
@@ -12,11 +12,11 @@ import {
12
12
  mountSurface,
13
13
  whenReady,
14
14
  layerHost2
15
- } from "./studio-0j7r7s9g.js";
15
+ } from "./studio-ag3z6shb.js";
16
16
  import {
17
17
  showModal,
18
18
  close2
19
- } from "./studio-d1n2bykn.js";
19
+ } from "./studio-3nprwbd9.js";
20
20
  // src/surfaces/github-auth.json
21
21
  var github_auth_default = {
22
22
  $schema: "https://jxsuite.com/schema/v1",
@@ -69,7 +69,8 @@ var github_auth_default = {
69
69
  margin: "0"
70
70
  },
71
71
  '& [part="code"]': {
72
- $description: "`<code>`, not a styled `<div>`: this is a literal string to be transcribed, and the element that says so is also the one a reader's own stylesheet and a screen reader's character-by-character mode already know about.",
72
+ $description: "`<code>`, not a styled `<div>`: this is a literal string to be transcribed, and the element that says so is also the one a reader's own stylesheet and a screen reader's character-by-character mode already know about. It is this dialog's message, and the one string in it the reader must carry to another screen, so it opts back in to selection against the root's `user-select: none`. `all` rather than `text`: one click selects the whole code, so a copy never leaves a character behind.",
73
+ userSelect: "all",
73
74
  fontFamily: "var(--font-mono)",
74
75
  fontSize: "24px",
75
76
  fontWeight: "700",
@@ -185,25 +186,22 @@ function openGithubAuthSurface(options) {
185
186
  };
186
187
  }
187
188
 
188
- // src/github/github-auth.ts
189
- var CLIENT_ID = "Ov23liYVlMFpgjOEPXJH";
189
+ // src/github/github-auth-status.ts
190
190
  var STORAGE_KEY = "jx_github_token";
191
191
  function nativeAuth() {
192
192
  return globalThis.__jxPlatform?.githubAuth ?? null;
193
193
  }
194
194
  var nativeToken = null;
195
195
  var nativeStored = false;
196
+ function setNativeToken(token) {
197
+ nativeToken = token;
198
+ }
196
199
  function githubTokenStored() {
197
200
  return nativeToken !== null || nativeStored || localStorage.getItem(STORAGE_KEY) !== null;
198
201
  }
199
202
  function githubTokenLocation() {
200
203
  return nativeAuth() ? "desktop" : "browser";
201
204
  }
202
- var NOTIFY_KEY = "github.auth";
203
- var SOURCE = "Source Control";
204
- var RETRY = "git.signInToGithub";
205
- var MAX_POLL_FAILURES = 3;
206
- var UNREACHABLE_DETAIL = "The request never reached GitHub. GitHub's device-flow endpoints send no CORS headers, so a " + "browser cannot call them directly — the desktop app can. A machine that is offline fails " + "identically, and the browser does not say which happened.";
207
205
  function getGithubToken() {
208
206
  return nativeToken ?? localStorage.getItem(STORAGE_KEY);
209
207
  }
@@ -213,6 +211,14 @@ function clearGithubToken() {
213
211
  localStorage.removeItem(STORAGE_KEY);
214
212
  nativeAuth()?.signOut().catch(() => {});
215
213
  }
214
+
215
+ // src/github/github-auth.ts
216
+ var CLIENT_ID = "Ov23liYVlMFpgjOEPXJH";
217
+ var NOTIFY_KEY = "github.auth";
218
+ var SOURCE = "Source Control";
219
+ var RETRY = "git.signInToGithub";
220
+ var MAX_POLL_FAILURES = 3;
221
+ var UNREACHABLE_DETAIL = "The request never reached GitHub. GitHub's device-flow endpoints send no CORS headers, so a " + "browser cannot call them directly — the desktop app can. A machine that is offline fails " + "identically, and the browser does not say which happened.";
216
222
  function reportUnreachable(error) {
217
223
  notify2.error("Could not reach GitHub to sign in.", {
218
224
  action: RETRY,
@@ -256,7 +262,7 @@ async function authenticateGithub() {
256
262
  if (native) {
257
263
  try {
258
264
  const { token } = await native.signIn();
259
- nativeToken = token;
265
+ setNativeToken(token);
260
266
  return token;
261
267
  } catch (error) {
262
268
  reportRefused("GitHub sign-in was not completed.", errorMessage2(error));
@@ -358,5 +364,5 @@ async function authenticateGithub() {
358
364
 
359
365
  export { githubTokenStored, githubTokenLocation, clearGithubToken, authenticateGithub };
360
366
 
361
- //# debugId=6031989CF8E575E564756E2164756E21
362
- //# sourceMappingURL=studio-msc1ee1m.js.map
367
+ //# debugId=2E3AA6611B2C5CA164756E2164756E21
368
+ //# sourceMappingURL=studio-sjas5b3a.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getPlatform2
3
- } from "./studio-6nzaktvy.js";
3
+ } from "./studio-6pwn9j8c.js";
4
4
  import {
5
5
  isJsonObject,
6
6
  paramNames
@@ -11,7 +11,7 @@ import {
11
11
  } from "./studio-m1p9b6c3.js";
12
12
  import {
13
13
  loadedMonaco
14
- } from "./studio-6gryj0sg.js";
14
+ } from "./studio-9vsvz7w7.js";
15
15
 
16
16
  // src/services/code-services.ts
17
17
  async function codeService(action, payload) {
@@ -108,4 +108,4 @@ function getFunctionArgs(editing, document) {
108
108
  export { codeService, pluginSchemaCache, fetchPluginSchema, setLintMarkers, getFunctionArgs };
109
109
 
110
110
  //# debugId=267FFB64A2BBCD1564756E2164756E21
111
- //# sourceMappingURL=studio-a65w20ex.js.map
111
+ //# sourceMappingURL=studio-vd67b66d.js.map