@jxsuite/studio 4.1.0 → 5.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.
- package/README.md +1 -1
- package/data/elements-meta.json +5 -15
- package/data/html-meta.json +51 -6
- package/dist/chunks/{2020-n6tfwnda.js → 2020-g79n01v9.js} +14 -14
- package/dist/chunks/action-group-sp6tna8v.js +118 -0
- package/dist/chunks/adapter-nj7tnjfn.js +13 -0
- package/dist/chunks/cf-account-picker-qwkm9zrf.js +495 -0
- package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
- package/dist/chunks/color-area-v17df7b8.js +154 -0
- package/dist/chunks/color-field-anwybnkn.js +208 -0
- package/dist/chunks/color-slider-44ez96fc.js +79 -0
- package/dist/chunks/color-xgg3kfw7.js +35 -0
- package/dist/chunks/combobox-5e7jev23.js +236 -0
- package/dist/chunks/components-vj72gqtq.js +20 -0
- package/dist/chunks/content-source-5mex4x1h.js +46 -0
- package/dist/chunks/convert-to-repeater-n64h8znc.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-234hjnqw.js +42 -0
- package/dist/chunks/extension-sections-3hpcambp.js +651 -0
- package/dist/chunks/file-ops-8yhd83xr.js +47 -0
- package/dist/chunks/files-hnxqxtsg.js +72 -0
- package/dist/chunks/format-host-779sfp2n.js +40 -0
- package/dist/chunks/fs-events-b88z7g4h.js +18 -0
- package/dist/chunks/git-panel-xwj8fpab.js +49 -0
- package/dist/chunks/icons-yy10wk9r.js +402 -0
- package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
- package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
- package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
- package/dist/chunks/iframe-host-syr0f9sb.js +115 -0
- package/dist/chunks/{index-wcnt3r9g.js → index-mdmyx6s2.js} +11 -11
- package/dist/chunks/index-n4j7qxyr.js +109 -0
- package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
- package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
- package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
- package/dist/chunks/layers-ff81wthn.js +30 -0
- package/dist/chunks/layers-panel-pnnghw12.js +40 -0
- package/dist/chunks/listbox-6v2ac08j.js +44 -0
- package/dist/chunks/lit-html-m244w9nh.js +17 -0
- package/dist/chunks/media-picker-cqhhxhhe.js +33 -0
- package/dist/chunks/menu-9p2w46gj.js +15 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
- package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
- package/dist/chunks/{monaco-setup-vx9bhp1d.js → monaco-setup-8r62fj6y.js} +27 -37
- package/dist/chunks/notify-628t0anh.js +21 -0
- package/dist/chunks/number-field-5cndyft8.js +72 -0
- package/dist/chunks/parse-0zx14y15.js +10 -0
- package/dist/chunks/platform-ts9cg1a4.js +15 -0
- package/dist/chunks/popover-47z3ytva.js +25 -0
- package/dist/chunks/publish-panel-5zt840sy.js +27 -0
- package/dist/chunks/quick-search-3748564r.js +45 -0
- package/dist/chunks/references-qvvxej7h.js +26 -0
- package/dist/chunks/right-panel-eccz92qt.js +45 -0
- package/dist/chunks/section-registry-5pq32t0q.js +25 -0
- package/dist/chunks/select-2r16ez41.js +49 -0
- package/dist/chunks/split-g7nm1rgb.js +191 -0
- package/dist/chunks/studio-0hqbpbd0.js +62 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-b55y6ewx.js → studio-1knfqgy7.js} +58 -58
- package/dist/chunks/{studio-2b946z26.js → studio-1z1kcjv4.js} +3628 -6095
- package/dist/chunks/studio-3773086z.js +111 -0
- package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
- package/dist/chunks/{studio-x813zp48.js → studio-3rz5md06.js} +30 -30
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/studio-5wt9nvhd.js +4763 -0
- package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
- package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
- package/dist/chunks/studio-6xa21ej9.js +28 -0
- package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
- package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xnmgv66.js +13615 -0
- package/dist/chunks/studio-8scdew0e.js +258 -0
- package/dist/chunks/{studio-fbf92ckf.js → studio-93zafjcm.js} +275 -163
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-a79k90n9.js +1162 -0
- package/dist/chunks/studio-aj37eer3.js +422 -0
- package/dist/chunks/studio-b0k5tqgp.js +2432 -0
- package/dist/chunks/studio-b4s9eykd.js +2811 -0
- package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/studio-e1pgga3k.js +839 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/{studio-q43a5y9h.js → studio-g3jevyjt.js} +16 -16
- package/dist/chunks/studio-gb13095a.js +2806 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
- package/dist/chunks/{studio-x4qkdat5.js → studio-js8nv53n.js} +1749 -2481
- package/dist/chunks/{studio-qjy2z9bv.js → studio-jxp12rnj.js} +32 -137
- package/dist/chunks/{studio-trxrabqf.js → studio-k75n7vhp.js} +527 -283
- package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/studio-kkqkcp3d.js +17668 -0
- package/dist/chunks/studio-mhhyamxf.js +763 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-nq5yf5mp.js} +22 -22
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/studio-nzzpvzx9.js +185 -0
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/{studio-3bqpr0zh.js → studio-pxbgypmg.js} +299 -110
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/{studio-6yw4y3my.js → studio-qhhm6hbt.js} +8 -8
- package/dist/chunks/studio-qk4bfsq2.js +362 -0
- package/dist/chunks/{studio-msd847zn.js → studio-qk90fgqm.js} +361 -90
- package/dist/chunks/{studio-jkftxyvz.js → studio-r6nvacqs.js} +5861 -2154
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/studio-sbjyc8bt.js +954 -0
- package/dist/chunks/{studio-1wagb550.js → studio-syg2tadj.js} +11 -11
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-tqgryxwg.js +1171 -0
- package/dist/chunks/studio-try13h8c.js +8448 -0
- package/dist/chunks/studio-vfq8qpjt.js +1219 -0
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-ahn3pdgx.js → studio-vw7mzp6z.js} +52 -38
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/studio-wqz6dggm.js +1356 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/studio-zdn2g6dt.js +148 -0
- package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
- package/dist/chunks/tabs-wbp1cdws.js +156 -0
- package/dist/chunks/textfield-abk6qyee.js +73 -0
- package/dist/chunks/toast-780pvfbv.js +27 -0
- package/dist/chunks/toast-host-3sqv46sn.js +116 -0
- package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
- package/dist/chunks/tooltip-eptb614w.js +369 -0
- package/dist/chunks/tree-a73p0pqm.js +367 -0
- package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
- package/dist/chunks/workspace-t55jdjbx.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1873 -673
- package/dist/studio.js +52757 -36535
- package/dist/workers/editor.worker.js +1040 -1085
- package/dist/workers/json.worker.js +1946 -1991
- package/dist/workers/ts.worker.js +4960 -5005
- package/index.html +1 -0
- package/package.json +18 -52
- package/src/about/about-modal.ts +72 -123
- package/src/browse/library-commands.ts +20 -49
- package/src/browse/library-layouts.ts +87 -218
- package/src/browse/library-pane.ts +406 -438
- package/src/canvas/canvas-helpers.ts +0 -49
- package/src/canvas/canvas-live-render.ts +25 -2
- package/src/canvas/canvas-render.ts +666 -231
- package/src/canvas/canvas-surface.ts +0 -1
- package/src/canvas/canvas-utils.ts +333 -113
- package/src/canvas/dialog-path.ts +76 -0
- package/src/canvas/dialog-state.ts +67 -0
- package/src/canvas/diff-marks.ts +252 -0
- package/src/canvas/diff-toolbar.ts +349 -0
- package/src/canvas/diff-view.ts +123 -0
- package/src/canvas/edit-width-drag.ts +187 -0
- package/src/canvas/edit-width.ts +150 -0
- package/src/canvas/iframe-entry.ts +125 -8
- package/src/canvas/iframe-host.ts +271 -15
- package/src/canvas/iframe-interaction.ts +133 -13
- package/src/canvas/iframe-patch.ts +7 -1
- package/src/canvas/iframe-position.ts +5 -6
- package/src/canvas/iframe-protocol.ts +106 -5
- package/src/canvas/iframe-render.ts +373 -5
- package/src/canvas/iframe-slash.ts +2 -2
- package/src/canvas/iframe-subtree.ts +5 -8
- package/src/canvas/path-mapping.ts +25 -3
- package/src/canvas/popover-path.ts +106 -0
- package/src/canvas/popover-state.ts +155 -0
- package/src/canvas/surface-registry.ts +21 -10
- package/src/collab/presence-chips.ts +51 -73
- package/src/commands/app-commands.ts +10 -0
- package/src/commands/budget.ts +12 -0
- package/src/commands/command-args.ts +404 -6
- package/src/commands/defaults.ts +44 -14
- package/src/commands/live-context.ts +11 -5
- package/src/commands/reference.ts +12 -2
- package/src/commands/registry.ts +177 -10
- package/src/commands/run-reported.ts +120 -0
- package/src/content/entry-commands.ts +16 -23
- package/src/content/entry-editor.ts +144 -101
- package/src/editor/canvas-slash-bridge.ts +2 -2
- package/src/editor/context-menu.ts +49 -200
- package/src/editor/convert-to-component.ts +42 -82
- package/src/editor/convert-to-repeater.ts +132 -173
- package/src/editor/inline-edit.ts +11 -0
- package/src/editor/shortcuts.ts +76 -49
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/components.ts +39 -0
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +944 -660
- package/src/files/json-layout.ts +474 -0
- package/src/files/serialize-document.ts +8 -1
- package/src/format/convert-file.ts +16 -10
- package/src/format/format-host.ts +50 -1
- package/src/github/github-auth.ts +71 -29
- package/src/github/github-publish.ts +57 -65
- package/src/grid/cell-editors.ts +46 -4
- package/src/grid/cell-popovers.ts +65 -62
- package/src/grid/grid-open.ts +86 -64
- package/src/grid/grid-panel.ts +390 -469
- package/src/grid/redirects-grid.ts +40 -44
- package/src/hosting/layout.ts +2 -0
- package/src/i18n/i18n-commands.ts +137 -62
- package/src/media/media-pane.ts +83 -133
- package/src/new-project/add-repo-modal.ts +125 -176
- package/src/new-project/import-tab.ts +181 -252
- package/src/new-project/location-fields.ts +93 -160
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- package/src/packages/pull-package-sync.ts +5 -1
- package/src/panels/activity-panel.ts +137 -104
- package/src/panels/ai-chat/chat-markdown.ts +15 -13
- package/src/panels/ai-chat/chat-view.ts +307 -472
- package/src/panels/ai-chat/composer.ts +175 -163
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +213 -185
- package/src/panels/block-action-bar.ts +444 -645
- package/src/panels/bottom-dock.ts +112 -47
- package/src/panels/chat-panel.ts +19 -14
- package/src/panels/data-explorer.ts +141 -102
- package/src/panels/data-grid.ts +183 -150
- package/src/panels/dnd.ts +75 -20
- package/src/panels/editors.ts +26 -19
- package/src/panels/elements-panel.ts +243 -186
- package/src/panels/empty-state.ts +26 -42
- package/src/panels/events-panel.ts +950 -729
- package/src/panels/formula-workspace.ts +434 -207
- package/src/panels/frontmatter-fields.ts +185 -153
- package/src/panels/frontmatter-panel.ts +411 -187
- package/src/panels/git-diff-open.ts +148 -0
- package/src/panels/git-panel.ts +679 -605
- package/src/panels/head-panel.ts +617 -435
- package/src/panels/i18n-panel.ts +148 -135
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +175 -147
- package/src/panels/layers-panel.ts +785 -671
- package/src/panels/left-panel.ts +166 -94
- package/src/panels/navigator-panels.ts +1 -1
- package/src/panels/pane-context.ts +529 -677
- package/src/panels/pane-grid.ts +265 -241
- package/src/panels/panel-registry.ts +15 -4
- package/src/panels/problems-panel.ts +181 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +223 -184
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +114 -661
- package/src/panels/settings-pane.ts +102 -86
- package/src/panels/signals-panel.ts +1318 -1172
- package/src/panels/statement-editor.ts +556 -428
- package/src/panels/style-panel.ts +1367 -630
- package/src/panels/style-utils.ts +36 -32
- package/src/panels/stylebook-doc.ts +30 -73
- package/src/panels/stylebook-layers-panel.ts +202 -109
- package/src/panels/stylebook-panel.ts +124 -88
- package/src/panels/tab-strip.ts +386 -288
- package/src/platforms/cloud.ts +106 -16
- package/src/platforms/devserver.ts +13 -0
- package/src/publish/deploy-checklist.ts +124 -78
- package/src/publish/publish-commands.ts +4 -12
- package/src/publish/publish-panel.ts +134 -328
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +538 -0
- package/src/services/ai-project-tools.ts +8 -2
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +112 -24
- package/src/services/ai-tools.ts +36 -212
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/document-assistant.ts +59 -8
- package/src/services/idle.ts +16 -14
- package/src/services/live-surfaces.ts +237 -0
- package/src/services/model-uri.ts +75 -0
- package/src/services/notify.ts +63 -6
- package/src/services/popover-report.ts +325 -0
- package/src/services/surface-registry.ts +56 -0
- package/src/services/tool-executor.ts +6 -0
- package/src/settings/contexts-section.ts +301 -299
- package/src/settings/contributed-section.ts +361 -222
- package/src/settings/css-vars-editor.ts +320 -325
- package/src/settings/defs-editor.ts +572 -535
- package/src/settings/dependencies-editor.ts +79 -107
- package/src/settings/extension-commands.ts +379 -0
- package/src/settings/extension-rows.ts +113 -0
- package/src/settings/extensions-section.ts +287 -0
- package/src/settings/general-settings.ts +130 -181
- package/src/settings/head-editor.ts +10 -305
- package/src/settings/locales-section.ts +146 -196
- package/src/settings/preferences-accounts.ts +1 -1
- package/src/settings/preferences-dialog.ts +350 -330
- package/src/settings/project-sections.ts +108 -181
- package/src/settings/schema-field-ui.ts +11 -399
- package/src/settings/section-registry.ts +8 -1
- package/src/settings/settings-document.ts +31 -29
- package/src/shell/tree.ts +42 -87
- package/src/shell.ts +48 -36
- package/src/studio.ts +104 -69
- package/src/style/token-ref.ts +0 -39
- package/src/surfaces/about.json +263 -0
- package/src/surfaces/about.ts +163 -0
- package/src/surfaces/add-repo.json +486 -0
- package/src/surfaces/add-repo.ts +236 -0
- package/src/surfaces/ai-chat.json +2185 -0
- package/src/surfaces/ai-chat.ts +549 -0
- package/src/surfaces/ai-credentials-form.json +332 -0
- package/src/surfaces/ai-credentials-form.ts +151 -0
- package/src/surfaces/ai-managed-connect.json +108 -0
- package/src/surfaces/ai-managed-connect.ts +123 -0
- package/src/surfaces/ai-model-picker.json +114 -0
- package/src/surfaces/ai-model-picker.ts +139 -0
- package/src/surfaces/block-action-bar.json +640 -0
- package/src/surfaces/block-action-bar.ts +368 -0
- package/src/surfaces/bottom-dock.json +154 -0
- package/src/surfaces/bottom-dock.ts +125 -0
- package/src/surfaces/canvas-stage.json +444 -0
- package/src/surfaces/canvas-stage.ts +253 -0
- package/src/surfaces/cf-account-picker.json +300 -0
- package/src/surfaces/cf-account-picker.ts +214 -0
- package/src/surfaces/commandbar.json +985 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +417 -391
- package/src/surfaces/convert-repeater.json +309 -0
- package/src/surfaces/convert-repeater.ts +276 -0
- package/src/surfaces/data-actions.json +157 -0
- package/src/surfaces/data-actions.ts +115 -0
- package/src/surfaces/dialog.json +289 -0
- package/src/surfaces/dialog.ts +343 -0
- package/src/surfaces/diff-toolbar.json +266 -0
- package/src/surfaces/diff-toolbar.ts +139 -0
- package/src/surfaces/doc-header.json +739 -0
- package/src/surfaces/doc-header.ts +223 -0
- package/src/surfaces/empty-state.json +152 -0
- package/src/surfaces/empty-state.ts +173 -0
- package/src/surfaces/entry-editor.json +281 -0
- package/src/surfaces/entry-editor.ts +191 -0
- package/src/surfaces/expression-editor.json +977 -0
- package/src/surfaces/expression-editor.ts +266 -0
- package/src/surfaces/files-panel.json +592 -0
- package/src/surfaces/files-panel.ts +301 -0
- package/src/surfaces/formula-palette.json +364 -0
- package/src/surfaces/formula-palette.ts +340 -0
- package/src/surfaces/git-panel.json +1822 -0
- package/src/surfaces/git-panel.ts +272 -0
- package/src/surfaces/github-auth.json +112 -0
- package/src/surfaces/github-auth.ts +139 -0
- package/src/surfaces/github-publish.json +206 -0
- package/src/surfaces/github-publish.ts +169 -0
- package/src/surfaces/grid-cell.json +218 -0
- package/src/surfaces/grid-cell.ts +120 -0
- package/src/surfaces/grid-open.json +147 -0
- package/src/surfaces/grid-open.ts +87 -0
- package/src/surfaces/grid-panel.json +706 -0
- package/src/surfaces/grid-panel.ts +206 -0
- package/src/surfaces/grid-replace.json +179 -0
- package/src/surfaces/grid-replace.ts +89 -0
- package/src/surfaces/grid-views.json +446 -0
- package/src/surfaces/grid-views.ts +172 -0
- package/src/surfaces/inspector-dock.json +187 -0
- package/src/surfaces/inspector-dock.ts +161 -0
- package/src/surfaces/jump-bar.json +243 -0
- package/src/surfaces/jump-bar.ts +129 -0
- package/src/surfaces/jxsuite-update.json +146 -0
- package/src/surfaces/jxsuite-update.ts +149 -0
- package/src/surfaces/library-pane.json +1509 -0
- package/src/surfaces/library-pane.ts +363 -0
- package/src/surfaces/logic-panel.json +1949 -0
- package/src/surfaces/logic-panel.ts +369 -0
- package/src/surfaces/logic-workspace.json +685 -0
- package/src/surfaces/logic-workspace.ts +238 -0
- package/src/surfaces/media-browser.json +303 -0
- package/src/surfaces/media-browser.ts +145 -0
- package/src/surfaces/media-field.json +163 -0
- package/src/surfaces/media-field.ts +116 -0
- package/src/surfaces/media-pane.json +513 -0
- package/src/surfaces/media-pane.ts +197 -0
- package/src/surfaces/menu.json +232 -0
- package/src/surfaces/menu.ts +375 -0
- package/src/surfaces/navigator-dock.json +113 -0
- package/src/surfaces/navigator-dock.ts +130 -0
- package/src/surfaces/new-project.json +1654 -0
- package/src/surfaces/new-project.ts +411 -0
- package/src/surfaces/palette.json +535 -0
- package/src/surfaces/pane-context.json +1497 -0
- package/src/surfaces/pane-context.ts +513 -0
- package/src/surfaces/pane-grid.json +188 -0
- package/src/surfaces/pane-grid.ts +250 -0
- package/src/surfaces/panel-activity.json +563 -0
- package/src/surfaces/panel-activity.ts +187 -0
- package/src/surfaces/panel-data.json +141 -0
- package/src/surfaces/panel-data.ts +156 -0
- package/src/surfaces/panel-deploy-checklist.json +283 -0
- package/src/surfaces/panel-deploy-checklist.ts +175 -0
- package/src/surfaces/panel-elements.json +367 -0
- package/src/surfaces/panel-elements.ts +175 -0
- package/src/surfaces/panel-i18n.json +569 -0
- package/src/surfaces/panel-i18n.ts +212 -0
- package/src/surfaces/panel-imports.json +780 -0
- package/src/surfaces/panel-imports.ts +209 -0
- package/src/surfaces/panel-outline.json +734 -0
- package/src/surfaces/panel-outline.ts +326 -0
- package/src/surfaces/panel-page.json +1017 -0
- package/src/surfaces/panel-page.ts +240 -0
- package/src/surfaces/panel-problems.json +497 -0
- package/src/surfaces/panel-problems.ts +157 -0
- package/src/surfaces/panel-signals.json +1973 -0
- package/src/surfaces/panel-signals.ts +436 -0
- package/src/surfaces/panel-stylebook-layers.json +317 -0
- package/src/surfaces/panel-stylebook-layers.ts +155 -0
- package/src/surfaces/preferences.json +850 -0
- package/src/surfaces/preferences.ts +332 -0
- package/src/surfaces/progress-modal.json +110 -0
- package/src/surfaces/progress-modal.ts +150 -0
- package/src/surfaces/properties-panel.json +1578 -0
- package/src/surfaces/properties-panel.ts +337 -0
- package/src/surfaces/publish.json +945 -0
- package/src/surfaces/publish.ts +392 -0
- package/src/surfaces/push-plan.json +110 -0
- package/src/surfaces/push-plan.ts +87 -0
- package/src/surfaces/rail.json +255 -0
- package/src/surfaces/rail.ts +206 -0
- package/src/surfaces/reference-field.json +191 -0
- package/src/surfaces/reference-field.ts +168 -0
- package/src/surfaces/schema-builder.json +1011 -0
- package/src/surfaces/schema-builder.ts +181 -0
- package/src/surfaces/schema-form.json +1013 -0
- package/src/surfaces/schema-form.ts +287 -0
- package/src/surfaces/secret-field.json +60 -0
- package/src/surfaces/secret-field.ts +146 -0
- package/src/surfaces/seo.json +932 -0
- package/src/surfaces/seo.ts +334 -0
- package/src/surfaces/settings-contexts.json +538 -0
- package/src/surfaces/settings-contexts.ts +196 -0
- package/src/surfaces/settings-contributed.json +489 -0
- package/src/surfaces/settings-contributed.ts +199 -0
- package/src/surfaces/settings-css-vars.json +820 -0
- package/src/surfaces/settings-css-vars.ts +199 -0
- package/src/surfaces/settings-defs.json +1363 -0
- package/src/surfaces/settings-defs.ts +232 -0
- package/src/surfaces/settings-deploy.json +108 -0
- package/src/surfaces/settings-deploy.ts +135 -0
- package/src/surfaces/settings-extensions.json +486 -0
- package/src/surfaces/settings-extensions.ts +201 -0
- package/src/surfaces/settings-head.json +779 -0
- package/src/surfaces/settings-head.ts +397 -0
- package/src/surfaces/settings-locales.json +420 -0
- package/src/surfaces/settings-locales.ts +137 -0
- package/src/surfaces/settings-overview.json +423 -0
- package/src/surfaces/settings-overview.ts +218 -0
- package/src/surfaces/settings-packages.json +549 -0
- package/src/surfaces/settings-packages.ts +158 -0
- package/src/surfaces/settings-pane.json +147 -0
- package/src/surfaces/settings-pane.ts +150 -0
- package/src/surfaces/settings-rawjson.json +104 -0
- package/src/surfaces/settings-rawjson.ts +107 -0
- package/src/surfaces/shell.json +99 -0
- package/src/surfaces/shell.ts +30 -0
- package/src/surfaces/slash-menu.json +180 -0
- package/src/surfaces/slash-menu.ts +272 -0
- package/src/surfaces/statements.json +607 -0
- package/src/surfaces/statements.ts +238 -0
- package/src/surfaces/statusbar.json +94 -0
- package/src/{panels → surfaces}/statusbar.ts +164 -90
- package/src/surfaces/style-panel.json +1643 -0
- package/src/surfaces/style-panel.ts +338 -0
- package/src/surfaces/stylebook-chrome.json +122 -0
- package/src/surfaces/stylebook-chrome.ts +122 -0
- package/src/surfaces/tab-strip.json +448 -0
- package/src/surfaces/tab-strip.ts +200 -0
- package/src/surfaces/target-line.json +419 -0
- package/src/surfaces/target-line.ts +349 -0
- package/src/surfaces/toasts.json +189 -0
- package/src/surfaces/welcome.json +571 -0
- package/src/surfaces/welcome.ts +338 -0
- package/src/tabs/project-config.ts +111 -21
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +22 -0
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +54 -36
- package/src/ui/ai-model-picker.ts +75 -47
- package/src/ui/cf-account-picker.ts +76 -141
- package/src/ui/color-selector.ts +80 -301
- package/src/ui/dynamic-slot.ts +43 -283
- package/src/ui/expression-editor.ts +797 -576
- package/src/ui/field-input.ts +8 -181
- package/src/ui/form-controls.ts +838 -366
- package/src/ui/formula-chips.ts +80 -85
- package/src/ui/kit.ts +33 -0
- package/src/ui/layers.ts +296 -593
- package/src/ui/media-picker.ts +203 -284
- package/src/ui/panel-resize.ts +251 -64
- package/src/ui/popover-surface.ts +153 -0
- package/src/ui/progress-modal.ts +22 -60
- package/src/ui/regions.ts +13 -7
- package/src/ui/schema-form.ts +906 -440
- package/src/ui/surface.ts +122 -0
- package/src/ui/unit-selector.ts +15 -131
- package/src/ui/value-source.ts +14 -0
- package/src/ui/virtual-window.ts +88 -9
- package/src/utils/canvas-media.ts +72 -0
- package/src/utils/edit-display.ts +7 -2
- package/src/utils/element-selectors.ts +69 -0
- package/src/utils/link-target.ts +2 -2
- package/src/utils/studio-utils.ts +0 -10
- package/src/view.ts +15 -0
- package/src/workspace/pane-derive.ts +36 -14
- package/src/workspace/workspace.ts +75 -6
- package/styles/canvas.css +72 -467
- package/styles/forced-colors.css +48 -82
- package/styles/forced-colors.json +41 -0
- package/styles/inspector.css +2 -1301
- package/styles/overlays.css +96 -2823
- package/styles/panels.css +6 -1423
- package/styles/shell-frame.css +272 -0
- package/styles/shell-frame.json +227 -0
- package/styles/shell.css +0 -1568
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-48xg86wj.js +0 -49
- package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
- package/dist/chunks/extension-sections-txv08xxg.js +0 -311
- package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
- package/dist/chunks/files-3kfkwhk4.js +0 -93
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-w16q81tf.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-532whr1y.js +0 -59
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
- package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
- package/dist/chunks/layers-q75tj2mf.js +0 -45
- package/dist/chunks/lit-html-j055mkh8.js +0 -22
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
- package/dist/chunks/notify-yjm79n4s.js +0 -30
- package/dist/chunks/parse-24d0gay3.js +0 -19
- package/dist/chunks/platform-ba1j1gbh.js +0 -16
- package/dist/chunks/publish-panel-v9st96ja.js +0 -29
- package/dist/chunks/quick-search-zccjp6gv.js +0 -66
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
- package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
- package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
- package/dist/chunks/studio-0a5qrh01.js +0 -3
- package/dist/chunks/studio-0bq6eh7v.js +0 -12
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1ngbejft.js +0 -181
- package/dist/chunks/studio-4b5z1x43.js +0 -424
- package/dist/chunks/studio-4n2b5gzb.js +0 -357
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5fx3g9jg.js +0 -4325
- package/dist/chunks/studio-5myknm0a.js +0 -1903
- package/dist/chunks/studio-7afd21nw.js +0 -67
- package/dist/chunks/studio-7nte2hj4.js +0 -613
- package/dist/chunks/studio-8jpzqk5s.js +0 -128
- package/dist/chunks/studio-8q517dfr.js +0 -24
- package/dist/chunks/studio-950k0dx6.js +0 -6939
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-bgxt93ga.js +0 -62
- package/dist/chunks/studio-cmb03bg5.js +0 -13890
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-ef49pnzx.js +0 -387
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ew0djmhg.js +0 -341
- package/dist/chunks/studio-gfgb8pe6.js +0 -1652
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-jc994dnr.js +0 -1066
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mtfnaqs9.js +0 -659
- package/dist/chunks/studio-n6j9t10q.js +0 -318
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-qcy05dp8.js +0 -1743
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-rdx8jcxy.js +0 -83
- package/dist/chunks/studio-rn9ta2mz.js +0 -111
- package/dist/chunks/studio-t7qb9db8.js +0 -665
- package/dist/chunks/studio-tmc5emrw.js +0 -8
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/studio-zqazsct2.js +0 -1823
- package/dist/chunks/workspace-fjx52ryv.js +0 -89
- package/src/panels/activity-bar.ts +0 -251
- package/src/panels/panel-scheduler.ts +0 -219
- package/src/panels/style-inputs.ts +0 -237
- package/src/panels/target-line.ts +0 -274
- package/src/panels/welcome-screen.ts +0 -346
- package/src/ui/button-group.ts +0 -102
- package/src/ui/choice-field.ts +0 -72
- package/src/ui/field-row.ts +0 -249
- package/src/ui/formula-palette.ts +0 -213
- package/src/ui/icons.ts +0 -52
- package/src/ui/jx-theme.ts +0 -130
- package/src/ui/spectrum.ts +0 -340
- package/src/ui/value-selector.ts +0 -174
- package/src/ui/widgets.ts +0 -172
- /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
- /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
- /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
- /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
* (`panels/problems-panel.ts`) and registered from here, like every other tab of this dock.
|
|
38
38
|
*/
|
|
39
39
|
|
|
40
|
-
import {
|
|
40
|
+
import { render as litRender, nothing } from "lit-html";
|
|
41
41
|
import { effect, effectScope } from "../reactivity";
|
|
42
42
|
import {
|
|
43
43
|
BOTTOM_TAB_IDS,
|
|
@@ -53,11 +53,12 @@ import { getPanel, isPanelVisible, listPanels, panelContext } from "./panel-regi
|
|
|
53
53
|
import { registerActivityPanel } from "./activity-panel";
|
|
54
54
|
import { registerProblemsPanel } from "./problems-panel";
|
|
55
55
|
import { logicTarget, registerLogicPanel, revealLogicPanel } from "./formula-workspace";
|
|
56
|
-
import {
|
|
56
|
+
import { emptyState } from "../surfaces/empty-state";
|
|
57
|
+
import { mountBottomDockSurface } from "../surfaces/bottom-dock";
|
|
58
|
+
import type { BottomDockHandle, BottomDockValues } from "../surfaces/bottom-dock";
|
|
57
59
|
import type { CommandContext } from "../commands/context";
|
|
58
60
|
import type { NavigatorPanelContext, NavigatorPanelDeps, PanelRecord } from "./panel-registry";
|
|
59
61
|
import type { EffectScope } from "@vue/reactivity";
|
|
60
|
-
import type { TemplateResult } from "lit-html";
|
|
61
62
|
|
|
62
63
|
/** The dock's host — a bare `<div id>` in index.html, like every other shell host. */
|
|
63
64
|
export const BOTTOM_DOCK_SELECTOR = "#bottom-dock";
|
|
@@ -152,54 +153,46 @@ export function bottomTabLabel(panel: PanelRecord, ctx: CommandContext): string
|
|
|
152
153
|
return badge === null || badge === 0 || badge === "" ? panel.title : `${panel.title} ${badge}`;
|
|
153
154
|
}
|
|
154
155
|
|
|
155
|
-
/**
|
|
156
|
-
|
|
157
|
-
|
|
156
|
+
/**
|
|
157
|
+
* What the strip says right now: one row per admitted tab, and which of them is showing.
|
|
158
|
+
*
|
|
159
|
+
* Exported so a test can read the projection without a host — the same reason the template it
|
|
160
|
+
* replaced was exported, and a stronger one: this is a plain object, so an assertion about a tab's
|
|
161
|
+
* label or the selected id is a comparison rather than a DOM walk.
|
|
162
|
+
*
|
|
163
|
+
* @param {CommandContext} [ctx]
|
|
164
|
+
* @returns {BottomDockValues}
|
|
165
|
+
*/
|
|
166
|
+
export function bottomDockValues(ctx: CommandContext = panelContext()): BottomDockValues {
|
|
158
167
|
const active = activeBottomPanel(ctx);
|
|
159
|
-
|
|
160
|
-
? active.
|
|
161
|
-
:
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
@change=${(e: Event & { target: { selected: string } }) => {
|
|
170
|
-
const { selected } = e.target;
|
|
171
|
-
if (selected && selected !== active?.id) {
|
|
172
|
-
setBottomTab(selected);
|
|
173
|
-
}
|
|
174
|
-
}}
|
|
175
|
-
>
|
|
176
|
-
${panels.map(
|
|
177
|
-
(panel) => html`<sp-tab value=${panel.id} label=${bottomTabLabel(panel, ctx)}></sp-tab>`,
|
|
178
|
-
)}
|
|
179
|
-
</sp-tabs>
|
|
180
|
-
<button
|
|
181
|
-
class="bd-close"
|
|
182
|
-
title="Close the Bottom dock"
|
|
183
|
-
aria-label="Close the Bottom dock"
|
|
184
|
-
@click=${() => {
|
|
185
|
-
setDockCollapsed("bottom", true);
|
|
186
|
-
}}
|
|
187
|
-
>
|
|
188
|
-
<span aria-hidden="true">×</span>
|
|
189
|
-
</button>
|
|
190
|
-
</div>
|
|
191
|
-
${
|
|
192
|
-
active
|
|
193
|
-
? html`<div class="bd-body" data-jx-region=${bottomPanelRegion(active.id)}>${body}</div>`
|
|
194
|
-
: html`<div class="bd-body">${body}</div>`
|
|
195
|
-
}
|
|
196
|
-
`;
|
|
168
|
+
return {
|
|
169
|
+
bodyRegion: active ? bottomPanelRegion(active.id) : "",
|
|
170
|
+
tab: active?.id ?? "",
|
|
171
|
+
tabId: active ? `bottom-dock-tab-${active.id}` : "",
|
|
172
|
+
tabs: visibleBottomPanels(ctx).map((panel) => ({
|
|
173
|
+
key: panel.id,
|
|
174
|
+
label: bottomTabLabel(panel, ctx),
|
|
175
|
+
tabId: `bottom-dock-tab-${panel.id}`,
|
|
176
|
+
})),
|
|
177
|
+
};
|
|
197
178
|
}
|
|
198
179
|
|
|
199
180
|
let _scope: EffectScope | null = null;
|
|
200
181
|
|
|
201
182
|
let _host: HTMLElement | null = null;
|
|
202
183
|
|
|
184
|
+
/** The mounted chrome document, live only while the dock is open. */
|
|
185
|
+
let _dock: BottomDockHandle | null = null;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* The `[part="dock-body"]` the document announced, or null while nothing is mounted.
|
|
189
|
+
*
|
|
190
|
+
* Held rather than re-queried: it is the one element every tab's `afterRender` is measured against,
|
|
191
|
+
* and a selector that returned a different node between the paint and the hook would hand a tab a
|
|
192
|
+
* body it had not been painted into.
|
|
193
|
+
*/
|
|
194
|
+
let _body: HTMLElement | null = null;
|
|
195
|
+
|
|
203
196
|
/**
|
|
204
197
|
* The Logic target the dock has already revealed itself for.
|
|
205
198
|
*
|
|
@@ -237,13 +230,79 @@ export function renderBottomDock(): void {
|
|
|
237
230
|
}
|
|
238
231
|
if (shell.docks.bottom.collapsed) {
|
|
239
232
|
_host.removeAttribute(REGION_ATTR);
|
|
240
|
-
|
|
233
|
+
/* The chrome is taken down rather than hidden, and `#bottom-dock:empty { display: none }` is
|
|
234
|
+
why: the shell's own sheet keeps a dock with nothing in it out of the grid, so a document
|
|
235
|
+
left mounted behind a `hidden` attribute would make that rule permanently unmatchable. Disposing also
|
|
236
|
+
makes the collapsed branch mean what it says to a tab — every one of them is handed the
|
|
237
|
+
emptied HOST, which is the fourth of the four ways Logic stops being on screen. */
|
|
238
|
+
_dock?.dispose();
|
|
239
|
+
_dock = null;
|
|
240
|
+
_body = null;
|
|
241
241
|
runAfterRender(_host);
|
|
242
242
|
return;
|
|
243
243
|
}
|
|
244
244
|
_host.setAttribute(REGION_ATTR, "dock.bottom");
|
|
245
|
-
|
|
246
|
-
|
|
245
|
+
if (!_dock) {
|
|
246
|
+
/* The mount is asynchronous (the kit has to be defined first), so the body is painted from the
|
|
247
|
+
announcement rather than from here — `onBody` fires while the host is still inside the
|
|
248
|
+
runtime's fragment, one append before the strip is in the page. */
|
|
249
|
+
_dock = mountBottomDockSurface(
|
|
250
|
+
_host,
|
|
251
|
+
bottomDockValues(),
|
|
252
|
+
{
|
|
253
|
+
closeDock: () => {
|
|
254
|
+
setDockCollapsed("bottom", true);
|
|
255
|
+
},
|
|
256
|
+
selectTab: (id) => {
|
|
257
|
+
if (id !== "" && id !== activeBottomPanel()?.id) {
|
|
258
|
+
setBottomTab(id);
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
onBody: (host) => {
|
|
264
|
+
_body = host;
|
|
265
|
+
/* A MICROTASK, not this call. `onNodeCreated` fires the moment the element is CONSTRUCTED
|
|
266
|
+
— the runtime applies its attributes on the next line — so a tab's `afterRender` run
|
|
267
|
+
from here would be handed a body with no `part` and no `data-jx-region` on it yet, and
|
|
268
|
+
every tab that identifies its own container by attribute would decide it is off screen.
|
|
269
|
+
By the time a microtask runs, the synchronous render that created this node has
|
|
270
|
+
finished and the element is fully written. */
|
|
271
|
+
queueMicrotask(() => {
|
|
272
|
+
if (_body === host) {
|
|
273
|
+
paintBody();
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
_dock.update(bottomDockValues());
|
|
282
|
+
paintBody();
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Draw the selected tab into the one body the document leaves empty, and tell every tab about it.
|
|
287
|
+
*
|
|
288
|
+
* The record's `render` returns a lit template — that is what a `PanelRecord` is — so this is the
|
|
289
|
+
* one place lit still paints inside the dock, into an island the document owns and never touches
|
|
290
|
+
* (studio-ui-guidelines.md §9.4). With no visible tab at all there is still a body: the empty state
|
|
291
|
+
* is what a dock whose every tab is gated off says, and a blank box is not.
|
|
292
|
+
*/
|
|
293
|
+
function paintBody(): void {
|
|
294
|
+
const host = _body;
|
|
295
|
+
if (!host) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
const active = activeBottomPanel();
|
|
299
|
+
litRender(
|
|
300
|
+
active
|
|
301
|
+
? active.render(bottomContext())
|
|
302
|
+
: emptyState(host, { message: "Nothing to show here yet." }),
|
|
303
|
+
host,
|
|
304
|
+
);
|
|
305
|
+
runAfterRender(host);
|
|
247
306
|
}
|
|
248
307
|
|
|
249
308
|
/**
|
|
@@ -328,9 +387,15 @@ export function unmountBottomDock(): void {
|
|
|
328
387
|
_scope?.stop();
|
|
329
388
|
_scope = null;
|
|
330
389
|
_revealedLogicKey = null;
|
|
390
|
+
_dock?.dispose();
|
|
391
|
+
_dock = null;
|
|
392
|
+
_body = null;
|
|
331
393
|
if (_host) {
|
|
332
394
|
_host.removeAttribute(REGION_ATTR);
|
|
395
|
+
/* The document's dispose removed its own root; this clears anything a caller left beside it,
|
|
396
|
+
so the host is `:empty` again and the shell's sheet takes the dock out of the grid. */
|
|
333
397
|
litRender(nothing, _host);
|
|
398
|
+
_host.textContent = "";
|
|
334
399
|
runAfterRender(_host);
|
|
335
400
|
_host = null;
|
|
336
401
|
}
|
package/src/panels/chat-panel.ts
CHANGED
|
@@ -17,15 +17,17 @@
|
|
|
17
17
|
* and never tears down on tab switches — the assistant's module state and DOM (composer draft,
|
|
18
18
|
* scroll position) persist.
|
|
19
19
|
*
|
|
20
|
-
*
|
|
21
|
-
* (
|
|
22
|
-
*
|
|
23
|
-
*
|
|
20
|
+
* **This module is the SEAM, and it has no markup of its own.** The assistant is a Jx document
|
|
21
|
+
* (`surfaces/ai-chat.json`), and a document CLEARS the host it is given — so it needs a container
|
|
22
|
+
* nobody else writes into. That container is the one thing created here; `.ai-panel-host` is its
|
|
23
|
+
* layout rule in `styles/inspector.css`, which is why the class stays on a node the surface does
|
|
24
|
+
* not own. Everything below it is the surface's, and `ai-panel.ts` drives it from one effect —
|
|
25
|
+
* there is no scheduler, and there is no frame loop, because a document's bindings re-run per
|
|
26
|
+
* property and a streaming token never reaches the composer.
|
|
24
27
|
*
|
|
25
28
|
* @license MIT
|
|
26
29
|
*/
|
|
27
30
|
|
|
28
|
-
import { render as litRender } from "lit-html";
|
|
29
31
|
import { effect, effectScope } from "../reactivity";
|
|
30
32
|
import { workspace } from "../workspace/workspace";
|
|
31
33
|
import { consumePendingAgentPrompt, hasPendingAgentPrompt } from "../services/agent-seed";
|
|
@@ -33,7 +35,7 @@ import { REGION_ATTR } from "../ui/regions";
|
|
|
33
35
|
import {
|
|
34
36
|
bindAiPanelHost,
|
|
35
37
|
mountAiPanel,
|
|
36
|
-
|
|
38
|
+
renderAiPanel,
|
|
37
39
|
revealAssistant,
|
|
38
40
|
seedAssistantPrompt,
|
|
39
41
|
} from "./ai-panel";
|
|
@@ -49,9 +51,8 @@ let _scope: EffectScope | null = null;
|
|
|
49
51
|
|
|
50
52
|
/**
|
|
51
53
|
* Mount the assistant into the host the Inspector hands it. Idempotent per host: the persistent
|
|
52
|
-
* `.ai-panel-host` container is created once and
|
|
53
|
-
*
|
|
54
|
-
* inspector) is a no-op.
|
|
54
|
+
* `.ai-panel-host` container is created once and handed to `ai-panel.ts` as the surface's mount
|
|
55
|
+
* point. A missing host (a reduced test fixture with no inspector) is a no-op.
|
|
55
56
|
*
|
|
56
57
|
* @param {HTMLElement | null} host
|
|
57
58
|
*/
|
|
@@ -67,10 +68,7 @@ export function mount(host: HTMLElement | null) {
|
|
|
67
68
|
host.append(_container);
|
|
68
69
|
|
|
69
70
|
mountAiPanel();
|
|
70
|
-
// The AI panel owns a focus-guard-free rAF render loop into this container so
|
|
71
|
-
// Streaming repaints while the composer is focused (see ai-panel.ts).
|
|
72
71
|
bindAiPanelHost(_container);
|
|
73
|
-
render();
|
|
74
72
|
|
|
75
73
|
_scope?.stop();
|
|
76
74
|
_scope = effectScope();
|
|
@@ -100,6 +98,8 @@ export function mount(host: HTMLElement | null) {
|
|
|
100
98
|
export function unmount() {
|
|
101
99
|
_scope?.stop();
|
|
102
100
|
_scope = null;
|
|
101
|
+
// `null` unbinds the surface: the document is disposed and the chat-state watcher stopped.
|
|
102
|
+
bindAiPanelHost(null);
|
|
103
103
|
if (_host) {
|
|
104
104
|
_host.textContent = "";
|
|
105
105
|
}
|
|
@@ -107,9 +107,14 @@ export function unmount() {
|
|
|
107
107
|
_container = null;
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
/**
|
|
110
|
+
/**
|
|
111
|
+
* Recompute the assistant's projection now (no-op before mount).
|
|
112
|
+
*
|
|
113
|
+
* Kept because `store.ts`'s `registerRenderer("chatPanel", …)` compat registry still names it. The
|
|
114
|
+
* surface follows the projection, so this is one function call rather than a repaint.
|
|
115
|
+
*/
|
|
111
116
|
export function render() {
|
|
112
117
|
if (_container) {
|
|
113
|
-
|
|
118
|
+
renderAiPanel();
|
|
114
119
|
}
|
|
115
120
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
// ─── Data Explorer ──────────────────────────────────────────────────────────
|
|
3
3
|
|
|
4
|
-
import {
|
|
5
|
-
import type { TemplateResult } from "lit-html";
|
|
4
|
+
import { nothing } from "lit-html";
|
|
6
5
|
import { activeTab } from "../workspace/workspace";
|
|
7
|
-
import { renderOnly } from "../store";
|
|
8
6
|
import { booleanArg, stringArg, stringProperty } from "../commands/command-args";
|
|
7
|
+
import { renderDataTreeSurface } from "../surfaces/panel-data";
|
|
9
8
|
import { registerPanel } from "./panel-registry";
|
|
9
|
+
import type { PanelBody } from "./panel-registry";
|
|
10
|
+
import type { DataTreeRow } from "../surfaces/panel-data";
|
|
10
11
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
11
12
|
|
|
12
13
|
/**
|
|
@@ -62,32 +63,48 @@ export function raiseDataLimit(path: string, kind: "items" | "keys" | "depth"):
|
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
/**
|
|
65
|
-
* One truncation marker: a button that shows more of what is
|
|
66
|
+
* One truncation marker: a row the document draws as a button that shows more of what is in hand.
|
|
66
67
|
*
|
|
67
|
-
* It
|
|
68
|
-
*
|
|
69
|
-
*
|
|
68
|
+
* It carries the subtree and the limit it raises rather than a callback. The press arrives back
|
|
69
|
+
* here through the surface's one action, so a pure formatter stays pure and there is a single
|
|
70
|
+
* repaint to reason about instead of one threaded through every caller.
|
|
70
71
|
*/
|
|
71
|
-
function
|
|
72
|
+
function moreRow(
|
|
72
73
|
path: string,
|
|
73
|
-
|
|
74
|
+
limit: "items" | "keys" | "depth",
|
|
74
75
|
indent: string,
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
) {
|
|
78
|
-
return
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
76
|
+
text: string,
|
|
77
|
+
title = `Show ${MORE_STEP} more`,
|
|
78
|
+
): DataTreeRow {
|
|
79
|
+
return {
|
|
80
|
+
indent,
|
|
81
|
+
key: `${path}\u0000${limit}`,
|
|
82
|
+
kind: "more",
|
|
83
|
+
label: "",
|
|
84
|
+
limit,
|
|
85
|
+
path,
|
|
86
|
+
text,
|
|
87
|
+
title,
|
|
88
|
+
tone: "marker",
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** A value as the tree prints it, capped at `max` characters. `undefined` prints as nothing. */
|
|
93
|
+
function valueText(value: unknown, max: number): string {
|
|
94
|
+
if (typeof value === "string" && value.length > max) {
|
|
95
|
+
return `"${value.slice(0, max)}…"`;
|
|
96
|
+
}
|
|
97
|
+
return JSON.stringify(value) ?? "";
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** Which colour a value takes. `null` and a summary label are the two the tree actually paints. */
|
|
101
|
+
function toneOf(value: unknown): string {
|
|
102
|
+
return value === null ? "null" : typeof value;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** `Array(3)` or `{2}` — what a value you can open says while it is closed. */
|
|
106
|
+
function summaryLabel(value: object): string {
|
|
107
|
+
return Array.isArray(value) ? `Array(${value.length})` : `{${Object.keys(value).length}}`;
|
|
91
108
|
}
|
|
92
109
|
|
|
93
110
|
/** Unwrap a Vue ref (has .value and .__v_isRef) to get the underlying value. */
|
|
@@ -121,98 +138,110 @@ export function dataTypeLabel(value: unknown) {
|
|
|
121
138
|
panel listing every state entry with its badge and how it is defined: the same names twice, and
|
|
122
139
|
you read one to understand the other. Plan §11.2 asks for "definitions + live values in one row",
|
|
123
140
|
so the definition row now carries the resolved type and expands to the value tree, and what is
|
|
124
|
-
left here is the tree
|
|
125
|
-
|
|
141
|
+
left here is the tree WALK, the type label and the row-expansion record the merged rows read. */
|
|
142
|
+
|
|
126
143
|
/**
|
|
127
|
-
*
|
|
144
|
+
* Flatten a JSON value into the lines the Data surface draws (`surfaces/panel-data.{json,ts}`).
|
|
128
145
|
*
|
|
129
|
-
*
|
|
146
|
+
* The tree used to BE a lit template, one recursive call per level. It is a document now, and a
|
|
147
|
+
* document's one repeater walks a LIST — so the recursion moved here and comes out as rows that
|
|
148
|
+
* each carry their own indent. Nothing else changed: the caps are the same caps, the text is
|
|
149
|
+
* truncated at the same lengths, and a capped list still ends in a marker.
|
|
150
|
+
*
|
|
151
|
+
* @param {unknown} value The resolved value to read.
|
|
152
|
+
* @param {number} depth How deep this call already is; the indent is derived from it.
|
|
153
|
+
* @param {number} [maxDepth] The default depth cap, before whatever the reader has raised.
|
|
154
|
+
* @param {string} path This subtree's path, which is what a raised limit is remembered against.
|
|
155
|
+
* @returns {DataTreeRow[]}
|
|
130
156
|
*/
|
|
131
|
-
export function
|
|
157
|
+
export function dataTreeRows(
|
|
132
158
|
value: unknown,
|
|
133
159
|
depth: number,
|
|
134
160
|
maxDepth = 5,
|
|
135
161
|
path = "",
|
|
136
|
-
):
|
|
162
|
+
): DataTreeRow[] {
|
|
137
163
|
const indent = `${(depth + 1) * 12}px`;
|
|
164
|
+
const row = (label: string, text: string, tone: string, key: string): DataTreeRow => ({
|
|
165
|
+
indent,
|
|
166
|
+
key,
|
|
167
|
+
kind: "row",
|
|
168
|
+
label,
|
|
169
|
+
limit: "",
|
|
170
|
+
path: "",
|
|
171
|
+
text,
|
|
172
|
+
title: "",
|
|
173
|
+
tone,
|
|
174
|
+
});
|
|
138
175
|
|
|
139
176
|
if (depth > capFor(path, "depth", maxDepth)) {
|
|
140
|
-
return
|
|
177
|
+
return [moreRow(path, "depth", indent, "…", `Show ${MORE_STEP} more levels`)];
|
|
141
178
|
}
|
|
142
|
-
|
|
179
|
+
/* The one line a value with nothing under it renders as, keyed by the subtree's own path. That
|
|
180
|
+
is unique by construction: a descent only ever happens into an object or an array, so this
|
|
181
|
+
row exists only at the top of a tree, where it has no siblings to collide with. */
|
|
143
182
|
if (value === null || value === undefined) {
|
|
144
|
-
return
|
|
145
|
-
${String(value)}
|
|
146
|
-
</div>`;
|
|
183
|
+
return [row("", String(value), "null", path)];
|
|
147
184
|
}
|
|
148
|
-
|
|
149
185
|
if (typeof value !== "object") {
|
|
150
|
-
|
|
151
|
-
typeof value === "string" && value.length > 200
|
|
152
|
-
? `"${value.slice(0, 200)}\u2026"`
|
|
153
|
-
: JSON.stringify(value);
|
|
154
|
-
return html`<div class="data-leaf data-${typeof value}" style="padding-left:${indent}">
|
|
155
|
-
${text}
|
|
156
|
-
</div>`;
|
|
186
|
+
return [row("", valueText(value, 200), toneOf(value), path)];
|
|
157
187
|
}
|
|
158
188
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
? `"${item.slice(0, 80)}\u2026"`
|
|
166
|
-
: JSON.stringify(item);
|
|
167
|
-
return html`<div class="data-branch" style="padding-left:${indent}">
|
|
168
|
-
<span class="data-key">[${i}] </span
|
|
169
|
-
><span class="data-value data-${item === null ? "null" : typeof item}">${valText}</span>
|
|
170
|
-
</div>`;
|
|
171
|
-
}
|
|
172
|
-
const label = Array.isArray(item)
|
|
173
|
-
? `Array(${item.length})`
|
|
174
|
-
: `{${Object.keys(item as object).length}}`;
|
|
175
|
-
return html`
|
|
176
|
-
<div class="data-branch" style="padding-left:${indent}">
|
|
177
|
-
<span class="data-key">[${i}] </span
|
|
178
|
-
><span class="data-value data-object-label">${label}</span>
|
|
179
|
-
</div>
|
|
180
|
-
${renderDataTreeTemplate(item, depth + 1, maxDepth, `${path}/${i}`)}
|
|
181
|
-
`;
|
|
182
|
-
});
|
|
183
|
-
return html`${items}${
|
|
184
|
-
value.length > cap
|
|
185
|
-
? moreTemplate(path, "items", indent, `… ${value.length - cap} more`)
|
|
186
|
-
: nothing
|
|
187
|
-
}`;
|
|
188
|
-
}
|
|
189
|
+
const array = Array.isArray(value);
|
|
190
|
+
const entries: [string, string, unknown][] = array
|
|
191
|
+
? value.map((item, i) => [`${i}`, `[${i}] `, item])
|
|
192
|
+
: Object.keys(value).map((key) => [key, `${key}: `, (value as Record<string, unknown>)[key]]);
|
|
193
|
+
const limit = array ? "items" : "keys";
|
|
194
|
+
const cap = capFor(path, limit, array ? 20 : 30);
|
|
189
195
|
|
|
190
|
-
|
|
191
|
-
const
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
if (v === null || v === undefined || typeof v !== "object") {
|
|
197
|
-
const valText =
|
|
198
|
-
typeof v === "string" && v.length > 80 ? `"${v.slice(0, 80)}\u2026"` : JSON.stringify(v);
|
|
199
|
-
return html`<div class="data-branch" style="padding-left:${indent}">
|
|
200
|
-
<span class="data-key">${key}: </span
|
|
201
|
-
><span class="data-value data-${v === null ? "null" : typeof v}">${valText}</span>
|
|
202
|
-
</div>`;
|
|
196
|
+
const rows: DataTreeRow[] = [];
|
|
197
|
+
for (const [segment, label, item] of entries.slice(0, cap)) {
|
|
198
|
+
const childPath = `${path}/${segment}`;
|
|
199
|
+
if (item === null || item === undefined || typeof item !== "object") {
|
|
200
|
+
rows.push(row(label, valueText(item, 80), toneOf(item), childPath));
|
|
201
|
+
continue;
|
|
203
202
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
203
|
+
rows.push(
|
|
204
|
+
row(label, summaryLabel(item), "object", childPath),
|
|
205
|
+
...dataTreeRows(item, depth + 1, maxDepth, childPath),
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
if (entries.length > cap) {
|
|
209
|
+
rows.push(moreRow(path, limit, indent, `… ${entries.length - cap} more`));
|
|
210
|
+
}
|
|
211
|
+
return rows;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Draw one value tree into the host that was made for it, or bring the one already there up to
|
|
216
|
+
* date.
|
|
217
|
+
*
|
|
218
|
+
* Idempotent, because it runs on EVERY repaint: a host that already holds its document is assigned
|
|
219
|
+
* to rather than remounted, which is what keeps the reader's place inside a long tree. Taking a
|
|
220
|
+
* CLOSED tree down is the panel's job rather than this one's — a row the reader collapsed never
|
|
221
|
+
* reaches here again — so `panels/signals-panel.ts` calls `disposeDetachedDataTrees()` once per
|
|
222
|
+
* repaint instead of this sweeping per host.
|
|
223
|
+
*
|
|
224
|
+
* @param {HTMLElement} host The node the tree is drawn into.
|
|
225
|
+
* @param {unknown} value What the canvas resolved this entry to.
|
|
226
|
+
* @param {string} path The subtree's path, which is what a raised limit is remembered against.
|
|
227
|
+
* @param {() => void} rerender Repaint the panel, so that a raised limit is drawn.
|
|
228
|
+
* @param {number} [maxDepth] The default depth cap, before whatever the reader has raised.
|
|
229
|
+
*/
|
|
230
|
+
export function paintDataTree(
|
|
231
|
+
host: HTMLElement,
|
|
232
|
+
value: unknown,
|
|
233
|
+
path: string,
|
|
234
|
+
rerender: () => void,
|
|
235
|
+
maxDepth = 5,
|
|
236
|
+
): void {
|
|
237
|
+
renderDataTreeSurface(host, dataTreeRows(value, 0, maxDepth, path), {
|
|
238
|
+
showMore: (subtree, limit) => {
|
|
239
|
+
if (limit === "items" || limit === "keys" || limit === "depth") {
|
|
240
|
+
raiseDataLimit(subtree, limit);
|
|
241
|
+
}
|
|
242
|
+
rerender();
|
|
243
|
+
},
|
|
212
244
|
});
|
|
213
|
-
return html`${items}${
|
|
214
|
-
keys.length > cap ? moreTemplate(path, "keys", indent, `… ${keys.length - cap} more`) : nothing
|
|
215
|
-
}`;
|
|
216
245
|
}
|
|
217
246
|
|
|
218
247
|
// ─── Commands ─────────────────────────────────────────────────────────────────
|
|
@@ -349,6 +378,14 @@ export function registerDataExplorerCommands(
|
|
|
349
378
|
*
|
|
350
379
|
* Defining and watching are the same task interrupted: you add an entry, then look at what it
|
|
351
380
|
* resolved to. Two panels made that two panels.
|
|
381
|
+
*
|
|
382
|
+
* **Both halves are documents now** — `surfaces/panel-signals.{json,ts}` for the entry list and its
|
|
383
|
+
* editors, `surfaces/panel-data.{json,ts}` for the value tree under an open row. So lit draws
|
|
384
|
+
* nothing at all here: `render` returns `nothing` and `afterRender` mounts against the painted DOM,
|
|
385
|
+
* which is the seam `panels/git-panel.ts` uses for the same reason. The mount comes through `deps`
|
|
386
|
+
* rather than an import — this module owns the expansion store that one reads, so importing it back
|
|
387
|
+
* would close a cycle — and it is idempotent, so running on every repaint is what keeps the
|
|
388
|
+
* projection current.
|
|
352
389
|
*/
|
|
353
390
|
export function registerDataPanel(): void {
|
|
354
391
|
registerPanel({
|
|
@@ -356,14 +393,16 @@ export function registerDataPanel(): void {
|
|
|
356
393
|
title: "Data",
|
|
357
394
|
level: "document",
|
|
358
395
|
dock: "navigator",
|
|
359
|
-
icon: "
|
|
396
|
+
icon: "database",
|
|
360
397
|
requiresDocument: "Open a page to give it data — values it can read, compute or fetch.",
|
|
361
|
-
render: (
|
|
398
|
+
render: (): PanelBody => nothing,
|
|
399
|
+
afterRender: (ctx, host) => {
|
|
362
400
|
// `ctx.doc!` — `requiresDocument` means the registry renders the empty state instead of
|
|
363
401
|
// Calling this, the same assertion `head-panel.ts` makes for the same reason.
|
|
364
|
-
ctx.deps.
|
|
402
|
+
ctx.deps.mountSignalsPanel(host, ctx.doc!, {
|
|
365
403
|
refreshData: ctx.deps.refreshData,
|
|
366
404
|
renderLeftPanel: ctx.rerender,
|
|
367
|
-
})
|
|
405
|
+
});
|
|
406
|
+
},
|
|
368
407
|
});
|
|
369
408
|
}
|