@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,311 @@
|
|
|
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 { FRAMEWORK_IDS } from '../../std/index.js';
|
|
47
|
+
import { GfxControllerIdentifier, isPivotBound, readElementTags, } from '../../std/gfx/index.js';
|
|
48
|
+
import { effect } from '@preact/signals-core';
|
|
49
|
+
import { PivotPropertiesProvider, publishOccurrenceMaterialities, } from './pivot-properties-service.js';
|
|
50
|
+
/** Props whose change can alter what a patch says. Everything else is noise. */
|
|
51
|
+
const MATERIAL_PROPS = new Set(['tags', 'role', 'pivotDocId']);
|
|
52
|
+
const touchesMateriality = (payload) => Object.keys(payload.props).some(key => MATERIAL_PROPS.has(key)) ||
|
|
53
|
+
Object.keys(payload.oldValues).some(key => MATERIAL_PROPS.has(key));
|
|
54
|
+
/** `'wardley:component'` → `'wardley'`, when that names a real framework. */
|
|
55
|
+
function frameworkOfRole(role) {
|
|
56
|
+
const namespace = role?.split(':')[0];
|
|
57
|
+
return FRAMEWORK_IDS.includes(namespace ?? '')
|
|
58
|
+
? namespace
|
|
59
|
+
: undefined;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* `(pivotDocId, elementId)` — the host's primary key for a derived materiality.
|
|
63
|
+
*
|
|
64
|
+
* The pair is JSON-encoded rather than joined on a separator character: both
|
|
65
|
+
* halves are opaque strings the library does not mint, so any separator we
|
|
66
|
+
* picked could in principle occur inside one of them and make two distinct
|
|
67
|
+
* occurrences collide on one cache entry — which would silently suppress a
|
|
68
|
+
* legitimate patch, the one failure mode this cache must not have.
|
|
69
|
+
*/
|
|
70
|
+
const materialityKey = (pivotDocId, elementId) => JSON.stringify([pivotDocId, elementId]);
|
|
71
|
+
/** A patch reduced to what a host would store, for de-duplication. */
|
|
72
|
+
const patchFingerprint = (patch) => JSON.stringify([
|
|
73
|
+
patch.present,
|
|
74
|
+
patch.framework ?? null,
|
|
75
|
+
patch.role ?? null,
|
|
76
|
+
// Sorted so that two writes of the same qualification in a different order
|
|
77
|
+
// are one patch, not two.
|
|
78
|
+
Object.keys(patch.tags)
|
|
79
|
+
.sort()
|
|
80
|
+
.map(tagId => [tagId, patch.tags[tagId]]),
|
|
81
|
+
]);
|
|
82
|
+
export class PivotMaterialityPublisher extends LifeCycleWatcher {
|
|
83
|
+
constructor() {
|
|
84
|
+
super(...arguments);
|
|
85
|
+
/** Elements whose state is to be re-examined at the end of this microtask. */
|
|
86
|
+
this._pending = new Set();
|
|
87
|
+
this._flushing = false;
|
|
88
|
+
/**
|
|
89
|
+
* The record each element was last known to be bound to, so that unbinding —
|
|
90
|
+
* or re-binding — can retract the OLD record's materiality. Without it the
|
|
91
|
+
* retraction has no `pivotDocId` to name: by the time the change is seen, the
|
|
92
|
+
* element no longer carries the old one.
|
|
93
|
+
*/
|
|
94
|
+
this._lastBinding = new Map();
|
|
95
|
+
/**
|
|
96
|
+
* Last published fingerprint per `(pivotDocId, elementId)`. One user gesture
|
|
97
|
+
* produces several payloads for one element — the stash/pop path alone emits
|
|
98
|
+
* one per stashed prop — and a drag emits dozens that change nothing a patch
|
|
99
|
+
* describes. Publishing the element's CURRENT FULL STATE and dropping it when
|
|
100
|
+
* it repeats is what keeps that to one patch per real change.
|
|
101
|
+
*/
|
|
102
|
+
this._published = new Map();
|
|
103
|
+
this._subscriptions = [];
|
|
104
|
+
this._disposeSurfaceEffect = null;
|
|
105
|
+
}
|
|
106
|
+
static { this.key = 'pivot-materiality-publisher'; }
|
|
107
|
+
mounted() {
|
|
108
|
+
// Degradation, and the reason it is checked once: with no host provider —
|
|
109
|
+
// the playground, unit tests, a labreapp build that failed to register —
|
|
110
|
+
// there is nobody to announce to, so nothing is subscribed and the whole
|
|
111
|
+
// watcher costs one lookup. Binding and qualification keep working: they
|
|
112
|
+
// are element-local writes and never needed the host.
|
|
113
|
+
if (!this.std.getOptional(PivotPropertiesProvider)?.publishOccurrenceMaterialities) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// The surface is a SIGNAL, not a fact: it can legitimately be null at mount
|
|
117
|
+
// and arrive later, and it is replaced if the surface block is.
|
|
118
|
+
this._disposeSurfaceEffect = effect(() => {
|
|
119
|
+
this._resubscribe(this.std.get(GfxControllerIdentifier).surface$.value);
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
unmounted() {
|
|
123
|
+
this._disposeSurfaceEffect?.();
|
|
124
|
+
this._disposeSurfaceEffect = null;
|
|
125
|
+
this._unsubscribe();
|
|
126
|
+
this._pending.clear();
|
|
127
|
+
this._lastBinding.clear();
|
|
128
|
+
this._published.clear();
|
|
129
|
+
super.unmounted();
|
|
130
|
+
}
|
|
131
|
+
_unsubscribe() {
|
|
132
|
+
for (const subscription of this._subscriptions)
|
|
133
|
+
subscription.unsubscribe();
|
|
134
|
+
this._subscriptions = [];
|
|
135
|
+
}
|
|
136
|
+
_resubscribe(surface) {
|
|
137
|
+
this._unsubscribe();
|
|
138
|
+
this._pending.clear();
|
|
139
|
+
// A new surface is a new document: nothing published about the last one
|
|
140
|
+
// says anything about this one.
|
|
141
|
+
this._lastBinding.clear();
|
|
142
|
+
this._published.clear();
|
|
143
|
+
if (!surface)
|
|
144
|
+
return;
|
|
145
|
+
this._subscriptions.push(surface.elementAdded.subscribe(({ id, local }) => {
|
|
146
|
+
if (local)
|
|
147
|
+
this._schedule(surface, id);
|
|
148
|
+
else
|
|
149
|
+
this._track(surface, id);
|
|
150
|
+
}));
|
|
151
|
+
this._subscriptions.push(surface.elementUpdated.subscribe(payload => {
|
|
152
|
+
if (!touchesMateriality(payload))
|
|
153
|
+
return;
|
|
154
|
+
if (payload.local)
|
|
155
|
+
this._schedule(surface, payload.id);
|
|
156
|
+
else
|
|
157
|
+
this._track(surface, payload.id);
|
|
158
|
+
}));
|
|
159
|
+
this._subscriptions.push(surface.elementRemoved.subscribe(({ id, local }) => {
|
|
160
|
+
if (!local) {
|
|
161
|
+
// Someone else's deletion is someone else's retraction to emit. Drop
|
|
162
|
+
// the bookkeeping so a later occurrence reusing this id — an undo on
|
|
163
|
+
// the peer, a paste — is not silenced by a stale fingerprint.
|
|
164
|
+
const previous = this._lastBinding.get(id);
|
|
165
|
+
if (previous !== undefined) {
|
|
166
|
+
this._published.delete(materialityKey(previous, id));
|
|
167
|
+
}
|
|
168
|
+
this._lastBinding.delete(id);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
// The element is already gone from the surface, so the flush below
|
|
172
|
+
// cannot read it — which is exactly right: an absent element retracts.
|
|
173
|
+
this._schedule(surface, id);
|
|
174
|
+
}));
|
|
175
|
+
// Elements already on the surface when this mounts are NOT published. They
|
|
176
|
+
// are not a local change, and republishing a whole board on every editor
|
|
177
|
+
// open would flood the host with patches it already holds. The rebuild path
|
|
178
|
+
// (`collectPivotOccurrences`) is the deliberate way to resynchronise.
|
|
179
|
+
for (const element of surface.elementModels)
|
|
180
|
+
this._track(surface, element.id);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Record what record an element is bound to, **without publishing anything**.
|
|
184
|
+
*
|
|
185
|
+
* ## Who owns a retraction in a collaborative session
|
|
186
|
+
*
|
|
187
|
+
* The client whose LOCAL transaction removes the occurrence — deletion,
|
|
188
|
+
* unbind, or re-bind. That is the same rule as every other emission here
|
|
189
|
+
* (`local` partitions the fleet into one publisher and N−1 observers), and it
|
|
190
|
+
* is the only rule that can work: the peer that ORIGINALLY bound the element
|
|
191
|
+
* sees the deletion as a remote change, so if retraction belonged to the
|
|
192
|
+
* binder, nobody would emit it at all.
|
|
193
|
+
*
|
|
194
|
+
* Owning the retraction requires knowing which record to retract from, and by
|
|
195
|
+
* the time the deletion is seen the element is gone. Hence this: **tracking
|
|
196
|
+
* the binding is bookkeeping, not publication.** Every client keeps the map
|
|
197
|
+
* for everything it can see, whoever wrote it, so that whichever client
|
|
198
|
+
* eventually performs the removal can name the record. Without it, retraction
|
|
199
|
+
* only ever worked when one client both created and deleted the occurrence —
|
|
200
|
+
* the rare case in an open collaborative session, and the host would keep a
|
|
201
|
+
* materiality attributed to an occurrence that no longer exists.
|
|
202
|
+
*
|
|
203
|
+
* A remote peer that CHANGES a binding updates this map silently: it is
|
|
204
|
+
* publishing its own retraction and its own patch, and a second one from here
|
|
205
|
+
* would be a duplicate, not a safety net.
|
|
206
|
+
*
|
|
207
|
+
* ## …and it invalidates what WE last published
|
|
208
|
+
*
|
|
209
|
+
* `_published` remembers the last patch this client sent, so an unchanged
|
|
210
|
+
* state is not re-announced. A remote change makes that memory a lie: the
|
|
211
|
+
* peer published its own patch, so the host now holds the peer's state, not
|
|
212
|
+
* ours. Left stale, the sequence `we publish data` → `peer switches to
|
|
213
|
+
* practice` → `we go back to data` compares equal to our own last
|
|
214
|
+
* fingerprint and DROPS the patch — the element says `data`, the host keeps
|
|
215
|
+
* `practice`, until some third, different value comes along.
|
|
216
|
+
*
|
|
217
|
+
* Milder than the retraction gap above (this is host-side cache staleness,
|
|
218
|
+
* not document data, and it heals on the next real change), but free to
|
|
219
|
+
* close: every remote touch drops our fingerprint for that occurrence, so
|
|
220
|
+
* the next local patch is always sent.
|
|
221
|
+
*/
|
|
222
|
+
_track(surface, id) {
|
|
223
|
+
const element = surface.getElementById(id);
|
|
224
|
+
const previous = this._lastBinding.get(id);
|
|
225
|
+
if (previous !== undefined) {
|
|
226
|
+
this._published.delete(materialityKey(previous, id));
|
|
227
|
+
}
|
|
228
|
+
if (element && isPivotBound(element)) {
|
|
229
|
+
this._lastBinding.set(id, element.pivotDocId);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
this._lastBinding.delete(id);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Coalesce per element within one microtask, then publish the element's
|
|
237
|
+
* CURRENT FULL STATE — never a delta. `_onChange` is also invoked directly on
|
|
238
|
+
* the stash/pop path, so one gesture legitimately produces several payloads
|
|
239
|
+
* for the same element.
|
|
240
|
+
*/
|
|
241
|
+
_schedule(surface, id) {
|
|
242
|
+
this._pending.add(id);
|
|
243
|
+
if (this._flushing)
|
|
244
|
+
return;
|
|
245
|
+
this._flushing = true;
|
|
246
|
+
queueMicrotask(() => {
|
|
247
|
+
this._flushing = false;
|
|
248
|
+
const ids = [...this._pending];
|
|
249
|
+
this._pending.clear();
|
|
250
|
+
for (const pending of ids)
|
|
251
|
+
this._publish(surface, pending);
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
_publish(surface, id) {
|
|
255
|
+
const element = surface.getElementById(id) ?? null;
|
|
256
|
+
const previous = this._lastBinding.get(id);
|
|
257
|
+
const current = element && isPivotBound(element) ? element.pivotDocId : undefined;
|
|
258
|
+
// Retract on the OLD record when the binding is gone or has moved. An
|
|
259
|
+
// element deleted, unbound, or re-bound elsewhere must not leave the record
|
|
260
|
+
// holding materialities attributed to an occurrence that no longer exists
|
|
261
|
+
// there — "the library never deletes host data" would quietly become "the
|
|
262
|
+
// library leaks host data" (ADR 0006 § 4.3).
|
|
263
|
+
if (previous !== undefined && previous !== current) {
|
|
264
|
+
this._emit({
|
|
265
|
+
pivotDocId: previous,
|
|
266
|
+
elementId: id,
|
|
267
|
+
framework: undefined,
|
|
268
|
+
role: undefined,
|
|
269
|
+
tags: {},
|
|
270
|
+
present: false,
|
|
271
|
+
});
|
|
272
|
+
this._lastBinding.delete(id);
|
|
273
|
+
this._published.delete(materialityKey(previous, id));
|
|
274
|
+
}
|
|
275
|
+
if (!element || current === undefined)
|
|
276
|
+
return;
|
|
277
|
+
this._lastBinding.set(id, current);
|
|
278
|
+
this._emit(buildOccurrencePatch(element, current));
|
|
279
|
+
}
|
|
280
|
+
_emit(patch) {
|
|
281
|
+
const key = materialityKey(patch.pivotDocId, patch.elementId);
|
|
282
|
+
const fingerprint = patchFingerprint(patch);
|
|
283
|
+
if (this._published.get(key) === fingerprint)
|
|
284
|
+
return;
|
|
285
|
+
if (patch.present)
|
|
286
|
+
this._published.set(key, fingerprint);
|
|
287
|
+
else
|
|
288
|
+
this._published.delete(key);
|
|
289
|
+
// Guarded, fire-and-forget: a throwing host is swallowed, because there is
|
|
290
|
+
// nothing a caller could do with the failure and the element remains the
|
|
291
|
+
// source of truth either way.
|
|
292
|
+
publishOccurrenceMaterialities(this.std, patch);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* The full state of one occurrence, as the host stores it. Exported for the
|
|
297
|
+
* host's own rebuild path and for tests — it is a pure function of the element.
|
|
298
|
+
*/
|
|
299
|
+
export function buildOccurrencePatch(element, pivotDocId) {
|
|
300
|
+
return {
|
|
301
|
+
pivotDocId,
|
|
302
|
+
elementId: element.id,
|
|
303
|
+
framework: frameworkOfRole(element.role),
|
|
304
|
+
role: element.role,
|
|
305
|
+
// A flattened snapshot: a transport DTO, not the persisted shape. On the
|
|
306
|
+
// element the same data is a nested `Y.Map<string[]>` so that concurrent
|
|
307
|
+
// qualification merges per tag.
|
|
308
|
+
tags: readElementTags(element),
|
|
309
|
+
present: true,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import type { BlockStdScope, FrameworkId } from '../../std/index.js';
|
|
2
|
+
import type { ExtensionType } from '../../store/index.js';
|
|
3
|
+
import type { ReadonlySignal } from '@preact/signals-core';
|
|
4
|
+
/**
|
|
5
|
+
* Typed, render-free property values. No markup, ever — not a `TemplateResult`,
|
|
6
|
+
* not an HTML string, not a component reference (ADR 0006 § 5).
|
|
7
|
+
*
|
|
8
|
+
* Consumers MUST handle this union exhaustively **with a default branch**: an
|
|
9
|
+
* unknown `kind` renders as nothing and never throws, which is what lets a new
|
|
10
|
+
* value kind ship without breaking an older host or an older library. Treat the
|
|
11
|
+
* union as public API — adding a kind is cheap, changing one is a breaking
|
|
12
|
+
* change for every host.
|
|
13
|
+
*/
|
|
14
|
+
export type PivotPropertyValue = {
|
|
15
|
+
kind: 'text';
|
|
16
|
+
value: string;
|
|
17
|
+
} | {
|
|
18
|
+
kind: 'number';
|
|
19
|
+
value: number;
|
|
20
|
+
unit?: string;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'boolean';
|
|
23
|
+
value: boolean;
|
|
24
|
+
} | {
|
|
25
|
+
kind: 'date';
|
|
26
|
+
value: string;
|
|
27
|
+
} | {
|
|
28
|
+
kind: 'tags';
|
|
29
|
+
value: string[];
|
|
30
|
+
} | {
|
|
31
|
+
kind: 'user';
|
|
32
|
+
value: {
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
};
|
|
36
|
+
} | {
|
|
37
|
+
kind: 'ref';
|
|
38
|
+
value: {
|
|
39
|
+
docId: string;
|
|
40
|
+
label?: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export type PivotProperty = {
|
|
44
|
+
/** Stable, host-defined key. Used for ordering and diffing, not display. */
|
|
45
|
+
key: string;
|
|
46
|
+
/** Display label, already localized by the host. */
|
|
47
|
+
label: string;
|
|
48
|
+
value: PivotPropertyValue;
|
|
49
|
+
/**
|
|
50
|
+
* Where the value came from. `derived-from-occurrence` marks properties the
|
|
51
|
+
* host wrote back from a board occurrence (see {@link
|
|
52
|
+
* OccurrenceMaterialityPatch}); the library renders them distinctly and never
|
|
53
|
+
* lets the user edit them here.
|
|
54
|
+
*/
|
|
55
|
+
provenance?: 'authored' | 'derived-from-occurrence';
|
|
56
|
+
};
|
|
57
|
+
export type PivotSnapshot = {
|
|
58
|
+
docId: string;
|
|
59
|
+
title: string;
|
|
60
|
+
/** Host-ordered. The library preserves the order and does not sort. */
|
|
61
|
+
properties: PivotProperty[];
|
|
62
|
+
};
|
|
63
|
+
export type PivotQueryState = {
|
|
64
|
+
status: 'loading';
|
|
65
|
+
} | {
|
|
66
|
+
status: 'ready';
|
|
67
|
+
snapshot: PivotSnapshot;
|
|
68
|
+
}
|
|
69
|
+
/** The binding is dangling: record deleted, or not visible to this user. */
|
|
70
|
+
| {
|
|
71
|
+
status: 'missing';
|
|
72
|
+
} | {
|
|
73
|
+
status: 'error';
|
|
74
|
+
reason?: string;
|
|
75
|
+
};
|
|
76
|
+
/** Which properties a consuming surface asks for. */
|
|
77
|
+
export type PivotPropertiesConfig = {
|
|
78
|
+
/**
|
|
79
|
+
* Property keys the hover popup displays, in this order. The provider MUST
|
|
80
|
+
* load and return ONLY these.
|
|
81
|
+
*
|
|
82
|
+
* `[]` disables the asynchronous complement entirely while keeping the
|
|
83
|
+
* provider registered: the library does not call `properties$` **at all** —
|
|
84
|
+
* not "calls it and ignores the answer". No call, no request, no work. It is
|
|
85
|
+
* the deliberate opt-out for hosts that want the hover to stay purely local.
|
|
86
|
+
*/
|
|
87
|
+
hoverFields: readonly string[];
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* One occurrence's derived contribution to a pivot record, announced and
|
|
91
|
+
* forgotten. The library never writes to the pivot record and never observes
|
|
92
|
+
* the result (ADR 0006 § 4).
|
|
93
|
+
*
|
|
94
|
+
* Declared here — ahead of the `PivotMaterialityPublisher` that will emit it,
|
|
95
|
+
* which waits on the type-3 qualification of ADR 0007 — because ADRs 0005,
|
|
96
|
+
* 0006 and 0007 freeze ONE contract: a host implementing this interface today
|
|
97
|
+
* must be able to implement the whole of it, and the optional method must not
|
|
98
|
+
* change shape when the publisher lands.
|
|
99
|
+
*/
|
|
100
|
+
export type OccurrenceMaterialityPatch = {
|
|
101
|
+
/** The bound pivot record. */
|
|
102
|
+
pivotDocId: string;
|
|
103
|
+
/**
|
|
104
|
+
* Which occurrence this patch describes. The host's primary key, together
|
|
105
|
+
* with `pivotDocId` — derived materialities are stored per occurrence, which
|
|
106
|
+
* is what lets one be retracted precisely when its element disappears while
|
|
107
|
+
* the record's other occurrences keep theirs (ADR 0006 § 4.3/4.4).
|
|
108
|
+
*/
|
|
109
|
+
elementId: string;
|
|
110
|
+
/**
|
|
111
|
+
* Owning framework, when the occurrence has one — derived from the namespace
|
|
112
|
+
* of its `role` (`'wardley:component'` → `'wardley'`).
|
|
113
|
+
*
|
|
114
|
+
* OPTIONAL, which is a deviation from ADR 0006 § 4's `framework: FrameworkId`,
|
|
115
|
+
* for exactly the reason ADR 0007 § 7 was already amended on the twin
|
|
116
|
+
* telemetry field: ADR 0007 § 6 states that no rung of the ladder requires
|
|
117
|
+
* the previous one, so a plain rectangle bound to a pivot record — no role at
|
|
118
|
+
* all — is a legal state that belongs to no framework. A required field would
|
|
119
|
+
* oblige the library to invent an identity, which is the one thing taking
|
|
120
|
+
* `FrameworkId` from ADR 0008 exists to stop. Absent rather than `'unknown'`,
|
|
121
|
+
* per the repo convention.
|
|
122
|
+
*/
|
|
123
|
+
framework?: FrameworkId;
|
|
124
|
+
/** Role id, e.g. `'wardley:component'`. `undefined` once the role is cleared. */
|
|
125
|
+
role: string | undefined;
|
|
126
|
+
/**
|
|
127
|
+
* Type-3 tags: tag def id -> selected value ids. `{}` = cleared. A plain
|
|
128
|
+
* object on purpose: this is a transport DTO, not the persisted shape.
|
|
129
|
+
*/
|
|
130
|
+
tags: Record<string, string[]>;
|
|
131
|
+
/**
|
|
132
|
+
* `false` = this occurrence no longer exists (element deleted, or unbound).
|
|
133
|
+
* The host drops every derived materiality keyed by `(pivotDocId, elementId)`.
|
|
134
|
+
* When `false`, `role` is `undefined` and `tags` is `{}`.
|
|
135
|
+
*/
|
|
136
|
+
present: boolean;
|
|
137
|
+
};
|
|
138
|
+
export interface PivotPropertiesService {
|
|
139
|
+
/**
|
|
140
|
+
* MUST return synchronously and MUST NOT throw. The returned signal may start
|
|
141
|
+
* at `loading` and settle later; the library never awaits it. Caching,
|
|
142
|
+
* deduplication, revalidation and cancellation are the host's business —
|
|
143
|
+
* `fields` is part of the cache key.
|
|
144
|
+
*
|
|
145
|
+
* `fields` is the configured list, passed explicitly on every call. The
|
|
146
|
+
* provider MUST NOT load, compute, join or return properties outside it.
|
|
147
|
+
* Unknown or unauthorized keys are **skipped silently**: the provider returns
|
|
148
|
+
* the subset it can supply, never errors, never returns a placeholder row and
|
|
149
|
+
* never blocks the rest.
|
|
150
|
+
*
|
|
151
|
+
* The `MUST NOT throw` is a contract for hosts, not an assumption the library
|
|
152
|
+
* is entitled to make — it sits on the hover path, so
|
|
153
|
+
* {@link queryPivotProperties} guards it anyway.
|
|
154
|
+
*/
|
|
155
|
+
properties$(pivotDocId: string, opts: {
|
|
156
|
+
fields: readonly string[];
|
|
157
|
+
}): ReadonlySignal<PivotQueryState>;
|
|
158
|
+
/**
|
|
159
|
+
* Optional zero-cost cache peek, for cases where the library wants to avoid
|
|
160
|
+
* even a `loading` flash. MUST be O(1) and side-effect free.
|
|
161
|
+
*/
|
|
162
|
+
peek?(pivotDocId: string, opts: {
|
|
163
|
+
fields: readonly string[];
|
|
164
|
+
}): PivotSnapshot | undefined;
|
|
165
|
+
/**
|
|
166
|
+
* Fire-and-forget write-back of one occurrence's derived materialities.
|
|
167
|
+
* Returns `void`, deliberately not a `Promise`: the library cannot await it,
|
|
168
|
+
* retry it, or observe its failure. The channel is unidirectional and
|
|
169
|
+
* best-effort — a change on the record never mutates an element.
|
|
170
|
+
*/
|
|
171
|
+
publishOccurrenceMaterialities?(patch: OccurrenceMaterialityPatch): void;
|
|
172
|
+
}
|
|
173
|
+
export declare const PivotPropertiesProvider: import("../../global/di/types.js").ServiceIdentifier<PivotPropertiesService> & (<U extends PivotPropertiesService = PivotPropertiesService>(variant: import("../../global/di/types.js").ServiceVariant) => import("../../global/di/types.js").ServiceIdentifier<U>);
|
|
174
|
+
export declare const PivotPropertiesConfigIdentifier: import("../../global/di/types.js").ServiceIdentifier<PivotPropertiesConfig> & (<U extends PivotPropertiesConfig = PivotPropertiesConfig>(variant: import("../../global/di/types.js").ServiceVariant) => import("../../global/di/types.js").ServiceIdentifier<U>);
|
|
175
|
+
/**
|
|
176
|
+
* The ONLY way in. **No noop default is registered**: unlike telemetry — where
|
|
177
|
+
* a noop keeps the bus uniformly wired — absence here is a *meaningful* state
|
|
178
|
+
* (standalone playground, unit tests, a labreapp build that failed to
|
|
179
|
+
* register), and making it the tested default is what keeps the degraded path
|
|
180
|
+
* honest.
|
|
181
|
+
*/
|
|
182
|
+
export declare function PivotPropertiesExtension(service: PivotPropertiesService, config: PivotPropertiesConfig): ExtensionType;
|
|
183
|
+
/**
|
|
184
|
+
* The guarded read every in-library consumer uses. Synchronous by construction,
|
|
185
|
+
* and the one place the provider contract is enforced rather than trusted:
|
|
186
|
+
*
|
|
187
|
+
* - **No provider registered** → `undefined`. Not a call, not a state: the
|
|
188
|
+
* asynchronous complement does not exist in this assembly. The caller renders
|
|
189
|
+
* its local facts only — no spinner, no empty "Properties" section, no error
|
|
190
|
+
* — and hides (rather than disables) any affordance whose *only* purpose is
|
|
191
|
+
* to reach the record, per the `QuickSearchProvider` precedent.
|
|
192
|
+
* - **`hoverFields` empty, or no config registered** → `undefined`, and the
|
|
193
|
+
* provider is **not called at all**. Absent config with a provider present is
|
|
194
|
+
* a host wiring error, not a crash: it degrades to `hoverFields: []`, whose
|
|
195
|
+
* observable behaviour is identical to no provider.
|
|
196
|
+
* - **The provider throws** → `{ status: 'error' }`. A host's broken build must
|
|
197
|
+
* not become a crash-on-hover.
|
|
198
|
+
*
|
|
199
|
+
* `undefined` is deliberately NOT folded into `{ status: 'missing' }`: `missing`
|
|
200
|
+
* means "the binding is dangling — the record was deleted, or you cannot see
|
|
201
|
+
* it", which is a fact worth one discreet line. "This editor has no host data
|
|
202
|
+
* layer" is not that fact, and rendering it as one would put an error in front
|
|
203
|
+
* of every standalone user.
|
|
204
|
+
*/
|
|
205
|
+
export declare function queryPivotProperties(std: BlockStdScope, pivotDocId: string): ReadonlySignal<PivotQueryState> | undefined;
|
|
206
|
+
/**
|
|
207
|
+
* The guarded `peek`. Same rules as {@link queryPivotProperties}, and a throw
|
|
208
|
+
* is swallowed into `undefined` — a cache peek exists to avoid a flash, so
|
|
209
|
+
* failing it must cost nothing but the flash.
|
|
210
|
+
*/
|
|
211
|
+
export declare function peekPivotProperties(std: BlockStdScope, pivotDocId: string): PivotSnapshot | undefined;
|
|
212
|
+
/**
|
|
213
|
+
* The guarded write-back. Fire-and-forget by contract, so a throwing host is
|
|
214
|
+
* swallowed rather than surfaced: there is nothing a caller could do with the
|
|
215
|
+
* failure, and the element remains the source of truth either way.
|
|
216
|
+
*/
|
|
217
|
+
export declare function publishOccurrenceMaterialities(std: BlockStdScope, patch: OccurrenceMaterialityPatch): void;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `PivotPropertiesProvider` — the injectable `pivotDocId` → properties seam
|
|
3
|
+
* (MF1, ADR 0006).
|
|
4
|
+
*
|
|
5
|
+
* ADR 0005 gives a surface element an optional `pivotDocId` pointing at a
|
|
6
|
+
* host-owned **pivot record**. This is what turns that string into something a
|
|
7
|
+
* user can see, without the library ever learning what a pivot record is, and
|
|
8
|
+
* without the host's data layer getting between the user and their gesture.
|
|
9
|
+
*
|
|
10
|
+
* Two properties carry the whole design:
|
|
11
|
+
*
|
|
12
|
+
* - `properties$` returns a `ReadonlySignal` **synchronously**. There is no
|
|
13
|
+
* `Promise`-returning method on the read path, so no call site can `await`
|
|
14
|
+
* one — blocking is structurally impossible, not merely discouraged. Same
|
|
15
|
+
* shape as `DocDisplayMetaExtension`, minus the one thing worth not copying:
|
|
16
|
+
* the host never hands the library rendered markup.
|
|
17
|
+
* - The popup's content is host-configured (`hoverFields`), and that is a
|
|
18
|
+
* performance contract: a pivot record may carry dozens of properties,
|
|
19
|
+
* several of them expensive, and a hover must not pay for what it will not
|
|
20
|
+
* draw.
|
|
21
|
+
*/
|
|
22
|
+
import { createIdentifier } from '../../global/di/index.js';
|
|
23
|
+
import { computed } from '@preact/signals-core';
|
|
24
|
+
export const PivotPropertiesProvider = createIdentifier('LabrePivotPropertiesService');
|
|
25
|
+
export const PivotPropertiesConfigIdentifier = createIdentifier('LabrePivotPropertiesConfig');
|
|
26
|
+
/**
|
|
27
|
+
* The ONLY way in. **No noop default is registered**: unlike telemetry — where
|
|
28
|
+
* a noop keeps the bus uniformly wired — absence here is a *meaningful* state
|
|
29
|
+
* (standalone playground, unit tests, a labreapp build that failed to
|
|
30
|
+
* register), and making it the tested default is what keeps the degraded path
|
|
31
|
+
* honest.
|
|
32
|
+
*/
|
|
33
|
+
export function PivotPropertiesExtension(service, config) {
|
|
34
|
+
return {
|
|
35
|
+
setup: di => {
|
|
36
|
+
di.override(PivotPropertiesProvider, () => service);
|
|
37
|
+
di.override(PivotPropertiesConfigIdentifier, () => config);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const errorState = (reason) => computed(() => ({ status: 'error', reason }));
|
|
42
|
+
/**
|
|
43
|
+
* The guarded read every in-library consumer uses. Synchronous by construction,
|
|
44
|
+
* and the one place the provider contract is enforced rather than trusted:
|
|
45
|
+
*
|
|
46
|
+
* - **No provider registered** → `undefined`. Not a call, not a state: the
|
|
47
|
+
* asynchronous complement does not exist in this assembly. The caller renders
|
|
48
|
+
* its local facts only — no spinner, no empty "Properties" section, no error
|
|
49
|
+
* — and hides (rather than disables) any affordance whose *only* purpose is
|
|
50
|
+
* to reach the record, per the `QuickSearchProvider` precedent.
|
|
51
|
+
* - **`hoverFields` empty, or no config registered** → `undefined`, and the
|
|
52
|
+
* provider is **not called at all**. Absent config with a provider present is
|
|
53
|
+
* a host wiring error, not a crash: it degrades to `hoverFields: []`, whose
|
|
54
|
+
* observable behaviour is identical to no provider.
|
|
55
|
+
* - **The provider throws** → `{ status: 'error' }`. A host's broken build must
|
|
56
|
+
* not become a crash-on-hover.
|
|
57
|
+
*
|
|
58
|
+
* `undefined` is deliberately NOT folded into `{ status: 'missing' }`: `missing`
|
|
59
|
+
* means "the binding is dangling — the record was deleted, or you cannot see
|
|
60
|
+
* it", which is a fact worth one discreet line. "This editor has no host data
|
|
61
|
+
* layer" is not that fact, and rendering it as one would put an error in front
|
|
62
|
+
* of every standalone user.
|
|
63
|
+
*/
|
|
64
|
+
export function queryPivotProperties(std, pivotDocId) {
|
|
65
|
+
const provider = std.getOptional(PivotPropertiesProvider);
|
|
66
|
+
if (!provider)
|
|
67
|
+
return undefined;
|
|
68
|
+
const fields = std.getOptional(PivotPropertiesConfigIdentifier)?.hoverFields;
|
|
69
|
+
if (!fields?.length)
|
|
70
|
+
return undefined;
|
|
71
|
+
try {
|
|
72
|
+
return provider.properties$(pivotDocId, { fields });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error('PivotPropertiesProvider.properties$ threw', error);
|
|
76
|
+
return errorState(error instanceof Error ? error.message : String(error));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The guarded `peek`. Same rules as {@link queryPivotProperties}, and a throw
|
|
81
|
+
* is swallowed into `undefined` — a cache peek exists to avoid a flash, so
|
|
82
|
+
* failing it must cost nothing but the flash.
|
|
83
|
+
*/
|
|
84
|
+
export function peekPivotProperties(std, pivotDocId) {
|
|
85
|
+
const provider = std.getOptional(PivotPropertiesProvider);
|
|
86
|
+
if (!provider?.peek)
|
|
87
|
+
return undefined;
|
|
88
|
+
const fields = std.getOptional(PivotPropertiesConfigIdentifier)?.hoverFields;
|
|
89
|
+
if (!fields?.length)
|
|
90
|
+
return undefined;
|
|
91
|
+
try {
|
|
92
|
+
return provider.peek(pivotDocId, { fields });
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error('PivotPropertiesProvider.peek threw', error);
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The guarded write-back. Fire-and-forget by contract, so a throwing host is
|
|
101
|
+
* swallowed rather than surfaced: there is nothing a caller could do with the
|
|
102
|
+
* failure, and the element remains the source of truth either way.
|
|
103
|
+
*/
|
|
104
|
+
export function publishOccurrenceMaterialities(std, patch) {
|
|
105
|
+
const provider = std.getOptional(PivotPropertiesProvider);
|
|
106
|
+
if (!provider?.publishOccurrenceMaterialities)
|
|
107
|
+
return;
|
|
108
|
+
try {
|
|
109
|
+
provider.publishOccurrenceMaterialities(patch);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error('PivotPropertiesProvider.publishOccurrenceMaterialities threw', error);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { TelemetryEvent } from './types.js';
|
|
2
|
-
export type CodeBlockEventType = 'codeBlockLanguageSelect' | 'htmlBlockTogglePreview' | 'htmlBlockPreviewFailed';
|
|
2
|
+
export type CodeBlockEventType = 'codeBlockLanguageSelect' | 'codeBlockToggleCollapse' | 'htmlBlockTogglePreview' | 'htmlBlockPreviewFailed';
|
|
3
3
|
export type CodeBlockEvents = Record<CodeBlockEventType, TelemetryEvent>;
|