@jxsuite/studio 2.0.1 → 2.1.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 (419) hide show
  1. package/canvas.html +21 -0
  2. package/dist/chunks/Overlay.dev-qfjzkms8.js +23 -0
  3. package/dist/chunks/{Overlay.dev-cszx7yn5.js.map → Overlay.dev-qfjzkms8.js.map} +1 -1
  4. package/dist/chunks/{adapter-z8fkmbmv.js → adapter-qfnesn5v.js} +2 -2
  5. package/dist/chunks/{cf-settings-mmyv436d.js → cf-settings-73sh5z4p.js} +3 -3
  6. package/dist/chunks/{components-799jpvhm.js → components-2bpqp4mq.js} +5 -7
  7. package/dist/chunks/{components-799jpvhm.js.map → components-2bpqp4mq.js.map} +1 -1
  8. package/dist/chunks/content-source-34gnkbnn.js +38 -0
  9. package/dist/chunks/content-source-34gnkbnn.js.map +9 -0
  10. package/dist/chunks/convert-to-repeater-t8kxre5s.js +258 -0
  11. package/dist/chunks/convert-to-repeater-t8kxre5s.js.map +10 -0
  12. package/dist/chunks/extension-sections-6mqydz35.js +301 -0
  13. package/dist/chunks/extension-sections-6mqydz35.js.map +11 -0
  14. package/dist/chunks/files-8kn321h1.js +70 -0
  15. package/dist/chunks/files-8kn321h1.js.map +9 -0
  16. package/dist/chunks/{format-host-8jxwts2p.js → format-host-mkwsmt8d.js} +3 -3
  17. package/dist/chunks/git-panel-tjbr191d.js +51 -0
  18. package/dist/chunks/git-panel-tjbr191d.js.map +9 -0
  19. package/dist/chunks/{index-baeg2x3y.js → index-7pxchcce.js} +4 -3
  20. package/dist/chunks/{index-baeg2x3y.js.map → index-7pxchcce.js.map} +3 -3
  21. package/dist/chunks/{jx-validate-qx8degj7.js → jx-validate-v6qgknrs.js} +3 -3
  22. package/dist/chunks/layers-panel-87pb25km.js +58 -0
  23. package/dist/chunks/layers-panel-87pb25km.js.map +9 -0
  24. package/dist/chunks/{monaco-setup-zjdp9zdw.js → monaco-setup-e0yh25j4.js} +4 -75
  25. package/dist/chunks/{monaco-setup-zjdp9zdw.js.map → monaco-setup-e0yh25j4.js.map} +3 -4
  26. package/dist/chunks/publish-panel-m0fcgdrt.js +21 -0
  27. package/dist/chunks/publish-panel-m0fcgdrt.js.map +9 -0
  28. package/dist/chunks/quick-search-rhs6cbsb.js +53 -0
  29. package/dist/chunks/quick-search-rhs6cbsb.js.map +9 -0
  30. package/dist/chunks/right-panel-zpdxd98t.js +37 -0
  31. package/dist/chunks/right-panel-zpdxd98t.js.map +9 -0
  32. package/dist/chunks/section-registry-zmckaxf4.js +30 -0
  33. package/dist/chunks/section-registry-zmckaxf4.js.map +9 -0
  34. package/dist/chunks/sp-overlay.dev-9ran0sfq.js +18 -0
  35. package/dist/chunks/sp-overlay.dev-9ran0sfq.js.map +9 -0
  36. package/dist/chunks/sp-popover.dev-rebmdncr.js +9 -0
  37. package/dist/chunks/sp-popover.dev-rebmdncr.js.map +9 -0
  38. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js +15 -0
  39. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js.map +9 -0
  40. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js +15 -0
  41. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js.map +9 -0
  42. package/dist/chunks/{sp-tray.dev-pb2fsd65.js → sp-tray.dev-ey59vfh7.js} +10 -8
  43. package/dist/chunks/{sp-tray.dev-pb2fsd65.js.map → sp-tray.dev-ey59vfh7.js.map} +2 -2
  44. package/dist/chunks/{studio-9qr6fq7p.js → studio-0rqqhrdy.js} +10 -378
  45. package/dist/chunks/{studio-9qr6fq7p.js.map → studio-0rqqhrdy.js.map} +4 -14
  46. package/dist/chunks/{studio-5x6tqqec.js → studio-2sj1jj3v.js} +10 -8
  47. package/dist/chunks/{studio-5x6tqqec.js.map → studio-2sj1jj3v.js.map} +2 -2
  48. package/dist/chunks/{studio-h3fw0wn8.js → studio-3fk1ac9z.js} +6 -4
  49. package/dist/chunks/{studio-h3fw0wn8.js.map → studio-3fk1ac9z.js.map} +2 -2
  50. package/dist/chunks/studio-41exgzhq.js +6690 -0
  51. package/dist/chunks/studio-41exgzhq.js.map +38 -0
  52. package/dist/chunks/{studio-7v2bpweq.js → studio-4mqb9a0j.js} +6 -4
  53. package/dist/chunks/{studio-7v2bpweq.js.map → studio-4mqb9a0j.js.map} +2 -2
  54. package/dist/chunks/studio-50k77cca.js +1787 -0
  55. package/dist/chunks/studio-50k77cca.js.map +18 -0
  56. package/dist/chunks/{studio-56v3zwk6.js → studio-6a0h7sne.js} +10 -8
  57. package/dist/chunks/{studio-56v3zwk6.js.map → studio-6a0h7sne.js.map} +2 -2
  58. package/dist/chunks/studio-6f0am8f2.js +53 -0
  59. package/dist/chunks/studio-6f0am8f2.js.map +10 -0
  60. package/dist/chunks/studio-6nmjc5qk.js +7002 -0
  61. package/dist/chunks/studio-6nmjc5qk.js.map +32 -0
  62. package/dist/chunks/studio-7afd21nw.js +67 -0
  63. package/dist/chunks/studio-7afd21nw.js.map +10 -0
  64. package/dist/chunks/{studio-xze4zrs1.js → studio-7bmdvzne.js} +2 -2
  65. package/dist/chunks/studio-7bmdvzne.js.map +10 -0
  66. package/dist/chunks/studio-8jpzqk5s.js +128 -0
  67. package/dist/chunks/studio-8jpzqk5s.js.map +10 -0
  68. package/dist/chunks/studio-94m77tgk.js +1482 -0
  69. package/dist/chunks/studio-94m77tgk.js.map +13 -0
  70. package/dist/chunks/studio-9je6w5sq.js +1000 -0
  71. package/dist/chunks/studio-9je6w5sq.js.map +16 -0
  72. package/dist/chunks/{studio-w7c6kvk7.js → studio-a7pzveq1.js} +2 -2
  73. package/dist/chunks/{studio-gs6kqdt1.js → studio-adn0z1k3.js} +14 -8
  74. package/dist/chunks/{studio-gs6kqdt1.js.map → studio-adn0z1k3.js.map} +3 -3
  75. package/dist/chunks/{studio-kr88ryr7.js → studio-bsxxx3x2.js} +17 -15
  76. package/dist/chunks/{studio-kr88ryr7.js.map → studio-bsxxx3x2.js.map} +7 -6
  77. package/dist/chunks/studio-bw5dz6km.js +608 -0
  78. package/dist/chunks/studio-bw5dz6km.js.map +21 -0
  79. package/dist/chunks/studio-c6s5getc.js +4232 -0
  80. package/dist/chunks/studio-c6s5getc.js.map +39 -0
  81. package/dist/chunks/studio-cjm7fdjf.js +451 -0
  82. package/dist/chunks/studio-cjm7fdjf.js.map +14 -0
  83. package/dist/chunks/{studio-cx91mnh8.js → studio-ckwz4d3x.js} +53 -53
  84. package/dist/chunks/{studio-cx91mnh8.js.map → studio-ckwz4d3x.js.map} +5 -5
  85. package/dist/chunks/studio-dg7zyt5x.js +28 -0
  86. package/dist/chunks/studio-dg7zyt5x.js.map +10 -0
  87. package/dist/chunks/studio-dzcyvvvz.js +166 -0
  88. package/dist/chunks/studio-dzcyvvvz.js.map +10 -0
  89. package/dist/chunks/{studio-7kqe41sa.js → studio-evkr5d3b.js} +15 -7
  90. package/dist/chunks/{studio-7kqe41sa.js.map → studio-evkr5d3b.js.map} +5 -4
  91. package/dist/chunks/studio-f12h6177.js +411 -0
  92. package/dist/chunks/studio-f12h6177.js.map +13 -0
  93. package/dist/chunks/studio-hbp1s8m9.js +1817 -0
  94. package/dist/chunks/studio-hbp1s8m9.js.map +14 -0
  95. package/dist/chunks/studio-k2sxjph5.js +15295 -0
  96. package/dist/chunks/studio-k2sxjph5.js.map +235 -0
  97. package/dist/chunks/studio-myje51t3.js +385 -0
  98. package/dist/chunks/studio-myje51t3.js.map +12 -0
  99. package/dist/chunks/studio-na6rwzhw.js +353 -0
  100. package/dist/chunks/studio-na6rwzhw.js.map +11 -0
  101. package/dist/chunks/{studio-4k0m4fmp.js → studio-p471gg5n.js} +126 -3
  102. package/dist/chunks/studio-p471gg5n.js.map +14 -0
  103. package/dist/chunks/{studio-9bjwf0d4.js → studio-rgwcpast.js} +5 -46
  104. package/dist/chunks/{studio-9bjwf0d4.js.map → studio-rgwcpast.js.map} +4 -5
  105. package/dist/chunks/{studio-esrewxap.js → studio-s519zc99.js} +3 -3
  106. package/dist/chunks/studio-sas7mt3k.js +75 -0
  107. package/dist/chunks/studio-sas7mt3k.js.map +10 -0
  108. package/dist/chunks/studio-t5wqwzdh.js +74 -0
  109. package/dist/chunks/studio-t5wqwzdh.js.map +10 -0
  110. package/dist/chunks/{studio-9qpspwfn.js → studio-temv5bw4.js} +5 -5
  111. package/dist/chunks/{studio-9qpspwfn.js.map → studio-temv5bw4.js.map} +1 -1
  112. package/dist/chunks/{studio-qkvt37c0.js → studio-tr20m8g8.js} +669 -18
  113. package/dist/chunks/studio-tr20m8g8.js.map +9 -0
  114. package/dist/chunks/{studio-v7jkjqng.js → studio-v96qfnww.js} +5514 -4291
  115. package/dist/chunks/studio-v96qfnww.js.map +54 -0
  116. package/dist/chunks/studio-vcetc91k.js +659 -0
  117. package/dist/chunks/studio-vcetc91k.js.map +10 -0
  118. package/dist/chunks/{studio-jm0z592w.js → studio-vmymjefp.js} +2972 -4937
  119. package/dist/chunks/studio-vmymjefp.js.map +98 -0
  120. package/dist/chunks/{studio-bghqfmea.js → studio-wwseqyw0.js} +2 -2
  121. package/dist/chunks/studio-x9hmy5kr.js +390 -0
  122. package/dist/chunks/studio-x9hmy5kr.js.map +10 -0
  123. package/dist/chunks/studio-xa0ce0n7.js +335 -0
  124. package/dist/chunks/studio-xa0ce0n7.js.map +10 -0
  125. package/dist/chunks/studio-xm3dbxvn.js +378 -0
  126. package/dist/chunks/studio-xm3dbxvn.js.map +19 -0
  127. package/dist/chunks/{studio-nqw433kv.js → studio-xmvbhg31.js} +2 -2
  128. package/dist/chunks/studio-zv37yrfa.js +1054 -0
  129. package/dist/chunks/studio-zv37yrfa.js.map +13 -0
  130. package/dist/chunks/{ws-client-q7hkz3j9.js → ws-client-654ts66j.js} +6 -4
  131. package/dist/chunks/ws-client-654ts66j.js.map +11 -0
  132. package/dist/iframe-entry.js +668 -230
  133. package/dist/studio.js +21080 -32585
  134. package/index.html +35 -4685
  135. package/package.json +17 -15
  136. package/src/about/about-modal.ts +42 -11
  137. package/src/browse/library-commands.ts +240 -0
  138. package/src/browse/library-layouts.ts +369 -0
  139. package/src/browse/library-model.ts +396 -0
  140. package/src/browse/library-pane.ts +1049 -0
  141. package/src/browse/library-preview.ts +252 -0
  142. package/src/browse/library-source.ts +150 -0
  143. package/src/canvas/canvas-helpers.ts +33 -9
  144. package/src/canvas/canvas-live-render.ts +45 -29
  145. package/src/canvas/canvas-patcher.ts +151 -31
  146. package/src/canvas/canvas-perf.ts +46 -7
  147. package/src/canvas/canvas-render.ts +1092 -220
  148. package/src/canvas/canvas-surface.ts +240 -0
  149. package/src/canvas/canvas-utils.ts +1166 -124
  150. package/src/canvas/iframe-drop.ts +2 -1
  151. package/src/canvas/iframe-entry.ts +241 -4
  152. package/src/canvas/iframe-host.ts +1226 -143
  153. package/src/canvas/iframe-inline-edit.ts +31 -0
  154. package/src/canvas/iframe-interaction.ts +76 -16
  155. package/src/canvas/iframe-keys.ts +107 -45
  156. package/src/canvas/iframe-overlay.ts +38 -1
  157. package/src/canvas/iframe-protocol.ts +137 -2
  158. package/src/canvas/iframe-render.ts +70 -2
  159. package/src/canvas/iframe-slash.ts +6 -0
  160. package/src/canvas/path-mapping.ts +56 -6
  161. package/src/canvas/surface-registry.ts +292 -0
  162. package/src/collab/collab-commands.ts +244 -0
  163. package/src/collab/collab-session.ts +198 -32
  164. package/src/collab/collab-state.ts +28 -2
  165. package/src/collab/presence-chips.ts +100 -9
  166. package/src/commands/active-registry.ts +42 -0
  167. package/src/commands/app-commands.ts +176 -0
  168. package/src/commands/budget.ts +158 -0
  169. package/src/commands/command-args.ts +253 -0
  170. package/src/commands/context.ts +387 -0
  171. package/src/commands/defaults.ts +580 -0
  172. package/src/commands/keymap.ts +571 -0
  173. package/src/commands/levels.ts +345 -0
  174. package/src/commands/live-context.ts +193 -0
  175. package/src/commands/reference.ts +227 -0
  176. package/src/commands/registry.ts +293 -0
  177. package/src/component-props.ts +3 -2
  178. package/src/content/draft-state.ts +106 -0
  179. package/src/content/entry-commands.ts +282 -0
  180. package/src/content/entry-editor.ts +327 -0
  181. package/src/content/entry-fields.ts +116 -0
  182. package/src/content/entry-model.ts +175 -0
  183. package/src/editor/canvas-context-menu.ts +17 -11
  184. package/src/editor/canvas-slash-bridge.ts +11 -4
  185. package/src/editor/context-menu.ts +804 -204
  186. package/src/editor/convert-to-component.ts +31 -10
  187. package/src/editor/convert-to-repeater.ts +3 -2
  188. package/src/editor/inline-edit-apply.ts +5 -5
  189. package/src/editor/inline-edit.ts +86 -50
  190. package/src/editor/insert-zone-action.ts +1 -1
  191. package/src/editor/shortcuts.ts +1043 -329
  192. package/src/editor/slash-menu.ts +1 -0
  193. package/src/files/elements.ts +166 -0
  194. package/src/files/file-ops.ts +178 -31
  195. package/src/files/files.ts +898 -268
  196. package/src/files/fs-events.ts +21 -0
  197. package/src/files/media-meta.ts +203 -0
  198. package/src/files/media-paths.ts +141 -0
  199. package/src/files/media-upload.ts +7 -3
  200. package/src/files/media-usage.ts +189 -0
  201. package/src/github/github-auth.ts +235 -33
  202. package/src/github/github-publish.ts +80 -21
  203. package/src/grid/grid-controller.ts +152 -12
  204. package/src/grid/grid-layout.ts +225 -20
  205. package/src/grid/grid-open.ts +120 -0
  206. package/src/grid/grid-panel.ts +554 -39
  207. package/src/grid/grid-source.ts +27 -1
  208. package/src/grid/redirects-grid.ts +599 -0
  209. package/src/grid/redirects.ts +398 -0
  210. package/src/grid/sources/content-source.ts +108 -2
  211. package/src/i18n/i18n-commands.ts +322 -0
  212. package/src/new-project/add-repo-modal.ts +8 -10
  213. package/src/new-project/import-tab.ts +7 -0
  214. package/src/new-project/location-fields.ts +9 -1
  215. package/src/new-project/new-project-modal.ts +221 -245
  216. package/src/packages/jxsuite-update.ts +97 -48
  217. package/src/packages/pull-package-sync.ts +18 -9
  218. package/src/page-params.ts +2 -1
  219. package/src/panels/activity-bar.ts +152 -91
  220. package/src/panels/activity-panel.ts +481 -0
  221. package/src/panels/ai-chat/chat-markdown.ts +8 -3
  222. package/src/panels/ai-chat/chat-view.ts +245 -18
  223. package/src/panels/ai-chat/composer.ts +31 -5
  224. package/src/panels/ai-chat/sessions-view.ts +17 -10
  225. package/src/panels/ai-panel.ts +279 -53
  226. package/src/panels/block-action-bar.ts +1115 -224
  227. package/src/panels/bottom-dock.ts +337 -0
  228. package/src/panels/canvas-dnd-bridge.ts +37 -8
  229. package/src/panels/chat-panel.ts +29 -12
  230. package/src/panels/data-explorer.ts +254 -112
  231. package/src/panels/data-grid.ts +10 -4
  232. package/src/panels/dnd.ts +28 -51
  233. package/src/panels/editors.ts +434 -107
  234. package/src/panels/elements-panel.ts +66 -2
  235. package/src/panels/empty-state.ts +112 -0
  236. package/src/panels/events-panel.ts +596 -82
  237. package/src/panels/formula-workspace.ts +408 -218
  238. package/src/panels/frontmatter-fields.ts +51 -10
  239. package/src/panels/frontmatter-panel.ts +357 -79
  240. package/src/panels/git-panel.ts +375 -164
  241. package/src/panels/head-panel.ts +791 -85
  242. package/src/panels/i18n-panel.ts +592 -0
  243. package/src/panels/imports-panel.ts +95 -85
  244. package/src/panels/jump-bar.ts +584 -0
  245. package/src/panels/layers-panel.ts +1106 -328
  246. package/src/panels/left-panel.ts +109 -204
  247. package/src/panels/navigator-panels.ts +131 -0
  248. package/src/panels/overlays.ts +7 -2
  249. package/src/panels/pane-context.ts +1477 -0
  250. package/src/panels/pane-grid.ts +406 -0
  251. package/src/panels/panel-registry.ts +340 -0
  252. package/src/panels/panel-scheduler.ts +75 -0
  253. package/src/panels/problems-panel.ts +234 -0
  254. package/src/panels/properties-panel.ts +946 -1139
  255. package/src/panels/provenance.ts +258 -0
  256. package/src/panels/quick-search.ts +791 -122
  257. package/src/panels/right-panel.ts +228 -102
  258. package/src/panels/seo-modal.ts +395 -0
  259. package/src/panels/settings-pane.ts +203 -0
  260. package/src/panels/signals-panel.ts +354 -137
  261. package/src/panels/statement-editor.ts +41 -25
  262. package/src/panels/statusbar.ts +342 -106
  263. package/src/panels/style-panel.ts +974 -463
  264. package/src/panels/style-utils.ts +3 -3
  265. package/src/panels/stylebook-doc.ts +4 -2
  266. package/src/panels/stylebook-layers-panel.ts +3 -2
  267. package/src/panels/stylebook-panel.ts +51 -26
  268. package/src/panels/tab-strip.ts +1058 -78
  269. package/src/panels/target-line.ts +274 -0
  270. package/src/panels/toolbar.ts +631 -484
  271. package/src/panels/welcome-screen.ts +301 -198
  272. package/src/platform-errors.ts +26 -3
  273. package/src/platform.ts +96 -2
  274. package/src/platforms/cloud.ts +71 -8
  275. package/src/platforms/devserver.ts +92 -29
  276. package/src/publish/deploy-checklist.ts +383 -0
  277. package/src/publish/pages-service.ts +10 -1
  278. package/src/publish/publish-commands.ts +218 -0
  279. package/src/publish/publish-panel.ts +110 -16
  280. package/src/recent-projects.ts +3 -2
  281. package/src/services/a11y-report.ts +505 -0
  282. package/src/services/ai-models.ts +30 -1
  283. package/src/services/ai-project-tools.ts +29 -10
  284. package/src/services/ai-system-prompt.ts +53 -14
  285. package/src/services/ai-tools.ts +39 -3
  286. package/src/services/ai-writes.ts +154 -0
  287. package/src/services/announce.ts +97 -0
  288. package/src/services/automation.ts +424 -175
  289. package/src/services/cem-export.ts +9 -4
  290. package/src/services/clock.ts +61 -0
  291. package/src/services/document-assistant.ts +36 -8
  292. package/src/services/idle.ts +179 -0
  293. package/src/services/import-client.ts +26 -0
  294. package/src/services/monaco-buffer.ts +627 -0
  295. package/src/services/monaco-lazy.ts +36 -0
  296. package/src/services/notify.ts +271 -0
  297. package/src/services/profile.ts +155 -0
  298. package/src/services/references.ts +0 -0
  299. package/src/services/token-lint.ts +3 -2
  300. package/src/services/tool-executor.ts +53 -7
  301. package/src/services/trusted-types.ts +123 -0
  302. package/src/settings/contexts-section.ts +427 -0
  303. package/src/settings/contributed-section.ts +149 -11
  304. package/src/settings/css-vars-editor.ts +306 -349
  305. package/src/settings/defs-editor.ts +93 -34
  306. package/src/settings/dependencies-editor.ts +7 -7
  307. package/src/settings/extension-sections.ts +37 -5
  308. package/src/settings/general-settings.ts +204 -121
  309. package/src/settings/locales-section.ts +347 -0
  310. package/src/settings/preferences-accounts.ts +140 -0
  311. package/src/settings/preferences-dialog.ts +620 -0
  312. package/src/settings/preferences-keymap.ts +270 -0
  313. package/src/settings/project-sections.ts +260 -0
  314. package/src/settings/section-registry.ts +169 -0
  315. package/src/settings/settings-document.ts +385 -0
  316. package/src/shell.ts +1549 -0
  317. package/src/site-context.ts +45 -20
  318. package/src/state.ts +14 -275
  319. package/src/store.ts +88 -43
  320. package/src/studio.ts +790 -346
  321. package/src/style/live-preview.ts +36 -0
  322. package/src/style/project-styles.ts +349 -0
  323. package/src/style/token-ref.ts +123 -0
  324. package/src/tabs/patch-ops.ts +16 -4
  325. package/src/tabs/project-config.ts +416 -0
  326. package/src/tabs/selection.ts +323 -0
  327. package/src/tabs/tab.ts +182 -47
  328. package/src/tabs/transact.ts +209 -28
  329. package/src/types.ts +68 -13
  330. package/src/ui/ai-credentials-form.ts +39 -35
  331. package/src/ui/ai-managed-connect.ts +7 -1
  332. package/src/ui/dynamic-slot.ts +224 -81
  333. package/src/ui/expression-editor.ts +71 -63
  334. package/src/ui/field-input.ts +4 -6
  335. package/src/ui/field-row.ts +215 -38
  336. package/src/ui/form-controls.ts +194 -7
  337. package/src/ui/layers.ts +492 -69
  338. package/src/ui/media-picker.ts +115 -25
  339. package/src/ui/panel-resize.ts +109 -91
  340. package/src/ui/progress-modal.ts +131 -50
  341. package/src/ui/regions.ts +462 -0
  342. package/src/ui/schema-form.ts +229 -45
  343. package/src/ui/spectrum.ts +24 -8
  344. package/src/ui/timing.ts +49 -0
  345. package/src/ui/value-selector.ts +20 -0
  346. package/src/ui/value-source.ts +348 -0
  347. package/src/ui/virtual-window.ts +400 -0
  348. package/src/utils/edit-display.ts +3 -2
  349. package/src/utils/inherited-style.ts +67 -37
  350. package/src/view.ts +64 -78
  351. package/src/workspace/pane-derive.ts +1258 -0
  352. package/src/workspace/session.ts +317 -0
  353. package/src/workspace/workspace.ts +1345 -23
  354. package/styles/canvas.css +653 -0
  355. package/styles/forced-colors.css +106 -0
  356. package/styles/inspector.css +1454 -0
  357. package/styles/overlays.css +2704 -0
  358. package/styles/panels.css +1701 -0
  359. package/styles/shell.css +1423 -0
  360. package/styles/tokens.css +151 -0
  361. package/dist/chunks/Overlay.dev-cszx7yn5.js +0 -22
  362. package/dist/chunks/extension-sections-qr3drkkw.js +0 -531
  363. package/dist/chunks/extension-sections-qr3drkkw.js.map +0 -12
  364. package/dist/chunks/files-j8a1t06k.js +0 -50
  365. package/dist/chunks/files-j8a1t06k.js.map +0 -9
  366. package/dist/chunks/git-panel-xtq5z81x.js +0 -28
  367. package/dist/chunks/git-panel-xtq5z81x.js.map +0 -9
  368. package/dist/chunks/layers-panel-ancn2wpq.js +0 -26
  369. package/dist/chunks/layers-panel-ancn2wpq.js.map +0 -9
  370. package/dist/chunks/settings-modal-17ttr96g.js +0 -29
  371. package/dist/chunks/settings-modal-17ttr96g.js.map +0 -9
  372. package/dist/chunks/sp-overlay.dev-earn5as8.js +0 -17
  373. package/dist/chunks/sp-overlay.dev-earn5as8.js.map +0 -9
  374. package/dist/chunks/sp-popover.dev-frxtfejn.js +0 -8
  375. package/dist/chunks/sp-popover.dev-frxtfejn.js.map +0 -9
  376. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js +0 -14
  377. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js.map +0 -9
  378. package/dist/chunks/sp-tooltip.dev-a9fywesm.js +0 -21
  379. package/dist/chunks/sp-tooltip.dev-a9fywesm.js.map +0 -10
  380. package/dist/chunks/studio-0xgs7xrs.js +0 -429
  381. package/dist/chunks/studio-0xgs7xrs.js.map +0 -13
  382. package/dist/chunks/studio-4d8hzcz5.js +0 -3427
  383. package/dist/chunks/studio-4d8hzcz5.js.map +0 -26
  384. package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
  385. package/dist/chunks/studio-9smfzqhc.js +0 -19
  386. package/dist/chunks/studio-9smfzqhc.js.map +0 -10
  387. package/dist/chunks/studio-jm0z592w.js.map +0 -115
  388. package/dist/chunks/studio-m2t4mdg5.js +0 -1854
  389. package/dist/chunks/studio-m2t4mdg5.js.map +0 -18
  390. package/dist/chunks/studio-n4p11dfy.js +0 -853
  391. package/dist/chunks/studio-n4p11dfy.js.map +0 -12
  392. package/dist/chunks/studio-qkvt37c0.js.map +0 -9
  393. package/dist/chunks/studio-sjh1wt1a.js +0 -3744
  394. package/dist/chunks/studio-sjh1wt1a.js.map +0 -22
  395. package/dist/chunks/studio-v7jkjqng.js.map +0 -46
  396. package/dist/chunks/studio-xq0t7n5t.js +0 -140
  397. package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
  398. package/dist/chunks/studio-xze4zrs1.js.map +0 -10
  399. package/dist/chunks/studio-yfcstdzy.js +0 -399
  400. package/dist/chunks/studio-yfcstdzy.js.map +0 -12
  401. package/dist/chunks/studio-zp7jncs8.js +0 -469
  402. package/dist/chunks/studio-zp7jncs8.js.map +0 -14
  403. package/dist/chunks/ws-client-q7hkz3j9.js.map +0 -11
  404. package/src/browse/browse-modal.ts +0 -69
  405. package/src/browse/browse.ts +0 -904
  406. package/src/canvas/canvas-diff.ts +0 -216
  407. package/src/canvas/nested-site-style.ts +0 -58
  408. package/src/new-project/design-fields.ts +0 -264
  409. package/src/new-project/templates.ts +0 -61
  410. package/src/panels/tab-bar.ts +0 -548
  411. package/src/settings/settings-modal.ts +0 -203
  412. /package/dist/chunks/{adapter-z8fkmbmv.js.map → adapter-qfnesn5v.js.map} +0 -0
  413. /package/dist/chunks/{cf-settings-mmyv436d.js.map → cf-settings-73sh5z4p.js.map} +0 -0
  414. /package/dist/chunks/{format-host-8jxwts2p.js.map → format-host-mkwsmt8d.js.map} +0 -0
  415. /package/dist/chunks/{jx-validate-qx8degj7.js.map → jx-validate-v6qgknrs.js.map} +0 -0
  416. /package/dist/chunks/{studio-w7c6kvk7.js.map → studio-a7pzveq1.js.map} +0 -0
  417. /package/dist/chunks/{studio-esrewxap.js.map → studio-s519zc99.js.map} +0 -0
  418. /package/dist/chunks/{studio-bghqfmea.js.map → studio-wwseqyw0.js.map} +0 -0
  419. /package/dist/chunks/{studio-nqw433kv.js.map → studio-xmvbhg31.js.map} +0 -0
@@ -0,0 +1,653 @@
1
+ /* Jx Studio — canvas surface.
2
+ Load after tokens.css, after shell.css.
3
+
4
+ Owns the multi-panel canvas frame (.pane-stage, .panzoom-wrap,
5
+ .canvas-panel*), the pane's context bar and floating zoom pod, the
6
+ content-edit-mode canvas column, the selection/hover/layout overlay
7
+ boxes drawn over the rendered document, and the unified block action
8
+ bar plus its link popover. */
9
+
10
+ /* ─── Canvas (multi-panel) ────────────────────── */
11
+ /* The stage's own axis. `shell.css` places the cell; this says what it does with it. Selected by
12
+ class rather than by `#canvas-wrap`, because there are as many stages as there are panes. */
13
+ .pane-stage {
14
+ display: flex;
15
+ gap: 24px;
16
+ align-items: flex-start;
17
+ }
18
+ .panzoom-wrap {
19
+ display: inline-flex;
20
+ gap: 24px;
21
+ align-items: flex-start;
22
+ transform-origin: 0 0;
23
+ margin-block: auto;
24
+ }
25
+ .canvas-panel {
26
+ flex-shrink: 0;
27
+ }
28
+ .source-wrap {
29
+ display: flex;
30
+ flex-direction: column;
31
+ width: 100%;
32
+ height: 100%;
33
+ flex: 1;
34
+ min-width: 0;
35
+ }
36
+ /* ─── ⑦ The pane context bar ───────────────────
37
+ Three separately-LABELLED axes — Editor kind, Canvas view, Rendering context — where five
38
+ unlabelled ones used to sit in a row styled identically to the tab strip above it. The label is
39
+ load-bearing: it is what stops the band re-accreting into an anonymous strip of chips. */
40
+
41
+ /* The pane's top band: the context bar, plus the standing statements that must be readable before
42
+ the first keystroke (today, collab's read-only banner). One element so `pane-context.ts` can
43
+ MEASURE what the stage has to clear — a banner's height is its wrapped text, which only layout
44
+ knows. `min-width: 0` so a long breadcrumb ellipses instead of widening the pane. */
45
+ .pc-band {
46
+ min-width: 0;
47
+ }
48
+ .pane-context {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 12px;
52
+ height: 28px;
53
+ padding: 0 8px;
54
+ border-bottom: 1px solid var(--border);
55
+ background: var(--bg-panel);
56
+ min-width: 0;
57
+ overflow: hidden;
58
+ }
59
+ .pane-context .pc-spacer {
60
+ flex: 1;
61
+ display: flex;
62
+ align-items: center;
63
+ min-width: 0;
64
+ }
65
+ /* §18.4's preset menu trigger, in the bar's leading slot — the one that was empty padding.
66
+ Sized to the 22px the strip's overflow control uses, so the two rows of pane chrome agree. */
67
+ .pc-derive-trigger {
68
+ flex: 0 0 auto;
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ width: 22px;
73
+ height: 20px;
74
+ padding: 0;
75
+ border: none;
76
+ border-radius: 3px;
77
+ background: none;
78
+ color: var(--fg-dim);
79
+ font-size: var(--spectrum-font-size-75, 12px);
80
+ line-height: 1;
81
+ cursor: pointer;
82
+ }
83
+ .pc-derive-trigger:hover {
84
+ background: var(--hover-bg);
85
+ color: var(--fg);
86
+ }
87
+ .pc-axis {
88
+ display: flex;
89
+ align-items: center;
90
+ gap: 4px;
91
+ min-width: 0;
92
+ }
93
+ .pc-axis-label {
94
+ font-size: var(--spectrum-font-size-50, 11px);
95
+ text-transform: uppercase;
96
+ letter-spacing: 0.04em;
97
+ color: var(--fg-dim);
98
+ white-space: nowrap;
99
+ }
100
+ .pc-static {
101
+ font-size: var(--spectrum-font-size-75, 12px);
102
+ color: var(--fg);
103
+ white-space: nowrap;
104
+ }
105
+ .pc-context-trigger {
106
+ font-variant-numeric: tabular-nums;
107
+ }
108
+ /* The document data a render resolves against, behind its own trigger beside the context one.
109
+ `.pc-resolving` and `.pc-resolving-label` are gone with the inline strip: the phrase "resolving
110
+ with" is the popover's group label now, so `.pc-ctx-label` styles it and there is one place a
111
+ group heading in this bar is described. */
112
+ .pc-resolving-trigger {
113
+ font-variant-numeric: tabular-nums;
114
+ flex-shrink: 0;
115
+ }
116
+ /* The editor-kind dropdown and the view segments both sit on a 28px band: cap them so a long
117
+ document name in the breadcrumb cannot push an axis off the end of the bar. */
118
+ .pc-editor-kind {
119
+ max-width: 140px;
120
+ }
121
+ .pc-view {
122
+ flex-shrink: 0;
123
+ }
124
+ /* The preview toggle is not a third radio, and must not read as one: it says the canvas is inert.
125
+ Pressed, it takes the accent so "editing is off" is legible from across the room; unpressed it is
126
+ as quiet as any other action button. The margin separates the two axes the eye is being asked to
127
+ read as separate. */
128
+ .pc-preview-toggle {
129
+ flex-shrink: 0;
130
+ margin-inline-start: 6px;
131
+ }
132
+ .pc-preview-toggle[selected] {
133
+ --spectrum-actionbutton-background-color-default: var(--accent);
134
+ --spectrum-actionbutton-content-color-default: var(--bg);
135
+ background: var(--accent);
136
+ color: var(--bg);
137
+ }
138
+ .pc-export {
139
+ flex-shrink: 0;
140
+ }
141
+
142
+ /* The rendering-context popover: one column of labelled groups over a footer that leaves for the
143
+ definition site. This control only SELECTS (§2 principle 5) — nothing in it defines a
144
+ breakpoint, a scheme or a feature query. */
145
+ .pc-ctx {
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: 10px;
149
+ padding: 10px 12px;
150
+ min-width: 240px;
151
+ max-width: 340px;
152
+ }
153
+ .pc-ctx-group {
154
+ display: flex;
155
+ flex-direction: column;
156
+ gap: 4px;
157
+ }
158
+ .pc-ctx-label {
159
+ font-size: var(--spectrum-font-size-50, 11px);
160
+ text-transform: uppercase;
161
+ letter-spacing: 0.04em;
162
+ color: var(--fg-dim);
163
+ }
164
+ /* The fields, stacked. They were a row on the bar capped at 140px; in the popover each takes the
165
+ full column so a route value or a JSON test prop is readable while you type it. */
166
+ .pc-ctx-group sp-picker.pc-param,
167
+ .pc-ctx-group sp-textfield.pc-prop {
168
+ display: block;
169
+ width: 100%;
170
+ max-width: 100%;
171
+ }
172
+ .pc-context-popover {
173
+ max-width: 360px;
174
+ }
175
+ .pc-sizes {
176
+ flex-wrap: wrap;
177
+ }
178
+ .pc-layout-switch {
179
+ margin: 0;
180
+ }
181
+ .pc-ctx-manage {
182
+ align-self: flex-start;
183
+ padding: 2px 0;
184
+ border: none;
185
+ background: none;
186
+ color: var(--accent, #3b82f6);
187
+ font-size: var(--spectrum-font-size-75, 12px);
188
+ cursor: pointer;
189
+ }
190
+ .pc-ctx-manage:hover {
191
+ text-decoration: underline;
192
+ }
193
+
194
+ /* ─── ⑩ The floating zoom pod ──────────────────
195
+ Bottom-right of the pane, over the stage — a viewport control, which is not a document axis and
196
+ so never belonged in a band beside one. */
197
+ .pane-zoom {
198
+ align-self: flex-end;
199
+ margin: 0 12px 12px 0;
200
+ padding: 2px 4px;
201
+ border: 1px solid var(--border);
202
+ border-radius: 6px;
203
+ background: var(--bg);
204
+ box-shadow: 0 2px 8px rgb(0 0 0 / 25%);
205
+ }
206
+ .pane-zoom .pc-zoom-label {
207
+ min-width: 48px;
208
+ font-family: var(--font-mono);
209
+ }
210
+ .pane-zoom .pc-fit {
211
+ max-width: 120px;
212
+ }
213
+ .source-editor {
214
+ flex: 1;
215
+ min-height: 0;
216
+ }
217
+
218
+ /* ─── Pane tab strips ──────────────────────────
219
+ shell.css owns the base `.tab-strip*` rules; these are the states the pane model adds — a pinned
220
+ head, an italic preview chip, the drag ghost, and the unfocused pane's dimmed strip. */
221
+ .tab-strip-row:not(.focused) .tab-strip-tab.active {
222
+ border-bottom-color: var(--border);
223
+ }
224
+ .tab-strip-tab.preview .tab-strip-label {
225
+ font-style: italic;
226
+ }
227
+ .tab-strip-tab.dragging {
228
+ opacity: 0.4;
229
+ }
230
+ .tab-strip-pin {
231
+ display: flex;
232
+ align-items: center;
233
+ justify-content: center;
234
+ width: 16px;
235
+ height: 16px;
236
+ padding: 0;
237
+ border: none;
238
+ background: none;
239
+ color: var(--fg-dim);
240
+ font-size: var(--spectrum-font-size-75, 12px);
241
+ line-height: 1;
242
+ border-radius: var(--radius);
243
+ cursor: pointer;
244
+ opacity: 0;
245
+ }
246
+ .tab-strip-tab:hover .tab-strip-pin,
247
+ .tab-strip-tab.active .tab-strip-pin,
248
+ .tab-strip-tab.pinned .tab-strip-pin {
249
+ opacity: 1;
250
+ }
251
+ .tab-strip-pin:hover {
252
+ background: var(--hover-bg);
253
+ color: var(--fg);
254
+ }
255
+ .tab-strip-tab.pinned .tab-strip-pin {
256
+ color: var(--accent);
257
+ }
258
+
259
+ /* ─── Document Header card ─────────────────────
260
+ Region ⑧: the artefact's own header, drawn IN the stage. `#frontmatter-panel` — a fourth
261
+ full-width band up to 40vh that appeared and vanished as a side effect of the canvas mode — is
262
+ gone, grid row and all.
263
+
264
+ Two placements, because the stage draws a page two ways. In Edit the card is `in-column`: a block
265
+ of the document's own centered column that scrolls with it, so it is part of the artefact rather
266
+ than a strip above it. In Design the artboards are under a pan/zoom transform, and a form drawn
267
+ at 40% is a picture of a form — so the card is `pinned` above the surface at 1:1, and that is the
268
+ one placement that still needs a cap. */
269
+ .doc-header-host[hidden] {
270
+ display: none;
271
+ }
272
+ .doc-header-host.in-column {
273
+ display: block;
274
+ padding-bottom: 16px;
275
+ }
276
+ .doc-header-host.pinned {
277
+ flex-shrink: 0;
278
+ max-height: 40vh;
279
+ overflow-y: auto;
280
+ }
281
+ .doc-header {
282
+ display: flex;
283
+ flex-direction: column;
284
+ padding: 8px 12px 10px;
285
+ background: var(--bg-panel);
286
+ border: 1px solid var(--border);
287
+ border-radius: var(--radius);
288
+ }
289
+ .doc-header-host.pinned .doc-header {
290
+ border-width: 0 0 1px;
291
+ border-radius: 0;
292
+ }
293
+ .doc-header-bar {
294
+ display: flex;
295
+ align-items: baseline;
296
+ gap: 8px;
297
+ padding-bottom: 6px;
298
+ }
299
+ .doc-header-title {
300
+ font-size: var(--spectrum-font-size-50, 11px);
301
+ font-weight: 700;
302
+ letter-spacing: 0.06em;
303
+ text-transform: uppercase;
304
+ color: var(--fg-dim);
305
+ }
306
+ .doc-header-route {
307
+ font-family: var(--font-mono);
308
+ font-size: var(--spectrum-font-size-50, 11px);
309
+ color: var(--fg-dim);
310
+ }
311
+ .doc-header-body {
312
+ display: flex;
313
+ flex-direction: column;
314
+ gap: 2px;
315
+ }
316
+ /* The card's door to Search appearance. It sits where the SEO disclosure used to, above Raw head
317
+ tags — same place in the reading order, one line instead of a block that could grow taller than
318
+ the document it describes. */
319
+ .doc-header-seo {
320
+ display: flex;
321
+ padding: 2px 0;
322
+ }
323
+ .doc-header-seo-btn {
324
+ font-size: var(--spectrum-font-size-50, 11px);
325
+ }
326
+ .doc-header-disclosure > summary {
327
+ padding: 4px 0;
328
+ font-size: var(--spectrum-font-size-50, 11px);
329
+ color: var(--fg-dim);
330
+ cursor: pointer;
331
+ }
332
+ .doc-header-disclosure > summary:hover {
333
+ color: var(--fg);
334
+ }
335
+ .doc-header-empty {
336
+ margin: 0;
337
+ padding: 4px 0;
338
+ font-size: var(--spectrum-font-size-50, 11px);
339
+ color: var(--fg-dim);
340
+ }
341
+ .doc-header-raw {
342
+ display: flex;
343
+ flex-direction: column;
344
+ gap: 2px;
345
+ margin: 0;
346
+ padding: 0;
347
+ list-style: none;
348
+ }
349
+ .doc-header-raw li {
350
+ display: flex;
351
+ gap: 8px;
352
+ min-width: 0;
353
+ font-size: var(--spectrum-font-size-50, 11px);
354
+ }
355
+ .doc-header-raw li span {
356
+ overflow: hidden;
357
+ text-overflow: ellipsis;
358
+ white-space: nowrap;
359
+ color: var(--fg-dim);
360
+ }
361
+ /* ─── Content edit mode canvas ─────────────── */
362
+ .content-edit-canvas {
363
+ width: 100%;
364
+ height: 100%;
365
+ overflow-y: auto;
366
+ overflow-x: hidden;
367
+ display: flex;
368
+ justify-content: center;
369
+ padding: 32px 0;
370
+ }
371
+ .content-edit-column {
372
+ width: 100%;
373
+ min-height: 100%;
374
+ }
375
+ /* A content PAGE fills the viewport (a document-like surface you can click into below the
376
+ text). A component DEFINITION is a fragment — flooring its column to the viewport and letting
377
+ the flex parent vertical-stretch it leaves dead scrollable space below a short component.
378
+ `is-component` (set by renderCanvas when the doc root is a custom element) makes the column
379
+ hug its iframe and sit at the top instead. */
380
+ .content-edit-column.is-component {
381
+ min-height: 0;
382
+ align-self: flex-start;
383
+ }
384
+ .content-edit-column .canvas-panel.full-width {
385
+ flex: 1;
386
+ min-width: 0;
387
+ }
388
+ .content-edit-column .canvas-panel-viewport {
389
+ border: none;
390
+ background: transparent;
391
+ }
392
+ .function-editor-header {
393
+ display: flex;
394
+ align-items: center;
395
+ justify-content: space-between;
396
+ padding: 4px 8px;
397
+ background: var(--bg-panel);
398
+ border-bottom: 1px solid var(--border);
399
+ font-size: var(--spectrum-font-size-75, 12px);
400
+ color: var(--fg);
401
+ font-family: var(--font-mono);
402
+ }
403
+ .canvas-panel-header {
404
+ padding: 4px 8px;
405
+ font-size: var(--spectrum-font-size-50, 11px);
406
+ color: var(--fg-dim);
407
+ background: var(--bg-panel);
408
+ border: 1px solid var(--border);
409
+ border-bottom: none;
410
+ border-radius: var(--radius) var(--radius) 0 0;
411
+ text-align: center;
412
+ cursor: pointer;
413
+ user-select: none;
414
+ font-family: var(--font-mono);
415
+ }
416
+ .canvas-panel-header.active {
417
+ color: var(--accent);
418
+ border-color: var(--accent);
419
+ }
420
+ .canvas-panel-viewport {
421
+ position: relative;
422
+ background: var(--spectrum-white, #fff);
423
+ border: 1px solid var(--border);
424
+ /* The viewport is a light document surface, so pin a light color-scheme
425
+ for native form controls and scrollbars rendered inside it. */
426
+ color-scheme: light;
427
+ }
428
+ .canvas-panel-header.active + .canvas-panel-viewport {
429
+ border-color: var(--accent);
430
+ }
431
+ .canvas-panel-canvas {
432
+ isolation: isolate;
433
+ }
434
+ .canvas-panel-canvas * {
435
+ cursor: default;
436
+ }
437
+ .canvas-panel-canvas slot:empty {
438
+ display: block;
439
+ min-height: 3rem;
440
+ border: 2px dashed var(--spectrum-gray-400, #999);
441
+ border-radius: var(--radius);
442
+ position: relative;
443
+ background: repeating-linear-gradient(
444
+ 45deg,
445
+ transparent,
446
+ transparent 10px,
447
+ rgba(128, 128, 128, 0.03) 10px,
448
+ rgba(128, 128, 128, 0.03) 20px
449
+ );
450
+ }
451
+ .canvas-panel-canvas slot:empty::before {
452
+ content: "slot";
453
+ position: absolute;
454
+ top: 50%;
455
+ left: 50%;
456
+ transform: translate(-50%, -50%);
457
+ font-size: 0.75rem;
458
+ color: var(--spectrum-gray-500, #888);
459
+ font-family: var(--font-mono);
460
+ pointer-events: none;
461
+ }
462
+ /* Single-canvas fallback (no $media) */
463
+ .canvas-panel.full-width {
464
+ min-width: 0;
465
+ }
466
+ /* ─── Preview stage ────────────────────────────
467
+ Preview is the fidelity view: one frame, sized to the pane, scrolling its
468
+ own document so sticky positioning, scroll-driven animation and
469
+ IntersectionObserver reveals behave as they will in production. That means
470
+ no panzoom-wrap and no content-height growth — so every box between the
471
+ stage and the iframe needs a definite height for the frame's `height:100%`
472
+ to resolve against, and the artboard chrome (border, page surface) is
473
+ dropped: this is the page, not a specimen of it. */
474
+ /* Centred, because the stage is now as wide as the chosen breakpoint rather than the pane: a 640px
475
+ preview pinned to the left edge of a 1400px pane reads as a broken layout rather than a phone. */
476
+ .preview-stage {
477
+ display: flex;
478
+ width: 100%;
479
+ height: 100%;
480
+ margin: 0 auto;
481
+ }
482
+ .preview-stage .canvas-panel {
483
+ flex: 1;
484
+ min-width: 0;
485
+ height: 100%;
486
+ }
487
+ .preview-stage .canvas-panel-viewport {
488
+ flex: 1;
489
+ height: 100%;
490
+ border: none;
491
+ }
492
+ .preview-stage .canvas-panel-canvas {
493
+ height: 100%;
494
+ }
495
+ .overlay-box {
496
+ position: absolute;
497
+ pointer-events: none;
498
+ }
499
+ .overlay-selection {
500
+ border: 2px solid var(--accent);
501
+ }
502
+ .overlay-hover {
503
+ border: 1px solid var(--accent-50);
504
+ }
505
+ /* A container only — its children are absolutely positioned against the overlay root, so it must
506
+ not introduce a box of its own between them and it. */
507
+ .overlay-coselection-group {
508
+ display: contents;
509
+ }
510
+ /* The other members of a multi-selection (§6.5). Same accent, thinner: one box is the primary —
511
+ what the Inspector, the block action bar and the status bar address — and the rest are along for
512
+ the batch. A selection of one draws no co-selection boxes at all. */
513
+ .overlay-coselection {
514
+ border-width: 1px;
515
+ border-style: dashed;
516
+ }
517
+ /* Layout-chrome selection: the author clicked a header/footer the LAYOUT file contributes, not
518
+ page content. Purple + dashed says "selected, but not yours to edit here" — it must never read
519
+ as the ordinary accent-solid selection, because Backspace and typing do not apply to it.
520
+
521
+ This is the PARENT half of a two-realm affordance. The always-on treatment — the dimmed region
522
+ and its `LAYOUT · layouts/base.json` chip — cannot live here: layout nodes are inside the
523
+ cross-origin canvas iframe, so their rules ship in the CSS string in `canvas/iframe-render.ts`
524
+ (EDIT_PLACEHOLDER_CSS), a separate document. These two classes style the parent-drawn selection
525
+ overlay, which floats above the iframe in canvas space. */
526
+ .overlay-layout {
527
+ border-style: dashed !important;
528
+ border-color: var(--spectrum-purple-600, #9256d9) !important;
529
+ }
530
+ .overlay-layout-badge {
531
+ position: absolute;
532
+ top: -16px;
533
+ left: 0;
534
+ max-width: 100%;
535
+ overflow: hidden;
536
+ font-size: 9px;
537
+ padding: 1px 5px;
538
+ background: var(--spectrum-purple-600, #9256d9);
539
+ color: white;
540
+ border-radius: var(--radius);
541
+ text-transform: uppercase;
542
+ letter-spacing: 0.5px;
543
+ white-space: nowrap;
544
+ text-overflow: ellipsis;
545
+ pointer-events: none;
546
+ }
547
+ .overlay-label {
548
+ position: absolute;
549
+ top: -20px;
550
+ left: -2px;
551
+ padding: 1px 5px;
552
+ font-size: 10px;
553
+ background: var(--accent);
554
+ color: var(--accent-fg);
555
+ border-radius: var(--spectrum-corner-radius-75) var(--spectrum-corner-radius-75) 0 0;
556
+ white-space: nowrap;
557
+ pointer-events: none;
558
+ }
559
+
560
+ /* ─── Unified block action bar ─────────────── */
561
+ .block-action-bar {
562
+ position: fixed;
563
+ pointer-events: auto;
564
+ display: flex;
565
+ align-items: center;
566
+ gap: 2px;
567
+ background: var(--bg-panel);
568
+ border: 1px solid var(--border);
569
+ border-radius: var(--radius);
570
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
571
+ padding: 2px 4px;
572
+ white-space: nowrap;
573
+ z-index: 100;
574
+ }
575
+ .block-action-bar .bar-tag {
576
+ font-size: 10px;
577
+ padding: 0 4px;
578
+ border-radius: var(--spectrum-corner-radius-75, 2px);
579
+ color: var(--accent-fg);
580
+ background: var(--tag);
581
+ max-width: 140px;
582
+ overflow: hidden;
583
+ text-overflow: ellipsis;
584
+ }
585
+ .block-action-bar .bar-tag--interactive {
586
+ cursor: pointer;
587
+ }
588
+ .block-action-bar .bar-tag--interactive:hover {
589
+ background: var(--accent);
590
+ color: var(--bg);
591
+ }
592
+ .block-action-bar .bar-drag-handle {
593
+ cursor: grab;
594
+ font-size: var(--spectrum-font-size-100, 14px);
595
+ padding: 0 4px;
596
+ opacity: 0.7;
597
+ user-select: none;
598
+ display: inline-flex;
599
+ align-items: center;
600
+ line-height: 1;
601
+ transform: translateY(1px);
602
+ }
603
+ .block-action-bar .bar-drag-handle:hover {
604
+ opacity: 1;
605
+ }
606
+ .block-action-bar .bar-drag-handle:active {
607
+ cursor: grabbing;
608
+ }
609
+ /* ONE shape (studio-ui-guidelines §8.6): the handle is greyed on the document root, never removed —
610
+ a toolbar whose controls move under the cursor is worse than one with a dead affordance. */
611
+ .block-action-bar .bar-drag-handle--disabled {
612
+ cursor: default;
613
+ opacity: 0.3;
614
+ }
615
+ .block-action-bar sp-divider {
616
+ height: 20px;
617
+ margin: 0 2px;
618
+ }
619
+ /* One rule for every registry-rendered verb; `--danger` is the `destructive: true` half. */
620
+ .block-action-bar .bar-cmd,
621
+ .block-action-bar .bar-overflow {
622
+ flex-shrink: 0;
623
+ }
624
+ .block-action-bar .bar-cmd--danger {
625
+ color: var(--danger);
626
+ }
627
+ /* A record with no `icon` draws its title instead of a blank button. */
628
+ .block-action-bar .cmd-label {
629
+ font-size: var(--spectrum-font-size-50, 11px);
630
+ padding: 0 2px;
631
+ }
632
+ .block-action-bar [data-toolbar-item]:focus-visible {
633
+ outline: 2px solid var(--accent);
634
+ outline-offset: 1px;
635
+ }
636
+ /* The `⋮` menu: shared by the bar and the Outline rows, so it lives with the bar that owns it. */
637
+ .bar-overflow-menu .cmd-chord {
638
+ font-family: var(--font-mono);
639
+ font-size: var(--spectrum-font-size-50, 11px);
640
+ color: var(--fg-dim);
641
+ padding-left: 12px;
642
+ }
643
+
644
+ .link-popover {
645
+ display: flex;
646
+ gap: 4px;
647
+ align-items: center;
648
+ padding: 8px;
649
+ background: var(--bg-panel);
650
+ border: 1px solid var(--border);
651
+ border-radius: var(--radius);
652
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
653
+ }