@formicoidea/labre-core 0.31.0 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_pkgs/affine-block-callout/callout-block.d.ts +6 -0
- package/dist/_pkgs/affine-block-callout/callout-block.js +25 -3
- package/dist/_pkgs/affine-block-callout/callout-keymap.js +59 -19
- package/dist/_pkgs/affine-block-callout/commands/callout-to-paragraph.d.ts +20 -0
- package/dist/_pkgs/affine-block-callout/commands/callout-to-paragraph.js +60 -0
- package/dist/_pkgs/affine-block-callout/commands/split-callout.d.ts +17 -0
- package/dist/_pkgs/affine-block-callout/commands/split-callout.js +42 -0
- package/dist/_pkgs/affine-block-callout/configs/slash-menu.js +9 -6
- package/dist/_pkgs/affine-block-callout/emoji-margin.d.ts +9 -0
- package/dist/_pkgs/affine-block-callout/emoji-margin.js +36 -0
- package/dist/_pkgs/affine-block-callout/emoji-menu.d.ts +5 -1
- package/dist/_pkgs/affine-block-callout/emoji-menu.js +5 -0
- package/dist/_pkgs/affine-block-code/code-block.d.ts +14 -0
- package/dist/_pkgs/affine-block-code/code-block.js +44 -6
- package/dist/_pkgs/affine-block-code/code-toolbar/components/code-toolbar.d.ts +2 -0
- package/dist/_pkgs/affine-block-code/code-toolbar/components/code-toolbar.js +23 -14
- package/dist/_pkgs/affine-block-code/code-toolbar/components/more-menu.d.ts +16 -0
- package/dist/_pkgs/affine-block-code/code-toolbar/components/more-menu.js +93 -0
- package/dist/_pkgs/affine-block-code/code-toolbar/config.js +52 -5
- package/dist/_pkgs/affine-block-code/effects.d.ts +2 -0
- package/dist/_pkgs/affine-block-code/effects.js +2 -0
- package/dist/_pkgs/affine-block-code/highlight/affine-code-unit.js +6 -1
- package/dist/_pkgs/affine-block-code/index.d.ts +1 -0
- package/dist/_pkgs/affine-block-code/index.js +1 -0
- package/dist/_pkgs/affine-block-code/line-numbers.d.ts +25 -0
- package/dist/_pkgs/affine-block-code/line-numbers.js +27 -0
- package/dist/_pkgs/affine-block-code/styles.js +31 -0
- package/dist/_pkgs/affine-block-data-view/data-view-block.js +1 -0
- package/dist/_pkgs/affine-block-database/components/title/index.js +4 -1
- package/dist/_pkgs/affine-block-database/configs/slash-menu.js +28 -1
- package/dist/_pkgs/affine-block-database/database-block.js +13 -0
- package/dist/_pkgs/affine-block-database/properties/paste-url.d.ts +24 -0
- package/dist/_pkgs/affine-block-database/properties/paste-url.js +98 -0
- package/dist/_pkgs/affine-block-database/properties/rich-text/cell-renderer.js +9 -19
- package/dist/_pkgs/affine-block-database/properties/title/text.js +20 -25
- package/dist/_pkgs/affine-block-database/views/index.js +1 -0
- package/dist/_pkgs/affine-block-edgeless-text/edgeless-text-block.js +10 -0
- package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/config.d.ts +3 -0
- package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/config.js +48 -1
- package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/font-size.d.ts +17 -0
- package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/font-size.js +24 -0
- package/dist/_pkgs/affine-block-embed-doc/common/doc-trashed.d.ts +9 -0
- package/dist/_pkgs/affine-block-embed-doc/common/doc-trashed.js +10 -0
- package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/embed-linked-doc-block.js +8 -4
- package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/embed-synced-doc-block.d.ts +4 -0
- package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/embed-synced-doc-block.js +22 -3
- package/dist/_pkgs/affine-block-frame/frame-manager.d.ts +13 -0
- package/dist/_pkgs/affine-block-frame/frame-manager.js +32 -2
- package/dist/_pkgs/affine-block-latex/styles.js +6 -1
- package/dist/_pkgs/affine-block-note/note-edgeless-block.d.ts +9 -0
- package/dist/_pkgs/affine-block-note/note-edgeless-block.js +29 -1
- package/dist/_pkgs/affine-block-root/commands/pivot-commands.d.ts +37 -0
- package/dist/_pkgs/affine-block-root/commands/pivot-commands.js +168 -0
- package/dist/_pkgs/affine-block-root/commands/reading-commands.d.ts +23 -0
- package/dist/_pkgs/affine-block-root/commands/reading-commands.js +107 -0
- package/dist/_pkgs/affine-block-root/commands/tag-commands.d.ts +47 -0
- package/dist/_pkgs/affine-block-root/commands/tag-commands.js +159 -0
- package/dist/_pkgs/affine-block-root/configs/toolbar.d.ts +1 -0
- package/dist/_pkgs/affine-block-root/edgeless/configs/toolbar/more.js +9 -2
- package/dist/_pkgs/affine-block-root/edgeless/configs/toolbar/render-linked-doc.js +1 -1
- package/dist/_pkgs/affine-block-root/edgeless/edgeless-keyboard.js +26 -1
- package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-block.js +11 -2
- package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-service.js +14 -0
- package/dist/_pkgs/affine-block-root/edgeless/index.d.ts +1 -0
- package/dist/_pkgs/affine-block-root/edgeless/index.js +1 -0
- package/dist/_pkgs/affine-block-root/edgeless/reserved-keys.d.ts +21 -0
- package/dist/_pkgs/affine-block-root/edgeless/reserved-keys.js +34 -0
- package/dist/_pkgs/affine-block-root/edgeless/utils/clone-utils.d.ts +7 -1
- package/dist/_pkgs/affine-block-root/edgeless/utils/clone-utils.js +11 -2
- package/dist/_pkgs/affine-block-root/index.d.ts +4 -1
- package/dist/_pkgs/affine-block-root/index.js +4 -1
- package/dist/_pkgs/affine-block-root/keyboard/commands.d.ts +2 -0
- package/dist/_pkgs/affine-block-root/keyboard/commands.js +147 -0
- package/dist/_pkgs/affine-block-root/view.js +13 -4
- package/dist/_pkgs/affine-block-surface/commands/reassociate-connectors.js +0 -1
- package/dist/_pkgs/affine-block-surface/effects.js +6 -0
- package/dist/_pkgs/affine-block-surface/element-model/index.d.ts +5 -2
- package/dist/_pkgs/affine-block-surface/element-model/index.js +4 -2
- package/dist/_pkgs/affine-block-surface/extensions/audit.d.ts +107 -0
- package/dist/_pkgs/affine-block-surface/extensions/audit.js +472 -0
- package/dist/_pkgs/affine-block-surface/extensions/crud-extension.d.ts +14 -0
- package/dist/_pkgs/affine-block-surface/extensions/crud-extension.js +27 -0
- package/dist/_pkgs/affine-block-surface/extensions/editor-anchored-panel.d.ts +133 -0
- package/dist/_pkgs/affine-block-surface/extensions/editor-anchored-panel.js +326 -0
- package/dist/_pkgs/affine-block-surface/extensions/index.d.ts +13 -0
- package/dist/_pkgs/affine-block-surface/extensions/index.js +13 -0
- package/dist/_pkgs/affine-block-surface/extensions/map-quality-widget.d.ts +146 -0
- package/dist/_pkgs/affine-block-surface/extensions/map-quality-widget.js +528 -0
- package/dist/_pkgs/affine-block-surface/extensions/map-quality.d.ts +109 -0
- package/dist/_pkgs/affine-block-surface/extensions/map-quality.js +84 -0
- package/dist/_pkgs/affine-block-surface/extensions/reading-toolbar.d.ts +15 -0
- package/dist/_pkgs/affine-block-surface/extensions/reading-toolbar.js +158 -0
- package/dist/_pkgs/affine-block-surface/extensions/reading-widget.d.ts +145 -0
- package/dist/_pkgs/affine-block-surface/extensions/reading-widget.js +590 -0
- package/dist/_pkgs/affine-block-surface/extensions/reading.d.ts +494 -0
- package/dist/_pkgs/affine-block-surface/extensions/reading.js +767 -0
- package/dist/_pkgs/affine-block-surface/extensions/spotlight.d.ts +45 -0
- package/dist/_pkgs/affine-block-surface/extensions/spotlight.js +177 -0
- package/dist/_pkgs/affine-block-surface/extensions/tags-toolbar.d.ts +10 -0
- package/dist/_pkgs/affine-block-surface/extensions/tags-toolbar.js +295 -0
- package/dist/_pkgs/affine-block-surface/extensions/validation-toolbar.d.ts +27 -0
- package/dist/_pkgs/affine-block-surface/extensions/validation-toolbar.js +361 -0
- package/dist/_pkgs/affine-block-surface/extensions/validation.d.ts +1340 -0
- package/dist/_pkgs/affine-block-surface/extensions/validation.js +3009 -0
- package/dist/_pkgs/affine-block-surface/extensions/violation-detail-widget.d.ts +286 -0
- package/dist/_pkgs/affine-block-surface/extensions/violation-detail-widget.js +907 -0
- package/dist/_pkgs/affine-block-surface/extensions/violation-timeline.d.ts +80 -0
- package/dist/_pkgs/affine-block-surface/extensions/violation-timeline.js +123 -0
- package/dist/_pkgs/affine-block-surface/framework-background/def.d.ts +321 -0
- package/dist/_pkgs/affine-block-surface/framework-background/def.js +81 -0
- package/dist/_pkgs/affine-block-surface/framework-background/facts.d.ts +188 -0
- package/dist/_pkgs/affine-block-surface/framework-background/facts.js +284 -0
- package/dist/_pkgs/affine-block-surface/framework-background/index.d.ts +5 -0
- package/dist/_pkgs/affine-block-surface/framework-background/index.js +5 -0
- package/dist/_pkgs/affine-block-surface/framework-background/interaction.d.ts +12 -0
- package/dist/_pkgs/affine-block-surface/framework-background/interaction.js +24 -0
- package/dist/_pkgs/affine-block-surface/framework-background/labels.d.ts +59 -0
- package/dist/_pkgs/affine-block-surface/framework-background/labels.js +117 -0
- package/dist/_pkgs/affine-block-surface/framework-background/renderer.d.ts +8 -0
- package/dist/_pkgs/affine-block-surface/framework-background/renderer.js +238 -0
- package/dist/_pkgs/affine-block-surface/index.d.ts +1 -0
- package/dist/_pkgs/affine-block-surface/index.js +1 -0
- package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.d.ts +69 -3
- package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.js +333 -44
- package/dist/_pkgs/affine-block-surface/renderer/dom-renderer.js +18 -2
- package/dist/_pkgs/affine-block-surface/tool/default-tool.js +8 -0
- package/dist/_pkgs/affine-block-surface/utils/font.js +9 -3
- package/dist/_pkgs/affine-block-surface/view.d.ts +17 -0
- package/dist/_pkgs/affine-block-surface/view.js +57 -2
- package/dist/_pkgs/affine-block-table/selection-controller.d.ts +6 -0
- package/dist/_pkgs/affine-block-table/selection-controller.js +24 -1
- package/dist/_pkgs/affine-block-table/table-block.js +8 -2
- package/dist/_pkgs/affine-block-table/table-cell.js +5 -6
- package/dist/_pkgs/affine-block-table/table-keymap.d.ts +18 -0
- package/dist/_pkgs/affine-block-table/table-keymap.js +41 -0
- package/dist/_pkgs/affine-block-table/utils.d.ts +7 -0
- package/dist/_pkgs/affine-block-table/utils.js +12 -0
- package/dist/_pkgs/affine-block-table/view.js +2 -0
- package/dist/_pkgs/affine-components/caption/captioned-block-component.js +2 -1
- package/dist/_pkgs/affine-components/context-menu/button.d.ts +7 -0
- package/dist/_pkgs/affine-components/context-menu/button.js +7 -2
- package/dist/_pkgs/affine-components/context-menu/input.d.ts +4 -0
- package/dist/_pkgs/affine-components/context-menu/input.js +12 -0
- package/dist/_pkgs/affine-components/context-menu/menu-all.d.ts +2 -0
- package/dist/_pkgs/affine-components/context-menu/menu-renderer.js +8 -1
- package/dist/_pkgs/affine-components/context-menu/sub-menu.js +3 -0
- package/dist/_pkgs/affine-components/highlight-dropdown-menu/highlight-duotone-icon.js +8 -8
- package/dist/_pkgs/affine-components/highlight-dropdown-menu/text-duotone-icon.js +11 -11
- package/dist/_pkgs/affine-components/icon-picker/affine-icon-picker-panel.d.ts +28 -0
- package/dist/_pkgs/affine-components/icon-picker/affine-icon-picker-panel.js +231 -0
- package/dist/_pkgs/affine-components/icon-picker/emoji-data.d.ts +40 -0
- package/dist/_pkgs/affine-components/icon-picker/emoji-data.js +99 -0
- package/dist/_pkgs/affine-components/icon-picker/emoji-picker-panel.d.ts +32 -0
- package/dist/_pkgs/affine-components/icon-picker/emoji-picker-panel.js +276 -0
- package/dist/_pkgs/affine-components/icon-picker/icon-data.d.ts +34 -0
- package/dist/_pkgs/affine-components/icon-picker/icon-data.js +83 -0
- package/dist/_pkgs/affine-components/icon-picker/icon-picker.d.ts +39 -0
- package/dist/_pkgs/affine-components/icon-picker/icon-picker.js +233 -0
- package/dist/_pkgs/affine-components/icon-picker/index.d.ts +8 -0
- package/dist/_pkgs/affine-components/icon-picker/index.js +15 -0
- package/dist/_pkgs/affine-components/icon-picker/recent-store.d.ts +8 -0
- package/dist/_pkgs/affine-components/icon-picker/recent-store.js +41 -0
- package/dist/_pkgs/affine-components/icon-picker/styles.d.ts +5 -0
- package/dist/_pkgs/affine-components/icon-picker/styles.js +166 -0
- package/dist/_pkgs/affine-components/icon-picker/types.d.ts +22 -0
- package/dist/_pkgs/affine-components/icon-picker/types.js +10 -0
- package/dist/_pkgs/affine-components/icons/text.js +426 -426
- package/dist/_pkgs/affine-components/open-doc-dropdown-menu/dropdown-menu.d.ts +1 -0
- package/dist/_pkgs/affine-components/portal/portal.d.ts +1 -1
- package/dist/_pkgs/affine-components/toolbar/menu-button.js +1 -0
- package/dist/_pkgs/affine-components/toolbar/toolbar.js +11 -10
- package/dist/_pkgs/affine-foundation/view.js +11 -2
- package/dist/_pkgs/affine-gfx-brush/index.d.ts +1 -0
- package/dist/_pkgs/affine-gfx-brush/index.js +1 -0
- package/dist/_pkgs/affine-gfx-brush/renderer/dom/brush.d.ts +1 -0
- package/dist/_pkgs/affine-gfx-brush/renderer/dom/brush.js +11 -0
- package/dist/_pkgs/affine-gfx-brush/renderer/dom/highlighter.d.ts +1 -0
- package/dist/_pkgs/affine-gfx-brush/renderer/dom/highlighter.js +11 -0
- package/dist/_pkgs/affine-gfx-brush/renderer/dom/index.d.ts +2 -0
- package/dist/_pkgs/affine-gfx-brush/renderer/dom/index.js +2 -0
- package/dist/_pkgs/affine-gfx-brush/renderer/dom/shared.d.ts +14 -0
- package/dist/_pkgs/affine-gfx-brush/renderer/dom/shared.js +54 -0
- package/dist/_pkgs/affine-gfx-brush/renderer/index.d.ts +1 -0
- package/dist/_pkgs/affine-gfx-brush/renderer/index.js +4 -0
- package/dist/_pkgs/affine-gfx-brush/view.d.ts +14 -0
- package/dist/_pkgs/affine-gfx-brush/view.js +29 -3
- package/dist/_pkgs/affine-gfx-connector/connector-manager.js +32 -6
- package/dist/_pkgs/affine-gfx-connector/connector-tool.d.ts +7 -0
- package/dist/_pkgs/affine-gfx-connector/connector-tool.js +2 -1
- package/dist/_pkgs/affine-gfx-connector/direction/direction-reveal.d.ts +123 -0
- package/dist/_pkgs/affine-gfx-connector/direction/direction-reveal.js +281 -0
- package/dist/_pkgs/affine-gfx-connector/direction/direction-widget.d.ts +65 -0
- package/dist/_pkgs/affine-gfx-connector/direction/direction-widget.js +395 -0
- package/dist/_pkgs/affine-gfx-connector/direction/index.d.ts +4 -0
- package/dist/_pkgs/affine-gfx-connector/direction/index.js +4 -0
- package/dist/_pkgs/affine-gfx-connector/direction/invert-direction.d.ts +72 -0
- package/dist/_pkgs/affine-gfx-connector/direction/invert-direction.js +187 -0
- package/dist/_pkgs/affine-gfx-connector/direction/typed-edge.d.ts +69 -0
- package/dist/_pkgs/affine-gfx-connector/direction/typed-edge.js +66 -0
- package/dist/_pkgs/affine-gfx-connector/effects.d.ts +2 -0
- package/dist/_pkgs/affine-gfx-connector/effects.js +2 -0
- package/dist/_pkgs/affine-gfx-connector/element-renderer/connector-dom/index.js +78 -41
- package/dist/_pkgs/affine-gfx-connector/index.d.ts +1 -0
- package/dist/_pkgs/affine-gfx-connector/index.js +1 -0
- package/dist/_pkgs/affine-gfx-connector/toolbar/config.d.ts +50 -0
- package/dist/_pkgs/affine-gfx-connector/toolbar/config.js +67 -1
- package/dist/_pkgs/affine-gfx-connector/view.js +16 -0
- package/dist/_pkgs/affine-gfx-group/command/group-api.js +150 -62
- package/dist/_pkgs/affine-gfx-group/text/edgeless-group-title-editor.js +4 -1
- package/dist/_pkgs/affine-gfx-pointer/tools/pan-tool.d.ts +16 -0
- package/dist/_pkgs/affine-gfx-pointer/tools/pan-tool.js +102 -32
- package/dist/_pkgs/affine-gfx-shape/commands.d.ts +2 -0
- package/dist/_pkgs/affine-gfx-shape/commands.js +33 -0
- package/dist/_pkgs/affine-gfx-shape/element-renderer/shape-dom/index.js +48 -19
- package/dist/_pkgs/affine-gfx-shape/index.d.ts +1 -1
- package/dist/_pkgs/affine-gfx-shape/index.js +1 -1
- package/dist/_pkgs/affine-gfx-shape/text/edgeless-shape-text-editor.d.ts +26 -0
- package/dist/_pkgs/affine-gfx-shape/text/edgeless-shape-text-editor.js +124 -13
- package/dist/_pkgs/affine-gfx-shape/view.js +3 -3
- package/dist/_pkgs/affine-gfx-template/toolbar/template-tool-button.d.ts +2 -0
- package/dist/_pkgs/affine-gfx-template/toolbar/template-tool-button.js +18 -1
- package/dist/_pkgs/affine-gfx-text/edgeless-text-editor.js +9 -5
- package/dist/_pkgs/affine-inline-latex/command.js +46 -26
- package/dist/_pkgs/affine-inline-latex/latex-node/latex-node.d.ts +10 -0
- package/dist/_pkgs/affine-inline-latex/latex-node/latex-node.js +23 -0
- package/dist/_pkgs/affine-inline-link/link-node/affine-link.js +4 -1
- package/dist/_pkgs/affine-inline-preset/adapters/html/html-inline.d.ts +3 -0
- package/dist/_pkgs/affine-inline-preset/adapters/html/html-inline.js +29 -1
- package/dist/_pkgs/affine-model/blocks/code/code-model.d.ts +1 -0
- package/dist/_pkgs/affine-model/blocks/code/code-model.js +1 -0
- package/dist/_pkgs/affine-model/elements/connector/connector.js +24 -0
- package/dist/_pkgs/affine-model/elements/edgy/board.d.ts +32 -0
- package/dist/_pkgs/affine-model/elements/edgy/board.js +112 -0
- package/dist/_pkgs/affine-model/elements/edgy/facets.d.ts +12 -0
- package/dist/_pkgs/affine-model/elements/edgy/facets.js +25 -1
- package/dist/_pkgs/affine-model/elements/edgy/index.d.ts +1 -0
- package/dist/_pkgs/affine-model/elements/edgy/index.js +1 -0
- package/dist/_pkgs/affine-model/elements/framework-background/background.d.ts +42 -0
- package/dist/_pkgs/affine-model/elements/framework-background/background.js +42 -0
- package/dist/_pkgs/affine-model/elements/framework-background/index.d.ts +1 -0
- package/dist/_pkgs/affine-model/elements/framework-background/index.js +1 -0
- package/dist/_pkgs/affine-model/elements/index.d.ts +3 -1
- package/dist/_pkgs/affine-model/elements/index.js +1 -0
- package/dist/_pkgs/affine-model/elements/mindmap/mindmap.js +8 -3
- package/dist/_pkgs/affine-model/elements/mindmap/style.d.ts +10 -0
- package/dist/_pkgs/affine-model/elements/mindmap/style.js +8 -0
- package/dist/_pkgs/affine-model/elements/wardley/wardley.d.ts +21 -29
- package/dist/_pkgs/affine-model/elements/wardley/wardley.js +41 -48
- package/dist/_pkgs/affine-shared/adapters/markdown/delta-converter.d.ts +6 -1
- package/dist/_pkgs/affine-shared/adapters/markdown/delta-converter.js +160 -2
- package/dist/_pkgs/affine-shared/adapters/markdown/markdown.js +5 -1
- package/dist/_pkgs/affine-shared/adapters/types/delta-converter.d.ts +1 -0
- package/dist/_pkgs/affine-shared/adapters/utils/color.d.ts +24 -0
- package/dist/_pkgs/affine-shared/adapters/utils/color.js +280 -0
- package/dist/_pkgs/affine-shared/adapters/utils/index.d.ts +1 -0
- package/dist/_pkgs/affine-shared/adapters/utils/index.js +1 -0
- package/dist/_pkgs/affine-shared/commands/block-crud/get-selected-blocks.js +10 -2
- package/dist/_pkgs/affine-shared/services/audit-service.d.ts +300 -0
- package/dist/_pkgs/affine-shared/services/audit-service.js +228 -0
- package/dist/_pkgs/affine-shared/services/edit-props-store.d.ts +7 -0
- package/dist/_pkgs/affine-shared/services/edit-props-store.js +11 -0
- package/dist/_pkgs/affine-shared/services/font-loader/font-loader-service.d.ts +26 -1
- package/dist/_pkgs/affine-shared/services/font-loader/font-loader-service.js +124 -7
- package/dist/_pkgs/affine-shared/services/index.d.ts +5 -0
- package/dist/_pkgs/affine-shared/services/index.js +5 -0
- package/dist/_pkgs/affine-shared/services/pivot-materiality-publisher.d.ts +129 -0
- package/dist/_pkgs/affine-shared/services/pivot-materiality-publisher.js +311 -0
- package/dist/_pkgs/affine-shared/services/pivot-properties-service.d.ts +217 -0
- package/dist/_pkgs/affine-shared/services/pivot-properties-service.js +114 -0
- package/dist/_pkgs/affine-shared/services/telemetry-service/code-block.d.ts +1 -1
- package/dist/_pkgs/affine-shared/services/telemetry-service/lifecycle.d.ts +182 -0
- package/dist/_pkgs/affine-shared/services/telemetry-service/telemetry-service.d.ts +2 -2
- package/dist/_pkgs/affine-shared/services/telemetry-service/types.d.ts +6 -1
- package/dist/_pkgs/affine-shared/services/toolbar-service/action.d.ts +10 -0
- package/dist/_pkgs/affine-shared/services/toolbar-service/index.d.ts +1 -0
- package/dist/_pkgs/affine-shared/services/toolbar-service/index.js +1 -0
- package/dist/_pkgs/affine-shared/services/toolbar-service/layout.d.ts +134 -0
- package/dist/_pkgs/affine-shared/services/toolbar-service/layout.js +146 -0
- package/dist/_pkgs/affine-shared/services/translation-service/index.d.ts +68 -0
- package/dist/_pkgs/affine-shared/services/translation-service/index.js +39 -0
- package/dist/_pkgs/affine-shared/services/universe-tag-defs-service.d.ts +155 -0
- package/dist/_pkgs/affine-shared/services/universe-tag-defs-service.js +254 -0
- package/dist/_pkgs/affine-shared/utils/dom/point-to-range.d.ts +4 -0
- package/dist/_pkgs/affine-shared/utils/dom/point-to-range.js +58 -2
- package/dist/_pkgs/affine-shared/utils/dom/viewport.d.ts +60 -0
- package/dist/_pkgs/affine-shared/utils/dom/viewport.js +58 -0
- package/dist/_pkgs/affine-shared/utils/print-to-pdf.d.ts +21 -0
- package/dist/_pkgs/affine-shared/utils/print-to-pdf.js +166 -32
- package/dist/_pkgs/affine-shared/utils/zod-schema.d.ts +7 -0
- package/dist/_pkgs/affine-shared/utils/zod-schema.js +27 -1
- package/dist/_pkgs/affine-widget-drag-handle/watchers/edgeless-watcher.d.ts +19 -10
- package/dist/_pkgs/affine-widget-drag-handle/watchers/edgeless-watcher.js +122 -23
- package/dist/_pkgs/affine-widget-drag-handle/watchers/pointer-event-watcher.d.ts +2 -0
- package/dist/_pkgs/affine-widget-drag-handle/watchers/pointer-event-watcher.js +25 -4
- package/dist/_pkgs/affine-widget-edgeless-selected-rect/auto-complete-panel.js +10 -5
- package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-auto-complete.d.ts +15 -1
- package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-auto-complete.js +37 -32
- package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-element-link.js +5 -4
- package/dist/_pkgs/affine-widget-edgeless-selected-rect/edgeless-selected-rect.js +19 -9
- package/dist/_pkgs/affine-widget-edgeless-selected-rect/utils.d.ts +16 -2
- package/dist/_pkgs/affine-widget-edgeless-selected-rect/utils.js +19 -2
- package/dist/_pkgs/affine-widget-edgeless-toolbar/index.d.ts +1 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/index.js +1 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.d.ts +38 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.js +99 -0
- package/dist/_pkgs/affine-widget-frame-title/edgeless-frame-title-editor.js +4 -1
- package/dist/_pkgs/affine-widget-keyboard-toolbar/icons.js +98 -98
- package/dist/_pkgs/affine-widget-linked-doc/linked-doc-popover.js +2 -15
- package/dist/_pkgs/affine-widget-linked-doc/transformers/markdown.d.ts +10 -1
- package/dist/_pkgs/affine-widget-linked-doc/transformers/markdown.js +133 -6
- package/dist/_pkgs/affine-widget-linked-doc/transformers/utils.d.ts +10 -0
- package/dist/_pkgs/affine-widget-linked-doc/transformers/utils.js +120 -3
- package/dist/_pkgs/affine-widget-linked-doc/utils.d.ts +12 -0
- package/dist/_pkgs/affine-widget-linked-doc/utils.js +33 -0
- package/dist/_pkgs/affine-widget-remote-selection/edgeless/index.js +6 -4
- package/dist/_pkgs/affine-widget-slash-menu/slash-menu-popover.js +8 -4
- package/dist/_pkgs/affine-widget-slash-menu/utils.d.ts +9 -0
- package/dist/_pkgs/affine-widget-slash-menu/utils.js +24 -0
- package/dist/_pkgs/affine-widget-toolbar/toolbar.d.ts +6 -0
- package/dist/_pkgs/affine-widget-toolbar/toolbar.js +34 -6
- package/dist/_pkgs/affine-widget-toolbar/utils.d.ts +146 -3
- package/dist/_pkgs/affine-widget-toolbar/utils.js +738 -56
- package/dist/_pkgs/data-view/core/common/property-menu.js +3 -16
- package/dist/_pkgs/data-view/core/component/tags/multi-tag-select.d.ts +4 -0
- package/dist/_pkgs/data-view/core/component/tags/multi-tag-select.js +28 -1
- package/dist/_pkgs/data-view/core/data-view.d.ts +3 -1
- package/dist/_pkgs/data-view/core/data-view.js +25 -3
- package/dist/_pkgs/data-view/core/detail/field.js +2 -2
- package/dist/_pkgs/data-view/core/detail/selection.d.ts +4 -2
- package/dist/_pkgs/data-view/core/detail/selection.js +23 -7
- package/dist/_pkgs/data-view/core/effect.js +2 -0
- package/dist/_pkgs/data-view/core/filter/eval.js +36 -23
- package/dist/_pkgs/data-view/core/filter/filter-fn/matcher.d.ts +7 -0
- package/dist/_pkgs/data-view/core/filter/filter-fn/matcher.js +12 -0
- package/dist/_pkgs/data-view/core/group-by/compare-date-keys.d.ts +11 -0
- package/dist/_pkgs/data-view/core/group-by/compare-date-keys.js +55 -0
- package/dist/_pkgs/data-view/core/group-by/define.d.ts +6 -0
- package/dist/_pkgs/data-view/core/group-by/define.js +114 -0
- package/dist/_pkgs/data-view/core/group-by/matcher.d.ts +7 -0
- package/dist/_pkgs/data-view/core/group-by/matcher.js +13 -0
- package/dist/_pkgs/data-view/core/group-by/renderer/boolean-group.js +11 -11
- package/dist/_pkgs/data-view/core/group-by/renderer/date-group.d.ts +9 -0
- package/dist/_pkgs/data-view/core/group-by/renderer/date-group.js +97 -0
- package/dist/_pkgs/data-view/core/group-by/setting.js +86 -7
- package/dist/_pkgs/data-view/core/group-by/trait.d.ts +34 -0
- package/dist/_pkgs/data-view/core/group-by/trait.js +106 -10
- package/dist/_pkgs/data-view/core/utils/menu-title.js +17 -17
- package/dist/_pkgs/data-view/property-presets/multi-select/cell-renderer.js +3 -1
- package/dist/_pkgs/data-view/property-presets/number/define.js +2 -1
- package/dist/_pkgs/data-view/property-presets/select/cell-renderer.js +3 -1
- package/dist/_pkgs/data-view/view-presets/calendar/calendar-view-manager.d.ts +70 -0
- package/dist/_pkgs/data-view/view-presets/calendar/calendar-view-manager.js +449 -0
- package/dist/_pkgs/data-view/view-presets/calendar/define.d.ts +10 -0
- package/dist/_pkgs/data-view/view-presets/calendar/define.js +27 -0
- package/dist/_pkgs/data-view/view-presets/calendar/effect.d.ts +1 -0
- package/dist/_pkgs/data-view/view-presets/calendar/effect.js +4 -0
- package/dist/_pkgs/data-view/view-presets/calendar/index.d.ts +6 -0
- package/dist/_pkgs/data-view/view-presets/calendar/index.js +6 -0
- package/dist/_pkgs/data-view/view-presets/calendar/layout.d.ts +37 -0
- package/dist/_pkgs/data-view/view-presets/calendar/layout.js +138 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/actions.d.ts +7 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/actions.js +68 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/dnd.d.ts +32 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/dnd.js +159 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/effect.d.ts +1 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/effect.js +7 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/hit-test.d.ts +1 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/hit-test.js +28 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/styles.d.ts +1 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/styles.js +707 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/view.d.ts +89 -0
- package/dist/_pkgs/data-view/view-presets/calendar/pc/view.js +837 -0
- package/dist/_pkgs/data-view/view-presets/calendar/renderer.d.ts +2 -0
- package/dist/_pkgs/data-view/view-presets/calendar/renderer.js +8 -0
- package/dist/_pkgs/data-view/view-presets/calendar/source.d.ts +8 -0
- package/dist/_pkgs/data-view/view-presets/calendar/source.js +3 -0
- package/dist/_pkgs/data-view/view-presets/calendar/types.d.ts +79 -0
- package/dist/_pkgs/data-view/view-presets/calendar/types.js +1 -0
- package/dist/_pkgs/data-view/view-presets/convert.js +28 -0
- package/dist/_pkgs/data-view/view-presets/effect.js +2 -0
- package/dist/_pkgs/data-view/view-presets/index.d.ts +2 -0
- package/dist/_pkgs/data-view/view-presets/index.js +3 -0
- package/dist/_pkgs/data-view/view-presets/kanban/kanban-view-manager.js +3 -1
- package/dist/_pkgs/data-view/view-presets/kanban/mobile/cell.js +2 -2
- package/dist/_pkgs/data-view/view-presets/table/collapsed-state.d.ts +18 -0
- package/dist/_pkgs/data-view/view-presets/table/collapsed-state.js +36 -0
- package/dist/_pkgs/data-view/view-presets/table/mobile/cell.js +2 -2
- package/dist/_pkgs/data-view/view-presets/table/mobile/group.d.ts +11 -0
- package/dist/_pkgs/data-view/view-presets/table/mobile/group.js +87 -4
- package/dist/_pkgs/data-view/view-presets/table/pc/cell.d.ts +3 -0
- package/dist/_pkgs/data-view/view-presets/table/pc/cell.js +11 -2
- package/dist/_pkgs/data-view/view-presets/table/pc/controller/hotkeys.d.ts +1 -0
- package/dist/_pkgs/data-view/view-presets/table/pc/controller/hotkeys.js +39 -33
- package/dist/_pkgs/data-view/view-presets/table/pc/group.d.ts +10 -0
- package/dist/_pkgs/data-view/view-presets/table/pc/group.js +84 -5
- package/dist/_pkgs/data-view/view-presets/table/pc-virtual/controller/hotkeys.d.ts +1 -0
- package/dist/_pkgs/data-view/view-presets/table/pc-virtual/controller/hotkeys.js +39 -33
- package/dist/_pkgs/data-view/view-presets/table/pc-virtual/group/top/group-title.js +18 -18
- package/dist/_pkgs/data-view/view-presets/table/pc-virtual/row/cell.d.ts +3 -0
- package/dist/_pkgs/data-view/view-presets/table/pc-virtual/row/cell.js +8 -0
- package/dist/_pkgs/data-view/view-presets/table/table-view-manager.js +3 -1
- package/dist/_pkgs/data-view/view-presets/table/utils.d.ts +3 -0
- package/dist/_pkgs/data-view/view-presets/table/utils.js +16 -1
- package/dist/_pkgs/data-view/widget-presets/tools/presets/view-options/view-options.js +3 -1
- package/dist/_pkgs/global/gfx/curve.js +4 -3
- package/dist/_pkgs/std/clipboard/clipboard.js +13 -3
- package/dist/_pkgs/std/clipboard/utils.d.ts +5 -0
- package/dist/_pkgs/std/clipboard/utils.js +7 -0
- package/dist/_pkgs/std/event/dispatcher.js +27 -1
- package/dist/_pkgs/std/event/keymap.js +16 -6
- package/dist/_pkgs/std/extension/command-registry.d.ts +321 -0
- package/dist/_pkgs/std/extension/command-registry.js +233 -0
- package/dist/_pkgs/std/extension/dnd/index.d.ts +1 -1
- package/dist/_pkgs/std/extension/index.d.ts +2 -0
- package/dist/_pkgs/std/extension/index.js +2 -0
- package/dist/_pkgs/std/extension/translation-manifest.d.ts +49 -0
- package/dist/_pkgs/std/extension/translation-manifest.js +71 -0
- package/dist/_pkgs/std/gfx/index.d.ts +7 -3
- package/dist/_pkgs/std/gfx/index.js +6 -2
- package/dist/_pkgs/std/gfx/interactivity/gfx-view-event-handler.js +6 -1
- package/dist/_pkgs/std/gfx/interactivity/manager.d.ts +8 -0
- package/dist/_pkgs/std/gfx/interactivity/manager.js +18 -0
- package/dist/_pkgs/std/gfx/layer.d.ts +1 -1
- package/dist/_pkgs/std/gfx/layer.js +1 -2
- package/dist/_pkgs/std/gfx/model/surface/decorators/field.js +9 -0
- package/dist/_pkgs/std/gfx/model/surface/decorators/index.d.ts +2 -2
- package/dist/_pkgs/std/gfx/model/surface/decorators/index.js +2 -2
- package/dist/_pkgs/std/gfx/model/surface/decorators/local.d.ts +14 -0
- package/dist/_pkgs/std/gfx/model/surface/decorators/local.js +22 -0
- package/dist/_pkgs/std/gfx/model/surface/decorators/observer.d.ts +2 -0
- package/dist/_pkgs/std/gfx/model/surface/decorators/observer.js +40 -1
- package/dist/_pkgs/std/gfx/model/surface/element-model.d.ts +282 -0
- package/dist/_pkgs/std/gfx/model/surface/element-model.js +436 -25
- package/dist/_pkgs/std/gfx/model/surface/pivot.d.ts +48 -0
- package/dist/_pkgs/std/gfx/model/surface/pivot.js +34 -0
- package/dist/_pkgs/std/gfx/model/surface/role.d.ts +153 -0
- package/dist/_pkgs/std/gfx/model/surface/role.js +115 -0
- package/dist/_pkgs/std/gfx/model/surface/surface-model.d.ts +70 -0
- package/dist/_pkgs/std/gfx/model/surface/surface-model.js +304 -17
- package/dist/_pkgs/std/gfx/model/surface/tags.d.ts +77 -0
- package/dist/_pkgs/std/gfx/model/surface/tags.js +246 -0
- package/dist/_pkgs/std/gfx/perf.d.ts +10 -0
- package/dist/_pkgs/std/gfx/perf.js +30 -0
- package/dist/_pkgs/std/gfx/tool/tool-controller.d.ts +13 -0
- package/dist/_pkgs/std/gfx/tool/tool-controller.js +26 -0
- package/dist/_pkgs/std/gfx/viewport.d.ts +12 -0
- package/dist/_pkgs/std/gfx/viewport.js +19 -1
- package/dist/_pkgs/std/inline/services/event.d.ts +2 -0
- package/dist/_pkgs/std/inline/services/event.js +96 -21
- package/dist/_pkgs/std/utils/layer.js +2 -6
- package/dist/_pkgs/std/utils/tree.d.ts +14 -0
- package/dist/_pkgs/std/utils/tree.js +59 -8
- package/dist/_pkgs/std/view/element/gfx-block-component.js +23 -13
- package/dist/_pkgs/store/extension/workspace/workspace-meta.d.ts +10 -0
- package/dist/_pkgs/store/model/block/flat-sync-controller.js +2 -12
- package/dist/_pkgs/store/model/store/crud.js +7 -4
- package/dist/_pkgs/store/reactive/flat-native-y/index.d.ts +1 -1
- package/dist/_pkgs/store/reactive/flat-native-y/index.js +24 -2
- package/dist/commands.d.ts +58 -0
- package/dist/commands.js +66 -0
- package/dist/extensions/command-telemetry.d.ts +21 -0
- package/dist/extensions/command-telemetry.js +89 -0
- package/dist/extensions/store.d.ts +9 -4
- package/dist/extensions/store.js +27 -24
- package/dist/extensions/view.d.ts +9 -4
- package/dist/extensions/view.js +23 -8
- package/dist/flags.d.ts +98 -21
- package/dist/flags.js +103 -22
- package/dist/frameworks.d.ts +45 -0
- package/dist/frameworks.js +154 -0
- package/dist/schemas.d.ts +8 -5
- package/dist/schemas.js +28 -32
- package/dist/shortcuts.d.ts +16 -16
- package/dist/shortcuts.js +8 -36
- package/dist/translations.d.ts +56 -0
- package/dist/translations.js +112 -0
- package/package.json +16 -4
- package/dist/_pkgs/affine-block-root/keyboard/shortcuts.d.ts +0 -8
- package/dist/_pkgs/affine-block-root/keyboard/shortcuts.js +0 -48
- package/dist/_pkgs/affine-gfx-shape/shortcuts.d.ts +0 -6
- package/dist/_pkgs/affine-gfx-shape/shortcuts.js +0 -28
- package/dist/_pkgs/data-view/core/utils/cache.d.ts +0 -5
- package/dist/_pkgs/data-view/core/utils/cache.js +0 -28
|
@@ -30,6 +30,15 @@ export declare class EdgelessNoteBlockComponent extends EdgelessNoteBlockCompone
|
|
|
30
30
|
};
|
|
31
31
|
firstUpdated(): void;
|
|
32
32
|
updated(changedProperties: PropertyValues): void;
|
|
33
|
+
/**
|
|
34
|
+
* A note carries its own `scale` on top of the viewport zoom. That scale
|
|
35
|
+
* belongs to the host element's transform, not to an inner wrapper: the
|
|
36
|
+
* element is laid out from the *unscaled* bound (see `getRenderingRect`), so
|
|
37
|
+
* scaling only the content would leave the element's box — the thing hit
|
|
38
|
+
* tests, the selection rect and the toolbar anchor read — out of step with
|
|
39
|
+
* what is painted at any scale other than 100%.
|
|
40
|
+
*/
|
|
41
|
+
getCSSTransform(): string;
|
|
33
42
|
getRenderingRect(): {
|
|
34
43
|
x: number;
|
|
35
44
|
y: number;
|
|
@@ -246,6 +246,18 @@ let EdgelessNoteBlockComponent = (() => {
|
|
|
246
246
|
});
|
|
247
247
|
}
|
|
248
248
|
}
|
|
249
|
+
/**
|
|
250
|
+
* A note carries its own `scale` on top of the viewport zoom. That scale
|
|
251
|
+
* belongs to the host element's transform, not to an inner wrapper: the
|
|
252
|
+
* element is laid out from the *unscaled* bound (see `getRenderingRect`), so
|
|
253
|
+
* scaling only the content would leave the element's box — the thing hit
|
|
254
|
+
* tests, the selection rect and the toolbar anchor read — out of step with
|
|
255
|
+
* what is painted at any scale other than 100%.
|
|
256
|
+
*/
|
|
257
|
+
getCSSTransform() {
|
|
258
|
+
const extraScale = this.model.props.edgeless?.scale ?? 1;
|
|
259
|
+
return `${super.getCSSTransform()} scale(${extraScale})`;
|
|
260
|
+
}
|
|
249
261
|
getRenderingRect() {
|
|
250
262
|
const { xywh, edgeless } = this.model.props;
|
|
251
263
|
const { collapse, scale = 1 } = edgeless;
|
|
@@ -273,7 +285,6 @@ let EdgelessNoteBlockComponent = (() => {
|
|
|
273
285
|
const height = bound.h / scale;
|
|
274
286
|
const style = {
|
|
275
287
|
borderRadius: borderRadius + 'px',
|
|
276
|
-
transform: `scale(${scale})`,
|
|
277
288
|
};
|
|
278
289
|
const extra = this._editing ? ACTIVE_NOTE_EXTRA_PADDING : 0;
|
|
279
290
|
const isCollapsable = collapse != null &&
|
|
@@ -458,6 +469,17 @@ export const EdgelessNoteInteraction = GfxViewInteractionExtension(NoteBlockSche
|
|
|
458
469
|
if (!view.isConnected) {
|
|
459
470
|
return;
|
|
460
471
|
}
|
|
472
|
+
// A click landing on the note title belongs to the title:
|
|
473
|
+
// routing it through the children container below would
|
|
474
|
+
// clamp it into the first paragraph instead.
|
|
475
|
+
const titleRect = view
|
|
476
|
+
.querySelector('edgeless-page-block-title')
|
|
477
|
+
?.getBoundingClientRect();
|
|
478
|
+
if (titleRect &&
|
|
479
|
+
new Bound(titleRect.x, titleRect.y, titleRect.width, titleRect.height).isPointInBound([e.clientX, e.clientY])) {
|
|
480
|
+
handleNativeRangeAtPoint(e.clientX, e.clientY);
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
461
483
|
if (model.children.length === 0) {
|
|
462
484
|
const blockId = std.store.addBlock('affine:paragraph', { type: 'text' }, model.id);
|
|
463
485
|
if (blockId) {
|
|
@@ -482,6 +504,12 @@ export const EdgelessNoteInteraction = GfxViewInteractionExtension(NoteBlockSche
|
|
|
482
504
|
})
|
|
483
505
|
.catch(console.error);
|
|
484
506
|
}
|
|
507
|
+
else if (multiSelect && alreadySelected && editing) {
|
|
508
|
+
// Shift-clicking inside a note being edited extends the text
|
|
509
|
+
// range; the default multi-select would drop the editing state
|
|
510
|
+
// and take the range with it.
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
485
513
|
else {
|
|
486
514
|
context.default(context);
|
|
487
515
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type AnyCommandDescriptor } from '../../std/index.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* `pivotDocId: null` unbinds. The key is REQUIRED on purpose: an optional one
|
|
5
|
+
* would make a forgotten argument silently destroy a binding, which is exactly
|
|
6
|
+
* the failure mode an agent-invocable command must not have.
|
|
7
|
+
*/
|
|
8
|
+
export declare const bindPivotParams: z.ZodObject<{
|
|
9
|
+
pivotDocId: z.ZodNullable<z.ZodString>;
|
|
10
|
+
/**
|
|
11
|
+
* Explicit targets, for a host or an agent acting on something other than the
|
|
12
|
+
* live selection. **Omitted** — the key absent — the command acts on the
|
|
13
|
+
* current canvas selection.
|
|
14
|
+
*
|
|
15
|
+
* An EMPTY array is not the same thing: it means "these zero elements", so
|
|
16
|
+
* the command does nothing and does not fall back to the selection. That is
|
|
17
|
+
* the safe reading — an agent that computed a target list and came up empty
|
|
18
|
+
* must not have the gesture redirected onto whatever the user happened to
|
|
19
|
+
* have selected — but it is silent, so callers filtering a list should check
|
|
20
|
+
* it before invoking.
|
|
21
|
+
*/
|
|
22
|
+
elementIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
pivotDocId: string | null;
|
|
25
|
+
elementIds?: string[] | undefined;
|
|
26
|
+
}, {
|
|
27
|
+
pivotDocId: string | null;
|
|
28
|
+
elementIds?: string[] | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
export type BindPivotParams = z.infer<typeof bindPivotParams>;
|
|
31
|
+
/**
|
|
32
|
+
* The registry's element type erases the parameter contract
|
|
33
|
+
* ({@link AnyCommandDescriptor}) — this is the first command to have one, and
|
|
34
|
+
* `run` re-validates with {@link bindPivotParams} rather than trusting the
|
|
35
|
+
* static type, which is what an agent-invocable command has to do anyway.
|
|
36
|
+
*/
|
|
37
|
+
export declare const pivotCommands: AnyCommandDescriptor[];
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The promotion rung "role → component": bind a surface element to a host-owned
|
|
3
|
+
* **pivot record** (MF1, ADR 0005 § 3, ladder in ADR 0007 § 6).
|
|
4
|
+
*
|
|
5
|
+
* The library cannot choose a document — it does not know what a pivot record
|
|
6
|
+
* is. So the record id is a PARAMETER: the host's picker (labreapp, MF2) runs
|
|
7
|
+
* the selection UI and invokes the command with the answer. That is also what
|
|
8
|
+
* makes the command usable by the agent surface with no UI at all.
|
|
9
|
+
*/
|
|
10
|
+
import { TelemetryProvider } from '../../affine-shared/services/index.js';
|
|
11
|
+
import { FRAMEWORK_IDS, } from '../../std/index.js';
|
|
12
|
+
import { GfxControllerIdentifier, GfxPrimitiveElementModel, } from '../../std/gfx/index.js';
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
const PIVOT_DOC_ID = 'pivotDocId';
|
|
15
|
+
/**
|
|
16
|
+
* `pivotDocId: null` unbinds. The key is REQUIRED on purpose: an optional one
|
|
17
|
+
* would make a forgotten argument silently destroy a binding, which is exactly
|
|
18
|
+
* the failure mode an agent-invocable command must not have.
|
|
19
|
+
*/
|
|
20
|
+
export const bindPivotParams = z.object({
|
|
21
|
+
pivotDocId: z.string().min(1).nullable(),
|
|
22
|
+
/**
|
|
23
|
+
* Explicit targets, for a host or an agent acting on something other than the
|
|
24
|
+
* live selection. **Omitted** — the key absent — the command acts on the
|
|
25
|
+
* current canvas selection.
|
|
26
|
+
*
|
|
27
|
+
* An EMPTY array is not the same thing: it means "these zero elements", so
|
|
28
|
+
* the command does nothing and does not fall back to the selection. That is
|
|
29
|
+
* the safe reading — an agent that computed a target list and came up empty
|
|
30
|
+
* must not have the gesture redirected onto whatever the user happened to
|
|
31
|
+
* have selected — but it is silent, so callers filtering a list should check
|
|
32
|
+
* it before invoking.
|
|
33
|
+
*/
|
|
34
|
+
elementIds: z.array(z.string()).optional(),
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* The elements this gesture would write to. Surface elements only: canvas
|
|
38
|
+
* BLOCKS carry a versioned schema, so binding them would be a `version` bump in
|
|
39
|
+
* `packages/affine/model` and is out of scope (ADR 0005 § 6).
|
|
40
|
+
*/
|
|
41
|
+
function pivotTargets(std, elementIds) {
|
|
42
|
+
const gfx = std.get(GfxControllerIdentifier);
|
|
43
|
+
const models = elementIds
|
|
44
|
+
? elementIds.map(id => gfx.surface?.getElementById(id))
|
|
45
|
+
: gfx.selection.selectedElements;
|
|
46
|
+
return models.filter((model) => model instanceof GfxPrimitiveElementModel);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Whether this document may be written to at all.
|
|
50
|
+
*
|
|
51
|
+
* Checked in `run` and not only in `when`, because `when` is consulted by the
|
|
52
|
+
* SURFACES and `runCommand` consults neither it nor `availability` — the
|
|
53
|
+
* palette and the agent reach `run` directly. Without this guard, unbinding
|
|
54
|
+
* succeeds in a read-only document: `clearField` goes through `Store.transact`,
|
|
55
|
+
* which (unlike `addBlock` / `updateBlock` / `deleteBlock`) carries no
|
|
56
|
+
* read-only guard, so the key is deleted and the promotion event is emitted for
|
|
57
|
+
* a document the user cannot edit. Binding merely throws out of `runCommand`,
|
|
58
|
+
* which is bad in a different way.
|
|
59
|
+
*/
|
|
60
|
+
const isBindable = (std) => !std.store.readonly;
|
|
61
|
+
/** `'wardley:component'` → `'wardley'`, when that names a real framework. */
|
|
62
|
+
function frameworkOfRole(role) {
|
|
63
|
+
const namespace = role?.split(':')[0];
|
|
64
|
+
return FRAMEWORK_IDS.includes(namespace ?? '')
|
|
65
|
+
? namespace
|
|
66
|
+
: undefined;
|
|
67
|
+
}
|
|
68
|
+
/** The single value shared by every target, or `undefined` if they disagree. */
|
|
69
|
+
function unanimous(values) {
|
|
70
|
+
const distinct = new Set(values);
|
|
71
|
+
return distinct.size === 1 ? values[0] : undefined;
|
|
72
|
+
}
|
|
73
|
+
const bindPivot = {
|
|
74
|
+
id: 'pivot.bind',
|
|
75
|
+
owner: 'core',
|
|
76
|
+
kind: 'action',
|
|
77
|
+
// NOT `com.labre.keyboardShortcuts.*` like every labelKey before it: those
|
|
78
|
+
// all belong to commands that ship a default chord. This one is keyless by
|
|
79
|
+
// intent and lives in the palette and the agent, so filing it under
|
|
80
|
+
// "keyboard shortcuts" would mislead a translator.
|
|
81
|
+
labelKey: 'com.labre.command.pivot.bind',
|
|
82
|
+
labelFallback: 'Link to record',
|
|
83
|
+
descriptionKey: 'com.labre.command.pivot.bind.description',
|
|
84
|
+
surfaces: ['palette', 'agent'],
|
|
85
|
+
scope: 'edgeless',
|
|
86
|
+
// Keyless by intent — still bindable from Settings › Shortcuts, which is
|
|
87
|
+
// what `toShortcutDescriptor` being total buys.
|
|
88
|
+
defaultKeys: { mac: [], other: [] },
|
|
89
|
+
availability: 'selection',
|
|
90
|
+
// Narrows `'selection'`, never contradicts it: a read-only document, and a
|
|
91
|
+
// selection of nothing but canvas blocks, both have no bindable target.
|
|
92
|
+
//
|
|
93
|
+
// Read-only rides on `when` rather than on `availability` because the union
|
|
94
|
+
// does not COMPOSE: it is one value per command (`command-registry.ts`
|
|
95
|
+
// `isCommandAvailable`), so declaring `'editable'` would buy the read-only
|
|
96
|
+
// gate by dropping the selection gate a host panel needs far more often.
|
|
97
|
+
// `'selection'` stays the serializable answer — it is the precondition a
|
|
98
|
+
// catalogue must show — and the state precondition is enforced below.
|
|
99
|
+
// The missing composition is recorded as an amendment trigger in ADR 0008.
|
|
100
|
+
when: std => isBindable(std) && pivotTargets(std).length > 0,
|
|
101
|
+
params: bindPivotParams,
|
|
102
|
+
run: (std, invocation, params) => {
|
|
103
|
+
const parsed = bindPivotParams.safeParse(params);
|
|
104
|
+
if (!parsed.success) {
|
|
105
|
+
console.error('pivot.bind: invalid params', parsed.error.issues);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const { pivotDocId, elementIds } = parsed.data;
|
|
109
|
+
// The load-bearing half of the read-only gate: see `isBindable`.
|
|
110
|
+
if (!isBindable(std))
|
|
111
|
+
return;
|
|
112
|
+
const targets = pivotTargets(std, elementIds);
|
|
113
|
+
if (!targets.length)
|
|
114
|
+
return;
|
|
115
|
+
// A gesture that changes nothing emits nothing and costs no undo step.
|
|
116
|
+
const changing = targets.filter(el => el.pivotDocId !== (pivotDocId ?? undefined));
|
|
117
|
+
if (!changing.length)
|
|
118
|
+
return;
|
|
119
|
+
// BEFORE the write, not after. `store.transact()` is not an undo
|
|
120
|
+
// boundary: the `Y.UndoManager` is built with no `captureTimeout`, so
|
|
121
|
+
// Yjs's 500 ms default merges consecutive transactions — and a bind
|
|
122
|
+
// issued within 500 ms of a drag would be undone TOGETHER with the drag,
|
|
123
|
+
// making the promotion look like it moved geometry. `stopCapturing()`
|
|
124
|
+
// opens a new stack item for what comes NEXT, so it has to precede the
|
|
125
|
+
// write (`Store.captureSync` docstring; same order as `applyLastStyle`).
|
|
126
|
+
//
|
|
127
|
+
// The ADRs' snippets (0005 § 3, 0007 § 6) show it after the write; that
|
|
128
|
+
// contradicts their own stated rationale and is treated as an editorial
|
|
129
|
+
// slip — see the PR description.
|
|
130
|
+
std.store.captureSync();
|
|
131
|
+
for (const element of changing) {
|
|
132
|
+
if (pivotDocId === null) {
|
|
133
|
+
// Not `updateElement(id, { pivotDocId: undefined })`: the `@field()`
|
|
134
|
+
// setter is unconditional, so that would leave the key behind as a
|
|
135
|
+
// tombstone. `clearField` removes it, and accepts this field because
|
|
136
|
+
// it is a declared, non-structural `@field()`.
|
|
137
|
+
element.clearField(PIVOT_DOC_ID);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
element.surface.updateElement(element.id, { pivotDocId });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// The ONE emission for this gesture. Not routed through `runCommand`'s
|
|
144
|
+
// bottleneck: that emitter maps `CommandKind` onto the three creation
|
|
145
|
+
// events from a STATIC `{ framework, element }` on the descriptor, and a
|
|
146
|
+
// promotion is neither a creation nor static — `rung`, `direction` and
|
|
147
|
+
// `role` are facts of the invocation. See ADR 0007 § 7.
|
|
148
|
+
const roles = changing.map(el => el.role);
|
|
149
|
+
const role = unanimous(roles);
|
|
150
|
+
std.getOptional(TelemetryProvider)?.track('FrameworkElementPromoted', {
|
|
151
|
+
page: 'whiteboard editor',
|
|
152
|
+
framework: frameworkOfRole(role),
|
|
153
|
+
rung: 'pivot',
|
|
154
|
+
direction: pivotDocId === null ? 'demote' : 'promote',
|
|
155
|
+
role,
|
|
156
|
+
elementCount: changing.length,
|
|
157
|
+
control: invocation.source,
|
|
158
|
+
module: invocation.surface,
|
|
159
|
+
});
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* The registry's element type erases the parameter contract
|
|
164
|
+
* ({@link AnyCommandDescriptor}) — this is the first command to have one, and
|
|
165
|
+
* `run` re-validates with {@link bindPivotParams} rather than trusting the
|
|
166
|
+
* static type, which is what an agent-invocable command has to do anyway.
|
|
167
|
+
*/
|
|
168
|
+
export const pivotCommands = [bindPivot];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type AnyCommandDescriptor } from '../../std/index.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* `elementId` omitted, the command reads the current canvas selection. Passing
|
|
5
|
+
* it explicitly is what lets the element's own toolbar name the element that
|
|
6
|
+
* CARRIES the role rather than the group the user clicked (the same reason
|
|
7
|
+
* `tags-toolbar.ts` passes `elementIds` to `tag.set`), and what makes the
|
|
8
|
+
* command usable by the agent with no selection at all.
|
|
9
|
+
*/
|
|
10
|
+
export declare const readElementParams: z.ZodObject<{
|
|
11
|
+
elementId: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
elementId?: string | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
elementId?: string | undefined;
|
|
16
|
+
}>;
|
|
17
|
+
export type ReadElementParams = z.infer<typeof readElementParams>;
|
|
18
|
+
/**
|
|
19
|
+
* The registry's element type erases the parameter contract; `run` re-validates
|
|
20
|
+
* with {@link readElementParams} rather than trusting the static type, which is
|
|
21
|
+
* what an agent-invocable command has to do anyway.
|
|
22
|
+
*/
|
|
23
|
+
export declare const readingCommands: AnyCommandDescriptor[];
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `element.read` — the CLICK that asks the tool what it reads of a component
|
|
3
|
+
* (MF3, "reversed reading").
|
|
4
|
+
*
|
|
5
|
+
* The PO's arbitration of 01/08/2026, verbatim: the reversed reading is
|
|
6
|
+
* triggered **on a click, never by automatic validation**, and **writes nothing
|
|
7
|
+
* without confirmation**. This command is the click. It opens a proposal and
|
|
8
|
+
* that is the whole of its effect — no tag, no binding, no property, nothing
|
|
9
|
+
* touched in the document, on any path, ever.
|
|
10
|
+
*
|
|
11
|
+
* Which is also why it is NOT read-only gated: reading a board one cannot edit
|
|
12
|
+
* is exactly as legitimate as reading one you can. The gate lives on the
|
|
13
|
+
* CONFIRMATIONS, which are `tag.set` and `pivot.bind` — two commands that
|
|
14
|
+
* already refuse a read-only store.
|
|
15
|
+
*/
|
|
16
|
+
import { ReadingManager } from '../../affine-block-surface/index.js';
|
|
17
|
+
import {} from '../../std/index.js';
|
|
18
|
+
import { GfxControllerIdentifier, GfxPrimitiveElementModel, } from '../../std/gfx/index.js';
|
|
19
|
+
import { z } from 'zod';
|
|
20
|
+
/**
|
|
21
|
+
* `elementId` omitted, the command reads the current canvas selection. Passing
|
|
22
|
+
* it explicitly is what lets the element's own toolbar name the element that
|
|
23
|
+
* CARRIES the role rather than the group the user clicked (the same reason
|
|
24
|
+
* `tags-toolbar.ts` passes `elementIds` to `tag.set`), and what makes the
|
|
25
|
+
* command usable by the agent with no selection at all.
|
|
26
|
+
*/
|
|
27
|
+
export const readElementParams = z.object({
|
|
28
|
+
elementId: z.string().min(1).optional(),
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* The element this reading is about: the one named, or the single selected
|
|
32
|
+
* surface element.
|
|
33
|
+
*
|
|
34
|
+
* ONE element, never a multi-selection: a proposal is one fiche about one
|
|
35
|
+
* thing, and two components have two readings that no single panel could
|
|
36
|
+
* honestly show at once.
|
|
37
|
+
*/
|
|
38
|
+
function readTarget(std, elementId) {
|
|
39
|
+
const gfx = std.get(GfxControllerIdentifier);
|
|
40
|
+
if (elementId) {
|
|
41
|
+
const model = gfx.surface?.getElementById(elementId);
|
|
42
|
+
return model instanceof GfxPrimitiveElementModel ? model : null;
|
|
43
|
+
}
|
|
44
|
+
const selected = gfx.selection.selectedElements.filter((model) => model instanceof GfxPrimitiveElementModel);
|
|
45
|
+
return selected.length === 1 ? selected[0] : null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Whether anything registered can read this element.
|
|
49
|
+
*
|
|
50
|
+
* Asked through the manager rather than re-implemented here: the profiles are
|
|
51
|
+
* registered by a framework's FLAG-GATED view extension, so a board whose
|
|
52
|
+
* framework is off has no reading and the command stands down — in the palette,
|
|
53
|
+
* on the toolbar and for the agent alike, from one answer.
|
|
54
|
+
*/
|
|
55
|
+
function readable(std, elementId) {
|
|
56
|
+
const manager = std.getOptional(ReadingManager);
|
|
57
|
+
if (!manager)
|
|
58
|
+
return false;
|
|
59
|
+
const target = readTarget(std, elementId);
|
|
60
|
+
return target !== null && manager.profileOf(target.id) !== null;
|
|
61
|
+
}
|
|
62
|
+
const readElementCommand = {
|
|
63
|
+
id: 'element.read',
|
|
64
|
+
owner: 'core',
|
|
65
|
+
kind: 'action',
|
|
66
|
+
// Not under `com.labre.keyboardShortcuts.*`: keyless by intent, like
|
|
67
|
+
// `pivot.bind` and `tag.set`, and filing it there would mislead a translator.
|
|
68
|
+
labelKey: 'com.labre.command.element.read',
|
|
69
|
+
labelFallback: 'Read this component',
|
|
70
|
+
descriptionKey: 'com.labre.command.element.read.description',
|
|
71
|
+
// The three surfaces the reading is reachable from. `'contextual-toolbar'`
|
|
72
|
+
// is where it is actually used — one click on the component — and declaring
|
|
73
|
+
// it is what keeps the telemetry honest about where a gesture came from
|
|
74
|
+
// (ADR 0008: the invocation names the surface, and the surface must exist).
|
|
75
|
+
surfaces: ['palette', 'contextual-toolbar', 'agent'],
|
|
76
|
+
scope: 'edgeless',
|
|
77
|
+
defaultKeys: { mac: [], other: [] },
|
|
78
|
+
availability: 'selection',
|
|
79
|
+
// Narrows `'selection'`, never contradicts it. Note what is NOT here: a
|
|
80
|
+
// read-only guard. Reading writes nothing, so there is nothing to refuse.
|
|
81
|
+
when: std => readable(std),
|
|
82
|
+
params: readElementParams,
|
|
83
|
+
run: (std, _invocation, params) => {
|
|
84
|
+
const parsed = readElementParams.safeParse(params);
|
|
85
|
+
if (!parsed.success) {
|
|
86
|
+
console.error('element.read: invalid params', parsed.error.issues);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const manager = std.getOptional(ReadingManager);
|
|
90
|
+
if (!manager)
|
|
91
|
+
return;
|
|
92
|
+
const target = readTarget(std, parsed.data.elementId);
|
|
93
|
+
if (!target)
|
|
94
|
+
return;
|
|
95
|
+
// A neutral element, or one whose framework is flagged off, has no reading
|
|
96
|
+
// and must not open an empty panel.
|
|
97
|
+
if (!manager.profileOf(target.id))
|
|
98
|
+
return;
|
|
99
|
+
manager.open(target.id);
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* The registry's element type erases the parameter contract; `run` re-validates
|
|
104
|
+
* with {@link readElementParams} rather than trusting the static type, which is
|
|
105
|
+
* what an agent-invocable command has to do anyway.
|
|
106
|
+
*/
|
|
107
|
+
export const readingCommands = [readElementCommand];
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type AnyCommandDescriptor } from '../../std/index.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* `values: []` removes the tag. Both keys are REQUIRED on purpose: an optional
|
|
5
|
+
* `values` would make a forgotten argument silently destroy a qualification,
|
|
6
|
+
* which is exactly the failure mode an agent-invocable command must not have.
|
|
7
|
+
*/
|
|
8
|
+
export declare const setTagParams: z.ZodObject<{
|
|
9
|
+
/** Namespaced tag def id, e.g. `'wardley:nature'`. */
|
|
10
|
+
tag: z.ZodString;
|
|
11
|
+
/**
|
|
12
|
+
* The value ids selected for that tag, e.g. `['wardley:nature/data']`.
|
|
13
|
+
* `[]` clears it.
|
|
14
|
+
*
|
|
15
|
+
* NOT validated against the registered defs. A document may legitimately
|
|
16
|
+
* carry an id whose def was removed, renamed or never seeded in this
|
|
17
|
+
* deployment, and the persisted value must accept any string — narrowing it
|
|
18
|
+
* here would push that case toward a load-time failure. The picker offers
|
|
19
|
+
* only defined values; the command does not police them.
|
|
20
|
+
*/
|
|
21
|
+
values: z.ZodArray<z.ZodString, "many">;
|
|
22
|
+
/**
|
|
23
|
+
* Explicit targets, for a host or an agent acting on something other than the
|
|
24
|
+
* live selection. **Omitted** — the key absent — the command acts on the
|
|
25
|
+
* current canvas selection.
|
|
26
|
+
*
|
|
27
|
+
* An EMPTY array is not the same thing: it means "these zero elements", so
|
|
28
|
+
* the command does nothing and does not fall back to the selection.
|
|
29
|
+
*/
|
|
30
|
+
elementIds: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
31
|
+
}, "strip", z.ZodTypeAny, {
|
|
32
|
+
values: string[];
|
|
33
|
+
tag: string;
|
|
34
|
+
elementIds?: string[] | undefined;
|
|
35
|
+
}, {
|
|
36
|
+
values: string[];
|
|
37
|
+
tag: string;
|
|
38
|
+
elementIds?: string[] | undefined;
|
|
39
|
+
}>;
|
|
40
|
+
export type SetTagParams = z.infer<typeof setTagParams>;
|
|
41
|
+
/**
|
|
42
|
+
* The registry's element type erases the parameter contract
|
|
43
|
+
* ({@link AnyCommandDescriptor}); `run` re-validates with {@link setTagParams}
|
|
44
|
+
* rather than trusting the static type, which is what an agent-invocable
|
|
45
|
+
* command has to do anyway.
|
|
46
|
+
*/
|
|
47
|
+
export declare const tagCommands: AnyCommandDescriptor[];
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The promotion rung "component → materialities": qualify a surface element
|
|
3
|
+
* with a namespaced type-3 tag (MF3, ADR 0007 §§ 4 and 6).
|
|
4
|
+
*
|
|
5
|
+
* Same shape as `pivot.bind`, and for the same reason: the library fixes the
|
|
6
|
+
* format of tag definitions but does not own them — the host seeds them — so
|
|
7
|
+
* WHICH tag and WHICH values are parameters, never a lib-side enumeration. That
|
|
8
|
+
* is also what makes the command usable by the agent surface with no UI at all.
|
|
9
|
+
*
|
|
10
|
+
* Promotion is never a conversion: the element's `type` never changes, nothing
|
|
11
|
+
* is created, destroyed or swapped, and `xywh` / `rotate` / `index` / `seed` and
|
|
12
|
+
* every style field are untouched. The gesture is reversible — an empty `values`
|
|
13
|
+
* removes the tag — and no rung requires the previous one: an element may carry
|
|
14
|
+
* tags with no `pivotDocId`, and a `pivotDocId` with no `role`.
|
|
15
|
+
*/
|
|
16
|
+
import { TelemetryProvider } from '../../affine-shared/services/index.js';
|
|
17
|
+
import { FRAMEWORK_IDS, } from '../../std/index.js';
|
|
18
|
+
import { GfxControllerIdentifier, GfxPrimitiveElementModel, setElementTag, } from '../../std/gfx/index.js';
|
|
19
|
+
import { z } from 'zod';
|
|
20
|
+
/**
|
|
21
|
+
* `values: []` removes the tag. Both keys are REQUIRED on purpose: an optional
|
|
22
|
+
* `values` would make a forgotten argument silently destroy a qualification,
|
|
23
|
+
* which is exactly the failure mode an agent-invocable command must not have.
|
|
24
|
+
*/
|
|
25
|
+
export const setTagParams = z.object({
|
|
26
|
+
/** Namespaced tag def id, e.g. `'wardley:nature'`. */
|
|
27
|
+
tag: z.string().min(1),
|
|
28
|
+
/**
|
|
29
|
+
* The value ids selected for that tag, e.g. `['wardley:nature/data']`.
|
|
30
|
+
* `[]` clears it.
|
|
31
|
+
*
|
|
32
|
+
* NOT validated against the registered defs. A document may legitimately
|
|
33
|
+
* carry an id whose def was removed, renamed or never seeded in this
|
|
34
|
+
* deployment, and the persisted value must accept any string — narrowing it
|
|
35
|
+
* here would push that case toward a load-time failure. The picker offers
|
|
36
|
+
* only defined values; the command does not police them.
|
|
37
|
+
*/
|
|
38
|
+
values: z.array(z.string()),
|
|
39
|
+
/**
|
|
40
|
+
* Explicit targets, for a host or an agent acting on something other than the
|
|
41
|
+
* live selection. **Omitted** — the key absent — the command acts on the
|
|
42
|
+
* current canvas selection.
|
|
43
|
+
*
|
|
44
|
+
* An EMPTY array is not the same thing: it means "these zero elements", so
|
|
45
|
+
* the command does nothing and does not fall back to the selection.
|
|
46
|
+
*/
|
|
47
|
+
elementIds: z.array(z.string()).optional(),
|
|
48
|
+
});
|
|
49
|
+
/**
|
|
50
|
+
* The elements this gesture would write to. Surface elements only: canvas
|
|
51
|
+
* BLOCKS carry a versioned schema, so qualifying them would be a `version` bump
|
|
52
|
+
* in `packages/affine/model` and is out of scope (ADR 0005 § 6).
|
|
53
|
+
*/
|
|
54
|
+
function tagTargets(std, elementIds) {
|
|
55
|
+
const gfx = std.get(GfxControllerIdentifier);
|
|
56
|
+
const models = elementIds
|
|
57
|
+
? elementIds.map(id => gfx.surface?.getElementById(id))
|
|
58
|
+
: gfx.selection.selectedElements;
|
|
59
|
+
return models.filter((model) => model instanceof GfxPrimitiveElementModel);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Whether this document may be written to at all.
|
|
63
|
+
*
|
|
64
|
+
* Checked in `run` and not only in `when`, for the reason `pivot.bind`
|
|
65
|
+
* documents: `when` is consulted by the SURFACES, and `runCommand` consults
|
|
66
|
+
* neither it nor `availability` — the palette and the agent reach `run`
|
|
67
|
+
* directly. Without this guard, removing a tag succeeds in a read-only
|
|
68
|
+
* document, because both `Store.transact` and `clearField` carry no read-only
|
|
69
|
+
* guard of their own.
|
|
70
|
+
*/
|
|
71
|
+
const isQualifiable = (std) => !std.store.readonly;
|
|
72
|
+
/** `'wardley:component'` → `'wardley'`, when that names a real framework. */
|
|
73
|
+
function frameworkOfRole(role) {
|
|
74
|
+
const namespace = role?.split(':')[0];
|
|
75
|
+
return FRAMEWORK_IDS.includes(namespace ?? '')
|
|
76
|
+
? namespace
|
|
77
|
+
: undefined;
|
|
78
|
+
}
|
|
79
|
+
/** The single value shared by every target, or `undefined` if they disagree. */
|
|
80
|
+
function unanimous(values) {
|
|
81
|
+
const distinct = new Set(values);
|
|
82
|
+
return distinct.size === 1 ? values[0] : undefined;
|
|
83
|
+
}
|
|
84
|
+
const setTag = {
|
|
85
|
+
id: 'tag.set',
|
|
86
|
+
owner: 'core',
|
|
87
|
+
kind: 'action',
|
|
88
|
+
// Not filed under `com.labre.keyboardShortcuts.*`: like `pivot.bind`, this
|
|
89
|
+
// one is keyless by intent and lives in the palette, the element toolbar and
|
|
90
|
+
// the agent, so that namespace would mislead a translator.
|
|
91
|
+
labelKey: 'com.labre.command.tag.set',
|
|
92
|
+
labelFallback: 'Qualify',
|
|
93
|
+
descriptionKey: 'com.labre.command.tag.set.description',
|
|
94
|
+
surfaces: ['palette', 'agent'],
|
|
95
|
+
scope: 'edgeless',
|
|
96
|
+
defaultKeys: { mac: [], other: [] },
|
|
97
|
+
availability: 'selection',
|
|
98
|
+
// Narrows `'selection'`, never contradicts it: a read-only document, and a
|
|
99
|
+
// selection of nothing but canvas blocks, both have no qualifiable target.
|
|
100
|
+
// Read-only rides on `when` rather than on `availability` because that union
|
|
101
|
+
// is one value per command and does not compose — the same arbitration
|
|
102
|
+
// `pivot.bind` records.
|
|
103
|
+
when: std => isQualifiable(std) && tagTargets(std).length > 0,
|
|
104
|
+
params: setTagParams,
|
|
105
|
+
run: (std, invocation, params) => {
|
|
106
|
+
const parsed = setTagParams.safeParse(params);
|
|
107
|
+
if (!parsed.success) {
|
|
108
|
+
console.error('tag.set: invalid params', parsed.error.issues);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const { tag, values, elementIds } = parsed.data;
|
|
112
|
+
// The load-bearing half of the read-only gate: see `isQualifiable`.
|
|
113
|
+
if (!isQualifiable(std))
|
|
114
|
+
return;
|
|
115
|
+
const targets = tagTargets(std, elementIds);
|
|
116
|
+
if (!targets.length)
|
|
117
|
+
return;
|
|
118
|
+
// BEFORE the write, not after. `store.transact()` is not an undo boundary:
|
|
119
|
+
// the `Y.UndoManager` is built with no `captureTimeout`, so Yjs's 500 ms
|
|
120
|
+
// default merges consecutive transactions — and a qualification issued
|
|
121
|
+
// within 500 ms of a drag would be undone TOGETHER with the drag, making
|
|
122
|
+
// the promotion look like it moved geometry (ADR 0007 § 6, as amended).
|
|
123
|
+
// `stopCapturing()` opens a new stack item for what comes NEXT, so it has
|
|
124
|
+
// to precede the write.
|
|
125
|
+
//
|
|
126
|
+
// Issued before knowing whether anything will change: `setElementTag`
|
|
127
|
+
// answers that per element, and an undo boundary with no write after it is
|
|
128
|
+
// inert, whereas a boundary opened too late is the defect this rule exists
|
|
129
|
+
// to prevent.
|
|
130
|
+
std.store.captureSync();
|
|
131
|
+
const changed = targets.filter(element => setElementTag(element, tag, values));
|
|
132
|
+
// A gesture that changes nothing emits nothing.
|
|
133
|
+
if (!changed.length)
|
|
134
|
+
return;
|
|
135
|
+
// The ONE emission for this gesture, self-emitted rather than routed
|
|
136
|
+
// through `runCommand`'s bottleneck: that emitter maps `CommandKind` onto
|
|
137
|
+
// the three CREATION events from a STATIC `{ framework, element }` on the
|
|
138
|
+
// descriptor, and a promotion is neither a creation nor static — `rung`,
|
|
139
|
+
// `direction` and `role` are facts of the invocation (ADR 0007 § 7).
|
|
140
|
+
const role = unanimous(changed.map(element => element.role));
|
|
141
|
+
std.getOptional(TelemetryProvider)?.track('FrameworkElementPromoted', {
|
|
142
|
+
page: 'whiteboard editor',
|
|
143
|
+
framework: frameworkOfRole(role),
|
|
144
|
+
rung: 'tag',
|
|
145
|
+
direction: values.length ? 'promote' : 'demote',
|
|
146
|
+
role,
|
|
147
|
+
elementCount: changed.length,
|
|
148
|
+
control: invocation.source,
|
|
149
|
+
module: invocation.surface,
|
|
150
|
+
});
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* The registry's element type erases the parameter contract
|
|
155
|
+
* ({@link AnyCommandDescriptor}); `run` re-validates with {@link setTagParams}
|
|
156
|
+
* rather than trusting the static type, which is what an agent-invocable
|
|
157
|
+
* command has to do anyway.
|
|
158
|
+
*/
|
|
159
|
+
export const tagCommands = [setTag];
|
|
@@ -44,6 +44,7 @@ export declare const builtinToolbarConfig: {
|
|
|
44
44
|
readonly tooltip?: string | import("lit-html").TemplateResult;
|
|
45
45
|
readonly score?: number;
|
|
46
46
|
readonly when?: ((cx: import("../../affine-shared/services/index.js").ToolbarContext) => boolean) | boolean;
|
|
47
|
+
readonly priority?: number;
|
|
47
48
|
readonly showLabel?: boolean;
|
|
48
49
|
readonly run?: (cx: import("../../affine-shared/services/index.js").ToolbarContext) => void;
|
|
49
50
|
readonly id: "g.comment";
|
|
@@ -5,7 +5,7 @@ import { EdgelessFrameManagerIdentifier } from '../../../../affine-block-frame/i
|
|
|
5
5
|
import { ImageBlockComponent } from '../../../../affine-block-image/index.js';
|
|
6
6
|
import { EdgelessCRUDIdentifier, getSurfaceComponent, } from '../../../../affine-block-surface/index.js';
|
|
7
7
|
import { createGroupFromSelectedCommand } from '../../../../affine-gfx-group/index.js';
|
|
8
|
-
import { AttachmentBlockModel, BookmarkBlockModel, EmbedLinkedDocBlockSchema, EmbedLinkedDocModel, EmbedSyncedDocBlockSchema, EmbedSyncedDocModel, FrameBlockModel, ImageBlockModel, isExternalEmbedModel, NoteBlockModel, ParagraphBlockModel, } from '../../../../affine-model/index.js';
|
|
8
|
+
import { AttachmentBlockModel, BookmarkBlockModel, EmbedLinkedDocBlockSchema, EmbedLinkedDocModel, EmbedSyncedDocBlockSchema, EmbedSyncedDocModel, FrameBlockModel, ImageBlockModel, isExternalEmbedModel, MindmapElementModel, NoteBlockModel, ParagraphBlockModel, } from '../../../../affine-model/index.js';
|
|
9
9
|
import { QuickSearchProvider } from '../../../../affine-shared/services/index.js';
|
|
10
10
|
import { matchModels, } from '../../../../affine-shared/utils/index.js';
|
|
11
11
|
import { Bound, getCommonBoundWithRotation } from '../../../../global/gfx/index.js';
|
|
@@ -426,7 +426,14 @@ function linkElementViaQuickSearch(ctx, el) {
|
|
|
426
426
|
function reorderElements(ctx, models, type) {
|
|
427
427
|
if (!models.length)
|
|
428
428
|
return;
|
|
429
|
-
|
|
429
|
+
// A mindmap node has no index of its own: the whole mindmap moves as one, so
|
|
430
|
+
// reorder the container instead — and only once, however many of its nodes
|
|
431
|
+
// are in the selection.
|
|
432
|
+
const normalizedModels = Array.from(new Map(models.map(model => {
|
|
433
|
+
const reorderTarget = model.group instanceof MindmapElementModel ? model.group : model;
|
|
434
|
+
return [reorderTarget.id, reorderTarget];
|
|
435
|
+
})).values());
|
|
436
|
+
for (const model of normalizedModels) {
|
|
430
437
|
const index = ctx.gfx.layer.getReorderedIndex(model, type);
|
|
431
438
|
// block should be updated in transaction
|
|
432
439
|
if (model instanceof GfxBlockElementModel) {
|
|
@@ -68,7 +68,7 @@ export function createLinkedDocFromEdgelessElements(host, elements, docTitle) {
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
else {
|
|
71
|
-
const props = getElementProps(model, ids);
|
|
71
|
+
const props = getElementProps(model, ids, sortedElements);
|
|
72
72
|
newId = surface.addElement(props);
|
|
73
73
|
}
|
|
74
74
|
ids.set(model.id, newId);
|