@formicoidea/labre-core 0.41.0 → 0.43.1
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/LICENSE +384 -0
- package/dist/_pkgs/affine-block-bookmark/bookmark-block.js +2 -2
- package/dist/_pkgs/affine-block-data-view/configs/tooltips.js +1 -1
- package/dist/_pkgs/affine-block-database/configs/tooltips.js +1 -1
- package/dist/_pkgs/affine-block-edgeless-text/edgeless-text-block.js +4 -2
- package/dist/_pkgs/affine-block-edgeless-text/edgeless-toolbar/config.js +7 -1
- package/dist/_pkgs/affine-block-embed/common/iframe-sandbox.d.ts +39 -0
- package/dist/_pkgs/affine-block-embed/common/iframe-sandbox.js +39 -0
- package/dist/_pkgs/affine-block-embed/embed-figma-block/embed-figma-block.js +4 -1
- package/dist/_pkgs/affine-block-embed/embed-github-block/embed-github-block.js +2 -1
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/components/embed-iframe-error-card.d.ts +14 -1
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/components/embed-iframe-error-card.js +21 -2
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/consts.js +2 -0
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/embed-iframe-block.d.ts +2 -1
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/embed-iframe-block.js +41 -11
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/types.d.ts +16 -0
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/types.js +17 -1
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/utils.d.ts +8 -0
- package/dist/_pkgs/affine-block-embed/embed-iframe-block/utils.js +19 -0
- package/dist/_pkgs/affine-block-embed/embed-loom-block/embed-loom-block.js +4 -1
- package/dist/_pkgs/affine-block-embed/embed-youtube-block/embed-youtube-block.js +4 -1
- package/dist/_pkgs/affine-block-embed/index.d.ts +1 -0
- package/dist/_pkgs/affine-block-embed/index.js +1 -0
- package/dist/_pkgs/affine-block-embed/translations.d.ts +8 -0
- package/dist/_pkgs/affine-block-embed/translations.js +28 -0
- package/dist/_pkgs/affine-block-embed-doc/embed-linked-doc-block/embed-linked-doc-block.js +4 -2
- package/dist/_pkgs/affine-block-embed-doc/embed-synced-doc-block/embed-synced-doc-block.js +2 -2
- package/dist/_pkgs/affine-block-frame/frame-manager.js +6 -3
- package/dist/_pkgs/affine-block-frame/frame-tool.js +1 -1
- package/dist/_pkgs/affine-block-frame/frame-toolbar.js +6 -1
- package/dist/_pkgs/affine-block-list/list-keymap.js +7 -0
- package/dist/_pkgs/affine-block-list/utils/get-list-icon.js +3 -1
- package/dist/_pkgs/affine-block-note/configs/tooltips.js +1 -1
- package/dist/_pkgs/affine-block-note/note-keymap.js +7 -1
- package/dist/_pkgs/affine-block-paragraph/paragraph-keymap.js +7 -1
- package/dist/_pkgs/affine-block-root/adapters/html.js +2 -2
- package/dist/_pkgs/affine-block-root/commands/copy-link-commands.d.ts +2 -0
- package/dist/_pkgs/affine-block-root/commands/copy-link-commands.js +155 -0
- package/dist/_pkgs/affine-block-root/commands/pivot-commands.js +1 -8
- package/dist/_pkgs/affine-block-root/commands/tag-commands.js +1 -8
- package/dist/_pkgs/affine-block-root/edgeless/edgeless-keyboard.d.ts +9 -0
- package/dist/_pkgs/affine-block-root/edgeless/edgeless-keyboard.js +51 -0
- package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-block.d.ts +22 -0
- package/dist/_pkgs/affine-block-root/edgeless/edgeless-root-block.js +46 -0
- package/dist/_pkgs/affine-block-root/edgeless/utils/pinch-zoom.d.ts +21 -0
- package/dist/_pkgs/affine-block-root/edgeless/utils/pinch-zoom.js +24 -0
- package/dist/_pkgs/affine-block-root/edgeless/utils/query.js +8 -0
- package/dist/_pkgs/affine-block-root/index.d.ts +1 -0
- package/dist/_pkgs/affine-block-root/index.js +1 -0
- package/dist/_pkgs/affine-block-root/keyboard/keymap.js +1 -16
- package/dist/_pkgs/affine-block-root/view.js +2 -0
- package/dist/_pkgs/affine-block-surface/element-model/index.d.ts +21 -3
- package/dist/_pkgs/affine-block-surface/element-model/index.js +14 -2
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/command.d.ts +23 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/command.js +89 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/index.d.ts +7 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/index.js +5 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/render.d.ts +41 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/render.js +70 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/svg-context.d.ts +49 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/svg-context.js +257 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/tagged-path.d.ts +16 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/tagged-path.js +24 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/toolbar.d.ts +24 -0
- package/dist/_pkgs/affine-block-surface/extensions/export-svg/toolbar.js +66 -0
- package/dist/_pkgs/affine-block-surface/extensions/index.d.ts +4 -0
- package/dist/_pkgs/affine-block-surface/extensions/index.js +4 -0
- package/dist/_pkgs/affine-block-surface/extensions/interchange-import.d.ts +66 -4
- package/dist/_pkgs/affine-block-surface/extensions/interchange-import.js +253 -11
- package/dist/_pkgs/affine-block-surface/extensions/interchange.d.ts +18 -0
- package/dist/_pkgs/affine-block-surface/extensions/legend-toolbar.d.ts +81 -0
- package/dist/_pkgs/affine-block-surface/extensions/legend-toolbar.js +81 -0
- package/dist/_pkgs/affine-block-surface/extensions/legend.d.ts +144 -0
- package/dist/_pkgs/affine-block-surface/extensions/legend.js +495 -0
- package/dist/_pkgs/affine-block-surface/extensions/morph-toolbar.js +4 -0
- package/dist/_pkgs/affine-block-surface/extensions/reading-widget.d.ts +17 -3
- package/dist/_pkgs/affine-block-surface/extensions/reading-widget.js +35 -13
- package/dist/_pkgs/affine-block-surface/extensions/reading.d.ts +61 -1
- package/dist/_pkgs/affine-block-surface/extensions/reading.js +85 -39
- package/dist/_pkgs/affine-block-surface/extensions/record-action.d.ts +66 -0
- package/dist/_pkgs/affine-block-surface/extensions/record-action.js +145 -0
- package/dist/_pkgs/affine-block-surface/extensions/svg-sketch-translations.d.ts +3 -0
- package/dist/_pkgs/affine-block-surface/extensions/svg-sketch-translations.js +23 -0
- package/dist/_pkgs/affine-block-surface/extensions/svg-sketch.d.ts +1 -1
- package/dist/_pkgs/affine-block-surface/extensions/svg-sketch.js +12 -4
- package/dist/_pkgs/affine-block-surface/extensions/validation.d.ts +253 -28
- package/dist/_pkgs/affine-block-surface/extensions/validation.js +489 -41
- package/dist/_pkgs/affine-block-surface/framework-background/background-view.d.ts +115 -0
- package/dist/_pkgs/affine-block-surface/framework-background/background-view.js +185 -0
- package/dist/_pkgs/affine-block-surface/framework-background/fit.d.ts +36 -0
- package/dist/_pkgs/affine-block-surface/framework-background/fit.js +30 -0
- package/dist/_pkgs/affine-block-surface/framework-background/index.d.ts +2 -0
- package/dist/_pkgs/affine-block-surface/framework-background/index.js +2 -0
- package/dist/_pkgs/affine-block-surface/framework-background/labels.d.ts +16 -1
- package/dist/_pkgs/affine-block-surface/framework-background/labels.js +31 -21
- package/dist/_pkgs/affine-block-surface/framework-background/renderer.js +29 -5
- package/dist/_pkgs/affine-block-surface/framework-background/stacking.d.ts +6 -4
- package/dist/_pkgs/affine-block-surface/framework-background/stacking.js +56 -8
- package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.d.ts +12 -0
- package/dist/_pkgs/affine-block-surface/renderer/canvas-renderer.js +15 -0
- package/dist/_pkgs/affine-block-surface/renderer/element-highlight-overlay.js +2 -7
- package/dist/_pkgs/affine-block-surface/view.js +8 -1
- package/dist/_pkgs/affine-block-surface-ref/configs/slash-menu.js +1 -1
- package/dist/_pkgs/affine-block-surface-ref/configs/tooltips.js +2 -2
- package/dist/_pkgs/affine-components/color-picker/button.d.ts +56 -1
- package/dist/_pkgs/affine-components/color-picker/button.js +168 -23
- package/dist/_pkgs/affine-components/color-picker/framework-palette.d.ts +106 -0
- package/dist/_pkgs/affine-components/color-picker/framework-palette.js +177 -0
- package/dist/_pkgs/affine-components/color-picker/index.d.ts +2 -0
- package/dist/_pkgs/affine-components/color-picker/index.js +2 -0
- package/dist/_pkgs/affine-components/color-picker/palette-carousel.d.ts +85 -0
- package/dist/_pkgs/affine-components/color-picker/palette-carousel.js +445 -0
- package/dist/_pkgs/affine-components/color-picker/styles.js +1 -1
- package/dist/_pkgs/affine-components/context-menu/button.js +3 -1
- package/dist/_pkgs/affine-components/edgeless-shape-color-picker/color-picker.d.ts +31 -1
- package/dist/_pkgs/affine-components/edgeless-shape-color-picker/color-picker.js +189 -63
- package/dist/_pkgs/affine-components/icons/ai.js +3 -3
- package/dist/_pkgs/affine-components/icons/list.js +7 -1
- package/dist/_pkgs/affine-components/resource/resource.js +29 -16
- package/dist/_pkgs/affine-components/size-dropdown-menu/dropdown-menu.js +6 -1
- package/dist/_pkgs/affine-components/toolbar/index.d.ts +1 -1
- package/dist/_pkgs/affine-components/toolbar/index.js +1 -1
- package/dist/_pkgs/affine-components/toolbar/menu-button.d.ts +7 -0
- package/dist/_pkgs/affine-components/toolbar/menu-button.js +30 -0
- package/dist/_pkgs/affine-components/toolbar/picker-menu.d.ts +16 -1
- package/dist/_pkgs/affine-components/toolbar/picker-menu.js +2 -2
- package/dist/_pkgs/affine-components/toolbar/toolbar.d.ts +1 -0
- package/dist/_pkgs/affine-components/toolbar/toolbar.js +67 -0
- package/dist/_pkgs/affine-components/translations.d.ts +8 -0
- package/dist/_pkgs/affine-components/translations.js +17 -0
- package/dist/_pkgs/affine-foundation/view.js +2 -1
- package/dist/_pkgs/affine-fragment-frame-panel/card/frame-card-title-editor.js +1 -1
- package/dist/_pkgs/affine-fragment-frame-panel/card/frame-card.js +1 -1
- package/dist/_pkgs/affine-gfx-brush/element-renderer.js +2 -2
- package/dist/_pkgs/affine-gfx-brush/toolbar/components/eraser/icons.js +1 -1
- package/dist/_pkgs/affine-gfx-brush/toolbar/configs/brush.js +6 -1
- package/dist/_pkgs/affine-gfx-brush/toolbar/configs/highlighter.js +6 -1
- package/dist/_pkgs/affine-gfx-connector/connector-manager.d.ts +9 -1
- package/dist/_pkgs/affine-gfx-connector/connector-manager.js +61 -0
- package/dist/_pkgs/affine-gfx-connector/direction/direction-reveal.d.ts +11 -2
- package/dist/_pkgs/affine-gfx-connector/direction/direction-reveal.js +11 -2
- package/dist/_pkgs/affine-gfx-connector/element-renderer/connector-dom/index.d.ts +7 -1
- package/dist/_pkgs/affine-gfx-connector/element-renderer/connector-dom/index.js +87 -17
- package/dist/_pkgs/affine-gfx-connector/element-renderer/index.js +78 -17
- package/dist/_pkgs/affine-gfx-connector/element-renderer/utils.d.ts +24 -2
- package/dist/_pkgs/affine-gfx-connector/element-renderer/utils.js +31 -8
- package/dist/_pkgs/affine-gfx-connector/text/edgeless-connector-label-editor.d.ts +124 -3
- package/dist/_pkgs/affine-gfx-connector/text/edgeless-connector-label-editor.js +219 -56
- package/dist/_pkgs/affine-gfx-connector/text/text.d.ts +13 -4
- package/dist/_pkgs/affine-gfx-connector/text/text.js +13 -44
- package/dist/_pkgs/affine-gfx-connector/toolbar/config.d.ts +56 -0
- package/dist/_pkgs/affine-gfx-connector/toolbar/config.js +94 -10
- package/dist/_pkgs/affine-gfx-connector/toolbar/hollow-endpoint-icons.d.ts +8 -0
- package/dist/_pkgs/affine-gfx-connector/toolbar/hollow-endpoint-icons.js +118 -0
- package/dist/_pkgs/affine-gfx-connector/translations.d.ts +3 -0
- package/dist/_pkgs/affine-gfx-connector/translations.js +23 -0
- package/dist/_pkgs/affine-gfx-connector/view/view.d.ts +37 -1
- package/dist/_pkgs/affine-gfx-connector/view/view.js +97 -8
- package/dist/_pkgs/affine-gfx-group/command/group-api.js +1 -1
- package/dist/_pkgs/affine-gfx-group/store.js +0 -2
- package/dist/_pkgs/affine-gfx-group/translations.d.ts +9 -10
- package/dist/_pkgs/affine-gfx-group/translations.js +9 -13
- package/dist/_pkgs/affine-gfx-mindmap/indicator-overlay/index.js +6 -2
- package/dist/_pkgs/affine-gfx-mindmap/templates/index.js +1 -1
- package/dist/_pkgs/affine-gfx-mindmap/toolbar/basket-elements.js +1 -1
- package/dist/_pkgs/affine-gfx-mindmap/toolbar/config.js +4 -2
- package/dist/_pkgs/affine-gfx-mindmap/toolbar/utils/import-mindmap.js +2 -2
- package/dist/_pkgs/affine-gfx-mindmap/translations.d.ts +7 -1
- package/dist/_pkgs/affine-gfx-mindmap/translations.js +11 -1
- package/dist/_pkgs/affine-gfx-shape/element-renderer/highlighter.js +2 -2
- package/dist/_pkgs/affine-gfx-shape/overlay/polygon-drawing-overlay.d.ts +6 -0
- package/dist/_pkgs/affine-gfx-shape/overlay/polygon-drawing-overlay.js +30 -1
- package/dist/_pkgs/affine-gfx-shape/polygon-tool.d.ts +20 -1
- package/dist/_pkgs/affine-gfx-shape/polygon-tool.js +9 -1
- package/dist/_pkgs/affine-gfx-shape/toolbar/config.js +10 -3
- package/dist/_pkgs/affine-gfx-shape/toolbar/palette-color-action.js +11 -1
- package/dist/_pkgs/affine-gfx-shape/translations.d.ts +7 -0
- package/dist/_pkgs/affine-gfx-shape/translations.js +11 -0
- package/dist/_pkgs/affine-gfx-template/builtin/other.js +14 -8
- package/dist/_pkgs/affine-gfx-template/snapshot-from-action.js +32 -119
- package/dist/_pkgs/affine-gfx-template/toolbar/template-loading.js +1 -1
- package/dist/_pkgs/affine-gfx-template/toolbar/template-type.d.ts +1 -1
- package/dist/_pkgs/affine-gfx-template/translations.d.ts +5 -0
- package/dist/_pkgs/affine-gfx-template/translations.js +38 -0
- package/dist/_pkgs/affine-gfx-text/dblclick-add-edgeless-text.d.ts +13 -1
- package/dist/_pkgs/affine-gfx-text/dblclick-add-edgeless-text.js +19 -4
- package/dist/_pkgs/affine-gfx-text/edgeless-text-editor.d.ts +41 -0
- package/dist/_pkgs/affine-gfx-text/edgeless-text-editor.js +60 -4
- package/dist/_pkgs/affine-gfx-text/toolbar/actions.d.ts +8 -1
- package/dist/_pkgs/affine-gfx-text/toolbar/actions.js +14 -2
- package/dist/_pkgs/affine-gfx-text/translations.d.ts +9 -0
- package/dist/_pkgs/affine-gfx-text/translations.js +14 -1
- package/dist/_pkgs/affine-inline-latex/latex-node/latex-editor-menu.js +2 -1
- package/dist/_pkgs/affine-inline-preset/markdown.js +5 -1
- package/dist/_pkgs/affine-model/consts/connector.d.ts +28 -2
- package/dist/_pkgs/affine-model/consts/connector.js +26 -0
- package/dist/_pkgs/affine-model/consts/text.d.ts +15 -2
- package/dist/_pkgs/affine-model/consts/text.js +25 -1
- package/dist/_pkgs/affine-model/elements/bpmn/pool.js +1 -1
- package/dist/_pkgs/affine-model/elements/brush/brush.js +1 -1
- package/dist/_pkgs/affine-model/elements/c4/board.js +1 -1
- package/dist/_pkgs/affine-model/elements/c4/boundary.js +1 -1
- package/dist/_pkgs/affine-model/elements/connector/connector.d.ts +135 -0
- package/dist/_pkgs/affine-model/elements/connector/connector.js +246 -5
- package/dist/_pkgs/affine-model/elements/connector/end-label.d.ts +83 -0
- package/dist/_pkgs/affine-model/elements/connector/end-label.js +119 -0
- package/dist/_pkgs/affine-model/elements/connector/index.d.ts +1 -0
- package/dist/_pkgs/affine-model/elements/connector/index.js +1 -0
- package/dist/_pkgs/affine-model/elements/context-map/context-map.js +1 -1
- package/dist/_pkgs/affine-model/elements/core-domain/core-domain.d.ts +28 -0
- package/dist/_pkgs/affine-model/elements/core-domain/core-domain.js +129 -2
- package/dist/_pkgs/affine-model/elements/cynefin/cynefin.d.ts +8 -0
- package/dist/_pkgs/affine-model/elements/cynefin/cynefin.js +45 -2
- package/dist/_pkgs/affine-model/elements/edgy/board.js +1 -1
- package/dist/_pkgs/affine-model/elements/edgy/facets.js +1 -1
- package/dist/_pkgs/affine-model/elements/estuarine/estuarine.d.ts +6 -0
- package/dist/_pkgs/affine-model/elements/estuarine/estuarine.js +36 -2
- package/dist/_pkgs/affine-model/elements/event-storming/event-storming.d.ts +18 -7
- package/dist/_pkgs/affine-model/elements/event-storming/event-storming.js +23 -8
- package/dist/_pkgs/affine-model/elements/framework-background/background.d.ts +16 -0
- package/dist/_pkgs/affine-model/elements/framework-background/background.js +18 -0
- package/dist/_pkgs/affine-model/elements/highlighter/highlighter.js +1 -1
- package/dist/_pkgs/affine-model/elements/index.d.ts +8 -0
- package/dist/_pkgs/affine-model/elements/index.js +1 -0
- package/dist/_pkgs/affine-model/elements/shape/shape.js +1 -1
- package/dist/_pkgs/affine-model/elements/text/text.js +1 -1
- package/dist/_pkgs/affine-model/elements/uml/band.d.ts +39 -0
- package/dist/_pkgs/affine-model/elements/uml/band.js +31 -0
- package/dist/_pkgs/affine-model/elements/uml/diagram.d.ts +158 -0
- package/dist/_pkgs/affine-model/elements/uml/diagram.js +229 -0
- package/dist/_pkgs/affine-model/elements/uml/fragment.d.ts +161 -0
- package/dist/_pkgs/affine-model/elements/uml/fragment.js +205 -0
- package/dist/_pkgs/affine-model/elements/uml/index.d.ts +8 -0
- package/dist/_pkgs/affine-model/elements/uml/index.js +8 -0
- package/dist/_pkgs/affine-model/elements/uml/lifeline.d.ts +77 -0
- package/dist/_pkgs/affine-model/elements/uml/lifeline.js +89 -0
- package/dist/_pkgs/affine-model/elements/uml/node.d.ts +142 -0
- package/dist/_pkgs/affine-model/elements/uml/node.js +190 -0
- package/dist/_pkgs/affine-model/elements/uml/partition.d.ts +106 -0
- package/dist/_pkgs/affine-model/elements/uml/partition.js +172 -0
- package/dist/_pkgs/affine-model/elements/uml/region.d.ts +75 -0
- package/dist/_pkgs/affine-model/elements/uml/region.js +150 -0
- package/dist/_pkgs/affine-model/elements/uml/subject.d.ts +37 -0
- package/dist/_pkgs/affine-model/elements/uml/subject.js +108 -0
- package/dist/_pkgs/affine-model/elements/wardley/wardley.js +1 -1
- package/dist/_pkgs/affine-shared/services/embed-iframe/embed-iframe-config.d.ts +1 -0
- package/dist/_pkgs/affine-shared/services/font-loader/config.d.ts +18 -0
- package/dist/_pkgs/affine-shared/services/font-loader/config.js +82 -50
- package/dist/_pkgs/affine-shared/services/pivot-materiality-publisher.js +1 -9
- package/dist/_pkgs/affine-shared/services/telemetry-service/document-damage-watcher.d.ts +53 -0
- package/dist/_pkgs/affine-shared/services/telemetry-service/document-damage-watcher.js +95 -0
- package/dist/_pkgs/affine-shared/services/telemetry-service/index.d.ts +1 -0
- package/dist/_pkgs/affine-shared/services/telemetry-service/index.js +1 -0
- package/dist/_pkgs/affine-shared/services/telemetry-service/lifecycle.d.ts +26 -1
- package/dist/_pkgs/affine-shared/services/telemetry-service/telemetry-service.d.ts +2 -2
- package/dist/_pkgs/affine-shared/services/theme-service.d.ts +19 -0
- package/dist/_pkgs/affine-shared/services/theme-service.js +24 -0
- package/dist/_pkgs/affine-shared/services/toolbar-service/command-action.d.ts +34 -0
- package/dist/_pkgs/affine-shared/services/toolbar-service/command-action.js +63 -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/translation-service/chrome.d.ts +97 -7
- package/dist/_pkgs/affine-shared/services/translation-service/chrome.js +178 -7
- package/dist/_pkgs/affine-shared/styles/index.d.ts +1 -0
- package/dist/_pkgs/affine-shared/styles/index.js +1 -0
- package/dist/_pkgs/affine-shared/styles/motion.d.ts +14 -0
- package/dist/_pkgs/affine-shared/styles/motion.js +38 -0
- package/dist/_pkgs/affine-shared/utils/event.d.ts +10 -0
- package/dist/_pkgs/affine-shared/utils/event.js +20 -0
- package/dist/_pkgs/affine-shared/utils/file/filesys.d.ts +16 -0
- package/dist/_pkgs/affine-shared/utils/file/filesys.js +25 -0
- package/dist/_pkgs/affine-shared/utils/index.d.ts +1 -0
- package/dist/_pkgs/affine-shared/utils/index.js +1 -0
- package/dist/_pkgs/affine-shared/utils/link-preview-refresh.d.ts +12 -0
- package/dist/_pkgs/affine-shared/utils/link-preview-refresh.js +13 -0
- package/dist/_pkgs/affine-widget-edgeless-dragging-area/edgeless-dragging-area-rect.js +2 -2
- package/dist/_pkgs/affine-widget-edgeless-selected-rect/utils.js +5 -1
- package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-widget.d.ts +12 -4
- package/dist/_pkgs/affine-widget-edgeless-toolbar/catalogue/artefact-catalogue-widget.js +27 -4
- package/dist/_pkgs/affine-widget-edgeless-toolbar/config/types.d.ts +15 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/config/utils.d.ts +1 -1
- package/dist/_pkgs/affine-widget-edgeless-toolbar/config/utils.js +7 -2
- package/dist/_pkgs/affine-widget-edgeless-toolbar/create-popper.js +13 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/index.d.ts +2 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/index.js +2 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.d.ts +80 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/command-menu.js +270 -81
- package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/senior-menu-selection.d.ts +15 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/menu/senior-menu-selection.js +15 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/panel/font-family-panel.d.ts +18 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/panel/font-family-panel.js +52 -6
- package/dist/_pkgs/affine-widget-edgeless-toolbar/panel/font-weight-and-style-panel.js +8 -1
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-ghost-overlay.d.ts +42 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-ghost-overlay.js +100 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-placement-tool.d.ts +100 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/artefact-placement-tool.js +274 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/index.d.ts +3 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/index.js +3 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/translate-created.d.ts +25 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/placement/translate-created.js +67 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/translations.d.ts +6 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/translations.js +10 -0
- package/dist/_pkgs/affine-widget-edgeless-toolbar/view.js +5 -0
- package/dist/_pkgs/affine-widget-frame-title/edgeless-frame-title-editor.js +2 -1
- package/dist/_pkgs/affine-widget-slash-menu/translations.d.ts +16 -0
- package/dist/_pkgs/affine-widget-slash-menu/translations.js +23 -1
- package/dist/_pkgs/affine-widget-toolbar/utils.js +57 -14
- package/dist/_pkgs/data-view/core/detail/field.js +2 -1
- package/dist/_pkgs/data-view/core/filter/literal/define.js +3 -1
- package/dist/_pkgs/data-view/core/group-by/renderer/boolean-group.js +1 -1
- package/dist/_pkgs/data-view/property-presets/checkbox/cell-renderer.js +8 -2
- package/dist/_pkgs/data-view/view-presets/kanban/pc/cell.js +1 -1
- package/dist/_pkgs/data-view/view-presets/kanban/pc/controller/drag.js +2 -1
- package/dist/_pkgs/data-view/view-presets/table/pc/controller/drag.js +2 -1
- package/dist/_pkgs/data-view/view-presets/table/pc/controller/selection.js +1 -1
- package/dist/_pkgs/data-view/view-presets/table/pc/header/vertical-indicator.js +2 -1
- package/dist/_pkgs/data-view/view-presets/table/pc/row/row-select-checkbox.js +3 -1
- package/dist/_pkgs/data-view/view-presets/table/pc-virtual/controller/drag.js +2 -1
- package/dist/_pkgs/data-view/view-presets/table/pc-virtual/controller/selection.js +1 -1
- package/dist/_pkgs/data-view/view-presets/table/pc-virtual/group/top/header/vertical-indicator.js +2 -1
- package/dist/_pkgs/data-view/view-presets/table/pc-virtual/row/row-header.js +3 -1
- package/dist/_pkgs/global/gfx/xywh.js +7 -0
- package/dist/_pkgs/std/extension/command-registry.d.ts +158 -1
- package/dist/_pkgs/std/extension/command-registry.js +22 -0
- package/dist/_pkgs/std/gfx/index.d.ts +1 -1
- package/dist/_pkgs/std/gfx/interactivity/gfx-view-event-handler.d.ts +12 -0
- package/dist/_pkgs/std/gfx/interactivity/gfx-view-event-handler.js +20 -1
- package/dist/_pkgs/std/gfx/interactivity/manager.d.ts +10 -0
- package/dist/_pkgs/std/gfx/interactivity/manager.js +12 -0
- package/dist/_pkgs/std/gfx/model/surface/element-model.js +12 -7
- package/dist/_pkgs/std/gfx/model/surface/role.d.ts +10 -5
- package/dist/_pkgs/std/gfx/model/surface/surface-model.d.ts +56 -0
- package/dist/_pkgs/std/gfx/model/surface/surface-model.js +84 -3
- package/dist/_pkgs/std/gfx/view/view.d.ts +11 -2
- package/dist/_pkgs/std/gfx/view/view.js +16 -2
- package/dist/commands.d.ts +6 -0
- package/dist/commands.js +10 -2
- package/dist/frameworks.d.ts +9 -0
- package/dist/frameworks.js +19 -0
- package/dist/translations.js +21 -0
- package/package.json +13 -4
- package/dist/_pkgs/affine-gfx-group/group-watcher.d.ts +0 -1
- package/dist/_pkgs/affine-gfx-group/group-watcher.js +0 -20
|
@@ -155,8 +155,36 @@ export interface ReadingProfile {
|
|
|
155
155
|
tagId: string;
|
|
156
156
|
conventions: readonly ReadingNamingConvention[];
|
|
157
157
|
};
|
|
158
|
-
/**
|
|
158
|
+
/**
|
|
159
|
+
* The typed edge whose two ends the relation reading walks — the one the
|
|
160
|
+
* artefact is read THROUGH, and the one the panel lists first.
|
|
161
|
+
*/
|
|
159
162
|
relation?: ReadingRelationDef;
|
|
163
|
+
/**
|
|
164
|
+
* The OTHER typed edges the same artefact is read through, read after
|
|
165
|
+
* {@link relation} and listed under their own wordings.
|
|
166
|
+
*
|
|
167
|
+
* Absent for every framework whose artefacts carry one kind of line: a
|
|
168
|
+
* Wardley component has a dependency, a BPMN task a sequence flow, and a
|
|
169
|
+
* second table there would be a heading with nothing under it.
|
|
170
|
+
*
|
|
171
|
+
* It exists because UML's artefacts carry a DOZEN kinds of line, and the
|
|
172
|
+
* panel answering with one of them reads as an answer rather than as a
|
|
173
|
+
* selection: the PO's recette of 2026-09-14 (O8) opened the reading on a use
|
|
174
|
+
* case whose only link was an `«include»` and was told "No typed link touches
|
|
175
|
+
* this component", which the drawing plainly contradicted. One relation per
|
|
176
|
+
* profile was a deliberate narrowing (`gfx/uml/src/reading.ts` argued it and
|
|
177
|
+
* named what it left unread); what the recette established is that a reader
|
|
178
|
+
* cannot tell a narrowing from a failure, because the panel says the same
|
|
179
|
+
* thing in both cases.
|
|
180
|
+
*
|
|
181
|
+
* Every table is INDEPENDENT: its own `edgeRole`, its own two wordings, its
|
|
182
|
+
* own `geometry` claim. `roleIsA` still applies to each, so a table declared
|
|
183
|
+
* on a parent role reaches its children and two tables must not overlap — an
|
|
184
|
+
* edge matching both would be listed twice. Order is the order the panel
|
|
185
|
+
* reads them in, so the first is the question the artefact answers first.
|
|
186
|
+
*/
|
|
187
|
+
alsoRelations?: readonly ReadingRelationDef[];
|
|
160
188
|
/** The frame the phase is read from. */
|
|
161
189
|
frame?: {
|
|
162
190
|
backgroundRole: RoleId;
|
|
@@ -181,14 +209,46 @@ export interface ReadingProfile {
|
|
|
181
209
|
}
|
|
182
210
|
/** Where the other end of a typed edge sits, relative to the subject. */
|
|
183
211
|
export type ReadingRelationSide = 'consumer' | 'supplier';
|
|
212
|
+
/**
|
|
213
|
+
* Every relation table a profile declares, in reading order.
|
|
214
|
+
*
|
|
215
|
+
* One function so the engine and the panel cannot disagree about what a profile
|
|
216
|
+
* declares — the bug that shape of duplication always produces is a table read
|
|
217
|
+
* into {@link ElementReading.relations} and never drawn, or a heading drawn
|
|
218
|
+
* over nothing.
|
|
219
|
+
*/
|
|
220
|
+
export declare function readingRelationDefs(profile: ReadingProfile): readonly ReadingRelationDef[];
|
|
184
221
|
/** One typed edge touching the subject, read with the ADR 0010 convention. */
|
|
185
222
|
export interface ReadingRelation {
|
|
186
223
|
/** The edge element. */
|
|
187
224
|
edgeId: string;
|
|
225
|
+
/**
|
|
226
|
+
* The `edgeRole` of the TABLE that matched — the role the profile DECLARED,
|
|
227
|
+
* never the edge's own, which may be a specialisation of it (a UML
|
|
228
|
+
* composition read through `uml:association`, §11.5.4).
|
|
229
|
+
*
|
|
230
|
+
* It is what lets the panel put each relation under the wording it was read
|
|
231
|
+
* with once a profile declares several tables. One reading, one table, and
|
|
232
|
+
* the tables never overlap: {@link readingRelationDefs} documents that as the
|
|
233
|
+
* declaring framework's obligation.
|
|
234
|
+
*/
|
|
235
|
+
relationRole: RoleId;
|
|
188
236
|
/** The element at the other end. */
|
|
189
237
|
otherId: string;
|
|
190
238
|
/** Its name, when it has one — for the panel, which must not print ids. */
|
|
191
239
|
otherName: string;
|
|
240
|
+
/**
|
|
241
|
+
* What the connector writes at the SUBJECT's end, and at the other end —
|
|
242
|
+
* `undefined` when the author wrote nothing there, which is the ordinary
|
|
243
|
+
* case (ADR 0020).
|
|
244
|
+
*
|
|
245
|
+
* Two spellings of the same fact rather than `sourceLabel`/`targetLabel`,
|
|
246
|
+
* because the reading is written from the subject outwards and a panel
|
|
247
|
+
* saying "Associated with: OrderLine (1..*)" must not have to work out which
|
|
248
|
+
* end of the arrow it is standing on.
|
|
249
|
+
*/
|
|
250
|
+
ownEndLabel?: string;
|
|
251
|
+
otherEndLabel?: string;
|
|
192
252
|
/**
|
|
193
253
|
* What the OTHER element is to the subject. ADR 0010 § 2 tier 2: on a
|
|
194
254
|
* `wardley:dependency`, `source` is the consumer and `target` is what it
|
|
@@ -9,6 +9,21 @@ import { effect, signal } from '@preact/signals-core';
|
|
|
9
9
|
// canvas in.
|
|
10
10
|
import { backgroundPlot, } from '../framework-background/def.js';
|
|
11
11
|
import { backgroundTransitionBands, containingFrame, } from '../framework-background/facts.js';
|
|
12
|
+
/**
|
|
13
|
+
* Every relation table a profile declares, in reading order.
|
|
14
|
+
*
|
|
15
|
+
* One function so the engine and the panel cannot disagree about what a profile
|
|
16
|
+
* declares — the bug that shape of duplication always produces is a table read
|
|
17
|
+
* into {@link ElementReading.relations} and never drawn, or a heading drawn
|
|
18
|
+
* over nothing.
|
|
19
|
+
*/
|
|
20
|
+
export function readingRelationDefs(profile) {
|
|
21
|
+
const first = profile.relation;
|
|
22
|
+
const rest = profile.alsoRelations ?? [];
|
|
23
|
+
if (!first)
|
|
24
|
+
return rest;
|
|
25
|
+
return rest.length === 0 ? [first] : [first, ...rest];
|
|
26
|
+
}
|
|
12
27
|
/** Deepest role chain reported by {@link ReadingNodeType.specialises}. */
|
|
13
28
|
const MAX_ROLE_DEPTH = 32;
|
|
14
29
|
/** Numeric slack on the two geometry comparisons. Model units. */
|
|
@@ -218,55 +233,86 @@ function endpointsOf(element) {
|
|
|
218
233
|
return { source: source.id, target: target.id };
|
|
219
234
|
}
|
|
220
235
|
/**
|
|
221
|
-
*
|
|
236
|
+
* What a connector writes at one of its two ends, when it writes anything.
|
|
237
|
+
*
|
|
238
|
+
* A UML multiplicity is the case this exists for (`0..*` on the far end of an
|
|
239
|
+
* association), and the shape is ADR 0020's: two optional `Y.Text` props on the
|
|
240
|
+
* connector, empty when the author never opened the editor. Read defensively —
|
|
241
|
+
* the reading is handed plain element models by unit tests as readily as live
|
|
242
|
+
* ones — and blank-trimmed, because a text the user emptied is not a label.
|
|
243
|
+
*/
|
|
244
|
+
function endLabelOf(edge, end) {
|
|
245
|
+
const raw = edge[end === 'source' ? 'sourceLabel' : 'targetLabel'];
|
|
246
|
+
if (raw === undefined || raw === null)
|
|
247
|
+
return undefined;
|
|
248
|
+
const text = String(raw).trim();
|
|
249
|
+
return text.length > 0 ? text : undefined;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Every typed edge touching the subject, read as a relation — one pass per
|
|
253
|
+
* table the profile declares ({@link readingRelationDefs}).
|
|
254
|
+
*
|
|
255
|
+
* The tables are walked in DECLARATION order rather than the elements being
|
|
256
|
+
* walked once and each edge matched against every table, so the panel's
|
|
257
|
+
* sections come out in the order their framework wrote them and an artefact
|
|
258
|
+
* read through four kinds of line reads its first kind first. The cost is one
|
|
259
|
+
* pass over the surface per table, which is what it already was when a profile
|
|
260
|
+
* could only declare one.
|
|
222
261
|
*
|
|
223
262
|
* An edge with an unbound end is skipped, exactly as ADR 0010 requires of W4:
|
|
224
263
|
* releasing the link tool over empty canvas produces one, and a stroke that
|
|
225
264
|
* links nothing states nothing.
|
|
226
265
|
*/
|
|
227
266
|
function readRelations(element, elements, profile) {
|
|
228
|
-
const
|
|
229
|
-
if (
|
|
267
|
+
const defs = readingRelationDefs(profile);
|
|
268
|
+
if (defs.length === 0)
|
|
230
269
|
return [];
|
|
231
270
|
const byId = new Map(elements.map(el => [el.id, el]));
|
|
232
271
|
const [, subjectY] = centreOf(element.elementBound);
|
|
233
272
|
const relations = [];
|
|
234
|
-
for (const
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
273
|
+
for (const relation of defs) {
|
|
274
|
+
for (const edge of elements) {
|
|
275
|
+
if (edge.role === undefined)
|
|
276
|
+
continue;
|
|
277
|
+
if (!roleIsA(edge.role, relation.edgeRole, profile.roles))
|
|
278
|
+
continue;
|
|
279
|
+
const ends = endpointsOf(edge);
|
|
280
|
+
if (!ends)
|
|
281
|
+
continue;
|
|
282
|
+
const isSource = ends.source === element.id;
|
|
283
|
+
const isTarget = ends.target === element.id;
|
|
284
|
+
// A self-loop states nothing about an order and would report the subject
|
|
285
|
+
// as its own supplier.
|
|
286
|
+
if (isSource === isTarget)
|
|
287
|
+
continue;
|
|
288
|
+
const otherId = isSource ? ends.target : ends.source;
|
|
289
|
+
const other = byId.get(otherId);
|
|
290
|
+
if (!other)
|
|
291
|
+
continue;
|
|
292
|
+
const side = isSource ? 'supplier' : 'consumer';
|
|
293
|
+
const [, otherY] = centreOf(other.elementBound);
|
|
294
|
+
// `y` grows downwards, so "higher on the map" is a SMALLER y. A supplier
|
|
295
|
+
// is expected below the subject, a consumer above it — but only on a
|
|
296
|
+
// board whose framework CLAIMED that axis says something (`geometry`).
|
|
297
|
+
// Two BPMN tasks side by side contradict nothing.
|
|
298
|
+
const contradictsGeometry = relation.geometry !== 'vertical'
|
|
299
|
+
? false
|
|
300
|
+
: side === 'supplier'
|
|
301
|
+
? otherY < subjectY - GEOMETRY_EPSILON
|
|
302
|
+
: otherY > subjectY + GEOMETRY_EPSILON;
|
|
303
|
+
const ownEndLabel = endLabelOf(edge, isSource ? 'source' : 'target');
|
|
304
|
+
const otherEndLabel = endLabelOf(edge, isSource ? 'target' : 'source');
|
|
305
|
+
relations.push({
|
|
306
|
+
edgeId: edge.id,
|
|
307
|
+
relationRole: relation.edgeRole,
|
|
308
|
+
otherId,
|
|
309
|
+
otherName: readName(other, profile),
|
|
310
|
+
side,
|
|
311
|
+
contradictsGeometry,
|
|
312
|
+
...(ownEndLabel !== undefined ? { ownEndLabel } : {}),
|
|
313
|
+
...(otherEndLabel !== undefined ? { otherEndLabel } : {}),
|
|
314
|
+
});
|
|
315
|
+
}
|
|
270
316
|
}
|
|
271
317
|
return relations;
|
|
272
318
|
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Bound } from '../../global/gfx/index.js';
|
|
2
|
+
import type { BlockStdScope } from '../../std/index.js';
|
|
3
|
+
/** What {@link recordAction} saw a creation action ask the surface for. */
|
|
4
|
+
export interface RecordedAction {
|
|
5
|
+
/**
|
|
6
|
+
* One plain record per element the action added, in creation order, holding
|
|
7
|
+
* the props it passed. `id` is the recording's own (`el-0`, `el-1`, …), not
|
|
8
|
+
* an id any document will ever carry.
|
|
9
|
+
*/
|
|
10
|
+
records: Record<string, unknown>[];
|
|
11
|
+
/**
|
|
12
|
+
* The union of the records' `xywh`, relative to the fake viewport's centre —
|
|
13
|
+
* which sits at the ORIGIN, so this is the footprint the same action would
|
|
14
|
+
* draw around whatever centre a real viewport has. `null` when no record
|
|
15
|
+
* carries a box at all.
|
|
16
|
+
*/
|
|
17
|
+
bound: Bound | null;
|
|
18
|
+
/**
|
|
19
|
+
* The name of the tool the action armed, other than the default one it may
|
|
20
|
+
* return to after placing — `connector` for a command that lets the user
|
|
21
|
+
* DRAW a relation. Such a command creates nothing on its own and must be
|
|
22
|
+
* declared `kind: 'tool'`, or the placement tool wraps it and cancels the
|
|
23
|
+
* drawing it armed. `null` when nothing was armed.
|
|
24
|
+
*/
|
|
25
|
+
armedTool: string | null;
|
|
26
|
+
/**
|
|
27
|
+
* The OPTIONS the action armed that tool with — where a typed edge's `role`
|
|
28
|
+
* lives, since a command that arms the connector tool creates nothing and
|
|
29
|
+
* therefore stamps nothing on any record. `null` when nothing was armed.
|
|
30
|
+
*/
|
|
31
|
+
armedToolOptions: Record<string, unknown> | null;
|
|
32
|
+
}
|
|
33
|
+
/** Hook applied to a finished record before it is kept. See {@link recordAction}. */
|
|
34
|
+
export type RecordEncoder = (record: Record<string, unknown>) => void;
|
|
35
|
+
export interface RecordActionOptions {
|
|
36
|
+
/**
|
|
37
|
+
* The editor the recording is being run FOR. Its `TranslationProvider`, and
|
|
38
|
+
* nothing else from it, is handed to the action, so the seeds the action
|
|
39
|
+
* writes come out in the user's language. Without one, the action writes its
|
|
40
|
+
* English fallbacks.
|
|
41
|
+
*/
|
|
42
|
+
host?: BlockStdScope;
|
|
43
|
+
/**
|
|
44
|
+
* Last chance to rewrite a record before it is kept — how a caller that needs
|
|
45
|
+
* a SNAPSHOT converts the `Y.Text` / `Y.Map` props into their serialized
|
|
46
|
+
* form. A caller that only measures the drawing passes nothing.
|
|
47
|
+
*/
|
|
48
|
+
encode?: RecordEncoder;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Run a creation action against a recording fake, and hand back what it asked
|
|
52
|
+
* the surface for — so a framework's artefact can be measured, previewed or
|
|
53
|
+
* serialized without ever touching a document.
|
|
54
|
+
*
|
|
55
|
+
* The `std` handed to `run` answers the members placement actions actually
|
|
56
|
+
* touch and THROWS on anything else, so an unsupported action fails loudly
|
|
57
|
+
* instead of yielding a half-empty drawing. Callers that can carry on without a
|
|
58
|
+
* measure catch it; callers that cannot (a template derived at build time) let
|
|
59
|
+
* it through.
|
|
60
|
+
*
|
|
61
|
+
* Extracted from `snapshotFromAction` (`@labre/affine-gfx-template`), which is
|
|
62
|
+
* still its first caller: the placement tool needs the same recording and lives
|
|
63
|
+
* in the toolbar widget, which the template package depends ON — so the
|
|
64
|
+
* recording had to move down here, where both can reach it.
|
|
65
|
+
*/
|
|
66
|
+
export declare function recordAction(run: (std: BlockStdScope) => void, { host, encode }?: RecordActionOptions): RecordedAction;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { Bound } from '../../global/gfx/index.js';
|
|
2
|
+
import { TranslationProvider } from '../../affine-shared/services/index.js';
|
|
3
|
+
import { generateKeyBetween, GfxControllerIdentifier } from '../../std/gfx/index.js';
|
|
4
|
+
import { EdgelessCRUDIdentifier } from './crud-extension.js';
|
|
5
|
+
/**
|
|
6
|
+
* Run a creation action against a recording fake, and hand back what it asked
|
|
7
|
+
* the surface for — so a framework's artefact can be measured, previewed or
|
|
8
|
+
* serialized without ever touching a document.
|
|
9
|
+
*
|
|
10
|
+
* The `std` handed to `run` answers the members placement actions actually
|
|
11
|
+
* touch and THROWS on anything else, so an unsupported action fails loudly
|
|
12
|
+
* instead of yielding a half-empty drawing. Callers that can carry on without a
|
|
13
|
+
* measure catch it; callers that cannot (a template derived at build time) let
|
|
14
|
+
* it through.
|
|
15
|
+
*
|
|
16
|
+
* Extracted from `snapshotFromAction` (`@labre/affine-gfx-template`), which is
|
|
17
|
+
* still its first caller: the placement tool needs the same recording and lives
|
|
18
|
+
* in the toolbar widget, which the template package depends ON — so the
|
|
19
|
+
* recording had to move down here, where both can reach it.
|
|
20
|
+
*/
|
|
21
|
+
export function recordAction(run, { host, encode } = {}) {
|
|
22
|
+
const elements = new Map();
|
|
23
|
+
let n = 0;
|
|
24
|
+
let lastIndex = null;
|
|
25
|
+
const nextIndex = () => (lastIndex = generateKeyBetween(lastIndex, null));
|
|
26
|
+
const addElement = (props) => {
|
|
27
|
+
const id = `el-${n++}`;
|
|
28
|
+
const record = {};
|
|
29
|
+
for (const [key, value] of Object.entries(props)) {
|
|
30
|
+
if (value !== undefined)
|
|
31
|
+
record[key] = value;
|
|
32
|
+
}
|
|
33
|
+
record['id'] = id;
|
|
34
|
+
encode?.(record);
|
|
35
|
+
if (record['index'] === undefined)
|
|
36
|
+
record['index'] = nextIndex();
|
|
37
|
+
// The model members an action reads back off `getElementById`, kept
|
|
38
|
+
// non-enumerable so they never leak into a snapshot built from the record.
|
|
39
|
+
Object.defineProperties(record, {
|
|
40
|
+
group: { value: null },
|
|
41
|
+
deserializedXYWH: {
|
|
42
|
+
get: () => typeof record['xywh'] === 'string'
|
|
43
|
+
? Bound.deserialize(record['xywh'])
|
|
44
|
+
: null,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
elements.set(id, record);
|
|
48
|
+
return id;
|
|
49
|
+
};
|
|
50
|
+
const records = () => [...elements.values()];
|
|
51
|
+
let armedTool = null;
|
|
52
|
+
let armedToolOptions = null;
|
|
53
|
+
const setTool = (tool, options) => {
|
|
54
|
+
const name = typeof tool === 'string' ? tool : tool?.toolName;
|
|
55
|
+
if (name && name !== 'default') {
|
|
56
|
+
armedTool = name;
|
|
57
|
+
armedToolOptions = options ?? null;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const surface = {
|
|
61
|
+
addElement,
|
|
62
|
+
getElementById: (id) => elements.get(id) ?? null,
|
|
63
|
+
getElementsByType: (type) => records().filter(el => el['type'] === type),
|
|
64
|
+
get elementModels() {
|
|
65
|
+
return records();
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
const gfx = {
|
|
69
|
+
surface,
|
|
70
|
+
// The centre at the ORIGIN is what makes `bound` a footprint rather than a
|
|
71
|
+
// position: an action that creates "at the viewport centre" records a box
|
|
72
|
+
// around (0, 0), which is exactly the offset to re-apply around a real one.
|
|
73
|
+
viewport: { centerX: 0, centerY: 0, zoom: 1, center: { x: 0, y: 0 } },
|
|
74
|
+
doc: { captureSync: () => { } },
|
|
75
|
+
selection: { set: () => { }, selectedElements: [] },
|
|
76
|
+
tool: { setTool },
|
|
77
|
+
layer: {
|
|
78
|
+
generateIndex: () => nextIndex(),
|
|
79
|
+
getReorderedIndex: (_model, direction) => {
|
|
80
|
+
const sorted = records()
|
|
81
|
+
.map(el => String(el['index']))
|
|
82
|
+
.sort();
|
|
83
|
+
return direction === 'back'
|
|
84
|
+
? generateKeyBetween(null, sorted[0] ?? null)
|
|
85
|
+
: generateKeyBetween(sorted[sorted.length - 1] ?? null, null);
|
|
86
|
+
},
|
|
87
|
+
get canvasElements() {
|
|
88
|
+
return records();
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
std: null,
|
|
92
|
+
};
|
|
93
|
+
const crud = {
|
|
94
|
+
addElement: (type, props) => addElement({ ...props, type }),
|
|
95
|
+
};
|
|
96
|
+
const std = {
|
|
97
|
+
get: (identifier) => {
|
|
98
|
+
if (identifier === GfxControllerIdentifier)
|
|
99
|
+
return gfx;
|
|
100
|
+
if (identifier === EdgelessCRUDIdentifier)
|
|
101
|
+
return crud;
|
|
102
|
+
throw new Error(`recordAction: unsupported service "${identifier?.identifierName ?? String(identifier)}"`);
|
|
103
|
+
},
|
|
104
|
+
getOptional: (identifier) => identifier === TranslationProvider
|
|
105
|
+
? host?.getOptional(TranslationProvider)
|
|
106
|
+
: undefined,
|
|
107
|
+
command: {
|
|
108
|
+
// Really run the command, so a group built by `createGroupCommand` is
|
|
109
|
+
// whatever that command says a group is — no second definition here.
|
|
110
|
+
exec: (cmd, payload) => {
|
|
111
|
+
let out;
|
|
112
|
+
cmd({ std: gfx.std, ...payload }, r => {
|
|
113
|
+
out = r;
|
|
114
|
+
});
|
|
115
|
+
return [{}, out ?? {}];
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
store: {
|
|
119
|
+
readonly: false,
|
|
120
|
+
captureSync: () => { },
|
|
121
|
+
id: 'doc:template',
|
|
122
|
+
workspace: { meta: { getDocMeta: () => undefined } },
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
gfx.std = std;
|
|
126
|
+
run(gfx.std);
|
|
127
|
+
return {
|
|
128
|
+
records: records(),
|
|
129
|
+
bound: uniteBounds(records()),
|
|
130
|
+
armedTool,
|
|
131
|
+
armedToolOptions,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** The union of whatever boxes the records carry. */
|
|
135
|
+
function uniteBounds(records) {
|
|
136
|
+
let union = null;
|
|
137
|
+
for (const record of records) {
|
|
138
|
+
const xywh = record['xywh'];
|
|
139
|
+
if (typeof xywh !== 'string')
|
|
140
|
+
continue;
|
|
141
|
+
const bound = Bound.deserialize(xywh);
|
|
142
|
+
union = union ? union.unite(bound) : bound;
|
|
143
|
+
}
|
|
144
|
+
return union;
|
|
145
|
+
}
|
|
@@ -39,6 +39,9 @@ export declare const SVG_SKETCH_SKIPPED: ChromeWording;
|
|
|
39
39
|
export declare const SVG_SKETCH_REMOVED: ChromeWording;
|
|
40
40
|
export declare const SVG_SKETCH_REMOVED_ATTRIBUTE: ChromeWording;
|
|
41
41
|
export declare const SVG_SKETCH_EMPTY: ChromeWording;
|
|
42
|
+
export declare const SVG_SKETCH_ERROR_MALFORMED_XML: ChromeWording;
|
|
43
|
+
export declare const SVG_SKETCH_ERROR_NOT_SVG: ChromeWording;
|
|
44
|
+
export declare const SVG_SKETCH_ERROR_SANITIZED_AWAY: ChromeWording;
|
|
42
45
|
/**
|
|
43
46
|
* Every wording declared above, in declaration order — joined into
|
|
44
47
|
* `PACKAGE_WORDINGS` (`packages/affine/all/src/translations.ts`) alongside
|
|
@@ -92,6 +92,26 @@ export const SVG_SKETCH_EMPTY = [
|
|
|
92
92
|
'com.labre.interchange.svg.empty',
|
|
93
93
|
'No shape or text was recognised in this SVG, so nothing was drawn.',
|
|
94
94
|
];
|
|
95
|
+
/* ── The reader's own refusals (#390) ─────────────────────────────────────
|
|
96
|
+
*
|
|
97
|
+
* Thrown via `InterchangeImportError` and rendered by `runInterchangeImport`
|
|
98
|
+
* in the failure notification — the same shape as `BPMN_IMPORT_ERRORS`
|
|
99
|
+
* (`gfx/bpmn/src/import.ts`), and keyed for the same reason: these three
|
|
100
|
+
* sentences were written for a user, not for a console, and were reaching a
|
|
101
|
+
* French host in English because a bare `new Error(…)` carries no key.
|
|
102
|
+
*/
|
|
103
|
+
export const SVG_SKETCH_ERROR_MALFORMED_XML = [
|
|
104
|
+
'com.labre.interchange.svg.error.malformed-xml',
|
|
105
|
+
'This file is not well-formed XML, so no drawing can be read out of it: {{detail}}',
|
|
106
|
+
];
|
|
107
|
+
export const SVG_SKETCH_ERROR_NOT_SVG = [
|
|
108
|
+
'com.labre.interchange.svg.error.not-svg',
|
|
109
|
+
'An SVG opens on <svg>; this one opens on <{{tag}}>.',
|
|
110
|
+
];
|
|
111
|
+
export const SVG_SKETCH_ERROR_SANITIZED_AWAY = [
|
|
112
|
+
'com.labre.interchange.svg.error.sanitized-away',
|
|
113
|
+
'Nothing survived sanitizing this SVG, so there is no drawing to read.',
|
|
114
|
+
];
|
|
95
115
|
/**
|
|
96
116
|
* Every wording declared above, in declaration order — joined into
|
|
97
117
|
* `PACKAGE_WORDINGS` (`packages/affine/all/src/translations.ts`) alongside
|
|
@@ -117,4 +137,7 @@ export const SVG_SKETCH_WORDINGS = [
|
|
|
117
137
|
SVG_SKETCH_REMOVED,
|
|
118
138
|
SVG_SKETCH_REMOVED_ATTRIBUTE,
|
|
119
139
|
SVG_SKETCH_EMPTY,
|
|
140
|
+
SVG_SKETCH_ERROR_MALFORMED_XML,
|
|
141
|
+
SVG_SKETCH_ERROR_NOT_SVG,
|
|
142
|
+
SVG_SKETCH_ERROR_SANITIZED_AWAY,
|
|
120
143
|
];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type InterchangeImportContext, type InterchangeImportResult } from './interchange.js';
|
|
2
2
|
/**
|
|
3
3
|
* **SVG → a canvas sketch.** The platform's VISUAL-tier importer, shared by
|
|
4
4
|
* every framework that declares it (`docs/adr/0012`, P2).
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ShapeStyle, ShapeType, StrokeStyle, TextAlign, } from '../../affine-model/index.js';
|
|
2
2
|
import DOMPurify from 'dompurify';
|
|
3
|
-
import {
|
|
3
|
+
import { InterchangeImportError, } from './interchange.js';
|
|
4
|
+
import { SVG_SKETCH_CURRENT_COLOR, SVG_SKETCH_CURVE, SVG_SKETCH_EMPTY, SVG_SKETCH_EMPTY_BOX, SVG_SKETCH_EMPTY_TEXT, SVG_SKETCH_ERROR_MALFORMED_XML, SVG_SKETCH_ERROR_NOT_SVG, SVG_SKETCH_ERROR_SANITIZED_AWAY, SVG_SKETCH_FLAT_POLYGON, SVG_SKETCH_FONT_UNIT, SVG_SKETCH_HIDDEN_DISPLAY, SVG_SKETCH_HIDDEN_VISIBILITY, SVG_SKETCH_LONE_POINT, SVG_SKETCH_OPACITY, SVG_SKETCH_PAINT_SERVER, SVG_SKETCH_PERCENT_RADIUS, SVG_SKETCH_REMOVED, SVG_SKETCH_REMOVED_ATTRIBUTE, SVG_SKETCH_SKIPPED, SVG_SKETCH_SWITCH, SVG_SKETCH_TRANSFORM, } from './svg-sketch-translations.js';
|
|
4
5
|
/**
|
|
5
6
|
* **SVG → a canvas sketch.** The platform's VISUAL-tier importer, shared by
|
|
6
7
|
* every framework that declares it (`docs/adr/0012`, P2).
|
|
@@ -879,10 +880,15 @@ function parseSvgRoot(source, notes) {
|
|
|
879
880
|
.split('\n')
|
|
880
881
|
.map(line => line.trim())
|
|
881
882
|
.filter(line => line.length > 0);
|
|
882
|
-
|
|
883
|
+
const detail = summary.slice(0, 200);
|
|
884
|
+
throw new InterchangeImportError(`This file is not well-formed XML, so no drawing can be read out of it: ${detail}`, {
|
|
885
|
+
messageKey: SVG_SKETCH_ERROR_MALFORMED_XML[0],
|
|
886
|
+
messageParams: { detail },
|
|
887
|
+
});
|
|
883
888
|
}
|
|
884
889
|
if (nameOf(doc.documentElement) !== 'svg') {
|
|
885
|
-
|
|
890
|
+
const tag = doc.documentElement?.localName ?? 'nothing';
|
|
891
|
+
throw new InterchangeImportError(`An SVG opens on <svg>; this one opens on <${tag}>.`, { messageKey: SVG_SKETCH_ERROR_NOT_SVG[0], messageParams: { tag } });
|
|
886
892
|
}
|
|
887
893
|
const clean = DOMPurify.sanitize(source, {
|
|
888
894
|
USE_PROFILES: { svg: true },
|
|
@@ -923,7 +929,9 @@ function parseSvgRoot(source, notes) {
|
|
|
923
929
|
// overload, which answers an `HTMLElement` — the sanitized body wrapper.
|
|
924
930
|
const root = childElements(clean).find(child => nameOf(child) === 'svg');
|
|
925
931
|
if (!root) {
|
|
926
|
-
throw new
|
|
932
|
+
throw new InterchangeImportError(SVG_SKETCH_ERROR_SANITIZED_AWAY[1], {
|
|
933
|
+
messageKey: SVG_SKETCH_ERROR_SANITIZED_AWAY[0],
|
|
934
|
+
});
|
|
927
935
|
}
|
|
928
936
|
return root;
|
|
929
937
|
}
|