@jxsuite/studio 6.1.1 → 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-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
- 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-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
- 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-1q1sh2ax.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-h46vtzk8.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-rv11kfwa.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-8grwxtqk.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-pre0skq6.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-vrmcjf9g.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-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-kggey1jt.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-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
- 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-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
- 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 +97 -97
- package/package.json +6 -6
- 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 +62 -41
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +90 -49
- 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 +135 -96
- 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-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 +12 -16
- package/src/canvas/iframe-render.ts +36 -34
- 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/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +7 -7
- 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 +32 -20
- 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 +3 -0
- 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 +52 -21
- 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 +218 -205
- 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 +129 -117
- 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 +25 -75
- 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 +19 -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.ts +13 -13
- 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/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 +73 -73
- 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 +40 -36
- 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/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-t6b6qe31.js +0 -5
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- 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-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/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
|
@@ -10,15 +10,16 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import { updateWranglerConfig } from "@jxsuite/create/scaffold";
|
|
13
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
13
14
|
import type { DeployConfig, ProjectConfig } from "@jxsuite/schema/types";
|
|
15
|
+
import type { CfAccountSummary } from "../types";
|
|
14
16
|
import { getPlatform } from "../platform";
|
|
15
17
|
import { actIfRequired } from "../account/action-flow";
|
|
16
18
|
import { updateSiteConfig } from "../site-context";
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
20
|
+
/* A Cloudflare account the connected token can reach is the platform's `CfAccountSummary` row;
|
|
21
|
+
`CfAccount` stays this module's name for it. */
|
|
22
|
+
export type { CfAccountSummary as CfAccount } from "../types";
|
|
22
23
|
|
|
23
24
|
export interface PagesDeploymentInfo {
|
|
24
25
|
id: string;
|
|
@@ -52,7 +53,7 @@ export function platformSupportsPublish(): boolean {
|
|
|
52
53
|
// Publishing is not available yet. "Can this host publish?" has a truthful answer before the host
|
|
53
54
|
// Exists, and it is no.
|
|
54
55
|
try {
|
|
55
|
-
return
|
|
56
|
+
return isFunction(getPlatform().cfApi);
|
|
56
57
|
} catch {
|
|
57
58
|
return false;
|
|
58
59
|
}
|
|
@@ -69,6 +70,8 @@ async function cfApi<T>(path: string, init?: { method?: string; body?: unknown }
|
|
|
69
70
|
throw new Error("This platform cannot reach the Cloudflare API");
|
|
70
71
|
}
|
|
71
72
|
try {
|
|
73
|
+
/* SAFETY: every adapter's cfApi resolves to the Cloudflare v4 envelope's `result`, unvalidated,
|
|
74
|
+
and each caller names the shape Cloudflare documents for the endpoint it calls. */
|
|
72
75
|
return (await api(path, init)) as T;
|
|
73
76
|
} catch (error) {
|
|
74
77
|
void actIfRequired(error);
|
|
@@ -76,8 +79,8 @@ async function cfApi<T>(path: string, init?: { method?: string; body?: unknown }
|
|
|
76
79
|
}
|
|
77
80
|
}
|
|
78
81
|
|
|
79
|
-
export async function listAccounts(): Promise<
|
|
80
|
-
return cfApi<
|
|
82
|
+
export async function listAccounts(): Promise<CfAccountSummary[]> {
|
|
83
|
+
return cfApi<CfAccountSummary[]>("/accounts");
|
|
81
84
|
}
|
|
82
85
|
|
|
83
86
|
interface PagesProjectWire {
|
|
@@ -104,16 +107,19 @@ export async function getPagesProject(
|
|
|
104
107
|
* with an install hint.
|
|
105
108
|
*/
|
|
106
109
|
export async function createPagesProject(opts: ConnectOptions): Promise<PagesProjectWire> {
|
|
110
|
+
const buildConfig: PagesBuildConfigWire = {
|
|
111
|
+
build_command: "bunx jx build",
|
|
112
|
+
destination_dir: "dist",
|
|
113
|
+
};
|
|
114
|
+
if (opts.rootDir) {
|
|
115
|
+
buildConfig.root_dir = opts.rootDir;
|
|
116
|
+
}
|
|
107
117
|
return cfApi<PagesProjectWire>(`/accounts/${opts.accountId}/pages/projects`, {
|
|
108
118
|
method: "POST",
|
|
109
119
|
body: {
|
|
110
120
|
name: opts.projectName,
|
|
111
121
|
production_branch: opts.productionBranch,
|
|
112
|
-
build_config:
|
|
113
|
-
build_command: "bunx jx build",
|
|
114
|
-
destination_dir: "dist",
|
|
115
|
-
...(opts.rootDir ? { root_dir: opts.rootDir } : {}),
|
|
116
|
-
},
|
|
122
|
+
build_config: buildConfig,
|
|
117
123
|
source: {
|
|
118
124
|
type: "github",
|
|
119
125
|
config: {
|
|
@@ -127,6 +133,13 @@ export async function createPagesProject(opts: ConnectOptions): Promise<PagesPro
|
|
|
127
133
|
});
|
|
128
134
|
}
|
|
129
135
|
|
|
136
|
+
/** The `build_config` Cloudflare stores on a GitHub-connected Pages project. */
|
|
137
|
+
interface PagesBuildConfigWire {
|
|
138
|
+
build_command: string;
|
|
139
|
+
destination_dir: string;
|
|
140
|
+
root_dir?: string;
|
|
141
|
+
}
|
|
142
|
+
|
|
130
143
|
interface DeploymentWire {
|
|
131
144
|
id: string;
|
|
132
145
|
url: string;
|
|
@@ -205,8 +218,10 @@ export async function connectDeploy(
|
|
|
205
218
|
provider: "cloudflare-pages",
|
|
206
219
|
accountId: opts.accountId,
|
|
207
220
|
projectName: opts.projectName,
|
|
208
|
-
...(project.subdomain ? { productionUrl: `https://${project.subdomain}` } : {}),
|
|
209
221
|
};
|
|
222
|
+
if (project.subdomain) {
|
|
223
|
+
deploy.productionUrl = `https://${project.subdomain}`;
|
|
224
|
+
}
|
|
210
225
|
await writeDeployConfig(config, deploy);
|
|
211
226
|
return deploy;
|
|
212
227
|
}
|
|
@@ -70,10 +70,11 @@ export async function runDeploy(
|
|
|
70
70
|
options: { attempts?: number; delayMs?: number } = {},
|
|
71
71
|
): Promise<boolean> {
|
|
72
72
|
const deploy = currentDeploy();
|
|
73
|
-
|
|
73
|
+
// Aborted by the activity's Cancel; the poll loop checks it between attempts.
|
|
74
|
+
const cancellation = new AbortController();
|
|
74
75
|
const activity = beginActivity({
|
|
75
76
|
cancel: () => {
|
|
76
|
-
|
|
77
|
+
cancellation.abort();
|
|
77
78
|
},
|
|
78
79
|
source: "Publish",
|
|
79
80
|
status: "Starting…",
|
|
@@ -104,7 +105,7 @@ export async function runDeploy(
|
|
|
104
105
|
const attempts = options.attempts ?? DEPLOY_POLL.attempts;
|
|
105
106
|
const delayMs = options.delayMs ?? DEPLOY_POLL.delayMs;
|
|
106
107
|
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
107
|
-
if (
|
|
108
|
+
if (cancellation.signal.aborted) {
|
|
108
109
|
return false;
|
|
109
110
|
}
|
|
110
111
|
let info;
|
|
@@ -123,7 +124,7 @@ export async function runDeploy(
|
|
|
123
124
|
}
|
|
124
125
|
await sleep(delayMs);
|
|
125
126
|
}
|
|
126
|
-
if (
|
|
127
|
+
if (cancellation.signal.aborted) {
|
|
127
128
|
return false;
|
|
128
129
|
}
|
|
129
130
|
noteDeployment(null);
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* @docs studio/publish/cloudflare
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
30
31
|
import type { DeployConfig, ProjectConfig } from "@jxsuite/schema/types";
|
|
31
32
|
import { activeRegistry } from "../commands/active-registry";
|
|
32
33
|
import { currentDeploy, noteDeployment } from "./deploy-checklist";
|
|
@@ -39,7 +40,7 @@ import { layerHost } from "../ui/layers";
|
|
|
39
40
|
import { normalizeProjectDir } from "../utils/project-dir";
|
|
40
41
|
import { openPublishSurface } from "../surfaces/publish";
|
|
41
42
|
import type { PublishForm, PublishSurfaceHandle, PublishView } from "../surfaces/publish";
|
|
42
|
-
import type { CfAccount, PagesDeploymentInfo } from "./pages-service";
|
|
43
|
+
import type { CfAccount, ConnectOptions, PagesDeploymentInfo } from "./pages-service";
|
|
43
44
|
import {
|
|
44
45
|
connectDeploy,
|
|
45
46
|
latestDeployment,
|
|
@@ -59,7 +60,7 @@ let _replacing = false;
|
|
|
59
60
|
let _form: PublishForm = { accountId: "", branch: "main", owner: "", projectName: "", repo: "" };
|
|
60
61
|
|
|
61
62
|
function currentConfig(): ProjectConfig | null {
|
|
62
|
-
return
|
|
63
|
+
return projectState?.projectConfig ?? null;
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
function deriveSlug(name: string): string {
|
|
@@ -122,7 +123,7 @@ function viewOf(): PublishView {
|
|
|
122
123
|
error: _error,
|
|
123
124
|
form: { ..._form },
|
|
124
125
|
// Asked only of a host that answered `true` above, which is the one that is known to exist.
|
|
125
|
-
hosted: supported &&
|
|
126
|
+
hosted: supported && isFunction(getPlatform().cfConnect),
|
|
126
127
|
lapsed: connection?.connected === true && connection.needsReconnect === true,
|
|
127
128
|
loading: _connection === "loading",
|
|
128
129
|
replacing: _replacing,
|
|
@@ -270,14 +271,17 @@ async function submitConnect(): Promise<void> {
|
|
|
270
271
|
paint();
|
|
271
272
|
try {
|
|
272
273
|
const rootDir = projectFolder();
|
|
273
|
-
const
|
|
274
|
+
const options: ConnectOptions = {
|
|
274
275
|
accountId: _form.accountId,
|
|
275
276
|
owner: _form.owner,
|
|
276
277
|
productionBranch: _form.branch || "main",
|
|
277
278
|
projectName: _form.projectName,
|
|
278
279
|
repo: _form.repo,
|
|
279
|
-
|
|
280
|
-
|
|
280
|
+
};
|
|
281
|
+
if (rootDir) {
|
|
282
|
+
options.rootDir = rootDir;
|
|
283
|
+
}
|
|
284
|
+
const deploy = await connectDeploy(config, options);
|
|
281
285
|
_deployment = await latestDeployment(deploy).catch(() => null);
|
|
282
286
|
} catch (error) {
|
|
283
287
|
_error = error instanceof Error ? error.message : String(error);
|
package/src/recent-projects.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
import { getPlatform, hasPlatform } from "./platform";
|
|
3
3
|
import { now } from "./services/clock";
|
|
4
|
-
import type { RecentProjectEntry } from "./types";
|
|
4
|
+
import type { RecentProjectEntry, StudioPlatform } from "./types";
|
|
5
5
|
|
|
6
6
|
interface RecentFile {
|
|
7
7
|
path: string;
|
|
@@ -33,9 +33,7 @@ function backend(): StudioRecentStore | null {
|
|
|
33
33
|
return null;
|
|
34
34
|
}
|
|
35
35
|
const platform = getPlatform();
|
|
36
|
-
return platform
|
|
37
|
-
? (platform as StudioRecentStore)
|
|
38
|
-
: null;
|
|
36
|
+
return isRecentStore(platform) ? platform : null;
|
|
39
37
|
}
|
|
40
38
|
|
|
41
39
|
interface StudioRecentStore {
|
|
@@ -43,14 +41,21 @@ interface StudioRecentStore {
|
|
|
43
41
|
saveRecentProjects: (projects: RecentProjectEntry[]) => Promise<void>;
|
|
44
42
|
}
|
|
45
43
|
|
|
44
|
+
/** True when the platform implements both halves of the optional recent-projects store. */
|
|
45
|
+
function isRecentStore(platform: StudioPlatform): platform is StudioPlatform & StudioRecentStore {
|
|
46
|
+
return Boolean(platform.getRecentProjects && platform.saveRecentProjects);
|
|
47
|
+
}
|
|
48
|
+
|
|
46
49
|
function loadFromLocalStorage(): RecentProjectEntry[] {
|
|
47
50
|
try {
|
|
48
51
|
const raw = localStorage.getItem(STORAGE_KEY);
|
|
49
52
|
if (!raw) {
|
|
50
53
|
return [];
|
|
51
54
|
}
|
|
52
|
-
const parsed = JSON.parse(raw)
|
|
53
|
-
|
|
55
|
+
const parsed: unknown = JSON.parse(raw);
|
|
56
|
+
/* SAFETY: STORAGE_KEY is written only by this module, as JSON.stringify of a
|
|
57
|
+
RecentProjectEntry[]; the Array.isArray check discards any other value found under it. */
|
|
58
|
+
return Array.isArray(parsed) ? (parsed as RecentProjectEntry[]) : [];
|
|
54
59
|
} catch {
|
|
55
60
|
return [];
|
|
56
61
|
}
|
|
@@ -132,8 +137,10 @@ function loadRecentFiles(): RecentFile[] {
|
|
|
132
137
|
if (!raw) {
|
|
133
138
|
return [];
|
|
134
139
|
}
|
|
135
|
-
const parsed = JSON.parse(raw)
|
|
136
|
-
|
|
140
|
+
const parsed: unknown = JSON.parse(raw);
|
|
141
|
+
/* SAFETY: FILES_STORAGE_KEY is written only by trackRecentFile below, as JSON.stringify of a
|
|
142
|
+
RecentFile[]; the Array.isArray check discards any other value found under it. */
|
|
143
|
+
return Array.isArray(parsed) ? (parsed as RecentFile[]) : [];
|
|
137
144
|
} catch {
|
|
138
145
|
return [];
|
|
139
146
|
}
|
package/src/resize-edges.ts
CHANGED
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
2
|
+
import { isFunction, isNonNullObject } from "@jxsuite/schema/guards";
|
|
3
|
+
import type { SerializableRect } from "./canvas/iframe-protocol";
|
|
4
|
+
|
|
5
|
+
/** The desktop shell's frame controls; only desktop adapters add them to the platform. */
|
|
6
|
+
interface ResizeWindowControls {
|
|
7
|
+
getFrame: () => Promise<SerializableRect>;
|
|
8
|
+
setFrame: (x: number, y: number, w: number, h: number) => void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** True when `value` is a windowControls object that can at least read the window frame. */
|
|
12
|
+
function isResizeWindowControls(value: unknown): value is ResizeWindowControls {
|
|
13
|
+
return isNonNullObject(value) && "getFrame" in value && isFunction(value.getFrame);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** The registered platform's window controls, when it is a desktop shell that exposes them. */
|
|
17
|
+
function readWindowControls(): ResizeWindowControls | undefined {
|
|
18
|
+
const platform = globalThis.__jxPlatform;
|
|
19
|
+
if (platform == null || !("windowControls" in platform)) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const controls = platform.windowControls;
|
|
23
|
+
return isResizeWindowControls(controls) ? controls : undefined;
|
|
24
|
+
}
|
|
15
25
|
|
|
16
26
|
const EDGES = [
|
|
17
27
|
"top",
|
|
@@ -30,8 +40,8 @@ const MIN_HEIGHT = 300;
|
|
|
30
40
|
let mounted = false;
|
|
31
41
|
|
|
32
42
|
export function mountResizeEdges() {
|
|
33
|
-
const wc =
|
|
34
|
-
if (!wc ||
|
|
43
|
+
const wc = readWindowControls();
|
|
44
|
+
if (!wc || mounted) {
|
|
35
45
|
return;
|
|
36
46
|
}
|
|
37
47
|
mounted = true;
|
|
@@ -49,27 +59,7 @@ export function mountResizeEdges() {
|
|
|
49
59
|
document.body.append(container);
|
|
50
60
|
}
|
|
51
61
|
|
|
52
|
-
|
|
53
|
-
* @param {MouseEvent} e
|
|
54
|
-
* @param {string} edge
|
|
55
|
-
* @param {{
|
|
56
|
-
* getFrame: () => Promise<{ x: number; y: number; width: number; height: number }>;
|
|
57
|
-
* setFrame: (x: number, y: number, w: number, h: number) => void;
|
|
58
|
-
* }} wc
|
|
59
|
-
*/
|
|
60
|
-
async function startResize(
|
|
61
|
-
e: MouseEvent,
|
|
62
|
-
edge: string,
|
|
63
|
-
wc: {
|
|
64
|
-
getFrame: () => Promise<{
|
|
65
|
-
x: number;
|
|
66
|
-
y: number;
|
|
67
|
-
width: number;
|
|
68
|
-
height: number;
|
|
69
|
-
}>;
|
|
70
|
-
setFrame: (x: number, y: number, w: number, h: number) => void;
|
|
71
|
-
},
|
|
72
|
-
) {
|
|
62
|
+
async function startResize(e: MouseEvent, edge: string, wc: ResizeWindowControls) {
|
|
73
63
|
e.preventDefault();
|
|
74
64
|
e.stopPropagation();
|
|
75
65
|
|
|
@@ -38,8 +38,10 @@
|
|
|
38
38
|
import { activeTab } from "../workspace/workspace";
|
|
39
39
|
import { clearProblems, notify, problemFindings } from "./notify";
|
|
40
40
|
import { findA11yDefects } from "@jxsuite/schema/a11y";
|
|
41
|
+
import { isNonNullObject, isNumber, isString } from "@jxsuite/schema/guards";
|
|
42
|
+
import type { NotifyOptions } from "./notify";
|
|
41
43
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
42
|
-
import type { JxElement } from "@jxsuite/schema/types";
|
|
44
|
+
import type { JxAttributeValue, JxElement } from "@jxsuite/schema/types";
|
|
43
45
|
|
|
44
46
|
/** WCAG success criteria these checks bind to, by the id ATAG B.3.1 asks a report to carry. */
|
|
45
47
|
export type A11yCriterion =
|
|
@@ -113,14 +115,14 @@ const VAGUE_LINK_TEXT = new Set([
|
|
|
113
115
|
]);
|
|
114
116
|
|
|
115
117
|
/** The attribute bag, whatever shape the author wrote it in. */
|
|
116
|
-
function attrs(node: JxElement): Record<string,
|
|
117
|
-
return
|
|
118
|
+
function attrs(node: JxElement): Record<string, JxAttributeValue> {
|
|
119
|
+
return node.attributes ?? {};
|
|
118
120
|
}
|
|
119
121
|
|
|
120
122
|
/** An attribute's literal string value, or null when it is absent or a binding. */
|
|
121
123
|
function literal(node: JxElement, name: string): string | null {
|
|
122
124
|
const value = attrs(node)[name];
|
|
123
|
-
return
|
|
125
|
+
return isString(value) ? value : null;
|
|
124
126
|
}
|
|
125
127
|
|
|
126
128
|
/** Whether an attribute is present at all, however it was written. */
|
|
@@ -131,15 +133,15 @@ function has(node: JxElement, name: string): boolean {
|
|
|
131
133
|
/** The element's own text, when it is a literal rather than a binding. */
|
|
132
134
|
function ownText(node: JxElement): string {
|
|
133
135
|
const parts: string[] = [];
|
|
134
|
-
if (
|
|
136
|
+
if (isString(node.textContent)) {
|
|
135
137
|
parts.push(node.textContent);
|
|
136
138
|
}
|
|
137
139
|
const { children } = node;
|
|
138
140
|
if (Array.isArray(children)) {
|
|
139
141
|
for (const child of children) {
|
|
140
|
-
if (
|
|
142
|
+
if (isString(child)) {
|
|
141
143
|
parts.push(child);
|
|
142
|
-
} else if (child
|
|
144
|
+
} else if (isNonNullObject(child)) {
|
|
143
145
|
parts.push(ownText(child));
|
|
144
146
|
}
|
|
145
147
|
}
|
|
@@ -158,13 +160,13 @@ function* walk(node: JxElement): Generator<JxElement> {
|
|
|
158
160
|
const { children } = node;
|
|
159
161
|
if (Array.isArray(children)) {
|
|
160
162
|
for (const child of children) {
|
|
161
|
-
if (child
|
|
163
|
+
if (isNonNullObject(child)) {
|
|
162
164
|
yield* walk(child);
|
|
163
165
|
}
|
|
164
166
|
}
|
|
165
167
|
}
|
|
166
168
|
for (const branch of Object.values(node.cases ?? {})) {
|
|
167
|
-
if (branch
|
|
169
|
+
if (isNonNullObject(branch)) {
|
|
168
170
|
yield* walk(branch);
|
|
169
171
|
}
|
|
170
172
|
}
|
|
@@ -177,7 +179,7 @@ function hasAccessibleName(node: JxElement): boolean {
|
|
|
177
179
|
literal(node, "aria-labelledby") !== null ||
|
|
178
180
|
has(node, "aria-label") ||
|
|
179
181
|
has(node, "aria-labelledby") ||
|
|
180
|
-
(
|
|
182
|
+
(isString(node.title) && node.title !== "") ||
|
|
181
183
|
ownText(node) !== ""
|
|
182
184
|
);
|
|
183
185
|
}
|
|
@@ -197,7 +199,7 @@ export function checkDocument(doc: JxElement): A11yFinding[] {
|
|
|
197
199
|
|
|
198
200
|
for (const node of walk(doc)) {
|
|
199
201
|
index += 1;
|
|
200
|
-
const tag =
|
|
202
|
+
const tag = isString(node.tagName) ? node.tagName.toLowerCase() : "";
|
|
201
203
|
const where = tag === "" ? `element ${index}` : `<${tag}>`;
|
|
202
204
|
|
|
203
205
|
// ── 1.1.1 Non-text Content ────────────────────────────────────────────────
|
|
@@ -308,7 +310,7 @@ export function checkDocument(doc: JxElement): A11yFinding[] {
|
|
|
308
310
|
}
|
|
309
311
|
|
|
310
312
|
// ── 2.4.3 Focus Order — a positive tabindex reorders the whole page ──────
|
|
311
|
-
if (
|
|
313
|
+
if (isNumber(node.tabIndex) && node.tabIndex > 0) {
|
|
312
314
|
findings.push({
|
|
313
315
|
criterion: "1.3.1",
|
|
314
316
|
detail:
|
|
@@ -322,7 +324,7 @@ export function checkDocument(doc: JxElement): A11yFinding[] {
|
|
|
322
324
|
}
|
|
323
325
|
|
|
324
326
|
// ── 4.1.1 Parsing — a duplicate id breaks every reference to it ──────────
|
|
325
|
-
if (
|
|
327
|
+
if (isString(node.id) && node.id !== "") {
|
|
326
328
|
const seen = seenIds.get(node.id);
|
|
327
329
|
if (seen !== undefined) {
|
|
328
330
|
findings.push({
|
|
@@ -354,7 +356,7 @@ export function checkDocument(doc: JxElement): A11yFinding[] {
|
|
|
354
356
|
}
|
|
355
357
|
|
|
356
358
|
// ── 3.1.1 Language of Page ────────────────────────────────────────────────
|
|
357
|
-
if (
|
|
359
|
+
if (!isString(doc.lang) || doc.lang === "") {
|
|
358
360
|
findings.push({
|
|
359
361
|
criterion: "3.1.1",
|
|
360
362
|
detail:
|
|
@@ -370,7 +372,7 @@ export function checkDocument(doc: JxElement): A11yFinding[] {
|
|
|
370
372
|
// The structural rules, from the engine every judge of a Jx document shares.
|
|
371
373
|
for (const defect of findA11yDefects(doc)) {
|
|
372
374
|
findings.push({
|
|
373
|
-
criterion: defect.criterion
|
|
375
|
+
criterion: defect.criterion,
|
|
374
376
|
detail: defect.detail,
|
|
375
377
|
id: `${defect.rule}:${defect.path.join("/")}`,
|
|
376
378
|
message: defect.message,
|
|
@@ -457,14 +459,19 @@ export function reportA11yProblems(doc: JxElement, path?: string): number {
|
|
|
457
459
|
clearProblems((record) => record.source === A11Y_PROBLEM_SOURCE);
|
|
458
460
|
const findings = checkDocument(doc);
|
|
459
461
|
for (const finding of findings) {
|
|
460
|
-
|
|
462
|
+
const options: NotifyOptions = {
|
|
461
463
|
detail: `WCAG ${finding.criterion} — ${finding.detail}`,
|
|
462
464
|
key: `a11y.${finding.id}`,
|
|
463
465
|
source: A11Y_PROBLEM_SOURCE,
|
|
464
466
|
tier: "problem",
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
467
|
+
};
|
|
468
|
+
if (finding.action !== undefined) {
|
|
469
|
+
options.action = finding.action;
|
|
470
|
+
}
|
|
471
|
+
if (path !== undefined) {
|
|
472
|
+
options.path = path;
|
|
473
|
+
}
|
|
474
|
+
notify(finding.severity, finding.message, options);
|
|
468
475
|
}
|
|
469
476
|
/*
|
|
470
477
|
* And then the honest half. A report that lists nothing reads as "this page is accessible", which
|
|
@@ -10,11 +10,19 @@
|
|
|
10
10
|
* @license MIT
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
import { isJsonObject, isNumber, isString } from "@jxsuite/schema/guards";
|
|
14
|
+
import type { JsonValue } from "@jxsuite/schema/types";
|
|
15
|
+
|
|
13
16
|
const PENDING_PROMPT_PREFIX = "jx.ai.pendingAgentPrompt";
|
|
14
17
|
|
|
15
18
|
/** Entries older than this are considered stale and dropped on read. */
|
|
16
19
|
const MAX_AGE_MS = 15 * 60 * 1000;
|
|
17
20
|
|
|
21
|
+
/** `localStorage`, or `undefined` on a host that has none (a worker, a test run without a DOM). */
|
|
22
|
+
function storage(): Storage | undefined {
|
|
23
|
+
return typeof localStorage === "undefined" ? undefined : localStorage;
|
|
24
|
+
}
|
|
25
|
+
|
|
18
26
|
function storageKey(root: string) {
|
|
19
27
|
return `${PENDING_PROMPT_PREFIX}:${root}`;
|
|
20
28
|
}
|
|
@@ -27,21 +35,25 @@ function storageKey(root: string) {
|
|
|
27
35
|
*/
|
|
28
36
|
function readEntry(root: string): { prompt: string; ts: number } | null {
|
|
29
37
|
try {
|
|
30
|
-
const raw =
|
|
38
|
+
const raw = storage()?.getItem(storageKey(root));
|
|
31
39
|
if (!raw) {
|
|
32
40
|
return null;
|
|
33
41
|
}
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
// SAFETY: `JSON.parse` without a reviver yields nothing but JSON values.
|
|
43
|
+
const parsed = JSON.parse(raw) as JsonValue;
|
|
44
|
+
if (parsed === null) {
|
|
45
|
+
/* A stored JSON `null` reads as "no entry" but is left in place rather than dropped as
|
|
46
|
+
malformed, matching how this reader has always treated it. */
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
const prompt = isJsonObject(parsed) ? parsed.prompt : undefined;
|
|
50
|
+
const ts = isJsonObject(parsed) ? parsed.ts : undefined;
|
|
51
|
+
if (!isString(prompt) || !isNumber(ts) || !(Date.now() - ts <= MAX_AGE_MS)) {
|
|
40
52
|
// Stale or malformed — remove so it never seeds a later session.
|
|
41
|
-
|
|
53
|
+
storage()?.removeItem(storageKey(root));
|
|
42
54
|
return null;
|
|
43
55
|
}
|
|
44
|
-
return { prompt
|
|
56
|
+
return { prompt, ts };
|
|
45
57
|
} catch {
|
|
46
58
|
return null;
|
|
47
59
|
}
|
|
@@ -55,7 +67,7 @@ function readEntry(root: string): { prompt: string; ts: number } | null {
|
|
|
55
67
|
*/
|
|
56
68
|
export function setPendingAgentPrompt(root: string, prompt: string): void {
|
|
57
69
|
try {
|
|
58
|
-
|
|
70
|
+
storage()?.setItem(storageKey(root), JSON.stringify({ prompt, ts: Date.now() }));
|
|
59
71
|
} catch {
|
|
60
72
|
/* LocalStorage unavailable — the prompt is simply not handed off. */
|
|
61
73
|
}
|
|
@@ -83,7 +95,7 @@ export function consumePendingAgentPrompt(root: string): string | null {
|
|
|
83
95
|
return null;
|
|
84
96
|
}
|
|
85
97
|
try {
|
|
86
|
-
|
|
98
|
+
storage()?.removeItem(storageKey(root));
|
|
87
99
|
} catch {
|
|
88
100
|
/* LocalStorage unavailable — nothing to delete. */
|
|
89
101
|
}
|
package/src/services/ai-ask.ts
CHANGED
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
*
|
|
13
13
|
* - **A skip is a SUCCESS.** "You decide" is a real answer to a question; only a stopped turn is a
|
|
14
14
|
* failure. Reporting a skip as an error would make the model apologise for having asked.
|
|
15
|
-
* - **The answer never becomes a user message.** `toMessagesArray` serialises the array verbatim
|
|
16
|
-
*
|
|
15
|
+
* - **The answer never becomes a user message.** `toMessagesArray` serialises the array verbatim and
|
|
16
|
+
* a provider requires a `tool` reply to follow its `tool_calls` request; a user turn spliced
|
|
17
17
|
* between them is a 400. The answer travels as the tool result, and the chat view renders it into
|
|
18
18
|
* the question's own chip.
|
|
19
19
|
*
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
26
|
import { createToolDefinition, toolError, toolSuccess } from "@jxsuite/ai/tools";
|
|
27
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
27
28
|
import { reactive } from "../reactivity";
|
|
28
29
|
|
|
29
30
|
import type { ToolRegistry } from "@jxsuite/ai/tools";
|
|
@@ -212,17 +213,13 @@ export function registerAskTool(
|
|
|
212
213
|
required: ["question"],
|
|
213
214
|
},
|
|
214
215
|
execute: async (args, ctx) => {
|
|
215
|
-
/*
|
|
216
|
-
|
|
216
|
+
/* Every field is any JSON value, narrowed by a guard rather than by `?.`. The registry's
|
|
217
|
+
`validate()` is "a lightweight structural check, not a JSON Schema validator",
|
|
217
218
|
`strict: false` skips it entirely, and this tool may be registered into someone else's
|
|
218
219
|
registry — so an argument that is a number is a case, not an impossibility. Optional
|
|
219
220
|
chaining guards null, not type: `context?.trim()` threw on one. */
|
|
220
|
-
const { question, options, context } = args
|
|
221
|
-
|
|
222
|
-
options?: unknown;
|
|
223
|
-
context?: unknown;
|
|
224
|
-
};
|
|
225
|
-
if (typeof question !== "string" || !question.trim()) {
|
|
221
|
+
const { question, options, context } = args;
|
|
222
|
+
if (!isString(question) || !question.trim()) {
|
|
226
223
|
return toolError('Pass "question" — the question to put to the user.');
|
|
227
224
|
}
|
|
228
225
|
if (isAwaitingAnswer()) {
|
|
@@ -230,13 +227,13 @@ export function registerAskTool(
|
|
|
230
227
|
}
|
|
231
228
|
const choices = Array.isArray(options)
|
|
232
229
|
? options
|
|
233
|
-
.filter((o): o is string =>
|
|
230
|
+
.filter((o): o is string => isString(o) && o.trim().length > 0)
|
|
234
231
|
.slice(0, MAX_OPTIONS)
|
|
235
232
|
: [];
|
|
236
233
|
|
|
237
234
|
const answering = askUser(
|
|
238
235
|
{
|
|
239
|
-
context:
|
|
236
|
+
context: isString(context) ? context.trim() : "",
|
|
240
237
|
/* The tool-call id, so the chip the transcript draws and the question this registers
|
|
241
238
|
are the same thing. Without it a restored, permanently unanswered question would
|
|
242
239
|
render identically to the live one. */
|