@jxsuite/studio 6.1.0 → 6.1.2
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/dist/chunks/2020-f2gkpy8d.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-4912g339.js +4 -0
- package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
- package/dist/chunks/cf-settings-br6105tr.js +4 -0
- package/dist/chunks/color-28ksk2qm.js +4 -0
- package/dist/chunks/color-area-0fj8a4ga.js +4 -0
- package/dist/chunks/color-field-xch8kx2g.js +4 -0
- package/dist/chunks/color-slider-jxd8v350.js +4 -0
- package/dist/chunks/combobox-p0efwjke.js +4 -0
- package/dist/chunks/components-db68vsn7.js +4 -0
- package/dist/chunks/content-source-1449qesq.js +4 -0
- package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-x9jn86a7.js +4 -0
- package/dist/chunks/entry-commands-may24cpt.js +4 -0
- package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
- package/dist/chunks/file-ops-x9v54pcj.js +4 -0
- package/dist/chunks/files-j3knqf0s.js +4 -0
- package/dist/chunks/format-host-tyre2trb.js +4 -0
- package/dist/chunks/fs-events-64ma9htc.js +4 -0
- package/dist/chunks/git-panel-84ps5dex.js +4 -0
- package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
- package/dist/chunks/icons-pnfz478q.js +4 -0
- package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
- package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
- package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
- package/dist/chunks/iframe-entry-zap785cw.js +5 -0
- package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
- package/dist/chunks/index-b8xw3vy9.js +4 -0
- package/dist/chunks/{index-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
- package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
- package/dist/chunks/layers-h4xp1pss.js +4 -0
- package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
- package/dist/chunks/listbox-e74qjyq6.js +4 -0
- package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
- package/dist/chunks/media-picker-2cweexc5.js +4 -0
- package/dist/chunks/menu-n6yzswmy.js +4 -0
- package/dist/chunks/menu-ynw13y0s.js +4 -0
- package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
- package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
- package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
- package/dist/chunks/notify-cj5zbrs2.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-b7ddhr8m.js +4 -0
- package/dist/chunks/platform-3dfws9js.js +4 -0
- package/dist/chunks/popover-jt2gxmzs.js +4 -0
- package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
- package/dist/chunks/quick-search-0dajrwqg.js +4 -0
- package/dist/chunks/references-49qgt404.js +4 -0
- package/dist/chunks/right-panel-jm1bwe53.js +4 -0
- package/dist/chunks/section-registry-6kwc4fky.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/split-n2gfpm5m.js +4 -0
- package/dist/chunks/{studio-5g0ag7c0.js → studio-0q988f9w.js} +3 -3
- package/dist/chunks/studio-0rt52vpq.js +5 -0
- package/dist/chunks/studio-18vgbhs5.js +5 -0
- package/dist/chunks/{studio-pxg4ap1e.js → studio-1fxkaaea.js} +4 -4
- package/dist/chunks/studio-24mccdrj.js +5 -0
- package/dist/chunks/studio-2eh507zk.js +9 -0
- package/dist/chunks/studio-2hcbccfv.js +5 -0
- package/dist/chunks/studio-2j1cb95x.js +5 -0
- package/dist/chunks/studio-2jbs3rxv.js +5 -0
- package/dist/chunks/{studio-qbj760tx.js → studio-485046te.js} +7 -7
- package/dist/chunks/studio-4h8k4dw9.js +5 -0
- package/dist/chunks/studio-5f6n18kx.js +5 -0
- package/dist/chunks/studio-5gthpky6.js +5 -0
- package/dist/chunks/studio-5ve6bbep.js +5 -0
- package/dist/chunks/studio-6ep3js6b.js +9 -0
- package/dist/chunks/studio-6wkmf3wz.js +9 -0
- package/dist/chunks/studio-841rf3cg.js +5 -0
- package/dist/chunks/studio-8gmwgheg.js +5 -0
- package/dist/chunks/studio-8qm0ep50.js +5 -0
- package/dist/chunks/{studio-anyrgzvb.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-v2bvmbjj.js → studio-a3g98wjr.js} +4 -4
- package/dist/chunks/studio-a3shpz9y.js +5 -0
- package/dist/chunks/studio-amsbaaar.js +6 -0
- package/dist/chunks/studio-at5spjbc.js +7 -0
- package/dist/chunks/studio-b2xv945e.js +5 -0
- package/dist/chunks/studio-bn5nkafw.js +5 -0
- package/dist/chunks/studio-bw6q5xjf.js +9 -0
- package/dist/chunks/studio-c7q0t9x1.js +5 -0
- package/dist/chunks/studio-camnhc96.js +6 -0
- package/dist/chunks/studio-cffqvnzd.js +5 -0
- package/dist/chunks/studio-d81xfh1g.js +5 -0
- package/dist/chunks/studio-dgz8d0c1.js +5 -0
- package/dist/chunks/studio-efvfrsf8.js +5 -0
- package/dist/chunks/studio-er30bpcx.js +5 -0
- package/dist/chunks/studio-ezscgr64.js +5 -0
- package/dist/chunks/studio-ffrrncvz.js +5 -0
- package/dist/chunks/studio-fpphgn8y.js +10 -0
- package/dist/chunks/studio-j1kvhdjk.js +4 -0
- package/dist/chunks/{studio-txjjzrsm.js → studio-j430n16g.js} +5 -5
- package/dist/chunks/studio-jjkg84nj.js +5 -0
- package/dist/chunks/studio-m0q32ars.js +4 -0
- package/dist/chunks/studio-m6bdst11.js +5 -0
- package/dist/chunks/studio-nv2cptd4.js +64 -0
- package/dist/chunks/studio-nwfrc98n.js +5 -0
- package/dist/chunks/studio-p1wgvp7r.js +5 -0
- package/dist/chunks/studio-pag2wncm.js +5 -0
- package/dist/chunks/studio-qvanvzfd.js +5 -0
- package/dist/chunks/studio-qwa64kt7.js +5 -0
- package/dist/chunks/studio-rk1zc4x3.js +928 -0
- package/dist/chunks/studio-se2r3ptc.js +5 -0
- package/dist/chunks/studio-sg2a0dh0.js +5 -0
- package/dist/chunks/studio-tjzjhe68.js +5 -0
- package/dist/chunks/{studio-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-cpxkgjrj.js → studio-v0jzqdjm.js} +4 -4
- package/dist/chunks/studio-v2w7q8r1.js +7 -0
- package/dist/chunks/studio-v5vjq1h0.js +4 -0
- package/dist/chunks/studio-v8aga3vp.js +14 -0
- package/dist/chunks/studio-vfcdrfmv.js +5 -0
- package/dist/chunks/studio-vmfkgdjf.js +5 -0
- package/dist/chunks/studio-wt1816jj.js +5 -0
- package/dist/chunks/studio-wz73q5kq.js +4 -0
- package/dist/chunks/studio-y04qtxvp.js +7 -0
- package/dist/chunks/studio-y21g8zzg.js +5 -0
- package/dist/chunks/studio-y64hrt8p.js +12 -0
- package/dist/chunks/studio-ynn90f58.js +16 -0
- package/dist/chunks/studio-yxz682sx.js +5 -0
- package/dist/chunks/studio-zp7snvkq.js +5 -0
- package/dist/chunks/studio-zq4z6tm6.js +5 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-c9fn075p.js +4 -0
- package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
- package/dist/chunks/tree-mdq3v5cw.js +4 -0
- package/dist/chunks/tsMode-sf49ee9x.js +14 -0
- package/dist/chunks/workspace-jtfahpee.js +4 -0
- package/dist/chunks/ws-client-nze0k6mv.js +4 -0
- package/dist/iframe-entry.js +16 -16
- package/dist/manifest.json +63 -63
- package/dist/studio.js +98 -98
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +11 -11
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/library-layouts.ts +8 -5
- package/src/browse/library-model.ts +18 -6
- package/src/browse/library-pane.ts +37 -21
- package/src/browse/library-preview.ts +14 -9
- package/src/browse/library-source.ts +1 -1
- package/src/canvas/asset-refs.ts +24 -9
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +44 -53
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +66 -42
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +163 -64
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +13 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +80 -63
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +203 -118
- package/src/canvas/iframe-inline-edit.ts +69 -32
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +37 -26
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +18 -15
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +15 -16
- package/src/canvas/iframe-render.ts +41 -36
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +6 -2
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +2 -1
- package/src/canvas/surface-registry.ts +21 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/budget.ts +3 -3
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +22 -20
- package/src/commands/defaults.ts +4 -1
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +10 -8
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +12 -10
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +5 -4
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +3 -2
- package/src/content/entry-editor.ts +29 -17
- package/src/content/entry-fields.ts +12 -7
- package/src/content/entry-model.ts +21 -12
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +11 -5
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +21 -22
- package/src/editor/inline-edit-apply.ts +35 -17
- package/src/editor/inline-edit.ts +66 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +87 -47
- package/src/editor/slash-menu.ts +1 -6
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +15 -10
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +77 -36
- package/src/files/files.ts +90 -95
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +6 -1
- package/src/files/serialize-document.ts +2 -2
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +76 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +19 -9
- package/src/github/github-publish.ts +24 -20
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +20 -22
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -6
- package/src/grid/grid-panel.ts +11 -4
- package/src/grid/grid-source.ts +8 -8
- package/src/grid/grid-view.ts +14 -17
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +25 -24
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +55 -34
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +1 -2
- package/src/media/media-pane.ts +4 -1
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +17 -9
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +46 -35
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +31 -24
- package/src/panels/data-explorer.ts +62 -25
- package/src/panels/data-grid.ts +14 -11
- package/src/panels/dnd.ts +108 -118
- package/src/panels/editors.ts +55 -22
- package/src/panels/elements-panel.ts +10 -3
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +76 -51
- package/src/panels/frontmatter-fields.ts +24 -19
- package/src/panels/frontmatter-panel.ts +44 -34
- package/src/panels/git-diff-open.ts +4 -4
- package/src/panels/git-panel.ts +49 -61
- package/src/panels/head-panel.ts +131 -111
- package/src/panels/i18n-panel.ts +10 -3
- package/src/panels/imports-panel.ts +23 -47
- package/src/panels/jump-bar.ts +48 -29
- package/src/panels/layers-panel.ts +97 -74
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/pane-context.ts +31 -22
- package/src/panels/pane-grid.ts +49 -20
- package/src/panels/panel-registry.ts +22 -37
- package/src/panels/properties-panel.ts +175 -121
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +3 -3
- package/src/panels/seo-modal.ts +13 -17
- package/src/panels/settings-menu.ts +15 -15
- package/src/panels/signals-panel.ts +153 -131
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +254 -216
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +57 -54
- package/src/panels/stylebook-layers-panel.ts +9 -9
- package/src/panels/stylebook-panel.ts +13 -17
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +36 -26
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +58 -30
- package/src/platforms/cloud.ts +345 -175
- package/src/platforms/default-platform.ts +10 -4
- package/src/platforms/devserver.ts +174 -127
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +8 -2
- package/src/publish/pages-service.ts +28 -13
- package/src/publish/publish-commands.ts +5 -4
- package/src/publish/publish-panel.ts +10 -6
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +58 -31
- package/src/services/cem-export.ts +149 -58
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +18 -12
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +8 -7
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +79 -60
- package/src/settings/css-vars-editor.ts +37 -16
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +23 -13
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +11 -8
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +9 -6
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/schema-field-ui.ts +9 -0
- package/src/settings/settings-document.ts +5 -5
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +104 -81
- package/src/site-context.ts +37 -22
- package/src/state.ts +41 -49
- package/src/store.ts +54 -34
- package/src/studio.ts +39 -77
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +6 -7
- package/src/style/token-ref.ts +5 -4
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +31 -36
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.ts +12 -11
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/commandbar.ts +14 -9
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/doc-header.ts +10 -19
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.ts +14 -11
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/git-panel.ts +7 -15
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.ts +13 -12
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.ts +25 -20
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.ts +11 -10
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/menu.ts +29 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.ts +20 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.ts +5 -6
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.ts +11 -18
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.ts +20 -34
- package/src/surfaces/panel-stylebook-layers.ts +5 -8
- package/src/surfaces/preferences.ts +21 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +126 -73
- package/src/surfaces/rail.ts +38 -12
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.ts +15 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.ts +14 -10
- package/src/surfaces/settings-css-vars.ts +5 -12
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.ts +8 -15
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.ts +5 -6
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.ts +9 -18
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/slash-menu.ts +19 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +17 -14
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +5 -7
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +52 -41
- package/src/tabs/transact.ts +98 -53
- package/src/tabs/typing.ts +31 -0
- package/src/types.ts +32 -17
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +57 -48
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +44 -31
- package/src/ui/media-picker.ts +18 -9
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +113 -70
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +3 -2
- package/src/utils/base64.ts +3 -1
- package/src/utils/edit-display.ts +103 -74
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +10 -12
- package/src/workspace/session.ts +53 -43
- package/src/workspace/workspace.ts +47 -36
- package/dist/chunks/2020-nkxms0ay.js +0 -4
- package/dist/chunks/adapter-m948ab5f.js +0 -4
- package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
- package/dist/chunks/cf-settings-356xdtne.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-yk3t844e.js +0 -4
- package/dist/chunks/content-source-bawmyc09.js +0 -4
- package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-6sc8nacq.js +0 -4
- package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
- package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
- package/dist/chunks/file-ops-gye0qw56.js +0 -4
- package/dist/chunks/files-dmc2xvcq.js +0 -4
- package/dist/chunks/format-host-t76b53f8.js +0 -4
- package/dist/chunks/fs-events-cg4tpz06.js +0 -4
- package/dist/chunks/git-panel-yef7bshy.js +0 -4
- package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
- package/dist/chunks/icons-qbh8akb1.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-tmz30gfp.js +0 -4
- package/dist/chunks/index-nag78a9h.js +0 -4
- package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
- package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
- package/dist/chunks/layers-fvz99859.js +0 -4
- package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-9agdspkt.js +0 -4
- package/dist/chunks/media-picker-rhjvyy00.js +0 -4
- package/dist/chunks/menu-2e4y9j7b.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
- package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
- package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
- package/dist/chunks/notify-h3www560.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-hz34wcd7.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
- package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
- package/dist/chunks/references-2cgdxnb8.js +0 -4
- package/dist/chunks/right-panel-jf856w5w.js +0 -4
- package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0f55h9ye.js +0 -5
- package/dist/chunks/studio-0sqdhnew.js +0 -12
- package/dist/chunks/studio-19x1c75w.js +0 -5
- package/dist/chunks/studio-2sqcndak.js +0 -5
- package/dist/chunks/studio-3aey7dd3.js +0 -5
- package/dist/chunks/studio-3bpdkq2s.js +0 -5
- package/dist/chunks/studio-47y6fbpf.js +0 -5
- package/dist/chunks/studio-4m3826v2.js +0 -5
- package/dist/chunks/studio-4nx2dj1g.js +0 -4
- package/dist/chunks/studio-4xv5s47r.js +0 -9
- package/dist/chunks/studio-5g4t8v6w.js +0 -5
- package/dist/chunks/studio-5py436sf.js +0 -5
- package/dist/chunks/studio-77kt594t.js +0 -5
- package/dist/chunks/studio-8f87n763.js +0 -10
- package/dist/chunks/studio-8mb00b84.js +0 -5
- package/dist/chunks/studio-8p51gq2h.js +0 -6
- package/dist/chunks/studio-954ds834.js +0 -5
- package/dist/chunks/studio-9ft45c83.js +0 -9
- package/dist/chunks/studio-a2138x5k.js +0 -7
- package/dist/chunks/studio-a9yzstqj.js +0 -5
- package/dist/chunks/studio-acdksxx6.js +0 -5
- package/dist/chunks/studio-ar8jcf2y.js +0 -5
- package/dist/chunks/studio-bmn4mn9j.js +0 -7
- package/dist/chunks/studio-e7xxa0sj.js +0 -5
- package/dist/chunks/studio-ecaz25vk.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-fzdywr6p.js +0 -9
- package/dist/chunks/studio-g5fmf0c1.js +0 -5
- package/dist/chunks/studio-g7nse7zb.js +0 -5
- package/dist/chunks/studio-geq1ea6k.js +0 -14
- package/dist/chunks/studio-ghkb32r8.js +0 -5
- package/dist/chunks/studio-ghrhy2y7.js +0 -5
- package/dist/chunks/studio-grawhey1.js +0 -5
- package/dist/chunks/studio-h0xgswew.js +0 -5
- package/dist/chunks/studio-h9c4p2tx.js +0 -5
- package/dist/chunks/studio-jyzj5cxs.js +0 -5
- package/dist/chunks/studio-mgx8yhnz.js +0 -64
- package/dist/chunks/studio-mpb04y1d.js +0 -6
- package/dist/chunks/studio-n17mty64.js +0 -5
- package/dist/chunks/studio-nwh2eqsk.js +0 -6
- package/dist/chunks/studio-q1h883bt.js +0 -16
- package/dist/chunks/studio-q4tv82h7.js +0 -9
- package/dist/chunks/studio-qpqa7vk3.js +0 -5
- package/dist/chunks/studio-qqz8e5gk.js +0 -5
- package/dist/chunks/studio-qvasen3f.js +0 -5
- package/dist/chunks/studio-rggdb3hm.js +0 -5
- package/dist/chunks/studio-sghy936h.js +0 -4
- package/dist/chunks/studio-skprc6ef.js +0 -5
- package/dist/chunks/studio-tt2nactf.js +0 -5
- package/dist/chunks/studio-tyasmc39.js +0 -5
- package/dist/chunks/studio-vk9ezads.js +0 -5
- package/dist/chunks/studio-vzacdfsc.js +0 -4
- package/dist/chunks/studio-w4c0xmrw.js +0 -5
- package/dist/chunks/studio-wfjqhhbk.js +0 -5
- package/dist/chunks/studio-wgh5kxpj.js +0 -5
- package/dist/chunks/studio-xasj0796.js +0 -5
- package/dist/chunks/studio-y78s8r2n.js +0 -5
- package/dist/chunks/studio-z8w183sh.js +0 -5
- package/dist/chunks/studio-zscd9ty4.js +0 -928
- package/dist/chunks/studio-zxp13sss.js +0 -7
- package/dist/chunks/studio-zygnmm01.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-gr0m4dzr.js +0 -14
- package/dist/chunks/workspace-m15qtcqp.js +0 -4
- package/dist/chunks/ws-client-nf61frr1.js +0 -4
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
* `style["--token"]` and `style["@--ctx"]["--token"]` shapes the compiler already consumes.
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
|
+
import { ensureNestedStyle, getNestedStyle, isNumber, isString } from "@jxsuite/schema/guards";
|
|
27
28
|
import { parseMediaEntries, schemeOfQuery } from "../utils/canvas-media";
|
|
28
29
|
import { varDisplayName } from "../utils/studio-utils";
|
|
29
30
|
|
|
@@ -140,7 +141,7 @@ export function listTokens(style: JxStyle | null | undefined): ProjectToken[] {
|
|
|
140
141
|
if (!name.startsWith("--")) {
|
|
141
142
|
continue;
|
|
142
143
|
}
|
|
143
|
-
if (
|
|
144
|
+
if (!isString(value) && !isNumber(value)) {
|
|
144
145
|
continue;
|
|
145
146
|
}
|
|
146
147
|
out.push({ group: groupIdOfToken(name), label: tokenLabel(name), name, value });
|
|
@@ -242,9 +243,8 @@ export interface TokenOverride {
|
|
|
242
243
|
* @param {JxStyle} style
|
|
243
244
|
* @param {TokenContext} context
|
|
244
245
|
*/
|
|
245
|
-
function overrideBlock(style: JxStyle, context: TokenContext):
|
|
246
|
-
|
|
247
|
-
return block && typeof block === "object" ? (block as Record<string, unknown>) : undefined;
|
|
246
|
+
function overrideBlock(style: JxStyle, context: TokenContext): JxStyle | undefined {
|
|
247
|
+
return getNestedStyle(style, context.key);
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
/**
|
|
@@ -261,7 +261,7 @@ export function readTokenOverride(
|
|
|
261
261
|
token: string,
|
|
262
262
|
): string | number | undefined {
|
|
263
263
|
const value = overrideBlock(style, context)?.[token];
|
|
264
|
-
return
|
|
264
|
+
return isString(value) || isNumber(value) ? value : undefined;
|
|
265
265
|
}
|
|
266
266
|
|
|
267
267
|
/**
|
|
@@ -284,8 +284,7 @@ export function writeTokenOverride(
|
|
|
284
284
|
value: string,
|
|
285
285
|
): void {
|
|
286
286
|
if (value) {
|
|
287
|
-
|
|
288
|
-
block[token] = value;
|
|
287
|
+
ensureNestedStyle(style, context.key)[token] = value;
|
|
289
288
|
return;
|
|
290
289
|
}
|
|
291
290
|
const block = overrideBlock(style, context);
|
package/src/style/token-ref.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* hop would report `var(--color-brand)` as a colour.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { isNumber, isString } from "@jxsuite/schema/guards";
|
|
16
17
|
import type { JxStyle } from "@jxsuite/schema/types";
|
|
17
18
|
|
|
18
19
|
/** A value that is EXACTLY one `var()` reference — not `calc(var(--a) * 2)`, which is a value. */
|
|
@@ -24,11 +25,11 @@ const MAX_HOPS = 10;
|
|
|
24
25
|
/**
|
|
25
26
|
* The token a value references, or null when the value is not a bare reference.
|
|
26
27
|
*
|
|
27
|
-
* @param {
|
|
28
|
+
* @param {string | number} value
|
|
28
29
|
* @returns {string | null}
|
|
29
30
|
*/
|
|
30
|
-
export function tokenRefName(value:
|
|
31
|
-
if (
|
|
31
|
+
export function tokenRefName(value: string | number): string | null {
|
|
32
|
+
if (!isString(value)) {
|
|
32
33
|
return null;
|
|
33
34
|
}
|
|
34
35
|
return TOKEN_REF_RE.exec(value)?.[1] ?? null;
|
|
@@ -75,7 +76,7 @@ export function resolveTokenValue(
|
|
|
75
76
|
}
|
|
76
77
|
seen.add(ref);
|
|
77
78
|
const next = style?.[ref];
|
|
78
|
-
if (
|
|
79
|
+
if (!isString(next) && !isNumber(next)) {
|
|
79
80
|
return undefined;
|
|
80
81
|
}
|
|
81
82
|
current = next;
|
package/src/surfaces/about.ts
CHANGED
|
@@ -17,19 +17,12 @@
|
|
|
17
17
|
import { reactive } from "../reactivity";
|
|
18
18
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
19
19
|
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
20
|
-
import { close
|
|
20
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
21
21
|
import { whenReady } from "./dialog";
|
|
22
22
|
import aboutDoc from "./about.json";
|
|
23
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
24
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
23
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
25
24
|
|
|
26
|
-
registerSurface("about", aboutDoc
|
|
27
|
-
|
|
28
|
-
/** One row of the metadata list: a label and the value beside it. */
|
|
29
|
-
export interface AboutRow {
|
|
30
|
-
label: string;
|
|
31
|
-
value: string;
|
|
32
|
-
}
|
|
25
|
+
registerSurface("about", aboutDoc);
|
|
33
26
|
|
|
34
27
|
/** One external link in the dialog's link row. */
|
|
35
28
|
export interface AboutLink {
|
|
@@ -41,7 +34,7 @@ export interface AboutSurfaceOptions {
|
|
|
41
34
|
/** Where the dialog is mounted — the dialog layer. */
|
|
42
35
|
layer: HTMLElement;
|
|
43
36
|
headline: string;
|
|
44
|
-
rows:
|
|
37
|
+
rows: SurfaceOption[];
|
|
45
38
|
links: AboutLink[];
|
|
46
39
|
/** The dialog closed, for any reason the platform owns as well as the Close button. */
|
|
47
40
|
onClosed: () => void;
|
|
@@ -49,7 +42,7 @@ export interface AboutSurfaceOptions {
|
|
|
49
42
|
|
|
50
43
|
/** What the flow may change once the dialog is up: the package list, when it arrives. */
|
|
51
44
|
export interface AboutSurfacePatch {
|
|
52
|
-
rows?:
|
|
45
|
+
rows?: SurfaceOption[];
|
|
53
46
|
packages?: { name: string; version: string }[];
|
|
54
47
|
}
|
|
55
48
|
|
|
@@ -60,9 +53,9 @@ export interface AboutSurfaceHandle {
|
|
|
60
53
|
close: () => void;
|
|
61
54
|
}
|
|
62
55
|
|
|
63
|
-
interface AboutScope
|
|
56
|
+
interface AboutScope {
|
|
64
57
|
headline: string;
|
|
65
|
-
rows:
|
|
58
|
+
rows: SurfaceOption[];
|
|
66
59
|
links: AboutLink[];
|
|
67
60
|
packages: { name: string; version: string }[];
|
|
68
61
|
/**
|
|
@@ -100,7 +93,11 @@ export function openAboutSurface(options: AboutSurfaceOptions): AboutSurfaceHand
|
|
|
100
93
|
closed = true;
|
|
101
94
|
options.onClosed();
|
|
102
95
|
};
|
|
103
|
-
|
|
96
|
+
/* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
|
|
97
|
+
element, and a direct `closed` test after that `await` would be narrowed to the value the test
|
|
98
|
+
before it saw. */
|
|
99
|
+
const isClosed = (): boolean => closed;
|
|
100
|
+
const scope: AboutScope = reactive<AboutScope>({
|
|
104
101
|
close: () => handle.close(),
|
|
105
102
|
closed: finish,
|
|
106
103
|
headline: options.headline,
|
|
@@ -108,13 +105,15 @@ export function openAboutSurface(options: AboutSurfaceOptions): AboutSurfaceHand
|
|
|
108
105
|
packages: [],
|
|
109
106
|
packagesState: "loading",
|
|
110
107
|
rows: options.rows,
|
|
111
|
-
})
|
|
108
|
+
});
|
|
112
109
|
|
|
113
110
|
let mounted: SurfaceHandle | null = null;
|
|
114
111
|
const ready = mountSurface("about", scope, slot).then(async (surface) => {
|
|
115
112
|
mounted = surface;
|
|
113
|
+
// SAFETY: `about.json`'s root definition carries `tagName: "jx-dialog"`, so the runtime mounts an
|
|
114
|
+
// HTMLElement; a `Text` root only comes from a document whose root is a bare string.
|
|
116
115
|
const element = surface.root as HTMLElement;
|
|
117
|
-
if (
|
|
116
|
+
if (isClosed()) {
|
|
118
117
|
surface.dispose();
|
|
119
118
|
return element;
|
|
120
119
|
}
|
|
@@ -125,7 +124,7 @@ export function openAboutSurface(options: AboutSurfaceOptions): AboutSurfaceHand
|
|
|
125
124
|
`openDialogSurface` rather than reimplemented, because both surfaces are `jx-dialog`s and
|
|
126
125
|
there is one answer to when one of those is ready. */
|
|
127
126
|
await whenReady(element);
|
|
128
|
-
if (
|
|
127
|
+
if (isClosed()) {
|
|
129
128
|
return element;
|
|
130
129
|
}
|
|
131
130
|
showModal(element);
|
|
@@ -140,7 +139,7 @@ export function openAboutSurface(options: AboutSurfaceOptions): AboutSurfaceHand
|
|
|
140
139
|
const element = mounted?.root;
|
|
141
140
|
if (element instanceof HTMLElement) {
|
|
142
141
|
// The platform's close first, so focus goes back where it came from; then the document.
|
|
143
|
-
|
|
142
|
+
close(element);
|
|
144
143
|
}
|
|
145
144
|
mounted?.dispose();
|
|
146
145
|
mounted = null;
|
package/src/surfaces/add-repo.ts
CHANGED
|
@@ -31,14 +31,13 @@
|
|
|
31
31
|
import { reactive } from "../reactivity";
|
|
32
32
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
33
33
|
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
34
|
-
import { close
|
|
34
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
35
35
|
import { focusField } from "@jxsuite/ui/behaviors/textfield";
|
|
36
36
|
import { whenReady } from "./dialog";
|
|
37
37
|
import addRepoDoc from "./add-repo.json";
|
|
38
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
39
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
38
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
40
39
|
|
|
41
|
-
registerSurface("add-repo", addRepoDoc
|
|
40
|
+
registerSurface("add-repo", addRepoDoc);
|
|
42
41
|
|
|
43
42
|
/** One repository, as the list draws it. Every field is already a string or a flag. */
|
|
44
43
|
export interface AddRepoRow {
|
|
@@ -68,12 +67,6 @@ export interface AddRepoAccessLink {
|
|
|
68
67
|
title: string;
|
|
69
68
|
}
|
|
70
69
|
|
|
71
|
-
/** One entry of the account filter. `""` is every account. */
|
|
72
|
-
export interface AddRepoOwner {
|
|
73
|
-
value: string;
|
|
74
|
-
label: string;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
70
|
/**
|
|
78
71
|
* Why the repository list is empty, when it is.
|
|
79
72
|
*
|
|
@@ -105,7 +98,7 @@ export interface AddRepoView {
|
|
|
105
98
|
/** The account the list is narrowed to; `""` is every account. */
|
|
106
99
|
owner: string;
|
|
107
100
|
/** The account filter's entries, "All accounts" first; empty hides it (one account, or none). */
|
|
108
|
-
owners:
|
|
101
|
+
owners: SurfaceOption[];
|
|
109
102
|
/** The listing is in flight. Its own state, because "not yet asked" is not "reaches nothing". */
|
|
110
103
|
loading: boolean;
|
|
111
104
|
/** The repositories to draw, already filtered and ordered. */
|
|
@@ -226,8 +219,7 @@ interface AddRepoFlags {
|
|
|
226
219
|
confirmDisabled: boolean;
|
|
227
220
|
}
|
|
228
221
|
|
|
229
|
-
interface AddRepoScope
|
|
230
|
-
extends Record<string, unknown>, Omit<AddRepoView, "rows" | "locations">, AddRepoFlags {
|
|
222
|
+
interface AddRepoScope extends Omit<AddRepoView, "rows" | "locations">, AddRepoFlags {
|
|
231
223
|
setFilter: (value: string) => void;
|
|
232
224
|
setOwner: (value: string) => void;
|
|
233
225
|
select: (fullName: string) => void;
|
|
@@ -277,7 +269,7 @@ function derive(view: AddRepoView): Omit<AddRepoView, "rows" | "locations"> & Ad
|
|
|
277
269
|
? "loading"
|
|
278
270
|
: rows.length > 0
|
|
279
271
|
? "listed"
|
|
280
|
-
: (`empty-${view.emptyState}` as
|
|
272
|
+
: (`empty-${view.emptyState}` as const),
|
|
281
273
|
locations,
|
|
282
274
|
refreshDisabled: view.loading || view.busy,
|
|
283
275
|
rows,
|
|
@@ -309,8 +301,12 @@ export function openAddRepoSurface(options: AddRepoSurfaceOptions): AddRepoSurfa
|
|
|
309
301
|
closed = true;
|
|
310
302
|
options.onClosed();
|
|
311
303
|
};
|
|
304
|
+
/* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
|
|
305
|
+
element, and a direct `closed` test after that `await` would be narrowed to the value the test
|
|
306
|
+
before it saw. */
|
|
307
|
+
const isClosed = (): boolean => closed;
|
|
312
308
|
|
|
313
|
-
const scope = reactive({
|
|
309
|
+
const scope: AddRepoScope = reactive<AddRepoScope>({
|
|
314
310
|
...derive(options.view),
|
|
315
311
|
closed: finish,
|
|
316
312
|
confirm: () => {
|
|
@@ -350,18 +346,20 @@ export function openAddRepoSurface(options: AddRepoSurfaceOptions): AddRepoSurfa
|
|
|
350
346
|
scope.owner = value;
|
|
351
347
|
options.onOwner(value);
|
|
352
348
|
},
|
|
353
|
-
})
|
|
349
|
+
});
|
|
354
350
|
|
|
355
351
|
let mounted: SurfaceHandle | null = null;
|
|
356
352
|
const ready = mountSurface("add-repo", scope, slot).then(async (surface) => {
|
|
357
353
|
mounted = surface;
|
|
354
|
+
// SAFETY: `add-repo.json`'s root definition carries `tagName: "jx-dialog"`, so the runtime mounts an
|
|
355
|
+
// HTMLElement; a `Text` root only comes from a document whose root is a bare string.
|
|
358
356
|
const element = surface.root as HTMLElement;
|
|
359
|
-
if (
|
|
357
|
+
if (isClosed()) {
|
|
360
358
|
surface.dispose();
|
|
361
359
|
return element;
|
|
362
360
|
}
|
|
363
361
|
await whenReady(element);
|
|
364
|
-
if (
|
|
362
|
+
if (isClosed()) {
|
|
365
363
|
return element;
|
|
366
364
|
}
|
|
367
365
|
showModal(element);
|
|
@@ -384,7 +382,7 @@ export function openAddRepoSurface(options: AddRepoSurfaceOptions): AddRepoSurfa
|
|
|
384
382
|
const element = mounted?.root;
|
|
385
383
|
if (element instanceof HTMLElement) {
|
|
386
384
|
// The platform's close first, so focus goes back where it came from; then the document.
|
|
387
|
-
|
|
385
|
+
close(element);
|
|
388
386
|
}
|
|
389
387
|
// A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
|
|
390
388
|
mounted?.dispose();
|
package/src/surfaces/ai-chat.ts
CHANGED
|
@@ -27,15 +27,16 @@
|
|
|
27
27
|
* @docs studio/ai/chat
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
30
31
|
import { reactive } from "../reactivity";
|
|
31
32
|
import { trustedHtml } from "../services/trusted-types";
|
|
32
33
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
33
34
|
import aiChatDoc from "./ai-chat.json";
|
|
34
|
-
import type {
|
|
35
|
+
import type { JsonObject, JxElement } from "@jxsuite/schema/types";
|
|
35
36
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
36
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
37
|
+
import type { KeyedLabel, SurfaceHandle } from "../ui/surface";
|
|
37
38
|
|
|
38
|
-
registerSurface("ai-chat", aiChatDoc
|
|
39
|
+
registerSurface("ai-chat", aiChatDoc);
|
|
39
40
|
|
|
40
41
|
/** How close (px) to the bottom of a scroller still counts as "following along". */
|
|
41
42
|
const STICK_THRESHOLD = 48;
|
|
@@ -51,7 +52,7 @@ const LOG_STICK_THRESHOLD = 24;
|
|
|
51
52
|
* rendering of the registry rather than a second place its capabilities are decided
|
|
52
53
|
* (`studio-ui-guidelines.md` §12.5).
|
|
53
54
|
*/
|
|
54
|
-
export interface ChatCommandView
|
|
55
|
+
export interface ChatCommandView {
|
|
55
56
|
/** The reconcile key. The command id, because a button is drawn once per bar. */
|
|
56
57
|
key: string;
|
|
57
58
|
/** What `run` is given. */
|
|
@@ -68,14 +69,8 @@ export interface ChatCommandView extends Record<string, unknown> {
|
|
|
68
69
|
disabled: boolean;
|
|
69
70
|
}
|
|
70
71
|
|
|
71
|
-
/** One answer an `ask_user` card offers as a shortcut. */
|
|
72
|
-
export interface ChatAskOption extends Record<string, unknown> {
|
|
73
|
-
key: string;
|
|
74
|
-
label: string;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
72
|
/** One line an import run has reported. */
|
|
78
|
-
export interface ChatLogLine
|
|
73
|
+
export interface ChatLogLine {
|
|
79
74
|
key: string;
|
|
80
75
|
phase: string;
|
|
81
76
|
message: string;
|
|
@@ -88,7 +83,7 @@ export interface ChatLogLine extends Record<string, unknown> {
|
|
|
88
83
|
* `$switch` chooses on one: a chip that omitted `options` would leave the question case reading an
|
|
89
84
|
* absent path.
|
|
90
85
|
*/
|
|
91
|
-
export interface ChatChipView
|
|
86
|
+
export interface ChatChipView {
|
|
92
87
|
/** The tool-call id — the reconcile key. */
|
|
93
88
|
key: string;
|
|
94
89
|
/** The tool's name, for a test and for the `data-tool` attribute. */
|
|
@@ -114,7 +109,8 @@ export interface ChatChipView extends Record<string, unknown> {
|
|
|
114
109
|
hasContext: boolean;
|
|
115
110
|
/** `pending`, `unanswered`, `answered`, `failed` or `none` — which half of the card to draw. */
|
|
116
111
|
askState: string;
|
|
117
|
-
|
|
112
|
+
/** The answers an `ask_user` card offers as shortcuts. */
|
|
113
|
+
options: KeyedLabel[];
|
|
118
114
|
/** What the reader replied, once they have. */
|
|
119
115
|
answer: string;
|
|
120
116
|
/** `run` when this call has an import to report, `none` otherwise. */
|
|
@@ -133,7 +129,7 @@ export interface ChatChipView extends Record<string, unknown> {
|
|
|
133
129
|
}
|
|
134
130
|
|
|
135
131
|
/** One file a turn changed. */
|
|
136
|
-
export interface ChatChangeView
|
|
132
|
+
export interface ChatChangeView {
|
|
137
133
|
key: string;
|
|
138
134
|
path: string;
|
|
139
135
|
/** The tool that wrote it, or the sentence saying why it did not. */
|
|
@@ -143,14 +139,8 @@ export interface ChatChangeView extends Record<string, unknown> {
|
|
|
143
139
|
disk: boolean;
|
|
144
140
|
}
|
|
145
141
|
|
|
146
|
-
/** One attached-context chip on a user turn. */
|
|
147
|
-
export interface ChatContextChip extends Record<string, unknown> {
|
|
148
|
-
key: string;
|
|
149
|
-
label: string;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
142
|
/** One line of the transcript. */
|
|
153
|
-
export interface ChatRowView
|
|
143
|
+
export interface ChatRowView {
|
|
154
144
|
/** The message id. The `$map` key, and what `restore` is given. */
|
|
155
145
|
key: string;
|
|
156
146
|
/** `user`, `assistant`, `streaming`, `typing` or `tool-error`. */
|
|
@@ -159,7 +149,8 @@ export interface ChatRowView extends Record<string, unknown> {
|
|
|
159
149
|
body: string;
|
|
160
150
|
/** Sanitized model output for an `assistant` row. Filled into the island, never bound. */
|
|
161
151
|
markdown: string;
|
|
162
|
-
|
|
152
|
+
/** The attached-context chips on a user turn. */
|
|
153
|
+
contextChips: KeyedLabel[];
|
|
163
154
|
hasContextChips: boolean;
|
|
164
155
|
chips: ChatChipView[];
|
|
165
156
|
hasChips: boolean;
|
|
@@ -172,7 +163,7 @@ export interface ChatRowView extends Record<string, unknown> {
|
|
|
172
163
|
}
|
|
173
164
|
|
|
174
165
|
/** One row of the chat history. */
|
|
175
|
-
export interface ChatSessionView
|
|
166
|
+
export interface ChatSessionView {
|
|
176
167
|
/** The session id — the key, and what a row opens or deletes. */
|
|
177
168
|
key: string;
|
|
178
169
|
title: string;
|
|
@@ -181,7 +172,7 @@ export interface ChatSessionView extends Record<string, unknown> {
|
|
|
181
172
|
}
|
|
182
173
|
|
|
183
174
|
/** One chip the composer is carrying. */
|
|
184
|
-
export interface ChatComposerChip
|
|
175
|
+
export interface ChatComposerChip {
|
|
185
176
|
/** The chip's kind — one chip per kind, so the kind IS the identity. */
|
|
186
177
|
key: string;
|
|
187
178
|
label: string;
|
|
@@ -277,7 +268,7 @@ export interface AiChatSurface {
|
|
|
277
268
|
}
|
|
278
269
|
|
|
279
270
|
/** The scope the document reads: the view, the flow's actions, and the scroller's own handler. */
|
|
280
|
-
interface AiChatScope extends
|
|
271
|
+
interface AiChatScope extends AiChatView, AiChatActions {
|
|
281
272
|
scrolled: () => void;
|
|
282
273
|
}
|
|
283
274
|
|
|
@@ -353,21 +344,21 @@ export function emptyAiChatView(): AiChatView {
|
|
|
353
344
|
|
|
354
345
|
/** The `part` a node's definition carries, or "" for a text node or an unmarked element. */
|
|
355
346
|
function partOf(def: JxElement | string): string {
|
|
356
|
-
const part =
|
|
357
|
-
return
|
|
347
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
348
|
+
return isString(part) ? part : "";
|
|
358
349
|
}
|
|
359
350
|
|
|
360
351
|
/** The `$map` item a node was rendered inside, if it was rendered inside one. */
|
|
361
|
-
function mapItem(state: JxScope | undefined):
|
|
362
|
-
const map = state?.["$map"]
|
|
363
|
-
const item = map
|
|
364
|
-
return item
|
|
352
|
+
function mapItem(state: JxScope | undefined): JsonObject | null {
|
|
353
|
+
const map = state?.["$map"];
|
|
354
|
+
const item = isJsonObject(map) ? map["item"] : undefined;
|
|
355
|
+
return isJsonObject(item) ? item : null;
|
|
365
356
|
}
|
|
366
357
|
|
|
367
358
|
/** A string field off a `$map` item, or "". */
|
|
368
|
-
function itemString(item:
|
|
359
|
+
function itemString(item: JsonObject | null, field: string): string {
|
|
369
360
|
const value = item?.[field];
|
|
370
|
-
return
|
|
361
|
+
return isString(value) ? value : "";
|
|
371
362
|
}
|
|
372
363
|
|
|
373
364
|
/** Keep a scroller pinned to its newest line, unless the reader has scrolled away from it. */
|
|
@@ -406,7 +397,7 @@ export function mountAiChatSurface(
|
|
|
406
397
|
/** The import logs, by chip key. */
|
|
407
398
|
const logs = new Map<string, HTMLElement>();
|
|
408
399
|
|
|
409
|
-
const scope = reactive<AiChatScope>({
|
|
400
|
+
const scope: AiChatScope = reactive<AiChatScope>({
|
|
410
401
|
...emptyAiChatView(),
|
|
411
402
|
...actions,
|
|
412
403
|
scrolled: () => {
|
|
@@ -416,7 +407,7 @@ export function mountAiChatSurface(
|
|
|
416
407
|
STICK_THRESHOLD;
|
|
417
408
|
}
|
|
418
409
|
},
|
|
419
|
-
})
|
|
410
|
+
});
|
|
420
411
|
project(scope, view);
|
|
421
412
|
|
|
422
413
|
/**
|
|
@@ -451,7 +442,11 @@ export function mountAiChatSurface(
|
|
|
451
442
|
* value assigned here is a `TrustedHTML`; without one the same assertion has still run.
|
|
452
443
|
*/
|
|
453
444
|
function fillIsland(node: HTMLElement, html: string): void {
|
|
454
|
-
|
|
445
|
+
/* SAFETY: lib.dom declares `innerHTML` as `string`, but the setter's IDL type is
|
|
446
|
+
`(TrustedHTML or DOMString)`, and `trustedHtml` returns one of exactly those two: the policy's
|
|
447
|
+
`TrustedHTML`, or the asserted string where the API is absent. Widening the property to what
|
|
448
|
+
the sink accepts is an upcast of this HTMLElement, so the write reaches the same setter. */
|
|
449
|
+
(node as { innerHTML: unknown }).innerHTML = trustedHtml(html);
|
|
455
450
|
}
|
|
456
451
|
|
|
457
452
|
let mounted: SurfaceHandle | null = null;
|
|
@@ -29,18 +29,9 @@
|
|
|
29
29
|
import { reactive } from "../reactivity";
|
|
30
30
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
31
31
|
import credentialsDoc from "./ai-credentials-form.json";
|
|
32
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
33
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
32
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
34
33
|
|
|
35
|
-
registerSurface("ai-credentials-form", credentialsDoc
|
|
36
|
-
|
|
37
|
-
/** One row of the listed catalogue, as the combobox draws it. */
|
|
38
|
-
export interface CredentialsModelRow {
|
|
39
|
-
/** The model id — the row's key, and what a pick writes into the model draft. */
|
|
40
|
-
value: string;
|
|
41
|
-
/** What the row reads. */
|
|
42
|
-
label: string;
|
|
43
|
-
}
|
|
34
|
+
registerSurface("ai-credentials-form", credentialsDoc);
|
|
44
35
|
|
|
45
36
|
/** What the form says right now. Every field is the flow's, never a state it derives. */
|
|
46
37
|
export interface AiCredentialsView {
|
|
@@ -51,7 +42,7 @@ export interface AiCredentialsView {
|
|
|
51
42
|
modelDraft: string;
|
|
52
43
|
baseUrlDraft: string;
|
|
53
44
|
/** The catalogue the last successful listing returned; empty draws no chevron on the field. */
|
|
54
|
-
models:
|
|
45
|
+
models: SurfaceOption[];
|
|
55
46
|
/** A listing is in flight: the button says so and refuses a second one. */
|
|
56
47
|
modelsLoading: boolean;
|
|
57
48
|
/** What the fetch button reads — including while it is working, and once a list has landed. */
|
|
@@ -88,11 +79,10 @@ interface AiCredentialsFlags {
|
|
|
88
79
|
/** Whether there is a refusal to draw beside the fetch button. */
|
|
89
80
|
hasError: boolean;
|
|
90
81
|
/** The catalogue as the kit's combobox draws it — the list, never a corpus it matches against. */
|
|
91
|
-
modelOptions:
|
|
82
|
+
modelOptions: SurfaceOption[];
|
|
92
83
|
}
|
|
93
84
|
|
|
94
|
-
interface AiCredentialsScope
|
|
95
|
-
extends Record<string, unknown>, AiCredentialsView, AiCredentialsActions, AiCredentialsFlags {}
|
|
85
|
+
interface AiCredentialsScope extends AiCredentialsView, AiCredentialsActions, AiCredentialsFlags {}
|
|
96
86
|
|
|
97
87
|
/** The view plus the flags the document renders from. */
|
|
98
88
|
function derive(view: AiCredentialsView): AiCredentialsView & AiCredentialsFlags {
|
|
@@ -119,7 +109,7 @@ export function createAiCredentialsSurface(
|
|
|
119
109
|
): AiCredentialsSurface {
|
|
120
110
|
const host = document.createElement("div");
|
|
121
111
|
host.style.display = "contents";
|
|
122
|
-
const scope = reactive({ ...derive(view), ...actions })
|
|
112
|
+
const scope: AiCredentialsScope = reactive<AiCredentialsScope>({ ...derive(view), ...actions });
|
|
123
113
|
|
|
124
114
|
/** `null` while a mount is in flight — which is a standing surface, not a missing one. */
|
|
125
115
|
let handle: SurfaceHandle | null = null;
|
|
@@ -27,9 +27,8 @@ import { reactive } from "../reactivity";
|
|
|
27
27
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
28
28
|
import connectDoc from "./ai-managed-connect.json";
|
|
29
29
|
import type { SurfaceHandle } from "../ui/surface";
|
|
30
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
31
30
|
|
|
32
|
-
registerSurface("ai-managed-connect", connectDoc
|
|
31
|
+
registerSurface("ai-managed-connect", connectDoc);
|
|
33
32
|
|
|
34
33
|
/** What the offer says right now. Every field is the flow's wording, never a state it derives. */
|
|
35
34
|
export interface ManagedConnectView {
|
|
@@ -63,7 +62,7 @@ interface ManagedConnectFlags {
|
|
|
63
62
|
}
|
|
64
63
|
|
|
65
64
|
interface ManagedConnectScope
|
|
66
|
-
extends
|
|
65
|
+
extends ManagedConnectView, ManagedConnectActions, ManagedConnectFlags {}
|
|
67
66
|
|
|
68
67
|
/** The view plus the flag the document switches on. */
|
|
69
68
|
function derive(view: ManagedConnectView): ManagedConnectView & ManagedConnectFlags {
|
|
@@ -87,7 +86,7 @@ export function createManagedConnectSurface(
|
|
|
87
86
|
): ManagedConnectSurface {
|
|
88
87
|
const host = document.createElement("div");
|
|
89
88
|
host.style.display = "contents";
|
|
90
|
-
const scope = reactive({ ...derive(view), ...actions })
|
|
89
|
+
const scope: ManagedConnectScope = reactive<ManagedConnectScope>({ ...derive(view), ...actions });
|
|
91
90
|
|
|
92
91
|
/** `null` while a mount is in flight — which is a standing surface, not a missing one. */
|
|
93
92
|
let handle: SurfaceHandle | null = null;
|
|
@@ -25,9 +25,8 @@ import { reactive } from "../reactivity";
|
|
|
25
25
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
26
26
|
import pickerDoc from "./ai-model-picker.json";
|
|
27
27
|
import type { SurfaceHandle } from "../ui/surface";
|
|
28
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
29
28
|
|
|
30
|
-
registerSurface("ai-model-picker", pickerDoc
|
|
29
|
+
registerSurface("ai-model-picker", pickerDoc);
|
|
31
30
|
|
|
32
31
|
/** One row the control offers. Already a label — the flow decides what a row is called. */
|
|
33
32
|
export interface ModelPickerRow {
|
|
@@ -79,8 +78,7 @@ interface ModelPickerFlags {
|
|
|
79
78
|
hasFailure: boolean;
|
|
80
79
|
}
|
|
81
80
|
|
|
82
|
-
interface ModelPickerScope
|
|
83
|
-
extends Record<string, unknown>, ModelPickerView, ModelPickerActions, ModelPickerFlags {}
|
|
81
|
+
interface ModelPickerScope extends ModelPickerView, ModelPickerActions, ModelPickerFlags {}
|
|
84
82
|
|
|
85
83
|
/** The view plus the flag the document switches on. */
|
|
86
84
|
function derive(view: ModelPickerView): ModelPickerView & ModelPickerFlags {
|
|
@@ -103,7 +101,7 @@ export function createModelPickerSurface(
|
|
|
103
101
|
): ModelPickerSurface {
|
|
104
102
|
const host = document.createElement("div");
|
|
105
103
|
host.style.display = "contents";
|
|
106
|
-
const scope = reactive({ ...derive(view), ...actions })
|
|
104
|
+
const scope: ModelPickerScope = reactive<ModelPickerScope>({ ...derive(view), ...actions });
|
|
107
105
|
|
|
108
106
|
/** `null` while a mount is in flight — which is a standing surface, not a missing one. */
|
|
109
107
|
let handle: SurfaceHandle | null = null;
|