@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
|
@@ -41,7 +41,55 @@ import { Subject } from 'rxjs';
|
|
|
41
41
|
import * as Y from 'yjs';
|
|
42
42
|
import { descendantElementsImpl, hasDescendantElementImpl, isLockedByAncestorImpl, isLockedBySelfImpl, isLockedImpl, lockElementImpl, unlockElementImpl, } from '../../../utils/tree.js';
|
|
43
43
|
import { gfxGroupCompatibleSymbol } from '../base.js';
|
|
44
|
-
import { convertProps, field, getDerivedProps, getFieldPropsSet, local, updateDerivedProps, watch, } from './decorators/index.js';
|
|
44
|
+
import { convertProps, field, getDerivedProps, getFieldPropsSet, hasObserveMeta, local, observe, startObserve, updateDerivedProps, watch, } from './decorators/index.js';
|
|
45
|
+
/**
|
|
46
|
+
* Declared `@field()`s that {@link GfxPrimitiveElementModel.clearField} refuses
|
|
47
|
+
* to remove, because they have no meaningful ABSENT state: every one of them is
|
|
48
|
+
* read unconditionally, with no fallback, by code that has no way to cope.
|
|
49
|
+
*
|
|
50
|
+
* - `index` — the fractional z-order key. Gone, the element's stacking is
|
|
51
|
+
* `undefined` and the layer manager sorts it nowhere, silently.
|
|
52
|
+
* - `xywh` — gone, `elementBound` collapses to `{0,0,0,0}` and the renderer
|
|
53
|
+
* throws `"undefined" is not valid JSON` on every frame.
|
|
54
|
+
* - `seed` — the roughness seed; gone, the hand-drawn renderers produce a
|
|
55
|
+
* different shape on every repaint.
|
|
56
|
+
*
|
|
57
|
+
* An optional field is exactly one whose accessor declares a usable default (or
|
|
58
|
+
* `undefined`), and those stay clearable. This list is the short answer to
|
|
59
|
+
* "which declared fields are not optional"; it is a deny-list on purpose, so a
|
|
60
|
+
* new optional field needs no ceremony and a new structural one is a deliberate
|
|
61
|
+
* addition here.
|
|
62
|
+
*/
|
|
63
|
+
const UNCLEARABLE_ELEMENT_FIELDS = new Set(['index', 'seed', 'xywh']);
|
|
64
|
+
/**
|
|
65
|
+
* Republish a nested-`Y.Map` field change as an element-level change.
|
|
66
|
+
*
|
|
67
|
+
* `syncElementFromY` observes the element's OWN `Y.Map` only, so mutating a
|
|
68
|
+
* value INSIDE {@link GfxPrimitiveElementModel.tags} — which is the whole point
|
|
69
|
+
* of storing it as a nested map, since that is what makes two people qualifying
|
|
70
|
+
* one element on two different tags both keep their work — emits nothing. This
|
|
71
|
+
* is the `Y.Map` counterpart of the `watchText` bridge the same file already
|
|
72
|
+
* ships for nested `Y.Text`, and it is what puts a per-tag write on the same
|
|
73
|
+
* footing as every other field: one `elementUpdated`, carrying the transaction's
|
|
74
|
+
* own `local` flag, for the renderer, the rules engine and
|
|
75
|
+
* `PivotMaterialityPublisher` alike.
|
|
76
|
+
*
|
|
77
|
+
* `transaction === null` is the observer ATTACHING, not a change (see
|
|
78
|
+
* `startObserve`); republishing there would fire on every mount and on every
|
|
79
|
+
* re-attach.
|
|
80
|
+
*/
|
|
81
|
+
function observeTags(_, instance, transaction) {
|
|
82
|
+
if (transaction === null)
|
|
83
|
+
return;
|
|
84
|
+
instance['_onChange']({
|
|
85
|
+
props: { tags: instance.tags },
|
|
86
|
+
// Deliberately empty, exactly like `watchText`: Yjs gives the delta of the
|
|
87
|
+
// NESTED map, and inventing a previous value for the whole field would be
|
|
88
|
+
// a guess. Consumers that need the old set read it from their own state.
|
|
89
|
+
oldValues: {},
|
|
90
|
+
local: transaction.local,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
45
93
|
let GfxPrimitiveElementModel = (() => {
|
|
46
94
|
let _display_decorators;
|
|
47
95
|
let _display_initializers = [];
|
|
@@ -61,6 +109,24 @@ let GfxPrimitiveElementModel = (() => {
|
|
|
61
109
|
let _linkedDocId_decorators;
|
|
62
110
|
let _linkedDocId_initializers = [];
|
|
63
111
|
let _linkedDocId_extraInitializers = [];
|
|
112
|
+
let _pivotDocId_decorators;
|
|
113
|
+
let _pivotDocId_initializers = [];
|
|
114
|
+
let _pivotDocId_extraInitializers = [];
|
|
115
|
+
let _role_decorators;
|
|
116
|
+
let _role_initializers = [];
|
|
117
|
+
let _role_extraInitializers = [];
|
|
118
|
+
let _tags_decorators;
|
|
119
|
+
let _tags_initializers = [];
|
|
120
|
+
let _tags_extraInitializers = [];
|
|
121
|
+
let _validationExceptions_decorators;
|
|
122
|
+
let _validationExceptions_initializers = [];
|
|
123
|
+
let _validationExceptions_extraInitializers = [];
|
|
124
|
+
let _validationProfile_decorators;
|
|
125
|
+
let _validationProfile_initializers = [];
|
|
126
|
+
let _validationProfile_extraInitializers = [];
|
|
127
|
+
let _qualityChecklist_decorators;
|
|
128
|
+
let _qualityChecklist_initializers = [];
|
|
129
|
+
let _qualityChecklist_extraInitializers = [];
|
|
64
130
|
let _lockedBySelf_decorators;
|
|
65
131
|
let _lockedBySelf_initializers = [];
|
|
66
132
|
let _lockedBySelf_extraInitializers = [];
|
|
@@ -84,6 +150,12 @@ let GfxPrimitiveElementModel = (() => {
|
|
|
84
150
|
_index_decorators = [field()];
|
|
85
151
|
_externalLink_decorators = [field()];
|
|
86
152
|
_linkedDocId_decorators = [field()];
|
|
153
|
+
_pivotDocId_decorators = [field()];
|
|
154
|
+
_role_decorators = [field()];
|
|
155
|
+
_tags_decorators = [observe(observeTags), field()];
|
|
156
|
+
_validationExceptions_decorators = [field()];
|
|
157
|
+
_validationProfile_decorators = [field()];
|
|
158
|
+
_qualityChecklist_decorators = [field()];
|
|
87
159
|
_lockedBySelf_decorators = [field()];
|
|
88
160
|
_opacity_decorators = [local()];
|
|
89
161
|
_responseExtension_decorators = [local()];
|
|
@@ -94,6 +166,12 @@ let GfxPrimitiveElementModel = (() => {
|
|
|
94
166
|
__esDecorate(this, null, _index_decorators, { kind: "accessor", name: "index", static: false, private: false, access: { has: obj => "index" in obj, get: obj => obj.index, set: (obj, value) => { obj.index = value; } }, metadata: _metadata }, _index_initializers, _index_extraInitializers);
|
|
95
167
|
__esDecorate(this, null, _externalLink_decorators, { kind: "accessor", name: "externalLink", static: false, private: false, access: { has: obj => "externalLink" in obj, get: obj => obj.externalLink, set: (obj, value) => { obj.externalLink = value; } }, metadata: _metadata }, _externalLink_initializers, _externalLink_extraInitializers);
|
|
96
168
|
__esDecorate(this, null, _linkedDocId_decorators, { kind: "accessor", name: "linkedDocId", static: false, private: false, access: { has: obj => "linkedDocId" in obj, get: obj => obj.linkedDocId, set: (obj, value) => { obj.linkedDocId = value; } }, metadata: _metadata }, _linkedDocId_initializers, _linkedDocId_extraInitializers);
|
|
169
|
+
__esDecorate(this, null, _pivotDocId_decorators, { kind: "accessor", name: "pivotDocId", static: false, private: false, access: { has: obj => "pivotDocId" in obj, get: obj => obj.pivotDocId, set: (obj, value) => { obj.pivotDocId = value; } }, metadata: _metadata }, _pivotDocId_initializers, _pivotDocId_extraInitializers);
|
|
170
|
+
__esDecorate(this, null, _role_decorators, { kind: "accessor", name: "role", static: false, private: false, access: { has: obj => "role" in obj, get: obj => obj.role, set: (obj, value) => { obj.role = value; } }, metadata: _metadata }, _role_initializers, _role_extraInitializers);
|
|
171
|
+
__esDecorate(this, null, _tags_decorators, { kind: "accessor", name: "tags", static: false, private: false, access: { has: obj => "tags" in obj, get: obj => obj.tags, set: (obj, value) => { obj.tags = value; } }, metadata: _metadata }, _tags_initializers, _tags_extraInitializers);
|
|
172
|
+
__esDecorate(this, null, _validationExceptions_decorators, { kind: "accessor", name: "validationExceptions", static: false, private: false, access: { has: obj => "validationExceptions" in obj, get: obj => obj.validationExceptions, set: (obj, value) => { obj.validationExceptions = value; } }, metadata: _metadata }, _validationExceptions_initializers, _validationExceptions_extraInitializers);
|
|
173
|
+
__esDecorate(this, null, _validationProfile_decorators, { kind: "accessor", name: "validationProfile", static: false, private: false, access: { has: obj => "validationProfile" in obj, get: obj => obj.validationProfile, set: (obj, value) => { obj.validationProfile = value; } }, metadata: _metadata }, _validationProfile_initializers, _validationProfile_extraInitializers);
|
|
174
|
+
__esDecorate(this, null, _qualityChecklist_decorators, { kind: "accessor", name: "qualityChecklist", static: false, private: false, access: { has: obj => "qualityChecklist" in obj, get: obj => obj.qualityChecklist, set: (obj, value) => { obj.qualityChecklist = value; } }, metadata: _metadata }, _qualityChecklist_initializers, _qualityChecklist_extraInitializers);
|
|
97
175
|
__esDecorate(this, null, _lockedBySelf_decorators, { kind: "accessor", name: "lockedBySelf", static: false, private: false, access: { has: obj => "lockedBySelf" in obj, get: obj => obj.lockedBySelf, set: (obj, value) => { obj.lockedBySelf = value; } }, metadata: _metadata }, _lockedBySelf_initializers, _lockedBySelf_extraInitializers);
|
|
98
176
|
__esDecorate(this, null, _opacity_decorators, { kind: "accessor", name: "opacity", static: false, private: false, access: { has: obj => "opacity" in obj, get: obj => obj.opacity, set: (obj, value) => { obj.opacity = value; } }, metadata: _metadata }, _opacity_initializers, _opacity_extraInitializers);
|
|
99
177
|
__esDecorate(this, null, _responseExtension_decorators, { kind: "accessor", name: "responseExtension", static: false, private: false, access: { has: obj => "responseExtension" in obj, get: obj => obj.responseExtension, set: (obj, value) => { obj.responseExtension = value; } }, metadata: _metadata }, _responseExtension_initializers, _responseExtension_extraInitializers);
|
|
@@ -104,8 +182,10 @@ let GfxPrimitiveElementModel = (() => {
|
|
|
104
182
|
return true;
|
|
105
183
|
}
|
|
106
184
|
get deserializedXYWH() {
|
|
107
|
-
|
|
108
|
-
|
|
185
|
+
// Read `xywh` once: on a group it is a derived getter that may recompute
|
|
186
|
+
// the union of every child bound, so reading it twice doubles the cost.
|
|
187
|
+
const xywh = this.xywh;
|
|
188
|
+
if (!this._lastXYWH || xywh !== this._lastXYWH) {
|
|
109
189
|
this._local.set('deserializedXYWH', deserializeXYWH(xywh));
|
|
110
190
|
this._lastXYWH = xywh;
|
|
111
191
|
}
|
|
@@ -174,7 +254,13 @@ let GfxPrimitiveElementModel = (() => {
|
|
|
174
254
|
this.#index_accessor_storage = (__runInitializers(this, _hidden_extraInitializers), __runInitializers(this, _index_initializers, void 0));
|
|
175
255
|
this.#externalLink_accessor_storage = (__runInitializers(this, _index_extraInitializers), __runInitializers(this, _externalLink_initializers, undefined));
|
|
176
256
|
this.#linkedDocId_accessor_storage = (__runInitializers(this, _externalLink_extraInitializers), __runInitializers(this, _linkedDocId_initializers, undefined));
|
|
177
|
-
this.#
|
|
257
|
+
this.#pivotDocId_accessor_storage = (__runInitializers(this, _linkedDocId_extraInitializers), __runInitializers(this, _pivotDocId_initializers, undefined));
|
|
258
|
+
this.#role_accessor_storage = (__runInitializers(this, _pivotDocId_extraInitializers), __runInitializers(this, _role_initializers, undefined));
|
|
259
|
+
this.#tags_accessor_storage = (__runInitializers(this, _role_extraInitializers), __runInitializers(this, _tags_initializers, undefined));
|
|
260
|
+
this.#validationExceptions_accessor_storage = (__runInitializers(this, _tags_extraInitializers), __runInitializers(this, _validationExceptions_initializers, undefined));
|
|
261
|
+
this.#validationProfile_accessor_storage = (__runInitializers(this, _validationExceptions_extraInitializers), __runInitializers(this, _validationProfile_initializers, undefined));
|
|
262
|
+
this.#qualityChecklist_accessor_storage = (__runInitializers(this, _validationProfile_extraInitializers), __runInitializers(this, _qualityChecklist_initializers, undefined));
|
|
263
|
+
this.#lockedBySelf_accessor_storage = (__runInitializers(this, _qualityChecklist_extraInitializers), __runInitializers(this, _lockedBySelf_initializers, false));
|
|
178
264
|
this.#opacity_accessor_storage = (__runInitializers(this, _lockedBySelf_extraInitializers), __runInitializers(this, _opacity_initializers, 1));
|
|
179
265
|
this.#responseExtension_accessor_storage = (__runInitializers(this, _opacity_extraInitializers), __runInitializers(this, _responseExtension_initializers, [0, 0]));
|
|
180
266
|
this.#seed_accessor_storage = (__runInitializers(this, _responseExtension_extraInitializers), __runInitializers(this, _seed_initializers, void 0));
|
|
@@ -185,6 +271,12 @@ let GfxPrimitiveElementModel = (() => {
|
|
|
185
271
|
this.surface = model;
|
|
186
272
|
this._stashed = stashedStore;
|
|
187
273
|
this._onChange = onChange;
|
|
274
|
+
// DO NOT turn these two into field initializers. `@field()` deliberately
|
|
275
|
+
// does NOT write an `undefined` default into the Y.Map (see
|
|
276
|
+
// `./decorators/field.ts`), and both accessors are declared without an
|
|
277
|
+
// initializer — so these assignments, which go through the SETTER, are the
|
|
278
|
+
// only reason `index` and `seed` reach the document at all. Losing `index`
|
|
279
|
+
// would silently corrupt z-order on every new element.
|
|
188
280
|
this.index = 'a0';
|
|
189
281
|
this.seed = randomSeed();
|
|
190
282
|
}
|
|
@@ -288,6 +380,63 @@ let GfxPrimitiveElementModel = (() => {
|
|
|
288
380
|
unlock() {
|
|
289
381
|
unlockElementImpl(this.surface.store, this);
|
|
290
382
|
}
|
|
383
|
+
/**
|
|
384
|
+
* Remove an OPTIONAL `@field()` from the document entirely.
|
|
385
|
+
*
|
|
386
|
+
* The missing half of `@field()`. Its setter is unconditional — assigning
|
|
387
|
+
* `undefined` still calls `yMap.set(prop, undefined)` — so "clearing" an
|
|
388
|
+
* optional field through the accessor leaves the KEY behind. The getter reads
|
|
389
|
+
* `undefined` and nothing misbehaves, but the element is no longer
|
|
390
|
+
* byte-identical to one that never had the field: the phantom key syncs to
|
|
391
|
+
* every peer and ships in every snapshot. `init` is already careful to write
|
|
392
|
+
* nothing for an `undefined` default; this is how a field gets back to that
|
|
393
|
+
* state once it has been set.
|
|
394
|
+
*
|
|
395
|
+
* Emits a `delete` action rather than an `update`, so a consumer filtering on
|
|
396
|
+
* `props` will see an EMPTY payload and must inspect `oldValues` — the same
|
|
397
|
+
* shape an undo of the original write produces.
|
|
398
|
+
*
|
|
399
|
+
* ## What it refuses, and why that is load-bearing
|
|
400
|
+
*
|
|
401
|
+
* This is a direct write path into the element's Y.Map, on the class that
|
|
402
|
+
* carries the document format, exported by `@labre/std` and therefore
|
|
403
|
+
* callable by a host. `_assignElementProp` learned the same lesson in the
|
|
404
|
+
* unknown-props change (see `docs/spikes/us-1-8-unknown-props-preservation.md`,
|
|
405
|
+
* whose deny-list is explicitly security rather than hygiene); an unguarded
|
|
406
|
+
* delete re-opens the door from the other side. So:
|
|
407
|
+
*
|
|
408
|
+
* - a key the element class does not DECLARE as a `@field()` is refused. It
|
|
409
|
+
* is either an unknown key preserved verbatim for a newer client — deleting
|
|
410
|
+
* it is exactly the data loss that change exists to prevent — or not
|
|
411
|
+
* document data at all;
|
|
412
|
+
* - a STRUCTURAL field is refused even though it is declared
|
|
413
|
+
* ({@link UNCLEARABLE_ELEMENT_FIELDS}).
|
|
414
|
+
*
|
|
415
|
+
* Refusal is a no-op plus a `console.warn`, the same way an unencodable value
|
|
416
|
+
* is dropped rather than thrown: a misuse must not take the board down, and
|
|
417
|
+
* must not silently corrupt it either.
|
|
418
|
+
*/
|
|
419
|
+
clearField(prop) {
|
|
420
|
+
if (UNCLEARABLE_ELEMENT_FIELDS.has(prop)) {
|
|
421
|
+
console.warn(`Refusing to clear the structural element field "${prop}": it has no meaningful absent state.`);
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
if (!getFieldPropsSet(this).has(prop)) {
|
|
425
|
+
console.warn(`Refusing to clear "${prop}": not a declared @field() on this element. Unknown keys are preserved deliberately.`);
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
if (!this.yMap.has(prop))
|
|
429
|
+
return;
|
|
430
|
+
if (this.yMap.doc) {
|
|
431
|
+
this.surface.store.transact(() => {
|
|
432
|
+
this.yMap.delete(prop);
|
|
433
|
+
});
|
|
434
|
+
// The Y.Map observer prunes `_preserved` on the delete action.
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
this.yMap.delete(prop);
|
|
438
|
+
this._preserved.delete(prop);
|
|
439
|
+
}
|
|
291
440
|
#display_accessor_storage;
|
|
292
441
|
get display() { return this.#display_accessor_storage; }
|
|
293
442
|
set display(value) { this.#display_accessor_storage = value; }
|
|
@@ -317,6 +466,203 @@ let GfxPrimitiveElementModel = (() => {
|
|
|
317
466
|
#linkedDocId_accessor_storage;
|
|
318
467
|
get linkedDocId() { return this.#linkedDocId_accessor_storage; }
|
|
319
468
|
set linkedDocId(value) { this.#linkedDocId_accessor_storage = value; }
|
|
469
|
+
#pivotDocId_accessor_storage;
|
|
470
|
+
/**
|
|
471
|
+
* Identity binding to a host-owned **pivot record**: this element is an
|
|
472
|
+
* *occurrence* of the document `pivotDocId`. Many elements, across many
|
|
473
|
+
* boards, may carry the same `pivotDocId` — that is the point. A Wardley
|
|
474
|
+
* `component` drawn on three maps is the same component (MF1, ADR 0005).
|
|
475
|
+
*
|
|
476
|
+
* Opaque to the library: the framework never dereferences it, never fetches
|
|
477
|
+
* it, never renders it. Reading it is the host's job, through
|
|
478
|
+
* `PivotPropertiesProvider` (`@labre/affine-shared/services`, ADR 0006).
|
|
479
|
+
* No renderer, no hit-test, no layout and no exporter may read it; it
|
|
480
|
+
* participates in no `@derive`, `@convert` or `@watch` chain, so it cannot
|
|
481
|
+
* move, resize or restyle anything.
|
|
482
|
+
*
|
|
483
|
+
* Orthogonal to {@link linkedDocId} / {@link externalLink}, which are a
|
|
484
|
+
* *hyperlink* (navigation), not an identity. They differ on every axis that
|
|
485
|
+
* matters — cardinality (a hyperlink is one target per element and is
|
|
486
|
+
* exclusive with `externalLink`; a binding is many-elements-to-one-record),
|
|
487
|
+
* lifecycle (a hyperlink is picked from a search modal, a binding is created
|
|
488
|
+
* by promotion) and consumers (an arrow that navigates vs. a hover card and
|
|
489
|
+
* a rules engine). An element may legitimately carry both, and code reading
|
|
490
|
+
* one as a stand-in for the other is a bug.
|
|
491
|
+
*
|
|
492
|
+
* Declared on the BASE class for the same reason as {@link role}: an element
|
|
493
|
+
* re-created from props (paste, duplicate, alt-drag clone, template
|
|
494
|
+
* insertion) only reaches the Y.Map through keys that have a declared
|
|
495
|
+
* accessor, so a binding declared per subclass would be silently dropped on
|
|
496
|
+
* copy — and the loss would be invisible until the next reload.
|
|
497
|
+
*
|
|
498
|
+
* `undefined` = unbound, and no key is written for it, so an element that
|
|
499
|
+
* never binds stays byte-identical to one created before the field existed:
|
|
500
|
+
* optional field, no schema version bump, no migration. Clearing it goes
|
|
501
|
+
* through {@link clearField}, which removes the key rather than leaving a
|
|
502
|
+
* tombstone.
|
|
503
|
+
*
|
|
504
|
+
* A binding to a record that does not (yet) exist — or was deleted, or is
|
|
505
|
+
* invisible to this user — is a legal, persisted state: the library never
|
|
506
|
+
* validates it and never deletes host data. It resolves to `missing` at read
|
|
507
|
+
* time (ADR 0006).
|
|
508
|
+
*/
|
|
509
|
+
get pivotDocId() { return this.#pivotDocId_accessor_storage; }
|
|
510
|
+
set pivotDocId(value) { this.#pivotDocId_accessor_storage = value; }
|
|
511
|
+
#role_accessor_storage;
|
|
512
|
+
/**
|
|
513
|
+
* Semantic role of the element, `<framework>:<role>` (see `./role.ts`).
|
|
514
|
+
* `undefined` = neutral: generalist elements carry no role, and no key is
|
|
515
|
+
* written for them at creation.
|
|
516
|
+
*
|
|
517
|
+
* Declared on the BASE class on purpose, even though only framework modules
|
|
518
|
+
* set it: an element re-created from props (paste, duplicate, template
|
|
519
|
+
* insertion) only reaches the Y.Map through keys that have a declared
|
|
520
|
+
* accessor, so a role declared per subclass would be silently dropped on
|
|
521
|
+
* copy. Flat string on purpose — element serialization is one level deep.
|
|
522
|
+
*/
|
|
523
|
+
get role() { return this.#role_accessor_storage; }
|
|
524
|
+
set role(value) { this.#role_accessor_storage = value; }
|
|
525
|
+
#tags_accessor_storage;
|
|
526
|
+
/**
|
|
527
|
+
* Level 3 — **contextual qualification** (ADR 0007 § 4). Tag def id → the
|
|
528
|
+
* value ids selected for it, e.g. `{ 'wardley:nature': ['wardley:nature/data'] }`.
|
|
529
|
+
*
|
|
530
|
+
* Both halves of a key are namespaced by framework on purpose: two universes
|
|
531
|
+
* WILL collide on a word like `activity` — `edgy:activity` is already an EDGY
|
|
532
|
+
* base element while `activity` is one of Wardley's four natures — and
|
|
533
|
+
* namespacing is what makes that collision harmless rather than decorative.
|
|
534
|
+
*
|
|
535
|
+
* Absent and empty are equivalent (both mean "unqualified"), and the default
|
|
536
|
+
* is `undefined`, **never** `new Y.Map()`: `@field()`'s `init` writes nothing
|
|
537
|
+
* for an `undefined` default, so an element that is never qualified — every
|
|
538
|
+
* brush stroke, every connector — stays byte-identical to one created before
|
|
539
|
+
* the field existed. A non-`undefined` default on this base class would
|
|
540
|
+
* reinstate that cost on every element of every document. The qualification
|
|
541
|
+
* writer (`setElementTag`, `./tags.js`) creates the map on first use and
|
|
542
|
+
* removes the key again when the last tag goes.
|
|
543
|
+
*
|
|
544
|
+
* ## Why a NESTED `Y.Map` and not a plain object
|
|
545
|
+
*
|
|
546
|
+
* `@field()` writes straight into the element's `Y.Map` with no `native2Y` in
|
|
547
|
+
* the path, so a plain object here really would be ONE opaque value: two
|
|
548
|
+
* people qualifying the same element on two DIFFERENT tags would silently
|
|
549
|
+
* lose one of the two. A nested map merges per tag, which is what the shape
|
|
550
|
+
* has to do — there is no migration runner for surface elements, so it is
|
|
551
|
+
* chosen once. The `string[]` of a SINGLE tag stays last-write-wins, and that
|
|
552
|
+
* is correct: one tag's value set is one atomic choice.
|
|
553
|
+
*
|
|
554
|
+
* Exactly one level of Y-awareness, with plain arrays as values — shallower
|
|
555
|
+
* than `MindmapElementModel.children` (`Y.Map<NodeDetail>`), which already
|
|
556
|
+
* ships, and inside what `surface-transformer`'s `SURFACE_YMAP_UNIQ_IDENTIFIER`
|
|
557
|
+
* envelope round-trips generically.
|
|
558
|
+
*
|
|
559
|
+
* Declared on the BASE class for the same reason as {@link role} and
|
|
560
|
+
* {@link pivotDocId}: an element re-created from props (paste, duplicate,
|
|
561
|
+
* alt-drag clone, template insertion) only reaches the `Y.Map` through keys
|
|
562
|
+
* that have a declared accessor, and a qualification the user authored is
|
|
563
|
+
* exactly the kind of thing that must survive a copy. `SurfaceBlockModel`'s
|
|
564
|
+
* `_propsToY` rebuilds the map from the plain JSON `serialize()` produces, so
|
|
565
|
+
* a copy is a copy of the values and never a second reference to one map.
|
|
566
|
+
*
|
|
567
|
+
* Opaque to the framework: no renderer, no hit-test, no layout and no
|
|
568
|
+
* exporter reads it, and it participates in no `@derive` / `@convert` chain.
|
|
569
|
+
* Values whose def has vanished still load and are displayed as raw ids —
|
|
570
|
+
* defs are runtime configuration and are NEVER persisted.
|
|
571
|
+
*/
|
|
572
|
+
get tags() { return this.#tags_accessor_storage; }
|
|
573
|
+
set tags(value) { this.#tags_accessor_storage = value; }
|
|
574
|
+
#validationExceptions_accessor_storage;
|
|
575
|
+
/**
|
|
576
|
+
* Validation rules this element is excused from (PF8, "no rule is a wall").
|
|
577
|
+
*
|
|
578
|
+
* Declared on the BASE class for the same reason as {@link role}: an element
|
|
579
|
+
* re-created from props (paste, duplicate, template insertion) only reaches
|
|
580
|
+
* the Y.Map through keys that have a declared accessor, so an exception
|
|
581
|
+
* declared per subclass would be silently dropped on copy — and an arbitration
|
|
582
|
+
* the user made explicitly is exactly the kind of thing that must survive a
|
|
583
|
+
* copy.
|
|
584
|
+
*
|
|
585
|
+
* `undefined` = no exception, and no key is written for it, so an element that
|
|
586
|
+
* never got one stays byte-identical to one created before the field existed:
|
|
587
|
+
* optional field, no schema version bump, no migration.
|
|
588
|
+
*
|
|
589
|
+
* Flat JSON on purpose — element serialization is one level deep, and a value
|
|
590
|
+
* a Yjs update can encode is the contract enforced by `_assignElementProp`.
|
|
591
|
+
* The engine that reads it lives in `@labre/affine-block-surface`; the base
|
|
592
|
+
* model only carries the data, and knows nothing about rules.
|
|
593
|
+
*/
|
|
594
|
+
get validationExceptions() { return this.#validationExceptions_accessor_storage; }
|
|
595
|
+
set validationExceptions(value) { this.#validationExceptions_accessor_storage = value; }
|
|
596
|
+
#validationProfile_accessor_storage;
|
|
597
|
+
/**
|
|
598
|
+
* Id of the validation PROFILE this element's framework is checked against
|
|
599
|
+
* (PF9) — a set of enabled rules and their severities, declared as data by
|
|
600
|
+
* the framework.
|
|
601
|
+
*
|
|
602
|
+
* Carried by the framework's BACKGROUND element, i.e. the root instance, and
|
|
603
|
+
* not by the document: two maps on one canvas are two independent pieces of
|
|
604
|
+
* work, and a sketch has to be able to sit next to a deliverable without
|
|
605
|
+
* either of them dictating the other's requirements (PF9.1). The engine reads
|
|
606
|
+
* it off the background a finding was measured against, which it already
|
|
607
|
+
* names (`Violation.backgroundId`).
|
|
608
|
+
*
|
|
609
|
+
* Declared on the BASE class for the same reason as {@link role} and
|
|
610
|
+
* {@link validationExceptions}: an element re-created from props (paste,
|
|
611
|
+
* duplicate, template insertion) only reaches the Y.Map through keys that
|
|
612
|
+
* have a declared accessor, so a profile declared per subclass would be
|
|
613
|
+
* silently dropped on copy — and duplicating a strict map must give a strict
|
|
614
|
+
* map.
|
|
615
|
+
*
|
|
616
|
+
* `undefined` = "no explicit choice", which resolves to the framework's
|
|
617
|
+
* DEFAULT profile — the most permissive reasonable one, because the sketch
|
|
618
|
+
* wins. No key is written for it, so a document authored before this field
|
|
619
|
+
* existed stays byte-identical: optional field, no schema version bump, no
|
|
620
|
+
* migration. Choosing the default back again removes the key rather than
|
|
621
|
+
* writing it.
|
|
622
|
+
*
|
|
623
|
+
* Flat string on purpose — element serialization is one level deep. The
|
|
624
|
+
* engine that interprets it lives in `@labre/affine-block-surface`; the base
|
|
625
|
+
* model only carries the id, and knows nothing about profiles.
|
|
626
|
+
*/
|
|
627
|
+
get validationProfile() { return this.#validationProfile_accessor_storage; }
|
|
628
|
+
set validationProfile(value) { this.#validationProfile_accessor_storage = value; }
|
|
629
|
+
#qualityChecklist_accessor_storage;
|
|
630
|
+
/**
|
|
631
|
+
* The map-quality NUDGES the user has ticked off on this instance (PF7.10) —
|
|
632
|
+
* ids of declarative reminders their framework ships, never rules the engine
|
|
633
|
+
* evaluates.
|
|
634
|
+
*
|
|
635
|
+
* A nudge is an expectation the tool cannot judge ("the map has a title that
|
|
636
|
+
* frames the study"): the content can exist without being good, so nothing
|
|
637
|
+
* here is ever computed. Ticking one is the same gesture as granting an
|
|
638
|
+
* exception — the user says "I have taken care of this" and the tool records
|
|
639
|
+
* it rather than pretending to check it.
|
|
640
|
+
*
|
|
641
|
+
* Carried by the framework's BACKGROUND element, i.e. the root instance, for
|
|
642
|
+
* the same reason {@link validationProfile} is: two maps on one canvas are two
|
|
643
|
+
* independent pieces of work, and a checklist ticked on one says nothing about
|
|
644
|
+
* the other.
|
|
645
|
+
*
|
|
646
|
+
* Declared on the BASE class for the same reason as {@link role} and
|
|
647
|
+
* {@link validationExceptions}: an element re-created from props (paste,
|
|
648
|
+
* duplicate, template insertion) only reaches the Y.Map through keys that have
|
|
649
|
+
* a declared accessor, so a checklist declared per subclass would be silently
|
|
650
|
+
* dropped on copy.
|
|
651
|
+
*
|
|
652
|
+
* `undefined` = nothing ticked, and no key is written for it, so a document
|
|
653
|
+
* authored before this field existed stays byte-identical: optional field, no
|
|
654
|
+
* schema version bump, no migration. Unticking the last one goes through
|
|
655
|
+
* {@link clearField}, which removes the key rather than leaving a tombstone.
|
|
656
|
+
*
|
|
657
|
+
* Flat JSON — an array of strings — on purpose: element serialization is one
|
|
658
|
+
* level deep, and a value a Yjs update can encode is the contract enforced by
|
|
659
|
+
* `_assignElementProp`. The library that interprets the ids lives in
|
|
660
|
+
* `@labre/affine-block-surface`; the base model only carries them, and knows
|
|
661
|
+
* nothing about nudges. Ids of nudges no framework declares any more are kept,
|
|
662
|
+
* not pruned: the tooling comes and goes with a flag, the decision does not.
|
|
663
|
+
*/
|
|
664
|
+
get qualityChecklist() { return this.#qualityChecklist_accessor_storage; }
|
|
665
|
+
set qualityChecklist(value) { this.#qualityChecklist_accessor_storage = value; }
|
|
320
666
|
#lockedBySelf_accessor_storage;
|
|
321
667
|
get lockedBySelf() { return this.#lockedBySelf_accessor_storage; }
|
|
322
668
|
set lockedBySelf(value) { this.#lockedBySelf_accessor_storage = value; }
|
|
@@ -337,6 +683,17 @@ export class GfxGroupLikeElementModel extends GfxPrimitiveElementModel {
|
|
|
337
683
|
super(...arguments);
|
|
338
684
|
this._childIds = [];
|
|
339
685
|
this._mutex = createMutex();
|
|
686
|
+
/**
|
|
687
|
+
* Whether the cached `xywh` must be recomputed from the children.
|
|
688
|
+
*
|
|
689
|
+
* The bound of a group is the union of its children bounds, which used to be
|
|
690
|
+
* recomputed on **every** read of `xywh` — and `xywh` is read many times per
|
|
691
|
+
* frame (renderer, hit test, toolbar anchor, selection rect…). It is now
|
|
692
|
+
* computed once per mutation: the surface marks the group dirty (or
|
|
693
|
+
* refreshes it eagerly) whenever a child changes, see
|
|
694
|
+
* {@link invalidateXYWH} / {@link refreshXYWH}.
|
|
695
|
+
*/
|
|
696
|
+
this._xywhDirty = true;
|
|
340
697
|
this[_a] = true;
|
|
341
698
|
}
|
|
342
699
|
static { _a = gfxGroupCompatibleSymbol; }
|
|
@@ -361,26 +718,47 @@ export class GfxGroupLikeElementModel extends GfxPrimitiveElementModel {
|
|
|
361
718
|
}
|
|
362
719
|
get xywh() {
|
|
363
720
|
this._mutex(() => {
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
if (curXYWH !== newXYWH || !this._local.has('xywh')) {
|
|
367
|
-
this._local.set('xywh', newXYWH);
|
|
368
|
-
if (curXYWH !== newXYWH) {
|
|
369
|
-
this._onChange({
|
|
370
|
-
props: {
|
|
371
|
-
xywh: newXYWH,
|
|
372
|
-
},
|
|
373
|
-
oldValues: {
|
|
374
|
-
xywh: curXYWH,
|
|
375
|
-
},
|
|
376
|
-
local: true,
|
|
377
|
-
});
|
|
378
|
-
}
|
|
721
|
+
if (this._xywhDirty || !this._local.has('xywh')) {
|
|
722
|
+
this._recomputeXYWH(true);
|
|
379
723
|
}
|
|
380
724
|
});
|
|
381
725
|
return this._local.get('xywh') ?? '[0,0,0,0]';
|
|
382
726
|
}
|
|
383
727
|
set xywh(_) { }
|
|
728
|
+
/**
|
|
729
|
+
* Recompute the cached bound and notify the listeners when it moved.
|
|
730
|
+
*
|
|
731
|
+
* Always run it through {@link _mutex}: the notification re-enters the
|
|
732
|
+
* `xywh` getter (a parent group unites this bound again), and the mutex is
|
|
733
|
+
* what keeps that read from recomputing this very group a second time.
|
|
734
|
+
*/
|
|
735
|
+
_recomputeXYWH(local) {
|
|
736
|
+
const oldXYWH = this._local.get('xywh') ?? '[0,0,0,0]';
|
|
737
|
+
const hadXYWH = this._local.has('xywh');
|
|
738
|
+
const nextXYWH = this._getXYWH().serialize();
|
|
739
|
+
this._xywhDirty = false;
|
|
740
|
+
if (hadXYWH && oldXYWH === nextXYWH) {
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
743
|
+
// Set before notifying: the listeners read `xywh` back, and the mutex
|
|
744
|
+
// makes that read return the cached value instead of recomputing.
|
|
745
|
+
this._local.set('xywh', nextXYWH);
|
|
746
|
+
if (oldXYWH !== nextXYWH) {
|
|
747
|
+
this._onChange({
|
|
748
|
+
props: {
|
|
749
|
+
xywh: nextXYWH,
|
|
750
|
+
},
|
|
751
|
+
oldValues: {
|
|
752
|
+
xywh: oldXYWH,
|
|
753
|
+
},
|
|
754
|
+
local,
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* Pure: it only reads the children. The cache is written by
|
|
760
|
+
* {@link _recomputeXYWH}, which is the single place allowed to store it.
|
|
761
|
+
*/
|
|
384
762
|
_getXYWH() {
|
|
385
763
|
let bound;
|
|
386
764
|
this.childElements.forEach(child => {
|
|
@@ -389,14 +767,29 @@ export class GfxGroupLikeElementModel extends GfxPrimitiveElementModel {
|
|
|
389
767
|
}
|
|
390
768
|
bound = bound ? bound.unite(child.elementBound) : child.elementBound;
|
|
391
769
|
});
|
|
392
|
-
if (bound) {
|
|
393
|
-
this._local.set('xywh', bound.serialize());
|
|
394
|
-
}
|
|
395
|
-
else {
|
|
396
|
-
this._local.delete('xywh');
|
|
397
|
-
}
|
|
398
770
|
return bound ?? new Bound(0, 0, 0, 0);
|
|
399
771
|
}
|
|
772
|
+
/**
|
|
773
|
+
* Mark the cached bound as stale without recomputing it. The next read of
|
|
774
|
+
* `xywh` pays for the recomputation, and notifies the listeners if the
|
|
775
|
+
* bound actually moved.
|
|
776
|
+
*
|
|
777
|
+
* Use it for the changes that only *may* move the bound (a custom prop a
|
|
778
|
+
* subclass folds into its own `elementBound`); use {@link refreshXYWH} for
|
|
779
|
+
* the changes that are known to move it.
|
|
780
|
+
*/
|
|
781
|
+
invalidateXYWH() {
|
|
782
|
+
this._xywhDirty = true;
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* Recompute the cached bound right away, and notify the listeners when it
|
|
786
|
+
* moved. `local` is the origin of the mutation that moved it.
|
|
787
|
+
*/
|
|
788
|
+
refreshXYWH(local) {
|
|
789
|
+
this._mutex(() => {
|
|
790
|
+
this._recomputeXYWH(local);
|
|
791
|
+
});
|
|
792
|
+
}
|
|
400
793
|
/**
|
|
401
794
|
* The actual field that stores the children of the group.
|
|
402
795
|
* It should be a ymap decorated with `@field`.
|
|
@@ -418,6 +811,7 @@ export class GfxGroupLikeElementModel extends GfxPrimitiveElementModel {
|
|
|
418
811
|
setChildIds(value, fromLocal) {
|
|
419
812
|
const oldChildIds = this.childIds;
|
|
420
813
|
this._childIds = value;
|
|
814
|
+
this.invalidateXYWH();
|
|
421
815
|
this._onChange({
|
|
422
816
|
props: {
|
|
423
817
|
childIds: value,
|
|
@@ -446,12 +840,29 @@ export function syncElementFromY(model, callback) {
|
|
|
446
840
|
disposables[key]?.();
|
|
447
841
|
disposables[key] = watchText(key, value, callback);
|
|
448
842
|
}
|
|
843
|
+
// A nested Y type declared with `@observe` gets a FRESH instance every
|
|
844
|
+
// time the key itself is rewritten — by a remote peer, or by undo/redo,
|
|
845
|
+
// neither of which goes through the accessor's setter (the only other
|
|
846
|
+
// caller of `startObserve`). Without this the observer is left on a
|
|
847
|
+
// detached type and every later in-place mutation goes unseen: set a
|
|
848
|
+
// tag, undo, redo, set another one, and the second write is invisible
|
|
849
|
+
// to the publisher. Guarded on identity so re-setting the same instance
|
|
850
|
+
// does not needlessly re-run the observer's initialising call.
|
|
851
|
+
if (model['_preserved'].get(key) !== value &&
|
|
852
|
+
hasObserveMeta(key, model)) {
|
|
853
|
+
startObserve(key, model);
|
|
854
|
+
}
|
|
449
855
|
model['_preserved'].set(key, value);
|
|
450
856
|
props[key] = value;
|
|
451
857
|
oldValues[key] = oldValue;
|
|
452
858
|
}
|
|
453
859
|
else {
|
|
860
|
+
// `_preserved` is pruned FIRST: `startObserve` re-reads the accessor,
|
|
861
|
+
// which falls back to `_preserved`, so the other order would re-attach
|
|
862
|
+
// the observer to the very map that has just been deleted.
|
|
454
863
|
model['_preserved'].delete(key);
|
|
864
|
+
if (hasObserveMeta(key, model))
|
|
865
|
+
startObserve(key, model);
|
|
455
866
|
oldValues[key] = oldValue;
|
|
456
867
|
}
|
|
457
868
|
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backlinks over `pivotDocId` — **computed, never persisted** (MF1, ADR 0005 § 5).
|
|
3
|
+
*
|
|
4
|
+
* The library ships one pure, synchronous collector and nothing else: no index,
|
|
5
|
+
* no reverse map, no cache, and nothing written back into the document. That is
|
|
6
|
+
* not an optimisation left for later, it is the invariant: "which boards
|
|
7
|
+
* mention this component" is a recomputation, always, so it can never drift
|
|
8
|
+
* from the document and can never be corrupted by a bad write — because there
|
|
9
|
+
* is no write.
|
|
10
|
+
*
|
|
11
|
+
* Cross-document aggregation ("every board where this component appears") is
|
|
12
|
+
* the host's job, built from per-document calls to
|
|
13
|
+
* {@link collectPivotOccurrences}. The repository has no backlink
|
|
14
|
+
* infrastructure and this module deliberately does not introduce one.
|
|
15
|
+
*/
|
|
16
|
+
import type { GfxPrimitiveElementModel } from './element-model.js';
|
|
17
|
+
import type { SurfaceBlockModel } from './surface-model.js';
|
|
18
|
+
/** One element that is an occurrence of one pivot record. */
|
|
19
|
+
export type PivotOccurrence = {
|
|
20
|
+
/** The bound pivot record. */
|
|
21
|
+
pivotDocId: string;
|
|
22
|
+
/** The surface element that is an occurrence of it. */
|
|
23
|
+
elementId: string;
|
|
24
|
+
/** Element type, e.g. `'shape'`, `'wardleyNode'`, `'edgyNode'`. */
|
|
25
|
+
elementType: string;
|
|
26
|
+
};
|
|
27
|
+
/** A surface element whose binding is known to be present. */
|
|
28
|
+
export type PivotBoundElement = GfxPrimitiveElementModel & {
|
|
29
|
+
pivotDocId: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Whether the element carries a binding. Narrowing type guard, so a caller that
|
|
33
|
+
* has checked does not have to re-assert the string.
|
|
34
|
+
*
|
|
35
|
+
* An empty string is NOT a binding: `@field()` writes whatever it is given, and
|
|
36
|
+
* a host that passes `''` means "none". Treating it as a record id would send
|
|
37
|
+
* the provider looking for a document that cannot exist.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isPivotBound(el: GfxPrimitiveElementModel): el is PivotBoundElement;
|
|
40
|
+
/**
|
|
41
|
+
* Every occurrence on one surface, in element order. O(n) over the surface's
|
|
42
|
+
* elements; allocates nothing persistent.
|
|
43
|
+
*
|
|
44
|
+
* @param pivotDocId Restrict to one record. Omitted, every bound element is
|
|
45
|
+
* returned — which is what a host rebuilding its derived state wants
|
|
46
|
+
* (ADR 0006 § 4.2: the element is always the source of truth).
|
|
47
|
+
*/
|
|
48
|
+
export declare function collectPivotOccurrences(surface: SurfaceBlockModel, pivotDocId?: string): PivotOccurrence[];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the element carries a binding. Narrowing type guard, so a caller that
|
|
3
|
+
* has checked does not have to re-assert the string.
|
|
4
|
+
*
|
|
5
|
+
* An empty string is NOT a binding: `@field()` writes whatever it is given, and
|
|
6
|
+
* a host that passes `''` means "none". Treating it as a record id would send
|
|
7
|
+
* the provider looking for a document that cannot exist.
|
|
8
|
+
*/
|
|
9
|
+
export function isPivotBound(el) {
|
|
10
|
+
return typeof el.pivotDocId === 'string' && el.pivotDocId.length > 0;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Every occurrence on one surface, in element order. O(n) over the surface's
|
|
14
|
+
* elements; allocates nothing persistent.
|
|
15
|
+
*
|
|
16
|
+
* @param pivotDocId Restrict to one record. Omitted, every bound element is
|
|
17
|
+
* returned — which is what a host rebuilding its derived state wants
|
|
18
|
+
* (ADR 0006 § 4.2: the element is always the source of truth).
|
|
19
|
+
*/
|
|
20
|
+
export function collectPivotOccurrences(surface, pivotDocId) {
|
|
21
|
+
const occurrences = [];
|
|
22
|
+
for (const element of surface.elementModels) {
|
|
23
|
+
if (!isPivotBound(element))
|
|
24
|
+
continue;
|
|
25
|
+
if (pivotDocId !== undefined && element.pivotDocId !== pivotDocId)
|
|
26
|
+
continue;
|
|
27
|
+
occurrences.push({
|
|
28
|
+
pivotDocId: element.pivotDocId,
|
|
29
|
+
elementId: element.id,
|
|
30
|
+
elementType: element.type,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return occurrences;
|
|
34
|
+
}
|