@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
|
@@ -6,8 +6,9 @@ import { Subject } from 'rxjs';
|
|
|
6
6
|
import * as Y from 'yjs';
|
|
7
7
|
import { isGfxGroupCompatibleModel, } from '../base.js';
|
|
8
8
|
import { createDecoratorState } from './decorators/common.js';
|
|
9
|
-
import { initializeObservers, initializeWatchers } from './decorators/index.js';
|
|
9
|
+
import { getFieldPropsSet, getLocalPropsSet, initializeObservers, initializeWatchers, } from './decorators/index.js';
|
|
10
10
|
import { GfxGroupLikeElementModel, syncElementFromY, } from './element-model.js';
|
|
11
|
+
import { tagsPropToY } from './tags.js';
|
|
11
12
|
/**
|
|
12
13
|
* Used for text field
|
|
13
14
|
*/
|
|
@@ -16,7 +17,177 @@ export const SURFACE_TEXT_UNIQ_IDENTIFIER = 'affine:surface:text';
|
|
|
16
17
|
* Used for field that use Y.Map. E.g. group children field
|
|
17
18
|
*/
|
|
18
19
|
export const SURFACE_YMAP_UNIQ_IDENTIFIER = 'affine:surface:ymap';
|
|
20
|
+
/**
|
|
21
|
+
* Prop keys that are never copied onto an element, whatever the caller sends.
|
|
22
|
+
*
|
|
23
|
+
* - `id` / `type` are the element's identity. They are written explicitly when
|
|
24
|
+
* the element is created and must not be rewritten through a bulk props
|
|
25
|
+
* assignment (a caller doing `updateElement(id, otherElement.serialize())`
|
|
26
|
+
* would otherwise stamp a stale identity into the document).
|
|
27
|
+
* - `__proto__` / `constructor` / `prototype` are the prototype-pollution
|
|
28
|
+
* vector: assigning them mutates the class or `Object.prototype` instead of
|
|
29
|
+
* the document. They are dropped rather than forwarded to the Y.Map.
|
|
30
|
+
*
|
|
31
|
+
* **This list is load-bearing for security, not just hygiene — do not assume
|
|
32
|
+
* the routing makes it redundant.** `Object.prototype.__proto__` is an
|
|
33
|
+
* accessor **with a setter**, so it is present on the prototype chain of every
|
|
34
|
+
* element type and {@link isDeclaredElementProp} would route it to the
|
|
35
|
+
* instance assignment, i.e. mutate the element's prototype. The only thing
|
|
36
|
+
* stopping that is this deny-list, which is evaluated first.
|
|
37
|
+
*
|
|
38
|
+
* Everything else is either a declared accessor or an unknown key, and both
|
|
39
|
+
* are handled by {@link SurfaceBlockModel._assignElementProp}.
|
|
40
|
+
*/
|
|
41
|
+
const UNSAFE_ELEMENT_PROP_KEYS = new Set([
|
|
42
|
+
'id',
|
|
43
|
+
'type',
|
|
44
|
+
'__proto__',
|
|
45
|
+
'constructor',
|
|
46
|
+
'prototype',
|
|
47
|
+
]);
|
|
48
|
+
/**
|
|
49
|
+
* Whether the element class DECLARED this prop, i.e. whether the assignment
|
|
50
|
+
* `element[key] = value` is something the class asked for.
|
|
51
|
+
*
|
|
52
|
+
* Three sources, and no more:
|
|
53
|
+
*
|
|
54
|
+
* - the `@field()` set and the `@local()` set the decorators maintain per
|
|
55
|
+
* prototype — the authoritative table for every decorated accessor;
|
|
56
|
+
* - a plain accessor **that has a setter**, found by walking the prototype
|
|
57
|
+
* chain. The only such prop today is `xywh` on `GfxGroupLikeElementModel`,
|
|
58
|
+
* whose value is derived from the children and whose setter is a deliberate
|
|
59
|
+
* no-op; since `serialize()` always emits `xywh`, treating it as unknown
|
|
60
|
+
* would persist a stale derived value into every duplicated group.
|
|
61
|
+
*
|
|
62
|
+
* Explicitly NOT `key in element`, which also matches methods (`serialize`,
|
|
63
|
+
* `isLocked`, …), getter-only derived props (`x`, `y`, `w`, `h`, `group`,
|
|
64
|
+
* `elementBound`, …) and internal instance fields (`_local`, `_preserved`).
|
|
65
|
+
* Assigning to any of those corrupts the model instead of describing it. The
|
|
66
|
+
* descriptor walk stops at the first prototype that owns the key, so a method
|
|
67
|
+
* (data descriptor, no setter) and a getter-only accessor both answer `false`.
|
|
68
|
+
*/
|
|
69
|
+
function isDeclaredElementProp(element, key) {
|
|
70
|
+
if (getFieldPropsSet(element).has(key) || getLocalPropsSet(element).has(key)) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
for (let proto = Object.getPrototypeOf(element); proto !== null; proto = Object.getPrototypeOf(proto)) {
|
|
74
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, key);
|
|
75
|
+
if (descriptor) {
|
|
76
|
+
return typeof descriptor.set === 'function';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Depth limit for the encodability check below. Element props are flat by
|
|
83
|
+
* contract; this only exists so a pathologically deep payload cannot turn the
|
|
84
|
+
* check itself into the stack overflow it is meant to prevent.
|
|
85
|
+
*/
|
|
86
|
+
const MAX_UNKNOWN_PROP_DEPTH = 32;
|
|
87
|
+
/**
|
|
88
|
+
* Whether a value can be stored in an element's Y.Map without breaking the
|
|
89
|
+
* document.
|
|
90
|
+
*
|
|
91
|
+
* `Y.Map.set` accepts a value it cannot later encode: a cyclic plain object is
|
|
92
|
+
* stored happily, `serialize()` and `encodeStateVector` keep working, and only
|
|
93
|
+
* `encodeStateAsUpdate` — i.e. persistence and sync — blows the stack. Nothing
|
|
94
|
+
* in the app notices, and no user action can remove the key. So an unknown
|
|
95
|
+
* prop is admitted only if it is provably encodable: a Yjs type (which
|
|
96
|
+
* `_propsToY` may have built from a `Y.Text` / `Y.Map` wrapper payload), a
|
|
97
|
+
* binary blob, a primitive, or a plain object / array of those, acyclic and
|
|
98
|
+
* within the depth limit.
|
|
99
|
+
*
|
|
100
|
+
* Anything else (function, symbol, bigint, class instance, cycle) is rejected,
|
|
101
|
+
* and the key is dropped exactly as it was before unknown props were
|
|
102
|
+
* forwarded at all.
|
|
103
|
+
*/
|
|
104
|
+
function isEncodableElementValue(value, depth = 0, seen = new Set()) {
|
|
105
|
+
if (value === null || value === undefined) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
// Already a Yjs type: `_propsToY` builds these for the wrapper payloads, and
|
|
109
|
+
// Yjs owns their encoding.
|
|
110
|
+
if (value instanceof Y.AbstractType) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
if (value instanceof Uint8Array) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
const type = typeof value;
|
|
117
|
+
if (type === 'string' || type === 'number' || type === 'boolean') {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
if (type !== 'object') {
|
|
121
|
+
// function, symbol, bigint
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
if (depth >= MAX_UNKNOWN_PROP_DEPTH) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
// Cycle detection is per path, so a value shared by two sibling branches
|
|
128
|
+
// (a DAG) is still accepted.
|
|
129
|
+
if (seen.has(value)) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
seen.add(value);
|
|
133
|
+
try {
|
|
134
|
+
if (Array.isArray(value)) {
|
|
135
|
+
return value.every(item => isEncodableElementValue(item, depth + 1, seen));
|
|
136
|
+
}
|
|
137
|
+
// Only plain objects. A class instance would be silently flattened by the
|
|
138
|
+
// Yjs encoder, which is never what the caller meant.
|
|
139
|
+
//
|
|
140
|
+
// `Object.create(null)` is rejected too, and for a sharper reason: Yjs
|
|
141
|
+
// dispatches on `value.constructor`, which is `undefined` on a
|
|
142
|
+
// null-prototype object, so `Y.Map.set` throws `Unexpected content type`
|
|
143
|
+
// — from inside `store.transact`, which swallows it and takes every
|
|
144
|
+
// remaining prop of the same payload with it.
|
|
145
|
+
const proto = Object.getPrototypeOf(value);
|
|
146
|
+
if (proto !== Object.prototype) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
return Object.values(value).every(item => isEncodableElementValue(item, depth + 1, seen));
|
|
150
|
+
}
|
|
151
|
+
finally {
|
|
152
|
+
seen.delete(value);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* {@link isEncodableElementValue}, but it never throws.
|
|
157
|
+
*
|
|
158
|
+
* The guard is the layer that protects the assignment loop, so it must not be
|
|
159
|
+
* able to break it. Inspecting a value can raise: `Object.values` invokes
|
|
160
|
+
* getters, and a getter that throws — or a hostile proxy trap — would escape
|
|
161
|
+
* into `store.transact`, which swallows the error and silently drops every
|
|
162
|
+
* prop after this one. That is the very failure mode this change removes, so
|
|
163
|
+
* an inspection that blows up means "not storable", nothing more.
|
|
164
|
+
*/
|
|
165
|
+
function canStoreUnknownPropValue(value) {
|
|
166
|
+
try {
|
|
167
|
+
return isEncodableElementValue(value);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
19
173
|
export class SurfaceBlockModel extends BlockModel {
|
|
174
|
+
/**
|
|
175
|
+
* The props that are known to move the bound of the containing group, so a
|
|
176
|
+
* write on one of them refreshes that bound eagerly (and notifies the layer
|
|
177
|
+
* and the renderer within the same tick).
|
|
178
|
+
*
|
|
179
|
+
* It is deliberately NOT the exhaustive list of what a bound can depend on:
|
|
180
|
+
* a subclass may fold a custom prop into its own `elementBound` (our polygon
|
|
181
|
+
* shape does it with `vertices`, the connector with `labelXYWH`). Anything
|
|
182
|
+
* outside this set therefore only *invalidates* the cached bound — the next
|
|
183
|
+
* read recomputes it — which keeps such elements correct without paying the
|
|
184
|
+
* eager recomputation on every unrelated prop write.
|
|
185
|
+
*/
|
|
186
|
+
static { this._groupBoundImpactKeys = new Set([
|
|
187
|
+
'xywh',
|
|
188
|
+
'rotate',
|
|
189
|
+
'hidden',
|
|
190
|
+
]); }
|
|
20
191
|
get elementModels() {
|
|
21
192
|
const models = [];
|
|
22
193
|
this._elementModels.forEach(model => models.push(model.model));
|
|
@@ -71,12 +242,78 @@ export class SurfaceBlockModel extends BlockModel {
|
|
|
71
242
|
yMap.set('id', id);
|
|
72
243
|
Object.keys(rest).forEach(key => {
|
|
73
244
|
if (props[key] !== undefined) {
|
|
74
|
-
|
|
75
|
-
elementModel.model[key] = props[key];
|
|
245
|
+
this._assignElementProp(elementModel.model, key, props[key]);
|
|
76
246
|
}
|
|
77
247
|
});
|
|
78
248
|
return elementModel;
|
|
79
249
|
}
|
|
250
|
+
/**
|
|
251
|
+
* Copies one serialized prop onto an element, routing it EXPLICITLY.
|
|
252
|
+
*
|
|
253
|
+
* Three outcomes, in order:
|
|
254
|
+
*
|
|
255
|
+
* 1. an unsafe key ({@link UNSAFE_ELEMENT_PROP_KEYS}) is dropped;
|
|
256
|
+
* 2. a key the element class **declared** ({@link isDeclaredElementProp})
|
|
257
|
+
* goes through its accessor, exactly as before;
|
|
258
|
+
* 3. anything else is an unknown key and is written verbatim into the
|
|
259
|
+
* element's Y.Map, provided the value is encodable.
|
|
260
|
+
*
|
|
261
|
+
* Step 2 deliberately does **not** ask `key in element`. That question is far
|
|
262
|
+
* wider than "did the class declare this prop": it also matches every method
|
|
263
|
+
* (`serialize`, `isLocked`, `stash`…), every getter-only derived prop (`x`,
|
|
264
|
+
* `y`, `w`, `h`, `group`, `elementBound`…) and every internal instance field
|
|
265
|
+
* (`_local`, `_preserved`…). Routing those to the instance is what used to
|
|
266
|
+
* corrupt the model — a data key named `serialize` shadowed the method with a
|
|
267
|
+
* string, and a data key named `x` threw `TypeError: only a getter`, which
|
|
268
|
+
* `store.transact` swallows, silently losing every prop after it in the same
|
|
269
|
+
* bulk update. With the declared-prop sets, such a key is simply unknown data:
|
|
270
|
+
* it lands in the Y.Map, where it shadows nothing (methods and derived getters
|
|
271
|
+
* live on the prototype and are read from there).
|
|
272
|
+
*
|
|
273
|
+
* Step 3 refuses a value it could not encode. `Y.Map.set` accepts a cyclic
|
|
274
|
+
* object and only fails later, in `encodeStateAsUpdate` — i.e. it breaks
|
|
275
|
+
* persistence and sync for good, invisibly. Dropping the key restores the
|
|
276
|
+
* pre-existing behaviour for that one prop and keeps the document sound; the
|
|
277
|
+
* doc's "values stay flat JSON" claim is now enforced rather than assumed.
|
|
278
|
+
*
|
|
279
|
+
* An `undefined` value is never written on the unknown branch either, so
|
|
280
|
+
* spreading an absent option (`{ ...opts }` with `opts.foo === undefined`)
|
|
281
|
+
* cannot mint a phantom key that is invisible in `serialize()` yet real for
|
|
282
|
+
* every peer. Declared fields keep accepting `undefined`, which is how an
|
|
283
|
+
* optional field is cleared.
|
|
284
|
+
*
|
|
285
|
+
* The asymmetry that follows is deliberate: an unknown key already present
|
|
286
|
+
* in the Y.Map can never be removed through `updateElement`, since
|
|
287
|
+
* `undefined` is the only way to ask for that and it is ignored here. On a
|
|
288
|
+
* client that does not declare the field, an unknown key is immortal. That
|
|
289
|
+
* is the right direction to err for a preservation contract — the client
|
|
290
|
+
* that understands the field can still clear it through its accessor — but
|
|
291
|
+
* it does mean this API cannot delete what it does not understand.
|
|
292
|
+
*
|
|
293
|
+
* The value is already Y-converted at this point: both call sites run the
|
|
294
|
+
* whole props object through {@link _propsToY} first, which is key-agnostic.
|
|
295
|
+
*
|
|
296
|
+
* See `docs/spikes/us-1-8-unknown-props-preservation.md`.
|
|
297
|
+
*/
|
|
298
|
+
_assignElementProp(element, key, value) {
|
|
299
|
+
if (UNSAFE_ELEMENT_PROP_KEYS.has(key)) {
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
if (isDeclaredElementProp(element, key)) {
|
|
303
|
+
// @ts-expect-error ignore
|
|
304
|
+
element[key] = value;
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
if (value === undefined) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
if (!canStoreUnknownPropValue(value)) {
|
|
311
|
+
console.warn(`Dropping unknown element prop "${key}": the value cannot be encoded ` +
|
|
312
|
+
`into the document (expected a Yjs type, or flat JSON without cycles).`);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
element.yMap.set(key, value);
|
|
316
|
+
}
|
|
80
317
|
_createElementFromYMap(type, id, yMap, options) {
|
|
81
318
|
const stashed = new Map();
|
|
82
319
|
const Ctor = this._elementCtorMap[type];
|
|
@@ -123,6 +360,52 @@ export class SurfaceBlockModel extends BlockModel {
|
|
|
123
360
|
unmount,
|
|
124
361
|
};
|
|
125
362
|
}
|
|
363
|
+
/**
|
|
364
|
+
* The single place an element update leaves the surface: it fans the payload
|
|
365
|
+
* out to the subscribers and keeps the bound of the containing group in sync.
|
|
366
|
+
*/
|
|
367
|
+
_emitElementUpdated(model, payload) {
|
|
368
|
+
this.elementUpdated.next(payload);
|
|
369
|
+
Object.keys(payload.props).forEach(key => {
|
|
370
|
+
model.propsUpdated.next({ key });
|
|
371
|
+
});
|
|
372
|
+
this._refreshParentGroupBoundsForElement(model, payload);
|
|
373
|
+
}
|
|
374
|
+
_invalidateParentGroupBounds(id) {
|
|
375
|
+
if (this._groupLikeModels.size === 0) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
const group = this.getGroup(id);
|
|
379
|
+
if (group instanceof GfxGroupLikeElementModel) {
|
|
380
|
+
group.invalidateXYWH();
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
_refreshParentGroupBounds(id, local) {
|
|
384
|
+
if (this._groupLikeModels.size === 0) {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
const group = this.getGroup(id);
|
|
388
|
+
if (group instanceof GfxGroupLikeElementModel) {
|
|
389
|
+
group.refreshXYWH(local);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
_refreshParentGroupBoundsForElement(model, payload) {
|
|
393
|
+
if (model instanceof GfxGroupLikeElementModel &&
|
|
394
|
+
('childIds' in payload.props || 'childIds' in payload.oldValues)) {
|
|
395
|
+
model.refreshXYWH(payload.local);
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
const affectedKeys = new Set([
|
|
399
|
+
...Object.keys(payload.props),
|
|
400
|
+
...Object.keys(payload.oldValues),
|
|
401
|
+
]);
|
|
402
|
+
if (Array.from(affectedKeys).some(key => SurfaceBlockModel._groupBoundImpactKeys.has(key))) {
|
|
403
|
+
this._refreshParentGroupBounds(model.id, payload.local);
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
this._invalidateParentGroupBounds(model.id);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
126
409
|
_initElementModels() {
|
|
127
410
|
const elementsYMap = this.elements.getValue();
|
|
128
411
|
const addToType = (type, model) => {
|
|
@@ -160,10 +443,7 @@ export class SurfaceBlockModel extends BlockModel {
|
|
|
160
443
|
? this._elementModels.get(id)
|
|
161
444
|
: this._createElementFromYMap(element.get('type'), element.get('id'), element, {
|
|
162
445
|
onChange: payload => {
|
|
163
|
-
this.
|
|
164
|
-
Object.keys(payload.props).forEach(key => {
|
|
165
|
-
model.model.propsUpdated.next({ key });
|
|
166
|
-
});
|
|
446
|
+
this._emitElementUpdated(model.model, payload);
|
|
167
447
|
},
|
|
168
448
|
skipFieldInit: true,
|
|
169
449
|
});
|
|
@@ -199,10 +479,7 @@ export class SurfaceBlockModel extends BlockModel {
|
|
|
199
479
|
elementsYMap.forEach((val, key) => {
|
|
200
480
|
const model = this._createElementFromYMap(val.get('type'), val.get('id'), val, {
|
|
201
481
|
onChange: payload => {
|
|
202
|
-
this.
|
|
203
|
-
Object.keys(payload.props).forEach(key => {
|
|
204
|
-
model.model.propsUpdated.next({ key });
|
|
205
|
-
});
|
|
482
|
+
this._emitElementUpdated(model.model, payload);
|
|
206
483
|
},
|
|
207
484
|
skipFieldInit: true,
|
|
208
485
|
});
|
|
@@ -224,6 +501,9 @@ export class SurfaceBlockModel extends BlockModel {
|
|
|
224
501
|
if (isGfxGroupCompatibleModel(payload.model)) {
|
|
225
502
|
this._groupLikeModels.set(payload.id, payload.model);
|
|
226
503
|
}
|
|
504
|
+
if (payload.model instanceof BlockModel) {
|
|
505
|
+
this._refreshParentGroupBounds(payload.id, payload.isLocal);
|
|
506
|
+
}
|
|
227
507
|
break;
|
|
228
508
|
case 'delete':
|
|
229
509
|
if (isGfxGroupCompatibleModel(payload.model)) {
|
|
@@ -237,6 +517,14 @@ export class SurfaceBlockModel extends BlockModel {
|
|
|
237
517
|
}
|
|
238
518
|
}
|
|
239
519
|
break;
|
|
520
|
+
case 'update':
|
|
521
|
+
// A canvas block folds nothing else into its `elementBound`, so
|
|
522
|
+
// unlike a surface element it needs no lazy invalidation here.
|
|
523
|
+
if (payload.props.key &&
|
|
524
|
+
SurfaceBlockModel._groupBoundImpactKeys.has(payload.props.key)) {
|
|
525
|
+
this._refreshParentGroupBounds(payload.id, payload.isLocal);
|
|
526
|
+
}
|
|
527
|
+
break;
|
|
240
528
|
}
|
|
241
529
|
});
|
|
242
530
|
this.deleted.subscribe(() => {
|
|
@@ -266,6 +554,9 @@ export class SurfaceBlockModel extends BlockModel {
|
|
|
266
554
|
}
|
|
267
555
|
}
|
|
268
556
|
});
|
|
557
|
+
// `tags` is declared on the BASE class, so no per-class `propsToY` hook
|
|
558
|
+
// covers it. Run before the class hook, which may legitimately not exist.
|
|
559
|
+
tagsPropToY(props);
|
|
269
560
|
// @ts-expect-error ignore
|
|
270
561
|
return ctor.propsToY ? ctor.propsToY(props) : props;
|
|
271
562
|
}
|
|
@@ -329,10 +620,7 @@ export class SurfaceBlockModel extends BlockModel {
|
|
|
329
620
|
props.id = id;
|
|
330
621
|
const elementModel = this._createElementFromProps(props, {
|
|
331
622
|
onChange: payload => {
|
|
332
|
-
this.
|
|
333
|
-
Object.keys(payload.props).forEach(key => {
|
|
334
|
-
elementModel.model.propsUpdated.next({ key });
|
|
335
|
-
});
|
|
623
|
+
this._emitElementUpdated(elementModel.model, payload);
|
|
336
624
|
},
|
|
337
625
|
});
|
|
338
626
|
this._elementModels.set(id, elementModel);
|
|
@@ -456,8 +744,7 @@ export class SurfaceBlockModel extends BlockModel {
|
|
|
456
744
|
this.store.transact(() => {
|
|
457
745
|
props = this._propsToY(elementModel.type, props);
|
|
458
746
|
Object.entries(props).forEach(([key, value]) => {
|
|
459
|
-
|
|
460
|
-
elementModel[key] = value;
|
|
747
|
+
this._assignElementProp(elementModel, key, value);
|
|
461
748
|
});
|
|
462
749
|
});
|
|
463
750
|
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { GfxPrimitiveElementModel } from './element-model.js';
|
|
2
|
+
/** The `@field()` key. Spelled once. */
|
|
3
|
+
export declare const ELEMENT_TAGS_FIELD = "tags";
|
|
4
|
+
/**
|
|
5
|
+
* A flattened snapshot of an element's qualification: tag def id → value ids.
|
|
6
|
+
* The transport shape — `OccurrenceMaterialityPatch.tags` is exactly this — and
|
|
7
|
+
* deliberately NOT the persisted one.
|
|
8
|
+
*/
|
|
9
|
+
export type ElementTags = Record<string, string[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Every tag on the element, as plain JSON. `{}` when unqualified — absent and
|
|
12
|
+
* empty are the same fact, and no caller should have to distinguish them.
|
|
13
|
+
*
|
|
14
|
+
* Defensive by construction: the map is a document value, so a client of any
|
|
15
|
+
* vintage may have written something else into it. Both shapes a real client
|
|
16
|
+
* can produce are read ({@link isDegradedTags}); a malformed entry is skipped,
|
|
17
|
+
* never thrown on. A board that cannot be read is worse than a tag that is not.
|
|
18
|
+
*/
|
|
19
|
+
export declare function readElementTags(element: GfxPrimitiveElementModel): ElementTags;
|
|
20
|
+
/** The value ids selected for one tag, `[]` when it carries none. */
|
|
21
|
+
export declare function elementTagValues(element: GfxPrimitiveElementModel, tagId: string): string[];
|
|
22
|
+
/** Whether the element carries `valueId` under `tagId`. */
|
|
23
|
+
export declare function hasElementTagValue(element: GfxPrimitiveElementModel, tagId: string, valueId: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Set (or, with an empty `values`, remove) ONE tag on ONE element. Returns
|
|
26
|
+
* whether anything was written — a gesture that changes nothing must not cost an
|
|
27
|
+
* undo step and must not be reported.
|
|
28
|
+
*
|
|
29
|
+
* The caller owns `store.captureSync()`, and owes it BEFORE this call: the undo
|
|
30
|
+
* manager is built with no `captureTimeout`, so a qualification issued within
|
|
31
|
+
* 500 ms of a drag would otherwise be undone together with the drag — making a
|
|
32
|
+
* promotion look like it moved geometry, which is exactly what the ladder's
|
|
33
|
+
* invariants forbid.
|
|
34
|
+
*
|
|
35
|
+
* ## The cases, and why the first one is the point
|
|
36
|
+
*
|
|
37
|
+
* - **A `Y.Map` already** — the entry is set IN PLACE. Replacing the whole map
|
|
38
|
+
* instead would restore whole-blob last-write-wins and silently drop a
|
|
39
|
+
* concurrent edit on a different tag, which is the single reason the field is
|
|
40
|
+
* a nested map at all. Removing the last entry removes the key with
|
|
41
|
+
* `clearField` rather than leaving an empty map behind: an element qualified
|
|
42
|
+
* and then un-qualified goes back to costing nothing, like one that never was.
|
|
43
|
+
* - **Nothing yet** — a map is created and assigned through `updateElement`,
|
|
44
|
+
* which is what attaches it to the document and starts the nested observer.
|
|
45
|
+
* - **The degraded shape** ({@link isDegradedTags}) — the map is created from
|
|
46
|
+
* what is ALREADY there, plus the change. This is the one case where
|
|
47
|
+
* replacing wholesale is right, because a plain object was never mergeable in
|
|
48
|
+
* the first place; what would be wrong, and was, is replacing it with a map
|
|
49
|
+
* holding only the new tag. A colleague's qualification, written by a client
|
|
50
|
+
* that predates this field, would leave without a word.
|
|
51
|
+
*
|
|
52
|
+
* ## Read-only
|
|
53
|
+
*
|
|
54
|
+
* A read-only store is a no-op with a warning, not a throw and not a write.
|
|
55
|
+
* This is exported from `@labre/std/gfx`, so a host can call it directly, and
|
|
56
|
+
* the three write paths below reach the document three different ways: an
|
|
57
|
+
* in-place `store.transact` and `clearField` carry no read-only guard of their
|
|
58
|
+
* own (they would silently succeed), while `updateElement` throws. Three
|
|
59
|
+
* behaviours for one refusal is not a contract; one guard here is.
|
|
60
|
+
*/
|
|
61
|
+
export declare function setElementTag(element: GfxPrimitiveElementModel, tagId: string, values: readonly string[]): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Rebuild `tags` as a `Y.Map` when it arrives as plain JSON.
|
|
64
|
+
*
|
|
65
|
+
* Called by `SurfaceBlockModel._propsToY` for EVERY element type, because the
|
|
66
|
+
* field is declared on the base class and per-class `propsToY` hooks are not.
|
|
67
|
+
* Without it, paste / duplicate / alt-drag clone would each store the copy's
|
|
68
|
+
* qualification as one opaque plain object — indistinguishable from a correct
|
|
69
|
+
* copy until two people edited it and one of them lost their tag.
|
|
70
|
+
*
|
|
71
|
+
* `element.serialize()` is `yMap.toJSON()`, so the nested map reaches every one
|
|
72
|
+
* of those paths as a plain object with no wrapper; the snapshot path arrives
|
|
73
|
+
* already converted by the `SURFACE_YMAP_UNIQ_IDENTIFIER` branch above the call
|
|
74
|
+
* and is passed through untouched. An empty (or unusable) value drops the key
|
|
75
|
+
* entirely rather than writing a tombstone.
|
|
76
|
+
*/
|
|
77
|
+
export declare function tagsPropToY(props: Record<string, unknown>): void;
|