@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,155 @@
|
|
|
1
|
+
import type { BlockStdScope, FrameworkId } from '../../std/index.js';
|
|
2
|
+
import type { RoleDefs, RoleId } from '../../std/gfx/index.js';
|
|
3
|
+
import type { ExtensionType } from '../../store/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* `'<framework>:<local>'` — e.g. `'wardley:component'`, `'wardley:nature'`.
|
|
6
|
+
*
|
|
7
|
+
* A **seed-time** validation aid only. Persisted values are plain `string`s and
|
|
8
|
+
* are never narrowed to this, because a document may legitimately carry an id
|
|
9
|
+
* whose def was removed, renamed or never seeded in this deployment — and it
|
|
10
|
+
* must still open.
|
|
11
|
+
*/
|
|
12
|
+
export type QualifiedId = `${string}:${string}`;
|
|
13
|
+
/** `'<tagId>/<local>'` — e.g. `'wardley:nature/data'`. */
|
|
14
|
+
export type TagValueId = string;
|
|
15
|
+
export type TagValueDef = {
|
|
16
|
+
/** `'<tagId>/<local>'`, e.g. `'wardley:nature/data'`. */
|
|
17
|
+
id: TagValueId;
|
|
18
|
+
/** Display label, already localized by the host. */
|
|
19
|
+
label: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
/** Advisory colour token. The library may ignore it; it never affects layout. */
|
|
22
|
+
color?: string;
|
|
23
|
+
/** Hidden from pickers; still displayed when already present on an element. */
|
|
24
|
+
deprecated?: boolean;
|
|
25
|
+
};
|
|
26
|
+
export type TagDef = {
|
|
27
|
+
/** `'<framework>:<local>'`, e.g. `'wardley:nature'`. */
|
|
28
|
+
id: QualifiedId;
|
|
29
|
+
label: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
/** How many values an element may carry for this tag. */
|
|
32
|
+
cardinality: 'single' | 'multi';
|
|
33
|
+
/** A closed list, or `'open'` for free-text values. */
|
|
34
|
+
values: TagValueDef[] | 'open';
|
|
35
|
+
/**
|
|
36
|
+
* Role ids this tag qualifies. `'*'` = every role of this framework.
|
|
37
|
+
* Specialisation applies: a tag on `'wardley:component'` also applies to
|
|
38
|
+
* every role whose `parent` chain reaches it — resolved with `roleIsA`
|
|
39
|
+
* against the framework's own `RoleDefs`, which the CALLER supplies.
|
|
40
|
+
*/
|
|
41
|
+
appliesTo: RoleId[] | '*';
|
|
42
|
+
/**
|
|
43
|
+
* Advisory only. A missing "required" tag is reported by the rules engine; it
|
|
44
|
+
* NEVER blocks a gesture, a save, or a document load.
|
|
45
|
+
*/
|
|
46
|
+
required?: boolean;
|
|
47
|
+
/** Ascending display order. Ties broken by seed order, then by id. */
|
|
48
|
+
order?: number;
|
|
49
|
+
deprecated?: boolean;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* One pack of tag definitions. Plain data — no functions, no classes, no
|
|
53
|
+
* `Symbol` — so the TS type IS the JSON schema and a pack can ship as a `.json`
|
|
54
|
+
* asset.
|
|
55
|
+
*
|
|
56
|
+
* `roles` is deliberately absent: roles are lib-side data modules shipped by
|
|
57
|
+
* the framework that renders them (`WARDLEY_ROLES`), not app-seeded, and never
|
|
58
|
+
* pass through this registry (ADR 0007 § 2bis).
|
|
59
|
+
*/
|
|
60
|
+
export type UniverseTagDefs = {
|
|
61
|
+
/** Bumped only on a breaking change to THIS format. Currently 1. */
|
|
62
|
+
formatVersion: 1;
|
|
63
|
+
/**
|
|
64
|
+
* Unique id of this *pack*, not of the framework: several packs may extend
|
|
65
|
+
* the same framework (a base Wardley pack + a client's private extension).
|
|
66
|
+
* Doubles as the DI variant.
|
|
67
|
+
*/
|
|
68
|
+
packId: string;
|
|
69
|
+
framework: FrameworkId;
|
|
70
|
+
label: string;
|
|
71
|
+
tags: TagDef[];
|
|
72
|
+
};
|
|
73
|
+
/** A seed-time problem, for a host diagnostics panel. Never thrown. */
|
|
74
|
+
export type UniverseDefIssue = {
|
|
75
|
+
severity: 'warning' | 'error';
|
|
76
|
+
code: 'invalid-id' | 'cross-framework-id' | 'duplicate-conflict' | 'unsupported-format-version';
|
|
77
|
+
id?: string;
|
|
78
|
+
message: string;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Merged, validated, read-only view over the registered packs. **TAGS ONLY.**
|
|
82
|
+
*/
|
|
83
|
+
export interface UniverseRegistry {
|
|
84
|
+
frameworks(): FrameworkId[];
|
|
85
|
+
/**
|
|
86
|
+
* Tags applying to a role, ordered. Role specialisation is resolved with
|
|
87
|
+
* `roleIsA` against the framework's own `RoleDefs`, which the caller supplies
|
|
88
|
+
* — the registry holds no role vocabulary of its own.
|
|
89
|
+
*/
|
|
90
|
+
tagsForRole(roleId: RoleId, defs: RoleDefs): TagDef[];
|
|
91
|
+
tag(id: string): TagDef | undefined;
|
|
92
|
+
/** Every merged tag, ordered. */
|
|
93
|
+
tags(): TagDef[];
|
|
94
|
+
/** Seed-time problems. Never thrown. */
|
|
95
|
+
issues(): UniverseDefIssue[];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Variant-parameterized: **one registration per pack, keyed by `packId`** —
|
|
99
|
+
* the same mechanism as `SpotlightHostExtension(elementType)` and
|
|
100
|
+
* `ExternalGroupByConfigProvider(config.name)`.
|
|
101
|
+
*/
|
|
102
|
+
export declare const UniverseTagDefsProvider: import("../../global/di/types.js").ServiceIdentifier<UniverseTagDefs> & (<U extends UniverseTagDefs = UniverseTagDefs>(variant: import("../../global/di/types.js").ServiceVariant) => import("../../global/di/types.js").ServiceIdentifier<U>);
|
|
103
|
+
/**
|
|
104
|
+
* Seed one or more packs.
|
|
105
|
+
*
|
|
106
|
+
* `di.override`, **not** `di.addImpl`: `addImpl` throws
|
|
107
|
+
* `DuplicateServiceDefinitionError` when the same `[scope, identifier, variant]`
|
|
108
|
+
* is registered twice, while `override` works whether or not a prior
|
|
109
|
+
* registration exists. That is exactly the idempotency this needs — **distinct
|
|
110
|
+
* `packId`s accumulate, identical `packId`s replace** — so a host that
|
|
111
|
+
* re-registers on every render never throws and never grows the registry.
|
|
112
|
+
*
|
|
113
|
+
* Order stability is load-bearing and non-obvious: `getAll` returns a
|
|
114
|
+
* `Map<ServiceVariant, T>`, and `Map.set` on an EXISTING key keeps that key's
|
|
115
|
+
* original insertion position. Re-seeding a pack therefore updates it in place
|
|
116
|
+
* rather than moving it to the end, so a re-registration cannot silently flip
|
|
117
|
+
* which pack wins a cosmetic field.
|
|
118
|
+
*
|
|
119
|
+
* **All packs MUST be registered in the same DI scope.** `getAllRaw` falls back
|
|
120
|
+
* to the parent scope only when the current scope has no registration for the
|
|
121
|
+
* identifier AT ALL; it never merges across scopes. Seeding one pack from a
|
|
122
|
+
* `StoreExtension` and another from a `ViewExtension` would silently hide the
|
|
123
|
+
* first behind the second. The library cannot enforce this, so it is stated
|
|
124
|
+
* here and belongs in the host integration checklist.
|
|
125
|
+
*/
|
|
126
|
+
export declare function UniverseTagDefsExtension(defs: UniverseTagDefs | UniverseTagDefs[]): ExtensionType;
|
|
127
|
+
/**
|
|
128
|
+
* Merge every registered pack into one read-only view.
|
|
129
|
+
*
|
|
130
|
+
* Pure, so it is testable with literals and no container. The merge rules, in
|
|
131
|
+
* full:
|
|
132
|
+
*
|
|
133
|
+
* - **Union by id.** Several packs may extend the same universe.
|
|
134
|
+
* - **Additive fields merge:** `values` are unioned by value id, `appliesTo`
|
|
135
|
+
* arrays are unioned, and `'*'` absorbs any list.
|
|
136
|
+
* - **Cosmetic fields — last pack wins:** `label`, `description`, `color`,
|
|
137
|
+
* `order`, `required`, `deprecated`.
|
|
138
|
+
* - **Structural fields — first pack wins, conflict recorded:** `cardinality`,
|
|
139
|
+
* and `values: 'open'` vs a closed list. The conflict becomes a
|
|
140
|
+
* `duplicate-conflict` error issue and does NOT throw. A host that needs a
|
|
141
|
+
* deterministic winner should not define the same structural field twice; the
|
|
142
|
+
* registry reports the collision rather than guessing.
|
|
143
|
+
* - **Idempotent by value.** Activating a universe twice yields the same
|
|
144
|
+
* registry.
|
|
145
|
+
*/
|
|
146
|
+
export declare function buildUniverseRegistry(packs: readonly UniverseTagDefs[]): UniverseRegistry;
|
|
147
|
+
/**
|
|
148
|
+
* Whether a tag qualifies a role, following specialisation: a tag declared on
|
|
149
|
+
* `'wardley:component'` also applies to `'wardley:market'`, which specialises
|
|
150
|
+
* it. `'*'` matches every role of the tag's own framework and nothing else —
|
|
151
|
+
* a wildcard that crossed framework boundaries would make two taxonomies
|
|
152
|
+
* qualify each other's elements.
|
|
153
|
+
*/
|
|
154
|
+
export declare function tagAppliesToRole(def: TagDef, roleId: RoleId | undefined, defs: RoleDefs): boolean;
|
|
155
|
+
export declare function getUniverseRegistry(std: BlockStdScope): UniverseRegistry;
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-universe tag definitions — the format, the seeding mechanism and the
|
|
3
|
+
* merged read-only view over them (MF3 / ADR 0007 §§ 2 and 3).
|
|
4
|
+
*
|
|
5
|
+
* The **application seeds** the definitions per universe; the **library fixes
|
|
6
|
+
* their format**. That split is the whole point: a new business universe
|
|
7
|
+
* (cynefin, TOGAF, a client's private taxonomy) must be addable without
|
|
8
|
+
* shipping library code. The library ships exactly one pack of its own —
|
|
9
|
+
* Wardley's four natures — as a worked example, on the same mechanism a host
|
|
10
|
+
* would use.
|
|
11
|
+
*
|
|
12
|
+
* Three rules govern everything below, and they are not negotiable:
|
|
13
|
+
*
|
|
14
|
+
* - **Nothing throws, ever.** An invalid id, a cross-framework id, an
|
|
15
|
+
* unrecognised `formatVersion` — each drops the offending def and records an
|
|
16
|
+
* issue. A malformed seed must never prevent a document from opening. That is
|
|
17
|
+
* the hard boundary between "the app misconfigured a pack" and "the user lost
|
|
18
|
+
* their board".
|
|
19
|
+
* - **Defs are runtime configuration and are NEVER persisted.** The document
|
|
20
|
+
* stores ids only. A value whose def has vanished still loads and is shown as
|
|
21
|
+
* its raw id, marked unknown.
|
|
22
|
+
* - **Ids are forever.** A def is never removed, only `deprecated`.
|
|
23
|
+
*/
|
|
24
|
+
import { createIdentifier } from '../../global/di/index.js';
|
|
25
|
+
import { FRAMEWORK_IDS } from '../../std/index.js';
|
|
26
|
+
import { roleIsA } from '../../std/gfx/index.js';
|
|
27
|
+
/**
|
|
28
|
+
* Lower-kebab, case-sensitive, no unicode, no dots. Hyphenated framework ids
|
|
29
|
+
* are legal, so `cynefin-estuarine:domain` is well formed.
|
|
30
|
+
*/
|
|
31
|
+
const ID_PATTERN = /^[a-z0-9][a-z0-9-]*:[a-z0-9][a-z0-9-]*(\/[a-z0-9][a-z0-9-]*)?$/;
|
|
32
|
+
/**
|
|
33
|
+
* Variant-parameterized: **one registration per pack, keyed by `packId`** —
|
|
34
|
+
* the same mechanism as `SpotlightHostExtension(elementType)` and
|
|
35
|
+
* `ExternalGroupByConfigProvider(config.name)`.
|
|
36
|
+
*/
|
|
37
|
+
export const UniverseTagDefsProvider = createIdentifier('LabreUniverseTagDefs');
|
|
38
|
+
/**
|
|
39
|
+
* Seed one or more packs.
|
|
40
|
+
*
|
|
41
|
+
* `di.override`, **not** `di.addImpl`: `addImpl` throws
|
|
42
|
+
* `DuplicateServiceDefinitionError` when the same `[scope, identifier, variant]`
|
|
43
|
+
* is registered twice, while `override` works whether or not a prior
|
|
44
|
+
* registration exists. That is exactly the idempotency this needs — **distinct
|
|
45
|
+
* `packId`s accumulate, identical `packId`s replace** — so a host that
|
|
46
|
+
* re-registers on every render never throws and never grows the registry.
|
|
47
|
+
*
|
|
48
|
+
* Order stability is load-bearing and non-obvious: `getAll` returns a
|
|
49
|
+
* `Map<ServiceVariant, T>`, and `Map.set` on an EXISTING key keeps that key's
|
|
50
|
+
* original insertion position. Re-seeding a pack therefore updates it in place
|
|
51
|
+
* rather than moving it to the end, so a re-registration cannot silently flip
|
|
52
|
+
* which pack wins a cosmetic field.
|
|
53
|
+
*
|
|
54
|
+
* **All packs MUST be registered in the same DI scope.** `getAllRaw` falls back
|
|
55
|
+
* to the parent scope only when the current scope has no registration for the
|
|
56
|
+
* identifier AT ALL; it never merges across scopes. Seeding one pack from a
|
|
57
|
+
* `StoreExtension` and another from a `ViewExtension` would silently hide the
|
|
58
|
+
* first behind the second. The library cannot enforce this, so it is stated
|
|
59
|
+
* here and belongs in the host integration checklist.
|
|
60
|
+
*/
|
|
61
|
+
export function UniverseTagDefsExtension(defs) {
|
|
62
|
+
return {
|
|
63
|
+
setup: di => {
|
|
64
|
+
for (const pack of Array.isArray(defs) ? defs : [defs]) {
|
|
65
|
+
di.override(UniverseTagDefsProvider(pack.packId), () => pack);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/** `'wardley:nature'` → `'wardley'`. */
|
|
71
|
+
const namespaceOf = (id) => id.split(':')[0] ?? '';
|
|
72
|
+
/** `'wardley:nature/data'` → `'wardley:nature'`. */
|
|
73
|
+
const tagOfValue = (valueId) => valueId.split('/')[0] ?? '';
|
|
74
|
+
/**
|
|
75
|
+
* Merge every registered pack into one read-only view.
|
|
76
|
+
*
|
|
77
|
+
* Pure, so it is testable with literals and no container. The merge rules, in
|
|
78
|
+
* full:
|
|
79
|
+
*
|
|
80
|
+
* - **Union by id.** Several packs may extend the same universe.
|
|
81
|
+
* - **Additive fields merge:** `values` are unioned by value id, `appliesTo`
|
|
82
|
+
* arrays are unioned, and `'*'` absorbs any list.
|
|
83
|
+
* - **Cosmetic fields — last pack wins:** `label`, `description`, `color`,
|
|
84
|
+
* `order`, `required`, `deprecated`.
|
|
85
|
+
* - **Structural fields — first pack wins, conflict recorded:** `cardinality`,
|
|
86
|
+
* and `values: 'open'` vs a closed list. The conflict becomes a
|
|
87
|
+
* `duplicate-conflict` error issue and does NOT throw. A host that needs a
|
|
88
|
+
* deterministic winner should not define the same structural field twice; the
|
|
89
|
+
* registry reports the collision rather than guessing.
|
|
90
|
+
* - **Idempotent by value.** Activating a universe twice yields the same
|
|
91
|
+
* registry.
|
|
92
|
+
*/
|
|
93
|
+
export function buildUniverseRegistry(packs) {
|
|
94
|
+
const issues = [];
|
|
95
|
+
const drafts = new Map();
|
|
96
|
+
const frameworks = [];
|
|
97
|
+
let rank = 0;
|
|
98
|
+
const issue = (severity, code, message, id) => issues.push(id === undefined ? { severity, code, message } : { severity, code, id, message });
|
|
99
|
+
for (const pack of packs) {
|
|
100
|
+
if (pack?.formatVersion !== 1) {
|
|
101
|
+
// The WHOLE pack is dropped: a format we do not understand may mean
|
|
102
|
+
// anything. Documents still open; the tooling is simply unavailable.
|
|
103
|
+
issue('error', 'unsupported-format-version', `Pack "${pack?.packId ?? '<unnamed>'}" declares formatVersion ${String(pack?.formatVersion)}; this build understands 1. The pack is ignored.`, pack?.packId);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (!FRAMEWORK_IDS.includes(pack.framework)) {
|
|
107
|
+
issue('warning', 'cross-framework-id', `Pack "${pack.packId}" declares the unknown framework "${pack.framework}".`, pack.packId);
|
|
108
|
+
}
|
|
109
|
+
if (!frameworks.includes(pack.framework))
|
|
110
|
+
frameworks.push(pack.framework);
|
|
111
|
+
for (const def of pack.tags ?? []) {
|
|
112
|
+
if (typeof def?.id !== 'string' || !ID_PATTERN.test(def.id)) {
|
|
113
|
+
issue('error', 'invalid-id', `Tag id "${String(def?.id)}" in pack "${pack.packId}" is not a well-formed '<framework>:<local>' id.`, typeof def?.id === 'string' ? def.id : undefined);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
// The `<framework>` segment of every id in a pack MUST equal the pack's
|
|
117
|
+
// own framework. A cross-framework id is how one taxonomy would quietly
|
|
118
|
+
// start answering for another's roles.
|
|
119
|
+
if (namespaceOf(def.id) !== pack.framework) {
|
|
120
|
+
issue('error', 'cross-framework-id', `Tag "${def.id}" is namespaced "${namespaceOf(def.id)}" but pack "${pack.packId}" declares framework "${pack.framework}".`, def.id);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
mergeTagDef(drafts, def, pack, issue, rank++);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const merged = [...drafts.values()]
|
|
127
|
+
.map(draft => finishDraft(draft))
|
|
128
|
+
.sort((a, b) => (a.order ?? 0) - (b.order ?? 0) ||
|
|
129
|
+
(drafts.get(a.id).rank - drafts.get(b.id).rank) ||
|
|
130
|
+
a.id.localeCompare(b.id));
|
|
131
|
+
// Keyed by plain `string`, not by `QualifiedId`: a lookup comes from a
|
|
132
|
+
// DOCUMENT, which may carry any id at all, and the template-literal type is a
|
|
133
|
+
// seed-time aid rather than a claim about what is persisted.
|
|
134
|
+
const byId = new Map(merged.map(def => [def.id, def]));
|
|
135
|
+
return {
|
|
136
|
+
frameworks: () => [...frameworks],
|
|
137
|
+
tags: () => [...merged],
|
|
138
|
+
tag: id => byId.get(id),
|
|
139
|
+
tagsForRole: (roleId, defs) => merged.filter(def => tagAppliesToRole(def, roleId, defs)),
|
|
140
|
+
issues: () => [...issues],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function mergeTagDef(drafts, def, pack, issue, rank) {
|
|
144
|
+
const existing = drafts.get(def.id);
|
|
145
|
+
if (!existing) {
|
|
146
|
+
drafts.set(def.id, {
|
|
147
|
+
def: { ...def },
|
|
148
|
+
values: valueMapOf(def, pack, issue),
|
|
149
|
+
appliesTo: appliesToOf(def),
|
|
150
|
+
rank,
|
|
151
|
+
});
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// Cosmetic: last pack wins. Absent stays absent rather than blanking what an
|
|
155
|
+
// earlier pack said.
|
|
156
|
+
const draft = existing.def;
|
|
157
|
+
if (def.label !== undefined)
|
|
158
|
+
draft.label = def.label;
|
|
159
|
+
if (def.description !== undefined)
|
|
160
|
+
draft.description = def.description;
|
|
161
|
+
if (def.order !== undefined)
|
|
162
|
+
draft.order = def.order;
|
|
163
|
+
if (def.required !== undefined)
|
|
164
|
+
draft.required = def.required;
|
|
165
|
+
if (def.deprecated !== undefined)
|
|
166
|
+
draft.deprecated = def.deprecated;
|
|
167
|
+
// Structural: first pack wins, and the collision is REPORTED rather than
|
|
168
|
+
// guessed at.
|
|
169
|
+
if (def.cardinality !== draft.cardinality) {
|
|
170
|
+
issue('error', 'duplicate-conflict', `Tag "${def.id}": pack "${pack.packId}" declares cardinality "${def.cardinality}" but "${draft.cardinality}" was declared first and stands.`, def.id);
|
|
171
|
+
}
|
|
172
|
+
const incomingOpen = def.values === 'open';
|
|
173
|
+
const existingOpen = existing.values === 'open';
|
|
174
|
+
if (incomingOpen !== existingOpen) {
|
|
175
|
+
issue('error', 'duplicate-conflict', `Tag "${def.id}": pack "${pack.packId}" declares ${incomingOpen ? "an open value list" : 'a closed value list'} but the opposite was declared first and stands.`, def.id);
|
|
176
|
+
}
|
|
177
|
+
else if (existing.values !== 'open') {
|
|
178
|
+
// Additive: values union by value id, last cosmetic wins.
|
|
179
|
+
for (const [valueId, value] of valueMapOf(def, pack, issue)) {
|
|
180
|
+
const current = existing.values.get(valueId);
|
|
181
|
+
existing.values.set(valueId, current ? { ...current, ...value } : value);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Additive: `'*'` absorbs any list, in either direction.
|
|
185
|
+
const incomingRoles = appliesToOf(def);
|
|
186
|
+
if (existing.appliesTo !== '*') {
|
|
187
|
+
if (incomingRoles === '*')
|
|
188
|
+
existing.appliesTo = '*';
|
|
189
|
+
else
|
|
190
|
+
for (const role of incomingRoles)
|
|
191
|
+
existing.appliesTo.add(role);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function valueMapOf(def, pack, issue) {
|
|
195
|
+
if (def.values === 'open')
|
|
196
|
+
return 'open';
|
|
197
|
+
const values = new Map();
|
|
198
|
+
for (const value of def.values ?? []) {
|
|
199
|
+
if (typeof value?.id !== 'string' || !ID_PATTERN.test(value.id)) {
|
|
200
|
+
issue('error', 'invalid-id', `Value id "${String(value?.id)}" of tag "${def.id}" in pack "${pack.packId}" is not a well-formed '<tagId>/<local>' id.`, typeof value?.id === 'string' ? value.id : undefined);
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
// A value belongs to its tag, spelled out in the id itself. Anything else
|
|
204
|
+
// would let a pack file a value under a tag it does not own.
|
|
205
|
+
if (tagOfValue(value.id) !== def.id) {
|
|
206
|
+
issue('error', 'invalid-id', `Value "${value.id}" is not a value of tag "${def.id}".`, value.id);
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
values.set(value.id, { ...value });
|
|
210
|
+
}
|
|
211
|
+
return values;
|
|
212
|
+
}
|
|
213
|
+
const appliesToOf = (def) => def.appliesTo === '*' ? '*' : new Set(def.appliesTo ?? []);
|
|
214
|
+
function finishDraft(draft) {
|
|
215
|
+
return {
|
|
216
|
+
...draft.def,
|
|
217
|
+
values: draft.values === 'open' ? 'open' : [...draft.values.values()],
|
|
218
|
+
appliesTo: draft.appliesTo === '*' ? '*' : [...draft.appliesTo],
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Whether a tag qualifies a role, following specialisation: a tag declared on
|
|
223
|
+
* `'wardley:component'` also applies to `'wardley:market'`, which specialises
|
|
224
|
+
* it. `'*'` matches every role of the tag's own framework and nothing else —
|
|
225
|
+
* a wildcard that crossed framework boundaries would make two taxonomies
|
|
226
|
+
* qualify each other's elements.
|
|
227
|
+
*/
|
|
228
|
+
export function tagAppliesToRole(def, roleId, defs) {
|
|
229
|
+
if (!roleId)
|
|
230
|
+
return false;
|
|
231
|
+
if (def.appliesTo === '*')
|
|
232
|
+
return namespaceOf(roleId) === namespaceOf(def.id);
|
|
233
|
+
return def.appliesTo.some(ancestor => roleIsA(roleId, ancestor, defs));
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* The merged registry for this editor assembly.
|
|
237
|
+
*
|
|
238
|
+
* Memoized per `BlockStdScope`: the merge is pure and the packs are fixed at
|
|
239
|
+
* assembly time, while callers (a toolbar section rebuilt on every selection
|
|
240
|
+
* change) ask for it often. A host that re-seeds a pack after the first read
|
|
241
|
+
* therefore needs a new scope — which is what re-creating the editor already
|
|
242
|
+
* does, and the only cost of not re-validating a static configuration on every
|
|
243
|
+
* keystroke.
|
|
244
|
+
*/
|
|
245
|
+
const REGISTRY_CACHE = new WeakMap();
|
|
246
|
+
export function getUniverseRegistry(std) {
|
|
247
|
+
const cached = REGISTRY_CACHE.get(std);
|
|
248
|
+
if (cached)
|
|
249
|
+
return cached;
|
|
250
|
+
const packs = [...std.provider.getAll(UniverseTagDefsProvider).values()];
|
|
251
|
+
const registry = buildUniverseRegistry(packs);
|
|
252
|
+
REGISTRY_CACHE.set(std, registry);
|
|
253
|
+
return registry;
|
|
254
|
+
}
|
|
@@ -13,4 +13,8 @@ declare global {
|
|
|
13
13
|
export declare function caretRangeFromPoint(clientX: number, clientY: number): Range | null;
|
|
14
14
|
export declare function resetNativeSelection(range: Range | null): void;
|
|
15
15
|
export declare function getCurrentNativeRange(selection?: Selection | null): Range | null;
|
|
16
|
+
export declare const api: {
|
|
17
|
+
caretRangeFromPoint: typeof caretRangeFromPoint;
|
|
18
|
+
resetNativeSelection: typeof resetNativeSelection;
|
|
19
|
+
};
|
|
16
20
|
export declare function handleNativeRangeAtPoint(x: number, y: number): void;
|
|
@@ -63,11 +63,67 @@ export function getCurrentNativeRange(selection = window.getSelection()) {
|
|
|
63
63
|
}
|
|
64
64
|
return selection.getRangeAt(0);
|
|
65
65
|
}
|
|
66
|
+
// Indirection so that unit tests can mock these two browser-bound functions.
|
|
67
|
+
export const api = {
|
|
68
|
+
caretRangeFromPoint,
|
|
69
|
+
resetNativeSelection,
|
|
70
|
+
};
|
|
66
71
|
export function handleNativeRangeAtPoint(x, y) {
|
|
67
|
-
const range = caretRangeFromPoint(x, y);
|
|
72
|
+
const range = api.caretRangeFromPoint(x, y);
|
|
73
|
+
if (range) {
|
|
74
|
+
normalizeCaretRange(range);
|
|
75
|
+
}
|
|
68
76
|
const startContainer = range?.startContainer;
|
|
69
77
|
// click on rich text
|
|
70
78
|
if (startContainer instanceof Node) {
|
|
71
|
-
resetNativeSelection(range);
|
|
79
|
+
api.resetNativeSelection(range);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function lastMeaningfulTextNode(node) {
|
|
83
|
+
const walker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, {
|
|
84
|
+
acceptNode(node) {
|
|
85
|
+
return node.textContent && node.textContent.trim().length > 0
|
|
86
|
+
? NodeFilter.FILTER_ACCEPT
|
|
87
|
+
: NodeFilter.FILTER_REJECT;
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
let last = null;
|
|
91
|
+
while (walker.nextNode()) {
|
|
92
|
+
last = walker.currentNode;
|
|
93
|
+
}
|
|
94
|
+
return last;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Clicking past the end of a line gives back a caret anchored on an *element*
|
|
98
|
+
* rather than on a text node. Such a range paints a caret for a frame and then
|
|
99
|
+
* loses it, because the editor only tracks carets that live inside text. Move
|
|
100
|
+
* the caret to the nearest meaningful text node so that it survives.
|
|
101
|
+
*/
|
|
102
|
+
function normalizeCaretRange(range) {
|
|
103
|
+
const { startContainer, startOffset } = range;
|
|
104
|
+
if (startContainer.nodeType === Node.TEXT_NODE)
|
|
105
|
+
return;
|
|
106
|
+
// Try to find text in the element at `startOffset`
|
|
107
|
+
const offsetEl = startOffset > 0
|
|
108
|
+
? startContainer.childNodes[startOffset - 1]
|
|
109
|
+
: startContainer.childNodes[0];
|
|
110
|
+
if (offsetEl) {
|
|
111
|
+
if (offsetEl.nodeType === Node.TEXT_NODE) {
|
|
112
|
+
range.setStart(offsetEl, startOffset > 0 ? (offsetEl.textContent?.length ?? 0) : 0);
|
|
113
|
+
range.collapse(true);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const text = lastMeaningfulTextNode(offsetEl);
|
|
117
|
+
if (text) {
|
|
118
|
+
range.setStart(text, text.textContent?.length ?? 0);
|
|
119
|
+
range.collapse(true);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Fallback, try to find text in startContainer
|
|
124
|
+
const text = lastMeaningfulTextNode(startContainer);
|
|
125
|
+
if (text) {
|
|
126
|
+
range.setStart(text, text.textContent?.length ?? 0);
|
|
127
|
+
range.collapse(true);
|
|
72
128
|
}
|
|
73
129
|
}
|
|
@@ -11,3 +11,63 @@ import type { EditorHost } from '../../../std/index.js';
|
|
|
11
11
|
* ```
|
|
12
12
|
*/
|
|
13
13
|
export declare function getViewportElement(editorHost: EditorHost): HTMLElement | null;
|
|
14
|
+
/**
|
|
15
|
+
* Where a model point lands, in CSS pixels, for an overlay drawn *inside* the
|
|
16
|
+
* edgeless container: the selection rectangle, the resize handles, the remote
|
|
17
|
+
* cursors, the text editors mounted over an element.
|
|
18
|
+
*
|
|
19
|
+
* `Viewport.toViewCoord` answers in real screen pixels, so it multiplies by
|
|
20
|
+
* `viewScale` — the CSS scale an outer container puts on the whole editor,
|
|
21
|
+
* which is not 1 in a nested editor such as an embedded synced edgeless doc.
|
|
22
|
+
* An overlay lives *inside* that container, so its placement has to be stated
|
|
23
|
+
* in the container's already scaled space, exactly the way
|
|
24
|
+
* `GfxBlockComponent.getCSSTransform` states a block's. Positioning an overlay
|
|
25
|
+
* from `toViewCoord` lets the container apply its scale a second time, and the
|
|
26
|
+
* overlay drifts away from the element it decorates as soon as
|
|
27
|
+
* `viewScale !== 1`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function toOverlayCoord(viewport: {
|
|
30
|
+
viewportX: number;
|
|
31
|
+
viewportY: number;
|
|
32
|
+
zoom: number;
|
|
33
|
+
viewScale: number;
|
|
34
|
+
}, modelX: number, modelY: number): [number, number];
|
|
35
|
+
/**
|
|
36
|
+
* The scale an overlay drawn inside the edgeless container has to wear so that
|
|
37
|
+
* it ends up painted at the viewport zoom. Counterpart of
|
|
38
|
+
* {@link toOverlayCoord}; same reasoning about `viewScale`.
|
|
39
|
+
*/
|
|
40
|
+
export declare function overlayScale(viewport: {
|
|
41
|
+
zoom: number;
|
|
42
|
+
viewScale: number;
|
|
43
|
+
}): number;
|
|
44
|
+
/**
|
|
45
|
+
* How wide and tall the visible viewport is *in the same units as*
|
|
46
|
+
* {@link toOverlayCoord}, so an overlay can tell whether it is about to run off
|
|
47
|
+
* the edge.
|
|
48
|
+
*
|
|
49
|
+
* `Viewport.width` / `Viewport.height` are the bounding client rect, i.e. real
|
|
50
|
+
* screen pixels. Comparing an overlay coordinate against them mixes two spaces
|
|
51
|
+
* and the flip or the clamp fires at the wrong moment under a scaled host.
|
|
52
|
+
*/
|
|
53
|
+
export declare function overlayViewportSize(viewport: {
|
|
54
|
+
width: number;
|
|
55
|
+
height: number;
|
|
56
|
+
viewScale: number;
|
|
57
|
+
}): [number, number];
|
|
58
|
+
/**
|
|
59
|
+
* Where a model point lands in *client* coordinates — what
|
|
60
|
+
* `document.caretRangeFromPoint`, `elementFromPoint` and a `PointerEvent`'s
|
|
61
|
+
* `clientX`/`clientY` speak.
|
|
62
|
+
*
|
|
63
|
+
* `Viewport.toViewCoord` answers relative to the viewport element's own top
|
|
64
|
+
* left corner, so handing its result to a client-coordinate API drops the
|
|
65
|
+
* viewport's offset in the window: the caret lands elsewhere as soon as the
|
|
66
|
+
* editor is not flush against the window origin — a sidebar, a header, or the
|
|
67
|
+
* editor embedded in a panel. Inverse of `Viewport.toViewCoordFromClientCoord`.
|
|
68
|
+
*/
|
|
69
|
+
export declare function toClientCoord(viewport: {
|
|
70
|
+
left: number;
|
|
71
|
+
top: number;
|
|
72
|
+
toViewCoord: (modelX: number, modelY: number) => number[];
|
|
73
|
+
}, modelX: number, modelY: number): [number, number];
|
|
@@ -13,3 +13,61 @@ export function getViewportElement(editorHost) {
|
|
|
13
13
|
return (editorHost.closest('.affine-page-viewport') ??
|
|
14
14
|
editorHost.closest('.affine-edgeless-viewport'));
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Where a model point lands, in CSS pixels, for an overlay drawn *inside* the
|
|
18
|
+
* edgeless container: the selection rectangle, the resize handles, the remote
|
|
19
|
+
* cursors, the text editors mounted over an element.
|
|
20
|
+
*
|
|
21
|
+
* `Viewport.toViewCoord` answers in real screen pixels, so it multiplies by
|
|
22
|
+
* `viewScale` — the CSS scale an outer container puts on the whole editor,
|
|
23
|
+
* which is not 1 in a nested editor such as an embedded synced edgeless doc.
|
|
24
|
+
* An overlay lives *inside* that container, so its placement has to be stated
|
|
25
|
+
* in the container's already scaled space, exactly the way
|
|
26
|
+
* `GfxBlockComponent.getCSSTransform` states a block's. Positioning an overlay
|
|
27
|
+
* from `toViewCoord` lets the container apply its scale a second time, and the
|
|
28
|
+
* overlay drifts away from the element it decorates as soon as
|
|
29
|
+
* `viewScale !== 1`.
|
|
30
|
+
*/
|
|
31
|
+
export function toOverlayCoord(viewport, modelX, modelY) {
|
|
32
|
+
const { viewportX, viewportY, zoom, viewScale } = viewport;
|
|
33
|
+
return [
|
|
34
|
+
((modelX - viewportX) * zoom) / viewScale,
|
|
35
|
+
((modelY - viewportY) * zoom) / viewScale,
|
|
36
|
+
];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The scale an overlay drawn inside the edgeless container has to wear so that
|
|
40
|
+
* it ends up painted at the viewport zoom. Counterpart of
|
|
41
|
+
* {@link toOverlayCoord}; same reasoning about `viewScale`.
|
|
42
|
+
*/
|
|
43
|
+
export function overlayScale(viewport) {
|
|
44
|
+
return viewport.zoom / viewport.viewScale;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* How wide and tall the visible viewport is *in the same units as*
|
|
48
|
+
* {@link toOverlayCoord}, so an overlay can tell whether it is about to run off
|
|
49
|
+
* the edge.
|
|
50
|
+
*
|
|
51
|
+
* `Viewport.width` / `Viewport.height` are the bounding client rect, i.e. real
|
|
52
|
+
* screen pixels. Comparing an overlay coordinate against them mixes two spaces
|
|
53
|
+
* and the flip or the clamp fires at the wrong moment under a scaled host.
|
|
54
|
+
*/
|
|
55
|
+
export function overlayViewportSize(viewport) {
|
|
56
|
+
const { width, height, viewScale } = viewport;
|
|
57
|
+
return [width / viewScale, height / viewScale];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Where a model point lands in *client* coordinates — what
|
|
61
|
+
* `document.caretRangeFromPoint`, `elementFromPoint` and a `PointerEvent`'s
|
|
62
|
+
* `clientX`/`clientY` speak.
|
|
63
|
+
*
|
|
64
|
+
* `Viewport.toViewCoord` answers relative to the viewport element's own top
|
|
65
|
+
* left corner, so handing its result to a client-coordinate API drops the
|
|
66
|
+
* viewport's offset in the window: the caret lands elsewhere as soon as the
|
|
67
|
+
* editor is not flush against the window origin — a sidebar, a header, or the
|
|
68
|
+
* editor embedded in a panel. Inverse of `Viewport.toViewCoordFromClientCoord`.
|
|
69
|
+
*/
|
|
70
|
+
export function toClientCoord(viewport, modelX, modelY) {
|
|
71
|
+
const [x, y] = viewport.toViewCoord(modelX, modelY);
|
|
72
|
+
return [x + viewport.left, y + viewport.top];
|
|
73
|
+
}
|
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Styles injected into the print iframe.
|
|
3
|
+
*
|
|
4
|
+
* The printed document is always rendered on white paper, so the whole
|
|
5
|
+
* palette is pinned to a light one: a document read in the dark theme would
|
|
6
|
+
* otherwise print light text on a background the printer leaves white, and
|
|
7
|
+
* every one of those elements would come out invisible.
|
|
8
|
+
*
|
|
9
|
+
* Exported so the print-fidelity rules can be asserted in unit tests.
|
|
10
|
+
*/
|
|
11
|
+
export declare const printToPdfStyles = "@media print {\n html, body {\n height: initial !important;\n overflow: initial !important;\n print-color-adjust: exact;\n -webkit-print-color-adjust: exact;\n color: #000 !important;\n background: #fff !important;\n color-scheme: light !important;\n }\n ::-webkit-scrollbar {\n display: none;\n }\n :root, body {\n --affine-text-primary: #000 !important;\n --affine-text-secondary: #111 !important;\n --affine-text-tertiary: #333 !important;\n --affine-background-primary: #fff !important;\n --affine-background-secondary: #fff !important;\n --affine-background-tertiary: #fff !important;\n --affine-background-code-block: #f5f5f5 !important;\n --affine-quote-color: #e3e3e3 !important;\n --affine-border-color: #e3e3e3 !important;\n }\n body, [data-theme='dark'] {\n color: #000 !important;\n background: #fff !important;\n }\n body * {\n color: #000 !important;\n -webkit-text-fill-color: #000 !important;\n }\n :root {\n --affine-note-shadow-box: none !important;\n --affine-note-shadow-sticker: none !important;\n }\n }";
|
|
12
|
+
/**
|
|
13
|
+
* Waits until every image inside `container` — shadow roots included — has
|
|
14
|
+
* either decoded or given up.
|
|
15
|
+
*
|
|
16
|
+
* A print dialog opened while images are still in flight prints their empty
|
|
17
|
+
* frames, so this is awaited before handing the document to the printer. An
|
|
18
|
+
* image that fails to load resolves too: a broken picture must not hang the
|
|
19
|
+
* print for ever.
|
|
20
|
+
*/
|
|
21
|
+
export declare function waitForImages(container: HTMLElement): Promise<void>;
|
|
1
22
|
export declare function printToPdf(rootElement?: HTMLElement | null, options?: {
|
|
2
23
|
/**
|
|
3
24
|
* Callback that is called when ready to print.
|