@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
@@ -1,5 +1,6 @@
1
1
  import { computed, reactive, toRaw } from "../reactivity";
2
2
  import { commitTabBuffers } from "../services/monaco-buffer";
3
+ import { resetAiWrites } from "../services/ai-writes";
3
4
  import { ensureCollab, rekeyCollab } from "../collab/collab-session";
4
5
  import { createTab, disposeTab } from "../tabs/tab";
5
6
  import { projectState } from "../state";
@@ -12,7 +13,7 @@ import {
12
13
  } from "../commands/command-args";
13
14
  import { EDITOR_KIND_LABELS } from "../commands/context";
14
15
  import type { Tab, TabOrigin } from "../tabs/tab";
15
- import type { JsonLayout } from "../files/json-layout";
16
+ import type { JsonLayout } from "@jxsuite/schema/json-layout";
16
17
 
17
18
  import type { ComponentEntry } from "../files/components";
18
19
  import type { AnyCommand, CommandRegistry } from "../commands/registry";
@@ -35,11 +36,11 @@ export interface ClosedTabRecord {
35
36
  const CLOSED_TAB_LIMIT = 20;
36
37
 
37
38
  /**
38
- * One editor pane — the unit of split, focus and zoom (§4.1).
39
+ * One editor pane — the unit of split, focus and zoom (§18.1).
39
40
  *
40
41
  * A tab BELONGS to a pane, and the pane is what splits; the tab strip is per-pane for the same
41
- * reason. This is the minimal model P3 asks for: an ordered list and an active id, with no rules
42
- * for derived panes and no follow behaviour (those are P8).
42
+ * reason. The model is deliberately minimal, an ordered list and an active id; derived panes and
43
+ * their follow behaviour (§18.4) sit beside it in `derived` rather than in either.
43
44
  */
44
45
  export interface Pane {
45
46
  id: string;
@@ -357,10 +358,10 @@ export function focusOtherPane() {
357
358
  * `session.ui.canvasMode`), one picked the replacement kind, and two narrowed what the controls
358
359
  * offered so no dropdown could contain an entry the app would refuse.
359
360
  *
360
- * The cap existed because a second LIVE canvas host was unaffordable, and it is gone because
361
- * workstream 1 made it affordable — see {@link MAX_PANES}. Its LAST act was a bug: `capToPaneKind`
362
- * flipped a splitting Design tab to `source` before focus moved, so `⌘\` on a page you were
363
- * designing silently became "open this as Code somewhere else".
361
+ * The cap existed because a second LIVE canvas host was unaffordable, and it is gone because render
362
+ * fan-out (§18.2) made it affordable — see {@link MAX_PANES}. Its LAST act was a bug:
363
+ * `capToPaneKind` flipped a splitting Design tab to `source` before focus moved, so `⌘\` on a page
364
+ * you were designing silently became "open this as Code somewhere else".
364
365
  *
365
366
  * What replaces them is `tabs/tab.ts`'s `editorKindsOf` — the kinds a DOCUMENT declares — which is
366
367
  * the only narrowing left and the only one that was ever about the document rather than about what
@@ -371,7 +372,7 @@ export function focusOtherPane() {
371
372
  * Split the grid and move a tab into the new pane, which becomes focused.
372
373
  *
373
374
  * Moves rather than duplicates: one tab is one document with one undo history and one collab
374
- * session, and two strips claiming the same id is the duplicate-`repeat`-key bug §4.3 describes.
375
+ * session, and two strips claiming the same id is the duplicate-`repeat`-key bug §14.1 describes.
375
376
  *
376
377
  * The subject is `tabId` when given, else the focused pane's active tab. The drag resolver names
377
378
  * the tab it is carrying — the gesture points at a chip, not at whatever the keyboard is in — and
@@ -607,11 +608,11 @@ export function paneIsEmpty(pane: Pane): boolean {
607
608
  return pane.tabOrder.length === 0 && pane.derived === null;
608
609
  }
609
610
 
610
- /* No `togglePaneZoom`. Zoom is a view of a GRID, and there is no grid: §18.3 hands the one stage
611
- between panes, so the focused pane already fills the shell and the other one is not on screen to
612
- be zoomed away from. The state existed, both commands wrote it, and nothing that draws ever read
613
- it — a control whose only observable effect is on itself. It comes back with the second live
614
- host, and not one release earlier. */
611
+ /* No `togglePaneZoom`. It was removed when the shell still handed one stage between panes: the
612
+ focused pane already filled the shell, so the state existed, both commands wrote it, and nothing
613
+ that draws ever read it — a control whose only observable effect is on itself. There is a grid of
614
+ live panes now (§18.3), so a zoom is buildable, but no section of studio.md asks for one; it
615
+ comes back with the section that does, and not one release earlier. */
615
616
 
616
617
  /**
617
618
  * Remove a tab id from whichever pane holds it, without touching the tab itself.
@@ -696,6 +697,13 @@ function defaultSlot(pane: Pane, tabId: string): number {
696
697
  * @param {object | null} [config]
697
698
  */
698
699
  export function setWorkspaceProject(root: string | null, config: object | null = null) {
700
+ /* Leaving a project drops the assistant's record of what each turn changed (ai.md §3.2). It
701
+ names project-relative paths, and its Restore undoes the active tab, so carried into another
702
+ project it would list files that are not there and undo a document the turn never touched.
703
+ Adopting a project from none keeps it: a bootstrap conversation follows the project it made. */
704
+ if (workspace.projectRoot && root !== workspace.projectRoot) {
705
+ resetAiWrites();
706
+ }
699
707
  workspace.projectRoot = root;
700
708
  workspace.projectConfig = config;
701
709
  }
@@ -820,12 +828,12 @@ function setActiveTab(tabId: string, opts: { cycling?: boolean; focus?: boolean
820
828
  * keys. Callers that mean "show me this file" should use `files/files.ts`'s `openFileInTab`, which
821
829
  * activates the existing tab instead.
822
830
  *
823
- * `preview: true` opens a DISPOSABLE tab (§4.3): single-clicking through the tree or the palette is
824
- * browsing, and browsing must not litter, so the next preview open in the same pane takes its slot.
825
- * It is opt-in rather than the default because only the CALLER knows whether the author was
826
- * browsing or committing — an author who typed a new file name has committed, and silently
827
- * discarding that tab on their next click is the one failure a preview tab must never have.
828
- * {@link promoteTab} records a commitment made after the fact.
831
+ * `preview: true` opens a DISPOSABLE tab (docs/studio/interface/tabs.md): single-clicking through
832
+ * the tree or the palette is browsing, and browsing must not litter, so the next preview open in
833
+ * the same pane takes its slot. It is opt-in rather than the default because only the CALLER knows
834
+ * whether the author was browsing or committing — an author who typed a new file name has
835
+ * committed, and silently discarding that tab on their next click is the one failure a preview tab
836
+ * must never have. {@link promoteTab} records a commitment made after the fact.
829
837
  *
830
838
  * `paneId` says WHERE, and `focus` says whether the keyboard goes with it. Both default to today's
831
839
  * answer — the focused pane, and yes — because "open this document" has always meant "in front of
@@ -1383,12 +1391,12 @@ export function tabCommands(deps: TabCommandDeps): AnyCommand[] {
1383
1391
  "Use it when the user should SEE the page, or for iterative visual refinement after " +
1384
1392
  "creating a page or component.",
1385
1393
  name: "open_document",
1386
- /* The person's own read: `activeTab` is what the tab strip highlights, and `editor.kind`
1387
- is the fact the document-tree tier is gated on. Both are named so the model learns in one
1394
+ /* The person's own read: `activeTab` is what the tab strip highlights, and `editor.kind` is
1395
+ the fact the document-tree tier is gated on. Both are named so the model learns in one
1388
1396
  round whether the tree tools reach the file it opened — a `.csv` lands in the Grid, a
1389
1397
  `.png` in the Media viewer, and neither is an element tree. The `.value` read is module
1390
- state, which a projected `report` may close over (§12.4); `after` alone cannot say WHICH
1391
- document is active. */
1398
+ state, which a projected `report` may close over (studio-ui-guidelines.md §12.4); `after`
1399
+ alone cannot say WHICH document is active. */
1392
1400
  report: ({ after, args }) => {
1393
1401
  const path = stringArg("document.open", args, "path");
1394
1402
  const active = activeTab.value?.documentPath ?? null;
@@ -1402,11 +1410,12 @@ export function tabCommands(deps: TabCommandDeps): AnyCommand[] {
1402
1410
  return `"${path}" is the active document, ${where}.`;
1403
1411
  },
1404
1412
  },
1405
- /* Refuses by THROWING (§12.4's first review rule). `openFileInTab` reports a file it cannot
1406
- open as a Problem and returns normally — the right answer for a click in the Files tree,
1407
- where the toast is in front of the person — so the record has to look for the tab itself.
1408
- The hand tool this replaced read `getTab()` after the open and called whatever it found a
1409
- success, so a missing file left the PREVIOUS document active and reported "Switched to". */
1413
+ /* Refuses by THROWING (studio-ui-guidelines.md §12.4's first review rule). `openFileInTab`
1414
+ reports a file it cannot open as a Problem and returns normally — the right answer for a
1415
+ click in the Files tree, where the toast is in front of the person — so the record has to
1416
+ look for the tab itself. The hand tool this replaced read `getTab()` after the open and
1417
+ called whatever it found a success, so a missing file left the PREVIOUS document active and
1418
+ reported "Switched to". */
1410
1419
  run: async (_ctx, args) => {
1411
1420
  const path = stringArg("document.open", args, "path");
1412
1421
  await deps.openFile(path);
@@ -1435,8 +1444,9 @@ export function tabCommands(deps: TabCommandDeps): AnyCommand[] {
1435
1444
  group: "1_file",
1436
1445
  when: (ctx) => ctx.project.open,
1437
1446
  requires: "an open project",
1438
- /* No `aiTool`, by §12.4's first deletion rule: chrome — it arranges what the person is
1439
- looking at. No `undo`: opening a tab is not a state the undo stack owns. */
1447
+ /* No `aiTool`, by studio-ui-guidelines.md §12.4's first deletion rule: chrome — it arranges
1448
+ what the person is looking at. No `undo`: opening a tab is not a state the undo stack
1449
+ owns. */
1440
1450
  undo: "none",
1441
1451
  /* The non-drag equivalent of dragging a file row onto the other pane's strip (SC 2.5.7): the
1442
1452
  same `receivingPane` the drag resolver uses, so a file tree row and this command can never
@@ -1550,12 +1560,12 @@ export function tabCommands(deps: TabCommandDeps): AnyCommand[] {
1550
1560
  * The pane commands.
1551
1561
  *
1552
1562
  * They live beside the pane model for the same reason the tab commands do, and they are the whole
1553
- * user-facing surface of §4.1's Pane transport: split, focus, unsplit, zoom.
1563
+ * user-facing surface of the pane transport (§18.1): split, focus, unsplit, zoom.
1554
1564
  *
1555
1565
  * `⌘0` and `⌘⌥0` are a PAIR, and they are both bound. `⌘0` was `canvas.zoomReset`, which held it
1556
- * for the one verb of the zoom cluster that also has a button in the floating zoom pod (§3.2 ⑩) —
1557
- * so the chord was the second way to reach a control that is already on screen, while focusing a
1558
- * pane had no way at all. The zoom keeps its pod button and gives up the key.
1566
+ * for the one verb of the zoom cluster that also has a button in the floating zoom pod — so the
1567
+ * chord was the second way to reach a control that is already on screen, while focusing a pane had
1568
+ * no way at all. The zoom keeps its pod button and gives up the key.
1559
1569
  *
1560
1570
  * @param {TabCommandDeps} deps
1561
1571
  * @returns {AnyCommand[]}
@@ -1604,13 +1614,13 @@ export function paneCommands(deps: TabCommandDeps): AnyCommand[] {
1604
1614
  /* This is NOT `pane.derive`, and the distinction is the whole reason both exist. `derive`
1605
1615
  shows a projection OF THIS PANE — its Code, its diff, the same page at another breakpoint —
1606
1616
  and follows it. `compareWith` puts THAT DOCUMENT beside this one and then leaves it alone.
1607
- Collapsing them would give "open a second document in the other pane" two definition
1608
- sites, which is how the two names in §4.1 came to disagree in the first place. */
1617
+ Collapsing them would give "open a second document in the other pane" two definition sites,
1618
+ which is how the shell redesign's two names for it came to disagree in the first place. */
1609
1619
  enablement: () => workspace.activeTabId !== null,
1610
1620
  requires: "an open document",
1611
1621
  undo: "none",
1612
- /* No `aiTool`, by §12.4's first deletion rule: chrome — it arranges what the person is
1613
- looking at. */
1622
+ /* No `aiTool`, by studio-ui-guidelines.md §12.4's first deletion rule: chrome — it arranges
1623
+ what the person is looking at. */
1614
1624
  run: async (_ctx, args) => {
1615
1625
  const path = stringArg("pane.compareWith", args, "path");
1616
1626
  const here = activePane();
package/styles/canvas.css CHANGED
@@ -18,32 +18,6 @@
18
18
  min-height: 0;
19
19
  }
20
20
 
21
- /* ─── Document Header card ─────────────────────
22
- Region ⑧: the artefact's own header, drawn IN the stage. `#frontmatter-panel` — a fourth
23
- full-width band up to 40vh that appeared and vanished as a side effect of the canvas mode — is
24
- gone, grid row and all.
25
-
26
- Two placements, because the stage draws a page two ways. In Edit the card is `in-column`: a block
27
- of the document's own centered column that scrolls with it, so it is part of the artefact rather
28
- than a strip above it. In Design the artboards are under a pan/zoom transform, and a form drawn
29
- at 40% is a picture of a form — so the card is `pinned` above the surface at 1:1, and that is the
30
- one placement that still needs a cap. */
31
- .doc-header-host[hidden] {
32
- display: none;
33
- }
34
- .doc-header-host.in-column {
35
- display: block;
36
- padding-bottom: 16px;
37
- }
38
- .doc-header-host.pinned {
39
- flex-shrink: 0;
40
- max-height: 40vh;
41
- overflow-y: auto;
42
- }
43
- .doc-header-host.pinned .doc-header {
44
- border-width: 0 0 1px;
45
- border-radius: 0;
46
- }
47
21
  /* ─── Content edit mode canvas ─────────────── */
48
22
  .content-edit-canvas {
49
23
  width: 100%;
@@ -201,7 +175,7 @@
201
175
  .overlay-coselection-group {
202
176
  display: contents;
203
177
  }
204
- /* The other members of a multi-selection (§6.5). Same accent, thinner: one box is the primary —
178
+ /* The other members of a multi-selection (§6.7). Same accent, thinner: one box is the primary —
205
179
  what the Inspector, the block action bar and the status bar address — and the rest are along for
206
180
  the batch. A selection of one draws no co-selection boxes at all. */
207
181
  .overlay-coselection {
@@ -76,7 +76,7 @@
76
76
  text-decoration: underline;
77
77
  }
78
78
 
79
- /* ─── Provenance dots on a section heading (plan §6.2) ────────────────────────
79
+ /* ─── Provenance dots on a section heading (§6.7) ─────────────────────────────
80
80
  The chip itself is styled with the rest of the row vocabulary further down —
81
81
  one block, because Style and Component Props are the same chip in two
82
82
  cascades. What is only needed here is the DOT form: a collapsed accordion
@@ -93,7 +93,7 @@
93
93
  border: none;
94
94
  cursor: default;
95
95
  }
96
- /* `mixed` (§6.5) — the multi-selection's own state. Neutral on purpose: unlike the other three it
96
+ /* `mixed` (§6.7) — the multi-selection's own state. Neutral on purpose: unlike the other three it
97
97
  says nothing about WHERE the value came from, only that the selected elements disagree, so it
98
98
  must not borrow the accent that means "set here" or the amber that means "inherited". */
99
99
  .set-dot.provenance-chip--mixed {
@@ -146,7 +146,8 @@
146
146
  }
147
147
 
148
148
  /* ─── The Layout-element card ───────────────────────────────────────────────
149
- What the inspector says when you click page chrome — §8.2's first click. */
149
+ What the inspector says when you click page chrome — the first click a new author makes
150
+ (docs/studio/design/properties.md, "Layout elements"). */
150
151
  .layout-origin {
151
152
  display: flex;
152
153
  align-items: center;
@@ -232,7 +232,7 @@
232
232
  color: var(--danger);
233
233
  }
234
234
 
235
- /* ─── ④ The toast host — the fourth overlay layer ─────────────────────────── */
235
+ /* ─── The toast host — the fourth overlay layer ───────────────────────────── */
236
236
  /* The consequence line inside a destructive confirmation — what this delete or rename breaks, and
237
237
  what survives it. Set apart from the question above it, because the question is a sentence the
238
238
  user already wrote in their head and this is the part they have not thought about. */
package/styles/tokens.css CHANGED
@@ -12,7 +12,11 @@
12
12
 
13
13
  The four --canvas-* steps are the exception and are meant to be: they colour surfaces that
14
14
  render as a light DOCUMENT in both chromes, so they are mixed from the black and white keywords
15
- and do not follow the theme. See tokens.json for what else moved here out of styles/spectrum.css. */
15
+ and do not follow the theme. See tokens.json for what else moved here out of styles/spectrum.css.
16
+
17
+ user-select: none on :root is Studio's selection policy: the chrome is not text. Every surface
18
+ inherits it, a modal dialog restates it below, and a part whose text the reader must copy opts
19
+ back in from its own surface document, against the list tests/selection-policy.test.ts holds. */
16
20
 
17
21
  :root {
18
22
  box-sizing: border-box;
@@ -24,6 +28,7 @@
24
28
  font-family: var(--jx-font-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif);
25
29
  font-size: var(--jx-text-md, 12px);
26
30
  line-height: 1.5;
31
+ user-select: none;
27
32
  --panel-w-left: 240px;
28
33
  --panel-w-right: 280px;
29
34
  --bg: var(--jx-bg, #111114);
@@ -89,6 +94,17 @@
89
94
  overflow: hidden;
90
95
  background: var(--jx-bg, #111114);
91
96
  }
97
+ /* The root's `user-select: none` restated, because a modal dialog would otherwise take it back:
98
+ Chromium's UA sheet gives a MODAL dialog `user-select: text` (measured: `auto` while closed or
99
+ after show(), `text` after showModal()), and Blink inherits that into every node inside. Every
100
+ Studio modal is a jx-dialog opened with showModal(), so without this rule the headline, labels
101
+ and buttons of every dialog would be selectable whatever the root says. An author rule beats the
102
+ UA one at any specificity, since it is not `!important`. A dialog's MESSAGE opts back in from
103
+ its own surface document (`surfaces/dialog.json`), and an input inside one stays selectable
104
+ without help. */
105
+ :root dialog {
106
+ user-select: none;
107
+ }
92
108
  :root[data-theme="light"],
93
109
  :root[data-theme="light"] body {
94
110
  background: var(--jx-bg, #f7f7f9);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://jxsuite.com/schema/v1",
3
3
  "$id": "StudioTokens",
4
- "$description": "Studio's global base and its semantic token layer, as a Jx style block. `styles/tokens.css` is GENERATED from this by `scripts/build-styles.ts`; edit this file and run `bun run styles:sync`. It stays a linked stylesheet because every declaration in it is pre-paint: the kit's own theme is adopted from JavaScript, so these hex fallbacks are what paints the shell before that lands. THE LAST OF `styles/spectrum.css` IS HERE. That file was the whole of what was declared ON the `sp-theme` element, where Spectrum's own ramp was in scope and `:root` was not, and its header said it would be deleted whole when that element went. It has: the box is `#shell-root` in `shell-frame.json`, the typography is the four declarations above (the sans stack is the kit's and 12px is `--jx-text-md`, which is what `--spectrum-font-size-75` resolved to), and `--case-c`/`--slot-c` are aliases in the same idiom as `--switch-c`, at the values `panel-outline.json` had already written down as their fallbacks. THE FOUR `--canvas-*` STEPS DO NOT FOLLOW THE THEME, and that is the point of them rather than an oversight: they colour surfaces that render as a light DOCUMENT in both chromes — the stylebook, the element-card previews, the empty-slot placeholder on the canvas — so they are mixed from the `black` and `white` KEYWORDS, which is what `var(--spectrum-black)`/`var(--spectrum-white)` were. Seven more steps were declared beside them and no rule in the package ever read one, so those are not here. The four `--data-*` syntax colours are not here either, for a reason `panel-data.json` states outright: nothing read them, they were declared for a palette nobody wrote, and `data-tone` still carries the type on every value for the day somebody does.",
4
+ "$description": "Studio's global base and its semantic token layer, as a Jx style block. `styles/tokens.css` is GENERATED from this by `scripts/build-styles.ts`; edit this file and run `bun run styles:sync`. It stays a linked stylesheet because every declaration in it is pre-paint: the kit's own theme is adopted from JavaScript, so these hex fallbacks are what paints the shell before that lands. THE LAST OF `styles/spectrum.css` IS HERE. That file was the whole of what was declared ON the `sp-theme` element, where Spectrum's own ramp was in scope and `:root` was not, and its header said it would be deleted whole when that element went. It has: the box is `#shell-root` in `shell-frame.json`, the typography is the four declarations above (the sans stack is the kit's and 12px is `--jx-text-md`, which is what `--spectrum-font-size-75` resolved to), and `--case-c`/`--slot-c` are aliases in the same idiom as `--switch-c`, at the values `panel-outline.json` had already written down as their fallbacks. THE FOUR `--canvas-*` STEPS DO NOT FOLLOW THE THEME, and that is the point of them rather than an oversight: they colour surfaces that render as a light DOCUMENT in both chromes — the stylebook, the element-card previews, the empty-slot placeholder on the canvas — so they are mixed from the `black` and `white` KEYWORDS, which is what `var(--spectrum-black)`/`var(--spectrum-white)` were. Seven more steps were declared beside them and no rule in the package ever read one, so those are not here. The four `--data-*` syntax colours are not here either, for a reason `panel-data.json` states outright: nothing read them, they were declared for a palette nobody wrote, and `data-tone` still carries the type on every value for the day somebody does. THE CHROME IS NOT TEXT: `user-select: none` on the root is Studio's selection policy, stated once so a drag across the window highlights no label, button or heading; every surface inherits it, `& dialog` restates it where the UA sheet would reopen it, and a part whose text the reader must copy opts back in on that part alone, from its own surface document, against the list `tests/selection-policy.test.ts` holds. Editable controls, Monaco and the canvas iframe keep their own selection and need nothing.",
5
5
  "tagName": "html",
6
6
  "style": {
7
7
  "box-sizing": "border-box",
@@ -13,6 +13,7 @@
13
13
  "font-family": "var(--jx-font-sans, -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif)",
14
14
  "font-size": "var(--jx-text-md, 12px)",
15
15
  "line-height": "1.5",
16
+ "user-select": "none",
16
17
  "--panel-w-left": "240px",
17
18
  "--panel-w-right": "280px",
18
19
  "--bg": "var(--jx-bg, #111114)",
@@ -77,6 +78,10 @@
77
78
  "overflow": "hidden",
78
79
  "background": "var(--jx-bg, #111114)"
79
80
  },
81
+ "& dialog": {
82
+ "$description": "The root's `user-select: none` restated, because a modal dialog would otherwise take it back: Chromium's UA sheet gives a MODAL dialog `user-select: text` (measured: `auto` while closed or after show(), `text` after showModal()), and Blink inherits that into every node inside. Every Studio modal is a jx-dialog opened with showModal(), so without this rule the headline, labels and buttons of every dialog would be selectable whatever the root says. An author rule beats the UA one at any specificity, since it is not `!important`. A dialog's MESSAGE opts back in from its own surface document (`surfaces/dialog.json`), and an input inside one stays selectable without help.",
83
+ "user-select": "none"
84
+ },
80
85
  "&[data-theme=\"light\"], &[data-theme=\"light\"] body": {
81
86
  "background": "var(--jx-bg, #f7f7f9)"
82
87
  }
@@ -1,42 +0,0 @@
1
- import {
2
- createEntry2,
3
- registerContentCommands2
4
- } from "./studio-68fydsrj.js";
5
- import"./studio-hdc2jt3z.js";
6
- import"./studio-ctm7bhx5.js";
7
- import"./studio-5t7ena5z.js";
8
- import"./studio-x10fp4tp.js";
9
- import"./studio-4c041r8y.js";
10
- import"./studio-q0a3yk4n.js";
11
- import"./studio-4r14yzyy.js";
12
- import"./studio-y4f9fdge.js";
13
- import"./studio-9j6sfeba.js";
14
- import"./studio-x72j58vw.js";
15
- import"./studio-nq5yf5mp.js";
16
- import"./studio-etvx9s2g.js";
17
- import"./studio-mpzwze9x.js";
18
- import"./studio-zjjde71a.js";
19
- import"./studio-z2smx5ce.js";
20
- import"./studio-en82c639.js";
21
- import"./studio-c07s5ckd.js";
22
- import"./studio-ez11dmdh.js";
23
- import"./studio-wnsyffg1.js";
24
- import"./studio-m1p9b6c3.js";
25
- import"./studio-esrxgwh6.js";
26
- import"./studio-28vs5k2y.js";
27
- import"./studio-6nzaktvy.js";
28
- import"./studio-qa7fzxan.js";
29
- import"./studio-ympe0n7a.js";
30
- import"./studio-1k325pwf.js";
31
- import"./studio-p6pmwkvh.js";
32
- import"./studio-yxa81f45.js";
33
- import"./studio-3ntvq6cg.js";
34
- import"./studio-d8z5bajd.js";
35
- import"./studio-tjjk7jvk.js";
36
- export {
37
- createEntry2 as createEntry,
38
- registerContentCommands2 as registerContentCommands
39
- };
40
-
41
- //# debugId=474288D19E3E71A764756E2164756E21
42
- //# sourceMappingURL=entry-commands-w9qsxa6q.js.map
@@ -1,40 +0,0 @@
1
- import {
2
- startLayerTitleEdit2,
3
- registerLayersPanel2
4
- } from "./studio-hhskq2mr.js";
5
- import"./studio-2mdbbc76.js";
6
- import"./studio-a1pswps3.js";
7
- import"./studio-ncn9e189.js";
8
- import"./studio-5nz00bhh.js";
9
- import"./studio-ctm7bhx5.js";
10
- import"./studio-q0a3yk4n.js";
11
- import"./studio-4r14yzyy.js";
12
- import"./studio-x72j58vw.js";
13
- import"./studio-nq5yf5mp.js";
14
- import"./studio-etvx9s2g.js";
15
- import"./studio-mpzwze9x.js";
16
- import"./studio-zjjde71a.js";
17
- import"./studio-z2smx5ce.js";
18
- import"./studio-en82c639.js";
19
- import"./studio-c07s5ckd.js";
20
- import"./studio-ez11dmdh.js";
21
- import"./studio-wnsyffg1.js";
22
- import"./studio-m1p9b6c3.js";
23
- import"./studio-esrxgwh6.js";
24
- import"./studio-28vs5k2y.js";
25
- import"./studio-6nzaktvy.js";
26
- import"./studio-qa7fzxan.js";
27
- import"./studio-ympe0n7a.js";
28
- import"./studio-1k325pwf.js";
29
- import"./studio-p6pmwkvh.js";
30
- import"./studio-yxa81f45.js";
31
- import"./studio-3ntvq6cg.js";
32
- import"./studio-d8z5bajd.js";
33
- import"./studio-tjjk7jvk.js";
34
- export {
35
- registerLayersPanel2 as registerLayersPanel,
36
- startLayerTitleEdit2 as startLayerTitleEdit
37
- };
38
-
39
- //# debugId=0A17594D4CFC8C3764756E2164756E21
40
- //# sourceMappingURL=layers-panel-fksbdg4q.js.map
@@ -1,27 +0,0 @@
1
- import {
2
- seedPublishConnected2,
3
- openPublishPanel2
4
- } from "./studio-14d9tq4d.js";
5
- import"./studio-vn5hske5.js";
6
- import"./studio-c04nzbby.js";
7
- import"./studio-9j6sfeba.js";
8
- import"./studio-mpzwze9x.js";
9
- import"./studio-z2smx5ce.js";
10
- import"./studio-ez11dmdh.js";
11
- import"./studio-wnsyffg1.js";
12
- import"./studio-m1p9b6c3.js";
13
- import"./studio-28vs5k2y.js";
14
- import"./studio-6nzaktvy.js";
15
- import"./studio-ympe0n7a.js";
16
- import"./studio-1k325pwf.js";
17
- import"./studio-p6pmwkvh.js";
18
- import"./studio-yxa81f45.js";
19
- import"./studio-3ntvq6cg.js";
20
- import"./studio-d8z5bajd.js";
21
- export {
22
- openPublishPanel2 as openPublishPanel,
23
- seedPublishConnected2 as seedPublishConnected
24
- };
25
-
26
- //# debugId=6014AB98C3074CCB64756E2164756E21
27
- //# sourceMappingURL=publish-panel-vz23wwmg.js.map
@@ -1,46 +0,0 @@
1
- import {
2
- initQuickSearch2,
3
- openQuickSearch2
4
- } from "./studio-66arbpc2.js";
5
- import"./studio-01jeck2y.js";
6
- import"./studio-vt0tj32j.js";
7
- import"./studio-wjpgxywa.js";
8
- import"./studio-t171hxhe.js";
9
- import"./studio-5nz00bhh.js";
10
- import"./studio-hdc2jt3z.js";
11
- import"./studio-t3adrr56.js";
12
- import"./studio-5t7ena5z.js";
13
- import"./studio-x10fp4tp.js";
14
- import"./studio-4c041r8y.js";
15
- import"./studio-q0a3yk4n.js";
16
- import"./studio-4r14yzyy.js";
17
- import"./studio-y4f9fdge.js";
18
- import"./studio-9j6sfeba.js";
19
- import"./studio-x72j58vw.js";
20
- import"./studio-nq5yf5mp.js";
21
- import"./studio-etvx9s2g.js";
22
- import"./studio-mpzwze9x.js";
23
- import"./studio-zjjde71a.js";
24
- import"./studio-z2smx5ce.js";
25
- import"./studio-en82c639.js";
26
- import"./studio-c07s5ckd.js";
27
- import"./studio-ez11dmdh.js";
28
- import"./studio-wnsyffg1.js";
29
- import"./studio-m1p9b6c3.js";
30
- import"./studio-esrxgwh6.js";
31
- import"./studio-28vs5k2y.js";
32
- import"./studio-6nzaktvy.js";
33
- import"./studio-qa7fzxan.js";
34
- import"./studio-ympe0n7a.js";
35
- import"./studio-1k325pwf.js";
36
- import"./studio-p6pmwkvh.js";
37
- import"./studio-yxa81f45.js";
38
- import"./studio-3ntvq6cg.js";
39
- import"./studio-d8z5bajd.js";
40
- export {
41
- initQuickSearch2 as initQuickSearch,
42
- openQuickSearch2 as openQuickSearch
43
- };
44
-
45
- //# debugId=1B07B932BE385C7264756E2164756E21
46
- //# sourceMappingURL=quick-search-e9rp74m8.js.map
@@ -1,45 +0,0 @@
1
- import {
2
- mount2,
3
- unmount2,
4
- render2,
5
- inspectorTab2,
6
- setInspectorTab2
7
- } from "./studio-15f3kxqe.js";
8
- import"./studio-2mdbbc76.js";
9
- import"./studio-a1pswps3.js";
10
- import"./studio-ncn9e189.js";
11
- import"./studio-5nz00bhh.js";
12
- import"./studio-ctm7bhx5.js";
13
- import"./studio-4r14yzyy.js";
14
- import"./studio-x72j58vw.js";
15
- import"./studio-nq5yf5mp.js";
16
- import"./studio-etvx9s2g.js";
17
- import"./studio-mpzwze9x.js";
18
- import"./studio-zjjde71a.js";
19
- import"./studio-z2smx5ce.js";
20
- import"./studio-en82c639.js";
21
- import"./studio-c07s5ckd.js";
22
- import"./studio-ez11dmdh.js";
23
- import"./studio-wnsyffg1.js";
24
- import"./studio-m1p9b6c3.js";
25
- import"./studio-esrxgwh6.js";
26
- import"./studio-28vs5k2y.js";
27
- import"./studio-6nzaktvy.js";
28
- import"./studio-qa7fzxan.js";
29
- import"./studio-ympe0n7a.js";
30
- import"./studio-1k325pwf.js";
31
- import"./studio-p6pmwkvh.js";
32
- import"./studio-yxa81f45.js";
33
- import"./studio-3ntvq6cg.js";
34
- import"./studio-d8z5bajd.js";
35
- import"./studio-tjjk7jvk.js";
36
- export {
37
- inspectorTab2 as inspectorTab,
38
- mount2 as mount,
39
- render2 as render,
40
- setInspectorTab2 as setInspectorTab,
41
- unmount2 as unmount
42
- };
43
-
44
- //# debugId=ACC2FC3785A3466764756E2164756E21
45
- //# sourceMappingURL=right-panel-j97t2yvy.js.map
@@ -1,76 +0,0 @@
1
- // ../collab/src/ops.ts
2
- function jsonClone(value) {
3
- return JSON.parse(JSON.stringify(value));
4
- }
5
- function cloneValue2(v) {
6
- return v === undefined || v === null ? v : jsonClone(v);
7
- }
8
- function getNodeAtPath3(doc, path) {
9
- let node = doc;
10
- for (const key of path) {
11
- if (node == null) {
12
- return;
13
- }
14
- node = node[key];
15
- }
16
- return node;
17
- }
18
- function childArray2(node) {
19
- if (Array.isArray(node)) {
20
- throw new TypeError("Cannot insert into a children array; parentPath must point at a node");
21
- }
22
- if (!node.children) {
23
- node.children = [];
24
- }
25
- if (!Array.isArray(node.children)) {
26
- throw new TypeError("Cannot insert into mapped-array children; edit the map template instead");
27
- }
28
- return node.children;
29
- }
30
- function applyDocOpToDoc2(doc, op) {
31
- switch (op.op) {
32
- case "set-key": {
33
- const node = getNodeAtPath3(doc, op.path);
34
- if (!node) {
35
- throw new Error(`doc-op-node-not-found:${op.path.join("/")}`);
36
- }
37
- const target = node;
38
- if (op.value === undefined) {
39
- delete target[op.key];
40
- } else {
41
- target[op.key] = cloneValue2(op.value);
42
- }
43
- return;
44
- }
45
- case "insert-child": {
46
- const parent = getNodeAtPath3(doc, op.parentPath);
47
- childArray2(parent).splice(op.index, 0, cloneValue2(op.node));
48
- return;
49
- }
50
- case "remove-child": {
51
- const parent = getNodeAtPath3(doc, op.parentPath);
52
- childArray2(parent).splice(op.index, 1);
53
- return;
54
- }
55
- case "set-child": {
56
- const parent = getNodeAtPath3(doc, op.parentPath);
57
- childArray2(parent).splice(op.index, 1, cloneValue2(op.node));
58
- return;
59
- }
60
- case "move-child": {
61
- const fromParent = getNodeAtPath3(doc, op.fromParentPath);
62
- const toParent = getNodeAtPath3(doc, op.toParentPath);
63
- const [node] = childArray2(fromParent).splice(op.fromIndex, 1);
64
- childArray2(toParent).splice(op.toIndex, 0, node);
65
- return;
66
- }
67
- default: {
68
- throw new Error(`unknown-doc-op:${op.op}`);
69
- }
70
- }
71
- }
72
-
73
- export { cloneValue2, getNodeAtPath3, childArray2, applyDocOpToDoc2 };
74
-
75
- //# debugId=32556033BC6FC83D64756E2164756E21
76
- //# sourceMappingURL=studio-727xh0e3.js.map