@jxsuite/studio 6.1.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -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-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- 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/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- 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 +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- 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/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -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/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- 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 +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- 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 +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- 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 +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- 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 +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- 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 +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- 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 +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- 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 +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- 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 +20 -14
- 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 +29 -9
- package/src/services/settings/definitions.ts +25 -14
- 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 +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- 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.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- 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/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- 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/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.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -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.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- 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.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -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-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- 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.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- 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 +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- 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 +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- 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 +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- 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/local-day.ts +18 -0
- 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 +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.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-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.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-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zey7zsdw.js +0 -12
- package/dist/chunks/studio-zyqn40w4.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-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -272
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* Add new as a mounted document.
|
|
4
|
+
*
|
|
5
|
+
* `create/add-new-flow.ts` is the flow — it holds the kind, the name and the options, reads the
|
|
6
|
+
* project into a `CreationContext`, lists the directories the result would write into, asks
|
|
7
|
+
* `deriveCreation` what that is and `creationProblem` whether it may, and performs the write — and
|
|
8
|
+
* this is the surface it draws into: the reactive scope the document reads, the few flags it
|
|
9
|
+
* branches on, and the mount that lives in the dialog layer until the flow takes it down.
|
|
10
|
+
*
|
|
11
|
+
* **The flow states facts; the surface derives the flags.** Whether the name field is drawn,
|
|
12
|
+
* whether the field is refused and whether the primary button can answer are each one comparison
|
|
13
|
+
* over the view, so they are made here rather than handed in beside the facts they restate.
|
|
14
|
+
*
|
|
15
|
+
* **Await the ELEMENT, not just the mount.** `mountSurface` resolving means the DOCUMENT rendered;
|
|
16
|
+
* a `jx-dialog`'s own template is one `connectedCallback` later, and `showModal` in between finds
|
|
17
|
+
* no `<dialog>` to open. `whenReady` is shared with `surfaces/dialog.ts` rather than
|
|
18
|
+
* reimplemented.
|
|
19
|
+
*
|
|
20
|
+
* @docs studio/projects/pages-layouts-components
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { reactive } from "../reactivity";
|
|
24
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
25
|
+
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
26
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
27
|
+
import { selectValue } from "@jxsuite/ui/behaviors/textfield";
|
|
28
|
+
import { whenReady } from "./dialog";
|
|
29
|
+
import addNewDoc from "./add-new.json";
|
|
30
|
+
import type { CreationKind } from "../create/add-new";
|
|
31
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
32
|
+
|
|
33
|
+
registerSurface("add-new", addNewDoc);
|
|
34
|
+
|
|
35
|
+
/** One kind in the left-hand list. */
|
|
36
|
+
export interface AddNewKindRow {
|
|
37
|
+
id: CreationKind;
|
|
38
|
+
label: string;
|
|
39
|
+
hint: string;
|
|
40
|
+
icon: string;
|
|
41
|
+
/** `"true"` for the chosen kind: the row is one radio of a radiogroup. */
|
|
42
|
+
checked: "true" | "false";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** One card in a Start from / Wrap it in radiogroup. */
|
|
46
|
+
export interface AddNewChoiceRow {
|
|
47
|
+
value: string;
|
|
48
|
+
label: string;
|
|
49
|
+
/** The muted second line: "header + footer", "mostly writing", "2 elements". */
|
|
50
|
+
note: string;
|
|
51
|
+
checked: "true" | "false";
|
|
52
|
+
/** A choice that cannot be made now stays in the group, disabled, with `reason` as its tip. */
|
|
53
|
+
disabled: boolean;
|
|
54
|
+
reason: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** One field preset chip. */
|
|
58
|
+
export interface AddNewPresetRow {
|
|
59
|
+
id: string;
|
|
60
|
+
label: string;
|
|
61
|
+
selected: boolean;
|
|
62
|
+
icon: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** What the flow knows. Every one of these may change while the dialog is up. */
|
|
66
|
+
export interface AddNewView {
|
|
67
|
+
kind: CreationKind;
|
|
68
|
+
kinds: AddNewKindRow[];
|
|
69
|
+
/** The chosen kind's label, which names the detail region. */
|
|
70
|
+
kindLabel: string;
|
|
71
|
+
/** The sentence that introduces the chosen kind. */
|
|
72
|
+
kindHint: string;
|
|
73
|
+
/** Where the dialog can be opened from, said once at the foot of the list. */
|
|
74
|
+
chordNote: string;
|
|
75
|
+
nameLabel: string;
|
|
76
|
+
name: string;
|
|
77
|
+
placeholder: string;
|
|
78
|
+
/** The refusal under the name field; `""` until the reader has typed, and when there is none. */
|
|
79
|
+
error: string;
|
|
80
|
+
/** The derived result: "Saved as pages/pricing.json · opens at /pricing". */
|
|
81
|
+
saved: string;
|
|
82
|
+
/** The primary button's words. */
|
|
83
|
+
cta: string;
|
|
84
|
+
/** Whether the primary button can answer now. */
|
|
85
|
+
canConfirm: boolean;
|
|
86
|
+
|
|
87
|
+
// ── language (page, entry, collection) ────────────────────────────────────
|
|
88
|
+
/** Whether the Language picker is drawn: a page, or an entry of a localized collection. */
|
|
89
|
+
localeShown: boolean;
|
|
90
|
+
localeOptions: SurfaceOption[];
|
|
91
|
+
/** The chosen language, a declared tag. */
|
|
92
|
+
locale: string;
|
|
93
|
+
/** Whether the project declares languages, which is when a collection can be localized. */
|
|
94
|
+
localizable: boolean;
|
|
95
|
+
/** Collection: one folder per language. */
|
|
96
|
+
localized: boolean;
|
|
97
|
+
/** The declared tags, said on the collection's checkbox: "en, fr-CA, ar". */
|
|
98
|
+
localeSummary: string;
|
|
99
|
+
|
|
100
|
+
// ── page ──────────────────────────────────────────────────────────────────
|
|
101
|
+
route: string;
|
|
102
|
+
editingUrl: boolean;
|
|
103
|
+
url: string;
|
|
104
|
+
startChoices: AddNewChoiceRow[];
|
|
105
|
+
|
|
106
|
+
// ── collection ────────────────────────────────────────────────────────────
|
|
107
|
+
itemNoun: string;
|
|
108
|
+
presets: AddNewPresetRow[];
|
|
109
|
+
ownPage: boolean;
|
|
110
|
+
pattern: string;
|
|
111
|
+
templateOptions: SurfaceOption[];
|
|
112
|
+
pageTemplate: string;
|
|
113
|
+
|
|
114
|
+
// ── template ──────────────────────────────────────────────────────────────
|
|
115
|
+
wrapChoices: AddNewChoiceRow[];
|
|
116
|
+
|
|
117
|
+
// ── component ─────────────────────────────────────────────────────────────
|
|
118
|
+
componentChoices: AddNewChoiceRow[];
|
|
119
|
+
copying: boolean;
|
|
120
|
+
copyOptions: SurfaceOption[];
|
|
121
|
+
copyOf: string;
|
|
122
|
+
|
|
123
|
+
// ── entry ─────────────────────────────────────────────────────────────────
|
|
124
|
+
collectionOptions: SurfaceOption[];
|
|
125
|
+
collection: string;
|
|
126
|
+
|
|
127
|
+
// ── media ─────────────────────────────────────────────────────────────────
|
|
128
|
+
dropActive: "true" | "false";
|
|
129
|
+
uploadAccept: string;
|
|
130
|
+
fileSummary: string;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** What the document can tell the flow. */
|
|
134
|
+
export interface AddNewActions {
|
|
135
|
+
pickKind: (kind: CreationKind) => void;
|
|
136
|
+
setName: (value: string) => void;
|
|
137
|
+
/** The primary button, or Enter in a field. The flow decides whether that creates anything. */
|
|
138
|
+
confirm: () => void;
|
|
139
|
+
toggleUrl: () => void;
|
|
140
|
+
setUrl: (value: string) => void;
|
|
141
|
+
pickStart: (value: string) => void;
|
|
142
|
+
togglePreset: (id: string) => void;
|
|
143
|
+
setOwnPage: (checked: boolean) => void;
|
|
144
|
+
pickPageTemplate: (value: string) => void;
|
|
145
|
+
pickWrap: (value: string) => void;
|
|
146
|
+
pickComponentStart: (value: string) => void;
|
|
147
|
+
pickCopy: (value: string) => void;
|
|
148
|
+
pickCollection: (value: string) => void;
|
|
149
|
+
pickLocale: (value: string) => void;
|
|
150
|
+
setLocalized: (checked: boolean) => void;
|
|
151
|
+
/**
|
|
152
|
+
* The file picker settled. The ELEMENT rather than its list, because a file input that is not
|
|
153
|
+
* cleared refuses the same file twice, and the input is this document's own control.
|
|
154
|
+
*/
|
|
155
|
+
choose: (input: HTMLInputElement) => void;
|
|
156
|
+
drop: (files: FileList | null) => void;
|
|
157
|
+
dragOver: () => void;
|
|
158
|
+
dragOut: () => void;
|
|
159
|
+
/** The dialog closed, for any reason the platform owns as well as the flow's own `close`. */
|
|
160
|
+
closed: () => void;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export interface AddNewSurfaceOptions {
|
|
164
|
+
/** Where the dialog is mounted — the dialog layer, handed in so this module never reaches back. */
|
|
165
|
+
layer: HTMLElement;
|
|
166
|
+
view: AddNewView;
|
|
167
|
+
actions: AddNewActions;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export interface AddNewSurfaceHandle {
|
|
171
|
+
host: HTMLElement;
|
|
172
|
+
/** Resolves with the `jx-dialog` element once it has rendered and been opened. */
|
|
173
|
+
ready: Promise<HTMLElement>;
|
|
174
|
+
/** Redraw from the flow's current view. */
|
|
175
|
+
update: (view: AddNewView) => void;
|
|
176
|
+
/** Close the dialog (the platform restores focus) and dispose the document. Idempotent. */
|
|
177
|
+
close: () => void;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** What the document branches on. Derived, never handed in. */
|
|
181
|
+
interface AddNewFlags {
|
|
182
|
+
/** Every kind but Media has a name. */
|
|
183
|
+
named: boolean;
|
|
184
|
+
invalid: boolean;
|
|
185
|
+
blocked: boolean;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
type AddNewScope = AddNewView &
|
|
189
|
+
AddNewFlags &
|
|
190
|
+
Omit<AddNewActions, "setName" | "closed"> & {
|
|
191
|
+
setName: (value: string) => void;
|
|
192
|
+
closed: () => void;
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
/** The view plus the flags the document renders from. */
|
|
196
|
+
function derive(view: AddNewView): AddNewView & AddNewFlags {
|
|
197
|
+
return {
|
|
198
|
+
...view,
|
|
199
|
+
blocked: !view.canConfirm,
|
|
200
|
+
invalid: view.error !== "",
|
|
201
|
+
named: view.kind !== "media",
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/** Open the dialog. The handle's `ready` resolves once it is showing. */
|
|
206
|
+
export function openAddNewSurface(options: AddNewSurfaceOptions): AddNewSurfaceHandle {
|
|
207
|
+
const slot = document.createElement("div");
|
|
208
|
+
/* The layer is `pointer-events: none` so a click passes through it when nothing is up, and every
|
|
209
|
+
slot in it turns them back on for its own content. `pointer-events` INHERITS, and the top layer
|
|
210
|
+
changes paint order rather than inheritance, so a modal `<dialog>` in a slot that skipped this
|
|
211
|
+
is painted above everything and hit-tests to nothing. */
|
|
212
|
+
slot.style.pointerEvents = "auto";
|
|
213
|
+
slot.setAttribute(REGION_ATTR, overlayRegion("dialog", "add-new"));
|
|
214
|
+
options.layer.append(slot);
|
|
215
|
+
|
|
216
|
+
let closed = false;
|
|
217
|
+
/** Say it is over, once: the platform's own `close` and `close()` may each be first. */
|
|
218
|
+
const finish = (): void => {
|
|
219
|
+
if (closed) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
closed = true;
|
|
223
|
+
options.actions.closed();
|
|
224
|
+
};
|
|
225
|
+
const isClosed = (): boolean => closed;
|
|
226
|
+
|
|
227
|
+
const { actions } = options;
|
|
228
|
+
const scope: AddNewScope = reactive<AddNewScope>({
|
|
229
|
+
...derive(options.view),
|
|
230
|
+
choose: actions.choose,
|
|
231
|
+
closed: finish,
|
|
232
|
+
confirm: actions.confirm,
|
|
233
|
+
dragOut: actions.dragOut,
|
|
234
|
+
dragOver: actions.dragOver,
|
|
235
|
+
drop: actions.drop,
|
|
236
|
+
pickCollection: actions.pickCollection,
|
|
237
|
+
pickComponentStart: actions.pickComponentStart,
|
|
238
|
+
pickCopy: actions.pickCopy,
|
|
239
|
+
pickKind: actions.pickKind,
|
|
240
|
+
pickLocale: actions.pickLocale,
|
|
241
|
+
pickPageTemplate: actions.pickPageTemplate,
|
|
242
|
+
pickStart: actions.pickStart,
|
|
243
|
+
pickWrap: actions.pickWrap,
|
|
244
|
+
setName: (value: string) => {
|
|
245
|
+
/* What the control holds, first and unconditionally. A binding only writes when the scope
|
|
246
|
+
CHANGES, so a surface that did not echo the raw value would leave the field showing text
|
|
247
|
+
the scope does not have (`studio-ui-guidelines.md` §9.3). */
|
|
248
|
+
scope.name = value;
|
|
249
|
+
actions.setName(value);
|
|
250
|
+
},
|
|
251
|
+
setLocalized: actions.setLocalized,
|
|
252
|
+
setOwnPage: actions.setOwnPage,
|
|
253
|
+
setUrl: (value: string) => {
|
|
254
|
+
scope.url = value;
|
|
255
|
+
actions.setUrl(value);
|
|
256
|
+
},
|
|
257
|
+
toggleUrl: actions.toggleUrl,
|
|
258
|
+
togglePreset: actions.togglePreset,
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
let mounted: SurfaceHandle | null = null;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Put the caret in the name field, selected.
|
|
265
|
+
*
|
|
266
|
+
* On open only: the name is the only thing the dialog requires, so it is where the reader is
|
|
267
|
+
* about to type. A focus move is the one thing a surface may reach into its document for (`ui.md`
|
|
268
|
+
* §2 rule 5).
|
|
269
|
+
*/
|
|
270
|
+
const focusName = (): void => {
|
|
271
|
+
setTimeout(() => {
|
|
272
|
+
const root = mounted?.root;
|
|
273
|
+
if (closed || !(root instanceof HTMLElement)) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const control = root.querySelector<HTMLElement>('jx-textfield[part="name"]');
|
|
277
|
+
if (control) {
|
|
278
|
+
selectValue(control, "all");
|
|
279
|
+
}
|
|
280
|
+
}, 0);
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
const ready = mountSurface("add-new", scope, slot).then(async (surface) => {
|
|
284
|
+
mounted = surface;
|
|
285
|
+
/* SAFETY: `add-new.json`'s root definition is a `jx-dialog` element, so the runtime mounts an
|
|
286
|
+
HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
|
|
287
|
+
const element = surface.root as HTMLElement;
|
|
288
|
+
if (isClosed()) {
|
|
289
|
+
surface.dispose();
|
|
290
|
+
return element;
|
|
291
|
+
}
|
|
292
|
+
await whenReady(element);
|
|
293
|
+
if (isClosed()) {
|
|
294
|
+
return element;
|
|
295
|
+
}
|
|
296
|
+
showModal(element);
|
|
297
|
+
if (scope.named) {
|
|
298
|
+
focusName();
|
|
299
|
+
}
|
|
300
|
+
return element;
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
return {
|
|
304
|
+
close() {
|
|
305
|
+
/* Idempotent line by line rather than guarded on `closed`: the platform's own `close` runs
|
|
306
|
+
`finish()` first, and a guard would leave this slot behind in the layer. */
|
|
307
|
+
const element = mounted?.root;
|
|
308
|
+
if (element instanceof HTMLElement) {
|
|
309
|
+
close(element);
|
|
310
|
+
}
|
|
311
|
+
mounted?.dispose();
|
|
312
|
+
mounted = null;
|
|
313
|
+
slot.remove();
|
|
314
|
+
finish();
|
|
315
|
+
},
|
|
316
|
+
host: slot,
|
|
317
|
+
ready,
|
|
318
|
+
update(view) {
|
|
319
|
+
/* Never a focus move here. A kind switch from the keyboard is an arrow key inside the kinds
|
|
320
|
+
radiogroup, and pulling the caret into the name field would end the walk after one step;
|
|
321
|
+
the name keeps its value across kinds and Tab reaches it next. */
|
|
322
|
+
Object.assign(scope, derive(view));
|
|
323
|
+
},
|
|
324
|
+
};
|
|
325
|
+
}
|
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;
|
|
@@ -519,8 +514,8 @@ export function mountAiChatSurface(
|
|
|
519
514
|
}
|
|
520
515
|
}
|
|
521
516
|
|
|
522
|
-
/* There is no `connected()` here, where `
|
|
523
|
-
|
|
517
|
+
/* There is no `connected()` here, where `panel-stylebook-layers.ts` has one. That one mounts
|
|
518
|
+
into a node LIT repaints, so "is my root still where I put it" is a
|
|
524
519
|
live question. The assistant's container is built once for the life of the window
|
|
525
520
|
(`right-panel.ts`'s `_ensureContainers`) and nothing else ever writes into it, so the answer
|
|
526
521
|
would be a constant — and a constant nobody reads is a second thing to keep in step. */
|
|
@@ -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;
|