@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
|
@@ -9,9 +9,17 @@
|
|
|
9
9
|
* deletion. The server is authoritative — there are no file fingerprints; conflicts surface as
|
|
10
10
|
* per-row API errors.
|
|
11
11
|
*/
|
|
12
|
+
import { isJsonPrimitive, isNumber, isString } from "@jxsuite/schema/guards";
|
|
13
|
+
import type { JsonObject, JsonValue } from "@jxsuite/schema/types";
|
|
12
14
|
import { deleteRow, fetchRows, insertRow, updateRow } from "../../services/data-service";
|
|
13
15
|
import { makeGridTabId } from "../grid-source";
|
|
14
|
-
import type {
|
|
16
|
+
import type {
|
|
17
|
+
DataColumnMeta,
|
|
18
|
+
DataRowDelete,
|
|
19
|
+
DataRowInsert,
|
|
20
|
+
DataRowUpdate,
|
|
21
|
+
DataRowsQuery,
|
|
22
|
+
} from "../../types";
|
|
15
23
|
import type {
|
|
16
24
|
CommitResult,
|
|
17
25
|
GridCellValue,
|
|
@@ -48,11 +56,11 @@ function editableColumn(column: DataColumnMeta): boolean {
|
|
|
48
56
|
}
|
|
49
57
|
|
|
50
58
|
/** DB value → grid cell value (JSON-ish values surface as text). */
|
|
51
|
-
function toCellValue(value:
|
|
52
|
-
if (value ===
|
|
59
|
+
function toCellValue(value: JsonValue | undefined): GridCellValue {
|
|
60
|
+
if (value === undefined) {
|
|
53
61
|
return null;
|
|
54
62
|
}
|
|
55
|
-
if (
|
|
63
|
+
if (isJsonPrimitive(value)) {
|
|
56
64
|
return value;
|
|
57
65
|
}
|
|
58
66
|
return JSON.stringify(value);
|
|
@@ -72,17 +80,23 @@ export function createConnectorSource(connection: string | undefined, table: str
|
|
|
72
80
|
}
|
|
73
81
|
};
|
|
74
82
|
|
|
75
|
-
const toQuery = (query?: GridQuery): DataRowsQuery =>
|
|
76
|
-
table
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
83
|
+
const toQuery = (query?: GridQuery): DataRowsQuery => {
|
|
84
|
+
const rowsQuery: DataRowsQuery = { table };
|
|
85
|
+
if (connection) {
|
|
86
|
+
rowsQuery.connection = connection;
|
|
87
|
+
}
|
|
88
|
+
rowsQuery.limit = query?.limit ?? DATA_PAGE_SIZE;
|
|
89
|
+
rowsQuery.offset = query?.offset ?? 0;
|
|
90
|
+
if (query?.orderBy) {
|
|
91
|
+
rowsQuery.dir = query.dir ?? "asc";
|
|
92
|
+
rowsQuery.orderBy = query.orderBy;
|
|
93
|
+
}
|
|
94
|
+
return rowsQuery;
|
|
95
|
+
};
|
|
82
96
|
|
|
83
|
-
const rowKeyOf = (row:
|
|
97
|
+
const rowKeyOf = (row: JsonObject, index: number): string => {
|
|
84
98
|
const pk = row[pkName];
|
|
85
|
-
if (
|
|
99
|
+
if (isString(pk) || isNumber(pk)) {
|
|
86
100
|
pkValues.set(String(pk), pk);
|
|
87
101
|
return String(pk);
|
|
88
102
|
}
|
|
@@ -132,11 +146,15 @@ export function createConnectorSource(connection: string | undefined, table: str
|
|
|
132
146
|
continue;
|
|
133
147
|
}
|
|
134
148
|
try {
|
|
135
|
-
const set:
|
|
149
|
+
const set: JsonObject = {};
|
|
136
150
|
for (const patch of patches) {
|
|
137
151
|
set[patch.field] = patch.value;
|
|
138
152
|
}
|
|
139
|
-
|
|
153
|
+
const update: DataRowUpdate = { pk, set, table };
|
|
154
|
+
if (connection) {
|
|
155
|
+
update.connection = connection;
|
|
156
|
+
}
|
|
157
|
+
await updateRow(update);
|
|
140
158
|
outcome(true);
|
|
141
159
|
} catch (error) {
|
|
142
160
|
outcome(false, error instanceof Error ? error.message : String(error));
|
|
@@ -145,16 +163,21 @@ export function createConnectorSource(connection: string | undefined, table: str
|
|
|
145
163
|
|
|
146
164
|
for (const insert of batch.inserts) {
|
|
147
165
|
try {
|
|
148
|
-
const values:
|
|
166
|
+
const values: JsonObject = {};
|
|
149
167
|
for (const [field, value] of Object.entries(insert.cells)) {
|
|
150
168
|
if (value !== null) {
|
|
151
169
|
values[field] = value;
|
|
152
170
|
}
|
|
153
171
|
}
|
|
154
|
-
const
|
|
172
|
+
const request: DataRowInsert = { table, values };
|
|
173
|
+
if (connection) {
|
|
174
|
+
request.connection = connection;
|
|
175
|
+
}
|
|
176
|
+
const { row } = await insertRow(request);
|
|
155
177
|
const pk = row[pkName];
|
|
156
|
-
|
|
157
|
-
if (
|
|
178
|
+
let newKey: string | undefined;
|
|
179
|
+
if (isString(pk) || isNumber(pk)) {
|
|
180
|
+
newKey = String(pk);
|
|
158
181
|
pkValues.set(newKey, pk);
|
|
159
182
|
}
|
|
160
183
|
result.inserts.push({ newKey, ok: true, tempKey: insert.tempKey });
|
|
@@ -178,7 +201,11 @@ export function createConnectorSource(connection: string | undefined, table: str
|
|
|
178
201
|
continue;
|
|
179
202
|
}
|
|
180
203
|
try {
|
|
181
|
-
|
|
204
|
+
const request: DataRowDelete = { pk, table };
|
|
205
|
+
if (connection) {
|
|
206
|
+
request.connection = connection;
|
|
207
|
+
}
|
|
208
|
+
await deleteRow(request);
|
|
182
209
|
result.deletes.push({ ok: true, rowKey: del.rowKey });
|
|
183
210
|
} catch (error) {
|
|
184
211
|
result.deletes.push({
|
|
@@ -51,13 +51,16 @@ import type {
|
|
|
51
51
|
GridSource,
|
|
52
52
|
} from "../grid-source";
|
|
53
53
|
import type { ContentSectionEntry } from "../../types";
|
|
54
|
+
import type { EntryFields } from "../../content/entry-fields";
|
|
55
|
+
import type { JxDocumentValue, JxMutableNode } from "@jxsuite/schema/types";
|
|
56
|
+
import { isJsonPrimitive, isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
54
57
|
|
|
55
58
|
/** The synthetic identity column: the entry's project path. Editable only on pending inserts. */
|
|
56
59
|
export const PATH_FIELD = "__path";
|
|
57
60
|
|
|
58
61
|
interface EntryRecord {
|
|
59
|
-
frontmatter:
|
|
60
|
-
document:
|
|
62
|
+
frontmatter: EntryFields;
|
|
63
|
+
document: JxMutableNode;
|
|
61
64
|
rawText: string;
|
|
62
65
|
formatName: string;
|
|
63
66
|
}
|
|
@@ -69,13 +72,17 @@ interface CollectionInfo {
|
|
|
69
72
|
ext: string;
|
|
70
73
|
}
|
|
71
74
|
|
|
75
|
+
/** The open project's `content` section (collection name → entry), or an empty one. */
|
|
76
|
+
function contentSection(): Record<string, ContentSectionEntry> {
|
|
77
|
+
/* SAFETY: `content` is the parser extension's section — collection name → entry object, its
|
|
78
|
+
project fragment schema the source of truth. `ContentSectionEntry` names only the fields Studio
|
|
79
|
+
reads, every one optional, and both readers below test `source` before using it. */
|
|
80
|
+
return (projectState?.projectConfig?.content ?? {}) as Record<string, ContentSectionEntry>;
|
|
81
|
+
}
|
|
82
|
+
|
|
72
83
|
/** Resolve a content type's definition, source dir, and entry extension from project config. */
|
|
73
84
|
export function collectionInfo(typeName: string): CollectionInfo | null {
|
|
74
|
-
const
|
|
75
|
-
string,
|
|
76
|
-
ContentSectionEntry
|
|
77
|
-
>;
|
|
78
|
-
const def = content[typeName];
|
|
85
|
+
const def = contentSection()[typeName];
|
|
79
86
|
if (!def?.source) {
|
|
80
87
|
return null;
|
|
81
88
|
}
|
|
@@ -91,11 +98,7 @@ export function collectionInfo(typeName: string): CollectionInfo | null {
|
|
|
91
98
|
|
|
92
99
|
/** Directory-backed collections in the project (for "Edit collection in Grid" affordances). */
|
|
93
100
|
export function collectionDirs(): { name: string; dir: string }[] {
|
|
94
|
-
|
|
95
|
-
string,
|
|
96
|
-
ContentSectionEntry
|
|
97
|
-
>;
|
|
98
|
-
return Object.entries(content)
|
|
101
|
+
return Object.entries(contentSection())
|
|
99
102
|
.filter(([, def]) => {
|
|
100
103
|
const source = def.source?.replace(/^\.\//, "") ?? "";
|
|
101
104
|
return source !== "" && !/\.[a-z0-9]+$/i.test(source);
|
|
@@ -160,14 +163,14 @@ async function mapLimit<T, R>(
|
|
|
160
163
|
}
|
|
161
164
|
|
|
162
165
|
/** Frontmatter value → grid cell value. Nested objects surface as read-only JSON text. */
|
|
163
|
-
function toCellValue(value:
|
|
164
|
-
if (value ===
|
|
166
|
+
function toCellValue(value: JxDocumentValue | undefined): GridCellValue {
|
|
167
|
+
if (value === undefined) {
|
|
165
168
|
return null;
|
|
166
169
|
}
|
|
167
|
-
if (
|
|
170
|
+
if (isJsonPrimitive(value)) {
|
|
168
171
|
return value;
|
|
169
172
|
}
|
|
170
|
-
if (Array.isArray(value) && value.every((v) =>
|
|
173
|
+
if (Array.isArray(value) && value.every((v) => !isNonNullObject(v))) {
|
|
171
174
|
return value.map(String);
|
|
172
175
|
}
|
|
173
176
|
return JSON.stringify(value);
|
|
@@ -187,9 +190,7 @@ function openTabFor(path: string) {
|
|
|
187
190
|
function extraRowsAreStrings(rows: Record<string, GridCellValue>[], field: string): boolean {
|
|
188
191
|
return rows.every((row) => {
|
|
189
192
|
const value = row[field];
|
|
190
|
-
return value
|
|
191
|
-
? true
|
|
192
|
-
: !value.startsWith("{") && !value.startsWith("[");
|
|
193
|
+
return !isString(value) || (!value.startsWith("{") && !value.startsWith("["));
|
|
193
194
|
});
|
|
194
195
|
}
|
|
195
196
|
|
|
@@ -294,7 +295,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
|
|
|
294
295
|
return {
|
|
295
296
|
document: parsed.document,
|
|
296
297
|
formatName: parsed.format.name,
|
|
297
|
-
frontmatter: parsed.frontmatter
|
|
298
|
+
frontmatter: parsed.frontmatter,
|
|
298
299
|
rawText: text,
|
|
299
300
|
};
|
|
300
301
|
} catch {
|
|
@@ -393,7 +394,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
|
|
|
393
394
|
};
|
|
394
395
|
|
|
395
396
|
const rowFor = (path: string, entry: EntryRecord): GridRow => {
|
|
396
|
-
const cells:
|
|
397
|
+
const cells: GridRow["cells"] = { [PATH_FIELD]: path };
|
|
397
398
|
for (const column of buildColumns()) {
|
|
398
399
|
if (column.field === PATH_FIELD) {
|
|
399
400
|
continue;
|
|
@@ -490,7 +491,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
|
|
|
490
491
|
// Inserts: new entry files from the Path cell.
|
|
491
492
|
for (const insert of batch.inserts) {
|
|
492
493
|
const rawPath = insert.cells[PATH_FIELD];
|
|
493
|
-
if (
|
|
494
|
+
if (!isString(rawPath) || rawPath.trim() === "") {
|
|
494
495
|
result.inserts.push({ error: "Path is required", ok: false, tempKey: insert.tempKey });
|
|
495
496
|
continue;
|
|
496
497
|
}
|
|
@@ -522,7 +523,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
|
|
|
522
523
|
continue;
|
|
523
524
|
}
|
|
524
525
|
try {
|
|
525
|
-
const frontmatter: Record<string,
|
|
526
|
+
const frontmatter: Record<string, GridCellValue> = {};
|
|
526
527
|
for (const [field, value] of Object.entries(insert.cells)) {
|
|
527
528
|
if (field !== PATH_FIELD && value !== null) {
|
|
528
529
|
frontmatter[field] = value;
|
|
@@ -539,7 +540,7 @@ function buildEntryFileSource(opts: EntryFileSourceOptions): GridSource {
|
|
|
539
540
|
entries.set(path, {
|
|
540
541
|
document: parsed.document,
|
|
541
542
|
formatName: parsed.format.name,
|
|
542
|
-
frontmatter: parsed.frontmatter
|
|
543
|
+
frontmatter: parsed.frontmatter,
|
|
543
544
|
rawText: text,
|
|
544
545
|
});
|
|
545
546
|
result.inserts.push({ newKey: path, ok: true, tempKey: insert.tempKey });
|
|
@@ -84,7 +84,7 @@ function buildModel(text: string, path: string): CsvModel {
|
|
|
84
84
|
|
|
85
85
|
// Typed columns when this CSV is a collection source; sniffed kinds otherwise.
|
|
86
86
|
const contentType = findContentTypeSchema(path, projectState?.projectConfig);
|
|
87
|
-
const schemaProps = contentType?.schema
|
|
87
|
+
const schemaProps = contentType?.schema.properties ?? {};
|
|
88
88
|
const sampleRows = doc.rows.slice(0, 50).map((row) => {
|
|
89
89
|
const cells: Record<string, GridCellValue> = {};
|
|
90
90
|
for (const [i, field] of fields.entries()) {
|
|
@@ -116,7 +116,7 @@ function buildModel(text: string, path: string): CsvModel {
|
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/** Typed cell values for one matrix row. */
|
|
119
|
-
function rowCells(model: CsvModel, rowIndex: number):
|
|
119
|
+
function rowCells(model: CsvModel, rowIndex: number): GridRow["cells"] {
|
|
120
120
|
const cells: Record<string, GridCellValue> = {};
|
|
121
121
|
const row = model.doc.rows[rowIndex] ?? [];
|
|
122
122
|
for (const [i, field] of model.fields.entries()) {
|
|
@@ -1,26 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Minimal ambient types for tabulator-tables 6.x — the package ships no declarations. Only the
|
|
3
3
|
* surface grid-view.ts touches is typed; extend here as usage grows.
|
|
4
|
+
*
|
|
5
|
+
* Every component is generic over `Value`, the type of one cell value. Tabulator stores the row
|
|
6
|
+
* objects it is handed (`data`, `replaceData`) and gives the same values back (`getValue`,
|
|
7
|
+
* `getData`, sorter and filter arguments), so the caller that builds the table names the value type
|
|
8
|
+
* once and reads it back from every component. Values written in (`setValue`, an editor's
|
|
9
|
+
* `success`, `selectableRangeClearCellsValue`) must be of that same type for the promise to hold.
|
|
4
10
|
*/
|
|
5
11
|
declare module "tabulator-tables" {
|
|
6
|
-
|
|
7
|
-
|
|
12
|
+
/** One row object as the table stores it: cell values keyed by field. */
|
|
13
|
+
export type RowData<Value> = Record<string, Value>;
|
|
14
|
+
|
|
15
|
+
export interface CellComponent<Value> {
|
|
16
|
+
getValue: () => Value;
|
|
8
17
|
getField: () => string;
|
|
9
18
|
getElement: () => HTMLElement;
|
|
10
|
-
getRow: () => RowComponent
|
|
11
|
-
setValue: (value:
|
|
19
|
+
getRow: () => RowComponent<Value>;
|
|
20
|
+
setValue: (value: Value, mutate?: boolean) => void;
|
|
12
21
|
}
|
|
13
22
|
|
|
14
|
-
export interface RowComponent {
|
|
15
|
-
getData: () =>
|
|
23
|
+
export interface RowComponent<Value> {
|
|
24
|
+
getData: () => RowData<Value>;
|
|
16
25
|
getElement: () => HTMLElement;
|
|
17
|
-
getCells: () => CellComponent[];
|
|
26
|
+
getCells: () => CellComponent<Value>[];
|
|
18
27
|
reformat: () => void;
|
|
19
28
|
}
|
|
20
29
|
|
|
21
|
-
export interface RangeComponent {
|
|
22
|
-
getRows: () => RowComponent[];
|
|
23
|
-
getCells: () => CellComponent[][];
|
|
30
|
+
export interface RangeComponent<Value> {
|
|
31
|
+
getRows: () => RowComponent<Value>[];
|
|
32
|
+
getCells: () => CellComponent<Value>[][];
|
|
24
33
|
}
|
|
25
34
|
|
|
26
35
|
export interface ColumnComponent {
|
|
@@ -28,28 +37,29 @@ declare module "tabulator-tables" {
|
|
|
28
37
|
getWidth: () => number;
|
|
29
38
|
}
|
|
30
39
|
|
|
31
|
-
export type CellEditor = (
|
|
32
|
-
cell: CellComponent
|
|
40
|
+
export type CellEditor<Value> = (
|
|
41
|
+
cell: CellComponent<Value>,
|
|
33
42
|
onRendered: (fn: () => void) => void,
|
|
34
|
-
success: (value:
|
|
43
|
+
success: (value: Value) => void,
|
|
35
44
|
cancel: () => void,
|
|
36
45
|
) => HTMLElement | false;
|
|
37
46
|
|
|
38
|
-
export type CellFormatter = (
|
|
39
|
-
cell: CellComponent
|
|
40
|
-
formatterParams
|
|
47
|
+
export type CellFormatter<Value> = (
|
|
48
|
+
cell: CellComponent<Value>,
|
|
49
|
+
/** Always `{}`: no column definition here declares `formatterParams`. */
|
|
50
|
+
formatterParams: Record<string, never>,
|
|
41
51
|
onRendered: (fn: () => void) => void,
|
|
42
52
|
) => HTMLElement | string;
|
|
43
53
|
|
|
44
|
-
export interface ColumnDefinition {
|
|
54
|
+
export interface ColumnDefinition<Value> {
|
|
45
55
|
title: string;
|
|
46
56
|
field?: string | undefined;
|
|
47
57
|
width?: number | undefined;
|
|
48
58
|
frozen?: boolean | undefined;
|
|
49
|
-
editor?: CellEditor | undefined;
|
|
50
|
-
editable?: boolean | ((cell: CellComponent) => boolean) | undefined;
|
|
51
|
-
formatter?: CellFormatter | undefined;
|
|
52
|
-
sorter?: string | ((a:
|
|
59
|
+
editor?: CellEditor<Value> | undefined;
|
|
60
|
+
editable?: boolean | ((cell: CellComponent<Value>) => boolean) | undefined;
|
|
61
|
+
formatter?: CellFormatter<Value> | undefined;
|
|
62
|
+
sorter?: string | ((a: Value, b: Value) => number) | undefined;
|
|
53
63
|
headerSort?: boolean | undefined;
|
|
54
64
|
headerFilter?: string | undefined;
|
|
55
65
|
cssClass?: string | undefined;
|
|
@@ -57,9 +67,20 @@ declare module "tabulator-tables" {
|
|
|
57
67
|
headerSortTristate?: boolean | undefined;
|
|
58
68
|
}
|
|
59
69
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
70
|
+
/** Which table regions a clipboard copy includes. */
|
|
71
|
+
export interface ClipboardCopyConfig {
|
|
72
|
+
columnHeaders?: boolean;
|
|
73
|
+
columnGroups?: boolean;
|
|
74
|
+
rowHeaders?: boolean;
|
|
75
|
+
rowGroups?: boolean;
|
|
76
|
+
columnCalcs?: boolean;
|
|
77
|
+
dataTree?: boolean;
|
|
78
|
+
formatCells?: boolean;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface Options<Value> {
|
|
82
|
+
data?: RowData<Value>[];
|
|
83
|
+
columns?: ColumnDefinition<Value>[];
|
|
63
84
|
index?: string;
|
|
64
85
|
layout?: string;
|
|
65
86
|
height?: string | number;
|
|
@@ -73,27 +94,27 @@ declare module "tabulator-tables" {
|
|
|
73
94
|
selectableRangeColumns?: boolean;
|
|
74
95
|
selectableRangeRows?: boolean;
|
|
75
96
|
selectableRangeClearCells?: boolean;
|
|
76
|
-
selectableRangeClearCellsValue?:
|
|
97
|
+
selectableRangeClearCellsValue?: Value;
|
|
77
98
|
clipboard?: boolean;
|
|
78
99
|
clipboardCopyStyled?: boolean;
|
|
79
|
-
clipboardCopyConfig?:
|
|
100
|
+
clipboardCopyConfig?: ClipboardCopyConfig;
|
|
80
101
|
clipboardCopyRowRange?: string;
|
|
81
102
|
clipboardPasteParser?: string;
|
|
82
103
|
clipboardPasteAction?: string;
|
|
83
104
|
movableColumns?: boolean;
|
|
84
|
-
columnDefaults?: Partial<ColumnDefinition
|
|
85
|
-
rowFormatter?: (row: RowComponent) => void;
|
|
105
|
+
columnDefaults?: Partial<ColumnDefinition<Value>>;
|
|
106
|
+
rowFormatter?: (row: RowComponent<Value>) => void;
|
|
86
107
|
placeholder?: string;
|
|
87
108
|
}
|
|
88
109
|
|
|
89
|
-
export class Tabulator {
|
|
90
|
-
constructor(host: HTMLElement, options: Options);
|
|
110
|
+
export class Tabulator<Value> {
|
|
111
|
+
constructor(host: HTMLElement, options: Options<Value>);
|
|
91
112
|
static registerModule(modules: unknown[]): void;
|
|
92
113
|
on(event: string, callback: (...args: never[]) => void): void;
|
|
93
|
-
replaceData(data:
|
|
94
|
-
getRows(activeOnly?: string): RowComponent[];
|
|
95
|
-
getRanges(): RangeComponent[];
|
|
96
|
-
setFilter(filter: (data:
|
|
114
|
+
replaceData(data: RowData<Value>[]): Promise<void>;
|
|
115
|
+
getRows(activeOnly?: string): RowComponent<Value>[];
|
|
116
|
+
getRanges(): RangeComponent<Value>[];
|
|
117
|
+
setFilter(filter: (data: RowData<Value>) => boolean): void;
|
|
97
118
|
clearFilter(includeHeaderFilters?: boolean): void;
|
|
98
119
|
redraw(force?: boolean): void;
|
|
99
120
|
destroy(): void;
|
package/src/hosting/stage.ts
CHANGED
|
@@ -15,6 +15,7 @@ import { cp, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
|
15
15
|
import { existsSync } from "node:fs";
|
|
16
16
|
import { dirname, join, resolve } from "node:path";
|
|
17
17
|
import { Glob } from "bun";
|
|
18
|
+
import { isNonNullObject } from "@jxsuite/schema/guards";
|
|
18
19
|
import { STUDIO_ASSETS, STUDIO_CANVAS, STUDIO_SHELL } from "./layout";
|
|
19
20
|
import type { AssetBase, StudioAsset, StudioAssetKind, StudioLayoutMode } from "./layout";
|
|
20
21
|
import { canvasShellHtml } from "./document";
|
|
@@ -193,11 +194,10 @@ export async function writeAssetManifest(
|
|
|
193
194
|
): Promise<void> {
|
|
194
195
|
const out = manifestPath(root);
|
|
195
196
|
await mkdir(dirname(out), { recursive: true });
|
|
196
|
-
const manifest =
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
};
|
|
197
|
+
const manifest =
|
|
198
|
+
extra.preload === undefined
|
|
199
|
+
? { assets: STUDIO_ASSETS, shell: STUDIO_SHELL }
|
|
200
|
+
: { assets: STUDIO_ASSETS, preload: extra.preload, shell: STUDIO_SHELL };
|
|
201
201
|
await writeFile(out, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
202
202
|
}
|
|
203
203
|
|
|
@@ -231,8 +231,8 @@ export async function studioPreload(root: string = STUDIO_PACKAGE_DIR): Promise<
|
|
|
231
231
|
if (!existsSync(path)) {
|
|
232
232
|
return [];
|
|
233
233
|
}
|
|
234
|
-
const manifest = JSON.parse(await readFile(path, "utf8"))
|
|
235
|
-
const
|
|
234
|
+
const manifest: unknown = JSON.parse(await readFile(path, "utf8"));
|
|
235
|
+
const preload = isNonNullObject(manifest) && "preload" in manifest ? manifest.preload : undefined;
|
|
236
236
|
if (!Array.isArray(preload)) {
|
|
237
237
|
return [];
|
|
238
238
|
}
|
|
@@ -47,7 +47,6 @@ import {
|
|
|
47
47
|
} from "../commands/command-args";
|
|
48
48
|
import type { CommandArgValues } from "../commands/command-args";
|
|
49
49
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
50
|
-
import type { Tab } from "../tabs/tab";
|
|
51
50
|
|
|
52
51
|
/** The tags a translation verb may be asked for — the project's declared locales, read live. */
|
|
53
52
|
function declaredLocales(): string[] {
|
|
@@ -98,7 +97,7 @@ function addressedDocument(commandId: string, args: CommandArgValues): string {
|
|
|
98
97
|
}
|
|
99
98
|
return path;
|
|
100
99
|
}
|
|
101
|
-
const tab = paneId === undefined ?
|
|
100
|
+
const tab = paneId === undefined ? activeTab.value : tabOfPane(paneId);
|
|
102
101
|
if (!tab) {
|
|
103
102
|
throw new RangeError(
|
|
104
103
|
paneId === undefined
|
package/src/media/media-pane.ts
CHANGED
|
@@ -228,7 +228,10 @@ export function renderMediaMode(surface: CanvasSurface, tab: Tab): void {
|
|
|
228
228
|
const scope = effectScope();
|
|
229
229
|
const mounted = mountMediaSurface(canvasWrap, view(), {
|
|
230
230
|
copyRef: () => {
|
|
231
|
-
|
|
231
|
+
// `navigator.clipboard` is [SecureContext]: a plain-http host has none, whatever lib.dom says.
|
|
232
|
+
if ("clipboard" in navigator) {
|
|
233
|
+
void navigator.clipboard.writeText(ref);
|
|
234
|
+
}
|
|
232
235
|
},
|
|
233
236
|
imageLoaded: (width, height) => {
|
|
234
237
|
/* The only honest source of pixel dimensions in a browser is an image that has loaded, and
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
|
|
36
36
|
import { actIfRequired } from "../account/action-flow";
|
|
37
37
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
38
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
38
39
|
import {
|
|
39
40
|
getAccountStatus,
|
|
40
41
|
getRepoAccessLinks,
|
|
@@ -90,7 +91,7 @@ let _resolve: ((result: { root: string } | null) => void) | null = null;
|
|
|
90
91
|
/** True when the active platform can browse + adopt existing repositories. */
|
|
91
92
|
export function platformSupportsAddRepo(): boolean {
|
|
92
93
|
const platform = getPlatform();
|
|
93
|
-
return
|
|
94
|
+
return isFunction(platform.listRepos) && isFunction(platform.importProject);
|
|
94
95
|
}
|
|
95
96
|
|
|
96
97
|
/** True when the active platform routes Open Project through this repo picker. */
|
|
@@ -207,7 +208,7 @@ function loadRepos(): void {
|
|
|
207
208
|
requestScan(_selected, "now");
|
|
208
209
|
}
|
|
209
210
|
})
|
|
210
|
-
.catch((error
|
|
211
|
+
.catch((error) => {
|
|
211
212
|
_repos = [];
|
|
212
213
|
_error = errorMessage(error);
|
|
213
214
|
})
|
|
@@ -492,11 +493,8 @@ async function adopt(fullName: string, dir: string, retried = false): Promise<vo
|
|
|
492
493
|
_error = "";
|
|
493
494
|
redraw();
|
|
494
495
|
try {
|
|
495
|
-
const
|
|
496
|
-
|
|
497
|
-
owner: repo.owner,
|
|
498
|
-
...(dir ? { dir } : {}),
|
|
499
|
-
});
|
|
496
|
+
const request = { name: repo.name, owner: repo.owner };
|
|
497
|
+
const imported = await getPlatform().importProject?.(dir ? { ...request, dir } : request);
|
|
500
498
|
if (_handle !== handle) {
|
|
501
499
|
return;
|
|
502
500
|
}
|
|
@@ -604,13 +602,16 @@ function accessOf(): AddRepoView["access"] {
|
|
|
604
602
|
];
|
|
605
603
|
}
|
|
606
604
|
|
|
607
|
-
/** The chosen repository's pane
|
|
608
|
-
|
|
605
|
+
/** The chosen repository's pane, plus the branch it is read at. */
|
|
606
|
+
interface RepoDetail extends Pick<
|
|
609
607
|
AddRepoView,
|
|
610
608
|
"detailState" | "detailName" | "detailMeta" | "locations" | "folderHelp"
|
|
611
|
-
>
|
|
609
|
+
> {
|
|
612
610
|
branch: string;
|
|
613
|
-
}
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/** The chosen repository's pane: its state, its rows, and the sentence under the folder field. */
|
|
614
|
+
function detailOf(repo: RepoInfo | undefined): RepoDetail {
|
|
614
615
|
if (!repo) {
|
|
615
616
|
return {
|
|
616
617
|
branch: "",
|
|
@@ -623,12 +624,13 @@ function detailOf(repo: RepoInfo | undefined): Pick<
|
|
|
623
624
|
}
|
|
624
625
|
const scanned = _scans.get(repo.fullName);
|
|
625
626
|
const branch = scanned?.status === "done" ? scanned.projects.branch : repo.defaultBranch;
|
|
627
|
+
const noLocations: AddRepoLocation[] = [];
|
|
626
628
|
const base = {
|
|
627
629
|
branch,
|
|
628
630
|
detailMeta: [branch, repo.permission, ...(repo.private ? ["private"] : [])].join(" · "),
|
|
629
631
|
detailName: repo.fullName,
|
|
630
632
|
folderHelp: "The folder that holds project.json. Leave it empty for the repository root.",
|
|
631
|
-
locations:
|
|
633
|
+
locations: noLocations,
|
|
632
634
|
};
|
|
633
635
|
if (!getPlatform().listRepoProjects) {
|
|
634
636
|
return { ...base, detailState: "unlisted" };
|
|
@@ -640,17 +642,16 @@ function detailOf(repo: RepoInfo | undefined): Pick<
|
|
|
640
642
|
return { ...base, detailState: "failed" };
|
|
641
643
|
}
|
|
642
644
|
const { locations, truncated } = scanned.projects;
|
|
643
|
-
|
|
645
|
+
const detail: RepoDetail = {
|
|
644
646
|
...base,
|
|
645
647
|
detailState: locations.length > 0 ? "listed" : "empty",
|
|
646
|
-
...(truncated
|
|
647
|
-
? {
|
|
648
|
-
folderHelp:
|
|
649
|
-
"This repository is too large to scan in full. Name the folder if its project isn't listed.",
|
|
650
|
-
}
|
|
651
|
-
: {}),
|
|
652
648
|
locations: locations.map((location) => locationOf(location, repo)),
|
|
653
649
|
};
|
|
650
|
+
if (truncated) {
|
|
651
|
+
detail.folderHelp =
|
|
652
|
+
"This repository is too large to scan in full. Name the folder if its project isn't listed.";
|
|
653
|
+
}
|
|
654
|
+
return detail;
|
|
654
655
|
}
|
|
655
656
|
|
|
656
657
|
/** Everything the dialog draws, as one record. The only place this module's state becomes a view. */
|
|
@@ -25,7 +25,9 @@ import { createModelPicker } from "../ui/ai-model-picker";
|
|
|
25
25
|
import { destinationPath } from "./location-fields";
|
|
26
26
|
import type { CreateProjectDestination, ImportBreakpointPolicy } from "../types";
|
|
27
27
|
|
|
28
|
-
import {
|
|
28
|
+
import { IMPORT_MAX_BREAKPOINTS } from "@jxsuite/protocol";
|
|
29
|
+
|
|
30
|
+
import { MAX_IMPORT_DEPTH, setPendingImportBrief } from "../services/import-seed";
|
|
29
31
|
import type { ImportBrief } from "../services/import-seed";
|
|
30
32
|
|
|
31
33
|
/** The three answers the Breakpoints control offers. */
|
|
@@ -34,17 +36,6 @@ type BreakpointMode = "all" | "limit" | "explicit";
|
|
|
34
36
|
/** How a kept width matches one the site declared. */
|
|
35
37
|
type BreakpointRounding = "nearest" | "down" | "up";
|
|
36
38
|
|
|
37
|
-
/** The most breakpoints the control will offer to keep — `@jxsuite/import`'s own ceiling. */
|
|
38
|
-
const MAX_BREAKPOINTS = 12;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* The deepest crawl the pipeline accepts.
|
|
42
|
-
*
|
|
43
|
-
* The field said 2 while `import_site` and the endpoint both clamped to 5, so the wizard could not
|
|
44
|
-
* ask for a depth the backend was willing to run.
|
|
45
|
-
*/
|
|
46
|
-
const MAX_DEPTH = 5;
|
|
47
|
-
|
|
48
39
|
export interface ImportTabCtx {
|
|
49
40
|
/** The wizard's shared name/directory state (the import destination slug). */
|
|
50
41
|
form: { name: string; directory: string };
|
|
@@ -383,8 +374,8 @@ export function importView(ctx: ImportTabCtx): ImportView {
|
|
|
383
374
|
canVerify: canVerify(),
|
|
384
375
|
depth: String(_depth),
|
|
385
376
|
error: _errorMsg,
|
|
386
|
-
maxBreakpoints: String(
|
|
387
|
-
maxDepth: String(
|
|
377
|
+
maxBreakpoints: String(IMPORT_MAX_BREAKPOINTS),
|
|
378
|
+
maxDepth: String(MAX_IMPORT_DEPTH),
|
|
388
379
|
maxPages: String(_maxPages),
|
|
389
380
|
minFidelity: String(_minFidelity),
|
|
390
381
|
prompt: _prompt,
|
|
@@ -438,6 +429,8 @@ export function setImportMaxPages(value: string): void {
|
|
|
438
429
|
|
|
439
430
|
/** Which of the three breakpoint answers the reader chose. */
|
|
440
431
|
export function setBreakpointMode(value: string): void {
|
|
432
|
+
/* SAFETY: Studio's one caller is the `bp-mode` select's change handler (surfaces/new-project.json),
|
|
433
|
+
and that select's options are `importView().breakpointModes`: "limit", "explicit" and "all". */
|
|
441
434
|
_breakpointMode = value as BreakpointMode;
|
|
442
435
|
}
|
|
443
436
|
|
|
@@ -453,6 +446,9 @@ export function setBreakpointWidths(value: string): void {
|
|
|
453
446
|
|
|
454
447
|
/** Which declared width backs a kept one. */
|
|
455
448
|
export function setBreakpointRounding(value: string): void {
|
|
449
|
+
/* SAFETY: Studio's one caller is the `bp-rounding` select's change handler (surfaces/
|
|
450
|
+
new-project.json), and that select's options are `importView().roundings`: "nearest", "down"
|
|
451
|
+
and "up". */
|
|
456
452
|
_breakpointRounding = value as BreakpointRounding;
|
|
457
453
|
}
|
|
458
454
|
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
25
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
25
26
|
import { getPlatform } from "../platform";
|
|
26
27
|
import type { CreateProjectDestination, RepoInfo } from "../types";
|
|
27
28
|
|
|
@@ -211,7 +212,7 @@ export function locationView(slug: string): LocationView {
|
|
|
211
212
|
return {
|
|
212
213
|
browseLabel: _browsing ? "Choosing…" : "Browse…",
|
|
213
214
|
browsing: _browsing,
|
|
214
|
-
canBrowse:
|
|
215
|
+
canBrowse: isFunction(platform.pickDirectory),
|
|
215
216
|
destination: isRepo ? "repo" : "path",
|
|
216
217
|
error: _error,
|
|
217
218
|
owner: _owner,
|