@jxsuite/studio 4.1.0 → 5.0.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 (607) hide show
  1. package/README.md +1 -1
  2. package/data/elements-meta.json +5 -15
  3. package/data/html-meta.json +51 -6
  4. package/dist/chunks/{2020-n6tfwnda.js → 2020-g79n01v9.js} +14 -14
  5. package/dist/chunks/action-group-sp6tna8v.js +118 -0
  6. package/dist/chunks/adapter-nj7tnjfn.js +13 -0
  7. package/dist/chunks/cf-account-picker-fyf63pmy.js +495 -0
  8. package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
  9. package/dist/chunks/color-area-v17df7b8.js +154 -0
  10. package/dist/chunks/color-field-anwybnkn.js +208 -0
  11. package/dist/chunks/color-slider-44ez96fc.js +79 -0
  12. package/dist/chunks/color-xgg3kfw7.js +35 -0
  13. package/dist/chunks/combobox-5e7jev23.js +236 -0
  14. package/dist/chunks/components-2w1f35qs.js +18 -0
  15. package/dist/chunks/content-source-3wqeas45.js +46 -0
  16. package/dist/chunks/convert-to-repeater-d0cgnb6d.js +639 -0
  17. package/dist/chunks/dialog-s890b918.js +85 -0
  18. package/dist/chunks/editor-3qhbg51x.js +35 -0
  19. package/dist/chunks/entry-commands-d6g50j7s.js +42 -0
  20. package/dist/chunks/extension-sections-fy7q4fe9.js +651 -0
  21. package/dist/chunks/file-ops-3btj6st0.js +47 -0
  22. package/dist/chunks/files-ef8fgs3w.js +72 -0
  23. package/dist/chunks/format-host-3c33nwr8.js +40 -0
  24. package/dist/chunks/fs-events-13tj6sex.js +18 -0
  25. package/dist/chunks/git-panel-4wp2rn9b.js +49 -0
  26. package/dist/chunks/icons-yy10wk9r.js +402 -0
  27. package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
  28. package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
  29. package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
  30. package/dist/chunks/iframe-host-jgesd924.js +115 -0
  31. package/dist/chunks/{index-wcnt3r9g.js → index-mdmyx6s2.js} +11 -11
  32. package/dist/chunks/index-n4j7qxyr.js +109 -0
  33. package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
  34. package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
  35. package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
  36. package/dist/chunks/layers-1nq5evsh.js +29 -0
  37. package/dist/chunks/layers-panel-ar2gh90g.js +40 -0
  38. package/dist/chunks/listbox-6v2ac08j.js +44 -0
  39. package/dist/chunks/lit-html-m244w9nh.js +17 -0
  40. package/dist/chunks/media-picker-2qbetq73.js +33 -0
  41. package/dist/chunks/menu-q99sy9rf.js +285 -0
  42. package/dist/chunks/menu-rf7n72mf.js +14 -0
  43. package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
  44. package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
  45. package/dist/chunks/{monaco-setup-vx9bhp1d.js → monaco-setup-8r62fj6y.js} +27 -37
  46. package/dist/chunks/notify-628t0anh.js +21 -0
  47. package/dist/chunks/number-field-5cndyft8.js +72 -0
  48. package/dist/chunks/parse-0zx14y15.js +10 -0
  49. package/dist/chunks/platform-ts9cg1a4.js +15 -0
  50. package/dist/chunks/popover-47z3ytva.js +25 -0
  51. package/dist/chunks/publish-panel-98f7sr3g.js +27 -0
  52. package/dist/chunks/quick-search-srzz83k2.js +45 -0
  53. package/dist/chunks/references-n553f0e1.js +26 -0
  54. package/dist/chunks/right-panel-rrgx2dn3.js +45 -0
  55. package/dist/chunks/section-registry-5pq32t0q.js +25 -0
  56. package/dist/chunks/select-2r16ez41.js +49 -0
  57. package/dist/chunks/split-g7nm1rgb.js +191 -0
  58. package/dist/chunks/studio-0hqbpbd0.js +62 -0
  59. package/dist/chunks/studio-18avnhjp.js +2430 -0
  60. package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
  61. package/dist/chunks/{studio-msd847zn.js → studio-25hkdrkw.js} +357 -86
  62. package/dist/chunks/studio-26d7myd1.js +258 -0
  63. package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
  64. package/dist/chunks/studio-3gxv60tn.js +422 -0
  65. package/dist/chunks/{studio-fbf92ckf.js → studio-3hxkd92t.js} +275 -163
  66. package/dist/chunks/studio-4m0haseg.js +185 -0
  67. package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
  68. package/dist/chunks/{studio-1wagb550.js → studio-5523bpzt.js} +11 -11
  69. package/dist/chunks/{studio-x4qkdat5.js → studio-57mf66w2.js} +1749 -2481
  70. package/dist/chunks/studio-5jy81t3s.js +17463 -0
  71. package/dist/chunks/studio-5rt7sqa0.js +1168 -0
  72. package/dist/chunks/studio-5te5tqng.js +81 -0
  73. package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
  74. package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
  75. package/dist/chunks/studio-6xa21ej9.js +28 -0
  76. package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
  77. package/dist/chunks/{studio-ahn3pdgx.js → studio-79y5sz51.js} +52 -38
  78. package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
  79. package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
  80. package/dist/chunks/studio-7xptrg0j.js +954 -0
  81. package/dist/chunks/{studio-cft9r4r7.js → studio-81390n6f.js} +22 -22
  82. package/dist/chunks/{studio-q43a5y9h.js → studio-8jn5yhyn.js} +16 -16
  83. package/dist/chunks/studio-8qtrpzr3.js +839 -0
  84. package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
  85. package/dist/chunks/studio-9xxz1q69.js +1356 -0
  86. package/dist/chunks/studio-akbww0j5.js +13615 -0
  87. package/dist/chunks/{studio-x813zp48.js → studio-arfpe389.js} +30 -30
  88. package/dist/chunks/{studio-trxrabqf.js → studio-az3zd49t.js} +475 -283
  89. package/dist/chunks/studio-cpvb2ed1.js +1171 -0
  90. package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
  91. package/dist/chunks/{studio-bgxt93ga.js → studio-d055c37e.js} +13 -13
  92. package/dist/chunks/studio-d1ja2x9r.js +362 -0
  93. package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
  94. package/dist/chunks/{studio-3bqpr0zh.js → studio-em9nw8eh.js} +299 -110
  95. package/dist/chunks/studio-erdatzvp.js +1190 -0
  96. package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
  97. package/dist/chunks/studio-fabxk6r9.js +2811 -0
  98. package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
  99. package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
  100. package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
  101. package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
  102. package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
  103. package/dist/chunks/studio-pm6hgy7r.js +4763 -0
  104. package/dist/chunks/studio-q0a3yk4n.js +33 -0
  105. package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
  106. package/dist/chunks/studio-qahxvnan.js +111 -0
  107. package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
  108. package/dist/chunks/{studio-2b946z26.js → studio-rkstz940.js} +3658 -6134
  109. package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
  110. package/dist/chunks/studio-rpyah2ew.js +2805 -0
  111. package/dist/chunks/studio-rs76k67r.js +12 -0
  112. package/dist/chunks/{studio-jkftxyvz.js → studio-s6z853aq.js} +5858 -2152
  113. package/dist/chunks/{studio-6yw4y3my.js → studio-sgdc5pfc.js} +8 -8
  114. package/dist/chunks/studio-tb3ev01j.js +763 -0
  115. package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
  116. package/dist/chunks/studio-vhv5tgxm.js +51 -0
  117. package/dist/chunks/{studio-qjy2z9bv.js → studio-vz68yn9e.js} +32 -137
  118. package/dist/chunks/studio-wqpngpsk.js +174 -0
  119. package/dist/chunks/{studio-b55y6ewx.js → studio-x3rty6tr.js} +58 -58
  120. package/dist/chunks/studio-xsykpvsh.js +8448 -0
  121. package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
  122. package/dist/chunks/studio-yxa81f45.js +12 -0
  123. package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
  124. package/dist/chunks/tabs-wbp1cdws.js +156 -0
  125. package/dist/chunks/textfield-abk6qyee.js +73 -0
  126. package/dist/chunks/toast-780pvfbv.js +27 -0
  127. package/dist/chunks/toast-host-3sqv46sn.js +116 -0
  128. package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
  129. package/dist/chunks/tooltip-eptb614w.js +369 -0
  130. package/dist/chunks/tree-a73p0pqm.js +367 -0
  131. package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
  132. package/dist/chunks/workspace-wrew8zk4.js +69 -0
  133. package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
  134. package/dist/iframe-entry.js +1780 -667
  135. package/dist/studio.js +52819 -36480
  136. package/dist/workers/editor.worker.js +1040 -1085
  137. package/dist/workers/json.worker.js +1946 -1991
  138. package/dist/workers/ts.worker.js +4960 -5005
  139. package/index.html +1 -0
  140. package/package.json +18 -52
  141. package/src/about/about-modal.ts +72 -123
  142. package/src/browse/library-commands.ts +20 -49
  143. package/src/browse/library-layouts.ts +87 -218
  144. package/src/browse/library-pane.ts +406 -438
  145. package/src/canvas/canvas-helpers.ts +0 -49
  146. package/src/canvas/canvas-live-render.ts +25 -2
  147. package/src/canvas/canvas-render.ts +666 -231
  148. package/src/canvas/canvas-surface.ts +0 -1
  149. package/src/canvas/canvas-utils.ts +310 -117
  150. package/src/canvas/dialog-path.ts +76 -0
  151. package/src/canvas/dialog-state.ts +67 -0
  152. package/src/canvas/diff-marks.ts +252 -0
  153. package/src/canvas/diff-toolbar.ts +349 -0
  154. package/src/canvas/diff-view.ts +123 -0
  155. package/src/canvas/edit-width-drag.ts +187 -0
  156. package/src/canvas/edit-width.ts +150 -0
  157. package/src/canvas/iframe-entry.ts +125 -8
  158. package/src/canvas/iframe-host.ts +271 -15
  159. package/src/canvas/iframe-interaction.ts +133 -13
  160. package/src/canvas/iframe-patch.ts +7 -1
  161. package/src/canvas/iframe-position.ts +5 -6
  162. package/src/canvas/iframe-protocol.ts +106 -5
  163. package/src/canvas/iframe-render.ts +373 -5
  164. package/src/canvas/iframe-slash.ts +2 -2
  165. package/src/canvas/iframe-subtree.ts +5 -8
  166. package/src/canvas/path-mapping.ts +25 -3
  167. package/src/canvas/popover-path.ts +106 -0
  168. package/src/canvas/popover-state.ts +155 -0
  169. package/src/canvas/surface-registry.ts +21 -10
  170. package/src/collab/presence-chips.ts +51 -73
  171. package/src/commands/app-commands.ts +10 -0
  172. package/src/commands/budget.ts +12 -0
  173. package/src/commands/command-args.ts +369 -6
  174. package/src/commands/defaults.ts +44 -14
  175. package/src/commands/live-context.ts +11 -5
  176. package/src/commands/reference.ts +12 -2
  177. package/src/commands/registry.ts +165 -8
  178. package/src/content/entry-commands.ts +16 -23
  179. package/src/content/entry-editor.ts +144 -101
  180. package/src/editor/canvas-slash-bridge.ts +2 -2
  181. package/src/editor/context-menu.ts +49 -200
  182. package/src/editor/convert-to-component.ts +42 -82
  183. package/src/editor/convert-to-repeater.ts +132 -173
  184. package/src/editor/inline-edit.ts +11 -0
  185. package/src/editor/shortcuts.ts +65 -26
  186. package/src/editor/slash-menu.ts +150 -157
  187. package/src/files/file-ops.ts +117 -11
  188. package/src/files/files.ts +943 -660
  189. package/src/files/json-layout.ts +474 -0
  190. package/src/files/serialize-document.ts +8 -1
  191. package/src/format/convert-file.ts +16 -10
  192. package/src/format/format-host.ts +50 -1
  193. package/src/github/github-auth.ts +71 -29
  194. package/src/github/github-publish.ts +57 -65
  195. package/src/grid/cell-editors.ts +46 -4
  196. package/src/grid/cell-popovers.ts +65 -62
  197. package/src/grid/grid-open.ts +86 -64
  198. package/src/grid/grid-panel.ts +390 -469
  199. package/src/grid/redirects-grid.ts +40 -44
  200. package/src/hosting/layout.ts +2 -0
  201. package/src/i18n/i18n-commands.ts +127 -62
  202. package/src/media/media-pane.ts +83 -133
  203. package/src/new-project/add-repo-modal.ts +125 -176
  204. package/src/new-project/import-tab.ts +181 -252
  205. package/src/new-project/location-fields.ts +93 -160
  206. package/src/new-project/new-project-modal.ts +376 -367
  207. package/src/packages/jxsuite-update.ts +76 -18
  208. package/src/panels/activity-panel.ts +137 -104
  209. package/src/panels/ai-chat/chat-markdown.ts +15 -13
  210. package/src/panels/ai-chat/chat-view.ts +307 -472
  211. package/src/panels/ai-chat/composer.ts +175 -163
  212. package/src/panels/ai-chat/sessions-view.ts +31 -62
  213. package/src/panels/ai-panel.ts +210 -185
  214. package/src/panels/block-action-bar.ts +437 -643
  215. package/src/panels/bottom-dock.ts +112 -47
  216. package/src/panels/chat-panel.ts +19 -14
  217. package/src/panels/data-explorer.ts +141 -102
  218. package/src/panels/data-grid.ts +183 -150
  219. package/src/panels/dnd.ts +75 -20
  220. package/src/panels/editors.ts +26 -19
  221. package/src/panels/elements-panel.ts +243 -186
  222. package/src/panels/empty-state.ts +26 -42
  223. package/src/panels/events-panel.ts +950 -729
  224. package/src/panels/formula-workspace.ts +434 -207
  225. package/src/panels/frontmatter-fields.ts +185 -153
  226. package/src/panels/frontmatter-panel.ts +411 -187
  227. package/src/panels/git-diff-open.ts +148 -0
  228. package/src/panels/git-panel.ts +679 -605
  229. package/src/panels/head-panel.ts +617 -435
  230. package/src/panels/i18n-panel.ts +153 -133
  231. package/src/panels/imports-panel.ts +388 -414
  232. package/src/panels/jump-bar.ts +174 -147
  233. package/src/panels/layers-panel.ts +785 -671
  234. package/src/panels/left-panel.ts +166 -94
  235. package/src/panels/navigator-panels.ts +1 -1
  236. package/src/panels/pane-context.ts +529 -677
  237. package/src/panels/pane-grid.ts +265 -241
  238. package/src/panels/panel-registry.ts +15 -4
  239. package/src/panels/problems-panel.ts +177 -99
  240. package/src/panels/properties-panel.ts +1525 -966
  241. package/src/panels/provenance.ts +31 -113
  242. package/src/panels/quick-search.ts +217 -172
  243. package/src/panels/right-panel.ts +135 -169
  244. package/src/panels/seo-modal.ts +346 -167
  245. package/src/panels/settings-menu.ts +109 -646
  246. package/src/panels/settings-pane.ts +102 -86
  247. package/src/panels/signals-panel.ts +1318 -1172
  248. package/src/panels/statement-editor.ts +556 -428
  249. package/src/panels/style-panel.ts +1367 -630
  250. package/src/panels/style-utils.ts +36 -32
  251. package/src/panels/stylebook-doc.ts +30 -73
  252. package/src/panels/stylebook-layers-panel.ts +202 -109
  253. package/src/panels/stylebook-panel.ts +124 -88
  254. package/src/panels/tab-strip.ts +385 -287
  255. package/src/platforms/cloud.ts +106 -16
  256. package/src/platforms/devserver.ts +13 -0
  257. package/src/publish/deploy-checklist.ts +124 -78
  258. package/src/publish/publish-commands.ts +4 -12
  259. package/src/publish/publish-panel.ts +134 -328
  260. package/src/services/a11y-report.ts +100 -43
  261. package/src/services/ai-command-tools.ts +468 -0
  262. package/src/services/ai-session-store.ts +6 -0
  263. package/src/services/ai-system-prompt.ts +110 -18
  264. package/src/services/ai-tools.ts +28 -143
  265. package/src/services/ai-write-report.ts +174 -0
  266. package/src/services/document-assistant.ts +50 -2
  267. package/src/services/idle.ts +16 -14
  268. package/src/services/live-surfaces.ts +237 -0
  269. package/src/services/model-uri.ts +75 -0
  270. package/src/services/notify.ts +63 -6
  271. package/src/services/popover-report.ts +325 -0
  272. package/src/services/surface-registry.ts +56 -0
  273. package/src/services/tool-executor.ts +6 -0
  274. package/src/settings/contexts-section.ts +301 -299
  275. package/src/settings/contributed-section.ts +361 -222
  276. package/src/settings/css-vars-editor.ts +320 -325
  277. package/src/settings/defs-editor.ts +572 -535
  278. package/src/settings/dependencies-editor.ts +79 -107
  279. package/src/settings/extension-commands.ts +379 -0
  280. package/src/settings/extension-rows.ts +113 -0
  281. package/src/settings/extensions-section.ts +287 -0
  282. package/src/settings/general-settings.ts +130 -181
  283. package/src/settings/head-editor.ts +10 -305
  284. package/src/settings/locales-section.ts +146 -196
  285. package/src/settings/preferences-accounts.ts +1 -1
  286. package/src/settings/preferences-dialog.ts +350 -330
  287. package/src/settings/project-sections.ts +108 -181
  288. package/src/settings/schema-field-ui.ts +11 -399
  289. package/src/settings/section-registry.ts +8 -1
  290. package/src/settings/settings-document.ts +31 -29
  291. package/src/shell/tree.ts +42 -87
  292. package/src/shell.ts +48 -36
  293. package/src/studio.ts +90 -67
  294. package/src/style/token-ref.ts +0 -39
  295. package/src/surfaces/about.json +263 -0
  296. package/src/surfaces/about.ts +163 -0
  297. package/src/surfaces/add-repo.json +486 -0
  298. package/src/surfaces/add-repo.ts +236 -0
  299. package/src/surfaces/ai-chat.json +2185 -0
  300. package/src/surfaces/ai-chat.ts +549 -0
  301. package/src/surfaces/ai-credentials-form.json +332 -0
  302. package/src/surfaces/ai-credentials-form.ts +151 -0
  303. package/src/surfaces/ai-managed-connect.json +108 -0
  304. package/src/surfaces/ai-managed-connect.ts +123 -0
  305. package/src/surfaces/ai-model-picker.json +114 -0
  306. package/src/surfaces/ai-model-picker.ts +139 -0
  307. package/src/surfaces/block-action-bar.json +640 -0
  308. package/src/surfaces/block-action-bar.ts +368 -0
  309. package/src/surfaces/bottom-dock.json +154 -0
  310. package/src/surfaces/bottom-dock.ts +125 -0
  311. package/src/surfaces/canvas-stage.json +444 -0
  312. package/src/surfaces/canvas-stage.ts +253 -0
  313. package/src/surfaces/cf-account-picker.json +300 -0
  314. package/src/surfaces/cf-account-picker.ts +214 -0
  315. package/src/surfaces/commandbar.json +984 -0
  316. package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
  317. package/src/surfaces/convert-repeater.json +309 -0
  318. package/src/surfaces/convert-repeater.ts +276 -0
  319. package/src/surfaces/data-actions.json +157 -0
  320. package/src/surfaces/data-actions.ts +115 -0
  321. package/src/surfaces/dialog.json +289 -0
  322. package/src/surfaces/dialog.ts +343 -0
  323. package/src/surfaces/diff-toolbar.json +266 -0
  324. package/src/surfaces/diff-toolbar.ts +139 -0
  325. package/src/surfaces/doc-header.json +739 -0
  326. package/src/surfaces/doc-header.ts +223 -0
  327. package/src/surfaces/empty-state.json +152 -0
  328. package/src/surfaces/empty-state.ts +173 -0
  329. package/src/surfaces/entry-editor.json +281 -0
  330. package/src/surfaces/entry-editor.ts +191 -0
  331. package/src/surfaces/expression-editor.json +977 -0
  332. package/src/surfaces/expression-editor.ts +266 -0
  333. package/src/surfaces/files-panel.json +592 -0
  334. package/src/surfaces/files-panel.ts +301 -0
  335. package/src/surfaces/formula-palette.json +364 -0
  336. package/src/surfaces/formula-palette.ts +340 -0
  337. package/src/surfaces/git-panel.json +1822 -0
  338. package/src/surfaces/git-panel.ts +272 -0
  339. package/src/surfaces/github-auth.json +112 -0
  340. package/src/surfaces/github-auth.ts +139 -0
  341. package/src/surfaces/github-publish.json +206 -0
  342. package/src/surfaces/github-publish.ts +169 -0
  343. package/src/surfaces/grid-cell.json +218 -0
  344. package/src/surfaces/grid-cell.ts +120 -0
  345. package/src/surfaces/grid-open.json +147 -0
  346. package/src/surfaces/grid-open.ts +87 -0
  347. package/src/surfaces/grid-panel.json +706 -0
  348. package/src/surfaces/grid-panel.ts +206 -0
  349. package/src/surfaces/grid-replace.json +179 -0
  350. package/src/surfaces/grid-replace.ts +89 -0
  351. package/src/surfaces/grid-views.json +446 -0
  352. package/src/surfaces/grid-views.ts +172 -0
  353. package/src/surfaces/inspector-dock.json +187 -0
  354. package/src/surfaces/inspector-dock.ts +161 -0
  355. package/src/surfaces/jump-bar.json +243 -0
  356. package/src/surfaces/jump-bar.ts +129 -0
  357. package/src/surfaces/jxsuite-update.json +146 -0
  358. package/src/surfaces/jxsuite-update.ts +149 -0
  359. package/src/surfaces/library-pane.json +1509 -0
  360. package/src/surfaces/library-pane.ts +363 -0
  361. package/src/surfaces/logic-panel.json +1949 -0
  362. package/src/surfaces/logic-panel.ts +369 -0
  363. package/src/surfaces/logic-workspace.json +685 -0
  364. package/src/surfaces/logic-workspace.ts +238 -0
  365. package/src/surfaces/media-browser.json +303 -0
  366. package/src/surfaces/media-browser.ts +145 -0
  367. package/src/surfaces/media-field.json +163 -0
  368. package/src/surfaces/media-field.ts +116 -0
  369. package/src/surfaces/media-pane.json +513 -0
  370. package/src/surfaces/media-pane.ts +197 -0
  371. package/src/surfaces/menu.json +232 -0
  372. package/src/surfaces/menu.ts +375 -0
  373. package/src/surfaces/navigator-dock.json +113 -0
  374. package/src/surfaces/navigator-dock.ts +130 -0
  375. package/src/surfaces/new-project.json +1654 -0
  376. package/src/surfaces/new-project.ts +411 -0
  377. package/src/surfaces/palette.json +535 -0
  378. package/src/surfaces/pane-context.json +1497 -0
  379. package/src/surfaces/pane-context.ts +513 -0
  380. package/src/surfaces/pane-grid.json +188 -0
  381. package/src/surfaces/pane-grid.ts +250 -0
  382. package/src/surfaces/panel-activity.json +563 -0
  383. package/src/surfaces/panel-activity.ts +187 -0
  384. package/src/surfaces/panel-data.json +141 -0
  385. package/src/surfaces/panel-data.ts +156 -0
  386. package/src/surfaces/panel-deploy-checklist.json +283 -0
  387. package/src/surfaces/panel-deploy-checklist.ts +175 -0
  388. package/src/surfaces/panel-elements.json +367 -0
  389. package/src/surfaces/panel-elements.ts +175 -0
  390. package/src/surfaces/panel-i18n.json +569 -0
  391. package/src/surfaces/panel-i18n.ts +212 -0
  392. package/src/surfaces/panel-imports.json +780 -0
  393. package/src/surfaces/panel-imports.ts +209 -0
  394. package/src/surfaces/panel-outline.json +734 -0
  395. package/src/surfaces/panel-outline.ts +326 -0
  396. package/src/surfaces/panel-page.json +1017 -0
  397. package/src/surfaces/panel-page.ts +240 -0
  398. package/src/surfaces/panel-problems.json +497 -0
  399. package/src/surfaces/panel-problems.ts +157 -0
  400. package/src/surfaces/panel-signals.json +1973 -0
  401. package/src/surfaces/panel-signals.ts +436 -0
  402. package/src/surfaces/panel-stylebook-layers.json +317 -0
  403. package/src/surfaces/panel-stylebook-layers.ts +155 -0
  404. package/src/surfaces/preferences.json +850 -0
  405. package/src/surfaces/preferences.ts +332 -0
  406. package/src/surfaces/progress-modal.json +110 -0
  407. package/src/surfaces/progress-modal.ts +150 -0
  408. package/src/surfaces/properties-panel.json +1578 -0
  409. package/src/surfaces/properties-panel.ts +337 -0
  410. package/src/surfaces/publish.json +945 -0
  411. package/src/surfaces/publish.ts +392 -0
  412. package/src/surfaces/push-plan.json +110 -0
  413. package/src/surfaces/push-plan.ts +87 -0
  414. package/src/surfaces/rail.json +255 -0
  415. package/src/surfaces/rail.ts +206 -0
  416. package/src/surfaces/reference-field.json +191 -0
  417. package/src/surfaces/reference-field.ts +168 -0
  418. package/src/surfaces/schema-builder.json +1011 -0
  419. package/src/surfaces/schema-builder.ts +181 -0
  420. package/src/surfaces/schema-form.json +1013 -0
  421. package/src/surfaces/schema-form.ts +287 -0
  422. package/src/surfaces/secret-field.json +60 -0
  423. package/src/surfaces/secret-field.ts +146 -0
  424. package/src/surfaces/seo.json +932 -0
  425. package/src/surfaces/seo.ts +334 -0
  426. package/src/surfaces/settings-contexts.json +538 -0
  427. package/src/surfaces/settings-contexts.ts +196 -0
  428. package/src/surfaces/settings-contributed.json +489 -0
  429. package/src/surfaces/settings-contributed.ts +199 -0
  430. package/src/surfaces/settings-css-vars.json +820 -0
  431. package/src/surfaces/settings-css-vars.ts +199 -0
  432. package/src/surfaces/settings-defs.json +1363 -0
  433. package/src/surfaces/settings-defs.ts +232 -0
  434. package/src/surfaces/settings-deploy.json +108 -0
  435. package/src/surfaces/settings-deploy.ts +135 -0
  436. package/src/surfaces/settings-extensions.json +486 -0
  437. package/src/surfaces/settings-extensions.ts +201 -0
  438. package/src/surfaces/settings-head.json +779 -0
  439. package/src/surfaces/settings-head.ts +397 -0
  440. package/src/surfaces/settings-locales.json +420 -0
  441. package/src/surfaces/settings-locales.ts +137 -0
  442. package/src/surfaces/settings-overview.json +423 -0
  443. package/src/surfaces/settings-overview.ts +218 -0
  444. package/src/surfaces/settings-packages.json +549 -0
  445. package/src/surfaces/settings-packages.ts +158 -0
  446. package/src/surfaces/settings-pane.json +147 -0
  447. package/src/surfaces/settings-pane.ts +150 -0
  448. package/src/surfaces/settings-rawjson.json +104 -0
  449. package/src/surfaces/settings-rawjson.ts +107 -0
  450. package/src/surfaces/shell.json +99 -0
  451. package/src/surfaces/shell.ts +30 -0
  452. package/src/surfaces/slash-menu.json +180 -0
  453. package/src/surfaces/slash-menu.ts +272 -0
  454. package/src/surfaces/statements.json +607 -0
  455. package/src/surfaces/statements.ts +238 -0
  456. package/src/surfaces/statusbar.json +94 -0
  457. package/src/{panels → surfaces}/statusbar.ts +163 -90
  458. package/src/surfaces/style-panel.json +1643 -0
  459. package/src/surfaces/style-panel.ts +338 -0
  460. package/src/surfaces/stylebook-chrome.json +122 -0
  461. package/src/surfaces/stylebook-chrome.ts +122 -0
  462. package/src/surfaces/tab-strip.json +448 -0
  463. package/src/surfaces/tab-strip.ts +200 -0
  464. package/src/surfaces/target-line.json +419 -0
  465. package/src/surfaces/target-line.ts +349 -0
  466. package/src/surfaces/toasts.json +189 -0
  467. package/src/surfaces/welcome.json +571 -0
  468. package/src/surfaces/welcome.ts +338 -0
  469. package/src/tabs/project-config.ts +71 -15
  470. package/src/tabs/tab.ts +52 -1
  471. package/src/types.ts +22 -0
  472. package/src/ui/ai-credentials-form.ts +104 -100
  473. package/src/ui/ai-managed-connect.ts +54 -36
  474. package/src/ui/ai-model-picker.ts +75 -47
  475. package/src/ui/cf-account-picker.ts +76 -141
  476. package/src/ui/color-selector.ts +80 -301
  477. package/src/ui/dynamic-slot.ts +43 -283
  478. package/src/ui/expression-editor.ts +797 -576
  479. package/src/ui/field-input.ts +8 -181
  480. package/src/ui/form-controls.ts +838 -366
  481. package/src/ui/formula-chips.ts +80 -85
  482. package/src/ui/kit.ts +33 -0
  483. package/src/ui/layers.ts +293 -593
  484. package/src/ui/media-picker.ts +203 -284
  485. package/src/ui/panel-resize.ts +251 -64
  486. package/src/ui/popover-surface.ts +153 -0
  487. package/src/ui/progress-modal.ts +22 -60
  488. package/src/ui/regions.ts +13 -7
  489. package/src/ui/schema-form.ts +906 -440
  490. package/src/ui/surface.ts +122 -0
  491. package/src/ui/unit-selector.ts +15 -131
  492. package/src/ui/value-source.ts +14 -0
  493. package/src/ui/virtual-window.ts +88 -9
  494. package/src/utils/canvas-media.ts +72 -0
  495. package/src/utils/edit-display.ts +7 -2
  496. package/src/utils/element-selectors.ts +69 -0
  497. package/src/utils/link-target.ts +2 -2
  498. package/src/utils/studio-utils.ts +0 -10
  499. package/src/view.ts +15 -0
  500. package/src/workspace/pane-derive.ts +36 -14
  501. package/src/workspace/workspace.ts +15 -6
  502. package/styles/canvas.css +72 -467
  503. package/styles/forced-colors.css +48 -82
  504. package/styles/forced-colors.json +41 -0
  505. package/styles/inspector.css +2 -1301
  506. package/styles/overlays.css +96 -2823
  507. package/styles/panels.css +6 -1423
  508. package/styles/shell-frame.css +272 -0
  509. package/styles/shell-frame.json +227 -0
  510. package/styles/shell.css +0 -1568
  511. package/styles/tokens.css +65 -136
  512. package/styles/tokens.json +84 -0
  513. package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
  514. package/dist/chunks/adapter-jkcyhgtr.js +0 -14
  515. package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
  516. package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
  517. package/dist/chunks/components-zmx10t62.js +0 -21
  518. package/dist/chunks/content-source-48xg86wj.js +0 -49
  519. package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
  520. package/dist/chunks/editor-cptq5jp1.js +0 -37
  521. package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
  522. package/dist/chunks/extension-sections-txv08xxg.js +0 -311
  523. package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
  524. package/dist/chunks/files-3kfkwhk4.js +0 -93
  525. package/dist/chunks/flow-qbfgrpeh.js +0 -634
  526. package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
  527. package/dist/chunks/focus-visible-6eg70z18.js +0 -167
  528. package/dist/chunks/format-host-w16q81tf.js +0 -43
  529. package/dist/chunks/fs-events-hrrg328g.js +0 -21
  530. package/dist/chunks/git-panel-532whr1y.js +0 -59
  531. package/dist/chunks/index-zqxmqxmh.js +0 -109
  532. package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
  533. package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
  534. package/dist/chunks/layers-q75tj2mf.js +0 -45
  535. package/dist/chunks/lit-html-j055mkh8.js +0 -22
  536. package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
  537. package/dist/chunks/notify-yjm79n4s.js +0 -30
  538. package/dist/chunks/parse-24d0gay3.js +0 -19
  539. package/dist/chunks/platform-ba1j1gbh.js +0 -16
  540. package/dist/chunks/publish-panel-v9st96ja.js +0 -29
  541. package/dist/chunks/quick-search-zccjp6gv.js +0 -66
  542. package/dist/chunks/references-3qx8fkyp.js +0 -29
  543. package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
  544. package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
  545. package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
  546. package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
  547. package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
  548. package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
  549. package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
  550. package/dist/chunks/studio-0a5qrh01.js +0 -3
  551. package/dist/chunks/studio-0bq6eh7v.js +0 -12
  552. package/dist/chunks/studio-18j3bmcz.js +0 -14
  553. package/dist/chunks/studio-1ngbejft.js +0 -181
  554. package/dist/chunks/studio-4b5z1x43.js +0 -424
  555. package/dist/chunks/studio-4n2b5gzb.js +0 -357
  556. package/dist/chunks/studio-4rzyrtjz.js +0 -426
  557. package/dist/chunks/studio-5fx3g9jg.js +0 -4325
  558. package/dist/chunks/studio-5myknm0a.js +0 -1903
  559. package/dist/chunks/studio-7afd21nw.js +0 -67
  560. package/dist/chunks/studio-7nte2hj4.js +0 -613
  561. package/dist/chunks/studio-8jpzqk5s.js +0 -128
  562. package/dist/chunks/studio-8q517dfr.js +0 -24
  563. package/dist/chunks/studio-950k0dx6.js +0 -6939
  564. package/dist/chunks/studio-9n4mrmnb.js +0 -184
  565. package/dist/chunks/studio-a0tswy0w.js +0 -58
  566. package/dist/chunks/studio-ahnzd9rg.js +0 -23
  567. package/dist/chunks/studio-cmb03bg5.js +0 -13890
  568. package/dist/chunks/studio-d1ks410h.js +0 -175
  569. package/dist/chunks/studio-ef49pnzx.js +0 -387
  570. package/dist/chunks/studio-eqq1w638.js +0 -113
  571. package/dist/chunks/studio-ew0djmhg.js +0 -341
  572. package/dist/chunks/studio-gfgb8pe6.js +0 -1652
  573. package/dist/chunks/studio-h4rxscfc.js +0 -10
  574. package/dist/chunks/studio-jc994dnr.js +0 -1066
  575. package/dist/chunks/studio-kyh9avvv.js +0 -28
  576. package/dist/chunks/studio-m3hwn7y1.js +0 -120
  577. package/dist/chunks/studio-mtfnaqs9.js +0 -659
  578. package/dist/chunks/studio-n6j9t10q.js +0 -318
  579. package/dist/chunks/studio-n8b9wqwy.js +0 -291
  580. package/dist/chunks/studio-qcy05dp8.js +0 -1743
  581. package/dist/chunks/studio-qq6jym04.js +0 -53
  582. package/dist/chunks/studio-rdx8jcxy.js +0 -83
  583. package/dist/chunks/studio-rn9ta2mz.js +0 -111
  584. package/dist/chunks/studio-t7qb9db8.js +0 -665
  585. package/dist/chunks/studio-tmc5emrw.js +0 -8
  586. package/dist/chunks/studio-z6nw2ek2.js +0 -18
  587. package/dist/chunks/studio-zczps70q.js +0 -378
  588. package/dist/chunks/studio-zqazsct2.js +0 -1823
  589. package/dist/chunks/workspace-fjx52ryv.js +0 -89
  590. package/src/panels/activity-bar.ts +0 -251
  591. package/src/panels/panel-scheduler.ts +0 -219
  592. package/src/panels/style-inputs.ts +0 -237
  593. package/src/panels/target-line.ts +0 -274
  594. package/src/panels/welcome-screen.ts +0 -346
  595. package/src/ui/button-group.ts +0 -102
  596. package/src/ui/choice-field.ts +0 -72
  597. package/src/ui/field-row.ts +0 -249
  598. package/src/ui/formula-palette.ts +0 -213
  599. package/src/ui/icons.ts +0 -52
  600. package/src/ui/jx-theme.ts +0 -130
  601. package/src/ui/spectrum.ts +0 -340
  602. package/src/ui/value-selector.ts +0 -174
  603. package/src/ui/widgets.ts +0 -172
  604. /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
  605. /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
  606. /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
  607. /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
@@ -0,0 +1,272 @@
1
+ /// <reference lib="dom" />
2
+ /**
3
+ * The Source Control panel, as a mounted document.
4
+ *
5
+ * `panels/git-panel.ts` is the flow — what git is asked, what a comparison is, which files group
6
+ * under which component, what a commit does before it runs, and which of the four moods the panel
7
+ * is in — and this is the surface it draws into: the reactive scope the document reads, the flags
8
+ * it discriminates on, and the mount that stays put while the Navigator repaints around it.
9
+ *
10
+ * **The flow tells the surface what a row says, never what it means.** A changed file arrives as a
11
+ * name, a directory, a status letter, that status said aloud, and two booleans; nothing here learns
12
+ * what `U` is or that a `.png` has no comparison to open. That matters more here than in the
13
+ * settings sections, because the file rows are NESTED — inside the per-file map `$map/item` is the
14
+ * file, so a row genuinely cannot reach the group it is under — and a path it can hand straight
15
+ * back is the whole answer.
16
+ *
17
+ * **The container is not cleared**, which is the one line where a panel differs from a settings
18
+ * section. A section is handed the pane's whole content area and starts by emptying it; a panel
19
+ * body is a node lit renders into, and its comment markers are how lit finds its own content again.
20
+ * So the document is APPENDED, and {@link GitPanelSurfaceHandle.connected} is how the panel finds
21
+ * out that the Navigator has since painted another panel over the top of it.
22
+ *
23
+ * @docs studio/publish/source-control
24
+ */
25
+
26
+ import { reactive } from "../reactivity";
27
+ import { mountSurface, registerSurface } from "../ui/surface";
28
+ import gitPanelDoc from "./git-panel.json";
29
+ import type { JxDocument } from "@jxsuite/schema/types";
30
+ import type { SurfaceHandle } from "../ui/surface";
31
+
32
+ registerSurface("git-panel", gitPanelDoc as unknown as JxDocument);
33
+
34
+ /** One changed file, as the document draws it. Every field is a value: no records, no closures. */
35
+ export interface GitFileRowView {
36
+ /** The row's reconcile key AND what every button hands back — the project-relative path. */
37
+ key: string;
38
+ path: string;
39
+ /** The last segment, which is what the row reads as. */
40
+ name: string;
41
+ /** Everything before it, drawn small beside the name. */
42
+ dir: string;
43
+ /** Whether there is a directory to draw; the document has no `length` to ask. */
44
+ hasDir: boolean;
45
+ /** The open button's accessible name: the path and the status in words. */
46
+ label: string;
47
+ /** The one-letter badge — `M`, `A`, `D`, `R`, `U`. */
48
+ status: string;
49
+ /** Which pair of verbs the row offers: Unstage, or Discard and Stage. */
50
+ staged: boolean;
51
+ /**
52
+ * Whether Discard is refused, spelled the way the document reads it. An untracked file has no
53
+ * committed version to come back to, so there is nothing to discard TO.
54
+ */
55
+ cannotDiscard: boolean;
56
+ }
57
+
58
+ /** One component's changed files, under the heading the flow spelled. */
59
+ export interface GitGroupView {
60
+ key: string;
61
+ name: string;
62
+ files: GitFileRowView[];
63
+ }
64
+
65
+ /** One commit in the log. */
66
+ export interface GitCommitView {
67
+ key: string;
68
+ /** The short hash, already sliced. */
69
+ hash: string;
70
+ message: string;
71
+ /** "ada · 5m ago" — the author and the age, joined by the flow that knows the clock. */
72
+ meta: string;
73
+ }
74
+
75
+ /** One row of the branch picker. `__new__` is a row like any other; the flow knows what it means. */
76
+ export interface GitBranchOption {
77
+ value: string;
78
+ label: string;
79
+ }
80
+
81
+ /** What the panel says the surface should be showing right now. */
82
+ export interface GitPanelValues {
83
+ /**
84
+ * Which of the four moods the panel is in: no project open, a first read still in flight, a
85
+ * project git is not tracking, or a repository. The flow decides; the document switches.
86
+ */
87
+ view: "no-project" | "loading" | "no-repo" | "repo";
88
+ /** Whether this platform can clone at all — the one action the no-project state offers. */
89
+ canClone: boolean;
90
+ /** A git verb is in flight: every button that would start a second one is off. */
91
+ busy: boolean;
92
+ hasError: boolean;
93
+ error: string;
94
+ /** `remote` or `local`: which sync bar is drawn. */
95
+ remoteState: "remote" | "local";
96
+ /** "Up to date", or "3 ahead, 1 behind". */
97
+ syncLabel: string;
98
+ /** "Last updated 02:04 PM", or empty. */
99
+ lastUpdated: string;
100
+ hasLastUpdated: boolean;
101
+ /** The pull and push buttons' names, which carry their counts: "Pull (2 behind)". */
102
+ pullLabel: string;
103
+ pushLabel: string;
104
+ branchName: string;
105
+ /** What the picker currently holds. Not always {@link branchName} — see the adapter's note. */
106
+ branchValue: string;
107
+ branchOptions: GitBranchOption[];
108
+ /** `changes` or `history` — `shell.git.subTab`, which names the `$switch` case. */
109
+ subTab: string;
110
+ /** "Local Changes (6)" — the count is part of the tab's label, not a badge of its own. */
111
+ changesLabel: string;
112
+ commitMessage: string;
113
+ hasStaged: boolean;
114
+ stagedCount: string;
115
+ stagedFiles: GitFileRowView[];
116
+ changedCount: string;
117
+ /** Whether Stage all has anything to stage. */
118
+ hasUnstaged: boolean;
119
+ filesState: "listed" | "empty";
120
+ groups: GitGroupView[];
121
+ historyState: "listed" | "empty";
122
+ commits: GitCommitView[];
123
+ }
124
+
125
+ /** What a control can ask the panel to do. Every one of them is a decision the flow owns. */
126
+ export interface GitPanelActions {
127
+ clone: () => void;
128
+ initRepository: () => void;
129
+ createRepository: () => void;
130
+ refresh: () => void;
131
+ fetch: () => void;
132
+ pull: () => void;
133
+ push: () => void;
134
+ /** A pick from the branch picker — including the row that means "make a new one". */
135
+ chooseBranch: (value: string) => void;
136
+ selectTab: (tab: string) => void;
137
+ /** State what the commit field now holds, before anything is decided about it. */
138
+ editMessage: (value: string) => void;
139
+ /** Commit without pushing — the chord, and the menu row. */
140
+ commit: () => void;
141
+ commitAndSync: () => void;
142
+ /** The split button's second half: the kit menu, hung off the control that was clicked. */
143
+ openCommitMenu: (anchor: HTMLElement) => void;
144
+ openFile: (path: string) => void;
145
+ stage: (path: string) => void;
146
+ unstage: (path: string) => void;
147
+ discard: (path: string) => void;
148
+ stageAll: () => void;
149
+ unstageAll: () => void;
150
+ }
151
+
152
+ export interface GitPanelSurfaceHandle {
153
+ /** Bring the mounted document up to date with a whole projection. */
154
+ update: (values: GitPanelValues) => void;
155
+ /** Whether the document this mounted is still standing in the container it was given. */
156
+ connected: () => boolean;
157
+ /** Take the document down. Idempotent. */
158
+ dispose: () => void;
159
+ }
160
+
161
+ /** The scope the document reads: the projection, plus everything a control can ask for. */
162
+ interface GitPanelScope extends Record<string, unknown>, GitPanelValues, GitPanelActions {}
163
+
164
+ /** Write a projection into the scope. Assignment by assignment, so an unchanged field is inert. */
165
+ function project(scope: GitPanelScope, values: GitPanelValues): void {
166
+ scope.view = values.view;
167
+ scope.canClone = values.canClone;
168
+ scope.busy = values.busy;
169
+ scope.hasError = values.hasError;
170
+ scope.error = values.error;
171
+ scope.remoteState = values.remoteState;
172
+ scope.syncLabel = values.syncLabel;
173
+ scope.lastUpdated = values.lastUpdated;
174
+ scope.hasLastUpdated = values.hasLastUpdated;
175
+ scope.pullLabel = values.pullLabel;
176
+ scope.pushLabel = values.pushLabel;
177
+ scope.branchName = values.branchName;
178
+ scope.branchValue = values.branchValue;
179
+ scope.branchOptions = values.branchOptions;
180
+ scope.subTab = values.subTab;
181
+ scope.changesLabel = values.changesLabel;
182
+ scope.commitMessage = values.commitMessage;
183
+ scope.hasStaged = values.hasStaged;
184
+ scope.stagedCount = values.stagedCount;
185
+ scope.stagedFiles = values.stagedFiles;
186
+ scope.changedCount = values.changedCount;
187
+ scope.hasUnstaged = values.hasUnstaged;
188
+ scope.filesState = values.filesState;
189
+ scope.groups = values.groups;
190
+ scope.historyState = values.historyState;
191
+ scope.commits = values.commits;
192
+ }
193
+
194
+ /** The scope's starting shape, before the first projection lands on it. */
195
+ function emptyValues(): GitPanelValues {
196
+ return {
197
+ branchName: "",
198
+ branchOptions: [],
199
+ branchValue: "",
200
+ busy: false,
201
+ canClone: false,
202
+ changedCount: "0",
203
+ changesLabel: "Local Changes",
204
+ commitMessage: "",
205
+ commits: [],
206
+ error: "",
207
+ filesState: "empty",
208
+ groups: [],
209
+ hasError: false,
210
+ hasLastUpdated: false,
211
+ hasStaged: false,
212
+ hasUnstaged: false,
213
+ historyState: "empty",
214
+ lastUpdated: "",
215
+ pullLabel: "Pull",
216
+ pushLabel: "Push",
217
+ remoteState: "local",
218
+ stagedCount: "0",
219
+ stagedFiles: [],
220
+ subTab: "changes",
221
+ syncLabel: "",
222
+ view: "loading",
223
+ };
224
+ }
225
+
226
+ /**
227
+ * Mount the Source Control document into `container`, which is the `.panel-content` the Navigator
228
+ * just painted.
229
+ *
230
+ * Nothing is called on the elements, so the mount is all this has to wait for: the DOCUMENT is what
231
+ * this surface renders, and the kit elements inside it settle their own templates one
232
+ * `connectedCallback` later without anybody here asking them to (guidelines §1.1, "await the
233
+ * element").
234
+ */
235
+ export function mountGitPanelSurface(
236
+ container: HTMLElement,
237
+ values: GitPanelValues,
238
+ actions: GitPanelActions,
239
+ ): GitPanelSurfaceHandle {
240
+ const scope = reactive<GitPanelScope>({
241
+ ...emptyValues(),
242
+ ...actions,
243
+ }) as GitPanelScope;
244
+ project(scope, values);
245
+
246
+ let mounted: SurfaceHandle | null = null;
247
+ let disposed = false;
248
+ void mountSurface("git-panel", scope, container).then((surface) => {
249
+ if (disposed) {
250
+ surface.dispose();
251
+ return;
252
+ }
253
+ mounted = surface;
254
+ });
255
+
256
+ return {
257
+ /* While the mount is still in flight there is nothing in the container to ask about, so the
258
+ answer is simply whether this handle is still wanted — answering no would start a second
259
+ mount racing the first. Once mounted, the question is whether the root is still where it was
260
+ put: a Navigator that painted another panel cleared this document out from under it. */
261
+ connected: () =>
262
+ !disposed && (mounted === null || (mounted.root as Node).parentNode === container),
263
+ dispose() {
264
+ disposed = true;
265
+ mounted?.dispose();
266
+ mounted = null;
267
+ },
268
+ update: (next) => {
269
+ project(scope, next);
270
+ },
271
+ };
272
+ }
@@ -0,0 +1,112 @@
1
+ {
2
+ "$schema": "https://jxsuite.com/schema/v1",
3
+ "$id": "StudioGithubAuth",
4
+ "$description": "The RFC 8628 device flow's waiting room: the code GitHub minted, the page to type it into, and a Cancel. A `jx-dialog`, so the platform owns modality, Escape, focus restoration and the backdrop — and it is the reason the dialog has no confirm button at all: the answer arrives from GitHub over a poll rather than from anything the reader can press here, so a primary button would be a control with nothing to do. Nothing in this document talks to GitHub: `github/github-auth.ts` keeps the client id, the poll loop, its failure budget and every report the three outcomes raise.",
5
+ "tagName": "jx-dialog",
6
+ "$props": {
7
+ "headline": "Sign in to GitHub",
8
+ "confirmLabel": "",
9
+ "cancelLabel": "Cancel",
10
+ "size": "sm"
11
+ },
12
+ "attributes": {
13
+ "part": "github-auth"
14
+ },
15
+ "oncancel": {
16
+ "$prototype": "Function",
17
+ "body": [
18
+ {
19
+ "operator": "call",
20
+ "target": {
21
+ "$ref": "#/state/cancel"
22
+ },
23
+ "value": []
24
+ }
25
+ ]
26
+ },
27
+ "onclose": {
28
+ "$prototype": "Function",
29
+ "body": [
30
+ {
31
+ "operator": "call",
32
+ "target": {
33
+ "$ref": "#/state/closed"
34
+ },
35
+ "value": []
36
+ }
37
+ ]
38
+ },
39
+ "style": {
40
+ "$description": "Four `.github-auth-*` rules in `styles/overlays.css` become the parts below, and two things in them do not travel. `.github-auth-dialog`'s `padding: 16px 0` was the card's own body padding drawn by hand, and `jx-dialog` already pads its body; `.github-auth-dialog p { font-size: 13px }` was a body size this surface picked for itself, and what the paragraphs now inherit is the dialog's own `--jx-text-md`. The `8px 0` margins go with them — the column is a flex column with a gap, so a margin between two rows would be a second opinion about the same space. The code keeps its 24px, which is above the token scale on purpose: it is a string the reader has to copy onto another screen, and reading it out loud is the whole job of this dialog.",
41
+ "& [part=\"device\"]": {
42
+ "display": "flex",
43
+ "flexDirection": "column",
44
+ "alignItems": "center",
45
+ "gap": "var(--jx-space-3)",
46
+ "textAlign": "center"
47
+ },
48
+ "& [part=\"lede\"], & [part=\"waiting\"]": {
49
+ "margin": "0"
50
+ },
51
+ "& [part=\"code\"]": {
52
+ "$description": "`<code>`, not a styled `<div>`: this is a literal string to be transcribed, and the element that says so is also the one a reader's own stylesheet and a screen reader's character-by-character mode already know about.",
53
+ "fontFamily": "var(--font-mono)",
54
+ "fontSize": "24px",
55
+ "fontWeight": "700",
56
+ "letterSpacing": "2px",
57
+ "padding": "var(--jx-space-3) var(--jx-space-4)",
58
+ "background": "var(--hover-bg)",
59
+ "borderRadius": "var(--radius)"
60
+ },
61
+ "& [part=\"link\"]": {
62
+ "$description": "The blue this carried as a `var(--accent, …)` fallback is gone: `--accent` is declared on `:root` in `styles/tokens.css`, so the fallback could only ever have painted when the token was missing — which is a theme fault to fix rather than a colour to hard-code.",
63
+ "color": "var(--accent)",
64
+ "textDecoration": "underline"
65
+ },
66
+ "& [part=\"waiting\"]": {
67
+ "color": "var(--fg-dim)",
68
+ "fontStyle": "italic"
69
+ }
70
+ },
71
+ "children": [
72
+ {
73
+ "tagName": "div",
74
+ "attributes": {
75
+ "part": "device"
76
+ },
77
+ "children": [
78
+ {
79
+ "tagName": "p",
80
+ "attributes": {
81
+ "part": "lede"
82
+ },
83
+ "textContent": "Enter this code on GitHub to authorize Jx Studio:"
84
+ },
85
+ {
86
+ "tagName": "code",
87
+ "attributes": {
88
+ "part": "code"
89
+ },
90
+ "textContent": "${state.userCode}"
91
+ },
92
+ {
93
+ "tagName": "a",
94
+ "attributes": {
95
+ "part": "link",
96
+ "href": "${state.verificationUri}",
97
+ "target": "_blank",
98
+ "rel": "noreferrer"
99
+ },
100
+ "textContent": "Open ${state.verificationUri}"
101
+ },
102
+ {
103
+ "tagName": "p",
104
+ "attributes": {
105
+ "part": "waiting"
106
+ },
107
+ "textContent": "Waiting for authorization…"
108
+ }
109
+ ]
110
+ }
111
+ ]
112
+ }
@@ -0,0 +1,139 @@
1
+ /// <reference lib="dom" />
2
+ /**
3
+ * The GitHub device-flow waiting room, as a mounted document.
4
+ *
5
+ * `github/github-auth.ts` is the flow — the client id, the device-code request, the poll loop, its
6
+ * failure budget and the three reports the outcomes raise — and this is the surface it draws into:
7
+ * the code GitHub minted, the page to type it into, and the one answer the reader can give.
8
+ *
9
+ * **There is nothing to update.** Both values are minted once by the device-code request and are
10
+ * dead the moment the flow ends, so the handle offers `close` and no `update`: a code that changed
11
+ * under the reader mid-transcription would be a defect rather than a feature, and a handle that
12
+ * could express it would invite one.
13
+ *
14
+ * **The dialog has no confirm.** The answer arrives from GitHub over a poll rather than from
15
+ * anything on screen, so the document sets `confirmLabel` empty and `jx-dialog` draws Cancel alone.
16
+ * A dialog that reports its own dismissal is the whole contract here: `onClosed` fires once, for
17
+ * the platform's `close` and for this module's, and the flow stops polling on it.
18
+ *
19
+ * **Await the ELEMENT, not just the mount.** `mountSurface` resolving means the DOCUMENT rendered;
20
+ * a `jx-dialog`'s own template is one `connectedCallback` later, and `showModal` in between finds
21
+ * no `<dialog>` to open — the body is all there, correctly styled, and never shows. `whenReady` is
22
+ * shared with `surfaces/dialog.ts` rather than reimplemented.
23
+ *
24
+ * @docs studio/publish/github
25
+ */
26
+
27
+ import { reactive } from "../reactivity";
28
+ import { mountSurface, registerSurface } from "../ui/surface";
29
+ import { overlayRegion, REGION_ATTR } from "../ui/regions";
30
+ import { close as closeDialog, showModal } from "@jxsuite/ui/behaviors/dialog";
31
+ import { whenReady } from "./dialog";
32
+ import githubAuthDoc from "./github-auth.json";
33
+ import type { SurfaceHandle } from "../ui/surface";
34
+ import type { JxDocument } from "@jxsuite/schema/types";
35
+
36
+ registerSurface("github-auth", githubAuthDoc as unknown as JxDocument);
37
+
38
+ export interface GithubAuthSurfaceOptions {
39
+ /** Where the dialog is mounted — the dialog layer, handed in so this never reaches back. */
40
+ layer: HTMLElement;
41
+ /** The user code GitHub minted, exactly as it must be typed. */
42
+ userCode: string;
43
+ /** The page the code is typed into. Printed in full, because the reader may retype it. */
44
+ verificationUri: string;
45
+ /** The reader declined — the Cancel button, or Escape. */
46
+ onCancel: () => void;
47
+ /** The dialog closed, for any reason the platform owns as well as this module's `close`. */
48
+ onClosed: () => void;
49
+ }
50
+
51
+ export interface GithubAuthSurfaceHandle {
52
+ /** The slot in the dialog layer that carries the region. */
53
+ host: HTMLElement;
54
+ /** Resolves with the `jx-dialog` element once it has rendered and been opened. */
55
+ ready: Promise<HTMLElement>;
56
+ /** Close the dialog (the platform restores focus) and dispose the document. Idempotent. */
57
+ close: () => void;
58
+ }
59
+
60
+ interface GithubAuthScope extends Record<string, unknown> {
61
+ userCode: string;
62
+ verificationUri: string;
63
+ cancel: () => void;
64
+ closed: () => void;
65
+ }
66
+
67
+ /** Put the code up. The handle's `ready` resolves once the dialog is showing. */
68
+ export function openGithubAuthSurface(options: GithubAuthSurfaceOptions): GithubAuthSurfaceHandle {
69
+ const slot = document.createElement("div");
70
+ /* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
71
+ slot in it turns them back on for its own content. `pointer-events` INHERITS, and the top layer
72
+ changes paint order rather than inheritance, so a modal `<dialog>` in a slot that skipped this
73
+ is painted above everything and hit-tests to nothing. */
74
+ slot.style.pointerEvents = "auto";
75
+ slot.setAttribute(REGION_ATTR, overlayRegion("dialog", "github-auth"));
76
+ options.layer.append(slot);
77
+
78
+ let closed = false;
79
+ /**
80
+ * Say it is over, once.
81
+ *
82
+ * Two paths reach here and either may be first: the platform's own `close` event, which `close()`
83
+ * provokes, and `close()` on a dialog that never got as far as being shown — which is the
84
+ * ordinary end of this flow, because the token usually arrives while the dialog is still up.
85
+ */
86
+ const finish = (): void => {
87
+ if (closed) {
88
+ return;
89
+ }
90
+ closed = true;
91
+ options.onClosed();
92
+ };
93
+
94
+ const scope = reactive<GithubAuthScope>({
95
+ cancel: () => {
96
+ options.onCancel();
97
+ },
98
+ closed: finish,
99
+ userCode: options.userCode,
100
+ verificationUri: options.verificationUri,
101
+ }) as GithubAuthScope;
102
+
103
+ let mounted: SurfaceHandle | null = null;
104
+ const ready = mountSurface("github-auth", scope, slot).then(async (surface) => {
105
+ mounted = surface;
106
+ const element = surface.root as HTMLElement;
107
+ if (closed) {
108
+ surface.dispose();
109
+ return element;
110
+ }
111
+ await whenReady(element);
112
+ if (closed) {
113
+ return element;
114
+ }
115
+ showModal(element);
116
+ return element;
117
+ });
118
+
119
+ return {
120
+ close() {
121
+ /* Guarded on the WORK rather than on `closed`, and the difference is a slot that would
122
+ otherwise be left behind: the platform's own `close` runs `finish()` before any caller
123
+ reaches here, so a `close()` that returned early on `closed` would take the dialog down and
124
+ leave its host div in the layer. Every line below is idempotent instead. */
125
+ const element = mounted?.root;
126
+ if (element instanceof HTMLElement) {
127
+ // The platform's close first, so focus goes back where it came from; then the document.
128
+ closeDialog(element);
129
+ }
130
+ // A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
131
+ mounted?.dispose();
132
+ mounted = null;
133
+ slot.remove();
134
+ finish();
135
+ },
136
+ host: slot,
137
+ ready,
138
+ };
139
+ }