@jxsuite/studio 5.2.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 (398) hide show
  1. package/data/css-meta.json +28 -27
  2. package/dist/chunks/{cf-account-picker-h4dab9bq.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-sgg1sv6n.js → content-source-jt7rbcbc.js} +22 -22
  6. package/dist/chunks/{convert-to-repeater-mf1cxgfn.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-c6zwzbre.js → extension-sections-r73an5s6.js} +31 -30
  10. package/dist/chunks/{file-ops-vrpq1jjk.js → file-ops-3xan8mnj.js} +21 -21
  11. package/dist/chunks/{files-msaf95y6.js → files-egsb0ry8.js} +30 -29
  12. package/dist/chunks/{format-host-f64fnesp.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-bv5e22j0.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-paj67nr5.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-dh5np8vk.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/{jx-validate-j0wxk72w.js → jx-validate-epp2z3s3.js} +2 -2
  25. package/dist/chunks/layers-panel-83a16ytx.js +41 -0
  26. package/dist/chunks/{layers-1vcfdbet.js → layers-s6mc01ry.js} +3 -3
  27. package/dist/chunks/{listbox-6v2ac08j.js → listbox-b7jxnhq1.js} +19 -3
  28. package/dist/chunks/{media-picker-p49nhqhs.js → media-picker-nhn6rv4w.js} +11 -11
  29. package/dist/chunks/{menu-qht48vnc.js → menu-8j4qxjrp.js} +4 -4
  30. package/dist/chunks/{monaco-binding-sw6en4dw.js → monaco-binding-e8d9wzyk.js} +3 -3
  31. package/dist/chunks/{monaco-buffer-pykwbm92.js → monaco-buffer-jaq1t9zj.js} +2 -2
  32. package/dist/chunks/{monaco-setup-8vbyqnhr.css → monaco-setup-ey9cjcm3.css} +954 -137
  33. package/dist/chunks/{monaco-setup-8r62fj6y.js → monaco-setup-gsjdysze.js} +7 -7
  34. package/dist/chunks/{platform-ts9cg1a4.js → platform-fnchmhy7.js} +5 -3
  35. package/dist/chunks/publish-panel-ak6hxfma.js +27 -0
  36. package/dist/chunks/quick-search-c63mkt3b.js +47 -0
  37. package/dist/chunks/{references-h69xp9zz.js → references-f7bdv3z5.js} +3 -3
  38. package/dist/chunks/right-panel-t5n8wttg.js +45 -0
  39. package/dist/chunks/{split-g7nm1rgb.js → split-4cz4b6ef.js} +14 -3
  40. package/dist/chunks/{studio-sar8g54p.js → studio-01269reb.js} +8 -8
  41. package/dist/chunks/{studio-rnyf3f8e.js → studio-0a4gncx0.js} +3 -3
  42. package/dist/chunks/{studio-e1f24eff.js → studio-0d4p4wxj.js} +6778 -2993
  43. package/dist/chunks/{studio-4wbb9ct0.js → studio-1tejxvba.js} +3006 -1855
  44. package/dist/chunks/{studio-p6pmwkvh.js → studio-3nprwbd9.js} +147 -28
  45. package/dist/chunks/{studio-4c041r8y.js → studio-40z39dme.js} +3 -3
  46. package/dist/chunks/{studio-68fydsrj.js → studio-482eeazk.js} +20 -20
  47. package/dist/chunks/{studio-y4f9fdge.js → studio-4998spet.js} +10 -9
  48. package/dist/chunks/{studio-nq5yf5mp.js → studio-557bmn0x.js} +2 -2
  49. package/dist/chunks/{studio-hdc2jt3z.js → studio-5w26wza5.js} +3 -3
  50. package/dist/chunks/{studio-6nzaktvy.js → studio-6pwn9j8c.js} +6 -3
  51. package/dist/chunks/{studio-wnsyffg1.js → studio-6vg0x5fz.js} +3 -2
  52. package/dist/chunks/{studio-vn5hske5.js → studio-7d3c1m59.js} +12 -5
  53. package/dist/chunks/{studio-28vs5k2y.js → studio-9vsvz7w7.js} +7 -7
  54. package/dist/chunks/{studio-t3adrr56.js → studio-9wm0xzpf.js} +19 -19
  55. package/dist/chunks/{studio-38emantv.js → studio-a5h5j33a.js} +19 -5
  56. package/dist/chunks/{studio-ympe0n7a.js → studio-ag3z6shb.js} +10 -4
  57. package/dist/chunks/studio-aj9drheq.js +177 -0
  58. package/dist/chunks/{studio-vt0tj32j.js → studio-apv9x70c.js} +189 -130
  59. package/dist/chunks/{studio-c04nzbby.js → studio-b9q3znz8.js} +2 -2
  60. package/dist/chunks/{studio-2mdbbc76.js → studio-bh47w0cy.js} +9 -10
  61. package/dist/chunks/{studio-ez11dmdh.js → studio-dgdm6vvt.js} +264 -52
  62. package/dist/chunks/{studio-5nz00bhh.js → studio-dwdcr2e8.js} +4 -4
  63. package/dist/chunks/{studio-nqgawfks.js → studio-fbcyz234.js} +146 -139
  64. package/dist/chunks/{studio-kcgff4r0.js → studio-fgmfksz8.js} +2 -2
  65. package/dist/chunks/{studio-x72j58vw.js → studio-fqpkpq1t.js} +7 -4
  66. package/dist/chunks/{studio-15f3kxqe.js → studio-fy320dfc.js} +62 -68
  67. package/dist/chunks/{studio-zjjde71a.js → studio-gjj4bbfx.js} +2 -2
  68. package/dist/chunks/{studio-66arbpc2.js → studio-jfhxy8h3.js} +16 -15
  69. package/dist/chunks/{studio-d0300636.js → studio-ks2zzth2.js} +17 -2
  70. package/dist/chunks/{studio-c07s5ckd.js → studio-kwewmhhq.js} +4 -4
  71. package/dist/chunks/{studio-01jeck2y.js → studio-m58xn8at.js} +26 -25
  72. package/dist/chunks/{studio-mpzwze9x.js → studio-mfkh1q8d.js} +17 -17
  73. package/dist/chunks/{studio-etvx9s2g.js → studio-mrh0a92f.js} +17 -17
  74. package/dist/chunks/{studio-qa7fzxan.js → studio-mt79tn56.js} +3 -3
  75. package/dist/chunks/{studio-hhskq2mr.js → studio-ne593z1j.js} +39 -32
  76. package/dist/chunks/{studio-h4nvnjvz.js → studio-ptfcxkz5.js} +418 -232
  77. package/dist/chunks/{studio-4xmjcrg3.js → studio-qxye31h7.js} +7 -7
  78. package/dist/chunks/{studio-a1pswps3.js → studio-rav5bpmp.js} +81 -59
  79. package/dist/chunks/{studio-ncn9e189.js → studio-rwmmbrth.js} +6 -6
  80. package/dist/chunks/{studio-en82c639.js → studio-sceg8ws0.js} +8 -8
  81. package/dist/chunks/{studio-wjpgxywa.js → studio-sjas5b3a.js} +19 -13
  82. package/dist/chunks/{studio-4r14yzyy.js → studio-vd67b66d.js} +3 -3
  83. package/dist/chunks/{studio-14d9tq4d.js → studio-w475cbf9.js} +10 -10
  84. package/dist/chunks/{studio-ctm7bhx5.js → studio-w7gpcvfj.js} +9 -9
  85. package/dist/chunks/{studio-9j6sfeba.js → studio-xrbfdxgk.js} +7 -7
  86. package/dist/chunks/{studio-x10fp4tp.js → studio-y49b6mjv.js} +35 -35
  87. package/dist/chunks/{studio-5t7ena5z.js → studio-ygvr9e4q.js} +10 -10
  88. package/dist/chunks/{studio-z2smx5ce.js → studio-yxmmjy2a.js} +9 -6
  89. package/dist/chunks/{tsMode-jy4m86rv.js → tsMode-ay4c78ne.js} +4 -4
  90. package/dist/chunks/{tsMode-hnxxb73h.css → tsMode-c72wyz27.css} +954 -137
  91. package/dist/chunks/{workspace-bnw54cha.js → workspace-b9k2frks.js} +5 -5
  92. package/dist/chunks/{ws-client-ny4zc51r.js → ws-client-erze4czt.js} +356 -20
  93. package/dist/codicon.ttf +0 -0
  94. package/dist/iframe-entry.js +20 -18
  95. package/dist/studio.css +956 -139
  96. package/dist/studio.js +1511 -851
  97. package/dist/workers/editor.worker.js +196 -107
  98. package/dist/workers/json.worker.js +196 -107
  99. package/dist/workers/ts.worker.js +196 -107
  100. package/package.json +18 -17
  101. package/src/about/about-modal.ts +4 -3
  102. package/src/browse/library-commands.ts +15 -13
  103. package/src/browse/library-pane.ts +2 -2
  104. package/src/canvas/canvas-render.ts +97 -83
  105. package/src/canvas/canvas-surface.ts +2 -2
  106. package/src/canvas/canvas-utils.ts +42 -32
  107. package/src/canvas/diff-toolbar.ts +21 -2
  108. package/src/canvas/diff-view.ts +30 -6
  109. package/src/canvas/iframe-entry.ts +2 -2
  110. package/src/canvas/iframe-host.ts +5 -5
  111. package/src/canvas/iframe-interaction.ts +7 -6
  112. package/src/canvas/iframe-overlay.ts +1 -1
  113. package/src/canvas/iframe-protocol.ts +6 -5
  114. package/src/canvas/iframe-render.ts +3 -3
  115. package/src/canvas/popover-state.ts +1 -1
  116. package/src/canvas/stage-scrollbar.ts +112 -0
  117. package/src/canvas/surface-registry.ts +9 -2
  118. package/src/collab/collab-commands.ts +8 -6
  119. package/src/collab/collab-session.ts +4 -4
  120. package/src/collab/collab-state.ts +4 -4
  121. package/src/collab/presence-chips.ts +3 -3
  122. package/src/commands/app-commands.ts +7 -7
  123. package/src/commands/budget.ts +17 -16
  124. package/src/commands/command-args.ts +10 -9
  125. package/src/commands/context.ts +20 -10
  126. package/src/commands/defaults.ts +30 -29
  127. package/src/commands/levels.ts +8 -6
  128. package/src/commands/live-context.ts +12 -10
  129. package/src/commands/reference.ts +5 -5
  130. package/src/commands/registry.ts +2 -2
  131. package/src/content/draft-state.ts +9 -8
  132. package/src/content/entry-commands.ts +16 -14
  133. package/src/content/entry-editor.ts +2 -2
  134. package/src/content/entry-fields.ts +1 -1
  135. package/src/editor/context-menu.ts +4 -4
  136. package/src/editor/convert-to-component.ts +6 -5
  137. package/src/editor/inline-edit.ts +3 -3
  138. package/src/editor/shortcuts.ts +88 -20
  139. package/src/editor/slash-menu.ts +11 -10
  140. package/src/files/elements.ts +4 -5
  141. package/src/files/file-ops.ts +1 -1
  142. package/src/files/files.ts +21 -17
  143. package/src/files/serialize-document.ts +1 -1
  144. package/src/format/convert-file.ts +5 -5
  145. package/src/github/github-auth-status.ts +107 -0
  146. package/src/github/github-auth.ts +18 -82
  147. package/src/github/github-publish.ts +7 -6
  148. package/src/grid/cell-editors.ts +8 -7
  149. package/src/grid/grid-layout.ts +1 -1
  150. package/src/grid/grid-open.ts +6 -5
  151. package/src/grid/grid-panel.ts +13 -12
  152. package/src/grid/redirects-grid.ts +14 -11
  153. package/src/grid/redirects.ts +10 -5
  154. package/src/grid/sources/content-source.ts +10 -9
  155. package/src/hosting/document.ts +28 -1
  156. package/src/hosting/stage.ts +15 -4
  157. package/src/i18n/i18n-commands.ts +9 -7
  158. package/src/new-project/location-fields.ts +16 -3
  159. package/src/new-project/new-project-modal.ts +23 -7
  160. package/src/page-params.ts +6 -6
  161. package/src/panels/activity-panel.ts +11 -10
  162. package/src/panels/ai-chat/chat-view.ts +27 -14
  163. package/src/panels/ai-chat/composer.ts +10 -3
  164. package/src/panels/ai-panel.ts +87 -29
  165. package/src/panels/block-action-bar.ts +59 -33
  166. package/src/panels/bottom-dock.ts +22 -22
  167. package/src/panels/chat-panel.ts +40 -5
  168. package/src/panels/data-explorer.ts +9 -9
  169. package/src/panels/data-grid.ts +1 -1
  170. package/src/panels/editors.ts +8 -8
  171. package/src/panels/elements-panel.ts +7 -8
  172. package/src/panels/empty-state.ts +1 -1
  173. package/src/panels/events-panel.ts +13 -12
  174. package/src/panels/formula-workspace.ts +8 -5
  175. package/src/panels/frontmatter-fields.ts +4 -1
  176. package/src/panels/frontmatter-panel.ts +18 -18
  177. package/src/panels/git-panel.ts +19 -13
  178. package/src/panels/head-panel.ts +9 -10
  179. package/src/panels/i18n-panel.ts +6 -4
  180. package/src/panels/imports-panel.ts +1 -1
  181. package/src/panels/jump-bar.ts +20 -18
  182. package/src/panels/layers-panel.ts +19 -17
  183. package/src/panels/left-panel.ts +3 -3
  184. package/src/panels/navigator-panels.ts +8 -8
  185. package/src/panels/overlays.ts +1 -1
  186. package/src/panels/pane-context.ts +56 -28
  187. package/src/panels/pane-grid.ts +9 -8
  188. package/src/panels/panel-registry.ts +47 -19
  189. package/src/panels/problems-panel.ts +11 -12
  190. package/src/panels/properties-panel.ts +21 -20
  191. package/src/panels/provenance.ts +3 -3
  192. package/src/panels/quick-search.ts +15 -11
  193. package/src/panels/right-panel.ts +4 -3
  194. package/src/panels/seo-modal.ts +5 -4
  195. package/src/panels/settings-menu.ts +9 -9
  196. package/src/panels/settings-pane.ts +3 -3
  197. package/src/panels/signals-panel.ts +16 -9
  198. package/src/panels/statement-editor.ts +12 -9
  199. package/src/panels/style-panel.ts +45 -41
  200. package/src/panels/stylebook-panel.ts +0 -1
  201. package/src/panels/tab-strip.ts +26 -23
  202. package/src/platform-errors.ts +2 -2
  203. package/src/platform.ts +44 -4
  204. package/src/platforms/cloud.ts +11 -1
  205. package/src/platforms/default-platform.ts +141 -4
  206. package/src/platforms/devserver.ts +23 -3
  207. package/src/publish/deploy-checklist.ts +11 -10
  208. package/src/publish/publish-commands.ts +9 -8
  209. package/src/services/a11y-report.ts +1 -1
  210. package/src/services/ai-ask.ts +39 -16
  211. package/src/services/ai-command-tools.ts +28 -14
  212. package/src/services/ai-import-tools.ts +43 -29
  213. package/src/services/ai-project-tools.ts +20 -38
  214. package/src/services/ai-settings.ts +55 -2
  215. package/src/services/ai-tools.ts +69 -58
  216. package/src/services/ai-write-report.ts +4 -4
  217. package/src/services/ai-writes.ts +74 -55
  218. package/src/services/automation.ts +12 -12
  219. package/src/services/clock.ts +2 -1
  220. package/src/services/connection.ts +2 -2
  221. package/src/services/context-manager.ts +69 -6
  222. package/src/services/directory-picker.ts +93 -27
  223. package/src/services/document-assistant.ts +86 -17
  224. package/src/services/gated-registry.ts +4 -3
  225. package/src/services/idle.ts +5 -4
  226. package/src/services/live-surfaces.ts +2 -1
  227. package/src/services/module-preloads.ts +67 -0
  228. package/src/services/notify.ts +9 -7
  229. package/src/services/popover-report.ts +3 -3
  230. package/src/services/preview-eval.ts +1 -1
  231. package/src/services/project-adoption.ts +34 -1
  232. package/src/services/project-path.ts +53 -0
  233. package/src/services/settings/kernel.ts +13 -2
  234. package/src/services/tool-executor.ts +135 -30
  235. package/src/services/tool-outcomes.ts +143 -0
  236. package/src/settings/contexts-section.ts +8 -8
  237. package/src/settings/contributed-section.ts +6 -6
  238. package/src/settings/css-vars-editor.ts +6 -5
  239. package/src/settings/extension-commands.ts +19 -18
  240. package/src/settings/extension-sections.ts +7 -7
  241. package/src/settings/extensions-section.ts +3 -3
  242. package/src/settings/general-settings.ts +21 -18
  243. package/src/settings/preferences-accounts.ts +3 -3
  244. package/src/settings/preferences-dialog.ts +9 -8
  245. package/src/settings/preferences-sections.ts +1 -1
  246. package/src/settings/project-sections.ts +2 -2
  247. package/src/settings/section-registry.ts +7 -6
  248. package/src/settings/settings-document.ts +41 -43
  249. package/src/shell/tree.ts +29 -0
  250. package/src/shell.ts +63 -55
  251. package/src/site-context.ts +1 -1
  252. package/src/store.ts +2 -2
  253. package/src/studio.ts +52 -28
  254. package/src/style/live-preview.ts +8 -8
  255. package/src/style/project-styles.ts +8 -9
  256. package/src/style/token-ref.ts +2 -2
  257. package/src/surfaces/about.json +6 -2
  258. package/src/surfaces/add-repo.json +2 -2
  259. package/src/surfaces/add-repo.ts +2 -2
  260. package/src/surfaces/ai-chat.json +14 -6
  261. package/src/surfaces/ai-chat.ts +4 -2
  262. package/src/surfaces/ai-credentials-form.json +53 -49
  263. package/src/surfaces/ai-credentials-form.ts +18 -4
  264. package/src/surfaces/ai-managed-connect.json +4 -4
  265. package/src/surfaces/block-action-bar.json +4 -4
  266. package/src/surfaces/block-action-bar.ts +3 -3
  267. package/src/surfaces/boot-failure.json +228 -0
  268. package/src/surfaces/boot-failure.ts +156 -0
  269. package/src/surfaces/bottom-dock.json +1 -1
  270. package/src/surfaces/canvas-stage.json +9 -40
  271. package/src/surfaces/canvas-stage.ts +9 -9
  272. package/src/surfaces/cf-account-picker.json +11 -8
  273. package/src/surfaces/commandbar.ts +11 -10
  274. package/src/surfaces/convert-repeater.ts +3 -2
  275. package/src/surfaces/dialog.json +7 -1
  276. package/src/surfaces/dialog.ts +2 -2
  277. package/src/surfaces/doc-header.json +6 -13
  278. package/src/surfaces/doc-header.ts +4 -5
  279. package/src/surfaces/entry-editor.json +1 -1
  280. package/src/surfaces/entry-editor.ts +2 -1
  281. package/src/surfaces/expression-editor.json +5 -5
  282. package/src/surfaces/files-panel.json +4 -3
  283. package/src/surfaces/files-panel.ts +1 -1
  284. package/src/surfaces/formula-palette.json +10 -9
  285. package/src/surfaces/formula-palette.ts +11 -7
  286. package/src/surfaces/git-panel.json +167 -109
  287. package/src/surfaces/git-panel.ts +2 -2
  288. package/src/surfaces/github-auth.json +2 -1
  289. package/src/surfaces/github-publish.ts +3 -3
  290. package/src/surfaces/grid-open.json +1 -1
  291. package/src/surfaces/grid-panel.json +2 -2
  292. package/src/surfaces/grid-views.json +1 -1
  293. package/src/surfaces/inspector-dock.json +2 -2
  294. package/src/surfaces/jump-bar.json +1 -1
  295. package/src/surfaces/jump-bar.ts +1 -1
  296. package/src/surfaces/library-pane.ts +2 -1
  297. package/src/surfaces/logic-panel.json +7 -7
  298. package/src/surfaces/logic-panel.ts +6 -4
  299. package/src/surfaces/logic-workspace.json +2 -2
  300. package/src/surfaces/logic-workspace.ts +2 -2
  301. package/src/surfaces/media-browser.ts +3 -3
  302. package/src/surfaces/media-pane.ts +2 -1
  303. package/src/surfaces/menu.ts +5 -5
  304. package/src/surfaces/new-project.json +1 -1
  305. package/src/surfaces/palette.json +8 -7
  306. package/src/surfaces/pane-context.json +86 -57
  307. package/src/surfaces/pane-context.ts +2 -1
  308. package/src/surfaces/pane-grid.json +3 -3
  309. package/src/surfaces/panel-activity.json +2 -1
  310. package/src/surfaces/panel-deploy-checklist.json +1 -1
  311. package/src/surfaces/panel-elements.ts +2 -1
  312. package/src/surfaces/panel-i18n.ts +2 -1
  313. package/src/surfaces/panel-outline.json +1 -1
  314. package/src/surfaces/panel-outline.ts +4 -3
  315. package/src/surfaces/panel-page.json +2 -2
  316. package/src/surfaces/panel-page.ts +4 -1
  317. package/src/surfaces/panel-problems.json +4 -3
  318. package/src/surfaces/panel-problems.ts +2 -2
  319. package/src/surfaces/panel-signals.json +23 -8
  320. package/src/surfaces/panel-signals.ts +5 -1
  321. package/src/surfaces/panel-stylebook-layers.json +1 -1
  322. package/src/surfaces/panel-stylebook-layers.ts +2 -2
  323. package/src/surfaces/preferences.json +21 -8
  324. package/src/surfaces/preferences.ts +9 -1
  325. package/src/surfaces/properties-panel.json +4 -4
  326. package/src/surfaces/properties-panel.ts +2 -2
  327. package/src/surfaces/publish.json +1 -1
  328. package/src/surfaces/publish.ts +2 -1
  329. package/src/surfaces/push-plan.json +4 -3
  330. package/src/surfaces/rail.json +2 -2
  331. package/src/surfaces/rail.ts +10 -4
  332. package/src/surfaces/reference-field.json +1 -1
  333. package/src/surfaces/schema-form.json +2 -2
  334. package/src/surfaces/schema-form.ts +1 -1
  335. package/src/surfaces/seo.json +1 -1
  336. package/src/surfaces/seo.ts +2 -2
  337. package/src/surfaces/settings-contributed.ts +2 -1
  338. package/src/surfaces/settings-css-vars.json +4 -4
  339. package/src/surfaces/settings-deploy.json +4 -4
  340. package/src/surfaces/settings-deploy.ts +2 -1
  341. package/src/surfaces/settings-extensions.json +6 -6
  342. package/src/surfaces/settings-extensions.ts +6 -2
  343. package/src/surfaces/settings-locales.json +4 -4
  344. package/src/surfaces/settings-overview.ts +2 -1
  345. package/src/surfaces/settings-pane.ts +3 -2
  346. package/src/surfaces/settings-rawjson.ts +1 -1
  347. package/src/surfaces/slash-menu.ts +4 -4
  348. package/src/surfaces/statements.json +3 -3
  349. package/src/surfaces/statusbar.ts +23 -23
  350. package/src/surfaces/style-panel.json +9 -5
  351. package/src/surfaces/style-panel.ts +3 -3
  352. package/src/surfaces/tab-strip.json +2 -2
  353. package/src/surfaces/target-line.json +1 -1
  354. package/src/surfaces/target-line.ts +12 -10
  355. package/src/surfaces/welcome.json +7 -2
  356. package/src/tabs/doc-op-apply.ts +5 -5
  357. package/src/tabs/patch-ops.ts +3 -3
  358. package/src/tabs/project-config.ts +10 -10
  359. package/src/tabs/selection.ts +1 -1
  360. package/src/tabs/tab.ts +13 -14
  361. package/src/tabs/transact.ts +18 -24
  362. package/src/types.ts +27 -3
  363. package/src/ui/ai-credentials-form.ts +74 -16
  364. package/src/ui/ai-managed-connect.ts +68 -19
  365. package/src/ui/color-selector.ts +1 -1
  366. package/src/ui/expression-editor.ts +3 -3
  367. package/src/ui/form-controls.ts +6 -5
  368. package/src/ui/formula-catalog.ts +4 -4
  369. package/src/ui/formula-chips.ts +2 -2
  370. package/src/ui/layers.ts +20 -18
  371. package/src/ui/panel-resize.ts +8 -28
  372. package/src/ui/popover-surface.ts +2 -2
  373. package/src/ui/progress-modal.ts +3 -3
  374. package/src/ui/regions.ts +14 -9
  375. package/src/ui/schema-form.ts +10 -9
  376. package/src/ui/timing.ts +9 -7
  377. package/src/ui/value-source.ts +4 -4
  378. package/src/ui/virtual-window.ts +58 -5
  379. package/src/utils/base64.ts +20 -1
  380. package/src/utils/canvas-media.ts +1 -1
  381. package/src/utils/studio-utils.ts +0 -31
  382. package/src/view.ts +4 -3
  383. package/src/workspace/pane-derive.ts +14 -13
  384. package/src/workspace/session.ts +7 -6
  385. package/src/workspace/workspace.ts +49 -39
  386. package/styles/canvas.css +1 -27
  387. package/styles/inspector.css +4 -3
  388. package/styles/overlays.css +1 -1
  389. package/styles/tokens.css +17 -1
  390. package/styles/tokens.json +6 -1
  391. package/dist/chunks/entry-commands-w9qsxa6q.js +0 -42
  392. package/dist/chunks/layers-panel-fksbdg4q.js +0 -40
  393. package/dist/chunks/publish-panel-vz23wwmg.js +0 -27
  394. package/dist/chunks/quick-search-e9rp74m8.js +0 -46
  395. package/dist/chunks/right-panel-j97t2yvy.js +0 -45
  396. package/dist/chunks/studio-727xh0e3.js +0 -76
  397. package/src/files/json-layout.ts +0 -474
  398. 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-wjpgxywa.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("h4dab9bq"), import("./cf-account-picker-h4dab9bq.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("h4dab9bq"), import("./cf-account-picker-h4dab9bq.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-4xmjcrg3.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-etvx9s2g.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-28vs5k2y.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-ez11dmdh.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-p6pmwkvh.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-mpzwze9x.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-ympe0n7a.js";
128
+ } from "./studio-ag3z6shb.js";
129
129
  import {
130
130
  registerPanel
131
- } from "./studio-x72j58vw.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-4r14yzyy.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-ctm7bhx5.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-qa7fzxan.js";
157
+ } from "./studio-mt79tn56.js";
158
158
  import {
159
159
  mountMediaPicker2,
160
160
  unmountMediaPicker2
161
- } from "./studio-ncn9e189.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"
@@ -2232,6 +2232,9 @@ var formula_palette_default = {
2232
2232
  paddingTop: "60px",
2233
2233
  background: "rgba(0, 0, 0, 0.4)"
2234
2234
  },
2235
+ '& [part="overlay"][hidden]': {
2236
+ display: "none"
2237
+ },
2235
2238
  '& [part="panel"]': {
2236
2239
  width: "560px",
2237
2240
  maxWidth: "calc(100vw - 32px)",
@@ -2248,7 +2251,7 @@ var formula_palette_default = {
2248
2251
  overflow: "hidden"
2249
2252
  },
2250
2253
  '& [part="panel"][data-anchored]': {
2251
- $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.",
2252
2255
  position: "fixed",
2253
2256
  left: "var(--formula-palette-left)",
2254
2257
  top: "var(--formula-palette-top)",
@@ -2309,14 +2312,12 @@ var formula_palette_default = {
2309
2312
  color: "inherit"
2310
2313
  }
2311
2314
  },
2312
- $switch: {
2313
- $ref: "#/state/open"
2314
- },
2315
- cases: {
2316
- true: {
2315
+ children: [
2316
+ {
2317
2317
  tagName: "div",
2318
2318
  attributes: {
2319
- part: "overlay"
2319
+ part: "overlay",
2320
+ hidden: "${state.open ? null : ''}"
2320
2321
  },
2321
2322
  onclick: {
2322
2323
  $prototype: "Function",
@@ -2572,7 +2573,7 @@ var formula_palette_default = {
2572
2573
  }
2573
2574
  ]
2574
2575
  }
2575
- }
2576
+ ]
2576
2577
  };
2577
2578
 
2578
2579
  // src/surfaces/formula-palette.ts
@@ -2749,7 +2750,7 @@ function closeFormulaPalette() {
2749
2750
  var expression_editor_default = {
2750
2751
  $schema: "https://jxsuite.com/schema/v1",
2751
2752
  $id: "StudioExpressionEditor",
2752
- $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.",
2753
2754
  tagName: "div",
2754
2755
  attributes: {
2755
2756
  part: "expression"
@@ -2806,7 +2807,7 @@ var expression_editor_default = {
2806
2807
  textOverflow: "ellipsis"
2807
2808
  },
2808
2809
  '& [part="row"]': {
2809
- $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.",
2810
2811
  boxSizing: "border-box",
2811
2812
  display: "flex",
2812
2813
  alignItems: "flex-start",
@@ -2855,7 +2856,7 @@ var expression_editor_default = {
2855
2856
  fontSize: "var(--jx-text-xs)"
2856
2857
  },
2857
2858
  '& [part="badge"]': {
2858
- $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.",
2859
2860
  flex: "0 1 auto",
2860
2861
  minWidth: "0",
2861
2862
  maxWidth: "120px",
@@ -2871,7 +2872,7 @@ var expression_editor_default = {
2871
2872
  textOverflow: "ellipsis"
2872
2873
  },
2873
2874
  '& [part="preview-error"]': {
2874
- $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.",
2875
2876
  margin: "0",
2876
2877
  padding: "2px 0",
2877
2878
  minWidth: "0",
@@ -3277,7 +3278,7 @@ var expression_editor_default = {
3277
3278
  },
3278
3279
  children: [
3279
3280
  {
3280
- $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.",
3281
3282
  tagName: "span",
3282
3283
  attributes: {
3283
3284
  part: "source-slot",
@@ -4564,7 +4565,7 @@ function scheduleLiveRefresh(tab, targetId, node, contextPath, key, onUpdate) {
4564
4565
  var logic_workspace_default = {
4565
4566
  $schema: "https://jxsuite.com/schema/v1",
4566
4567
  $id: "StudioLogicWorkspace",
4567
- $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.',
4568
4569
  tagName: "div",
4569
4570
  attributes: {
4570
4571
  part: "workspace"
@@ -4657,7 +4658,7 @@ var logic_workspace_default = {
4657
4658
  textOverflow: "ellipsis"
4658
4659
  },
4659
4660
  '& [part="badge"]': {
4660
- $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.",
4661
4662
  flex: "0 1 auto",
4662
4663
  minWidth: "0",
4663
4664
  maxWidth: "120px",
@@ -5920,7 +5921,7 @@ function openPageAction(label = "Open a page…") {
5920
5921
  return {
5921
5922
  label,
5922
5923
  run: () => {
5923
- (__preload("e9rp74m8"), import("./quick-search-e9rp74m8.js")).then((m) => {
5924
+ (__preload("c63mkt3b"), import("./quick-search-c63mkt3b.js")).then((m) => {
5924
5925
  m.openQuickSearch();
5925
5926
  });
5926
5927
  }
@@ -6448,7 +6449,7 @@ var properties_panel_default = {
6448
6449
  minWidth: "0"
6449
6450
  },
6450
6451
  '& [part="section-body"] > [part="row"], & [part="layout-class-slot"] > [part="row"]': {
6451
- $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.',
6452
6453
  display: "flex",
6453
6454
  flexDirection: "column",
6454
6455
  alignItems: "stretch",
@@ -6492,7 +6493,7 @@ var properties_panel_default = {
6492
6493
  minInlineSize: "0"
6493
6494
  },
6494
6495
  '& [part="chip-slot"] > [part="chip"]': {
6495
- $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.",
6496
6497
  flexShrink: "0",
6497
6498
  display: "inline-flex",
6498
6499
  alignItems: "center",
@@ -6985,7 +6986,7 @@ var properties_panel_default = {
6985
6986
  },
6986
6987
  children: [
6987
6988
  {
6988
- $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.",
6989
6990
  tagName: "span",
6990
6991
  attributes: {
6991
6992
  slot: "heading",
@@ -7144,7 +7145,7 @@ var properties_panel_default = {
7144
7145
  },
7145
7146
  cases: {
7146
7147
  true: {
7147
- $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.",
7148
7149
  tagName: "jx-action-button",
7149
7150
  attributes: {
7150
7151
  part: "source",
@@ -8474,10 +8475,10 @@ function openSourceMenu(key, anchor) {
8474
8475
  });
8475
8476
  }
8476
8477
  function openUsage(path) {
8477
- (__preload("msaf95y6"), import("./files-msaf95y6.js")).then((m) => m.openFileInTab(path));
8478
+ (__preload("egsb0ry8"), import("./files-egsb0ry8.js")).then((m) => m.openFileInTab(path));
8478
8479
  }
8479
8480
  function showLogicTab() {
8480
- (__preload("j97t2yvy"), import("./right-panel-j97t2yvy.js")).then((m) => m.setInspectorTab("events"));
8481
+ (__preload("t5n8wttg"), import("./right-panel-t5n8wttg.js")).then((m) => m.setInspectorTab("events"));
8481
8482
  }
8482
8483
  function withPlan(row, plan) {
8483
8484
  plans.set(row.key, plan);
@@ -9195,7 +9196,7 @@ function registerInspectorCommands(registry) {
9195
9196
  var statements_default = {
9196
9197
  $schema: "https://jxsuite.com/schema/v1",
9197
9198
  $id: "StudioStatements",
9198
- $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).",
9199
9200
  tagName: "div",
9200
9201
  attributes: {
9201
9202
  part: "statements"
@@ -9412,7 +9413,7 @@ var statements_default = {
9412
9413
  $ref: "$map/item/key"
9413
9414
  },
9414
9415
  map: {
9415
- $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`.",
9416
9417
  tagName: "jx-field",
9417
9418
  attributes: {
9418
9419
  part: "field",
@@ -9694,7 +9695,7 @@ var statements_default = {
9694
9695
  ]
9695
9696
  },
9696
9697
  add: {
9697
- $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.",
9698
9699
  tagName: "div",
9699
9700
  attributes: {
9700
9701
  part: "add",
@@ -10567,7 +10568,11 @@ var panel_signals_default = {
10567
10568
  fontSize: "var(--jx-text-xs)",
10568
10569
  color: "var(--fg-dim)"
10569
10570
  },
10570
- '& [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"]': {
10571
10576
  display: "flex",
10572
10577
  flex: "none",
10573
10578
  alignItems: "center"
@@ -11576,11 +11581,17 @@ var panel_signals_default = {
11576
11581
  textContent: "${$map.item.label}"
11577
11582
  },
11578
11583
  {
11579
- 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",
11580
11586
  attributes: {
11581
- part: "bar-segments",
11582
- role: "group",
11583
- "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
+ }
11584
11595
  },
11585
11596
  children: [
11586
11597
  {
@@ -11602,11 +11613,16 @@ var panel_signals_default = {
11602
11613
  label: {
11603
11614
  $ref: "$map/item/label"
11604
11615
  },
11605
- selected: {
11606
- $ref: "$map/item/selected"
11616
+ checked: {
11617
+ $ref: "$map/item/checked"
11607
11618
  }
11608
11619
  },
11609
- textContent: "${$map.item.label}",
11620
+ children: [
11621
+ {
11622
+ tagName: "span",
11623
+ textContent: "${$map.item.label}"
11624
+ }
11625
+ ],
11610
11626
  onclick: {
11611
11627
  $prototype: "Function",
11612
11628
  body: [
@@ -13146,13 +13162,19 @@ function functionFields(S, name, def) {
13146
13162
  prop: "Body",
13147
13163
  segments: [
13148
13164
  {
13165
+ checked: statements ? "true" : "false",
13149
13166
  field: "body",
13150
13167
  key: "statements",
13151
13168
  label: "Statements",
13152
- selected: statements,
13153
13169
  signal: name
13154
13170
  },
13155
- { 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
+ }
13156
13178
  ],
13157
13179
  signal: name
13158
13180
  }, {
@@ -13611,5 +13633,5 @@ function registerSignalsCommands(registry) {
13611
13633
 
13612
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 };
13613
13635
 
13614
- //# debugId=7546BEAB36DCC91464756E2164756E21
13615
- //# sourceMappingURL=studio-a1pswps3.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-ympe0n7a.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-en82c639.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-5nz00bhh.js";
33
+ } from "./studio-dwdcr2e8.js";
34
34
  import {
35
35
  previewAssetSrc
36
- } from "./studio-c07s5ckd.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-ncn9e189.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-ez11dmdh.js";
17
17
  import {
18
18
  PUBLIC_DIR,
19
19
  normalizeProjectPath,
20
20
  encodeProjectPath
21
- } from "./studio-p6pmwkvh.js";
21
+ } from "./studio-3nprwbd9.js";
22
22
  import {
23
23
  contentMountFor,
24
24
  loopbackAssetSrc,
25
25
  projectLocales2,
26
26
  hostAssetDeclarations
27
- } from "./studio-c07s5ckd.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-en82c639.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-ympe0n7a.js";
15
+ } from "./studio-ag3z6shb.js";
16
16
  import {
17
17
  showModal,
18
18
  close2
19
- } from "./studio-p6pmwkvh.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-wjpgxywa.js.map
367
+ //# debugId=2E3AA6611B2C5CA164756E2164756E21
368
+ //# sourceMappingURL=studio-sjas5b3a.js.map