@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
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `AuditProvider` — the injectable seam the **Labre Assistant** plugs into
|
|
3
|
+
* (PF14.1, ADR 0008 § surface `'agent'`, ADR 0006 § render-free host seam).
|
|
4
|
+
*
|
|
5
|
+
* ## What this is, and above all what it is not
|
|
6
|
+
*
|
|
7
|
+
* The executor is the Labre Assistant, app-side (PO decision, 01/08/2026). The
|
|
8
|
+
* library embarks **no model, no prompt runner and no dependency on one**. What
|
|
9
|
+
* it owns is the seam and only the seam:
|
|
10
|
+
*
|
|
11
|
+
* - the criteria, as versioned DATA a framework declares
|
|
12
|
+
* ({@link AuditCriterion}) — the same declarative, host-shippable shape a
|
|
13
|
+
* validation rule, a role or a background already has;
|
|
14
|
+
* - the FACTS of a map, collected render-free ({@link AuditFacts});
|
|
15
|
+
* - a channel out: {@link AuditFinding}s in `audit` severity, timestamped and
|
|
16
|
+
* carrying the criterion they came from.
|
|
17
|
+
*
|
|
18
|
+
* ## The one invariant everything else defends
|
|
19
|
+
*
|
|
20
|
+
* **The deterministic engine never depends on the AI.** Levels 1 and 2 —
|
|
21
|
+
* `blocking-overridable` and `warning`, evaluated by `evaluateRules` inside the
|
|
22
|
+
* 16 ms budget — are computed, rendered and arbitrated with no knowledge that
|
|
23
|
+
* this file exists. An audit READS their output as a fact and writes into a
|
|
24
|
+
* separate signal. There is no path by which a provider (slow, absent, hostile
|
|
25
|
+
* or simply wrong) can change a verdict, delay a frame or move a mark on the
|
|
26
|
+
* canvas.
|
|
27
|
+
*
|
|
28
|
+
* That is why {@link normalizeFinding} FORCES `severity: 'audit'` rather than
|
|
29
|
+
* trusting the provider: `audit` is the severity that is invisible to the
|
|
30
|
+
* drawing user (`userFacingViolations`), so a provider returning `'warning'`
|
|
31
|
+
* would otherwise put an AI opinion behind a canvas bracket.
|
|
32
|
+
*/
|
|
33
|
+
import { createIdentifier } from '../../global/di/index.js';
|
|
34
|
+
export const AuditProvider = createIdentifier('LabreAuditService');
|
|
35
|
+
/**
|
|
36
|
+
* The ONLY way in. **No noop default is registered**, exactly as for
|
|
37
|
+
* `PivotPropertiesProvider`: absence is a *meaningful* state (standalone
|
|
38
|
+
* playground, unit tests, a labreapp build that has not wired its assistant),
|
|
39
|
+
* and making it the tested default is what keeps the degraded path honest.
|
|
40
|
+
*/
|
|
41
|
+
export function AuditExtension(service) {
|
|
42
|
+
return {
|
|
43
|
+
setup: di => {
|
|
44
|
+
di.override(AuditProvider, () => service);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/** Multi-instance: one registered {@link AuditCriterion} per impl. */
|
|
49
|
+
export const AuditCriterionIdentifier = createIdentifier('AuditCriterion');
|
|
50
|
+
/**
|
|
51
|
+
* Register a framework's audit criteria. Call it from the FLAG-GATED view
|
|
52
|
+
* extension, beside `ValidationRuleExtension`: criteria are tooling, so a
|
|
53
|
+
* disabled framework contributes none and an audit of its maps has nothing to
|
|
54
|
+
* ask about.
|
|
55
|
+
*
|
|
56
|
+
* ```ts
|
|
57
|
+
* context.register(AuditCriterionExtension(WARDLEY_AUDIT_CRITERIA));
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export function AuditCriterionExtension(criteria) {
|
|
61
|
+
return {
|
|
62
|
+
setup: di => {
|
|
63
|
+
for (const criterion of criteria) {
|
|
64
|
+
di.addImpl(AuditCriterionIdentifier(criterion.id), () => criterion);
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** Every criterion registered in this editor assembly. */
|
|
70
|
+
export function getAuditCriteria(std) {
|
|
71
|
+
return [...std.provider.getAll(AuditCriterionIdentifier).values()];
|
|
72
|
+
}
|
|
73
|
+
/** Whether a rejection is the caller's own abort rather than a failure. */
|
|
74
|
+
function isAbort(error, signal) {
|
|
75
|
+
if (signal?.aborted)
|
|
76
|
+
return true;
|
|
77
|
+
return error instanceof Error && error.name === 'AbortError';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Force a provider's answer into the ONE shape the library is willing to
|
|
81
|
+
* publish. Nothing here is a formality:
|
|
82
|
+
*
|
|
83
|
+
* - `severity` is OVERWRITTEN, never read. `'audit'` is the severity that stays
|
|
84
|
+
* off the canvas; a provider returning `'blocking-overridable'` would
|
|
85
|
+
* otherwise raise a bracket on an element over a sentence a model wrote.
|
|
86
|
+
* - `ruleId` is re-derived from the criterion, so a provider cannot attach its
|
|
87
|
+
* finding to a registered rule id and inherit that rule's exceptions,
|
|
88
|
+
* profile or toolbar arbitration.
|
|
89
|
+
* - a finding naming a criterion that was not in the request is DROPPED. The
|
|
90
|
+
* library asked three questions; an answer to a fourth is not an answer.
|
|
91
|
+
* - `at` is stamped library-side from one clock, so every finding of one run
|
|
92
|
+
* carries the same timestamp whatever the provider believes the time is.
|
|
93
|
+
*/
|
|
94
|
+
function normalizeFinding(raw, criteria, at) {
|
|
95
|
+
const criterion = criteria.get(raw.criterionId);
|
|
96
|
+
if (!criterion)
|
|
97
|
+
return null;
|
|
98
|
+
return {
|
|
99
|
+
...raw,
|
|
100
|
+
ruleId: `audit:${criterion.id}`,
|
|
101
|
+
// Whatever came back: an id list is the only part a provider authors, and
|
|
102
|
+
// it must be an array of strings or nothing at all.
|
|
103
|
+
elementIds: Array.isArray(raw.elementIds)
|
|
104
|
+
? raw.elementIds.filter((id) => typeof id === 'string')
|
|
105
|
+
: [],
|
|
106
|
+
severity: 'audit',
|
|
107
|
+
criterionId: criterion.id,
|
|
108
|
+
criterionVersion: criterion.version,
|
|
109
|
+
at,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The guarded call every in-library consumer uses — the one place the provider
|
|
114
|
+
* contract is enforced rather than trusted.
|
|
115
|
+
*
|
|
116
|
+
* - **No provider registered** → `{ status: 'unavailable', findings: [] }`. A
|
|
117
|
+
* clean refusal, not a throw and not a crash: levels 1 and 2 are untouched
|
|
118
|
+
* and the caller reports nothing.
|
|
119
|
+
* - **The provider throws or rejects** → `{ status: 'error' }`, with the reason
|
|
120
|
+
* kept for logs and never rendered.
|
|
121
|
+
* - **The caller aborted** → `{ status: 'aborted' }`, keeping whatever findings
|
|
122
|
+
* the provider had already returned.
|
|
123
|
+
* - **`onProgress` throws** → swallowed. A broken progress bar must not kill
|
|
124
|
+
* the run that feeds it.
|
|
125
|
+
*
|
|
126
|
+
* ## The request is ISOLATED before it crosses (the outbound half)
|
|
127
|
+
*
|
|
128
|
+
* `normalizeFinding` exists because a provider is not believed on the way back.
|
|
129
|
+
* This is the same statement on the way out, and it was missing: the facts a
|
|
130
|
+
* collector assembles are not all fresh objects. `backgroundAxisFacts` returns
|
|
131
|
+
* `forward` straight from a module constant (`FORWARD` in
|
|
132
|
+
* `framework-background/facts.ts`) — `as const` is compile-time only and
|
|
133
|
+
* nothing is frozen — so every `frames[].axes[].forward` handed over WAS the
|
|
134
|
+
* very array the engine multiplies against in `evaluateOrientationAgainstAxis`.
|
|
135
|
+
* A provider writing into the facts it is given (normalising a vector in place,
|
|
136
|
+
* say) flipped the axis convention for the whole process, and correct arrows
|
|
137
|
+
* started reporting as violations on the canvas. That is precisely what this
|
|
138
|
+
* file's header declares impossible.
|
|
139
|
+
*
|
|
140
|
+
* `structuredClone` at the boundary fixes the whole class rather than that one
|
|
141
|
+
* field: no future fact can leak identity either, and the cost is a constraint
|
|
142
|
+
* the seam already claims (ADR 0006 § 5 — the request must be serializable, and
|
|
143
|
+
* a test round-trips it). Value-comparing tests were structurally blind to it;
|
|
144
|
+
* an identity assertion (`.toBe`) now guards it.
|
|
145
|
+
*/
|
|
146
|
+
export async function requestAudit(std, request, options = {}) {
|
|
147
|
+
const provider = std.getOptional(AuditProvider);
|
|
148
|
+
if (!provider)
|
|
149
|
+
return { status: 'unavailable', findings: [] };
|
|
150
|
+
const criteria = new Map(request.criteria.map(c => [c.id, c]));
|
|
151
|
+
const { signal } = options;
|
|
152
|
+
// Asked before the call as well as after: a caller that aborts between
|
|
153
|
+
// building the request and issuing it must not start a run at all.
|
|
154
|
+
if (signal?.aborted)
|
|
155
|
+
return { status: 'aborted', findings: [] };
|
|
156
|
+
const onProgress = options.onProgress
|
|
157
|
+
? (progress) => {
|
|
158
|
+
try {
|
|
159
|
+
options.onProgress?.(progress);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.error('AuditProvider onProgress threw', error);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
: undefined;
|
|
166
|
+
// The outbound half of "a provider is not believed" — see the note above.
|
|
167
|
+
// A throw here means the facts stopped being serializable, which is a library
|
|
168
|
+
// bug and not a host one; it is reported loudly and degraded rather than
|
|
169
|
+
// allowed to become a crash in front of a user.
|
|
170
|
+
let isolated;
|
|
171
|
+
try {
|
|
172
|
+
isolated = structuredClone(request);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.error('audit facts are not structured-cloneable — the request cannot be ' +
|
|
176
|
+
'isolated, so it is not sent (ADR 0006 § 5)', error);
|
|
177
|
+
return {
|
|
178
|
+
status: 'error',
|
|
179
|
+
findings: [],
|
|
180
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
let raw;
|
|
184
|
+
try {
|
|
185
|
+
raw = await provider.runAudit(isolated, {
|
|
186
|
+
...(onProgress ? { onProgress } : {}),
|
|
187
|
+
...(signal ? { signal } : {}),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
if (isAbort(error, signal))
|
|
192
|
+
return { status: 'aborted', findings: [] };
|
|
193
|
+
console.error('AuditProvider.runAudit threw', error);
|
|
194
|
+
return {
|
|
195
|
+
status: 'error',
|
|
196
|
+
findings: [],
|
|
197
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
const at = Date.now();
|
|
201
|
+
const findings = (raw?.findings ?? [])
|
|
202
|
+
.map(finding => normalizeFinding(finding, criteria, at))
|
|
203
|
+
.filter((finding) => finding !== null);
|
|
204
|
+
// A provider that resolved normally while the caller was aborting is still an
|
|
205
|
+
// abort: the caller asked to stop, and honouring that is not the provider's
|
|
206
|
+
// decision to make.
|
|
207
|
+
//
|
|
208
|
+
// `unavailable` passes through with `aborted` and `error`. A registered
|
|
209
|
+
// provider CAN be unable to answer — assistant behind an app-side feature
|
|
210
|
+
// flag, quota exhausted, no model configured — and folding that into
|
|
211
|
+
// `complete` would both inflate the completion series and empty the one
|
|
212
|
+
// number that says how often users reach for an audit this build cannot
|
|
213
|
+
// deliver. `superseded` is deliberately absent: it is the library's own
|
|
214
|
+
// arbitration between two of its calls, so a provider claiming it is read as
|
|
215
|
+
// `complete` and the arbitration stays where it belongs.
|
|
216
|
+
const status = signal?.aborted
|
|
217
|
+
? 'aborted'
|
|
218
|
+
: raw?.status === 'aborted' ||
|
|
219
|
+
raw?.status === 'error' ||
|
|
220
|
+
raw?.status === 'unavailable'
|
|
221
|
+
? raw.status
|
|
222
|
+
: 'complete';
|
|
223
|
+
return {
|
|
224
|
+
status,
|
|
225
|
+
findings,
|
|
226
|
+
...(raw?.reason !== undefined ? { reason: raw.reason } : {}),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
@@ -87,6 +87,13 @@ export declare class EditPropsStore extends LifeCycleWatcher {
|
|
|
87
87
|
private readonly _disposables;
|
|
88
88
|
private readonly innerProps$;
|
|
89
89
|
lastProps$: Signal<LastProps>;
|
|
90
|
+
/**
|
|
91
|
+
* Flat accumulation of every style prop the user recorded, most recent
|
|
92
|
+
* value per prop, across element types. "Apply last style" (Mod+Y) reads
|
|
93
|
+
* this so a fill picked on a rect can repaint an ellipse, or a font style
|
|
94
|
+
* set on a text can restyle a shape.
|
|
95
|
+
*/
|
|
96
|
+
lastUsedStyle$: Signal<Record<string, unknown>>;
|
|
90
97
|
slots: {
|
|
91
98
|
storageUpdated: Subject<{
|
|
92
99
|
key: StoragePropsKey;
|
|
@@ -59,6 +59,13 @@ export class EditPropsStore extends LifeCycleWatcher {
|
|
|
59
59
|
super(std);
|
|
60
60
|
this._disposables = new DisposableGroup();
|
|
61
61
|
this.innerProps$ = signal({});
|
|
62
|
+
/**
|
|
63
|
+
* Flat accumulation of every style prop the user recorded, most recent
|
|
64
|
+
* value per prop, across element types. "Apply last style" (Mod+Y) reads
|
|
65
|
+
* this so a fill picked on a rect can repaint an ellipse, or a font style
|
|
66
|
+
* set on a text can restyle a shape.
|
|
67
|
+
*/
|
|
68
|
+
this.lastUsedStyle$ = signal({});
|
|
62
69
|
this.slots = {
|
|
63
70
|
storageUpdated: new Subject(),
|
|
64
71
|
};
|
|
@@ -141,6 +148,10 @@ export class EditPropsStore extends LifeCycleWatcher {
|
|
|
141
148
|
const overrideProps = schema.parse(props);
|
|
142
149
|
if (Object.keys(overrideProps).length === 0)
|
|
143
150
|
return;
|
|
151
|
+
this.lastUsedStyle$.value = {
|
|
152
|
+
...this.lastUsedStyle$.value,
|
|
153
|
+
...overrideProps,
|
|
154
|
+
};
|
|
144
155
|
const innerProps = this.innerProps$.value;
|
|
145
156
|
const nextProps = mergeWith(clonedeep(innerProps), { [key]: overrideProps }, customizer);
|
|
146
157
|
this.innerProps$.value = OptionalPropsSchema.parse(nextProps);
|
|
@@ -3,8 +3,33 @@ import type { ExtensionType } from '../../../store/index.js';
|
|
|
3
3
|
import type { FontConfig } from './config.js';
|
|
4
4
|
export declare class FontLoaderService extends LifeCycleWatcher {
|
|
5
5
|
static readonly key = "font-loader";
|
|
6
|
+
private static readonly DEFERRED_LOAD_DELAY_MS;
|
|
7
|
+
private static readonly DEFERRED_LOAD_BATCH_SIZE;
|
|
8
|
+
private static readonly DEFERRED_LOAD_BATCH_INTERVAL_MS;
|
|
9
|
+
private _idleLoadTaskId;
|
|
10
|
+
private _lazyLoadTimeoutId;
|
|
11
|
+
private _deferredFontsQueue;
|
|
12
|
+
private _deferredFontsCursor;
|
|
13
|
+
private _resolveDeferredDone;
|
|
14
|
+
/**
|
|
15
|
+
* Resolves once every deferred font has been handed to the browser, so
|
|
16
|
+
* `ready` still speaks for the whole configuration and the canvas is still
|
|
17
|
+
* repainted once — and only once — every font is in.
|
|
18
|
+
*/
|
|
19
|
+
private _deferredDone;
|
|
20
|
+
private readonly _loadedFontKeys;
|
|
6
21
|
readonly fontFaces: FontFace[];
|
|
7
|
-
get ready(): Promise<
|
|
22
|
+
get ready(): Promise<undefined>;
|
|
23
|
+
private readonly _fontKey;
|
|
24
|
+
/**
|
|
25
|
+
* The fonts the canvas paints with before anyone has picked anything: the
|
|
26
|
+
* ones a board is guaranteed to need on its very first frame. Everything
|
|
27
|
+
* else is a font a document has to ask for, and can arrive a few seconds
|
|
28
|
+
* later without anyone seeing a fallback.
|
|
29
|
+
*/
|
|
30
|
+
private readonly _isCriticalCanvasFont;
|
|
31
|
+
private readonly _scheduleDeferredLoad;
|
|
32
|
+
private readonly _cancelDeferredLoad;
|
|
8
33
|
load(fonts: FontConfig[]): void;
|
|
9
34
|
mounted(): void;
|
|
10
35
|
unmounted(): void;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { FontFamily, FontStyle, FontWeight } from '../../../affine-model/index.js';
|
|
1
2
|
import { createIdentifier } from '../../../global/di/index.js';
|
|
2
3
|
import { IS_FIREFOX } from '../../../global/env/index.js';
|
|
3
4
|
import { LifeCycleWatcher } from '../../../std/index.js';
|
|
@@ -13,29 +14,145 @@ const initFontFace = IS_FIREFOX
|
|
|
13
14
|
export class FontLoaderService extends LifeCycleWatcher {
|
|
14
15
|
constructor() {
|
|
15
16
|
super(...arguments);
|
|
17
|
+
this._idleLoadTaskId = null;
|
|
18
|
+
this._lazyLoadTimeoutId = null;
|
|
19
|
+
this._deferredFontsQueue = [];
|
|
20
|
+
this._deferredFontsCursor = 0;
|
|
21
|
+
this._resolveDeferredDone = null;
|
|
22
|
+
/**
|
|
23
|
+
* Resolves once every deferred font has been handed to the browser, so
|
|
24
|
+
* `ready` still speaks for the whole configuration and the canvas is still
|
|
25
|
+
* repainted once — and only once — every font is in.
|
|
26
|
+
*/
|
|
27
|
+
this._deferredDone = Promise.resolve();
|
|
28
|
+
this._loadedFontKeys = new Set();
|
|
16
29
|
this.fontFaces = [];
|
|
30
|
+
this._fontKey = ({ font, weight, style, url }) => {
|
|
31
|
+
return `${font}:${weight}:${style}:${url}`;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* The fonts the canvas paints with before anyone has picked anything: the
|
|
35
|
+
* ones a board is guaranteed to need on its very first frame. Everything
|
|
36
|
+
* else is a font a document has to ask for, and can arrive a few seconds
|
|
37
|
+
* later without anyone seeing a fallback.
|
|
38
|
+
*/
|
|
39
|
+
this._isCriticalCanvasFont = ({ font, weight, style, }) => {
|
|
40
|
+
if (style !== FontStyle.Normal)
|
|
41
|
+
return false;
|
|
42
|
+
if (font === FontFamily.Poppins) {
|
|
43
|
+
return (weight === FontWeight.Regular ||
|
|
44
|
+
weight === FontWeight.Medium ||
|
|
45
|
+
weight === FontWeight.SemiBold);
|
|
46
|
+
}
|
|
47
|
+
if (font === FontFamily.Inter) {
|
|
48
|
+
return weight === FontWeight.Regular || weight === FontWeight.SemiBold;
|
|
49
|
+
}
|
|
50
|
+
if (font === FontFamily.Kalam) {
|
|
51
|
+
// Mindmap style four uses bold Kalam text. SemiBold is the strongest
|
|
52
|
+
// Kalam weight we ship.
|
|
53
|
+
return weight === FontWeight.SemiBold;
|
|
54
|
+
}
|
|
55
|
+
return false;
|
|
56
|
+
};
|
|
57
|
+
this._scheduleDeferredLoad = (fonts) => {
|
|
58
|
+
if (fonts.length === 0 || typeof window === 'undefined') {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this._deferredFontsQueue = fonts;
|
|
62
|
+
this._deferredFontsCursor = 0;
|
|
63
|
+
this._deferredDone = new Promise(resolve => {
|
|
64
|
+
this._resolveDeferredDone = resolve;
|
|
65
|
+
});
|
|
66
|
+
const win = window;
|
|
67
|
+
const scheduleBatch = (delayMs) => {
|
|
68
|
+
this._lazyLoadTimeoutId = window.setTimeout(() => {
|
|
69
|
+
this._lazyLoadTimeoutId = null;
|
|
70
|
+
const runBatch = () => {
|
|
71
|
+
this._idleLoadTaskId = null;
|
|
72
|
+
const start = this._deferredFontsCursor;
|
|
73
|
+
const end = Math.min(start + FontLoaderService.DEFERRED_LOAD_BATCH_SIZE, this._deferredFontsQueue.length);
|
|
74
|
+
this._deferredFontsCursor = end;
|
|
75
|
+
this.load(this._deferredFontsQueue.slice(start, end));
|
|
76
|
+
if (this._deferredFontsCursor < this._deferredFontsQueue.length) {
|
|
77
|
+
scheduleBatch(FontLoaderService.DEFERRED_LOAD_BATCH_INTERVAL_MS);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this._resolveDeferredDone?.();
|
|
81
|
+
this._resolveDeferredDone = null;
|
|
82
|
+
};
|
|
83
|
+
if (typeof win.requestIdleCallback === 'function') {
|
|
84
|
+
this._idleLoadTaskId = win.requestIdleCallback(runBatch, {
|
|
85
|
+
timeout: 2000,
|
|
86
|
+
});
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
runBatch();
|
|
90
|
+
}, delayMs);
|
|
91
|
+
};
|
|
92
|
+
scheduleBatch(FontLoaderService.DEFERRED_LOAD_DELAY_MS);
|
|
93
|
+
};
|
|
94
|
+
this._cancelDeferredLoad = () => {
|
|
95
|
+
if (typeof window === 'undefined') {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const win = window;
|
|
99
|
+
if (this._idleLoadTaskId !== null &&
|
|
100
|
+
typeof win.cancelIdleCallback === 'function') {
|
|
101
|
+
win.cancelIdleCallback(this._idleLoadTaskId);
|
|
102
|
+
}
|
|
103
|
+
this._idleLoadTaskId = null;
|
|
104
|
+
if (this._lazyLoadTimeoutId !== null) {
|
|
105
|
+
window.clearTimeout(this._lazyLoadTimeoutId);
|
|
106
|
+
this._lazyLoadTimeoutId = null;
|
|
107
|
+
}
|
|
108
|
+
this._deferredFontsQueue = [];
|
|
109
|
+
this._deferredFontsCursor = 0;
|
|
110
|
+
this._resolveDeferredDone?.();
|
|
111
|
+
this._resolveDeferredDone = null;
|
|
112
|
+
this._deferredDone = Promise.resolve();
|
|
113
|
+
};
|
|
17
114
|
}
|
|
18
115
|
static { this.key = 'font-loader'; }
|
|
116
|
+
static { this.DEFERRED_LOAD_DELAY_MS = 5000; }
|
|
117
|
+
static { this.DEFERRED_LOAD_BATCH_SIZE = 4; }
|
|
118
|
+
static { this.DEFERRED_LOAD_BATCH_INTERVAL_MS = 1000; }
|
|
19
119
|
get ready() {
|
|
20
|
-
return Promise.all(this.fontFaces.map(fontFace => fontFace.loaded));
|
|
120
|
+
return this._deferredDone.then(() => Promise.all(this.fontFaces.map(fontFace => fontFace.loaded)).then(() => undefined));
|
|
21
121
|
}
|
|
22
122
|
load(fonts) {
|
|
23
|
-
|
|
123
|
+
for (const font of fonts) {
|
|
124
|
+
const key = this._fontKey(font);
|
|
125
|
+
// The same face registered twice is a second download and a second
|
|
126
|
+
// entry in `document.fonts`.
|
|
127
|
+
if (this._loadedFontKeys.has(key)) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
this._loadedFontKeys.add(key);
|
|
24
131
|
const fontFace = initFontFace(font);
|
|
25
132
|
document.fonts.add(fontFace);
|
|
26
133
|
fontFace.load().catch(console.error);
|
|
27
|
-
|
|
28
|
-
}
|
|
134
|
+
this.fontFaces.push(fontFace);
|
|
135
|
+
}
|
|
29
136
|
}
|
|
30
137
|
mounted() {
|
|
31
138
|
const config = this.std.getOptional(FontConfigIdentifier);
|
|
32
|
-
if (config) {
|
|
33
|
-
|
|
139
|
+
if (!config || config.length === 0) {
|
|
140
|
+
return;
|
|
34
141
|
}
|
|
142
|
+
const criticalFonts = config.filter(this._isCriticalCanvasFont);
|
|
143
|
+
const eagerFonts = criticalFonts.length > 0 ? criticalFonts : config.slice(0, 3);
|
|
144
|
+
const eagerFontKeySet = new Set(eagerFonts.map(this._fontKey));
|
|
145
|
+
const deferredFonts = config.filter(font => !eagerFontKeySet.has(this._fontKey(font)));
|
|
146
|
+
this.load(eagerFonts);
|
|
147
|
+
this._scheduleDeferredLoad(deferredFonts);
|
|
35
148
|
}
|
|
36
149
|
unmounted() {
|
|
37
|
-
this.
|
|
150
|
+
this._cancelDeferredLoad();
|
|
151
|
+
for (const fontFace of this.fontFaces) {
|
|
152
|
+
document.fonts.delete(fontFace);
|
|
153
|
+
}
|
|
38
154
|
this.fontFaces.splice(0, this.fontFaces.length);
|
|
155
|
+
this._loadedFontKeys.clear();
|
|
39
156
|
}
|
|
40
157
|
}
|
|
41
158
|
export const FontConfigIdentifier = createIdentifier('AffineFontConfig');
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './audit-service.js';
|
|
1
2
|
export * from './auto-clear-selection-service.js';
|
|
2
3
|
export * from './block-meta-service.js';
|
|
3
4
|
export * from './citation-service/index.js';
|
|
@@ -22,11 +23,15 @@ export * from './notification-service.js';
|
|
|
22
23
|
export * from './open-doc-config.js';
|
|
23
24
|
export * from './page-viewport-service.js';
|
|
24
25
|
export * from './parse-url-service.js';
|
|
26
|
+
export * from './pivot-materiality-publisher.js';
|
|
27
|
+
export * from './pivot-properties-service.js';
|
|
25
28
|
export * from './quick-search-service.js';
|
|
26
29
|
export * from './sidebar-service.js';
|
|
27
30
|
export * from './telemetry-service/index.js';
|
|
28
31
|
export * from './theme-service.js';
|
|
29
32
|
export * from './toolbar-service/index.js';
|
|
33
|
+
export * from './translation-service/index.js';
|
|
34
|
+
export * from './universe-tag-defs-service.js';
|
|
30
35
|
export * from './user-service/index.js';
|
|
31
36
|
export * from './viewport-element-service.js';
|
|
32
37
|
export * from './virtual-keyboard-service.js';
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './audit-service.js';
|
|
1
2
|
export * from './auto-clear-selection-service.js';
|
|
2
3
|
export * from './block-meta-service.js';
|
|
3
4
|
export * from './citation-service/index.js';
|
|
@@ -22,11 +23,15 @@ export * from './notification-service.js';
|
|
|
22
23
|
export * from './open-doc-config.js';
|
|
23
24
|
export * from './page-viewport-service.js';
|
|
24
25
|
export * from './parse-url-service.js';
|
|
26
|
+
export * from './pivot-materiality-publisher.js';
|
|
27
|
+
export * from './pivot-properties-service.js';
|
|
25
28
|
export * from './quick-search-service.js';
|
|
26
29
|
export * from './sidebar-service.js';
|
|
27
30
|
export * from './telemetry-service/index.js';
|
|
28
31
|
export * from './theme-service.js';
|
|
29
32
|
export * from './toolbar-service/index.js';
|
|
33
|
+
export * from './translation-service/index.js';
|
|
34
|
+
export * from './universe-tag-defs-service.js';
|
|
30
35
|
export * from './user-service/index.js';
|
|
31
36
|
export * from './viewport-element-service.js';
|
|
32
37
|
export * from './virtual-keyboard-service.js';
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `PivotMaterialityPublisher` — the one place a board occurrence's derived
|
|
3
|
+
* materialities are announced to the host (MF3 / ADR 0006 § 4).
|
|
4
|
+
*
|
|
5
|
+
* When the level-3 qualification of a **bound** element changes, the library
|
|
6
|
+
* announces it and forgets. It never writes to the pivot record, never awaits
|
|
7
|
+
* the host, never retries and never observes the result: the element is the
|
|
8
|
+
* source of truth for the occurrence, the record is the source of truth for
|
|
9
|
+
* itself, and the channel between them is one-way.
|
|
10
|
+
*
|
|
11
|
+
* ## Why a Yjs observer and not the setter, and not the command layer
|
|
12
|
+
*
|
|
13
|
+
* Both were rejected for the same concrete reason: **undo**.
|
|
14
|
+
*
|
|
15
|
+
* The `@field()` setter runs on a JS assignment only. Undo, redo and every
|
|
16
|
+
* remote peer's change arrive through the element's `Y.Map` observer and never
|
|
17
|
+
* touch it. Publishing from the setter — or from the command that calls it —
|
|
18
|
+
* means: qualify a bound element, press Ctrl+Z, and the element reverts while
|
|
19
|
+
* the record keeps the derived materiality. A silent, permanent desync on the
|
|
20
|
+
* very first undo.
|
|
21
|
+
*
|
|
22
|
+
* Subscribing to the surface's change stream and gating on `local` fixes it and
|
|
23
|
+
* costs nothing else:
|
|
24
|
+
*
|
|
25
|
+
* | Event | `local` | Publishes? |
|
|
26
|
+
* | ------------------------------- | ------- | ----------------------------------------- |
|
|
27
|
+
* | Author qualifies an element | `true` | Yes, on the authoring client only |
|
|
28
|
+
* | Author presses Ctrl+Z / Ctrl+Y | `true` | Yes — this is what fixes the undo desync |
|
|
29
|
+
* | Remote peer receives the change | `false` | No |
|
|
30
|
+
*
|
|
31
|
+
* `local` also IS the de-duplication: it partitions the fleet into exactly one
|
|
32
|
+
* publisher and N−1 silent observers, with no leader election, no lock and no
|
|
33
|
+
* acknowledgement.
|
|
34
|
+
*
|
|
35
|
+
* ## Best-effort, and honest about it
|
|
36
|
+
*
|
|
37
|
+
* Patches are full-state and idempotent, so replaying one converges — which is
|
|
38
|
+
* what makes the unobservable `void` return survivable. If the authoring client
|
|
39
|
+
* is offline from the host at that moment the patch is lost and the record
|
|
40
|
+
* stays stale until the next local change to that element. The safety net is
|
|
41
|
+
* that the element is always authoritative: a host can rebuild every derived
|
|
42
|
+
* materiality by scanning `collectPivotOccurrences`. Derived materialities are
|
|
43
|
+
* a cache of the boards, never a second original.
|
|
44
|
+
*/
|
|
45
|
+
import { LifeCycleWatcher } from '../../std/index.js';
|
|
46
|
+
import { type GfxPrimitiveElementModel } from '../../std/gfx/index.js';
|
|
47
|
+
import { type OccurrenceMaterialityPatch } from './pivot-properties-service.js';
|
|
48
|
+
export declare class PivotMaterialityPublisher extends LifeCycleWatcher {
|
|
49
|
+
static readonly key = "pivot-materiality-publisher";
|
|
50
|
+
/** Elements whose state is to be re-examined at the end of this microtask. */
|
|
51
|
+
private readonly _pending;
|
|
52
|
+
private _flushing;
|
|
53
|
+
/**
|
|
54
|
+
* The record each element was last known to be bound to, so that unbinding —
|
|
55
|
+
* or re-binding — can retract the OLD record's materiality. Without it the
|
|
56
|
+
* retraction has no `pivotDocId` to name: by the time the change is seen, the
|
|
57
|
+
* element no longer carries the old one.
|
|
58
|
+
*/
|
|
59
|
+
private readonly _lastBinding;
|
|
60
|
+
/**
|
|
61
|
+
* Last published fingerprint per `(pivotDocId, elementId)`. One user gesture
|
|
62
|
+
* produces several payloads for one element — the stash/pop path alone emits
|
|
63
|
+
* one per stashed prop — and a drag emits dozens that change nothing a patch
|
|
64
|
+
* describes. Publishing the element's CURRENT FULL STATE and dropping it when
|
|
65
|
+
* it repeats is what keeps that to one patch per real change.
|
|
66
|
+
*/
|
|
67
|
+
private readonly _published;
|
|
68
|
+
private _subscriptions;
|
|
69
|
+
private _disposeSurfaceEffect;
|
|
70
|
+
mounted(): void;
|
|
71
|
+
unmounted(): void;
|
|
72
|
+
private _unsubscribe;
|
|
73
|
+
private _resubscribe;
|
|
74
|
+
/**
|
|
75
|
+
* Record what record an element is bound to, **without publishing anything**.
|
|
76
|
+
*
|
|
77
|
+
* ## Who owns a retraction in a collaborative session
|
|
78
|
+
*
|
|
79
|
+
* The client whose LOCAL transaction removes the occurrence — deletion,
|
|
80
|
+
* unbind, or re-bind. That is the same rule as every other emission here
|
|
81
|
+
* (`local` partitions the fleet into one publisher and N−1 observers), and it
|
|
82
|
+
* is the only rule that can work: the peer that ORIGINALLY bound the element
|
|
83
|
+
* sees the deletion as a remote change, so if retraction belonged to the
|
|
84
|
+
* binder, nobody would emit it at all.
|
|
85
|
+
*
|
|
86
|
+
* Owning the retraction requires knowing which record to retract from, and by
|
|
87
|
+
* the time the deletion is seen the element is gone. Hence this: **tracking
|
|
88
|
+
* the binding is bookkeeping, not publication.** Every client keeps the map
|
|
89
|
+
* for everything it can see, whoever wrote it, so that whichever client
|
|
90
|
+
* eventually performs the removal can name the record. Without it, retraction
|
|
91
|
+
* only ever worked when one client both created and deleted the occurrence —
|
|
92
|
+
* the rare case in an open collaborative session, and the host would keep a
|
|
93
|
+
* materiality attributed to an occurrence that no longer exists.
|
|
94
|
+
*
|
|
95
|
+
* A remote peer that CHANGES a binding updates this map silently: it is
|
|
96
|
+
* publishing its own retraction and its own patch, and a second one from here
|
|
97
|
+
* would be a duplicate, not a safety net.
|
|
98
|
+
*
|
|
99
|
+
* ## …and it invalidates what WE last published
|
|
100
|
+
*
|
|
101
|
+
* `_published` remembers the last patch this client sent, so an unchanged
|
|
102
|
+
* state is not re-announced. A remote change makes that memory a lie: the
|
|
103
|
+
* peer published its own patch, so the host now holds the peer's state, not
|
|
104
|
+
* ours. Left stale, the sequence `we publish data` → `peer switches to
|
|
105
|
+
* practice` → `we go back to data` compares equal to our own last
|
|
106
|
+
* fingerprint and DROPS the patch — the element says `data`, the host keeps
|
|
107
|
+
* `practice`, until some third, different value comes along.
|
|
108
|
+
*
|
|
109
|
+
* Milder than the retraction gap above (this is host-side cache staleness,
|
|
110
|
+
* not document data, and it heals on the next real change), but free to
|
|
111
|
+
* close: every remote touch drops our fingerprint for that occurrence, so
|
|
112
|
+
* the next local patch is always sent.
|
|
113
|
+
*/
|
|
114
|
+
private _track;
|
|
115
|
+
/**
|
|
116
|
+
* Coalesce per element within one microtask, then publish the element's
|
|
117
|
+
* CURRENT FULL STATE — never a delta. `_onChange` is also invoked directly on
|
|
118
|
+
* the stash/pop path, so one gesture legitimately produces several payloads
|
|
119
|
+
* for the same element.
|
|
120
|
+
*/
|
|
121
|
+
private _schedule;
|
|
122
|
+
private _publish;
|
|
123
|
+
private _emit;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The full state of one occurrence, as the host stores it. Exported for the
|
|
127
|
+
* host's own rebuild path and for tests — it is a pure function of the element.
|
|
128
|
+
*/
|
|
129
|
+
export declare function buildOccurrencePatch(element: GfxPrimitiveElementModel, pivotDocId: string): OccurrenceMaterialityPatch;
|