@jxsuite/studio 6.1.0 → 6.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/2020-f2gkpy8d.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-4912g339.js +4 -0
- package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
- package/dist/chunks/cf-settings-br6105tr.js +4 -0
- package/dist/chunks/color-28ksk2qm.js +4 -0
- package/dist/chunks/color-area-0fj8a4ga.js +4 -0
- package/dist/chunks/color-field-xch8kx2g.js +4 -0
- package/dist/chunks/color-slider-jxd8v350.js +4 -0
- package/dist/chunks/combobox-p0efwjke.js +4 -0
- package/dist/chunks/components-db68vsn7.js +4 -0
- package/dist/chunks/content-source-1449qesq.js +4 -0
- package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-x9jn86a7.js +4 -0
- package/dist/chunks/entry-commands-may24cpt.js +4 -0
- package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
- package/dist/chunks/file-ops-x9v54pcj.js +4 -0
- package/dist/chunks/files-j3knqf0s.js +4 -0
- package/dist/chunks/format-host-tyre2trb.js +4 -0
- package/dist/chunks/fs-events-64ma9htc.js +4 -0
- package/dist/chunks/git-panel-84ps5dex.js +4 -0
- package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
- package/dist/chunks/icons-pnfz478q.js +4 -0
- package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
- package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
- package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
- package/dist/chunks/iframe-entry-zap785cw.js +5 -0
- package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
- package/dist/chunks/index-b8xw3vy9.js +4 -0
- package/dist/chunks/{index-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
- package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
- package/dist/chunks/layers-h4xp1pss.js +4 -0
- package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
- package/dist/chunks/listbox-e74qjyq6.js +4 -0
- package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
- package/dist/chunks/media-picker-2cweexc5.js +4 -0
- package/dist/chunks/menu-n6yzswmy.js +4 -0
- package/dist/chunks/menu-ynw13y0s.js +4 -0
- package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
- package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
- package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
- package/dist/chunks/notify-cj5zbrs2.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-b7ddhr8m.js +4 -0
- package/dist/chunks/platform-3dfws9js.js +4 -0
- package/dist/chunks/popover-jt2gxmzs.js +4 -0
- package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
- package/dist/chunks/quick-search-0dajrwqg.js +4 -0
- package/dist/chunks/references-49qgt404.js +4 -0
- package/dist/chunks/right-panel-jm1bwe53.js +4 -0
- package/dist/chunks/section-registry-6kwc4fky.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/split-n2gfpm5m.js +4 -0
- package/dist/chunks/{studio-5g0ag7c0.js → studio-0q988f9w.js} +3 -3
- package/dist/chunks/studio-0rt52vpq.js +5 -0
- package/dist/chunks/studio-18vgbhs5.js +5 -0
- package/dist/chunks/{studio-pxg4ap1e.js → studio-1fxkaaea.js} +4 -4
- package/dist/chunks/studio-24mccdrj.js +5 -0
- package/dist/chunks/studio-2eh507zk.js +9 -0
- package/dist/chunks/studio-2hcbccfv.js +5 -0
- package/dist/chunks/studio-2j1cb95x.js +5 -0
- package/dist/chunks/studio-2jbs3rxv.js +5 -0
- package/dist/chunks/{studio-qbj760tx.js → studio-485046te.js} +7 -7
- package/dist/chunks/studio-4h8k4dw9.js +5 -0
- package/dist/chunks/studio-5f6n18kx.js +5 -0
- package/dist/chunks/studio-5gthpky6.js +5 -0
- package/dist/chunks/studio-5ve6bbep.js +5 -0
- package/dist/chunks/studio-6ep3js6b.js +9 -0
- package/dist/chunks/studio-6wkmf3wz.js +9 -0
- package/dist/chunks/studio-841rf3cg.js +5 -0
- package/dist/chunks/studio-8gmwgheg.js +5 -0
- package/dist/chunks/studio-8qm0ep50.js +5 -0
- package/dist/chunks/{studio-anyrgzvb.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-v2bvmbjj.js → studio-a3g98wjr.js} +4 -4
- package/dist/chunks/studio-a3shpz9y.js +5 -0
- package/dist/chunks/studio-amsbaaar.js +6 -0
- package/dist/chunks/studio-at5spjbc.js +7 -0
- package/dist/chunks/studio-b2xv945e.js +5 -0
- package/dist/chunks/studio-bn5nkafw.js +5 -0
- package/dist/chunks/studio-bw6q5xjf.js +9 -0
- package/dist/chunks/studio-c7q0t9x1.js +5 -0
- package/dist/chunks/studio-camnhc96.js +6 -0
- package/dist/chunks/studio-cffqvnzd.js +5 -0
- package/dist/chunks/studio-d81xfh1g.js +5 -0
- package/dist/chunks/studio-dgz8d0c1.js +5 -0
- package/dist/chunks/studio-efvfrsf8.js +5 -0
- package/dist/chunks/studio-er30bpcx.js +5 -0
- package/dist/chunks/studio-ezscgr64.js +5 -0
- package/dist/chunks/studio-ffrrncvz.js +5 -0
- package/dist/chunks/studio-fpphgn8y.js +10 -0
- package/dist/chunks/studio-j1kvhdjk.js +4 -0
- package/dist/chunks/{studio-txjjzrsm.js → studio-j430n16g.js} +5 -5
- package/dist/chunks/studio-jjkg84nj.js +5 -0
- package/dist/chunks/studio-m0q32ars.js +4 -0
- package/dist/chunks/studio-m6bdst11.js +5 -0
- package/dist/chunks/studio-nv2cptd4.js +64 -0
- package/dist/chunks/studio-nwfrc98n.js +5 -0
- package/dist/chunks/studio-p1wgvp7r.js +5 -0
- package/dist/chunks/studio-pag2wncm.js +5 -0
- package/dist/chunks/studio-qvanvzfd.js +5 -0
- package/dist/chunks/studio-qwa64kt7.js +5 -0
- package/dist/chunks/studio-rk1zc4x3.js +928 -0
- package/dist/chunks/studio-se2r3ptc.js +5 -0
- package/dist/chunks/studio-sg2a0dh0.js +5 -0
- package/dist/chunks/studio-tjzjhe68.js +5 -0
- package/dist/chunks/{studio-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-cpxkgjrj.js → studio-v0jzqdjm.js} +4 -4
- package/dist/chunks/studio-v2w7q8r1.js +7 -0
- package/dist/chunks/studio-v5vjq1h0.js +4 -0
- package/dist/chunks/studio-v8aga3vp.js +14 -0
- package/dist/chunks/studio-vfcdrfmv.js +5 -0
- package/dist/chunks/studio-vmfkgdjf.js +5 -0
- package/dist/chunks/studio-wt1816jj.js +5 -0
- package/dist/chunks/studio-wz73q5kq.js +4 -0
- package/dist/chunks/studio-y04qtxvp.js +7 -0
- package/dist/chunks/studio-y21g8zzg.js +5 -0
- package/dist/chunks/studio-y64hrt8p.js +12 -0
- package/dist/chunks/studio-ynn90f58.js +16 -0
- package/dist/chunks/studio-yxz682sx.js +5 -0
- package/dist/chunks/studio-zp7snvkq.js +5 -0
- package/dist/chunks/studio-zq4z6tm6.js +5 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-c9fn075p.js +4 -0
- package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
- package/dist/chunks/tree-mdq3v5cw.js +4 -0
- package/dist/chunks/tsMode-sf49ee9x.js +14 -0
- package/dist/chunks/workspace-jtfahpee.js +4 -0
- package/dist/chunks/ws-client-nze0k6mv.js +4 -0
- package/dist/iframe-entry.js +16 -16
- package/dist/manifest.json +63 -63
- package/dist/studio.js +98 -98
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +11 -11
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/library-layouts.ts +8 -5
- package/src/browse/library-model.ts +18 -6
- package/src/browse/library-pane.ts +37 -21
- package/src/browse/library-preview.ts +14 -9
- package/src/browse/library-source.ts +1 -1
- package/src/canvas/asset-refs.ts +24 -9
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +44 -53
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +66 -42
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +163 -64
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +13 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +80 -63
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +203 -118
- package/src/canvas/iframe-inline-edit.ts +69 -32
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +37 -26
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +18 -15
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +15 -16
- package/src/canvas/iframe-render.ts +41 -36
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +6 -2
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +2 -1
- package/src/canvas/surface-registry.ts +21 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/budget.ts +3 -3
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +22 -20
- package/src/commands/defaults.ts +4 -1
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +10 -8
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +12 -10
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +5 -4
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +3 -2
- package/src/content/entry-editor.ts +29 -17
- package/src/content/entry-fields.ts +12 -7
- package/src/content/entry-model.ts +21 -12
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +11 -5
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +21 -22
- package/src/editor/inline-edit-apply.ts +35 -17
- package/src/editor/inline-edit.ts +66 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +87 -47
- package/src/editor/slash-menu.ts +1 -6
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +15 -10
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +77 -36
- package/src/files/files.ts +90 -95
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +6 -1
- package/src/files/serialize-document.ts +2 -2
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +76 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +19 -9
- package/src/github/github-publish.ts +24 -20
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +20 -22
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -6
- package/src/grid/grid-panel.ts +11 -4
- package/src/grid/grid-source.ts +8 -8
- package/src/grid/grid-view.ts +14 -17
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +25 -24
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +55 -34
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +1 -2
- package/src/media/media-pane.ts +4 -1
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +17 -9
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +46 -35
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +31 -24
- package/src/panels/data-explorer.ts +62 -25
- package/src/panels/data-grid.ts +14 -11
- package/src/panels/dnd.ts +108 -118
- package/src/panels/editors.ts +55 -22
- package/src/panels/elements-panel.ts +10 -3
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +76 -51
- package/src/panels/frontmatter-fields.ts +24 -19
- package/src/panels/frontmatter-panel.ts +44 -34
- package/src/panels/git-diff-open.ts +4 -4
- package/src/panels/git-panel.ts +49 -61
- package/src/panels/head-panel.ts +131 -111
- package/src/panels/i18n-panel.ts +10 -3
- package/src/panels/imports-panel.ts +23 -47
- package/src/panels/jump-bar.ts +48 -29
- package/src/panels/layers-panel.ts +97 -74
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/pane-context.ts +31 -22
- package/src/panels/pane-grid.ts +49 -20
- package/src/panels/panel-registry.ts +22 -37
- package/src/panels/properties-panel.ts +175 -121
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +3 -3
- package/src/panels/seo-modal.ts +13 -17
- package/src/panels/settings-menu.ts +15 -15
- package/src/panels/signals-panel.ts +153 -131
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +254 -216
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +57 -54
- package/src/panels/stylebook-layers-panel.ts +9 -9
- package/src/panels/stylebook-panel.ts +13 -17
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +36 -26
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +58 -30
- package/src/platforms/cloud.ts +345 -175
- package/src/platforms/default-platform.ts +10 -4
- package/src/platforms/devserver.ts +174 -127
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +8 -2
- package/src/publish/pages-service.ts +28 -13
- package/src/publish/publish-commands.ts +5 -4
- package/src/publish/publish-panel.ts +10 -6
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +58 -31
- package/src/services/cem-export.ts +149 -58
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +18 -12
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +8 -7
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +79 -60
- package/src/settings/css-vars-editor.ts +37 -16
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +23 -13
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +11 -8
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +9 -6
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/schema-field-ui.ts +9 -0
- package/src/settings/settings-document.ts +5 -5
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +104 -81
- package/src/site-context.ts +37 -22
- package/src/state.ts +41 -49
- package/src/store.ts +54 -34
- package/src/studio.ts +39 -77
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +6 -7
- package/src/style/token-ref.ts +5 -4
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +31 -36
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.ts +12 -11
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/commandbar.ts +14 -9
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/doc-header.ts +10 -19
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.ts +14 -11
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/git-panel.ts +7 -15
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.ts +13 -12
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.ts +25 -20
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.ts +11 -10
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/menu.ts +29 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.ts +20 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.ts +5 -6
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.ts +11 -18
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.ts +20 -34
- package/src/surfaces/panel-stylebook-layers.ts +5 -8
- package/src/surfaces/preferences.ts +21 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +126 -73
- package/src/surfaces/rail.ts +38 -12
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.ts +15 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.ts +14 -10
- package/src/surfaces/settings-css-vars.ts +5 -12
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.ts +8 -15
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.ts +5 -6
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.ts +9 -18
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/slash-menu.ts +19 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +17 -14
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +5 -7
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +52 -41
- package/src/tabs/transact.ts +98 -53
- package/src/tabs/typing.ts +31 -0
- package/src/types.ts +32 -17
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +57 -48
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +44 -31
- package/src/ui/media-picker.ts +18 -9
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +113 -70
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +3 -2
- package/src/utils/base64.ts +3 -1
- package/src/utils/edit-display.ts +103 -74
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +10 -12
- package/src/workspace/session.ts +53 -43
- package/src/workspace/workspace.ts +47 -36
- package/dist/chunks/2020-nkxms0ay.js +0 -4
- package/dist/chunks/adapter-m948ab5f.js +0 -4
- package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
- package/dist/chunks/cf-settings-356xdtne.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-yk3t844e.js +0 -4
- package/dist/chunks/content-source-bawmyc09.js +0 -4
- package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-6sc8nacq.js +0 -4
- package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
- package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
- package/dist/chunks/file-ops-gye0qw56.js +0 -4
- package/dist/chunks/files-dmc2xvcq.js +0 -4
- package/dist/chunks/format-host-t76b53f8.js +0 -4
- package/dist/chunks/fs-events-cg4tpz06.js +0 -4
- package/dist/chunks/git-panel-yef7bshy.js +0 -4
- package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
- package/dist/chunks/icons-qbh8akb1.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-tmz30gfp.js +0 -4
- package/dist/chunks/index-nag78a9h.js +0 -4
- package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
- package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
- package/dist/chunks/layers-fvz99859.js +0 -4
- package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-9agdspkt.js +0 -4
- package/dist/chunks/media-picker-rhjvyy00.js +0 -4
- package/dist/chunks/menu-2e4y9j7b.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
- package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
- package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
- package/dist/chunks/notify-h3www560.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-hz34wcd7.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
- package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
- package/dist/chunks/references-2cgdxnb8.js +0 -4
- package/dist/chunks/right-panel-jf856w5w.js +0 -4
- package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0f55h9ye.js +0 -5
- package/dist/chunks/studio-0sqdhnew.js +0 -12
- package/dist/chunks/studio-19x1c75w.js +0 -5
- package/dist/chunks/studio-2sqcndak.js +0 -5
- package/dist/chunks/studio-3aey7dd3.js +0 -5
- package/dist/chunks/studio-3bpdkq2s.js +0 -5
- package/dist/chunks/studio-47y6fbpf.js +0 -5
- package/dist/chunks/studio-4m3826v2.js +0 -5
- package/dist/chunks/studio-4nx2dj1g.js +0 -4
- package/dist/chunks/studio-4xv5s47r.js +0 -9
- package/dist/chunks/studio-5g4t8v6w.js +0 -5
- package/dist/chunks/studio-5py436sf.js +0 -5
- package/dist/chunks/studio-77kt594t.js +0 -5
- package/dist/chunks/studio-8f87n763.js +0 -10
- package/dist/chunks/studio-8mb00b84.js +0 -5
- package/dist/chunks/studio-8p51gq2h.js +0 -6
- package/dist/chunks/studio-954ds834.js +0 -5
- package/dist/chunks/studio-9ft45c83.js +0 -9
- package/dist/chunks/studio-a2138x5k.js +0 -7
- package/dist/chunks/studio-a9yzstqj.js +0 -5
- package/dist/chunks/studio-acdksxx6.js +0 -5
- package/dist/chunks/studio-ar8jcf2y.js +0 -5
- package/dist/chunks/studio-bmn4mn9j.js +0 -7
- package/dist/chunks/studio-e7xxa0sj.js +0 -5
- package/dist/chunks/studio-ecaz25vk.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-fzdywr6p.js +0 -9
- package/dist/chunks/studio-g5fmf0c1.js +0 -5
- package/dist/chunks/studio-g7nse7zb.js +0 -5
- package/dist/chunks/studio-geq1ea6k.js +0 -14
- package/dist/chunks/studio-ghkb32r8.js +0 -5
- package/dist/chunks/studio-ghrhy2y7.js +0 -5
- package/dist/chunks/studio-grawhey1.js +0 -5
- package/dist/chunks/studio-h0xgswew.js +0 -5
- package/dist/chunks/studio-h9c4p2tx.js +0 -5
- package/dist/chunks/studio-jyzj5cxs.js +0 -5
- package/dist/chunks/studio-mgx8yhnz.js +0 -64
- package/dist/chunks/studio-mpb04y1d.js +0 -6
- package/dist/chunks/studio-n17mty64.js +0 -5
- package/dist/chunks/studio-nwh2eqsk.js +0 -6
- package/dist/chunks/studio-q1h883bt.js +0 -16
- package/dist/chunks/studio-q4tv82h7.js +0 -9
- package/dist/chunks/studio-qpqa7vk3.js +0 -5
- package/dist/chunks/studio-qqz8e5gk.js +0 -5
- package/dist/chunks/studio-qvasen3f.js +0 -5
- package/dist/chunks/studio-rggdb3hm.js +0 -5
- package/dist/chunks/studio-sghy936h.js +0 -4
- package/dist/chunks/studio-skprc6ef.js +0 -5
- package/dist/chunks/studio-tt2nactf.js +0 -5
- package/dist/chunks/studio-tyasmc39.js +0 -5
- package/dist/chunks/studio-vk9ezads.js +0 -5
- package/dist/chunks/studio-vzacdfsc.js +0 -4
- package/dist/chunks/studio-w4c0xmrw.js +0 -5
- package/dist/chunks/studio-wfjqhhbk.js +0 -5
- package/dist/chunks/studio-wgh5kxpj.js +0 -5
- package/dist/chunks/studio-xasj0796.js +0 -5
- package/dist/chunks/studio-y78s8r2n.js +0 -5
- package/dist/chunks/studio-z8w183sh.js +0 -5
- package/dist/chunks/studio-zscd9ty4.js +0 -928
- package/dist/chunks/studio-zxp13sss.js +0 -7
- package/dist/chunks/studio-zygnmm01.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-gr0m4dzr.js +0 -14
- package/dist/chunks/workspace-m15qtcqp.js +0 -4
- package/dist/chunks/ws-client-nf61frr1.js +0 -4
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* @docs studio/projects/settings
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
21
22
|
import { reactive } from "../reactivity";
|
|
22
23
|
import { projectState } from "../store";
|
|
23
24
|
import { updateSiteConfig } from "../site-context";
|
|
@@ -29,24 +30,15 @@ import {
|
|
|
29
30
|
isGoogleFontEntry,
|
|
30
31
|
} from "../utils/google-fonts";
|
|
31
32
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
33
|
+
import { HEAD_EDIT_DEBOUNCE } from "../ui/timing";
|
|
32
34
|
import headDoc from "./settings-head.json";
|
|
33
|
-
import type {
|
|
34
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
35
|
+
import type { JsonValue, JxHeadEntry, ProjectConfig } from "@jxsuite/schema/types";
|
|
36
|
+
import type { SurfaceHandle, TaggedLabel } from "../ui/surface";
|
|
35
37
|
|
|
36
|
-
registerSurface("settings-head", headDoc
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* How long a keystroke waits before it is written.
|
|
40
|
-
*
|
|
41
|
-
* Every field commit is a `project.json` write, and the two body fields commit on `input` — one
|
|
42
|
-
* write per keystroke without this. The lit editor debounced per ENTRY, with one timer shared by
|
|
43
|
-
* that entry's fields, so editing `rel` and then `href` inside the window cancelled the first write
|
|
44
|
-
* outright; the timers are per field here, which is why each edit lands.
|
|
45
|
-
*/
|
|
46
|
-
const EDIT_DEBOUNCE_MS = 300;
|
|
38
|
+
registerSurface("settings-head", headDoc);
|
|
47
39
|
|
|
48
40
|
/** One `$head` entry as the document draws it: which fields, and what is in them. */
|
|
49
|
-
interface HeadRow
|
|
41
|
+
interface HeadRow {
|
|
50
42
|
id: string;
|
|
51
43
|
/** The tag name, drawn as `<link>` and named in the delete button. */
|
|
52
44
|
tag: string;
|
|
@@ -64,18 +56,12 @@ interface HeadRow extends Record<string, unknown> {
|
|
|
64
56
|
}
|
|
65
57
|
|
|
66
58
|
/** One Google Fonts stylesheet link, by the family it loads. */
|
|
67
|
-
interface FontRow
|
|
59
|
+
interface FontRow {
|
|
68
60
|
id: string;
|
|
69
61
|
family: string;
|
|
70
62
|
}
|
|
71
63
|
|
|
72
|
-
|
|
73
|
-
interface AddTag extends Record<string, unknown> {
|
|
74
|
-
tag: string;
|
|
75
|
-
label: string;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
interface HeadScope extends Record<string, unknown> {
|
|
64
|
+
interface HeadScope {
|
|
79
65
|
rows: HeadRow[];
|
|
80
66
|
fonts: FontRow[];
|
|
81
67
|
/**
|
|
@@ -85,7 +71,8 @@ interface HeadScope extends Record<string, unknown> {
|
|
|
85
71
|
fontsState: "empty" | "listed";
|
|
86
72
|
/** What is in the family field. The document reads it back, so clearing it is an assignment. */
|
|
87
73
|
fontDraft: string;
|
|
88
|
-
tags
|
|
74
|
+
/** The four tags the section can add, each with the words on the button that adds it. */
|
|
75
|
+
tags: TaggedLabel[];
|
|
89
76
|
add: (tag: string) => void;
|
|
90
77
|
remove: (id: string) => void;
|
|
91
78
|
edit: (id: string, key: string, value: string) => void;
|
|
@@ -94,7 +81,7 @@ interface HeadScope extends Record<string, unknown> {
|
|
|
94
81
|
removeFont: (id: string) => void;
|
|
95
82
|
}
|
|
96
83
|
|
|
97
|
-
const ADD_TAGS:
|
|
84
|
+
const ADD_TAGS: TaggedLabel[] = [
|
|
98
85
|
{ label: "+ Link", tag: "link" },
|
|
99
86
|
{ label: "+ Meta", tag: "meta" },
|
|
100
87
|
{ label: "+ Script", tag: "script" },
|
|
@@ -137,7 +124,7 @@ let _entries: JxHeadEntry[] = [];
|
|
|
137
124
|
* between would answer "no entries" and lose the tag that was just added.
|
|
138
125
|
*/
|
|
139
126
|
function entries(): JxHeadEntry[] {
|
|
140
|
-
const config =
|
|
127
|
+
const config = projectState?.projectConfig ?? null;
|
|
141
128
|
if (config !== _config) {
|
|
142
129
|
_config = config;
|
|
143
130
|
_entries = [];
|
|
@@ -150,7 +137,7 @@ function entries(): JxHeadEntry[] {
|
|
|
150
137
|
}
|
|
151
138
|
const declared = config?.$head;
|
|
152
139
|
if (Array.isArray(declared)) {
|
|
153
|
-
_entries = declared
|
|
140
|
+
_entries = declared;
|
|
154
141
|
}
|
|
155
142
|
return _entries;
|
|
156
143
|
}
|
|
@@ -161,8 +148,8 @@ function entryFor(id: string): JxHeadEntry | undefined {
|
|
|
161
148
|
}
|
|
162
149
|
|
|
163
150
|
/** A `$head` attribute as a field's text: anything that is not a string has none to show. */
|
|
164
|
-
function text(value:
|
|
165
|
-
return
|
|
151
|
+
function text(value: JsonValue | undefined): string {
|
|
152
|
+
return isString(value) ? value : "";
|
|
166
153
|
}
|
|
167
154
|
|
|
168
155
|
// ─── The projection ───────────────────────────────────────────────────────────
|
|
@@ -171,19 +158,21 @@ function text(value: unknown): string {
|
|
|
171
158
|
function row(entry: JxHeadEntry): HeadRow {
|
|
172
159
|
const attributes = entry.attributes ?? {};
|
|
173
160
|
const src = text(attributes["src"]);
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
161
|
+
/* `project.json` is read off disk unvalidated, so an entry can arrive without a `tagName`; like
|
|
162
|
+
an attribute, a tag that is not a string has none to show. */
|
|
163
|
+
const tag = text(entry.tagName);
|
|
164
|
+
const kinds = new Map<string, HeadRow["kind"]>([
|
|
165
|
+
["link", "link"],
|
|
166
|
+
["meta", "meta"],
|
|
167
|
+
["script", src === "" ? "script-inline" : "script"],
|
|
168
|
+
["style", "style"],
|
|
169
|
+
]);
|
|
181
170
|
return {
|
|
182
171
|
body: text(entry.textContent),
|
|
183
172
|
content: text(attributes["content"]),
|
|
184
173
|
href: text(attributes["href"]),
|
|
185
174
|
id: idOf(entry),
|
|
186
|
-
kind: kinds
|
|
175
|
+
kind: kinds.get(tag) ?? "none",
|
|
187
176
|
name: text(attributes["name"]),
|
|
188
177
|
rel: text(attributes["rel"]),
|
|
189
178
|
src,
|
|
@@ -212,7 +201,12 @@ function save(): void {
|
|
|
212
201
|
void updateSiteConfig({ $head: entries() });
|
|
213
202
|
}
|
|
214
203
|
|
|
215
|
-
/**
|
|
204
|
+
/**
|
|
205
|
+
* Field edits waiting out {@link HEAD_EDIT_DEBOUNCE}, one per field. The two body fields commit on
|
|
206
|
+
* `input`, so without the wait every keystroke would be a `project.json` write; the lit editor
|
|
207
|
+
* shared one timer per ENTRY, so editing `rel` and then `href` inside the window cancelled the
|
|
208
|
+
* first write outright.
|
|
209
|
+
*/
|
|
216
210
|
const _pending = new Map<string, { commit: () => void; timer: ReturnType<typeof setTimeout> }>();
|
|
217
211
|
|
|
218
212
|
/**
|
|
@@ -302,7 +296,7 @@ function state(): HeadScope {
|
|
|
302
296
|
_pending.delete(token);
|
|
303
297
|
write(id, key, value);
|
|
304
298
|
};
|
|
305
|
-
_pending.set(token, { commit, timer: setTimeout(commit,
|
|
299
|
+
_pending.set(token, { commit, timer: setTimeout(commit, HEAD_EDIT_DEBOUNCE) });
|
|
306
300
|
},
|
|
307
301
|
fonts: [],
|
|
308
302
|
fontDraft: "",
|
|
@@ -339,7 +333,7 @@ function state(): HeadScope {
|
|
|
339
333
|
},
|
|
340
334
|
rows: [],
|
|
341
335
|
tags: ADD_TAGS,
|
|
342
|
-
})
|
|
336
|
+
});
|
|
343
337
|
return _scope;
|
|
344
338
|
}
|
|
345
339
|
|
|
@@ -24,28 +24,16 @@
|
|
|
24
24
|
import { reactive } from "../reactivity";
|
|
25
25
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
26
26
|
import localesDoc from "./settings-locales.json";
|
|
27
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
28
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
27
|
+
import type { SurfaceHandle, SurfaceOption, TaggedLabel } from "../ui/surface";
|
|
29
28
|
|
|
30
|
-
registerSurface("settings-locales", localesDoc
|
|
31
|
-
|
|
32
|
-
/** One declared language: the tag as the author wrote it, and the name that language calls itself. */
|
|
33
|
-
export interface LocaleRow {
|
|
34
|
-
tag: string;
|
|
35
|
-
label: string;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** One row of a picker. */
|
|
39
|
-
export interface LocaleChoice {
|
|
40
|
-
value: string;
|
|
41
|
-
label: string;
|
|
42
|
-
}
|
|
29
|
+
registerSurface("settings-locales", localesDoc);
|
|
43
30
|
|
|
44
31
|
/** What the section shows — the flow's projection of `project.json` and of the form beside it. */
|
|
45
32
|
export interface LocalesView {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
33
|
+
/** Each declared language: the tag as the author wrote it, and the name it calls itself. */
|
|
34
|
+
locales: TaggedLabel[];
|
|
35
|
+
localeOptions: SurfaceOption[];
|
|
36
|
+
routings: SurfaceOption[];
|
|
49
37
|
defaultLocale: string;
|
|
50
38
|
routing: string;
|
|
51
39
|
/** The tag being typed, kept so an outside redraw does not take it away. */
|
|
@@ -80,7 +68,7 @@ interface LocalesFlags {
|
|
|
80
68
|
hasError: boolean;
|
|
81
69
|
}
|
|
82
70
|
|
|
83
|
-
interface LocalesScope extends
|
|
71
|
+
interface LocalesScope extends LocalesView, LocalesActions, LocalesFlags {}
|
|
84
72
|
|
|
85
73
|
interface Mounted {
|
|
86
74
|
scope: LocalesScope;
|
|
@@ -124,7 +112,7 @@ export function renderLocalesSurface(
|
|
|
124
112
|
}
|
|
125
113
|
existing?.handle?.dispose();
|
|
126
114
|
host.textContent = "";
|
|
127
|
-
const scope = reactive({ ...derive(view), ...actions })
|
|
115
|
+
const scope: LocalesScope = reactive<LocalesScope>({ ...derive(view), ...actions });
|
|
128
116
|
const record: Mounted = { handle: null, scope };
|
|
129
117
|
mounts.set(host, record);
|
|
130
118
|
/* No race to arbitrate: a redraw arriving while this is in flight takes the branch above — a
|
|
@@ -24,10 +24,9 @@
|
|
|
24
24
|
import { reactive } from "../reactivity";
|
|
25
25
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
26
26
|
import overviewDoc from "./settings-overview.json";
|
|
27
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
28
27
|
import type { SurfaceHandle } from "../ui/surface";
|
|
29
28
|
|
|
30
|
-
registerSurface("settings-overview", overviewDoc
|
|
29
|
+
registerSurface("settings-overview", overviewDoc);
|
|
31
30
|
|
|
32
31
|
/** Which control a failure belongs under. `"section"` puts it at the top of the section. */
|
|
33
32
|
export type OverviewErrorField = "name" | "description" | "url" | "favicon" | "section";
|
|
@@ -74,7 +73,7 @@ export interface OverviewSurfaceHandle {
|
|
|
74
73
|
* The scope the document reads: one field per binding, because `$switch` is the only conditional a
|
|
75
74
|
* document has and `error.field === "name"` is not a value it can switch on.
|
|
76
75
|
*/
|
|
77
|
-
interface OverviewScope
|
|
76
|
+
interface OverviewScope {
|
|
78
77
|
nameValue: string;
|
|
79
78
|
nameError: string;
|
|
80
79
|
nameInvalid: boolean;
|
|
@@ -157,7 +156,7 @@ export function mountOverviewSurface(
|
|
|
157
156
|
values: OverviewValues,
|
|
158
157
|
actions: OverviewActions,
|
|
159
158
|
): OverviewSurfaceHandle {
|
|
160
|
-
const scope = reactive<OverviewScope>({
|
|
159
|
+
const scope: OverviewScope = reactive<OverviewScope>({
|
|
161
160
|
descriptionError: "",
|
|
162
161
|
descriptionInvalid: false,
|
|
163
162
|
descriptionValue: "",
|
|
@@ -180,7 +179,7 @@ export function mountOverviewSurface(
|
|
|
180
179
|
urlError: "",
|
|
181
180
|
urlInvalid: false,
|
|
182
181
|
urlValue: "",
|
|
183
|
-
})
|
|
182
|
+
});
|
|
184
183
|
project(scope, values);
|
|
185
184
|
|
|
186
185
|
container.replaceChildren();
|
|
@@ -208,7 +207,7 @@ export function mountOverviewSurface(
|
|
|
208
207
|
!disposed &&
|
|
209
208
|
(mounted === null
|
|
210
209
|
? container.childNodes.length === 0
|
|
211
|
-
:
|
|
210
|
+
: mounted.root.parentNode === container),
|
|
212
211
|
dispose() {
|
|
213
212
|
disposed = true;
|
|
214
213
|
mounted?.dispose();
|
|
@@ -32,9 +32,8 @@ import { reactive } from "../reactivity";
|
|
|
32
32
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
33
33
|
import packagesDoc from "./settings-packages.json";
|
|
34
34
|
import type { SurfaceHandle } from "../ui/surface";
|
|
35
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
36
35
|
|
|
37
|
-
registerSurface("settings-packages", packagesDoc
|
|
36
|
+
registerSurface("settings-packages", packagesDoc);
|
|
38
37
|
|
|
39
38
|
/** One dependency, as the table draws it. Every field is already a string the row can print. */
|
|
40
39
|
export interface PackageRow {
|
|
@@ -79,7 +78,7 @@ export interface PackagesActions {
|
|
|
79
78
|
}
|
|
80
79
|
|
|
81
80
|
/** One row plus the flag its buttons switch on. */
|
|
82
|
-
interface RowScope extends
|
|
81
|
+
interface RowScope extends PackageRow {
|
|
83
82
|
/** Whether to draw the update button — `upgrade` said as something a `$switch` can read. */
|
|
84
83
|
canUpdate: boolean;
|
|
85
84
|
}
|
|
@@ -96,11 +95,13 @@ interface PackagesFlags {
|
|
|
96
95
|
hasUpdates: boolean;
|
|
97
96
|
}
|
|
98
97
|
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
/** Everything {@link derive} computes from a view: the scope minus the reader's actions. */
|
|
99
|
+
interface PackagesDerived extends Omit<PackagesView, "rows">, PackagesFlags {
|
|
101
100
|
rows: RowScope[];
|
|
102
101
|
}
|
|
103
102
|
|
|
103
|
+
interface PackagesScope extends PackagesDerived, PackagesActions {}
|
|
104
|
+
|
|
104
105
|
interface Mounted {
|
|
105
106
|
scope: PackagesScope;
|
|
106
107
|
/** `null` while the mount is still in flight — which is a standing surface, not a missing one. */
|
|
@@ -110,7 +111,7 @@ interface Mounted {
|
|
|
110
111
|
const mounts = new WeakMap<HTMLElement, Mounted>();
|
|
111
112
|
|
|
112
113
|
/** The view plus the flags the document switches on. */
|
|
113
|
-
function derive(view: PackagesView):
|
|
114
|
+
function derive(view: PackagesView): PackagesDerived {
|
|
114
115
|
const rows = view.rows.map((row): RowScope => ({ ...row, canUpdate: row.upgrade !== "" }));
|
|
115
116
|
return {
|
|
116
117
|
addName: view.addName,
|
|
@@ -145,7 +146,7 @@ export function renderPackagesSurface(
|
|
|
145
146
|
}
|
|
146
147
|
existing?.handle?.dispose();
|
|
147
148
|
host.textContent = "";
|
|
148
|
-
const scope = reactive({ ...derive(view), ...actions })
|
|
149
|
+
const scope: PackagesScope = reactive<PackagesScope>({ ...derive(view), ...actions });
|
|
149
150
|
const record: Mounted = { handle: null, scope };
|
|
150
151
|
mounts.set(host, record);
|
|
151
152
|
/* No race to arbitrate: a redraw arriving while this is in flight takes the branch above — a
|
|
@@ -15,22 +15,14 @@
|
|
|
15
15
|
* @docs studio/projects/settings
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
18
19
|
import { reactive } from "../reactivity";
|
|
19
20
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
20
21
|
import settingsPaneDoc from "./settings-pane.json";
|
|
21
|
-
import type {
|
|
22
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
22
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
23
|
+
import type { SurfaceHandle, SurfaceTab } from "../ui/surface";
|
|
23
24
|
|
|
24
|
-
registerSurface("settings-pane", settingsPaneDoc
|
|
25
|
-
|
|
26
|
-
/** One row of the section list, as the document draws it. */
|
|
27
|
-
export interface SettingsNavView {
|
|
28
|
-
/** The section key — the row's identity, its `value`, and what the strip compares `selected` to. */
|
|
29
|
-
key: string;
|
|
30
|
-
label: string;
|
|
31
|
-
/** The row's own element id, which the one panel names as its `aria-labelledby`. */
|
|
32
|
-
tabId: string;
|
|
33
|
-
}
|
|
25
|
+
registerSurface("settings-pane", settingsPaneDoc);
|
|
34
26
|
|
|
35
27
|
/** What the editor says right now. */
|
|
36
28
|
export interface SettingsPaneValues {
|
|
@@ -40,7 +32,7 @@ export interface SettingsPaneValues {
|
|
|
40
32
|
active: string;
|
|
41
33
|
/** The current section's row id, so the body is named by the row that chose it. */
|
|
42
34
|
activeTabId: string;
|
|
43
|
-
sections:
|
|
35
|
+
sections: SurfaceTab[];
|
|
44
36
|
/**
|
|
45
37
|
* Whether a renderer will draw into the island.
|
|
46
38
|
*
|
|
@@ -75,13 +67,12 @@ export interface SettingsPaneHandle {
|
|
|
75
67
|
dispose: () => void;
|
|
76
68
|
}
|
|
77
69
|
|
|
78
|
-
interface SettingsPaneScope
|
|
79
|
-
extends Record<string, unknown>, SettingsPaneValues, SettingsPaneActions {}
|
|
70
|
+
interface SettingsPaneScope extends SettingsPaneValues, SettingsPaneActions {}
|
|
80
71
|
|
|
81
72
|
/** The `part` a node was declared with, or the empty string. */
|
|
82
73
|
function partOf(def: JxElement | string): string {
|
|
83
|
-
const part =
|
|
84
|
-
return
|
|
74
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
75
|
+
return isString(part) ? part : "";
|
|
85
76
|
}
|
|
86
77
|
|
|
87
78
|
/**
|
|
@@ -101,7 +92,7 @@ export function mountSettingsPaneSurface(
|
|
|
101
92
|
values: SettingsPaneValues,
|
|
102
93
|
actions: SettingsPaneActions,
|
|
103
94
|
): SettingsPaneHandle {
|
|
104
|
-
const scope = reactive<SettingsPaneScope>({ ...values, ...actions })
|
|
95
|
+
const scope: SettingsPaneScope = reactive<SettingsPaneScope>({ ...values, ...actions });
|
|
105
96
|
|
|
106
97
|
container.textContent = "";
|
|
107
98
|
// @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
|
|
@@ -16,10 +16,9 @@
|
|
|
16
16
|
import { reactive } from "../reactivity";
|
|
17
17
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
18
18
|
import rawJsonDoc from "./settings-rawjson.json";
|
|
19
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
20
19
|
import type { SurfaceHandle } from "../ui/surface";
|
|
21
20
|
|
|
22
|
-
registerSurface("settings-rawjson", rawJsonDoc
|
|
21
|
+
registerSurface("settings-rawjson", rawJsonDoc);
|
|
23
22
|
|
|
24
23
|
/** What the section says the surface should be showing right now. */
|
|
25
24
|
export interface RawJsonValues {
|
|
@@ -43,7 +42,7 @@ export interface RawJsonSurfaceHandle {
|
|
|
43
42
|
}
|
|
44
43
|
|
|
45
44
|
/** The scope the document reads. */
|
|
46
|
-
interface RawJsonScope
|
|
45
|
+
interface RawJsonScope {
|
|
47
46
|
json: string;
|
|
48
47
|
editAsCode: () => void;
|
|
49
48
|
}
|
|
@@ -66,10 +65,10 @@ export function mountRawJsonSurface(
|
|
|
66
65
|
values: RawJsonValues,
|
|
67
66
|
actions: RawJsonActions,
|
|
68
67
|
): RawJsonSurfaceHandle {
|
|
69
|
-
const scope = reactive<RawJsonScope>({
|
|
68
|
+
const scope: RawJsonScope = reactive<RawJsonScope>({
|
|
70
69
|
editAsCode: actions.editAsCode,
|
|
71
70
|
json: "",
|
|
72
|
-
})
|
|
71
|
+
});
|
|
73
72
|
project(scope, values);
|
|
74
73
|
|
|
75
74
|
container.replaceChildren();
|
|
@@ -96,7 +95,7 @@ export function mountRawJsonSurface(
|
|
|
96
95
|
!disposed &&
|
|
97
96
|
(mounted === null
|
|
98
97
|
? container.childNodes.length === 0
|
|
99
|
-
:
|
|
98
|
+
: mounted.root.parentNode === container),
|
|
100
99
|
dispose() {
|
|
101
100
|
disposed = true;
|
|
102
101
|
mounted?.dispose();
|
package/src/surfaces/shell.ts
CHANGED
|
@@ -16,9 +16,8 @@
|
|
|
16
16
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
17
17
|
import shellDoc from "./shell.json";
|
|
18
18
|
import type { SurfaceHandle } from "../ui/surface";
|
|
19
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
20
19
|
|
|
21
|
-
registerSurface("shell", shellDoc
|
|
20
|
+
registerSurface("shell", shellDoc);
|
|
22
21
|
|
|
23
22
|
/**
|
|
24
23
|
* Render the frame into `host`, and resolve once its cells exist.
|
|
@@ -41,17 +41,16 @@ import { clearLayerSlot, getLayerSlot } from "../ui/layers";
|
|
|
41
41
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
42
42
|
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
43
43
|
import slashMenuDoc from "./slash-menu.json";
|
|
44
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
45
44
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
46
45
|
import type { SurfaceHandle } from "../ui/surface";
|
|
47
46
|
|
|
48
|
-
registerSurface("slash-menu", slashMenuDoc
|
|
47
|
+
registerSurface("slash-menu", slashMenuDoc);
|
|
49
48
|
|
|
50
49
|
/** The popover slot id; the region is `overlay.menu:slash-menu`, which is what the shots crop. */
|
|
51
50
|
const SLOT = "slash-menu";
|
|
52
51
|
|
|
53
52
|
/** One offer, as the document reads it. */
|
|
54
|
-
export interface SlashMenuRow
|
|
53
|
+
export interface SlashMenuRow {
|
|
55
54
|
/**
|
|
56
55
|
* The element's tag — unique in the list, so it is the repeater's key AND the row's `value`,
|
|
57
56
|
* which is what a picked row names in its `select` event.
|
|
@@ -103,7 +102,7 @@ export interface SlashMenuSurface {
|
|
|
103
102
|
}
|
|
104
103
|
|
|
105
104
|
/** The scope `slash-menu.json` reads. */
|
|
106
|
-
interface SlashMenuScope
|
|
105
|
+
interface SlashMenuScope {
|
|
107
106
|
x: number;
|
|
108
107
|
y: number;
|
|
109
108
|
showFilter: boolean;
|
|
@@ -168,7 +167,7 @@ export function openSlashMenuSurface(
|
|
|
168
167
|
let mounted: SurfaceHandle | null = null;
|
|
169
168
|
let closed = false;
|
|
170
169
|
|
|
171
|
-
const scope = reactive<SlashMenuScope>({
|
|
170
|
+
const scope: SlashMenuScope = reactive<SlashMenuScope>({
|
|
172
171
|
activeId: activeIdOf(view),
|
|
173
172
|
expanded: view.rows.length > 0,
|
|
174
173
|
filter: view.filter,
|
|
@@ -184,6 +183,9 @@ export function openSlashMenuSurface(
|
|
|
184
183
|
one bubbling handler on the listbox replaces a closure per row, and the position the flow
|
|
185
184
|
wants is resolved here against the list the panel is showing rather than baked into the
|
|
186
185
|
row when it was drawn. */
|
|
186
|
+
/* SAFETY: `slash-menu.json` binds this handler to the listbox's `onselect` alone, and `select`
|
|
187
|
+
is raised by the `dispatchEvent` statement in `jx-option.json`, which the runtime always
|
|
188
|
+
constructs as a `CustomEvent` whose `detail` is the row's value. */
|
|
187
189
|
const tag = String((event as CustomEvent<unknown>).detail);
|
|
188
190
|
const index = scope.rows.findIndex((row) => row.key === tag);
|
|
189
191
|
if (index !== -1) {
|
|
@@ -194,7 +196,7 @@ export function openSlashMenuSurface(
|
|
|
194
196
|
showFilter: view.showFilter,
|
|
195
197
|
x: view.x,
|
|
196
198
|
y: view.y,
|
|
197
|
-
})
|
|
199
|
+
});
|
|
198
200
|
|
|
199
201
|
const finish = (fromPlatform: boolean): void => {
|
|
200
202
|
if (closed) {
|
|
@@ -210,12 +212,20 @@ export function openSlashMenuSurface(
|
|
|
210
212
|
}
|
|
211
213
|
};
|
|
212
214
|
|
|
215
|
+
/* Read through a call, not the property path: `close()` can abort the controller while the panel
|
|
216
|
+
is awaiting `jx-ready`, and a direct test after that `await` would be narrowed to the value the
|
|
217
|
+
test before it saw. */
|
|
218
|
+
const aborted = (): boolean => controller.signal.aborted;
|
|
219
|
+
|
|
213
220
|
const ready = (async () => {
|
|
214
221
|
const surface = await mountSurface("slash-menu", scope, slot, { signal: controller.signal });
|
|
215
|
-
if (
|
|
222
|
+
if (aborted()) {
|
|
216
223
|
return;
|
|
217
224
|
}
|
|
218
225
|
mounted = surface;
|
|
226
|
+
/* SAFETY: `slash-menu.json`'s root definition carries `tagName: "jx-popover"`, so the mounted
|
|
227
|
+
root is the kit's popover element, which reflects `open` and inherits `showPopover` and
|
|
228
|
+
`hidePopover` from HTMLElement. */
|
|
219
229
|
panel = surface.root as PopoverElement;
|
|
220
230
|
/* The region rides on the PANEL as well as on the slot `getLayerSlot` stamped: a popover is
|
|
221
231
|
`position: fixed` in the top layer, so the slot around it has a zero-height box and the
|
|
@@ -223,7 +233,7 @@ export function openSlashMenuSurface(
|
|
|
223
233
|
takes the last match in document order, which is the panel. */
|
|
224
234
|
panel.setAttribute(REGION_ATTR, overlayRegion("popover", SLOT));
|
|
225
235
|
panel.addEventListener("toggle", (event) => {
|
|
226
|
-
if (
|
|
236
|
+
if (event.newState === "closed") {
|
|
227
237
|
finish(true);
|
|
228
238
|
}
|
|
229
239
|
});
|
|
@@ -234,7 +244,7 @@ export function openSlashMenuSurface(
|
|
|
234
244
|
panel!.addEventListener("jx-ready", () => resolve(), { once: true });
|
|
235
245
|
});
|
|
236
246
|
}
|
|
237
|
-
if (
|
|
247
|
+
if (aborted()) {
|
|
238
248
|
return;
|
|
239
249
|
}
|
|
240
250
|
panel.showPopover(anchor instanceof HTMLElement ? { source: anchor } : undefined);
|
|
@@ -26,25 +26,20 @@
|
|
|
26
26
|
* @docs studio/logic/statements
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
29
30
|
import { reactive } from "../reactivity";
|
|
30
31
|
import { REGION_ATTR } from "../ui/regions";
|
|
31
32
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
32
33
|
import statementsDoc from "./statements.json";
|
|
33
|
-
import type {
|
|
34
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
34
35
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
35
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
36
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
36
37
|
|
|
37
|
-
registerSurface("statements", statementsDoc
|
|
38
|
+
registerSurface("statements", statementsDoc);
|
|
38
39
|
|
|
39
40
|
/** Which control one operand of a statement draws. The flow picks it; the document switches on it. */
|
|
40
41
|
export type StatementFieldKind = "control" | "text" | "select" | "flags";
|
|
41
42
|
|
|
42
|
-
/** A closed list of choices, in the shape the kit's select reads. */
|
|
43
|
-
export interface StatementOption {
|
|
44
|
-
value: string;
|
|
45
|
-
label: string;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
43
|
/** One `eventInit` flag of a `dispatchEvent` statement. */
|
|
49
44
|
export interface StatementFlagView {
|
|
50
45
|
/** `<row>::<prop>::<flag>` — self-contained, because a third `$map` shadows both above it. */
|
|
@@ -64,7 +59,7 @@ export interface StatementFieldView {
|
|
|
64
59
|
/** What a `text` or `select` control holds. Empty for the other two kinds. */
|
|
65
60
|
value: string;
|
|
66
61
|
placeholder: string;
|
|
67
|
-
options:
|
|
62
|
+
options: SurfaceOption[];
|
|
68
63
|
flags: StatementFlagView[];
|
|
69
64
|
}
|
|
70
65
|
|
|
@@ -119,7 +114,7 @@ export interface StatementIslands {
|
|
|
119
114
|
controlSlot: (id: string, host: HTMLElement) => void;
|
|
120
115
|
}
|
|
121
116
|
|
|
122
|
-
interface StatementScope extends
|
|
117
|
+
interface StatementScope extends StatementActions {
|
|
123
118
|
rows: StatementRowView[];
|
|
124
119
|
}
|
|
125
120
|
|
|
@@ -171,7 +166,7 @@ export function renderStatementsSurface(
|
|
|
171
166
|
region is a fact about the HOST — who is drawing this editor — not about the document inside
|
|
172
167
|
it, so it should be true the moment the host is claimed rather than a frame later. */
|
|
173
168
|
host.setAttribute(REGION_ATTR, region);
|
|
174
|
-
const scope = reactive({ ...actions, rows })
|
|
169
|
+
const scope: StatementScope = reactive<StatementScope>({ ...actions, rows });
|
|
175
170
|
const record: Mounted = { disposed: false, handle: null, scope };
|
|
176
171
|
mounts.set(host, record);
|
|
177
172
|
/* No race to arbitrate: a repaint arriving while this is in flight takes the branch above — a
|
|
@@ -200,16 +195,16 @@ export function renderStatementsSurface(
|
|
|
200
195
|
|
|
201
196
|
/** The `part` a node was rendered with, or "". */
|
|
202
197
|
function partOf(def: JxElement | string): string {
|
|
203
|
-
const part =
|
|
204
|
-
return
|
|
198
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
199
|
+
return isString(part) ? part : "";
|
|
205
200
|
}
|
|
206
201
|
|
|
207
202
|
/** The `key` of the `$map` item a node was rendered inside, or "". */
|
|
208
203
|
function itemKey(state: JxScope | undefined): string {
|
|
209
|
-
const
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
return
|
|
204
|
+
const map = state?.["$map"];
|
|
205
|
+
const item = isJsonObject(map) ? map["item"] : undefined;
|
|
206
|
+
const key = isJsonObject(item) ? item["key"] : "";
|
|
207
|
+
return isString(key) ? key : "";
|
|
213
208
|
}
|
|
214
209
|
|
|
215
210
|
/**
|