From a0c3ab1f2748f982c1b3397fbda95db1ad1578fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 14 Apr 2025 00:24:24 +0000 Subject: [PATCH 1/2] chore: sync affine blocksuite to packages on Mon Apr 14 00:24:24 UTC 2025 --- packages/affine/all/package.json | 2 + .../__tests__/adapters/markdown.unit.spec.ts | 42 ++ packages/affine/all/src/adapters/extension.ts | 68 ++-- packages/affine/all/src/extensions/store.ts | 20 +- packages/affine/all/src/widgets/linked-doc.ts | 1 + packages/affine/all/tsconfig.json | 61 +-- .../package.json | 0 .../src/adapters/notion-html.ts | 0 .../src/attachment-block.ts | 0 .../src/attachment-edgeless-block.ts | 0 .../src/attachment-service.ts | 0 .../src/attachment-spec.ts | 0 .../src/components/rename-model.ts | 0 .../src/components/styles.ts | 0 .../src/configs/slash-menu.ts | 0 .../src/configs/toolbar.ts | 0 .../src/configs/tooltips.ts | 0 .../src/edgeless-clipboard-config.ts | 0 .../src/effects.ts | 0 .../src/embed.ts | 0 .../src/index.ts | 0 .../src/styles.ts | 0 .../src/utils.ts | 0 .../{block-image => attachment}/tsconfig.json | 6 +- .../affine/blocks/block-frame/tsconfig.json | 20 - .../src/adapters/markdown/preprocessor.ts | 25 -- .../src/edgeless/gfx-tool/template-tool.ts | 11 - .../affine/blocks/block-root/src/types.ts | 44 --- .../src/widgets/inner-modal/inner-modal.ts | 58 --- .../affine/blocks/block-root/tsconfig.json | 55 --- .../{block-bookmark => bookmark}/package.json | 0 .../src/adapters/extension.ts | 0 .../src/adapters/html.ts | 0 .../src/adapters/index.ts | 0 .../src/adapters/markdown.ts | 0 .../src/adapters/notion-html.ts | 0 .../src/adapters/plain-text.ts | 0 .../src/bookmark-block.ts | 0 .../src/bookmark-edgeless-block.ts | 0 .../src/bookmark-spec.ts | 0 .../src/commands/index.ts | 0 .../src/commands/insert-bookmark.ts | 0 .../commands/insert-link-by-quick-search.ts | 0 .../src/components/bookmark-card.ts | 33 +- .../src/components/index.ts | 0 .../src/configs/slash-menu.ts | 0 .../src/configs/toolbar.ts | 0 .../src/configs/tooltips.ts | 0 .../src/edgeless-clipboard-config.ts | 0 .../src/effects.ts | 0 .../{block-bookmark => bookmark}/src/index.ts | 0 .../src/styles.ts | 1 - .../{block-bookmark => bookmark}/src/utils.ts | 0 .../tsconfig.json | 6 +- .../{block-callout => callout}/package.json | 0 .../src/callout-block.ts | 0 .../src/callout-keymap.ts | 0 .../src/callout-spec.ts | 0 .../src/configs/slash-menu.ts | 0 .../src/configs/tooltips.ts | 0 .../{block-callout => callout}/src/effects.ts | 0 .../src/emoji-menu.ts | 0 .../{block-callout => callout}/src/index.ts | 0 .../{block-callout => callout}/tsconfig.json | 2 +- .../blocks/{block-code => code}/package.json | 4 +- .../src/adapters/extension.ts | 0 .../{block-code => code}/src/adapters/html.ts | 0 .../src/adapters/index.ts | 0 .../src/adapters/markdown/index.ts | 0 .../src/adapters/markdown/markdown.ts | 0 .../src/adapters/markdown/preprocessor.ts | 0 .../src/adapters/notion-html.ts | 0 .../src/adapters/plain-text.ts | 0 .../src/code-block-config.ts | 0 .../src/code-block-inline.ts | 0 .../src/code-block-service.ts | 0 .../src/code-block-spec.ts | 0 .../{block-code => code}/src/code-block.ts | 0 .../{block-code => code}/src/code-keymap.ts | 0 .../code-toolbar/components/code-toolbar.ts | 0 .../code-toolbar/components/lang-button.ts | 0 .../src/code-toolbar/config.ts | 0 .../src/code-toolbar/context.ts | 0 .../src/code-toolbar/index.ts | 0 .../src/code-toolbar/utils.ts | 0 .../src/configs/slash-menu.ts | 0 .../{block-code => code}/src/effects.ts | 0 .../src/highlight/affine-code-unit.ts | 4 +- .../src/highlight/const.ts | 0 .../blocks/{block-code => code}/src/index.ts | 2 + .../blocks/{block-code => code}/src/styles.ts | 0 .../code/src/turbo/code-layout-handler.ts | 71 ++++ .../code/src/turbo/code-painter.worker.ts | 53 +++ .../blocks/{block-code => code}/tsconfig.json | 3 +- .../package.json | 0 .../src/block-meta/base.ts | 0 .../src/block-meta/index.ts | 0 .../src/block-meta/todo.ts | 0 .../src/columns/index.ts | 0 .../src/configs/slash-menu.ts | 0 .../src/configs/tooltips.ts | 0 .../src/data-source.ts | 0 .../src/data-view-block.ts | 0 .../src/data-view-model.ts | 0 .../src/data-view-spec.ts | 0 .../src/effects.ts | 0 .../src/index.ts | 0 .../src/views/index.ts | 0 .../tsconfig.json | 4 +- .../{block-database => database}/package.json | 0 .../src/adapters/extension.ts | 0 .../src/adapters/html.ts | 0 .../src/adapters/index.ts | 0 .../src/adapters/markdown.ts | 0 .../src/adapters/notion-html.ts | 0 .../src/adapters/plain-text.ts | 0 .../src/adapters/utils.ts | 0 .../src/block-icons.ts | 0 .../src/commands.ts | 0 .../src/components/layout.ts | 0 .../src/components/title/index.ts | 0 .../src/config.ts | 0 .../src/configs/slash-menu.ts | 0 .../src/configs/tooltips.ts | 0 .../src/context/host-context.ts | 0 .../src/context/index.ts | 0 .../src/data-source.ts | 0 .../src/database-block.ts | 0 .../src/database-dnd-preview-block.ts | 0 .../src/database-spec.ts | 0 .../src/detail-panel/block-renderer.ts | 0 .../src/detail-panel/note-renderer.ts | 0 .../src/effects.ts | 0 .../{block-database => database}/src/index.ts | 0 .../src/properties/converts.ts | 0 .../src/properties/index.ts | 0 .../src/properties/link/cell-renderer.css.ts | 0 .../src/properties/link/cell-renderer.ts | 0 .../src/properties/link/define.ts | 0 .../src/properties/model.ts | 0 .../properties/rich-text/cell-renderer.css.ts | 0 .../src/properties/rich-text/cell-renderer.ts | 0 .../src/properties/rich-text/define.ts | 0 .../src/properties/title/cell-renderer.css.ts | 0 .../src/properties/title/cell-renderer.ts | 0 .../src/properties/title/define.ts | 0 .../src/properties/title/icon.ts | 0 .../src/properties/title/text.ts | 0 .../src/selection.ts | 0 .../src/service/index.ts | 0 .../src/utils/block-utils.ts | 0 .../src/utils/current-view.ts | 0 .../src/utils/title-doc.ts | 0 .../src/views/index.ts | 0 .../src/widgets/index.ts | 0 .../tsconfig.json | 4 +- .../{block-divider => divider}/package.json | 0 .../src/adapters/extension.ts | 0 .../src/adapters/html.ts | 0 .../src/adapters/index.ts | 0 .../src/adapters/markdown.ts | 0 .../src/adapters/notion-html.ts | 0 .../src/adapters/plain-text.ts | 0 .../src/divider-block.ts | 0 .../src/divider-spec.ts | 0 .../{block-divider => divider}/src/effects.ts | 0 .../{block-divider => divider}/src/index.ts | 0 .../{block-divider => divider}/src/styles.ts | 0 .../{block-divider => divider}/tsconfig.json | 0 .../package.json | 0 .../src/edgeless-clipboard-config.ts | 0 .../src/edgeless-text-block.ts | 4 +- .../src/edgeless-text-spec.ts | 0 .../src/edgeless-toolbar/config.ts | 0 .../src/edgeless-toolbar/index.ts | 0 .../src/effects.ts | 0 .../src/index.ts | 0 .../tsconfig.json | 4 +- .../{block-embed => embed}/package.json | 0 .../src/common/adapters/html.ts | 0 .../src/common/adapters/markdown.ts | 0 .../src/common/adapters/notion-html.ts | 0 .../src/common/adapters/plain-text.ts | 0 .../src/common/embed-block-element.ts | 0 .../src/common/embed-note-content-styles.ts | 0 .../src/common/insert-embed-card.ts | 0 .../src/common/render-linked-doc.ts | 0 .../src/common/to-edgeless-embed-block.ts | 0 .../src/common/utils.ts | 0 .../src/configs/toolbar.ts | 0 .../{block-embed => embed}/src/effects.ts | 0 .../embed-figma-block/adapters/extension.ts | 0 .../src/embed-figma-block/adapters/html.ts | 0 .../src/embed-figma-block/adapters/index.ts | 0 .../embed-figma-block/adapters/markdown.ts | 0 .../embed-figma-block/adapters/notion-html.ts | 0 .../embed-figma-block/adapters/plain-text.ts | 0 .../embed-figma-block/configs/slash-menu.ts | 0 .../src/embed-figma-block/configs/tooltips.ts | 0 .../edgeless-clipboard-config.ts | 0 .../embed-edgeless-figma-block.ts | 0 .../embed-figma-block/embed-figma-block.ts | 0 .../embed-figma-block/embed-figma-model.ts | 0 .../embed-figma-block/embed-figma-service.ts | 0 .../src/embed-figma-block/embed-figma-spec.ts | 0 .../src/embed-figma-block/index.ts | 0 .../src/embed-figma-block/styles.ts | 0 .../embed-github-block/adapters/extension.ts | 0 .../src/embed-github-block/adapters/html.ts | 0 .../src/embed-github-block/adapters/index.ts | 0 .../embed-github-block/adapters/markdown.ts | 0 .../adapters/notion-html.ts | 0 .../embed-github-block/adapters/plain-text.ts | 0 .../embed-github-block/configs/slash-menu.ts | 0 .../embed-github-block/configs/tooltips.ts | 0 .../edgeless-clipboard-config.ts | 0 .../embed-edgeless-github-block.ts | 0 .../embed-github-block/embed-github-block.ts | 0 .../embed-github-block/embed-github-model.ts | 0 .../embed-github-service.ts | 0 .../embed-github-block/embed-github-spec.ts | 0 .../src/embed-github-block/index.ts | 0 .../src/embed-github-block/styles.ts | 0 .../src/embed-github-block/utils.ts | 0 .../components/fullscreen-toolbar.ts | 0 .../src/embed-html-block/configs/toolbar.ts | 0 .../src/embed-html-block/configs/tooltips.ts | 0 .../edgeless-clipboard-config.ts | 0 .../embed-edgeless-html-block.ts | 0 .../src/embed-html-block/embed-html-block.ts | 0 .../src/embed-html-block/embed-html-spec.ts | 0 .../src/embed-html-block/index.ts | 0 .../src/embed-html-block/styles.ts | 0 .../src/embed-iframe-block/adapters/html.ts | 0 .../src/embed-iframe-block/adapters/index.ts | 0 .../embed-iframe-block/adapters/markdown.ts | 0 .../embed-iframe-block/adapters/plain-text.ts | 0 .../src/embed-iframe-block/commands/index.ts | 0 .../commands/insert-embed-iframe-with-url.ts | 0 .../commands/insert-empty-embed-iframe.ts | 0 .../components/embed-iframe-error-card.ts | 0 .../components/embed-iframe-idle-card.ts | 0 .../embed-iframe-link-edit-popup.ts | 0 .../embed-iframe-link-input-base.ts | 0 .../embed-iframe-link-input-popup.ts | 0 .../components/embed-iframe-loading-card.ts | 0 .../src/embed-iframe-block/configs/index.ts | 0 .../configs/providers/excalidraw.ts | 0 .../configs/providers/google-docs.ts | 0 .../configs/providers/google-drive.ts | 0 .../configs/providers/index.ts | 0 .../configs/providers/miro.ts | 0 .../configs/providers/spotify.ts | 0 .../configs/slash-menu/slash-menu.ts | 0 .../configs/slash-menu/tooltip.ts | 0 .../src/embed-iframe-block/configs/toolbar.ts | 0 .../src/embed-iframe-block/consts.ts | 0 .../edgeless-clipboard-config.ts | 0 .../embed-edgeless-iframe-block.ts | 0 .../embed-iframe-block/embed-iframe-block.ts | 0 .../embed-iframe-block/embed-iframe-spec.ts | 0 .../src/embed-iframe-block/index.ts | 0 .../src/embed-iframe-block/style.ts | 0 .../src/embed-iframe-block/types.ts | 0 .../src/embed-iframe-block/utils.ts | 0 .../adapters/extension.ts | 0 .../embed-linked-doc-block/adapters/html.ts | 0 .../embed-linked-doc-block/adapters/index.ts | 0 .../adapters/markdown.ts | 0 .../adapters/plain-text.ts | 0 .../embed-linked-doc-block/commands/index.ts | 0 .../commands/insert-embed-linked-doc.ts | 0 .../configs/slash-menu.ts | 22 +- .../embed-linked-doc-block/configs/toolbar.ts | 0 .../configs/tooltips.ts | 0 .../edgeless-clipboard-config.ts | 0 .../embed-edgeless-linked-doc-block.ts | 0 .../embed-linked-doc-block.ts | 0 .../embed-linked-doc-spec.ts | 0 .../src/embed-linked-doc-block/index.ts | 0 .../src/embed-linked-doc-block/styles.ts | 1 + .../src/embed-linked-doc-block/utils.ts | 0 .../embed-loom-block/adapters/extension.ts | 0 .../src/embed-loom-block/adapters/html.ts | 0 .../src/embed-loom-block/adapters/index.ts | 0 .../src/embed-loom-block/adapters/markdown.ts | 0 .../embed-loom-block/adapters/notion-html.ts | 0 .../embed-loom-block/adapters/plain-text.ts | 0 .../embed-loom-block/configs/slash-menu.ts | 0 .../src/embed-loom-block/configs/tooltips.ts | 0 .../edgeless-clipboard-config.ts | 0 .../embed-edgeless-loom-bock.ts | 0 .../src/embed-loom-block/embed-loom-block.ts | 0 .../src/embed-loom-block/embed-loom-model.ts | 0 .../embed-loom-block/embed-loom-service.ts | 0 .../src/embed-loom-block/embed-loom-spec.ts | 0 .../src/embed-loom-block/index.ts | 0 .../src/embed-loom-block/styles.ts | 0 .../src/embed-loom-block/utils.ts | 0 .../adapters/extension.ts | 0 .../embed-synced-doc-block/adapters/html.ts | 0 .../embed-synced-doc-block/adapters/index.ts | 0 .../adapters/markdown.ts | 0 .../adapters/plain-text.ts | 0 .../components/embed-synced-doc-card.ts | 0 .../embed-synced-doc-block/configs/toolbar.ts | 0 .../edgeless-clipboard-config.ts | 0 .../embed-edgeless-synced-doc-block.ts | 0 .../embed-synced-doc-block.ts | 0 .../embed-synced-doc-spec.ts | 0 .../src/embed-synced-doc-block/index.ts | 0 .../src/embed-synced-doc-block/styles.ts | 0 .../src/embed-synced-doc-block/utils.ts | 0 .../embed-youtube-block/adapters/extension.ts | 0 .../src/embed-youtube-block/adapters/html.ts | 0 .../src/embed-youtube-block/adapters/index.ts | 0 .../embed-youtube-block/adapters/markdown.ts | 0 .../adapters/notion-html.ts | 0 .../adapters/plain-text.ts | 0 .../embed-youtube-block/configs/slash-menu.ts | 0 .../embed-youtube-block/configs/tooltips.ts | 0 .../edgeless-clipboard-config.ts | 0 .../embed-edgeless-youtube-block.ts | 0 .../embed-youtube-block.ts | 0 .../embed-youtube-model.ts | 0 .../embed-youtube-service.ts | 0 .../embed-youtube-block/embed-youtube-spec.ts | 0 .../src/embed-youtube-block/index.ts | 0 .../src/embed-youtube-block/styles.ts | 0 .../src/embed-youtube-block/utils.ts | 0 .../{block-embed => embed}/src/index.ts | 0 .../{block-embed => embed}/src/types.ts | 0 .../{block-embed => embed}/tsconfig.json | 4 +- .../{block-frame => frame}/package.json | 0 .../src/edgeless-clipboard-config.ts | 0 .../src/edgeless-toolbar/config.ts | 0 .../src/edgeless-toolbar/frame-dense-menu.ts | 0 .../src/edgeless-toolbar/frame-menu.ts | 0 .../src/edgeless-toolbar/frame-tool-button.ts | 0 .../src/edgeless-toolbar/index.ts | 0 .../edgeless-toolbar/presentation-toolbar.ts | 0 .../src/edgeless-toolbar/quick-tool.ts | 0 .../{block-frame => frame}/src/effects.ts | 0 .../{block-frame => frame}/src/frame-block.ts | 6 +- .../src/frame-highlight-manager.ts | 0 .../src/frame-manager.ts | 0 .../{block-frame => frame}/src/frame-spec.ts | 0 .../{block-frame => frame}/src/frame-tool.ts | 0 .../src/frame-toolbar.ts | 2 +- .../{block-frame => frame}/src/index.ts | 0 .../src/present/frame-order-button.ts | 0 .../src/present/frame-order-menu.ts | 0 .../src/present/navigator-setting-button.ts | 0 .../src/present/present-button.ts | 0 .../{block-frame => frame}/src/preset-tool.ts | 0 .../{block-bookmark => frame}/tsconfig.json | 6 +- .../{block-image => image}/package.json | 4 +- .../src/adapters/extension.ts | 0 .../src/adapters/html.ts | 0 .../src/adapters/index.ts | 0 .../src/adapters/markdown.ts | 0 .../src/adapters/middleware.ts | 0 .../src/adapters/notion-html.ts | 0 .../src/commands/index.ts | 0 .../src/commands/insert-images.ts | 0 .../src/components/image-block-fallback.ts | 0 .../src/components/image-selected-rect.ts | 0 .../src/components/page-image-block.ts | 0 .../src/configs/slash-menu.ts | 0 .../src/configs/toolbar.ts | 0 .../src/configs/tooltips.ts | 0 .../src/edgeless-clipboard-config.ts | 0 .../{block-image => image}/src/effects.ts | 0 .../{block-image => image}/src/image-block.ts | 0 .../src/image-edgeless-block.ts | 0 .../src/image-proxy-service.ts | 0 .../src/image-resize-manager.ts | 0 .../src/image-service.ts | 0 .../{block-image => image}/src/image-spec.ts | 0 .../{block-image => image}/src/index.ts | 2 + .../src/preview-image/edgeless.ts | 0 .../src/preview-image/page.ts | 0 .../{block-image => image}/src/styles.ts | 0 .../image/src/turbo/image-layout-handler.ts | 69 ++++ .../image/src/turbo/image-painter.worker.ts | 56 +++ .../{block-image => image}/src/utils.ts | 0 packages/affine/blocks/image/tsconfig.json | 21 + .../{block-latex => latex}/package.json | 0 .../src/adapters/extension.ts | 0 .../src/adapters/index.ts | 0 .../src/adapters/markdown/index.ts | 0 .../src/adapters/markdown/markdown.ts | 0 .../src/adapters/markdown/preprocessor.ts | 88 +++++ .../src/adapters/notion-html.ts | 0 .../src/adapters/plain-text.ts | 0 .../{block-latex => latex}/src/commands.ts | 0 .../src/configs/slash-menu.ts | 0 .../src/configs/tooltips.ts | 0 .../{block-latex => latex}/src/effects.ts | 0 .../{block-latex => latex}/src/index.ts | 0 .../{block-latex => latex}/src/latex-block.ts | 0 .../{block-latex => latex}/src/latex-spec.ts | 0 .../{block-latex => latex}/src/styles.ts | 0 .../{block-latex => latex}/tsconfig.json | 4 +- .../blocks/{block-list => list}/package.json | 0 .../src/adapters/extension.ts | 0 .../{block-list => list}/src/adapters/html.ts | 0 .../src/adapters/index.ts | 0 .../src/adapters/markdown.ts | 0 .../src/adapters/notion-html.ts | 0 .../src/adapters/plain-text.ts | 0 .../src/commands/convert-to-numbered-list.ts | 0 .../src/commands/dedent-list.ts | 0 .../src/commands/indent-list.ts | 0 .../src/commands/index.ts | 0 .../src/commands/list-to-paragraph.ts | 0 .../src/commands/split-list.ts | 0 .../src/commands/utils.ts | 0 .../{block-list => list}/src/effects.ts | 0 .../blocks/{block-list => list}/src/index.ts | 0 .../{block-list => list}/src/list-block.ts | 0 .../{block-list => list}/src/list-keymap.ts | 0 .../{block-list => list}/src/list-spec.ts | 0 .../blocks/{block-list => list}/src/styles.ts | 0 .../src/turbo/list-layout-handler.ts | 24 +- .../src/turbo/list-painter.worker.ts | 9 +- .../src/utils/forward-delete.ts | 0 .../src/utils/get-list-icon.ts | 0 .../src/utils/get-number-prefix.ts | 0 .../blocks/{block-list => list}/tsconfig.json | 0 .../blocks/{block-note => note}/package.json | 4 +- .../{block-note => note}/src/adapters/html.ts | 0 .../src/adapters/index.ts | 0 .../src/adapters/markdown.ts | 0 .../src/adapters/plain-text.ts | 0 .../src/commands/block-type.ts | 0 .../src/commands/change-note-display-mode.ts | 0 .../src/commands/dedent-block-to-root.ts | 0 .../src/commands/dedent-block.ts | 0 .../src/commands/dedent-blocks-to-root.ts | 0 .../src/commands/dedent-blocks.ts | 0 .../src/commands/indent-block.ts | 0 .../src/commands/indent-blocks.ts | 0 .../src/commands/index.ts | 0 .../src/commands/select-block.ts | 0 .../src/commands/select-blocks-between.ts | 0 .../edgeless-note-background.css.ts | 0 .../components/edgeless-note-background.ts | 0 .../edgeless-note-border-dropdown-menu.ts | 0 ...dgeless-note-display-mode-dropdown-menu.ts | 0 .../src/components/edgeless-note-mask.ts | 0 .../edgeless-note-shadow-dropdown-menu.ts | 0 .../edgeless-page-block-title.css.ts | 0 .../components/edgeless-page-block-title.ts | 0 .../src/components/icons.ts | 0 .../src/components/more-indicator.ts | 0 .../src/components/view-in-page-notify.css.ts | 0 .../blocks/{block-note => note}/src/config.ts | 0 .../src/configs/slash-menu.ts | 0 .../src/configs/toolbar.ts | 0 .../src/configs/tooltips.ts | 0 .../src/edgeless-clipboard-config.ts | 0 .../{block-note => note}/src/effects.ts | 0 .../blocks/{block-note => note}/src/index.ts | 2 + .../{block-note => note}/src/move-block.ts | 0 .../{block-note => note}/src/note-block.ts | 0 .../src/note-edgeless-block.css.ts | 0 .../src/note-edgeless-block.ts | 0 .../{block-note => note}/src/note-keymap.ts | 0 .../{block-note => note}/src/note-spec.ts | 0 .../{block-note => note}/src/quick-action.ts | 0 .../note/src/turbo/note-layout-handler.ts | 81 ++++ .../note/src/turbo/note-painter.worker.ts | 49 +++ .../blocks/{block-note => note}/tsconfig.json | 9 +- .../package.json | 0 .../src/adapters/extension.ts | 0 .../src/adapters/html.ts | 0 .../src/adapters/index.ts | 0 .../src/adapters/markdown.ts | 1 + .../src/adapters/notion-html.ts | 0 .../src/adapters/plain-text.ts | 0 .../src/commands/add-paragraph.ts | 0 .../src/commands/append-paragraph.ts | 0 .../src/commands/dedent-paragraph.ts | 0 .../src/commands/indent-paragraph.ts | 0 .../src/commands/index.ts | 0 .../src/commands/split-paragraph.ts | 0 .../src/effects.ts | 0 .../src/heading-icon.ts | 0 .../src/index.ts | 0 .../src/paragraph-block-config.ts | 0 .../src/paragraph-block.ts | 0 .../src/paragraph-keymap.ts | 0 .../src/paragraph-spec.ts | 0 .../src/styles.ts | 0 .../src/turbo/paragraph-layout-handler.ts | 79 ++-- .../src/turbo/paragraph-painter.worker.ts | 9 +- .../src/utils/forward-delete.ts | 0 .../src/utils/merge-with-prev.ts | 0 .../tsconfig.json | 0 .../blocks/{block-root => root}/package.json | 1 + .../src/adapters/extension.ts | 0 .../{block-root => root}/src/adapters/html.ts | 0 .../src/adapters/index.ts | 0 .../src/adapters/markdown.ts | 0 .../src/adapters/notion-html.ts | 0 .../src/clipboard/index.ts | 0 .../src/clipboard/page-clipboard.ts | 0 .../src/clipboard/readonly-clipboard.ts | 16 +- .../src/common-specs/index.ts | 13 +- .../src/common-specs/widgets.ts | 12 - .../src/configs/toolbar.ts | 0 .../src/edgeless/clipboard/canvas.ts | 0 .../src/edgeless/clipboard/clipboard.ts | 0 .../src/edgeless/clipboard/command.ts | 0 .../src/edgeless/clipboard/utils.ts | 0 .../auto-complete/auto-complete-panel.ts | 0 .../auto-complete/edgeless-auto-complete.ts | 0 .../components/auto-complete/utils.ts | 0 .../edgeless/components/note-slicer/index.ts | 0 .../rects/edgeless-dragging-area-rect.ts | 0 .../rects/edgeless-selected-rect.ts | 0 .../components/resize/resize-handles.ts | 0 .../components/resize/resize-manager.ts | 0 .../components/toolbar/common/slide-menu.ts | 0 .../toolbar/common/toolbar-arrow-up-icon.ts | 0 .../toolbar/default/default-tool-button.ts | 0 .../toolbar/link/link-dense-menu.ts | 0 .../toolbar/link/link-tool-button.ts | 0 .../src/edgeless/components/toolbar/tools.ts | 0 .../src/edgeless/components/utils.ts | 0 .../src/edgeless/configs/toolbar/alignment.ts | 0 .../src/edgeless/configs/toolbar/index.ts | 0 .../src/edgeless/configs/toolbar/misc.ts | 0 .../src/edgeless/configs/toolbar/more.ts | 2 +- .../configs/toolbar/render-linked-doc.ts | 0 .../src/edgeless/configs/toolbar/utils.ts | 0 .../src/edgeless/edgeless-builtin-spec.ts | 2 +- .../src/edgeless/edgeless-keyboard.ts | 3 + .../src/edgeless/edgeless-root-block.ts | 4 +- .../edgeless/edgeless-root-preview-block.ts | 4 +- .../src/edgeless/edgeless-root-service.ts | 0 .../src/edgeless/edgeless-root-spec.ts | 0 .../dblclick-add-edgeless-text.ts | 0 .../element-transform/snap-manager.ts | 0 .../edgeless/gfx-tool/default-tool-ext/ext.ts | 0 .../src/edgeless/gfx-tool/default-tool.ts | 0 .../src/edgeless/gfx-tool/empty-tool.ts | 0 .../src/edgeless/gfx-tool/index.ts | 1 - .../src/edgeless/gfx-tool/pan-tool.ts | 0 .../src/edgeless/index.ts | 0 .../src/edgeless/middlewares/base.ts | 0 .../src/edgeless/utils/clipboard-utils.ts | 0 .../src/edgeless/utils/clone-utils.ts | 0 .../src/edgeless/utils/connector.ts | 16 +- .../src/edgeless/utils/consts.ts | 0 .../src/edgeless/utils/crud.ts | 0 .../src/edgeless/utils/cursors.ts | 0 .../src/edgeless/utils/hotkey-utils.ts | 0 .../src/edgeless/utils/panning-utils.ts | 0 .../src/edgeless/utils/query.ts | 1 + .../src/edgeless/utils/snap-manager.ts | 0 .../{block-root => root}/src/effects.ts | 12 +- .../blocks/{block-root => root}/src/index.ts | 1 - .../src/keyboard/keyboard-manager.ts | 0 .../affine/blocks/root/src/keyboard/keymap.ts | 16 + .../src/page/page-root-block.ts | 4 +- .../src/page/page-root-service.ts | 0 .../src/page/page-root-spec.ts | 3 +- .../src/preview/preview-root-block.ts | 0 .../{block-root => root}/src/root-config.ts | 2 - .../{block-root => root}/src/root-service.ts | 0 packages/affine/blocks/root/src/types.ts | 6 + .../src/utils/callback.ts | 0 .../{block-root => root}/src/utils/index.ts | 0 .../{block-root => root}/src/utils/query.ts | 0 .../{block-root => root}/src/utils/types.ts | 0 .../widgets/edgeless-navigator-bg/index.ts | 0 .../widgets/edgeless-zoom-toolbar/index.ts | 0 .../zoom-bar-toggle-button.ts | 0 .../edgeless-zoom-toolbar/zoom-toolbar.ts | 0 .../{block-root => root}/src/widgets/index.ts | 13 - .../src/widgets/keyboard-toolbar/config.ts | 47 +-- .../src/widgets/keyboard-toolbar/effects.ts | 0 .../src/widgets/keyboard-toolbar/icons.ts | 0 .../src/widgets/keyboard-toolbar/index.ts | 40 +- .../keyboard-toolbar/keyboard-tool-panel.ts | 0 .../keyboard-toolbar/keyboard-toolbar.ts | 14 +- .../keyboard-toolbar/position-controller.ts | 0 .../src/widgets/keyboard-toolbar/styles.ts | 0 .../src/widgets/keyboard-toolbar/utils.ts | 0 .../src/widgets/modal/custom-modal.ts | 0 .../src/widgets/modal/modal.ts | 0 .../page-dragging-area/page-dragging-area.ts | 0 .../viewport-overlay/viewport-overlay.ts | 0 packages/affine/blocks/root/tsconfig.json | 56 +++ .../package.json | 0 .../src/commands.ts | 0 .../src/components/index.ts | 0 .../src/components/placeholder.ts | 0 .../components/surface-ref-toolbar-title.ts | 0 .../src/configs/slash-menu.ts | 0 .../src/configs/toolbar.ts | 0 .../src/configs/tooltips.ts | 0 .../src/effects.ts | 0 .../src/icons.ts | 0 .../src/index.ts | 0 .../src/portal/generic-block.ts | 0 .../src/portal/note.ts | 0 .../src/surface-ref-block-edgeless.ts | 0 .../src/surface-ref-block.ts | 34 +- .../src/surface-ref-spec.ts | 0 .../src/utils.ts | 0 .../tsconfig.json | 6 +- .../{block-surface => surface}/package.json | 0 .../src/__tests__/a-star.unit.spec.ts | 0 .../src/__tests__/bound.unit.spec.ts | 0 .../src/__tests__/graph.unit.spec.ts | 0 .../src/__tests__/math-utils.unit.spec.ts | 0 .../src/__tests__/priority-queue.unit.spec.ts | 0 .../src/__tests__/sort.unit.spec.ts | 0 .../src/adapters/extension.ts | 0 .../src/adapters/html-adapter/html.ts | 0 .../src/adapters/index.ts | 0 .../markdown/element-adapter/index.ts | 0 .../adapters/markdown/element-adapter/type.ts | 0 .../src/adapters/markdown/markdown.ts | 0 .../plain-text/element-adapter/index.ts | 0 .../plain-text/element-adapter/type.ts | 0 .../src/adapters/plain-text/plain-text.ts | 0 .../src/adapters/type.ts | 0 .../src/commands/auto-align.ts | 0 .../src/commands/index.ts | 0 .../src/commands/reassociate-connectors.ts | 0 .../{block-surface => surface}/src/consts.ts | 4 + .../{block-surface => surface}/src/effects.ts | 0 .../src/element-model/base.ts | 0 .../src/element-model/index.ts | 0 .../src/extensions/clipboard-config.ts | 0 .../src/extensions/crud-extension.ts | 0 .../src/extensions/element-renderer.ts | 0 .../export-manager/export-manager.ts | 0 .../export-manager/file-exporter.ts | 0 .../src/extensions/export-manager/index.ts | 0 .../src/extensions/index.ts | 0 .../src/extensions/legacy-slot-extension.ts | 0 .../src/extensions/query.ts | 0 .../{block-surface => surface}/src/index.ts | 0 .../src/managers/connector-manager.ts | 113 +++--- .../src/renderer/canvas-renderer.ts | 0 .../src/renderer/elements/index.ts | 0 .../src/renderer/elements/type.ts | 0 .../src/renderer/overlay.ts | 0 .../src/renderer/tool-overlay.ts | 6 +- .../src/surface-block-void.ts | 0 .../src/surface-block.ts | 0 .../src/surface-model.ts | 0 .../src/surface-spec.ts | 0 .../src/surface-transformer.ts | 0 .../src/utils/a-star.ts | 0 .../src/utils/add-note.ts | 0 .../src/utils/font.ts | 0 .../src/utils/get-bg-grip-gap.ts | 0 .../src/utils/get-last-props-key.ts | 0 .../src/utils/get-surface-block.ts | 0 .../src/utils/graph.ts | 0 .../src/utils/index.ts | 0 .../src/utils/path-data-parser/LICENSE | 0 .../src/utils/path-data-parser/absolutize.ts | 0 .../src/utils/path-data-parser/normalize.ts | 0 .../src/utils/path-data-parser/parser.ts | 0 .../src/utils/points-on-curve/LICENSE | 0 .../utils/points-on-curve/curve-to-bezier.ts | 0 .../src/utils/points-on-curve/index.ts | 0 .../src/utils/points-on-path/LICENSE | 0 .../src/utils/points-on-path/index.ts | 0 .../src/utils/priority-queue.ts | 0 .../src/utils/rough/LICENSE | 0 .../src/utils/rough/canvas.ts | 0 .../src/utils/rough/core.ts | 0 .../src/utils/rough/fillers/dashed-filler.ts | 0 .../src/utils/rough/fillers/dot-filler.ts | 0 .../utils/rough/fillers/filler-interface.ts | 0 .../src/utils/rough/fillers/filler.ts | 0 .../src/utils/rough/fillers/hachure-filler.ts | 0 .../src/utils/rough/fillers/hatch-filler.ts | 0 .../utils/rough/fillers/scan-line-hachure.ts | 0 .../src/utils/rough/fillers/zigzag-filler.ts | 0 .../utils/rough/fillers/zigzag-line-filler.ts | 0 .../src/utils/rough/generator.ts | 0 .../src/utils/rough/geometry.ts | 0 .../src/utils/rough/math.ts | 0 .../src/utils/rough/renderer.ts | 0 .../src/utils/rough/rough.ts | 0 .../src/utils/rough/svg.ts | 0 .../src/utils/sort.ts | 0 .../src/utils/update-xywh.ts | 0 .../src/watchers/connector.ts | 0 .../src/watchers/group.ts | 0 .../{block-surface => surface}/tsconfig.json | 0 .../{block-table => table}/package.json | 0 .../src/adapters/extension.ts | 0 .../src/adapters/html.ts | 0 .../src/adapters/index.ts | 0 .../src/adapters/markdown.ts | 0 .../src/adapters/notion-html.ts | 0 .../src/adapters/plain-text.ts | 0 .../src/adapters/utils.ts | 0 .../src/add-button.css.ts | 0 .../{block-table => table}/src/add-button.ts | 0 .../{block-table => table}/src/color.ts | 0 .../{block-table => table}/src/commands.ts | 0 .../src/configs/slash-menu.ts | 0 .../src/configs/tooltips.ts | 0 .../{block-table => table}/src/consts.ts | 0 .../{block-table => table}/src/effects.ts | 0 .../{block-table => table}/src/index.ts | 0 .../src/selection-controller.ts | 0 .../src/selection-layer.ts | 0 .../src/selection-schema.ts | 0 .../src/table-block.css.ts | 0 .../{block-table => table}/src/table-block.ts | 0 .../src/table-cell.css.ts | 0 .../{block-table => table}/src/table-cell.ts | 0 .../src/table-data-manager.ts | 0 .../{block-table => table}/src/table-spec.ts | 0 .../{block-table => table}/src/utils.ts | 0 .../{block-table => table}/tsconfig.json | 2 +- packages/affine/components/src/icons/text.ts | 4 - .../components/src/toggle-switch/index.ts | 4 +- .../components/src/toolbar/menu-button.ts | 6 + .../tooltip-content-with-shortcut/index.ts | 24 +- .../package.json | 0 .../src/doc-title.ts | 15 +- .../src/effects.ts | 0 .../src/index.ts | 0 .../src/utils.ts | 0 .../tsconfig.json | 4 +- .../package.json | 0 .../src/body/frame-panel-body.ts | 0 .../src/card/frame-card-title-editor.ts | 0 .../src/card/frame-card-title.ts | 0 .../src/card/frame-card.ts | 0 .../src/card/frame-preview.ts | 0 .../src/effects.ts | 0 .../src/frame-panel.ts | 0 .../src/header/frame-panel-header.ts | 0 .../src/header/frames-setting-menu.ts | 0 .../src/index.ts | 0 .../src/utils/drag.ts | 0 .../tsconfig.json | 4 +- .../package.json | 0 .../src/body/outline-notice.css.ts | 0 .../src/body/outline-notice.ts | 0 .../src/body/outline-panel-body.css.ts | 0 .../src/body/outline-panel-body.ts | 0 .../src/card/outline-card.css.ts | 0 .../src/card/outline-card.ts | 0 .../src/card/outline-preview.css.ts | 0 .../src/card/outline-preview.ts | 0 .../src/config.ts | 0 .../src/effects.ts | 0 .../src/header/outline-panel-header.css.ts | 0 .../src/header/outline-panel-header.ts | 0 .../src/header/outline-setting-menu.css.ts | 0 .../src/header/outline-setting-menu.ts | 0 .../src/index.ts | 0 .../src/mobile-outline-panel.ts | 0 .../src/outline-panel.css.ts | 0 .../src/outline-panel.ts | 0 .../src/outline-viewer.ts | 0 .../src/utils/custom-events.ts | 0 .../src/utils/drag.ts | 0 .../src/utils/query.ts | 0 .../src/utils/scroll.ts | 0 .../tsconfig.json | 4 +- .../src/toolbar/components/pen/consts.ts | 29 ++ .../src/toolbar/components/pen/pen-menu.ts | 85 +++-- .../toolbar/components/pen/pen-tool-button.ts | 45 ++- packages/affine/gfx/brush/tsconfig.json | 4 +- packages/affine/gfx/connector/tsconfig.json | 4 +- packages/affine/gfx/group/tsconfig.json | 4 +- .../src/toolbar/mindmap-tool-button.ts | 10 + packages/affine/gfx/mindmap/tsconfig.json | 10 +- .../affine/gfx/note/src/overlay/overlay.ts | 1 - .../affine/gfx/note/src/toolbar/note-menu.ts | 10 +- packages/affine/gfx/note/tsconfig.json | 10 +- .../shape/src/draggable/shape-draggable.ts | 49 ++- packages/affine/gfx/shape/src/shape-tool.ts | 1 - packages/affine/gfx/shape/src/view.ts | 4 +- packages/affine/gfx/shape/tsconfig.json | 4 +- packages/affine/gfx/template/tsconfig.json | 4 +- packages/affine/gfx/text/tsconfig.json | 4 +- .../src/layout/block-layout-provider.ts | 12 +- .../src/painter/painter.worker.ts | 33 +- .../gfx/turbo-renderer/src/renderer-utils.ts | 186 +++++---- .../gfx/turbo-renderer/src/turbo-renderer.ts | 51 ++- .../affine/gfx/turbo-renderer/src/types.ts | 27 +- .../src/footnote-node/footnote-node.ts | 8 +- .../latex/src/latex-node/latex-editor-unit.ts | 4 +- .../latex/src/latex-node/latex-node.ts | 8 +- .../inlines/link/src/link-node/affine-link.ts | 4 +- .../src/link-node/link-popup/link-popup.ts | 121 +++--- .../link/src/link-node/link-popup/styles.ts | 15 +- .../inlines/mention/src/affine-mention.ts | 15 +- .../src/adapters/markdown/markdown-inline.ts | 12 + .../inlines/preset/src/nodes/affine-text.ts | 4 +- .../src/reference-node/reference-node.ts | 10 +- .../affine/model/src/elements/brush/brush.ts | 2 +- .../model/src/elements/mindmap/mindmap.ts | 2 +- .../shared/src/adapters/middlewares/paste.ts | 20 +- .../middlewares/surface-ref-to-embed.ts | 14 +- .../services/auto-clear-selection-service.ts | 12 + packages/affine/shared/src/services/index.ts | 1 + .../src/services/virtual-keyboard-service.ts | 6 + .../package.json | 0 .../components/edgeless-preview/preview.ts | 0 .../src/config.ts | 0 .../src/consts.ts | 0 .../src/drag-handle.ts | 3 - .../src/effects.ts | 0 .../src/helpers/preview-helper.ts | 0 .../src/helpers/rect-helper.ts | 0 .../src/helpers/selection-helper.ts | 0 .../src/index.ts | 0 .../src/middleware/blocks-filter.ts | 0 .../src/middleware/new-id-cross-doc.ts | 0 .../src/middleware/reorder-list.ts | 0 .../src/styles.ts | 0 .../src/utils.ts | 0 .../src/watchers/drag-event-watcher.ts | 282 +++++++------- .../src/watchers/edgeless-watcher.ts | 35 +- .../src/watchers/handle-event-watcher.ts | 0 .../src/watchers/keyboard-event-watcher.ts | 0 .../src/watchers/page-watcher.ts | 0 .../src/watchers/pointer-event-watcher.ts | 0 .../affine/widgets/drag-handle/tsconfig.json | 23 ++ .../package.json | 0 .../src/effects.ts | 0 .../src/index.ts | 0 .../tsconfig.json | 4 +- .../package.json | 0 .../src/button/tool-icon-button.ts | 0 .../src/button/toolbar-button.ts | 0 .../src/config/consts.ts | 0 .../src/config/index.ts | 0 .../src/config/types.ts | 0 .../src/config/utils.ts | 0 .../src/context.ts | 0 .../src/create-popper.ts | 0 .../draggable/draggable-element.controller.ts | 0 .../src/draggable/event-resolver.ts | 0 .../src/draggable/index.ts | 0 .../src/draggable/overlay-factory.ts | 0 .../src/draggable/types.ts | 0 .../src/edgeless-toolbar.ts | 0 .../src/effects.ts | 0 .../src/extension/index.ts | 0 .../src/index.ts | 0 .../src/mixins/index.ts | 0 .../src/mixins/quick-tool.mixin.ts | 0 .../src/mixins/tool.mixin.ts | 0 .../mixins/toolbar-button-with-menu.mixin.ts | 0 .../src/panel/font-family-panel.ts | 0 .../src/panel/font-weight-and-style-panel.ts | 0 .../tsconfig.json | 2 +- .../package.json | 0 .../src/affine-frame-title-widget.ts | 0 .../src/edgeless-frame-title-editor.ts | 0 .../src/effects.ts | 0 .../src/frame-title.ts | 0 .../src/index.ts | 0 .../src/mount-frame-title-editor.ts | 0 .../src/styles.ts | 0 .../tsconfig.json | 0 .../affine/widgets/linked-doc/package.json | 43 +++ .../linked-doc/src}/config.ts | 146 +++---- .../linked-doc/src}/effects.ts | 3 +- .../linked-doc/src}/import-doc/import-doc.ts | 6 +- .../linked-doc/src}/import-doc/index.ts | 0 .../linked-doc/src}/import-doc/loader.ts | 0 .../linked-doc/src}/import-doc/styles.ts | 0 .../affine/widgets/linked-doc/src/index.ts | 4 + .../linked-doc/src}/linked-doc-popover.ts | 14 +- .../linked-doc/src}/mobile-linked-doc-menu.ts | 56 +-- .../linked-doc/src}/styles.ts | 0 .../linked-doc}/src/transformers/html.ts | 0 .../linked-doc}/src/transformers/index.ts | 0 .../linked-doc}/src/transformers/markdown.ts | 0 .../src/transformers/notion-html.ts | 0 .../linked-doc}/src/transformers/utils.ts | 0 .../linked-doc}/src/transformers/zip.ts | 2 +- .../linked-doc/src}/utils.ts | 0 .../linked-doc/src/widget.ts} | 65 ++-- .../affine/widgets/linked-doc/tsconfig.json | 20 + .../package.json | 0 .../src/doc/config.ts | 0 .../src/doc/doc-remote-selection.ts | 0 .../src/doc/index.ts | 0 .../src/doc/utils.ts | 0 .../src/edgeless/index.ts | 0 .../src/effects.ts | 0 .../src/index.ts | 0 .../src/manager/color-picker.ts | 0 .../src/manager/remote-color-manager.ts | 0 .../tsconfig.json | 2 +- .../package.json | 0 .../src/effects.ts | 0 .../src/index.ts | 0 .../src/scroll-anchoring.ts | 0 .../tsconfig.json | 0 .../README.md | 0 .../package.json | 0 .../src/config.ts | 0 .../src/consts.ts | 0 .../src/effects.ts | 0 .../src/extensions.ts | 0 .../src/index.ts | 0 .../src/slash-menu-popover.ts | 0 .../src/styles.ts | 0 .../src/tooltips/copy.ts | 0 .../src/tooltips/delete.ts | 0 .../src/tooltips/empty.ts | 0 .../src/tooltips/index.ts | 0 .../src/tooltips/move-down.ts | 0 .../src/tooltips/move-up.ts | 0 .../src/tooltips/now.ts | 0 .../src/tooltips/today.ts | 0 .../src/tooltips/tomorrow.ts | 0 .../src/tooltips/yesterday.ts | 0 .../src/types.ts | 0 .../src/utils.ts | 0 .../src/widget.ts | 0 .../tsconfig.json | 0 .../{widget-toolbar => toolbar}/package.json | 0 .../src/effects.ts | 0 .../{widget-toolbar => toolbar}/src/index.ts | 0 .../src/toolbar.ts | 7 +- .../{widget-toolbar => toolbar}/src/utils.ts | 5 + .../{widget-toolbar => toolbar}/tsconfig.json | 6 +- .../widgets/widget-drag-handle/tsconfig.json | 23 -- .../std/gfx/functions/generateKeyBetween.md | 2 +- .../std/gfx/functions/generateNKeysBetween.md | 2 +- .../std/index/functions/KeymapExtension.md | 2 +- .../api/@blocksuite/store/classes/Store.md | 18 +- .../api/@blocksuite/store/classes/Text.md | 8 +- packages/framework/global/src/gfx/math.ts | 37 +- .../framework/global/src/gfx/model/bound.ts | 9 +- .../framework/global/src/gfx/model/vec.ts | 2 + .../src/__tests__/editor-host.unit.spec.ts | 2 + .../src/__tests__/gfx/surface.unit.spec.ts | 358 ++++++++++++++++++ .../std/src/__tests__/gfx/view.unit.spec.ts | 134 +++++++ .../framework/std/src/__tests__/test-block.ts | 22 +- .../std/src/__tests__/test-gfx-element.ts | 44 +++ .../std/src/__tests__/test-schema.ts | 66 +++- .../framework/std/src/__tests__/test-spec.ts | 4 + .../element-transform/transform-manager.ts | 4 +- packages/framework/std/src/gfx/view/view.ts | 4 +- packages/framework/std/src/gfx/viewport.ts | 7 +- .../std/src/inline/components/v-element.ts | 4 +- .../std/src/inline/components/v-line.ts | 6 +- .../std/src/inline/components/v-text.ts | 4 +- packages/framework/std/src/inline/consts.ts | 5 +- .../std/src/inline/range/range-binding.ts | 4 +- .../std/src/inline/utils/point-conversion.ts | 4 +- .../framework/std/src/inline/utils/text.ts | 4 +- .../std/src/view/element/block-component.ts | 10 +- .../src/view/element/gfx-block-component.ts | 8 +- packages/framework/tsconfig.json | 21 - .../__tests__/edgeless/surface-model.spec.ts | 268 +------------ .../src/__tests__/main/snapshot.spec.ts | 2 +- .../src/__tests__/utils/renderer-entry.ts | 4 + .../src/__tests__/utils/setup.ts | 2 +- .../utils/turbo-painter-entry.worker.ts | 4 - .../__tests__/utils/turbo-painter.worker.ts | 12 + .../_common/components/starter-debug-menu.ts | 16 +- .../apps/starter/data/affine-snapshot.ts | 2 +- .../playground/apps/starter/data/preset.ts | 2 +- .../playground/apps/starter/data/synced.ts | 2 +- .../playground/examples/inline/test-page.ts | 11 +- 980 files changed, 2772 insertions(+), 1623 deletions(-) create mode 100644 packages/affine/all/src/widgets/linked-doc.ts rename packages/affine/blocks/{block-attachment => attachment}/package.json (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/attachment-block.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/attachment-edgeless-block.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/attachment-service.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/attachment-spec.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/components/rename-model.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/components/styles.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/configs/toolbar.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/effects.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/embed.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/index.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/styles.ts (100%) rename packages/affine/blocks/{block-attachment => attachment}/src/utils.ts (100%) rename packages/affine/blocks/{block-image => attachment}/tsconfig.json (78%) delete mode 100644 packages/affine/blocks/block-frame/tsconfig.json delete mode 100644 packages/affine/blocks/block-latex/src/adapters/markdown/preprocessor.ts delete mode 100644 packages/affine/blocks/block-root/src/edgeless/gfx-tool/template-tool.ts delete mode 100644 packages/affine/blocks/block-root/src/types.ts delete mode 100644 packages/affine/blocks/block-root/src/widgets/inner-modal/inner-modal.ts delete mode 100644 packages/affine/blocks/block-root/tsconfig.json rename packages/affine/blocks/{block-bookmark => bookmark}/package.json (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/adapters/extension.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/adapters/html.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/bookmark-block.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/bookmark-edgeless-block.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/bookmark-spec.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/commands/index.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/commands/insert-bookmark.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/commands/insert-link-by-quick-search.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/components/bookmark-card.ts (83%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/components/index.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/configs/toolbar.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/effects.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/index.ts (100%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/styles.ts (99%) rename packages/affine/blocks/{block-bookmark => bookmark}/src/utils.ts (100%) rename packages/affine/blocks/{block-attachment => bookmark}/tsconfig.json (78%) rename packages/affine/blocks/{block-callout => callout}/package.json (100%) rename packages/affine/blocks/{block-callout => callout}/src/callout-block.ts (100%) rename packages/affine/blocks/{block-callout => callout}/src/callout-keymap.ts (100%) rename packages/affine/blocks/{block-callout => callout}/src/callout-spec.ts (100%) rename packages/affine/blocks/{block-callout => callout}/src/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-callout => callout}/src/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-callout => callout}/src/effects.ts (100%) rename packages/affine/blocks/{block-callout => callout}/src/emoji-menu.ts (100%) rename packages/affine/blocks/{block-callout => callout}/src/index.ts (100%) rename packages/affine/blocks/{block-callout => callout}/tsconfig.json (91%) rename packages/affine/blocks/{block-code => code}/package.json (89%) rename packages/affine/blocks/{block-code => code}/src/adapters/extension.ts (100%) rename packages/affine/blocks/{block-code => code}/src/adapters/html.ts (100%) rename packages/affine/blocks/{block-code => code}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-code => code}/src/adapters/markdown/index.ts (100%) rename packages/affine/blocks/{block-code => code}/src/adapters/markdown/markdown.ts (100%) rename packages/affine/blocks/{block-code => code}/src/adapters/markdown/preprocessor.ts (100%) rename packages/affine/blocks/{block-code => code}/src/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-code => code}/src/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-block-config.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-block-inline.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-block-service.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-block-spec.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-block.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-keymap.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-toolbar/components/code-toolbar.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-toolbar/components/lang-button.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-toolbar/config.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-toolbar/context.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-toolbar/index.ts (100%) rename packages/affine/blocks/{block-code => code}/src/code-toolbar/utils.ts (100%) rename packages/affine/blocks/{block-code => code}/src/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-code => code}/src/effects.ts (100%) rename packages/affine/blocks/{block-code => code}/src/highlight/affine-code-unit.ts (97%) rename packages/affine/blocks/{block-code => code}/src/highlight/const.ts (100%) rename packages/affine/blocks/{block-code => code}/src/index.ts (64%) rename packages/affine/blocks/{block-code => code}/src/styles.ts (100%) create mode 100644 packages/affine/blocks/code/src/turbo/code-layout-handler.ts create mode 100644 packages/affine/blocks/code/src/turbo/code-painter.worker.ts rename packages/affine/blocks/{block-code => code}/tsconfig.json (87%) rename packages/affine/blocks/{block-data-view => data-view}/package.json (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/block-meta/base.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/block-meta/index.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/block-meta/todo.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/columns/index.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/data-source.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/data-view-block.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/data-view-model.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/data-view-spec.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/effects.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/index.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/src/views/index.ts (100%) rename packages/affine/blocks/{block-data-view => data-view}/tsconfig.json (84%) rename packages/affine/blocks/{block-database => database}/package.json (100%) rename packages/affine/blocks/{block-database => database}/src/adapters/extension.ts (100%) rename packages/affine/blocks/{block-database => database}/src/adapters/html.ts (100%) rename packages/affine/blocks/{block-database => database}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-database => database}/src/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-database => database}/src/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-database => database}/src/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-database => database}/src/adapters/utils.ts (100%) rename packages/affine/blocks/{block-database => database}/src/block-icons.ts (100%) rename packages/affine/blocks/{block-database => database}/src/commands.ts (100%) rename packages/affine/blocks/{block-database => database}/src/components/layout.ts (100%) rename packages/affine/blocks/{block-database => database}/src/components/title/index.ts (100%) rename packages/affine/blocks/{block-database => database}/src/config.ts (100%) rename packages/affine/blocks/{block-database => database}/src/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-database => database}/src/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-database => database}/src/context/host-context.ts (100%) rename packages/affine/blocks/{block-database => database}/src/context/index.ts (100%) rename packages/affine/blocks/{block-database => database}/src/data-source.ts (100%) rename packages/affine/blocks/{block-database => database}/src/database-block.ts (100%) rename packages/affine/blocks/{block-database => database}/src/database-dnd-preview-block.ts (100%) rename packages/affine/blocks/{block-database => database}/src/database-spec.ts (100%) rename packages/affine/blocks/{block-database => database}/src/detail-panel/block-renderer.ts (100%) rename packages/affine/blocks/{block-database => database}/src/detail-panel/note-renderer.ts (100%) rename packages/affine/blocks/{block-database => database}/src/effects.ts (100%) rename packages/affine/blocks/{block-database => database}/src/index.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/converts.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/index.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/link/cell-renderer.css.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/link/cell-renderer.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/link/define.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/model.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/rich-text/cell-renderer.css.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/rich-text/cell-renderer.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/rich-text/define.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/title/cell-renderer.css.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/title/cell-renderer.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/title/define.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/title/icon.ts (100%) rename packages/affine/blocks/{block-database => database}/src/properties/title/text.ts (100%) rename packages/affine/blocks/{block-database => database}/src/selection.ts (100%) rename packages/affine/blocks/{block-database => database}/src/service/index.ts (100%) rename packages/affine/blocks/{block-database => database}/src/utils/block-utils.ts (100%) rename packages/affine/blocks/{block-database => database}/src/utils/current-view.ts (100%) rename packages/affine/blocks/{block-database => database}/src/utils/title-doc.ts (100%) rename packages/affine/blocks/{block-database => database}/src/views/index.ts (100%) rename packages/affine/blocks/{block-database => database}/src/widgets/index.ts (100%) rename packages/affine/blocks/{block-database => database}/tsconfig.json (86%) rename packages/affine/blocks/{block-divider => divider}/package.json (100%) rename packages/affine/blocks/{block-divider => divider}/src/adapters/extension.ts (100%) rename packages/affine/blocks/{block-divider => divider}/src/adapters/html.ts (100%) rename packages/affine/blocks/{block-divider => divider}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-divider => divider}/src/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-divider => divider}/src/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-divider => divider}/src/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-divider => divider}/src/divider-block.ts (100%) rename packages/affine/blocks/{block-divider => divider}/src/divider-spec.ts (100%) rename packages/affine/blocks/{block-divider => divider}/src/effects.ts (100%) rename packages/affine/blocks/{block-divider => divider}/src/index.ts (100%) rename packages/affine/blocks/{block-divider => divider}/src/styles.ts (100%) rename packages/affine/blocks/{block-divider => divider}/tsconfig.json (100%) rename packages/affine/blocks/{block-edgeless-text => edgeless-text}/package.json (100%) rename packages/affine/blocks/{block-edgeless-text => edgeless-text}/src/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-edgeless-text => edgeless-text}/src/edgeless-text-block.ts (99%) rename packages/affine/blocks/{block-edgeless-text => edgeless-text}/src/edgeless-text-spec.ts (100%) rename packages/affine/blocks/{block-edgeless-text => edgeless-text}/src/edgeless-toolbar/config.ts (100%) rename packages/affine/blocks/{block-edgeless-text => edgeless-text}/src/edgeless-toolbar/index.ts (100%) rename packages/affine/blocks/{block-edgeless-text => edgeless-text}/src/effects.ts (100%) rename packages/affine/blocks/{block-edgeless-text => edgeless-text}/src/index.ts (100%) rename packages/affine/blocks/{block-edgeless-text => edgeless-text}/tsconfig.json (85%) rename packages/affine/blocks/{block-embed => embed}/package.json (100%) rename packages/affine/blocks/{block-embed => embed}/src/common/adapters/html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/common/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/common/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/common/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/common/embed-block-element.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/common/embed-note-content-styles.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/common/insert-embed-card.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/common/render-linked-doc.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/common/to-edgeless-embed-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/common/utils.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/configs/toolbar.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/effects.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/adapters/extension.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/adapters/html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/adapters/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/embed-edgeless-figma-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/embed-figma-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/embed-figma-model.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/embed-figma-service.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/embed-figma-spec.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-figma-block/styles.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/adapters/extension.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/adapters/html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/adapters/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/embed-edgeless-github-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/embed-github-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/embed-github-model.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/embed-github-service.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/embed-github-spec.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/styles.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-github-block/utils.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-html-block/components/fullscreen-toolbar.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-html-block/configs/toolbar.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-html-block/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-html-block/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-html-block/embed-edgeless-html-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-html-block/embed-html-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-html-block/embed-html-spec.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-html-block/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-html-block/styles.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/adapters/html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/adapters/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/commands/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/commands/insert-embed-iframe-with-url.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/commands/insert-empty-embed-iframe.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/components/embed-iframe-error-card.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/components/embed-iframe-idle-card.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/components/embed-iframe-link-edit-popup.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/components/embed-iframe-link-input-base.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/components/embed-iframe-link-input-popup.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/components/embed-iframe-loading-card.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/configs/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/configs/providers/excalidraw.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/configs/providers/google-docs.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/configs/providers/google-drive.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/configs/providers/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/configs/providers/miro.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/configs/providers/spotify.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/configs/slash-menu/slash-menu.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/configs/slash-menu/tooltip.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/configs/toolbar.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/consts.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/embed-edgeless-iframe-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/embed-iframe-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/embed-iframe-spec.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/style.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/types.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-iframe-block/utils.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/adapters/extension.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/adapters/html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/adapters/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/commands/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/commands/insert-embed-linked-doc.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/configs/slash-menu.ts (77%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/configs/toolbar.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/embed-edgeless-linked-doc-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/embed-linked-doc-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/embed-linked-doc-spec.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/styles.ts (99%) rename packages/affine/blocks/{block-embed => embed}/src/embed-linked-doc-block/utils.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/adapters/extension.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/adapters/html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/adapters/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/embed-edgeless-loom-bock.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/embed-loom-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/embed-loom-model.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/embed-loom-service.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/embed-loom-spec.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/styles.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-loom-block/utils.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/adapters/extension.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/adapters/html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/adapters/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/components/embed-synced-doc-card.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/configs/toolbar.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/embed-edgeless-synced-doc-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/embed-synced-doc-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/embed-synced-doc-spec.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/styles.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-synced-doc-block/utils.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/adapters/extension.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/adapters/html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/adapters/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/embed-edgeless-youtube-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/embed-youtube-block.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/embed-youtube-model.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/embed-youtube-service.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/embed-youtube-spec.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/styles.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/embed-youtube-block/utils.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/index.ts (100%) rename packages/affine/blocks/{block-embed => embed}/src/types.ts (100%) rename packages/affine/blocks/{block-embed => embed}/tsconfig.json (85%) rename packages/affine/blocks/{block-frame => frame}/package.json (100%) rename packages/affine/blocks/{block-frame => frame}/src/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/edgeless-toolbar/config.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/edgeless-toolbar/frame-dense-menu.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/edgeless-toolbar/frame-menu.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/edgeless-toolbar/frame-tool-button.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/edgeless-toolbar/index.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/edgeless-toolbar/presentation-toolbar.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/edgeless-toolbar/quick-tool.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/effects.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/frame-block.ts (96%) rename packages/affine/blocks/{block-frame => frame}/src/frame-highlight-manager.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/frame-manager.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/frame-spec.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/frame-tool.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/frame-toolbar.ts (98%) rename packages/affine/blocks/{block-frame => frame}/src/index.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/present/frame-order-button.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/present/frame-order-menu.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/present/navigator-setting-button.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/present/present-button.ts (100%) rename packages/affine/blocks/{block-frame => frame}/src/preset-tool.ts (100%) rename packages/affine/blocks/{block-bookmark => frame}/tsconfig.json (78%) rename packages/affine/blocks/{block-image => image}/package.json (87%) rename packages/affine/blocks/{block-image => image}/src/adapters/extension.ts (100%) rename packages/affine/blocks/{block-image => image}/src/adapters/html.ts (100%) rename packages/affine/blocks/{block-image => image}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-image => image}/src/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-image => image}/src/adapters/middleware.ts (100%) rename packages/affine/blocks/{block-image => image}/src/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-image => image}/src/commands/index.ts (100%) rename packages/affine/blocks/{block-image => image}/src/commands/insert-images.ts (100%) rename packages/affine/blocks/{block-image => image}/src/components/image-block-fallback.ts (100%) rename packages/affine/blocks/{block-image => image}/src/components/image-selected-rect.ts (100%) rename packages/affine/blocks/{block-image => image}/src/components/page-image-block.ts (100%) rename packages/affine/blocks/{block-image => image}/src/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-image => image}/src/configs/toolbar.ts (100%) rename packages/affine/blocks/{block-image => image}/src/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-image => image}/src/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-image => image}/src/effects.ts (100%) rename packages/affine/blocks/{block-image => image}/src/image-block.ts (100%) rename packages/affine/blocks/{block-image => image}/src/image-edgeless-block.ts (100%) rename packages/affine/blocks/{block-image => image}/src/image-proxy-service.ts (100%) rename packages/affine/blocks/{block-image => image}/src/image-resize-manager.ts (100%) rename packages/affine/blocks/{block-image => image}/src/image-service.ts (100%) rename packages/affine/blocks/{block-image => image}/src/image-spec.ts (100%) rename packages/affine/blocks/{block-image => image}/src/index.ts (83%) rename packages/affine/blocks/{block-image => image}/src/preview-image/edgeless.ts (100%) rename packages/affine/blocks/{block-image => image}/src/preview-image/page.ts (100%) rename packages/affine/blocks/{block-image => image}/src/styles.ts (100%) create mode 100644 packages/affine/blocks/image/src/turbo/image-layout-handler.ts create mode 100644 packages/affine/blocks/image/src/turbo/image-painter.worker.ts rename packages/affine/blocks/{block-image => image}/src/utils.ts (100%) create mode 100644 packages/affine/blocks/image/tsconfig.json rename packages/affine/blocks/{block-latex => latex}/package.json (100%) rename packages/affine/blocks/{block-latex => latex}/src/adapters/extension.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/adapters/markdown/index.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/adapters/markdown/markdown.ts (100%) create mode 100644 packages/affine/blocks/latex/src/adapters/markdown/preprocessor.ts rename packages/affine/blocks/{block-latex => latex}/src/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/commands.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/effects.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/index.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/latex-block.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/latex-spec.ts (100%) rename packages/affine/blocks/{block-latex => latex}/src/styles.ts (100%) rename packages/affine/blocks/{block-latex => latex}/tsconfig.json (86%) rename packages/affine/blocks/{block-list => list}/package.json (100%) rename packages/affine/blocks/{block-list => list}/src/adapters/extension.ts (100%) rename packages/affine/blocks/{block-list => list}/src/adapters/html.ts (100%) rename packages/affine/blocks/{block-list => list}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-list => list}/src/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-list => list}/src/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-list => list}/src/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-list => list}/src/commands/convert-to-numbered-list.ts (100%) rename packages/affine/blocks/{block-list => list}/src/commands/dedent-list.ts (100%) rename packages/affine/blocks/{block-list => list}/src/commands/indent-list.ts (100%) rename packages/affine/blocks/{block-list => list}/src/commands/index.ts (100%) rename packages/affine/blocks/{block-list => list}/src/commands/list-to-paragraph.ts (100%) rename packages/affine/blocks/{block-list => list}/src/commands/split-list.ts (100%) rename packages/affine/blocks/{block-list => list}/src/commands/utils.ts (100%) rename packages/affine/blocks/{block-list => list}/src/effects.ts (100%) rename packages/affine/blocks/{block-list => list}/src/index.ts (100%) rename packages/affine/blocks/{block-list => list}/src/list-block.ts (100%) rename packages/affine/blocks/{block-list => list}/src/list-keymap.ts (100%) rename packages/affine/blocks/{block-list => list}/src/list-spec.ts (100%) rename packages/affine/blocks/{block-list => list}/src/styles.ts (100%) rename packages/affine/blocks/{block-list => list}/src/turbo/list-layout-handler.ts (87%) rename packages/affine/blocks/{block-list => list}/src/turbo/list-painter.worker.ts (94%) rename packages/affine/blocks/{block-list => list}/src/utils/forward-delete.ts (100%) rename packages/affine/blocks/{block-list => list}/src/utils/get-list-icon.ts (100%) rename packages/affine/blocks/{block-list => list}/src/utils/get-number-prefix.ts (100%) rename packages/affine/blocks/{block-list => list}/tsconfig.json (100%) rename packages/affine/blocks/{block-note => note}/package.json (89%) rename packages/affine/blocks/{block-note => note}/src/adapters/html.ts (100%) rename packages/affine/blocks/{block-note => note}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-note => note}/src/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-note => note}/src/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-note => note}/src/commands/block-type.ts (100%) rename packages/affine/blocks/{block-note => note}/src/commands/change-note-display-mode.ts (100%) rename packages/affine/blocks/{block-note => note}/src/commands/dedent-block-to-root.ts (100%) rename packages/affine/blocks/{block-note => note}/src/commands/dedent-block.ts (100%) rename packages/affine/blocks/{block-note => note}/src/commands/dedent-blocks-to-root.ts (100%) rename packages/affine/blocks/{block-note => note}/src/commands/dedent-blocks.ts (100%) rename packages/affine/blocks/{block-note => note}/src/commands/indent-block.ts (100%) rename packages/affine/blocks/{block-note => note}/src/commands/indent-blocks.ts (100%) rename packages/affine/blocks/{block-note => note}/src/commands/index.ts (100%) rename packages/affine/blocks/{block-note => note}/src/commands/select-block.ts (100%) rename packages/affine/blocks/{block-note => note}/src/commands/select-blocks-between.ts (100%) rename packages/affine/blocks/{block-note => note}/src/components/edgeless-note-background.css.ts (100%) rename packages/affine/blocks/{block-note => note}/src/components/edgeless-note-background.ts (100%) rename packages/affine/blocks/{block-note => note}/src/components/edgeless-note-border-dropdown-menu.ts (100%) rename packages/affine/blocks/{block-note => note}/src/components/edgeless-note-display-mode-dropdown-menu.ts (100%) rename packages/affine/blocks/{block-note => note}/src/components/edgeless-note-mask.ts (100%) rename packages/affine/blocks/{block-note => note}/src/components/edgeless-note-shadow-dropdown-menu.ts (100%) rename packages/affine/blocks/{block-note => note}/src/components/edgeless-page-block-title.css.ts (100%) rename packages/affine/blocks/{block-note => note}/src/components/edgeless-page-block-title.ts (100%) rename packages/affine/blocks/{block-note => note}/src/components/icons.ts (100%) rename packages/affine/blocks/{block-note => note}/src/components/more-indicator.ts (100%) rename packages/affine/blocks/{block-note => note}/src/components/view-in-page-notify.css.ts (100%) rename packages/affine/blocks/{block-note => note}/src/config.ts (100%) rename packages/affine/blocks/{block-note => note}/src/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-note => note}/src/configs/toolbar.ts (100%) rename packages/affine/blocks/{block-note => note}/src/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-note => note}/src/edgeless-clipboard-config.ts (100%) rename packages/affine/blocks/{block-note => note}/src/effects.ts (100%) rename packages/affine/blocks/{block-note => note}/src/index.ts (75%) rename packages/affine/blocks/{block-note => note}/src/move-block.ts (100%) rename packages/affine/blocks/{block-note => note}/src/note-block.ts (100%) rename packages/affine/blocks/{block-note => note}/src/note-edgeless-block.css.ts (100%) rename packages/affine/blocks/{block-note => note}/src/note-edgeless-block.ts (100%) rename packages/affine/blocks/{block-note => note}/src/note-keymap.ts (100%) rename packages/affine/blocks/{block-note => note}/src/note-spec.ts (100%) rename packages/affine/blocks/{block-note => note}/src/quick-action.ts (100%) create mode 100644 packages/affine/blocks/note/src/turbo/note-layout-handler.ts create mode 100644 packages/affine/blocks/note/src/turbo/note-painter.worker.ts rename packages/affine/blocks/{block-note => note}/tsconfig.json (73%) rename packages/affine/blocks/{block-paragraph => paragraph}/package.json (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/adapters/extension.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/adapters/html.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/adapters/markdown.ts (99%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/commands/add-paragraph.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/commands/append-paragraph.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/commands/dedent-paragraph.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/commands/indent-paragraph.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/commands/index.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/commands/split-paragraph.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/effects.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/heading-icon.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/index.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/paragraph-block-config.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/paragraph-block.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/paragraph-keymap.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/paragraph-spec.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/styles.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/turbo/paragraph-layout-handler.ts (53%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/turbo/paragraph-painter.worker.ts (94%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/utils/forward-delete.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/src/utils/merge-with-prev.ts (100%) rename packages/affine/blocks/{block-paragraph => paragraph}/tsconfig.json (100%) rename packages/affine/blocks/{block-root => root}/package.json (98%) rename packages/affine/blocks/{block-root => root}/src/adapters/extension.ts (100%) rename packages/affine/blocks/{block-root => root}/src/adapters/html.ts (100%) rename packages/affine/blocks/{block-root => root}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-root => root}/src/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-root => root}/src/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-root => root}/src/clipboard/index.ts (100%) rename packages/affine/blocks/{block-root => root}/src/clipboard/page-clipboard.ts (100%) rename packages/affine/blocks/{block-root => root}/src/clipboard/readonly-clipboard.ts (98%) rename packages/affine/blocks/{block-root => root}/src/common-specs/index.ts (91%) rename packages/affine/blocks/{block-root => root}/src/common-specs/widgets.ts (55%) rename packages/affine/blocks/{block-root => root}/src/configs/toolbar.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/clipboard/canvas.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/clipboard/clipboard.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/clipboard/command.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/clipboard/utils.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/auto-complete/auto-complete-panel.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/auto-complete/edgeless-auto-complete.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/auto-complete/utils.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/note-slicer/index.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/rects/edgeless-dragging-area-rect.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/rects/edgeless-selected-rect.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/resize/resize-handles.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/resize/resize-manager.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/toolbar/common/slide-menu.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/toolbar/common/toolbar-arrow-up-icon.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/toolbar/default/default-tool-button.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/toolbar/link/link-dense-menu.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/toolbar/link/link-tool-button.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/toolbar/tools.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/components/utils.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/configs/toolbar/alignment.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/configs/toolbar/index.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/configs/toolbar/misc.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/configs/toolbar/more.ts (99%) rename packages/affine/blocks/{block-root => root}/src/edgeless/configs/toolbar/render-linked-doc.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/configs/toolbar/utils.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/edgeless-builtin-spec.ts (97%) rename packages/affine/blocks/{block-root => root}/src/edgeless/edgeless-keyboard.ts (99%) rename packages/affine/blocks/{block-root => root}/src/edgeless/edgeless-root-block.ts (99%) rename packages/affine/blocks/{block-root => root}/src/edgeless/edgeless-root-preview-block.ts (98%) rename packages/affine/blocks/{block-root => root}/src/edgeless/edgeless-root-service.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/edgeless-root-spec.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/element-transform/dblclick-add-edgeless-text.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/element-transform/snap-manager.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/gfx-tool/default-tool-ext/ext.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/gfx-tool/default-tool.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/gfx-tool/empty-tool.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/gfx-tool/index.ts (75%) rename packages/affine/blocks/{block-root => root}/src/edgeless/gfx-tool/pan-tool.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/index.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/middlewares/base.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/utils/clipboard-utils.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/utils/clone-utils.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/utils/connector.ts (63%) rename packages/affine/blocks/{block-root => root}/src/edgeless/utils/consts.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/utils/crud.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/utils/cursors.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/utils/hotkey-utils.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/utils/panning-utils.ts (100%) rename packages/affine/blocks/{block-root => root}/src/edgeless/utils/query.ts (99%) rename packages/affine/blocks/{block-root => root}/src/edgeless/utils/snap-manager.ts (100%) rename packages/affine/blocks/{block-root => root}/src/effects.ts (93%) rename packages/affine/blocks/{block-root => root}/src/index.ts (93%) rename packages/affine/blocks/{block-root => root}/src/keyboard/keyboard-manager.ts (100%) create mode 100644 packages/affine/blocks/root/src/keyboard/keymap.ts rename packages/affine/blocks/{block-root => root}/src/page/page-root-block.ts (99%) rename packages/affine/blocks/{block-root => root}/src/page/page-root-service.ts (100%) rename packages/affine/blocks/{block-root => root}/src/page/page-root-spec.ts (93%) rename packages/affine/blocks/{block-root => root}/src/preview/preview-root-block.ts (100%) rename packages/affine/blocks/{block-root => root}/src/root-config.ts (73%) rename packages/affine/blocks/{block-root => root}/src/root-service.ts (100%) create mode 100644 packages/affine/blocks/root/src/types.ts rename packages/affine/blocks/{block-root => root}/src/utils/callback.ts (100%) rename packages/affine/blocks/{block-root => root}/src/utils/index.ts (100%) rename packages/affine/blocks/{block-root => root}/src/utils/query.ts (100%) rename packages/affine/blocks/{block-root => root}/src/utils/types.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/edgeless-navigator-bg/index.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/edgeless-zoom-toolbar/index.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/edgeless-zoom-toolbar/zoom-bar-toggle-button.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/edgeless-zoom-toolbar/zoom-toolbar.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/index.ts (50%) rename packages/affine/blocks/{block-root => root}/src/widgets/keyboard-toolbar/config.ts (95%) rename packages/affine/blocks/{block-root => root}/src/widgets/keyboard-toolbar/effects.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/keyboard-toolbar/icons.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/keyboard-toolbar/index.ts (82%) rename packages/affine/blocks/{block-root => root}/src/widgets/keyboard-toolbar/keyboard-tool-panel.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/keyboard-toolbar/keyboard-toolbar.ts (95%) rename packages/affine/blocks/{block-root => root}/src/widgets/keyboard-toolbar/position-controller.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/keyboard-toolbar/styles.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/keyboard-toolbar/utils.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/modal/custom-modal.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/modal/modal.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/page-dragging-area/page-dragging-area.ts (100%) rename packages/affine/blocks/{block-root => root}/src/widgets/viewport-overlay/viewport-overlay.ts (100%) create mode 100644 packages/affine/blocks/root/tsconfig.json rename packages/affine/blocks/{block-surface-ref => surface-ref}/package.json (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/commands.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/components/index.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/components/placeholder.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/components/surface-ref-toolbar-title.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/configs/toolbar.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/effects.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/icons.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/index.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/portal/generic-block.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/portal/note.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/surface-ref-block-edgeless.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/surface-ref-block.ts (95%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/surface-ref-spec.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/src/utils.ts (100%) rename packages/affine/blocks/{block-surface-ref => surface-ref}/tsconfig.json (80%) rename packages/affine/blocks/{block-surface => surface}/package.json (100%) rename packages/affine/blocks/{block-surface => surface}/src/__tests__/a-star.unit.spec.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/__tests__/bound.unit.spec.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/__tests__/graph.unit.spec.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/__tests__/math-utils.unit.spec.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/__tests__/priority-queue.unit.spec.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/__tests__/sort.unit.spec.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/adapters/extension.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/adapters/html-adapter/html.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/adapters/markdown/element-adapter/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/adapters/markdown/element-adapter/type.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/adapters/markdown/markdown.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/adapters/plain-text/element-adapter/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/adapters/plain-text/element-adapter/type.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/adapters/plain-text/plain-text.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/adapters/type.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/commands/auto-align.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/commands/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/commands/reassociate-connectors.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/consts.ts (67%) rename packages/affine/blocks/{block-surface => surface}/src/effects.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/element-model/base.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/element-model/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/extensions/clipboard-config.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/extensions/crud-extension.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/extensions/element-renderer.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/extensions/export-manager/export-manager.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/extensions/export-manager/file-exporter.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/extensions/export-manager/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/extensions/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/extensions/legacy-slot-extension.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/extensions/query.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/managers/connector-manager.ts (95%) rename packages/affine/blocks/{block-surface => surface}/src/renderer/canvas-renderer.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/renderer/elements/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/renderer/elements/type.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/renderer/overlay.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/renderer/tool-overlay.ts (88%) rename packages/affine/blocks/{block-surface => surface}/src/surface-block-void.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/surface-block.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/surface-model.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/surface-spec.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/surface-transformer.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/a-star.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/add-note.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/font.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/get-bg-grip-gap.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/get-last-props-key.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/get-surface-block.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/graph.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/path-data-parser/LICENSE (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/path-data-parser/absolutize.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/path-data-parser/normalize.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/path-data-parser/parser.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/points-on-curve/LICENSE (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/points-on-curve/curve-to-bezier.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/points-on-curve/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/points-on-path/LICENSE (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/points-on-path/index.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/priority-queue.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/LICENSE (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/canvas.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/core.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/fillers/dashed-filler.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/fillers/dot-filler.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/fillers/filler-interface.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/fillers/filler.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/fillers/hachure-filler.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/fillers/hatch-filler.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/fillers/scan-line-hachure.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/fillers/zigzag-filler.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/fillers/zigzag-line-filler.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/generator.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/geometry.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/math.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/renderer.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/rough.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/rough/svg.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/sort.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/utils/update-xywh.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/watchers/connector.ts (100%) rename packages/affine/blocks/{block-surface => surface}/src/watchers/group.ts (100%) rename packages/affine/blocks/{block-surface => surface}/tsconfig.json (100%) rename packages/affine/blocks/{block-table => table}/package.json (100%) rename packages/affine/blocks/{block-table => table}/src/adapters/extension.ts (100%) rename packages/affine/blocks/{block-table => table}/src/adapters/html.ts (100%) rename packages/affine/blocks/{block-table => table}/src/adapters/index.ts (100%) rename packages/affine/blocks/{block-table => table}/src/adapters/markdown.ts (100%) rename packages/affine/blocks/{block-table => table}/src/adapters/notion-html.ts (100%) rename packages/affine/blocks/{block-table => table}/src/adapters/plain-text.ts (100%) rename packages/affine/blocks/{block-table => table}/src/adapters/utils.ts (100%) rename packages/affine/blocks/{block-table => table}/src/add-button.css.ts (100%) rename packages/affine/blocks/{block-table => table}/src/add-button.ts (100%) rename packages/affine/blocks/{block-table => table}/src/color.ts (100%) rename packages/affine/blocks/{block-table => table}/src/commands.ts (100%) rename packages/affine/blocks/{block-table => table}/src/configs/slash-menu.ts (100%) rename packages/affine/blocks/{block-table => table}/src/configs/tooltips.ts (100%) rename packages/affine/blocks/{block-table => table}/src/consts.ts (100%) rename packages/affine/blocks/{block-table => table}/src/effects.ts (100%) rename packages/affine/blocks/{block-table => table}/src/index.ts (100%) rename packages/affine/blocks/{block-table => table}/src/selection-controller.ts (100%) rename packages/affine/blocks/{block-table => table}/src/selection-layer.ts (100%) rename packages/affine/blocks/{block-table => table}/src/selection-schema.ts (100%) rename packages/affine/blocks/{block-table => table}/src/table-block.css.ts (100%) rename packages/affine/blocks/{block-table => table}/src/table-block.ts (100%) rename packages/affine/blocks/{block-table => table}/src/table-cell.css.ts (100%) rename packages/affine/blocks/{block-table => table}/src/table-cell.ts (100%) rename packages/affine/blocks/{block-table => table}/src/table-data-manager.ts (100%) rename packages/affine/blocks/{block-table => table}/src/table-spec.ts (100%) rename packages/affine/blocks/{block-table => table}/src/utils.ts (100%) rename packages/affine/blocks/{block-table => table}/tsconfig.json (92%) rename packages/affine/fragments/{fragment-doc-title => doc-title}/package.json (100%) rename packages/affine/fragments/{fragment-doc-title => doc-title}/src/doc-title.ts (92%) rename packages/affine/fragments/{fragment-doc-title => doc-title}/src/effects.ts (100%) rename packages/affine/fragments/{fragment-doc-title => doc-title}/src/index.ts (100%) rename packages/affine/fragments/{fragment-doc-title => doc-title}/src/utils.ts (100%) rename packages/affine/fragments/{fragment-outline => doc-title}/tsconfig.json (85%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/package.json (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/src/body/frame-panel-body.ts (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/src/card/frame-card-title-editor.ts (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/src/card/frame-card-title.ts (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/src/card/frame-card.ts (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/src/card/frame-preview.ts (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/src/effects.ts (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/src/frame-panel.ts (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/src/header/frame-panel-header.ts (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/src/header/frames-setting-menu.ts (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/src/index.ts (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/src/utils/drag.ts (100%) rename packages/affine/fragments/{fragment-frame-panel => frame-panel}/tsconfig.json (84%) rename packages/affine/fragments/{fragment-outline => outline}/package.json (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/body/outline-notice.css.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/body/outline-notice.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/body/outline-panel-body.css.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/body/outline-panel-body.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/card/outline-card.css.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/card/outline-card.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/card/outline-preview.css.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/card/outline-preview.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/config.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/effects.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/header/outline-panel-header.css.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/header/outline-panel-header.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/header/outline-setting-menu.css.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/header/outline-setting-menu.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/index.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/mobile-outline-panel.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/outline-panel.css.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/outline-panel.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/outline-viewer.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/utils/custom-events.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/utils/drag.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/utils/query.ts (100%) rename packages/affine/fragments/{fragment-outline => outline}/src/utils/scroll.ts (100%) rename packages/affine/fragments/{fragment-doc-title => outline}/tsconfig.json (84%) create mode 100644 packages/affine/gfx/brush/src/toolbar/components/pen/consts.ts create mode 100644 packages/affine/shared/src/services/auto-clear-selection-service.ts rename packages/affine/widgets/{widget-drag-handle => drag-handle}/package.json (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/components/edgeless-preview/preview.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/config.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/consts.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/drag-handle.ts (98%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/effects.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/helpers/preview-helper.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/helpers/rect-helper.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/helpers/selection-helper.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/index.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/middleware/blocks-filter.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/middleware/new-id-cross-doc.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/middleware/reorder-list.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/styles.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/utils.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/watchers/drag-event-watcher.ts (91%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/watchers/edgeless-watcher.ts (89%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/watchers/handle-event-watcher.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/watchers/keyboard-event-watcher.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/watchers/page-watcher.ts (100%) rename packages/affine/widgets/{widget-drag-handle => drag-handle}/src/watchers/pointer-event-watcher.ts (100%) create mode 100644 packages/affine/widgets/drag-handle/tsconfig.json rename packages/affine/widgets/{widget-edgeless-auto-connect => edgeless-auto-connect}/package.json (100%) rename packages/affine/widgets/{widget-edgeless-auto-connect => edgeless-auto-connect}/src/effects.ts (100%) rename packages/affine/widgets/{widget-edgeless-auto-connect => edgeless-auto-connect}/src/index.ts (100%) rename packages/affine/widgets/{widget-edgeless-auto-connect => edgeless-auto-connect}/tsconfig.json (81%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/package.json (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/button/tool-icon-button.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/button/toolbar-button.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/config/consts.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/config/index.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/config/types.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/config/utils.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/context.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/create-popper.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/draggable/draggable-element.controller.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/draggable/event-resolver.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/draggable/index.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/draggable/overlay-factory.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/draggable/types.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/edgeless-toolbar.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/effects.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/extension/index.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/index.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/mixins/index.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/mixins/quick-tool.mixin.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/mixins/tool.mixin.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/mixins/toolbar-button-with-menu.mixin.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/panel/font-family-panel.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/src/panel/font-weight-and-style-panel.ts (100%) rename packages/affine/widgets/{widget-edgeless-toolbar => edgeless-toolbar}/tsconfig.json (90%) rename packages/affine/widgets/{widget-frame-title => frame-title}/package.json (100%) rename packages/affine/widgets/{widget-frame-title => frame-title}/src/affine-frame-title-widget.ts (100%) rename packages/affine/widgets/{widget-frame-title => frame-title}/src/edgeless-frame-title-editor.ts (100%) rename packages/affine/widgets/{widget-frame-title => frame-title}/src/effects.ts (100%) rename packages/affine/widgets/{widget-frame-title => frame-title}/src/frame-title.ts (100%) rename packages/affine/widgets/{widget-frame-title => frame-title}/src/index.ts (100%) rename packages/affine/widgets/{widget-frame-title => frame-title}/src/mount-frame-title-editor.ts (100%) rename packages/affine/widgets/{widget-frame-title => frame-title}/src/styles.ts (100%) rename packages/affine/widgets/{widget-frame-title => frame-title}/tsconfig.json (100%) create mode 100644 packages/affine/widgets/linked-doc/package.json rename packages/affine/{blocks/block-root/src/widgets/linked-doc => widgets/linked-doc/src}/config.ts (72%) rename packages/affine/{blocks/block-root/src/widgets/linked-doc => widgets/linked-doc/src}/effects.ts (86%) rename packages/affine/{blocks/block-root/src/widgets/linked-doc => widgets/linked-doc/src}/import-doc/import-doc.ts (97%) rename packages/affine/{blocks/block-root/src/widgets/linked-doc => widgets/linked-doc/src}/import-doc/index.ts (100%) rename packages/affine/{blocks/block-root/src/widgets/linked-doc => widgets/linked-doc/src}/import-doc/loader.ts (100%) rename packages/affine/{blocks/block-root/src/widgets/linked-doc => widgets/linked-doc/src}/import-doc/styles.ts (100%) create mode 100644 packages/affine/widgets/linked-doc/src/index.ts rename packages/affine/{blocks/block-root/src/widgets/linked-doc => widgets/linked-doc/src}/linked-doc-popover.ts (97%) rename packages/affine/{blocks/block-root/src/widgets/linked-doc => widgets/linked-doc/src}/mobile-linked-doc-menu.ts (78%) rename packages/affine/{blocks/block-root/src/widgets/linked-doc => widgets/linked-doc/src}/styles.ts (100%) rename packages/affine/{blocks/block-root => widgets/linked-doc}/src/transformers/html.ts (100%) rename packages/affine/{blocks/block-root => widgets/linked-doc}/src/transformers/index.ts (100%) rename packages/affine/{blocks/block-root => widgets/linked-doc}/src/transformers/markdown.ts (100%) rename packages/affine/{blocks/block-root => widgets/linked-doc}/src/transformers/notion-html.ts (100%) rename packages/affine/{blocks/block-root => widgets/linked-doc}/src/transformers/utils.ts (100%) rename packages/affine/{blocks/block-root => widgets/linked-doc}/src/transformers/zip.ts (98%) rename packages/affine/{blocks/block-root/src/widgets/linked-doc => widgets/linked-doc/src}/utils.ts (100%) rename packages/affine/{blocks/block-root/src/widgets/linked-doc/index.ts => widgets/linked-doc/src/widget.ts} (86%) create mode 100644 packages/affine/widgets/linked-doc/tsconfig.json rename packages/affine/widgets/{widget-remote-selection => remote-selection}/package.json (100%) rename packages/affine/widgets/{widget-remote-selection => remote-selection}/src/doc/config.ts (100%) rename packages/affine/widgets/{widget-remote-selection => remote-selection}/src/doc/doc-remote-selection.ts (100%) rename packages/affine/widgets/{widget-remote-selection => remote-selection}/src/doc/index.ts (100%) rename packages/affine/widgets/{widget-remote-selection => remote-selection}/src/doc/utils.ts (100%) rename packages/affine/widgets/{widget-remote-selection => remote-selection}/src/edgeless/index.ts (100%) rename packages/affine/widgets/{widget-remote-selection => remote-selection}/src/effects.ts (100%) rename packages/affine/widgets/{widget-remote-selection => remote-selection}/src/index.ts (100%) rename packages/affine/widgets/{widget-remote-selection => remote-selection}/src/manager/color-picker.ts (100%) rename packages/affine/widgets/{widget-remote-selection => remote-selection}/src/manager/remote-color-manager.ts (100%) rename packages/affine/widgets/{widget-remote-selection => remote-selection}/tsconfig.json (89%) rename packages/affine/widgets/{widget-scroll-anchoring => scroll-anchoring}/package.json (100%) rename packages/affine/widgets/{widget-scroll-anchoring => scroll-anchoring}/src/effects.ts (100%) rename packages/affine/widgets/{widget-scroll-anchoring => scroll-anchoring}/src/index.ts (100%) rename packages/affine/widgets/{widget-scroll-anchoring => scroll-anchoring}/src/scroll-anchoring.ts (100%) rename packages/affine/widgets/{widget-scroll-anchoring => scroll-anchoring}/tsconfig.json (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/README.md (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/package.json (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/config.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/consts.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/effects.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/extensions.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/index.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/slash-menu-popover.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/styles.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/tooltips/copy.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/tooltips/delete.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/tooltips/empty.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/tooltips/index.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/tooltips/move-down.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/tooltips/move-up.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/tooltips/now.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/tooltips/today.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/tooltips/tomorrow.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/tooltips/yesterday.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/types.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/utils.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/src/widget.ts (100%) rename packages/affine/widgets/{widget-slash-menu => slash-menu}/tsconfig.json (100%) rename packages/affine/widgets/{widget-toolbar => toolbar}/package.json (100%) rename packages/affine/widgets/{widget-toolbar => toolbar}/src/effects.ts (100%) rename packages/affine/widgets/{widget-toolbar => toolbar}/src/index.ts (100%) rename packages/affine/widgets/{widget-toolbar => toolbar}/src/toolbar.ts (98%) rename packages/affine/widgets/{widget-toolbar => toolbar}/src/utils.ts (98%) rename packages/affine/widgets/{widget-toolbar => toolbar}/tsconfig.json (74%) delete mode 100644 packages/affine/widgets/widget-drag-handle/tsconfig.json create mode 100644 packages/framework/std/src/__tests__/gfx/surface.unit.spec.ts create mode 100644 packages/framework/std/src/__tests__/gfx/view.unit.spec.ts create mode 100644 packages/framework/std/src/__tests__/test-gfx-element.ts delete mode 100644 packages/framework/tsconfig.json delete mode 100644 packages/integration-test/src/__tests__/utils/turbo-painter-entry.worker.ts create mode 100644 packages/integration-test/src/__tests__/utils/turbo-painter.worker.ts diff --git a/packages/affine/all/package.json b/packages/affine/all/package.json index d58b06e3df7e..81525569a212 100644 --- a/packages/affine/all/package.json +++ b/packages/affine/all/package.json @@ -55,6 +55,7 @@ "@blocksuite/affine-widget-edgeless-auto-connect": "workspace:*", "@blocksuite/affine-widget-edgeless-toolbar": "workspace:*", "@blocksuite/affine-widget-frame-title": "workspace:*", + "@blocksuite/affine-widget-linked-doc": "workspace:*", "@blocksuite/affine-widget-remote-selection": "workspace:*", "@blocksuite/affine-widget-scroll-anchoring": "workspace:*", "@blocksuite/affine-widget-slash-menu": "workspace:*", @@ -115,6 +116,7 @@ "./widgets/edgeless-auto-connect": "./src/widgets/edgeless-auto-connect.ts", "./widgets/edgeless-toolbar": "./src/widgets/edgeless-toolbar.ts", "./widgets/frame-title": "./src/widgets/frame-title.ts", + "./widgets/linked-doc": "./src/widgets/linked-doc.ts", "./widgets/remote-selection": "./src/widgets/remote-selection.ts", "./widgets/scroll-anchoring": "./src/widgets/scroll-anchoring.ts", "./widgets/slash-menu": "./src/widgets/slash-menu.ts", diff --git a/packages/affine/all/src/__tests__/adapters/markdown.unit.spec.ts b/packages/affine/all/src/__tests__/adapters/markdown.unit.spec.ts index 1b731d1ad8cb..b815765d583d 100644 --- a/packages/affine/all/src/__tests__/adapters/markdown.unit.spec.ts +++ b/packages/affine/all/src/__tests__/adapters/markdown.unit.spec.ts @@ -3769,6 +3769,48 @@ bbb }); expect(nanoidReplacement(rawBlockSnapshot)).toEqual(blockSnapshot); }); + + test('escapes dollar signs followed by a digit or space and digit', async () => { + const markdown = + 'The price of the T-shirt is $9.15 and the price of the hat is $ 8\n'; + const blockSnapshot: BlockSnapshot = { + type: 'block', + id: 'matchesReplaceMap[0]', + flavour: 'affine:note', + props: { + xywh: '[0,0,800,95]', + background: DefaultTheme.noteBackgrounColor, + index: 'a0', + hidden: false, + displayMode: NoteDisplayMode.DocAndEdgeless, + }, + children: [ + { + type: 'block', + id: 'matchesReplaceMap[1]', + flavour: 'affine:paragraph', + props: { + type: 'text', + text: { + '$blocksuite:internal:text$': true, + delta: [ + { + insert: + 'The price of the T-shirt is $9.15 and the price of the hat is $ 8', + }, + ], + }, + }, + children: [], + }, + ], + }; + const mdAdapter = new MarkdownAdapter(createJob(), provider); + const rawBlockSnapshot = await mdAdapter.toBlockSnapshot({ + file: markdown, + }); + expect(nanoidReplacement(rawBlockSnapshot)).toEqual(blockSnapshot); + }); }); test('reference', async () => { diff --git a/packages/affine/all/src/adapters/extension.ts b/packages/affine/all/src/adapters/extension.ts index c452d208bbcf..cd9ba3f991bb 100644 --- a/packages/affine/all/src/adapters/extension.ts +++ b/packages/affine/all/src/adapters/extension.ts @@ -24,36 +24,46 @@ import { defaultMarkdownPreprocessors } from './markdown/preprocessor'; import { defaultBlockNotionHtmlAdapterMatchers } from './notion-html/block-matcher'; import { defaultBlockPlainTextAdapterMatchers } from './plain-text/block-matcher'; -export const AdapterFactoryExtensions: ExtensionType[] = [ - AttachmentAdapterFactoryExtension, - ImageAdapterFactoryExtension, - MarkdownAdapterFactoryExtension, - PlainTextAdapterFactoryExtension, - HtmlAdapterFactoryExtension, - NotionTextAdapterFactoryExtension, - NotionHtmlAdapterFactoryExtension, - MixTextAdapterFactoryExtension, -]; +export function getAdapterFactoryExtensions(): ExtensionType[] { + return [ + AttachmentAdapterFactoryExtension, + ImageAdapterFactoryExtension, + MarkdownAdapterFactoryExtension, + PlainTextAdapterFactoryExtension, + HtmlAdapterFactoryExtension, + NotionTextAdapterFactoryExtension, + NotionHtmlAdapterFactoryExtension, + MixTextAdapterFactoryExtension, + ]; +} -export const HtmlAdapterExtension: ExtensionType[] = [ - ...HtmlInlineToDeltaAdapterExtensions, - ...defaultBlockHtmlAdapterMatchers, - ...InlineDeltaToHtmlAdapterExtensions, -]; +export function getHtmlAdapterExtensions(): ExtensionType[] { + return [ + ...HtmlInlineToDeltaAdapterExtensions, + ...defaultBlockHtmlAdapterMatchers, + ...InlineDeltaToHtmlAdapterExtensions, + ]; +} -export const MarkdownAdapterExtension: ExtensionType[] = [ - ...MarkdownInlineToDeltaAdapterExtensions, - ...defaultBlockMarkdownAdapterMatchers, - ...InlineDeltaToMarkdownAdapterExtensions, - ...defaultMarkdownPreprocessors, -]; +export function getMarkdownAdapterExtensions(): ExtensionType[] { + return [ + ...MarkdownInlineToDeltaAdapterExtensions, + ...defaultBlockMarkdownAdapterMatchers, + ...InlineDeltaToMarkdownAdapterExtensions, + ...defaultMarkdownPreprocessors, + ]; +} -export const NotionHtmlAdapterExtension: ExtensionType[] = [ - ...NotionHtmlInlineToDeltaAdapterExtensions, - ...defaultBlockNotionHtmlAdapterMatchers, -]; +export function getNotionHtmlAdapterExtensions(): ExtensionType[] { + return [ + ...NotionHtmlInlineToDeltaAdapterExtensions, + ...defaultBlockNotionHtmlAdapterMatchers, + ]; +} -export const PlainTextAdapterExtension: ExtensionType[] = [ - ...defaultBlockPlainTextAdapterMatchers, - ...InlineDeltaToPlainTextAdapterExtensions, -]; +export function getPlainTextAdapterExtensions(): ExtensionType[] { + return [ + ...defaultBlockPlainTextAdapterMatchers, + ...InlineDeltaToPlainTextAdapterExtensions, + ]; +} diff --git a/packages/affine/all/src/extensions/store.ts b/packages/affine/all/src/extensions/store.ts index 03179ffbbfb7..48085e9c117a 100644 --- a/packages/affine/all/src/extensions/store.ts +++ b/packages/affine/all/src/extensions/store.ts @@ -51,11 +51,11 @@ import { import type { ExtensionType } from '@blocksuite/store'; import { - AdapterFactoryExtensions, - HtmlAdapterExtension, - MarkdownAdapterExtension, - NotionHtmlAdapterExtension, - PlainTextAdapterExtension, + getAdapterFactoryExtensions, + getHtmlAdapterExtensions, + getMarkdownAdapterExtensions, + getNotionHtmlAdapterExtensions, + getPlainTextAdapterExtensions, } from '../adapters/extension.js'; export const StoreExtensions: ExtensionType[] = [ @@ -96,11 +96,11 @@ export const StoreExtensions: ExtensionType[] = [ DatabaseSelectionExtension, TableSelectionExtension, - HtmlAdapterExtension, - MarkdownAdapterExtension, - NotionHtmlAdapterExtension, - PlainTextAdapterExtension, - AdapterFactoryExtensions, + getHtmlAdapterExtensions(), + getMarkdownAdapterExtensions(), + getNotionHtmlAdapterExtensions(), + getPlainTextAdapterExtensions(), + getAdapterFactoryExtensions(), FeatureFlagService, LinkPreviewerService, diff --git a/packages/affine/all/src/widgets/linked-doc.ts b/packages/affine/all/src/widgets/linked-doc.ts new file mode 100644 index 000000000000..92122638e618 --- /dev/null +++ b/packages/affine/all/src/widgets/linked-doc.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-widget-linked-doc'; diff --git a/packages/affine/all/tsconfig.json b/packages/affine/all/tsconfig.json index ebeb7b513c77..7f4488df9b00 100644 --- a/packages/affine/all/tsconfig.json +++ b/packages/affine/all/tsconfig.json @@ -7,29 +7,29 @@ }, "include": ["./src"], "references": [ - { "path": "../blocks/block-attachment" }, - { "path": "../blocks/block-bookmark" }, - { "path": "../blocks/block-callout" }, - { "path": "../blocks/block-code" }, - { "path": "../blocks/block-data-view" }, - { "path": "../blocks/block-database" }, - { "path": "../blocks/block-divider" }, - { "path": "../blocks/block-edgeless-text" }, - { "path": "../blocks/block-embed" }, - { "path": "../blocks/block-frame" }, - { "path": "../blocks/block-image" }, - { "path": "../blocks/block-latex" }, - { "path": "../blocks/block-list" }, - { "path": "../blocks/block-note" }, - { "path": "../blocks/block-paragraph" }, - { "path": "../blocks/block-root" }, - { "path": "../blocks/block-surface" }, - { "path": "../blocks/block-surface-ref" }, - { "path": "../blocks/block-table" }, + { "path": "../blocks/attachment" }, + { "path": "../blocks/bookmark" }, + { "path": "../blocks/callout" }, + { "path": "../blocks/code" }, + { "path": "../blocks/data-view" }, + { "path": "../blocks/database" }, + { "path": "../blocks/divider" }, + { "path": "../blocks/edgeless-text" }, + { "path": "../blocks/embed" }, + { "path": "../blocks/frame" }, + { "path": "../blocks/image" }, + { "path": "../blocks/latex" }, + { "path": "../blocks/list" }, + { "path": "../blocks/note" }, + { "path": "../blocks/paragraph" }, + { "path": "../blocks/root" }, + { "path": "../blocks/surface" }, + { "path": "../blocks/surface-ref" }, + { "path": "../blocks/table" }, { "path": "../components" }, - { "path": "../fragments/fragment-doc-title" }, - { "path": "../fragments/fragment-frame-panel" }, - { "path": "../fragments/fragment-outline" }, + { "path": "../fragments/doc-title" }, + { "path": "../fragments/frame-panel" }, + { "path": "../fragments/outline" }, { "path": "../gfx/brush" }, { "path": "../gfx/connector" }, { "path": "../gfx/group" }, @@ -48,14 +48,15 @@ { "path": "../model" }, { "path": "../rich-text" }, { "path": "../shared" }, - { "path": "../widgets/widget-drag-handle" }, - { "path": "../widgets/widget-edgeless-auto-connect" }, - { "path": "../widgets/widget-edgeless-toolbar" }, - { "path": "../widgets/widget-frame-title" }, - { "path": "../widgets/widget-remote-selection" }, - { "path": "../widgets/widget-scroll-anchoring" }, - { "path": "../widgets/widget-slash-menu" }, - { "path": "../widgets/widget-toolbar" }, + { "path": "../widgets/drag-handle" }, + { "path": "../widgets/edgeless-auto-connect" }, + { "path": "../widgets/edgeless-toolbar" }, + { "path": "../widgets/frame-title" }, + { "path": "../widgets/linked-doc" }, + { "path": "../widgets/remote-selection" }, + { "path": "../widgets/scroll-anchoring" }, + { "path": "../widgets/slash-menu" }, + { "path": "../widgets/toolbar" }, { "path": "../data-view" }, { "path": "../../framework/global" }, { "path": "../../framework/std" }, diff --git a/packages/affine/blocks/block-attachment/package.json b/packages/affine/blocks/attachment/package.json similarity index 100% rename from packages/affine/blocks/block-attachment/package.json rename to packages/affine/blocks/attachment/package.json diff --git a/packages/affine/blocks/block-attachment/src/adapters/notion-html.ts b/packages/affine/blocks/attachment/src/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/adapters/notion-html.ts rename to packages/affine/blocks/attachment/src/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-attachment/src/attachment-block.ts b/packages/affine/blocks/attachment/src/attachment-block.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/attachment-block.ts rename to packages/affine/blocks/attachment/src/attachment-block.ts diff --git a/packages/affine/blocks/block-attachment/src/attachment-edgeless-block.ts b/packages/affine/blocks/attachment/src/attachment-edgeless-block.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/attachment-edgeless-block.ts rename to packages/affine/blocks/attachment/src/attachment-edgeless-block.ts diff --git a/packages/affine/blocks/block-attachment/src/attachment-service.ts b/packages/affine/blocks/attachment/src/attachment-service.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/attachment-service.ts rename to packages/affine/blocks/attachment/src/attachment-service.ts diff --git a/packages/affine/blocks/block-attachment/src/attachment-spec.ts b/packages/affine/blocks/attachment/src/attachment-spec.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/attachment-spec.ts rename to packages/affine/blocks/attachment/src/attachment-spec.ts diff --git a/packages/affine/blocks/block-attachment/src/components/rename-model.ts b/packages/affine/blocks/attachment/src/components/rename-model.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/components/rename-model.ts rename to packages/affine/blocks/attachment/src/components/rename-model.ts diff --git a/packages/affine/blocks/block-attachment/src/components/styles.ts b/packages/affine/blocks/attachment/src/components/styles.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/components/styles.ts rename to packages/affine/blocks/attachment/src/components/styles.ts diff --git a/packages/affine/blocks/block-attachment/src/configs/slash-menu.ts b/packages/affine/blocks/attachment/src/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/configs/slash-menu.ts rename to packages/affine/blocks/attachment/src/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-attachment/src/configs/toolbar.ts b/packages/affine/blocks/attachment/src/configs/toolbar.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/configs/toolbar.ts rename to packages/affine/blocks/attachment/src/configs/toolbar.ts diff --git a/packages/affine/blocks/block-attachment/src/configs/tooltips.ts b/packages/affine/blocks/attachment/src/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/configs/tooltips.ts rename to packages/affine/blocks/attachment/src/configs/tooltips.ts diff --git a/packages/affine/blocks/block-attachment/src/edgeless-clipboard-config.ts b/packages/affine/blocks/attachment/src/edgeless-clipboard-config.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/edgeless-clipboard-config.ts rename to packages/affine/blocks/attachment/src/edgeless-clipboard-config.ts diff --git a/packages/affine/blocks/block-attachment/src/effects.ts b/packages/affine/blocks/attachment/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/effects.ts rename to packages/affine/blocks/attachment/src/effects.ts diff --git a/packages/affine/blocks/block-attachment/src/embed.ts b/packages/affine/blocks/attachment/src/embed.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/embed.ts rename to packages/affine/blocks/attachment/src/embed.ts diff --git a/packages/affine/blocks/block-attachment/src/index.ts b/packages/affine/blocks/attachment/src/index.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/index.ts rename to packages/affine/blocks/attachment/src/index.ts diff --git a/packages/affine/blocks/block-attachment/src/styles.ts b/packages/affine/blocks/attachment/src/styles.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/styles.ts rename to packages/affine/blocks/attachment/src/styles.ts diff --git a/packages/affine/blocks/block-attachment/src/utils.ts b/packages/affine/blocks/attachment/src/utils.ts similarity index 100% rename from packages/affine/blocks/block-attachment/src/utils.ts rename to packages/affine/blocks/attachment/src/utils.ts diff --git a/packages/affine/blocks/block-image/tsconfig.json b/packages/affine/blocks/attachment/tsconfig.json similarity index 78% rename from packages/affine/blocks/block-image/tsconfig.json rename to packages/affine/blocks/attachment/tsconfig.json index 868a19309ae3..ba7d24e13813 100644 --- a/packages/affine/blocks/block-image/tsconfig.json +++ b/packages/affine/blocks/attachment/tsconfig.json @@ -7,12 +7,12 @@ }, "include": ["./src"], "references": [ - { "path": "../block-note" }, - { "path": "../block-surface" }, + { "path": "../embed" }, + { "path": "../surface" }, { "path": "../../components" }, { "path": "../../model" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-slash-menu" }, + { "path": "../../widgets/slash-menu" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/blocks/block-frame/tsconfig.json b/packages/affine/blocks/block-frame/tsconfig.json deleted file mode 100644 index 396b138a4fff..000000000000 --- a/packages/affine/blocks/block-frame/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist", - "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" - }, - "include": ["./src"], - "references": [ - { "path": "../block-surface" }, - { "path": "../../components" }, - { "path": "../../model" }, - { "path": "../../shared" }, - { "path": "../../widgets/widget-edgeless-toolbar" }, - { "path": "../../widgets/widget-frame-title" }, - { "path": "../../../framework/global" }, - { "path": "../../../framework/std" }, - { "path": "../../../framework/store" } - ] -} diff --git a/packages/affine/blocks/block-latex/src/adapters/markdown/preprocessor.ts b/packages/affine/blocks/block-latex/src/adapters/markdown/preprocessor.ts deleted file mode 100644 index 1d6e7985f4d1..000000000000 --- a/packages/affine/blocks/block-latex/src/adapters/markdown/preprocessor.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { - type MarkdownAdapterPreprocessor, - MarkdownPreprocessorExtension, -} from '@blocksuite/affine-shared/adapters'; - -const latexPreprocessor: MarkdownAdapterPreprocessor = { - name: 'latex', - levels: ['block', 'slice', 'doc'], - preprocess: content => { - // Replace block-level LaTeX delimiters \[ \] with $$ $$ - const blockProcessedContent = content.replace( - /\\\[(.*?)\\\]/gs, - (_, equation) => `$$${equation}$$` - ); - // Replace inline LaTeX delimiters \( \) with $ $ - const inlineProcessedContent = blockProcessedContent.replace( - /\\\((.*?)\\\)/gs, - (_, equation) => `$${equation}$` - ); - return inlineProcessedContent; - }, -}; - -export const LatexMarkdownPreprocessorExtension = - MarkdownPreprocessorExtension(latexPreprocessor); diff --git a/packages/affine/blocks/block-root/src/edgeless/gfx-tool/template-tool.ts b/packages/affine/blocks/block-root/src/edgeless/gfx-tool/template-tool.ts deleted file mode 100644 index fa323dee5560..000000000000 --- a/packages/affine/blocks/block-root/src/edgeless/gfx-tool/template-tool.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { BaseTool } from '@blocksuite/std/gfx'; - -export class TemplateTool extends BaseTool { - static override toolName: string = 'template'; -} - -declare module '@blocksuite/std/gfx' { - interface GfxToolsMap { - template: TemplateTool; - } -} diff --git a/packages/affine/blocks/block-root/src/types.ts b/packages/affine/blocks/block-root/src/types.ts deleted file mode 100644 index e1e207806f7f..000000000000 --- a/packages/affine/blocks/block-root/src/types.ts +++ /dev/null @@ -1,44 +0,0 @@ -import type { AFFINE_DRAG_HANDLE_WIDGET } from '@blocksuite/affine-widget-drag-handle'; -import type { AFFINE_FRAME_TITLE_WIDGET } from '@blocksuite/affine-widget-frame-title'; -import type { - AFFINE_DOC_REMOTE_SELECTION_WIDGET, - AFFINE_EDGELESS_REMOTE_SELECTION_WIDGET, -} from '@blocksuite/affine-widget-remote-selection'; -import type { AFFINE_SLASH_MENU_WIDGET } from '@blocksuite/affine-widget-slash-menu'; - -import type { EdgelessRootBlockComponent } from './edgeless/edgeless-root-block.js'; -import type { PageRootBlockComponent } from './page/page-root-block.js'; -import type { AFFINE_EDGELESS_ZOOM_TOOLBAR_WIDGET } from './widgets/edgeless-zoom-toolbar/index.js'; -import type { AFFINE_KEYBOARD_TOOLBAR_WIDGET } from './widgets/index.js'; -import type { AFFINE_INNER_MODAL_WIDGET } from './widgets/inner-modal/inner-modal.js'; -import type { AFFINE_LINKED_DOC_WIDGET } from './widgets/linked-doc/config.js'; -import type { AFFINE_MODAL_WIDGET } from './widgets/modal/modal.js'; -import type { AFFINE_PAGE_DRAGGING_AREA_WIDGET } from './widgets/page-dragging-area/page-dragging-area.js'; -import type { AFFINE_VIEWPORT_OVERLAY_WIDGET } from './widgets/viewport-overlay/viewport-overlay.js'; - -export type PageRootBlockWidgetName = - | typeof AFFINE_KEYBOARD_TOOLBAR_WIDGET - | typeof AFFINE_MODAL_WIDGET - | typeof AFFINE_INNER_MODAL_WIDGET - | typeof AFFINE_SLASH_MENU_WIDGET - | typeof AFFINE_LINKED_DOC_WIDGET - | typeof AFFINE_PAGE_DRAGGING_AREA_WIDGET - | typeof AFFINE_DRAG_HANDLE_WIDGET - | typeof AFFINE_DOC_REMOTE_SELECTION_WIDGET - | typeof AFFINE_VIEWPORT_OVERLAY_WIDGET; - -export type EdgelessRootBlockWidgetName = - | typeof AFFINE_MODAL_WIDGET - | typeof AFFINE_INNER_MODAL_WIDGET - | typeof AFFINE_SLASH_MENU_WIDGET - | typeof AFFINE_LINKED_DOC_WIDGET - | typeof AFFINE_DRAG_HANDLE_WIDGET - | typeof AFFINE_DOC_REMOTE_SELECTION_WIDGET - | typeof AFFINE_EDGELESS_REMOTE_SELECTION_WIDGET - | typeof AFFINE_EDGELESS_ZOOM_TOOLBAR_WIDGET - | typeof AFFINE_VIEWPORT_OVERLAY_WIDGET - | typeof AFFINE_FRAME_TITLE_WIDGET; - -export type RootBlockComponent = - | PageRootBlockComponent - | EdgelessRootBlockComponent; diff --git a/packages/affine/blocks/block-root/src/widgets/inner-modal/inner-modal.ts b/packages/affine/blocks/block-root/src/widgets/inner-modal/inner-modal.ts deleted file mode 100644 index a40fe6551160..000000000000 --- a/packages/affine/blocks/block-root/src/widgets/inner-modal/inner-modal.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { WidgetComponent } from '@blocksuite/std'; -import { - autoUpdate, - computePosition, - type FloatingElement, - type ReferenceElement, - size, -} from '@floating-ui/dom'; -import { nothing } from 'lit'; - -export const AFFINE_INNER_MODAL_WIDGET = 'affine-inner-modal-widget'; - -export class AffineInnerModalWidget extends WidgetComponent { - private _getTarget?: () => ReferenceElement; - - get target(): ReferenceElement { - if (this._getTarget) { - return this._getTarget(); - } - return document.body; - } - - open( - modal: FloatingElement, - ops: { onClose?: () => void } - ): { close(): void } { - const cancel = autoUpdate(this.target, modal, () => { - computePosition(this.target, modal, { - middleware: [ - size({ - apply: ({ rects }) => { - Object.assign(modal.style, { - left: `${rects.reference.x}px`, - top: `${rects.reference.y}px`, - width: `${rects.reference.width}px`, - height: `${rects.reference.height}px`, - }); - }, - }), - ], - }).catch(console.error); - }); - const close = () => { - modal.remove(); - ops.onClose?.(); - cancel(); - }; - return { close }; - } - - override render() { - return nothing; - } - - setTarget(fn: () => ReferenceElement) { - this._getTarget = fn; - } -} diff --git a/packages/affine/blocks/block-root/tsconfig.json b/packages/affine/blocks/block-root/tsconfig.json deleted file mode 100644 index b0f55bf7567f..000000000000 --- a/packages/affine/blocks/block-root/tsconfig.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist", - "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" - }, - "include": ["./src"], - "references": [ - { "path": "../block-attachment" }, - { "path": "../block-bookmark" }, - { "path": "../block-data-view" }, - { "path": "../block-database" }, - { "path": "../block-edgeless-text" }, - { "path": "../block-embed" }, - { "path": "../block-frame" }, - { "path": "../block-image" }, - { "path": "../block-latex" }, - { "path": "../block-list" }, - { "path": "../block-note" }, - { "path": "../block-paragraph" }, - { "path": "../block-surface" }, - { "path": "../block-surface-ref" }, - { "path": "../block-table" }, - { "path": "../../components" }, - { "path": "../../fragments/fragment-doc-title" }, - { "path": "../../gfx/brush" }, - { "path": "../../gfx/connector" }, - { "path": "../../gfx/group" }, - { "path": "../../gfx/mindmap" }, - { "path": "../../gfx/note" }, - { "path": "../../gfx/shape" }, - { "path": "../../gfx/template" }, - { "path": "../../gfx/text" }, - { "path": "../../inlines/latex" }, - { "path": "../../inlines/link" }, - { "path": "../../inlines/preset" }, - { "path": "../../inlines/reference" }, - { "path": "../../model" }, - { "path": "../../rich-text" }, - { "path": "../../shared" }, - { "path": "../../widgets/widget-drag-handle" }, - { "path": "../../widgets/widget-edgeless-auto-connect" }, - { "path": "../../widgets/widget-edgeless-toolbar" }, - { "path": "../../widgets/widget-frame-title" }, - { "path": "../../widgets/widget-remote-selection" }, - { "path": "../../widgets/widget-scroll-anchoring" }, - { "path": "../../widgets/widget-slash-menu" }, - { "path": "../../widgets/widget-toolbar" }, - { "path": "../../data-view" }, - { "path": "../../../framework/global" }, - { "path": "../../../framework/std" }, - { "path": "../../../framework/store" } - ] -} diff --git a/packages/affine/blocks/block-bookmark/package.json b/packages/affine/blocks/bookmark/package.json similarity index 100% rename from packages/affine/blocks/block-bookmark/package.json rename to packages/affine/blocks/bookmark/package.json diff --git a/packages/affine/blocks/block-bookmark/src/adapters/extension.ts b/packages/affine/blocks/bookmark/src/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/adapters/extension.ts rename to packages/affine/blocks/bookmark/src/adapters/extension.ts diff --git a/packages/affine/blocks/block-bookmark/src/adapters/html.ts b/packages/affine/blocks/bookmark/src/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/adapters/html.ts rename to packages/affine/blocks/bookmark/src/adapters/html.ts diff --git a/packages/affine/blocks/block-bookmark/src/adapters/index.ts b/packages/affine/blocks/bookmark/src/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/adapters/index.ts rename to packages/affine/blocks/bookmark/src/adapters/index.ts diff --git a/packages/affine/blocks/block-bookmark/src/adapters/markdown.ts b/packages/affine/blocks/bookmark/src/adapters/markdown.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/adapters/markdown.ts rename to packages/affine/blocks/bookmark/src/adapters/markdown.ts diff --git a/packages/affine/blocks/block-bookmark/src/adapters/notion-html.ts b/packages/affine/blocks/bookmark/src/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/adapters/notion-html.ts rename to packages/affine/blocks/bookmark/src/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-bookmark/src/adapters/plain-text.ts b/packages/affine/blocks/bookmark/src/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/adapters/plain-text.ts rename to packages/affine/blocks/bookmark/src/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-bookmark/src/bookmark-block.ts b/packages/affine/blocks/bookmark/src/bookmark-block.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/bookmark-block.ts rename to packages/affine/blocks/bookmark/src/bookmark-block.ts diff --git a/packages/affine/blocks/block-bookmark/src/bookmark-edgeless-block.ts b/packages/affine/blocks/bookmark/src/bookmark-edgeless-block.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/bookmark-edgeless-block.ts rename to packages/affine/blocks/bookmark/src/bookmark-edgeless-block.ts diff --git a/packages/affine/blocks/block-bookmark/src/bookmark-spec.ts b/packages/affine/blocks/bookmark/src/bookmark-spec.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/bookmark-spec.ts rename to packages/affine/blocks/bookmark/src/bookmark-spec.ts diff --git a/packages/affine/blocks/block-bookmark/src/commands/index.ts b/packages/affine/blocks/bookmark/src/commands/index.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/commands/index.ts rename to packages/affine/blocks/bookmark/src/commands/index.ts diff --git a/packages/affine/blocks/block-bookmark/src/commands/insert-bookmark.ts b/packages/affine/blocks/bookmark/src/commands/insert-bookmark.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/commands/insert-bookmark.ts rename to packages/affine/blocks/bookmark/src/commands/insert-bookmark.ts diff --git a/packages/affine/blocks/block-bookmark/src/commands/insert-link-by-quick-search.ts b/packages/affine/blocks/bookmark/src/commands/insert-link-by-quick-search.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/commands/insert-link-by-quick-search.ts rename to packages/affine/blocks/bookmark/src/commands/insert-link-by-quick-search.ts diff --git a/packages/affine/blocks/block-bookmark/src/components/bookmark-card.ts b/packages/affine/blocks/bookmark/src/components/bookmark-card.ts similarity index 83% rename from packages/affine/blocks/block-bookmark/src/components/bookmark-card.ts rename to packages/affine/blocks/bookmark/src/components/bookmark-card.ts index b333d4c2bb65..bd8be9a7c80d 100644 --- a/packages/affine/blocks/block-bookmark/src/components/bookmark-card.ts +++ b/packages/affine/blocks/bookmark/src/components/bookmark-card.ts @@ -2,7 +2,7 @@ import { getEmbedCardIcons } from '@blocksuite/affine-block-embed'; import { WebIcon16 } from '@blocksuite/affine-components/icons'; import { ThemeProvider } from '@blocksuite/affine-shared/services'; import { getHostName } from '@blocksuite/affine-shared/utils'; -import { WithDisposable } from '@blocksuite/global/lit'; +import { SignalWatcher, WithDisposable } from '@blocksuite/global/lit'; import { OpenInNewIcon } from '@blocksuite/icons/lit'; import { BlockSelection, ShadowlessElement } from '@blocksuite/std'; import { html } from 'lit'; @@ -12,7 +12,9 @@ import { classMap } from 'lit/directives/class-map.js'; import type { BookmarkBlockComponent } from '../bookmark-block.js'; import { styles } from '../styles.js'; -export class BookmarkCard extends WithDisposable(ShadowlessElement) { +export class BookmarkCard extends SignalWatcher( + WithDisposable(ShadowlessElement) +) { static override styles = styles; private _handleClick(event: MouseEvent) { @@ -79,21 +81,10 @@ export class BookmarkCard extends WithDisposable(ShadowlessElement) { const theme = this.bookmark.std.get(ThemeProvider).theme; const { LoadingIcon, EmbedCardBannerIcon } = getEmbedCardIcons(theme); - const titleIconType = - !icon?.split('.').pop() || icon?.split('.').pop() === 'svg' - ? 'svg+xml' - : icon?.split('.').pop(); - const titleIcon = this.loading ? LoadingIcon : icon - ? html` - ${WebIcon16} - ` + ? html`icon` : WebIcon16; const descriptionText = this.loading @@ -106,9 +97,7 @@ export class BookmarkCard extends WithDisposable(ShadowlessElement) { const bannerImage = !this.loading && image - ? html` - ${EmbedCardBannerIcon} - ` + ? html`banner` : EmbedCardBannerIcon; return html` @@ -125,11 +114,11 @@ export class BookmarkCard extends WithDisposable(ShadowlessElement) {
${descriptionText}
-
-
+
+
${getHostName(url)}
${OpenInNewIcon({ width: '12', height: '12' })} diff --git a/packages/affine/blocks/block-bookmark/src/components/index.ts b/packages/affine/blocks/bookmark/src/components/index.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/components/index.ts rename to packages/affine/blocks/bookmark/src/components/index.ts diff --git a/packages/affine/blocks/block-bookmark/src/configs/slash-menu.ts b/packages/affine/blocks/bookmark/src/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/configs/slash-menu.ts rename to packages/affine/blocks/bookmark/src/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-bookmark/src/configs/toolbar.ts b/packages/affine/blocks/bookmark/src/configs/toolbar.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/configs/toolbar.ts rename to packages/affine/blocks/bookmark/src/configs/toolbar.ts diff --git a/packages/affine/blocks/block-bookmark/src/configs/tooltips.ts b/packages/affine/blocks/bookmark/src/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/configs/tooltips.ts rename to packages/affine/blocks/bookmark/src/configs/tooltips.ts diff --git a/packages/affine/blocks/block-bookmark/src/edgeless-clipboard-config.ts b/packages/affine/blocks/bookmark/src/edgeless-clipboard-config.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/edgeless-clipboard-config.ts rename to packages/affine/blocks/bookmark/src/edgeless-clipboard-config.ts diff --git a/packages/affine/blocks/block-bookmark/src/effects.ts b/packages/affine/blocks/bookmark/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/effects.ts rename to packages/affine/blocks/bookmark/src/effects.ts diff --git a/packages/affine/blocks/block-bookmark/src/index.ts b/packages/affine/blocks/bookmark/src/index.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/index.ts rename to packages/affine/blocks/bookmark/src/index.ts diff --git a/packages/affine/blocks/block-bookmark/src/styles.ts b/packages/affine/blocks/bookmark/src/styles.ts similarity index 99% rename from packages/affine/blocks/block-bookmark/src/styles.ts rename to packages/affine/blocks/bookmark/src/styles.ts index 859753ccbb3e..24588e5b14d1 100644 --- a/packages/affine/blocks/block-bookmark/src/styles.ts +++ b/packages/affine/blocks/bookmark/src/styles.ts @@ -26,7 +26,6 @@ export const styles = css` .affine-bookmark-content { width: calc(100% - 204px); - height: 100%; display: flex; flex-direction: column; align-self: stretch; diff --git a/packages/affine/blocks/block-bookmark/src/utils.ts b/packages/affine/blocks/bookmark/src/utils.ts similarity index 100% rename from packages/affine/blocks/block-bookmark/src/utils.ts rename to packages/affine/blocks/bookmark/src/utils.ts diff --git a/packages/affine/blocks/block-attachment/tsconfig.json b/packages/affine/blocks/bookmark/tsconfig.json similarity index 78% rename from packages/affine/blocks/block-attachment/tsconfig.json rename to packages/affine/blocks/bookmark/tsconfig.json index 8d401bfec101..ba7d24e13813 100644 --- a/packages/affine/blocks/block-attachment/tsconfig.json +++ b/packages/affine/blocks/bookmark/tsconfig.json @@ -7,12 +7,12 @@ }, "include": ["./src"], "references": [ - { "path": "../block-embed" }, - { "path": "../block-surface" }, + { "path": "../embed" }, + { "path": "../surface" }, { "path": "../../components" }, { "path": "../../model" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-slash-menu" }, + { "path": "../../widgets/slash-menu" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/blocks/block-callout/package.json b/packages/affine/blocks/callout/package.json similarity index 100% rename from packages/affine/blocks/block-callout/package.json rename to packages/affine/blocks/callout/package.json diff --git a/packages/affine/blocks/block-callout/src/callout-block.ts b/packages/affine/blocks/callout/src/callout-block.ts similarity index 100% rename from packages/affine/blocks/block-callout/src/callout-block.ts rename to packages/affine/blocks/callout/src/callout-block.ts diff --git a/packages/affine/blocks/block-callout/src/callout-keymap.ts b/packages/affine/blocks/callout/src/callout-keymap.ts similarity index 100% rename from packages/affine/blocks/block-callout/src/callout-keymap.ts rename to packages/affine/blocks/callout/src/callout-keymap.ts diff --git a/packages/affine/blocks/block-callout/src/callout-spec.ts b/packages/affine/blocks/callout/src/callout-spec.ts similarity index 100% rename from packages/affine/blocks/block-callout/src/callout-spec.ts rename to packages/affine/blocks/callout/src/callout-spec.ts diff --git a/packages/affine/blocks/block-callout/src/configs/slash-menu.ts b/packages/affine/blocks/callout/src/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-callout/src/configs/slash-menu.ts rename to packages/affine/blocks/callout/src/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-callout/src/configs/tooltips.ts b/packages/affine/blocks/callout/src/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-callout/src/configs/tooltips.ts rename to packages/affine/blocks/callout/src/configs/tooltips.ts diff --git a/packages/affine/blocks/block-callout/src/effects.ts b/packages/affine/blocks/callout/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-callout/src/effects.ts rename to packages/affine/blocks/callout/src/effects.ts diff --git a/packages/affine/blocks/block-callout/src/emoji-menu.ts b/packages/affine/blocks/callout/src/emoji-menu.ts similarity index 100% rename from packages/affine/blocks/block-callout/src/emoji-menu.ts rename to packages/affine/blocks/callout/src/emoji-menu.ts diff --git a/packages/affine/blocks/block-callout/src/index.ts b/packages/affine/blocks/callout/src/index.ts similarity index 100% rename from packages/affine/blocks/block-callout/src/index.ts rename to packages/affine/blocks/callout/src/index.ts diff --git a/packages/affine/blocks/block-callout/tsconfig.json b/packages/affine/blocks/callout/tsconfig.json similarity index 91% rename from packages/affine/blocks/block-callout/tsconfig.json rename to packages/affine/blocks/callout/tsconfig.json index df9b63e25451..089afb4b7b4c 100644 --- a/packages/affine/blocks/block-callout/tsconfig.json +++ b/packages/affine/blocks/callout/tsconfig.json @@ -12,7 +12,7 @@ { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-slash-menu" }, + { "path": "../../widgets/slash-menu" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/blocks/block-code/package.json b/packages/affine/blocks/code/package.json similarity index 89% rename from packages/affine/blocks/block-code/package.json rename to packages/affine/blocks/code/package.json index 5af3375d3d96..833a10f7db7c 100644 --- a/packages/affine/blocks/block-code/package.json +++ b/packages/affine/blocks/code/package.json @@ -11,6 +11,7 @@ "license": "MIT", "dependencies": { "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-gfx-turbo-renderer": "workspace:*", "@blocksuite/affine-inline-latex": "workspace:*", "@blocksuite/affine-inline-link": "workspace:*", "@blocksuite/affine-inline-preset": "workspace:*", @@ -35,7 +36,8 @@ }, "exports": { ".": "./src/index.ts", - "./effects": "./src/effects.ts" + "./effects": "./src/effects.ts", + "./turbo-painter": "./src/turbo/code-painter.worker.ts" }, "files": [ "src", diff --git a/packages/affine/blocks/block-code/src/adapters/extension.ts b/packages/affine/blocks/code/src/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-code/src/adapters/extension.ts rename to packages/affine/blocks/code/src/adapters/extension.ts diff --git a/packages/affine/blocks/block-code/src/adapters/html.ts b/packages/affine/blocks/code/src/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-code/src/adapters/html.ts rename to packages/affine/blocks/code/src/adapters/html.ts diff --git a/packages/affine/blocks/block-code/src/adapters/index.ts b/packages/affine/blocks/code/src/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-code/src/adapters/index.ts rename to packages/affine/blocks/code/src/adapters/index.ts diff --git a/packages/affine/blocks/block-code/src/adapters/markdown/index.ts b/packages/affine/blocks/code/src/adapters/markdown/index.ts similarity index 100% rename from packages/affine/blocks/block-code/src/adapters/markdown/index.ts rename to packages/affine/blocks/code/src/adapters/markdown/index.ts diff --git a/packages/affine/blocks/block-code/src/adapters/markdown/markdown.ts b/packages/affine/blocks/code/src/adapters/markdown/markdown.ts similarity index 100% rename from packages/affine/blocks/block-code/src/adapters/markdown/markdown.ts rename to packages/affine/blocks/code/src/adapters/markdown/markdown.ts diff --git a/packages/affine/blocks/block-code/src/adapters/markdown/preprocessor.ts b/packages/affine/blocks/code/src/adapters/markdown/preprocessor.ts similarity index 100% rename from packages/affine/blocks/block-code/src/adapters/markdown/preprocessor.ts rename to packages/affine/blocks/code/src/adapters/markdown/preprocessor.ts diff --git a/packages/affine/blocks/block-code/src/adapters/notion-html.ts b/packages/affine/blocks/code/src/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-code/src/adapters/notion-html.ts rename to packages/affine/blocks/code/src/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-code/src/adapters/plain-text.ts b/packages/affine/blocks/code/src/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-code/src/adapters/plain-text.ts rename to packages/affine/blocks/code/src/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-code/src/code-block-config.ts b/packages/affine/blocks/code/src/code-block-config.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-block-config.ts rename to packages/affine/blocks/code/src/code-block-config.ts diff --git a/packages/affine/blocks/block-code/src/code-block-inline.ts b/packages/affine/blocks/code/src/code-block-inline.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-block-inline.ts rename to packages/affine/blocks/code/src/code-block-inline.ts diff --git a/packages/affine/blocks/block-code/src/code-block-service.ts b/packages/affine/blocks/code/src/code-block-service.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-block-service.ts rename to packages/affine/blocks/code/src/code-block-service.ts diff --git a/packages/affine/blocks/block-code/src/code-block-spec.ts b/packages/affine/blocks/code/src/code-block-spec.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-block-spec.ts rename to packages/affine/blocks/code/src/code-block-spec.ts diff --git a/packages/affine/blocks/block-code/src/code-block.ts b/packages/affine/blocks/code/src/code-block.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-block.ts rename to packages/affine/blocks/code/src/code-block.ts diff --git a/packages/affine/blocks/block-code/src/code-keymap.ts b/packages/affine/blocks/code/src/code-keymap.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-keymap.ts rename to packages/affine/blocks/code/src/code-keymap.ts diff --git a/packages/affine/blocks/block-code/src/code-toolbar/components/code-toolbar.ts b/packages/affine/blocks/code/src/code-toolbar/components/code-toolbar.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-toolbar/components/code-toolbar.ts rename to packages/affine/blocks/code/src/code-toolbar/components/code-toolbar.ts diff --git a/packages/affine/blocks/block-code/src/code-toolbar/components/lang-button.ts b/packages/affine/blocks/code/src/code-toolbar/components/lang-button.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-toolbar/components/lang-button.ts rename to packages/affine/blocks/code/src/code-toolbar/components/lang-button.ts diff --git a/packages/affine/blocks/block-code/src/code-toolbar/config.ts b/packages/affine/blocks/code/src/code-toolbar/config.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-toolbar/config.ts rename to packages/affine/blocks/code/src/code-toolbar/config.ts diff --git a/packages/affine/blocks/block-code/src/code-toolbar/context.ts b/packages/affine/blocks/code/src/code-toolbar/context.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-toolbar/context.ts rename to packages/affine/blocks/code/src/code-toolbar/context.ts diff --git a/packages/affine/blocks/block-code/src/code-toolbar/index.ts b/packages/affine/blocks/code/src/code-toolbar/index.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-toolbar/index.ts rename to packages/affine/blocks/code/src/code-toolbar/index.ts diff --git a/packages/affine/blocks/block-code/src/code-toolbar/utils.ts b/packages/affine/blocks/code/src/code-toolbar/utils.ts similarity index 100% rename from packages/affine/blocks/block-code/src/code-toolbar/utils.ts rename to packages/affine/blocks/code/src/code-toolbar/utils.ts diff --git a/packages/affine/blocks/block-code/src/configs/slash-menu.ts b/packages/affine/blocks/code/src/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-code/src/configs/slash-menu.ts rename to packages/affine/blocks/code/src/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-code/src/effects.ts b/packages/affine/blocks/code/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-code/src/effects.ts rename to packages/affine/blocks/code/src/effects.ts diff --git a/packages/affine/blocks/block-code/src/highlight/affine-code-unit.ts b/packages/affine/blocks/code/src/highlight/affine-code-unit.ts similarity index 97% rename from packages/affine/blocks/block-code/src/highlight/affine-code-unit.ts rename to packages/affine/blocks/code/src/highlight/affine-code-unit.ts index 684f7e4ae14a..1fff01008ce5 100644 --- a/packages/affine/blocks/block-code/src/highlight/affine-code-unit.ts +++ b/packages/affine/blocks/code/src/highlight/affine-code-unit.ts @@ -1,7 +1,7 @@ import { affineTextStyles } from '@blocksuite/affine-shared/styles'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { ShadowlessElement } from '@blocksuite/std'; -import { ZERO_WIDTH_SPACE } from '@blocksuite/std/inline'; +import { ZERO_WIDTH_FOR_EMPTY_LINE } from '@blocksuite/std/inline'; import type { DeltaInsert } from '@blocksuite/store'; import { html } from 'lit'; import { property } from 'lit/decorators.js'; @@ -111,7 +111,7 @@ export class AffineCodeUnit extends ShadowlessElement { @property({ type: Object }) accessor delta: DeltaInsert = { - insert: ZERO_WIDTH_SPACE, + insert: ZERO_WIDTH_FOR_EMPTY_LINE, }; } diff --git a/packages/affine/blocks/block-code/src/highlight/const.ts b/packages/affine/blocks/code/src/highlight/const.ts similarity index 100% rename from packages/affine/blocks/block-code/src/highlight/const.ts rename to packages/affine/blocks/code/src/highlight/const.ts diff --git a/packages/affine/blocks/block-code/src/index.ts b/packages/affine/blocks/code/src/index.ts similarity index 64% rename from packages/affine/blocks/block-code/src/index.ts rename to packages/affine/blocks/code/src/index.ts index dc06c61a67ed..4de4cf592b22 100644 --- a/packages/affine/blocks/block-code/src/index.ts +++ b/packages/affine/blocks/code/src/index.ts @@ -3,3 +3,5 @@ export * from './code-block'; export * from './code-block-config'; export * from './code-block-spec'; export * from './code-toolbar'; +export * from './turbo/code-layout-handler'; +export * from './turbo/code-painter.worker'; diff --git a/packages/affine/blocks/block-code/src/styles.ts b/packages/affine/blocks/code/src/styles.ts similarity index 100% rename from packages/affine/blocks/block-code/src/styles.ts rename to packages/affine/blocks/code/src/styles.ts diff --git a/packages/affine/blocks/code/src/turbo/code-layout-handler.ts b/packages/affine/blocks/code/src/turbo/code-layout-handler.ts new file mode 100644 index 000000000000..3a43ba2b8544 --- /dev/null +++ b/packages/affine/blocks/code/src/turbo/code-layout-handler.ts @@ -0,0 +1,71 @@ +import type { Rect } from '@blocksuite/affine-gfx-turbo-renderer'; +import { + BlockLayoutHandlerExtension, + BlockLayoutHandlersIdentifier, +} from '@blocksuite/affine-gfx-turbo-renderer'; +import type { Container } from '@blocksuite/global/di'; +import type { EditorHost, GfxBlockComponent } from '@blocksuite/std'; +import { clientToModelCoord, type ViewportRecord } from '@blocksuite/std/gfx'; +import type { BlockModel } from '@blocksuite/store'; + +import type { CodeLayout } from './code-painter.worker'; + +export class CodeLayoutHandlerExtension extends BlockLayoutHandlerExtension { + readonly blockType = 'affine:code'; + + static override setup(di: Container) { + di.addImpl( + BlockLayoutHandlersIdentifier('code'), + CodeLayoutHandlerExtension + ); + } + + override queryLayout( + model: BlockModel, + host: EditorHost, + viewportRecord: ViewportRecord + ): CodeLayout | null { + const component = host.std.view.getBlock(model.id) as GfxBlockComponent; + if (!component) return null; + + const codeBlockElement = component.querySelector( + '.affine-code-block-container' + ); + if (!codeBlockElement) return null; + + const { zoom, viewScale } = viewportRecord; + const codeLayout: CodeLayout = { + type: 'affine:code', + blockId: model.id, + rect: { x: 0, y: 0, w: 0, h: 0 }, + }; + + // Get the bounding rect of the code block + const clientRect = codeBlockElement.getBoundingClientRect(); + if (!clientRect) return null; + + // Convert client coordinates to model coordinates + const [modelX, modelY] = clientToModelCoord(viewportRecord, [ + clientRect.x, + clientRect.y, + ]); + + codeLayout.rect = { + x: modelX, + y: modelY, + w: clientRect.width / zoom / viewScale, + h: clientRect.height / zoom / viewScale, + }; + + return codeLayout; + } + + calculateBound(layout: CodeLayout) { + const rect: Rect = layout.rect; + + return { + rect, + subRects: [rect], + }; + } +} diff --git a/packages/affine/blocks/code/src/turbo/code-painter.worker.ts b/packages/affine/blocks/code/src/turbo/code-painter.worker.ts new file mode 100644 index 000000000000..9b929a3152cb --- /dev/null +++ b/packages/affine/blocks/code/src/turbo/code-painter.worker.ts @@ -0,0 +1,53 @@ +import type { + BlockLayout, + BlockLayoutPainter, + WorkerToHostMessage, +} from '@blocksuite/affine-gfx-turbo-renderer'; +import { BlockLayoutPainterExtension } from '@blocksuite/affine-gfx-turbo-renderer/painter'; + +export interface CodeLayout extends BlockLayout { + type: 'affine:code'; +} + +function isCodeLayout(layout: BlockLayout): layout is CodeLayout { + return layout.type === 'affine:code'; +} + +class CodeLayoutPainter implements BlockLayoutPainter { + paint( + ctx: OffscreenCanvasRenderingContext2D, + layout: BlockLayout, + layoutBaseX: number, + layoutBaseY: number + ): void { + if (!isCodeLayout(layout)) { + const message: WorkerToHostMessage = { + type: 'paintError', + error: 'Invalid layout format', + blockType: 'affine:code', + }; + self.postMessage(message); + return; + } + + // Get the layout dimensions + const x = layout.rect.x - layoutBaseX; + const y = layout.rect.y - layoutBaseY; + const width = layout.rect.w; + const height = layout.rect.h; + + // Simple white rectangle for now + ctx.fillStyle = 'white'; + ctx.fillRect(x, y, width, height); + + // Add a border to visualize the code block + ctx.strokeStyle = 'rgba(0, 0, 0, 0.1)'; + ctx.lineWidth = 1; + ctx.strokeRect(x, y, width, height); + } +} + +export const CodeLayoutPainterExtension = BlockLayoutPainterExtension( + 'affine:code', + CodeLayoutPainter +); diff --git a/packages/affine/blocks/block-code/tsconfig.json b/packages/affine/blocks/code/tsconfig.json similarity index 87% rename from packages/affine/blocks/block-code/tsconfig.json rename to packages/affine/blocks/code/tsconfig.json index dba4360dccf1..0132fbfea1b8 100644 --- a/packages/affine/blocks/block-code/tsconfig.json +++ b/packages/affine/blocks/code/tsconfig.json @@ -8,13 +8,14 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../gfx/turbo-renderer" }, { "path": "../../inlines/latex" }, { "path": "../../inlines/link" }, { "path": "../../inlines/preset" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-slash-menu" }, + { "path": "../../widgets/slash-menu" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/blocks/block-data-view/package.json b/packages/affine/blocks/data-view/package.json similarity index 100% rename from packages/affine/blocks/block-data-view/package.json rename to packages/affine/blocks/data-view/package.json diff --git a/packages/affine/blocks/block-data-view/src/block-meta/base.ts b/packages/affine/blocks/data-view/src/block-meta/base.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/block-meta/base.ts rename to packages/affine/blocks/data-view/src/block-meta/base.ts diff --git a/packages/affine/blocks/block-data-view/src/block-meta/index.ts b/packages/affine/blocks/data-view/src/block-meta/index.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/block-meta/index.ts rename to packages/affine/blocks/data-view/src/block-meta/index.ts diff --git a/packages/affine/blocks/block-data-view/src/block-meta/todo.ts b/packages/affine/blocks/data-view/src/block-meta/todo.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/block-meta/todo.ts rename to packages/affine/blocks/data-view/src/block-meta/todo.ts diff --git a/packages/affine/blocks/block-data-view/src/columns/index.ts b/packages/affine/blocks/data-view/src/columns/index.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/columns/index.ts rename to packages/affine/blocks/data-view/src/columns/index.ts diff --git a/packages/affine/blocks/block-data-view/src/configs/slash-menu.ts b/packages/affine/blocks/data-view/src/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/configs/slash-menu.ts rename to packages/affine/blocks/data-view/src/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-data-view/src/configs/tooltips.ts b/packages/affine/blocks/data-view/src/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/configs/tooltips.ts rename to packages/affine/blocks/data-view/src/configs/tooltips.ts diff --git a/packages/affine/blocks/block-data-view/src/data-source.ts b/packages/affine/blocks/data-view/src/data-source.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/data-source.ts rename to packages/affine/blocks/data-view/src/data-source.ts diff --git a/packages/affine/blocks/block-data-view/src/data-view-block.ts b/packages/affine/blocks/data-view/src/data-view-block.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/data-view-block.ts rename to packages/affine/blocks/data-view/src/data-view-block.ts diff --git a/packages/affine/blocks/block-data-view/src/data-view-model.ts b/packages/affine/blocks/data-view/src/data-view-model.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/data-view-model.ts rename to packages/affine/blocks/data-view/src/data-view-model.ts diff --git a/packages/affine/blocks/block-data-view/src/data-view-spec.ts b/packages/affine/blocks/data-view/src/data-view-spec.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/data-view-spec.ts rename to packages/affine/blocks/data-view/src/data-view-spec.ts diff --git a/packages/affine/blocks/block-data-view/src/effects.ts b/packages/affine/blocks/data-view/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/effects.ts rename to packages/affine/blocks/data-view/src/effects.ts diff --git a/packages/affine/blocks/block-data-view/src/index.ts b/packages/affine/blocks/data-view/src/index.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/index.ts rename to packages/affine/blocks/data-view/src/index.ts diff --git a/packages/affine/blocks/block-data-view/src/views/index.ts b/packages/affine/blocks/data-view/src/views/index.ts similarity index 100% rename from packages/affine/blocks/block-data-view/src/views/index.ts rename to packages/affine/blocks/data-view/src/views/index.ts diff --git a/packages/affine/blocks/block-data-view/tsconfig.json b/packages/affine/blocks/data-view/tsconfig.json similarity index 84% rename from packages/affine/blocks/block-data-view/tsconfig.json rename to packages/affine/blocks/data-view/tsconfig.json index fd15f06baa47..1c415dce521a 100644 --- a/packages/affine/blocks/block-data-view/tsconfig.json +++ b/packages/affine/blocks/data-view/tsconfig.json @@ -7,11 +7,11 @@ }, "include": ["./src"], "references": [ - { "path": "../block-database" }, + { "path": "../database" }, { "path": "../../components" }, { "path": "../../model" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-slash-menu" }, + { "path": "../../widgets/slash-menu" }, { "path": "../../data-view" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, diff --git a/packages/affine/blocks/block-database/package.json b/packages/affine/blocks/database/package.json similarity index 100% rename from packages/affine/blocks/block-database/package.json rename to packages/affine/blocks/database/package.json diff --git a/packages/affine/blocks/block-database/src/adapters/extension.ts b/packages/affine/blocks/database/src/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-database/src/adapters/extension.ts rename to packages/affine/blocks/database/src/adapters/extension.ts diff --git a/packages/affine/blocks/block-database/src/adapters/html.ts b/packages/affine/blocks/database/src/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-database/src/adapters/html.ts rename to packages/affine/blocks/database/src/adapters/html.ts diff --git a/packages/affine/blocks/block-database/src/adapters/index.ts b/packages/affine/blocks/database/src/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-database/src/adapters/index.ts rename to packages/affine/blocks/database/src/adapters/index.ts diff --git a/packages/affine/blocks/block-database/src/adapters/markdown.ts b/packages/affine/blocks/database/src/adapters/markdown.ts similarity index 100% rename from packages/affine/blocks/block-database/src/adapters/markdown.ts rename to packages/affine/blocks/database/src/adapters/markdown.ts diff --git a/packages/affine/blocks/block-database/src/adapters/notion-html.ts b/packages/affine/blocks/database/src/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-database/src/adapters/notion-html.ts rename to packages/affine/blocks/database/src/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-database/src/adapters/plain-text.ts b/packages/affine/blocks/database/src/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-database/src/adapters/plain-text.ts rename to packages/affine/blocks/database/src/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-database/src/adapters/utils.ts b/packages/affine/blocks/database/src/adapters/utils.ts similarity index 100% rename from packages/affine/blocks/block-database/src/adapters/utils.ts rename to packages/affine/blocks/database/src/adapters/utils.ts diff --git a/packages/affine/blocks/block-database/src/block-icons.ts b/packages/affine/blocks/database/src/block-icons.ts similarity index 100% rename from packages/affine/blocks/block-database/src/block-icons.ts rename to packages/affine/blocks/database/src/block-icons.ts diff --git a/packages/affine/blocks/block-database/src/commands.ts b/packages/affine/blocks/database/src/commands.ts similarity index 100% rename from packages/affine/blocks/block-database/src/commands.ts rename to packages/affine/blocks/database/src/commands.ts diff --git a/packages/affine/blocks/block-database/src/components/layout.ts b/packages/affine/blocks/database/src/components/layout.ts similarity index 100% rename from packages/affine/blocks/block-database/src/components/layout.ts rename to packages/affine/blocks/database/src/components/layout.ts diff --git a/packages/affine/blocks/block-database/src/components/title/index.ts b/packages/affine/blocks/database/src/components/title/index.ts similarity index 100% rename from packages/affine/blocks/block-database/src/components/title/index.ts rename to packages/affine/blocks/database/src/components/title/index.ts diff --git a/packages/affine/blocks/block-database/src/config.ts b/packages/affine/blocks/database/src/config.ts similarity index 100% rename from packages/affine/blocks/block-database/src/config.ts rename to packages/affine/blocks/database/src/config.ts diff --git a/packages/affine/blocks/block-database/src/configs/slash-menu.ts b/packages/affine/blocks/database/src/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-database/src/configs/slash-menu.ts rename to packages/affine/blocks/database/src/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-database/src/configs/tooltips.ts b/packages/affine/blocks/database/src/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-database/src/configs/tooltips.ts rename to packages/affine/blocks/database/src/configs/tooltips.ts diff --git a/packages/affine/blocks/block-database/src/context/host-context.ts b/packages/affine/blocks/database/src/context/host-context.ts similarity index 100% rename from packages/affine/blocks/block-database/src/context/host-context.ts rename to packages/affine/blocks/database/src/context/host-context.ts diff --git a/packages/affine/blocks/block-database/src/context/index.ts b/packages/affine/blocks/database/src/context/index.ts similarity index 100% rename from packages/affine/blocks/block-database/src/context/index.ts rename to packages/affine/blocks/database/src/context/index.ts diff --git a/packages/affine/blocks/block-database/src/data-source.ts b/packages/affine/blocks/database/src/data-source.ts similarity index 100% rename from packages/affine/blocks/block-database/src/data-source.ts rename to packages/affine/blocks/database/src/data-source.ts diff --git a/packages/affine/blocks/block-database/src/database-block.ts b/packages/affine/blocks/database/src/database-block.ts similarity index 100% rename from packages/affine/blocks/block-database/src/database-block.ts rename to packages/affine/blocks/database/src/database-block.ts diff --git a/packages/affine/blocks/block-database/src/database-dnd-preview-block.ts b/packages/affine/blocks/database/src/database-dnd-preview-block.ts similarity index 100% rename from packages/affine/blocks/block-database/src/database-dnd-preview-block.ts rename to packages/affine/blocks/database/src/database-dnd-preview-block.ts diff --git a/packages/affine/blocks/block-database/src/database-spec.ts b/packages/affine/blocks/database/src/database-spec.ts similarity index 100% rename from packages/affine/blocks/block-database/src/database-spec.ts rename to packages/affine/blocks/database/src/database-spec.ts diff --git a/packages/affine/blocks/block-database/src/detail-panel/block-renderer.ts b/packages/affine/blocks/database/src/detail-panel/block-renderer.ts similarity index 100% rename from packages/affine/blocks/block-database/src/detail-panel/block-renderer.ts rename to packages/affine/blocks/database/src/detail-panel/block-renderer.ts diff --git a/packages/affine/blocks/block-database/src/detail-panel/note-renderer.ts b/packages/affine/blocks/database/src/detail-panel/note-renderer.ts similarity index 100% rename from packages/affine/blocks/block-database/src/detail-panel/note-renderer.ts rename to packages/affine/blocks/database/src/detail-panel/note-renderer.ts diff --git a/packages/affine/blocks/block-database/src/effects.ts b/packages/affine/blocks/database/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-database/src/effects.ts rename to packages/affine/blocks/database/src/effects.ts diff --git a/packages/affine/blocks/block-database/src/index.ts b/packages/affine/blocks/database/src/index.ts similarity index 100% rename from packages/affine/blocks/block-database/src/index.ts rename to packages/affine/blocks/database/src/index.ts diff --git a/packages/affine/blocks/block-database/src/properties/converts.ts b/packages/affine/blocks/database/src/properties/converts.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/converts.ts rename to packages/affine/blocks/database/src/properties/converts.ts diff --git a/packages/affine/blocks/block-database/src/properties/index.ts b/packages/affine/blocks/database/src/properties/index.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/index.ts rename to packages/affine/blocks/database/src/properties/index.ts diff --git a/packages/affine/blocks/block-database/src/properties/link/cell-renderer.css.ts b/packages/affine/blocks/database/src/properties/link/cell-renderer.css.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/link/cell-renderer.css.ts rename to packages/affine/blocks/database/src/properties/link/cell-renderer.css.ts diff --git a/packages/affine/blocks/block-database/src/properties/link/cell-renderer.ts b/packages/affine/blocks/database/src/properties/link/cell-renderer.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/link/cell-renderer.ts rename to packages/affine/blocks/database/src/properties/link/cell-renderer.ts diff --git a/packages/affine/blocks/block-database/src/properties/link/define.ts b/packages/affine/blocks/database/src/properties/link/define.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/link/define.ts rename to packages/affine/blocks/database/src/properties/link/define.ts diff --git a/packages/affine/blocks/block-database/src/properties/model.ts b/packages/affine/blocks/database/src/properties/model.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/model.ts rename to packages/affine/blocks/database/src/properties/model.ts diff --git a/packages/affine/blocks/block-database/src/properties/rich-text/cell-renderer.css.ts b/packages/affine/blocks/database/src/properties/rich-text/cell-renderer.css.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/rich-text/cell-renderer.css.ts rename to packages/affine/blocks/database/src/properties/rich-text/cell-renderer.css.ts diff --git a/packages/affine/blocks/block-database/src/properties/rich-text/cell-renderer.ts b/packages/affine/blocks/database/src/properties/rich-text/cell-renderer.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/rich-text/cell-renderer.ts rename to packages/affine/blocks/database/src/properties/rich-text/cell-renderer.ts diff --git a/packages/affine/blocks/block-database/src/properties/rich-text/define.ts b/packages/affine/blocks/database/src/properties/rich-text/define.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/rich-text/define.ts rename to packages/affine/blocks/database/src/properties/rich-text/define.ts diff --git a/packages/affine/blocks/block-database/src/properties/title/cell-renderer.css.ts b/packages/affine/blocks/database/src/properties/title/cell-renderer.css.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/title/cell-renderer.css.ts rename to packages/affine/blocks/database/src/properties/title/cell-renderer.css.ts diff --git a/packages/affine/blocks/block-database/src/properties/title/cell-renderer.ts b/packages/affine/blocks/database/src/properties/title/cell-renderer.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/title/cell-renderer.ts rename to packages/affine/blocks/database/src/properties/title/cell-renderer.ts diff --git a/packages/affine/blocks/block-database/src/properties/title/define.ts b/packages/affine/blocks/database/src/properties/title/define.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/title/define.ts rename to packages/affine/blocks/database/src/properties/title/define.ts diff --git a/packages/affine/blocks/block-database/src/properties/title/icon.ts b/packages/affine/blocks/database/src/properties/title/icon.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/title/icon.ts rename to packages/affine/blocks/database/src/properties/title/icon.ts diff --git a/packages/affine/blocks/block-database/src/properties/title/text.ts b/packages/affine/blocks/database/src/properties/title/text.ts similarity index 100% rename from packages/affine/blocks/block-database/src/properties/title/text.ts rename to packages/affine/blocks/database/src/properties/title/text.ts diff --git a/packages/affine/blocks/block-database/src/selection.ts b/packages/affine/blocks/database/src/selection.ts similarity index 100% rename from packages/affine/blocks/block-database/src/selection.ts rename to packages/affine/blocks/database/src/selection.ts diff --git a/packages/affine/blocks/block-database/src/service/index.ts b/packages/affine/blocks/database/src/service/index.ts similarity index 100% rename from packages/affine/blocks/block-database/src/service/index.ts rename to packages/affine/blocks/database/src/service/index.ts diff --git a/packages/affine/blocks/block-database/src/utils/block-utils.ts b/packages/affine/blocks/database/src/utils/block-utils.ts similarity index 100% rename from packages/affine/blocks/block-database/src/utils/block-utils.ts rename to packages/affine/blocks/database/src/utils/block-utils.ts diff --git a/packages/affine/blocks/block-database/src/utils/current-view.ts b/packages/affine/blocks/database/src/utils/current-view.ts similarity index 100% rename from packages/affine/blocks/block-database/src/utils/current-view.ts rename to packages/affine/blocks/database/src/utils/current-view.ts diff --git a/packages/affine/blocks/block-database/src/utils/title-doc.ts b/packages/affine/blocks/database/src/utils/title-doc.ts similarity index 100% rename from packages/affine/blocks/block-database/src/utils/title-doc.ts rename to packages/affine/blocks/database/src/utils/title-doc.ts diff --git a/packages/affine/blocks/block-database/src/views/index.ts b/packages/affine/blocks/database/src/views/index.ts similarity index 100% rename from packages/affine/blocks/block-database/src/views/index.ts rename to packages/affine/blocks/database/src/views/index.ts diff --git a/packages/affine/blocks/block-database/src/widgets/index.ts b/packages/affine/blocks/database/src/widgets/index.ts similarity index 100% rename from packages/affine/blocks/block-database/src/widgets/index.ts rename to packages/affine/blocks/database/src/widgets/index.ts diff --git a/packages/affine/blocks/block-database/tsconfig.json b/packages/affine/blocks/database/tsconfig.json similarity index 86% rename from packages/affine/blocks/block-database/tsconfig.json rename to packages/affine/blocks/database/tsconfig.json index b96f024b7bdd..39cdc5c2a309 100644 --- a/packages/affine/blocks/block-database/tsconfig.json +++ b/packages/affine/blocks/database/tsconfig.json @@ -14,8 +14,8 @@ { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-drag-handle" }, - { "path": "../../widgets/widget-slash-menu" }, + { "path": "../../widgets/drag-handle" }, + { "path": "../../widgets/slash-menu" }, { "path": "../../data-view" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, diff --git a/packages/affine/blocks/block-divider/package.json b/packages/affine/blocks/divider/package.json similarity index 100% rename from packages/affine/blocks/block-divider/package.json rename to packages/affine/blocks/divider/package.json diff --git a/packages/affine/blocks/block-divider/src/adapters/extension.ts b/packages/affine/blocks/divider/src/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-divider/src/adapters/extension.ts rename to packages/affine/blocks/divider/src/adapters/extension.ts diff --git a/packages/affine/blocks/block-divider/src/adapters/html.ts b/packages/affine/blocks/divider/src/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-divider/src/adapters/html.ts rename to packages/affine/blocks/divider/src/adapters/html.ts diff --git a/packages/affine/blocks/block-divider/src/adapters/index.ts b/packages/affine/blocks/divider/src/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-divider/src/adapters/index.ts rename to packages/affine/blocks/divider/src/adapters/index.ts diff --git a/packages/affine/blocks/block-divider/src/adapters/markdown.ts b/packages/affine/blocks/divider/src/adapters/markdown.ts similarity index 100% rename from packages/affine/blocks/block-divider/src/adapters/markdown.ts rename to packages/affine/blocks/divider/src/adapters/markdown.ts diff --git a/packages/affine/blocks/block-divider/src/adapters/notion-html.ts b/packages/affine/blocks/divider/src/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-divider/src/adapters/notion-html.ts rename to packages/affine/blocks/divider/src/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-divider/src/adapters/plain-text.ts b/packages/affine/blocks/divider/src/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-divider/src/adapters/plain-text.ts rename to packages/affine/blocks/divider/src/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-divider/src/divider-block.ts b/packages/affine/blocks/divider/src/divider-block.ts similarity index 100% rename from packages/affine/blocks/block-divider/src/divider-block.ts rename to packages/affine/blocks/divider/src/divider-block.ts diff --git a/packages/affine/blocks/block-divider/src/divider-spec.ts b/packages/affine/blocks/divider/src/divider-spec.ts similarity index 100% rename from packages/affine/blocks/block-divider/src/divider-spec.ts rename to packages/affine/blocks/divider/src/divider-spec.ts diff --git a/packages/affine/blocks/block-divider/src/effects.ts b/packages/affine/blocks/divider/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-divider/src/effects.ts rename to packages/affine/blocks/divider/src/effects.ts diff --git a/packages/affine/blocks/block-divider/src/index.ts b/packages/affine/blocks/divider/src/index.ts similarity index 100% rename from packages/affine/blocks/block-divider/src/index.ts rename to packages/affine/blocks/divider/src/index.ts diff --git a/packages/affine/blocks/block-divider/src/styles.ts b/packages/affine/blocks/divider/src/styles.ts similarity index 100% rename from packages/affine/blocks/block-divider/src/styles.ts rename to packages/affine/blocks/divider/src/styles.ts diff --git a/packages/affine/blocks/block-divider/tsconfig.json b/packages/affine/blocks/divider/tsconfig.json similarity index 100% rename from packages/affine/blocks/block-divider/tsconfig.json rename to packages/affine/blocks/divider/tsconfig.json diff --git a/packages/affine/blocks/block-edgeless-text/package.json b/packages/affine/blocks/edgeless-text/package.json similarity index 100% rename from packages/affine/blocks/block-edgeless-text/package.json rename to packages/affine/blocks/edgeless-text/package.json diff --git a/packages/affine/blocks/block-edgeless-text/src/edgeless-clipboard-config.ts b/packages/affine/blocks/edgeless-text/src/edgeless-clipboard-config.ts similarity index 100% rename from packages/affine/blocks/block-edgeless-text/src/edgeless-clipboard-config.ts rename to packages/affine/blocks/edgeless-text/src/edgeless-clipboard-config.ts diff --git a/packages/affine/blocks/block-edgeless-text/src/edgeless-text-block.ts b/packages/affine/blocks/edgeless-text/src/edgeless-text-block.ts similarity index 99% rename from packages/affine/blocks/block-edgeless-text/src/edgeless-text-block.ts rename to packages/affine/blocks/edgeless-text/src/edgeless-text-block.ts index d8e37a0f6659..d161247a4018 100644 --- a/packages/affine/blocks/block-edgeless-text/src/edgeless-text-block.ts +++ b/packages/affine/blocks/edgeless-text/src/edgeless-text-block.ts @@ -259,7 +259,7 @@ export class EdgelessTextBlockComponent extends GfxBlockComponent { - // TODO(@L-Sun): make linked-doc-widget as extension - subscription.unsubscribe(); - // @ts-expect-error same as above - linkedDocWidget.show({ addTriggerKey: true }); - } - ); - } + linkedDocWidget.show({ addTriggerKey: true }); }, }, ], diff --git a/packages/affine/blocks/block-embed/src/embed-linked-doc-block/configs/toolbar.ts b/packages/affine/blocks/embed/src/embed-linked-doc-block/configs/toolbar.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-linked-doc-block/configs/toolbar.ts rename to packages/affine/blocks/embed/src/embed-linked-doc-block/configs/toolbar.ts diff --git a/packages/affine/blocks/block-embed/src/embed-linked-doc-block/configs/tooltips.ts b/packages/affine/blocks/embed/src/embed-linked-doc-block/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-linked-doc-block/configs/tooltips.ts rename to packages/affine/blocks/embed/src/embed-linked-doc-block/configs/tooltips.ts diff --git a/packages/affine/blocks/block-embed/src/embed-linked-doc-block/edgeless-clipboard-config.ts b/packages/affine/blocks/embed/src/embed-linked-doc-block/edgeless-clipboard-config.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-linked-doc-block/edgeless-clipboard-config.ts rename to packages/affine/blocks/embed/src/embed-linked-doc-block/edgeless-clipboard-config.ts diff --git a/packages/affine/blocks/block-embed/src/embed-linked-doc-block/embed-edgeless-linked-doc-block.ts b/packages/affine/blocks/embed/src/embed-linked-doc-block/embed-edgeless-linked-doc-block.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-linked-doc-block/embed-edgeless-linked-doc-block.ts rename to packages/affine/blocks/embed/src/embed-linked-doc-block/embed-edgeless-linked-doc-block.ts diff --git a/packages/affine/blocks/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts b/packages/affine/blocks/embed/src/embed-linked-doc-block/embed-linked-doc-block.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-linked-doc-block/embed-linked-doc-block.ts rename to packages/affine/blocks/embed/src/embed-linked-doc-block/embed-linked-doc-block.ts diff --git a/packages/affine/blocks/block-embed/src/embed-linked-doc-block/embed-linked-doc-spec.ts b/packages/affine/blocks/embed/src/embed-linked-doc-block/embed-linked-doc-spec.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-linked-doc-block/embed-linked-doc-spec.ts rename to packages/affine/blocks/embed/src/embed-linked-doc-block/embed-linked-doc-spec.ts diff --git a/packages/affine/blocks/block-embed/src/embed-linked-doc-block/index.ts b/packages/affine/blocks/embed/src/embed-linked-doc-block/index.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-linked-doc-block/index.ts rename to packages/affine/blocks/embed/src/embed-linked-doc-block/index.ts diff --git a/packages/affine/blocks/block-embed/src/embed-linked-doc-block/styles.ts b/packages/affine/blocks/embed/src/embed-linked-doc-block/styles.ts similarity index 99% rename from packages/affine/blocks/block-embed/src/embed-linked-doc-block/styles.ts rename to packages/affine/blocks/embed/src/embed-linked-doc-block/styles.ts index 190234aaf361..9447e8c4da3e 100644 --- a/packages/affine/blocks/block-embed/src/embed-linked-doc-block/styles.ts +++ b/packages/affine/blocks/embed/src/embed-linked-doc-block/styles.ts @@ -27,6 +27,7 @@ export const styles = css` padding: 12px; border-radius: var(--1, 0px); opacity: var(--add, 1); + max-width: 100%; } .affine-embed-linked-doc-content-title { diff --git a/packages/affine/blocks/block-embed/src/embed-linked-doc-block/utils.ts b/packages/affine/blocks/embed/src/embed-linked-doc-block/utils.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-linked-doc-block/utils.ts rename to packages/affine/blocks/embed/src/embed-linked-doc-block/utils.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/adapters/extension.ts b/packages/affine/blocks/embed/src/embed-loom-block/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/adapters/extension.ts rename to packages/affine/blocks/embed/src/embed-loom-block/adapters/extension.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/adapters/html.ts b/packages/affine/blocks/embed/src/embed-loom-block/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/adapters/html.ts rename to packages/affine/blocks/embed/src/embed-loom-block/adapters/html.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/adapters/index.ts b/packages/affine/blocks/embed/src/embed-loom-block/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/adapters/index.ts rename to packages/affine/blocks/embed/src/embed-loom-block/adapters/index.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/adapters/markdown.ts b/packages/affine/blocks/embed/src/embed-loom-block/adapters/markdown.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/adapters/markdown.ts rename to packages/affine/blocks/embed/src/embed-loom-block/adapters/markdown.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/adapters/notion-html.ts b/packages/affine/blocks/embed/src/embed-loom-block/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/adapters/notion-html.ts rename to packages/affine/blocks/embed/src/embed-loom-block/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/adapters/plain-text.ts b/packages/affine/blocks/embed/src/embed-loom-block/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/adapters/plain-text.ts rename to packages/affine/blocks/embed/src/embed-loom-block/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/configs/slash-menu.ts b/packages/affine/blocks/embed/src/embed-loom-block/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/configs/slash-menu.ts rename to packages/affine/blocks/embed/src/embed-loom-block/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/configs/tooltips.ts b/packages/affine/blocks/embed/src/embed-loom-block/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/configs/tooltips.ts rename to packages/affine/blocks/embed/src/embed-loom-block/configs/tooltips.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/edgeless-clipboard-config.ts b/packages/affine/blocks/embed/src/embed-loom-block/edgeless-clipboard-config.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/edgeless-clipboard-config.ts rename to packages/affine/blocks/embed/src/embed-loom-block/edgeless-clipboard-config.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/embed-edgeless-loom-bock.ts b/packages/affine/blocks/embed/src/embed-loom-block/embed-edgeless-loom-bock.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/embed-edgeless-loom-bock.ts rename to packages/affine/blocks/embed/src/embed-loom-block/embed-edgeless-loom-bock.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/embed-loom-block.ts b/packages/affine/blocks/embed/src/embed-loom-block/embed-loom-block.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/embed-loom-block.ts rename to packages/affine/blocks/embed/src/embed-loom-block/embed-loom-block.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/embed-loom-model.ts b/packages/affine/blocks/embed/src/embed-loom-block/embed-loom-model.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/embed-loom-model.ts rename to packages/affine/blocks/embed/src/embed-loom-block/embed-loom-model.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/embed-loom-service.ts b/packages/affine/blocks/embed/src/embed-loom-block/embed-loom-service.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/embed-loom-service.ts rename to packages/affine/blocks/embed/src/embed-loom-block/embed-loom-service.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/embed-loom-spec.ts b/packages/affine/blocks/embed/src/embed-loom-block/embed-loom-spec.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/embed-loom-spec.ts rename to packages/affine/blocks/embed/src/embed-loom-block/embed-loom-spec.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/index.ts b/packages/affine/blocks/embed/src/embed-loom-block/index.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/index.ts rename to packages/affine/blocks/embed/src/embed-loom-block/index.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/styles.ts b/packages/affine/blocks/embed/src/embed-loom-block/styles.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/styles.ts rename to packages/affine/blocks/embed/src/embed-loom-block/styles.ts diff --git a/packages/affine/blocks/block-embed/src/embed-loom-block/utils.ts b/packages/affine/blocks/embed/src/embed-loom-block/utils.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-loom-block/utils.ts rename to packages/affine/blocks/embed/src/embed-loom-block/utils.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/adapters/extension.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/adapters/extension.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/adapters/extension.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/adapters/html.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/adapters/html.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/adapters/html.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/adapters/index.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/adapters/index.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/adapters/index.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/adapters/markdown.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/adapters/markdown.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/adapters/markdown.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/adapters/markdown.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/adapters/plain-text.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/adapters/plain-text.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/components/embed-synced-doc-card.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/components/embed-synced-doc-card.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/components/embed-synced-doc-card.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/components/embed-synced-doc-card.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/configs/toolbar.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/configs/toolbar.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/configs/toolbar.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/configs/toolbar.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/edgeless-clipboard-config.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/edgeless-clipboard-config.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/edgeless-clipboard-config.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/edgeless-clipboard-config.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/embed-edgeless-synced-doc-block.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/embed-edgeless-synced-doc-block.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/embed-edgeless-synced-doc-block.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/embed-edgeless-synced-doc-block.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/embed-synced-doc-block.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/embed-synced-doc-block.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/embed-synced-doc-block.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/embed-synced-doc-block.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/embed-synced-doc-spec.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/embed-synced-doc-spec.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/embed-synced-doc-spec.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/embed-synced-doc-spec.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/index.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/index.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/index.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/index.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/styles.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/styles.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/styles.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/styles.ts diff --git a/packages/affine/blocks/block-embed/src/embed-synced-doc-block/utils.ts b/packages/affine/blocks/embed/src/embed-synced-doc-block/utils.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-synced-doc-block/utils.ts rename to packages/affine/blocks/embed/src/embed-synced-doc-block/utils.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/extension.ts b/packages/affine/blocks/embed/src/embed-youtube-block/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/extension.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/adapters/extension.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/html.ts b/packages/affine/blocks/embed/src/embed-youtube-block/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/html.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/adapters/html.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/index.ts b/packages/affine/blocks/embed/src/embed-youtube-block/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/index.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/adapters/index.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/markdown.ts b/packages/affine/blocks/embed/src/embed-youtube-block/adapters/markdown.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/markdown.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/adapters/markdown.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/notion-html.ts b/packages/affine/blocks/embed/src/embed-youtube-block/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/notion-html.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/plain-text.ts b/packages/affine/blocks/embed/src/embed-youtube-block/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/adapters/plain-text.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/configs/slash-menu.ts b/packages/affine/blocks/embed/src/embed-youtube-block/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/configs/slash-menu.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/configs/tooltips.ts b/packages/affine/blocks/embed/src/embed-youtube-block/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/configs/tooltips.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/configs/tooltips.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/edgeless-clipboard-config.ts b/packages/affine/blocks/embed/src/embed-youtube-block/edgeless-clipboard-config.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/edgeless-clipboard-config.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/edgeless-clipboard-config.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/embed-edgeless-youtube-block.ts b/packages/affine/blocks/embed/src/embed-youtube-block/embed-edgeless-youtube-block.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/embed-edgeless-youtube-block.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/embed-edgeless-youtube-block.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/embed-youtube-block.ts b/packages/affine/blocks/embed/src/embed-youtube-block/embed-youtube-block.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/embed-youtube-block.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/embed-youtube-block.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/embed-youtube-model.ts b/packages/affine/blocks/embed/src/embed-youtube-block/embed-youtube-model.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/embed-youtube-model.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/embed-youtube-model.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/embed-youtube-service.ts b/packages/affine/blocks/embed/src/embed-youtube-block/embed-youtube-service.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/embed-youtube-service.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/embed-youtube-service.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/embed-youtube-spec.ts b/packages/affine/blocks/embed/src/embed-youtube-block/embed-youtube-spec.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/embed-youtube-spec.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/embed-youtube-spec.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/index.ts b/packages/affine/blocks/embed/src/embed-youtube-block/index.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/index.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/index.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/styles.ts b/packages/affine/blocks/embed/src/embed-youtube-block/styles.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/styles.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/styles.ts diff --git a/packages/affine/blocks/block-embed/src/embed-youtube-block/utils.ts b/packages/affine/blocks/embed/src/embed-youtube-block/utils.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/embed-youtube-block/utils.ts rename to packages/affine/blocks/embed/src/embed-youtube-block/utils.ts diff --git a/packages/affine/blocks/block-embed/src/index.ts b/packages/affine/blocks/embed/src/index.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/index.ts rename to packages/affine/blocks/embed/src/index.ts diff --git a/packages/affine/blocks/block-embed/src/types.ts b/packages/affine/blocks/embed/src/types.ts similarity index 100% rename from packages/affine/blocks/block-embed/src/types.ts rename to packages/affine/blocks/embed/src/types.ts diff --git a/packages/affine/blocks/block-embed/tsconfig.json b/packages/affine/blocks/embed/tsconfig.json similarity index 85% rename from packages/affine/blocks/block-embed/tsconfig.json rename to packages/affine/blocks/embed/tsconfig.json index 2e8687f03a07..5200f43f97e9 100644 --- a/packages/affine/blocks/block-embed/tsconfig.json +++ b/packages/affine/blocks/embed/tsconfig.json @@ -7,13 +7,13 @@ }, "include": ["./src"], "references": [ - { "path": "../block-surface" }, + { "path": "../surface" }, { "path": "../../components" }, { "path": "../../inlines/reference" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-slash-menu" }, + { "path": "../../widgets/slash-menu" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/blocks/block-frame/package.json b/packages/affine/blocks/frame/package.json similarity index 100% rename from packages/affine/blocks/block-frame/package.json rename to packages/affine/blocks/frame/package.json diff --git a/packages/affine/blocks/block-frame/src/edgeless-clipboard-config.ts b/packages/affine/blocks/frame/src/edgeless-clipboard-config.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/edgeless-clipboard-config.ts rename to packages/affine/blocks/frame/src/edgeless-clipboard-config.ts diff --git a/packages/affine/blocks/block-frame/src/edgeless-toolbar/config.ts b/packages/affine/blocks/frame/src/edgeless-toolbar/config.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/edgeless-toolbar/config.ts rename to packages/affine/blocks/frame/src/edgeless-toolbar/config.ts diff --git a/packages/affine/blocks/block-frame/src/edgeless-toolbar/frame-dense-menu.ts b/packages/affine/blocks/frame/src/edgeless-toolbar/frame-dense-menu.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/edgeless-toolbar/frame-dense-menu.ts rename to packages/affine/blocks/frame/src/edgeless-toolbar/frame-dense-menu.ts diff --git a/packages/affine/blocks/block-frame/src/edgeless-toolbar/frame-menu.ts b/packages/affine/blocks/frame/src/edgeless-toolbar/frame-menu.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/edgeless-toolbar/frame-menu.ts rename to packages/affine/blocks/frame/src/edgeless-toolbar/frame-menu.ts diff --git a/packages/affine/blocks/block-frame/src/edgeless-toolbar/frame-tool-button.ts b/packages/affine/blocks/frame/src/edgeless-toolbar/frame-tool-button.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/edgeless-toolbar/frame-tool-button.ts rename to packages/affine/blocks/frame/src/edgeless-toolbar/frame-tool-button.ts diff --git a/packages/affine/blocks/block-frame/src/edgeless-toolbar/index.ts b/packages/affine/blocks/frame/src/edgeless-toolbar/index.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/edgeless-toolbar/index.ts rename to packages/affine/blocks/frame/src/edgeless-toolbar/index.ts diff --git a/packages/affine/blocks/block-frame/src/edgeless-toolbar/presentation-toolbar.ts b/packages/affine/blocks/frame/src/edgeless-toolbar/presentation-toolbar.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/edgeless-toolbar/presentation-toolbar.ts rename to packages/affine/blocks/frame/src/edgeless-toolbar/presentation-toolbar.ts diff --git a/packages/affine/blocks/block-frame/src/edgeless-toolbar/quick-tool.ts b/packages/affine/blocks/frame/src/edgeless-toolbar/quick-tool.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/edgeless-toolbar/quick-tool.ts rename to packages/affine/blocks/frame/src/edgeless-toolbar/quick-tool.ts diff --git a/packages/affine/blocks/block-frame/src/effects.ts b/packages/affine/blocks/frame/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/effects.ts rename to packages/affine/blocks/frame/src/effects.ts diff --git a/packages/affine/blocks/block-frame/src/frame-block.ts b/packages/affine/blocks/frame/src/frame-block.ts similarity index 96% rename from packages/affine/blocks/block-frame/src/frame-block.ts rename to packages/affine/blocks/frame/src/frame-block.ts index 5b7415eb119f..142a72841f74 100644 --- a/packages/affine/blocks/block-frame/src/frame-block.ts +++ b/packages/affine/blocks/frame/src/frame-block.ts @@ -53,7 +53,7 @@ export class FrameBlockComponent extends GfxBlockComponent { }; } - override onSelected(context: SelectedContext): void { + override onSelected(context: SelectedContext): boolean | void { const { x, y } = context.position; if ( @@ -63,10 +63,10 @@ export class FrameBlockComponent extends GfxBlockComponent { // otherwise if the frame has title, then ignore it because in this case the frame cannot be selected by frame body this.model.props.title.length) ) { - return; + return false; } - super.onSelected(context); + return super.onSelected(context); } override renderGfxBlock() { diff --git a/packages/affine/blocks/block-frame/src/frame-highlight-manager.ts b/packages/affine/blocks/frame/src/frame-highlight-manager.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/frame-highlight-manager.ts rename to packages/affine/blocks/frame/src/frame-highlight-manager.ts diff --git a/packages/affine/blocks/block-frame/src/frame-manager.ts b/packages/affine/blocks/frame/src/frame-manager.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/frame-manager.ts rename to packages/affine/blocks/frame/src/frame-manager.ts diff --git a/packages/affine/blocks/block-frame/src/frame-spec.ts b/packages/affine/blocks/frame/src/frame-spec.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/frame-spec.ts rename to packages/affine/blocks/frame/src/frame-spec.ts diff --git a/packages/affine/blocks/block-frame/src/frame-tool.ts b/packages/affine/blocks/frame/src/frame-tool.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/frame-tool.ts rename to packages/affine/blocks/frame/src/frame-tool.ts diff --git a/packages/affine/blocks/block-frame/src/frame-toolbar.ts b/packages/affine/blocks/frame/src/frame-toolbar.ts similarity index 98% rename from packages/affine/blocks/block-frame/src/frame-toolbar.ts rename to packages/affine/blocks/frame/src/frame-toolbar.ts index 471947108bf4..1aeb60ec3e03 100644 --- a/packages/affine/blocks/block-frame/src/frame-toolbar.ts +++ b/packages/affine/blocks/frame/src/frame-toolbar.ts @@ -80,7 +80,7 @@ const builtinSurfaceToolbarConfig = { ctx.store.addBlock( SurfaceRefBlockSchema.model.flavour, - { reference: frameId, refFlavour: NoteBlockSchema.model.flavour }, + { reference: frameId, refFlavour: FrameBlockSchema.model.flavour }, lastNoteId ); diff --git a/packages/affine/blocks/block-frame/src/index.ts b/packages/affine/blocks/frame/src/index.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/index.ts rename to packages/affine/blocks/frame/src/index.ts diff --git a/packages/affine/blocks/block-frame/src/present/frame-order-button.ts b/packages/affine/blocks/frame/src/present/frame-order-button.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/present/frame-order-button.ts rename to packages/affine/blocks/frame/src/present/frame-order-button.ts diff --git a/packages/affine/blocks/block-frame/src/present/frame-order-menu.ts b/packages/affine/blocks/frame/src/present/frame-order-menu.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/present/frame-order-menu.ts rename to packages/affine/blocks/frame/src/present/frame-order-menu.ts diff --git a/packages/affine/blocks/block-frame/src/present/navigator-setting-button.ts b/packages/affine/blocks/frame/src/present/navigator-setting-button.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/present/navigator-setting-button.ts rename to packages/affine/blocks/frame/src/present/navigator-setting-button.ts diff --git a/packages/affine/blocks/block-frame/src/present/present-button.ts b/packages/affine/blocks/frame/src/present/present-button.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/present/present-button.ts rename to packages/affine/blocks/frame/src/present/present-button.ts diff --git a/packages/affine/blocks/block-frame/src/preset-tool.ts b/packages/affine/blocks/frame/src/preset-tool.ts similarity index 100% rename from packages/affine/blocks/block-frame/src/preset-tool.ts rename to packages/affine/blocks/frame/src/preset-tool.ts diff --git a/packages/affine/blocks/block-bookmark/tsconfig.json b/packages/affine/blocks/frame/tsconfig.json similarity index 78% rename from packages/affine/blocks/block-bookmark/tsconfig.json rename to packages/affine/blocks/frame/tsconfig.json index 8d401bfec101..541741e38777 100644 --- a/packages/affine/blocks/block-bookmark/tsconfig.json +++ b/packages/affine/blocks/frame/tsconfig.json @@ -7,12 +7,12 @@ }, "include": ["./src"], "references": [ - { "path": "../block-embed" }, - { "path": "../block-surface" }, + { "path": "../surface" }, { "path": "../../components" }, { "path": "../../model" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-slash-menu" }, + { "path": "../../widgets/edgeless-toolbar" }, + { "path": "../../widgets/frame-title" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/blocks/block-image/package.json b/packages/affine/blocks/image/package.json similarity index 87% rename from packages/affine/blocks/block-image/package.json rename to packages/affine/blocks/image/package.json index 659b6cc6abb5..21b1f274b2a3 100644 --- a/packages/affine/blocks/block-image/package.json +++ b/packages/affine/blocks/image/package.json @@ -13,6 +13,7 @@ "@blocksuite/affine-block-note": "workspace:*", "@blocksuite/affine-block-surface": "workspace:*", "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-gfx-turbo-renderer": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-shared": "workspace:*", "@blocksuite/affine-widget-slash-menu": "workspace:*", @@ -32,7 +33,8 @@ }, "exports": { ".": "./src/index.ts", - "./effects": "./src/effects.ts" + "./effects": "./src/effects.ts", + "./turbo-painter": "./src/turbo/image-painter.worker.ts" }, "files": [ "src", diff --git a/packages/affine/blocks/block-image/src/adapters/extension.ts b/packages/affine/blocks/image/src/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-image/src/adapters/extension.ts rename to packages/affine/blocks/image/src/adapters/extension.ts diff --git a/packages/affine/blocks/block-image/src/adapters/html.ts b/packages/affine/blocks/image/src/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-image/src/adapters/html.ts rename to packages/affine/blocks/image/src/adapters/html.ts diff --git a/packages/affine/blocks/block-image/src/adapters/index.ts b/packages/affine/blocks/image/src/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-image/src/adapters/index.ts rename to packages/affine/blocks/image/src/adapters/index.ts diff --git a/packages/affine/blocks/block-image/src/adapters/markdown.ts b/packages/affine/blocks/image/src/adapters/markdown.ts similarity index 100% rename from packages/affine/blocks/block-image/src/adapters/markdown.ts rename to packages/affine/blocks/image/src/adapters/markdown.ts diff --git a/packages/affine/blocks/block-image/src/adapters/middleware.ts b/packages/affine/blocks/image/src/adapters/middleware.ts similarity index 100% rename from packages/affine/blocks/block-image/src/adapters/middleware.ts rename to packages/affine/blocks/image/src/adapters/middleware.ts diff --git a/packages/affine/blocks/block-image/src/adapters/notion-html.ts b/packages/affine/blocks/image/src/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-image/src/adapters/notion-html.ts rename to packages/affine/blocks/image/src/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-image/src/commands/index.ts b/packages/affine/blocks/image/src/commands/index.ts similarity index 100% rename from packages/affine/blocks/block-image/src/commands/index.ts rename to packages/affine/blocks/image/src/commands/index.ts diff --git a/packages/affine/blocks/block-image/src/commands/insert-images.ts b/packages/affine/blocks/image/src/commands/insert-images.ts similarity index 100% rename from packages/affine/blocks/block-image/src/commands/insert-images.ts rename to packages/affine/blocks/image/src/commands/insert-images.ts diff --git a/packages/affine/blocks/block-image/src/components/image-block-fallback.ts b/packages/affine/blocks/image/src/components/image-block-fallback.ts similarity index 100% rename from packages/affine/blocks/block-image/src/components/image-block-fallback.ts rename to packages/affine/blocks/image/src/components/image-block-fallback.ts diff --git a/packages/affine/blocks/block-image/src/components/image-selected-rect.ts b/packages/affine/blocks/image/src/components/image-selected-rect.ts similarity index 100% rename from packages/affine/blocks/block-image/src/components/image-selected-rect.ts rename to packages/affine/blocks/image/src/components/image-selected-rect.ts diff --git a/packages/affine/blocks/block-image/src/components/page-image-block.ts b/packages/affine/blocks/image/src/components/page-image-block.ts similarity index 100% rename from packages/affine/blocks/block-image/src/components/page-image-block.ts rename to packages/affine/blocks/image/src/components/page-image-block.ts diff --git a/packages/affine/blocks/block-image/src/configs/slash-menu.ts b/packages/affine/blocks/image/src/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-image/src/configs/slash-menu.ts rename to packages/affine/blocks/image/src/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-image/src/configs/toolbar.ts b/packages/affine/blocks/image/src/configs/toolbar.ts similarity index 100% rename from packages/affine/blocks/block-image/src/configs/toolbar.ts rename to packages/affine/blocks/image/src/configs/toolbar.ts diff --git a/packages/affine/blocks/block-image/src/configs/tooltips.ts b/packages/affine/blocks/image/src/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-image/src/configs/tooltips.ts rename to packages/affine/blocks/image/src/configs/tooltips.ts diff --git a/packages/affine/blocks/block-image/src/edgeless-clipboard-config.ts b/packages/affine/blocks/image/src/edgeless-clipboard-config.ts similarity index 100% rename from packages/affine/blocks/block-image/src/edgeless-clipboard-config.ts rename to packages/affine/blocks/image/src/edgeless-clipboard-config.ts diff --git a/packages/affine/blocks/block-image/src/effects.ts b/packages/affine/blocks/image/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-image/src/effects.ts rename to packages/affine/blocks/image/src/effects.ts diff --git a/packages/affine/blocks/block-image/src/image-block.ts b/packages/affine/blocks/image/src/image-block.ts similarity index 100% rename from packages/affine/blocks/block-image/src/image-block.ts rename to packages/affine/blocks/image/src/image-block.ts diff --git a/packages/affine/blocks/block-image/src/image-edgeless-block.ts b/packages/affine/blocks/image/src/image-edgeless-block.ts similarity index 100% rename from packages/affine/blocks/block-image/src/image-edgeless-block.ts rename to packages/affine/blocks/image/src/image-edgeless-block.ts diff --git a/packages/affine/blocks/block-image/src/image-proxy-service.ts b/packages/affine/blocks/image/src/image-proxy-service.ts similarity index 100% rename from packages/affine/blocks/block-image/src/image-proxy-service.ts rename to packages/affine/blocks/image/src/image-proxy-service.ts diff --git a/packages/affine/blocks/block-image/src/image-resize-manager.ts b/packages/affine/blocks/image/src/image-resize-manager.ts similarity index 100% rename from packages/affine/blocks/block-image/src/image-resize-manager.ts rename to packages/affine/blocks/image/src/image-resize-manager.ts diff --git a/packages/affine/blocks/block-image/src/image-service.ts b/packages/affine/blocks/image/src/image-service.ts similarity index 100% rename from packages/affine/blocks/block-image/src/image-service.ts rename to packages/affine/blocks/image/src/image-service.ts diff --git a/packages/affine/blocks/block-image/src/image-spec.ts b/packages/affine/blocks/image/src/image-spec.ts similarity index 100% rename from packages/affine/blocks/block-image/src/image-spec.ts rename to packages/affine/blocks/image/src/image-spec.ts diff --git a/packages/affine/blocks/block-image/src/index.ts b/packages/affine/blocks/image/src/index.ts similarity index 83% rename from packages/affine/blocks/block-image/src/index.ts rename to packages/affine/blocks/image/src/index.ts index 04d685796d17..ad38a3cea35b 100644 --- a/packages/affine/blocks/block-image/src/index.ts +++ b/packages/affine/blocks/image/src/index.ts @@ -7,5 +7,7 @@ export { ImageProxyService } from './image-proxy-service'; export * from './image-service'; export * from './image-spec'; export * from './styles'; +export * from './turbo/image-layout-handler'; +export * from './turbo/image-painter.worker'; export { addImages, downloadImageBlob, uploadBlobForImage } from './utils'; export { ImageSelection } from '@blocksuite/affine-shared/selection'; diff --git a/packages/affine/blocks/block-image/src/preview-image/edgeless.ts b/packages/affine/blocks/image/src/preview-image/edgeless.ts similarity index 100% rename from packages/affine/blocks/block-image/src/preview-image/edgeless.ts rename to packages/affine/blocks/image/src/preview-image/edgeless.ts diff --git a/packages/affine/blocks/block-image/src/preview-image/page.ts b/packages/affine/blocks/image/src/preview-image/page.ts similarity index 100% rename from packages/affine/blocks/block-image/src/preview-image/page.ts rename to packages/affine/blocks/image/src/preview-image/page.ts diff --git a/packages/affine/blocks/block-image/src/styles.ts b/packages/affine/blocks/image/src/styles.ts similarity index 100% rename from packages/affine/blocks/block-image/src/styles.ts rename to packages/affine/blocks/image/src/styles.ts diff --git a/packages/affine/blocks/image/src/turbo/image-layout-handler.ts b/packages/affine/blocks/image/src/turbo/image-layout-handler.ts new file mode 100644 index 000000000000..2a1496541742 --- /dev/null +++ b/packages/affine/blocks/image/src/turbo/image-layout-handler.ts @@ -0,0 +1,69 @@ +import type { Rect } from '@blocksuite/affine-gfx-turbo-renderer'; +import { + BlockLayoutHandlerExtension, + BlockLayoutHandlersIdentifier, +} from '@blocksuite/affine-gfx-turbo-renderer'; +import type { Container } from '@blocksuite/global/di'; +import type { EditorHost, GfxBlockComponent } from '@blocksuite/std'; +import { clientToModelCoord, type ViewportRecord } from '@blocksuite/std/gfx'; +import type { BlockModel } from '@blocksuite/store'; + +import type { ImageLayout } from './image-painter.worker'; + +export class ImageLayoutHandlerExtension extends BlockLayoutHandlerExtension { + readonly blockType = 'affine:image'; + + static override setup(di: Container) { + di.addImpl( + BlockLayoutHandlersIdentifier('image'), + ImageLayoutHandlerExtension + ); + } + + override queryLayout( + model: BlockModel, + host: EditorHost, + viewportRecord: ViewportRecord + ): ImageLayout | null { + const component = host.std.view.getBlock(model.id) as GfxBlockComponent; + if (!component) return null; + + const imageContainer = component.querySelector('.affine-image-container'); + if (!imageContainer) return null; + + const resizableImg = component.querySelector( + '.resizable-img' + ) as HTMLElement; + if (!resizableImg) return null; + + const { zoom, viewScale } = viewportRecord; + const rect = resizableImg.getBoundingClientRect(); + + const [modelX, modelY] = clientToModelCoord(viewportRecord, [ + rect.x, + rect.y, + ]); + + const imageLayout: ImageLayout = { + type: 'affine:image', + blockId: model.id, + rect: { + x: modelX, + y: modelY, + w: rect.width / zoom / viewScale, + h: rect.height / zoom / viewScale, + }, + }; + + return imageLayout; + } + + calculateBound(layout: ImageLayout) { + const rect: Rect = layout.rect; + + return { + rect, + subRects: [rect], + }; + } +} diff --git a/packages/affine/blocks/image/src/turbo/image-painter.worker.ts b/packages/affine/blocks/image/src/turbo/image-painter.worker.ts new file mode 100644 index 000000000000..5d6e2bf55abf --- /dev/null +++ b/packages/affine/blocks/image/src/turbo/image-painter.worker.ts @@ -0,0 +1,56 @@ +import type { + BlockLayout, + BlockLayoutPainter, +} from '@blocksuite/affine-gfx-turbo-renderer'; +import { BlockLayoutPainterExtension } from '@blocksuite/affine-gfx-turbo-renderer/painter'; + +export interface ImageLayout extends BlockLayout { + type: 'affine:image'; + rect: { + x: number; + y: number; + w: number; + h: number; + }; +} + +function isImageLayout(layout: BlockLayout): layout is ImageLayout { + return layout.type === 'affine:image'; +} + +class ImageLayoutPainter implements BlockLayoutPainter { + paint( + ctx: OffscreenCanvasRenderingContext2D, + layout: BlockLayout, + layoutBaseX: number, + layoutBaseY: number + ): void { + if (!isImageLayout(layout)) { + console.warn( + 'Expected image layout but received different format:', + layout + ); + return; + } + + // For now, just paint a white rectangle + const x = layout.rect.x - layoutBaseX; + const y = layout.rect.y - layoutBaseY; + const width = layout.rect.w; + const height = layout.rect.h; + + // Draw a white rectangle with border + ctx.fillStyle = 'white'; + ctx.fillRect(x, y, width, height); + + // Add a border + ctx.strokeStyle = '#e0e0e0'; + ctx.lineWidth = 1; + ctx.strokeRect(x, y, width, height); + } +} + +export const ImageLayoutPainterExtension = BlockLayoutPainterExtension( + 'affine:image', + ImageLayoutPainter +); diff --git a/packages/affine/blocks/block-image/src/utils.ts b/packages/affine/blocks/image/src/utils.ts similarity index 100% rename from packages/affine/blocks/block-image/src/utils.ts rename to packages/affine/blocks/image/src/utils.ts diff --git a/packages/affine/blocks/image/tsconfig.json b/packages/affine/blocks/image/tsconfig.json new file mode 100644 index 000000000000..d0be8cddb5d6 --- /dev/null +++ b/packages/affine/blocks/image/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" + }, + "include": ["./src"], + "references": [ + { "path": "../note" }, + { "path": "../surface" }, + { "path": "../../components" }, + { "path": "../../gfx/turbo-renderer" }, + { "path": "../../model" }, + { "path": "../../shared" }, + { "path": "../../widgets/slash-menu" }, + { "path": "../../../framework/global" }, + { "path": "../../../framework/std" }, + { "path": "../../../framework/store" } + ] +} diff --git a/packages/affine/blocks/block-latex/package.json b/packages/affine/blocks/latex/package.json similarity index 100% rename from packages/affine/blocks/block-latex/package.json rename to packages/affine/blocks/latex/package.json diff --git a/packages/affine/blocks/block-latex/src/adapters/extension.ts b/packages/affine/blocks/latex/src/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/adapters/extension.ts rename to packages/affine/blocks/latex/src/adapters/extension.ts diff --git a/packages/affine/blocks/block-latex/src/adapters/index.ts b/packages/affine/blocks/latex/src/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/adapters/index.ts rename to packages/affine/blocks/latex/src/adapters/index.ts diff --git a/packages/affine/blocks/block-latex/src/adapters/markdown/index.ts b/packages/affine/blocks/latex/src/adapters/markdown/index.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/adapters/markdown/index.ts rename to packages/affine/blocks/latex/src/adapters/markdown/index.ts diff --git a/packages/affine/blocks/block-latex/src/adapters/markdown/markdown.ts b/packages/affine/blocks/latex/src/adapters/markdown/markdown.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/adapters/markdown/markdown.ts rename to packages/affine/blocks/latex/src/adapters/markdown/markdown.ts diff --git a/packages/affine/blocks/latex/src/adapters/markdown/preprocessor.ts b/packages/affine/blocks/latex/src/adapters/markdown/preprocessor.ts new file mode 100644 index 000000000000..7f1128a3bbee --- /dev/null +++ b/packages/affine/blocks/latex/src/adapters/markdown/preprocessor.ts @@ -0,0 +1,88 @@ +import { + type MarkdownAdapterPreprocessor, + MarkdownPreprocessorExtension, +} from '@blocksuite/affine-shared/adapters'; + +function escapeBrackets(text: string) { + const pattern = + /(```[\S\s]*?```|`.*?`)|\\\[([\S\s]*?[^\\])\\]|\\\((.*?)\\\)/g; + return text.replaceAll( + pattern, + (match, codeBlock, squareBracket, roundBracket) => { + if (codeBlock) { + return codeBlock; + } else if (squareBracket) { + return `$$${squareBracket}$$`; + } else if (roundBracket) { + return `$${roundBracket}$`; + } + return match; + } + ); +} + +function escapeMhchem(text: string) { + return text.replaceAll('$\\ce{', '$\\\\ce{').replaceAll('$\\pu{', '$\\\\pu{'); +} + +/** + * Preprocess the content to protect code blocks and LaTeX expressions + * reference issue: https://github.com/remarkjs/react-markdown/issues/785 + * reference comment: https://github.com/remarkjs/react-markdown/issues/785#issuecomment-2307567823 + * @param content - The content to preprocess + * @returns The preprocessed content + */ +function preprocessLatex(content: string) { + // Protect code blocks + const codeBlocks: string[] = []; + let preprocessedContent = content; + preprocessedContent = preprocessedContent.replace( + /(```[\s\S]*?```|`[^`\n]+`)/g, + (_, code) => { + codeBlocks.push(code); + return `<>`; + } + ); + + // Protect existing LaTeX expressions + const latexExpressions: string[] = []; + preprocessedContent = preprocessedContent.replace( + /(\$\$[\s\S]*?\$\$|\\\[[\s\S]*?\\\]|\\\(.*?\\\))/g, + match => { + latexExpressions.push(match); + return `<>`; + } + ); + + // Escape dollar signs that are likely currency indicators + preprocessedContent = preprocessedContent.replace(/\$(?=\d)/g, '\\$'); + + // Restore LaTeX expressions + preprocessedContent = preprocessedContent.replace( + /<>/g, + (_, index) => latexExpressions[parseInt(index)] + ); + + // Restore code blocks + preprocessedContent = preprocessedContent.replace( + /<>/g, + (_, index) => codeBlocks[parseInt(index)] + ); + + // Apply additional escaping functions + preprocessedContent = escapeBrackets(preprocessedContent); + preprocessedContent = escapeMhchem(preprocessedContent); + + return preprocessedContent; +} + +const latexPreprocessor: MarkdownAdapterPreprocessor = { + name: 'latex', + levels: ['block', 'slice', 'doc'], + preprocess: content => { + return preprocessLatex(content); + }, +}; + +export const LatexMarkdownPreprocessorExtension = + MarkdownPreprocessorExtension(latexPreprocessor); diff --git a/packages/affine/blocks/block-latex/src/adapters/notion-html.ts b/packages/affine/blocks/latex/src/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/adapters/notion-html.ts rename to packages/affine/blocks/latex/src/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-latex/src/adapters/plain-text.ts b/packages/affine/blocks/latex/src/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/adapters/plain-text.ts rename to packages/affine/blocks/latex/src/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-latex/src/commands.ts b/packages/affine/blocks/latex/src/commands.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/commands.ts rename to packages/affine/blocks/latex/src/commands.ts diff --git a/packages/affine/blocks/block-latex/src/configs/slash-menu.ts b/packages/affine/blocks/latex/src/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/configs/slash-menu.ts rename to packages/affine/blocks/latex/src/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-latex/src/configs/tooltips.ts b/packages/affine/blocks/latex/src/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/configs/tooltips.ts rename to packages/affine/blocks/latex/src/configs/tooltips.ts diff --git a/packages/affine/blocks/block-latex/src/effects.ts b/packages/affine/blocks/latex/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/effects.ts rename to packages/affine/blocks/latex/src/effects.ts diff --git a/packages/affine/blocks/block-latex/src/index.ts b/packages/affine/blocks/latex/src/index.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/index.ts rename to packages/affine/blocks/latex/src/index.ts diff --git a/packages/affine/blocks/block-latex/src/latex-block.ts b/packages/affine/blocks/latex/src/latex-block.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/latex-block.ts rename to packages/affine/blocks/latex/src/latex-block.ts diff --git a/packages/affine/blocks/block-latex/src/latex-spec.ts b/packages/affine/blocks/latex/src/latex-spec.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/latex-spec.ts rename to packages/affine/blocks/latex/src/latex-spec.ts diff --git a/packages/affine/blocks/block-latex/src/styles.ts b/packages/affine/blocks/latex/src/styles.ts similarity index 100% rename from packages/affine/blocks/block-latex/src/styles.ts rename to packages/affine/blocks/latex/src/styles.ts diff --git a/packages/affine/blocks/block-latex/tsconfig.json b/packages/affine/blocks/latex/tsconfig.json similarity index 86% rename from packages/affine/blocks/block-latex/tsconfig.json rename to packages/affine/blocks/latex/tsconfig.json index e41067eb2e2d..862e1a748739 100644 --- a/packages/affine/blocks/block-latex/tsconfig.json +++ b/packages/affine/blocks/latex/tsconfig.json @@ -7,13 +7,13 @@ }, "include": ["./src"], "references": [ - { "path": "../block-note" }, + { "path": "../note" }, { "path": "../../components" }, { "path": "../../inlines/latex" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-slash-menu" }, + { "path": "../../widgets/slash-menu" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/blocks/block-list/package.json b/packages/affine/blocks/list/package.json similarity index 100% rename from packages/affine/blocks/block-list/package.json rename to packages/affine/blocks/list/package.json diff --git a/packages/affine/blocks/block-list/src/adapters/extension.ts b/packages/affine/blocks/list/src/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-list/src/adapters/extension.ts rename to packages/affine/blocks/list/src/adapters/extension.ts diff --git a/packages/affine/blocks/block-list/src/adapters/html.ts b/packages/affine/blocks/list/src/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-list/src/adapters/html.ts rename to packages/affine/blocks/list/src/adapters/html.ts diff --git a/packages/affine/blocks/block-list/src/adapters/index.ts b/packages/affine/blocks/list/src/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-list/src/adapters/index.ts rename to packages/affine/blocks/list/src/adapters/index.ts diff --git a/packages/affine/blocks/block-list/src/adapters/markdown.ts b/packages/affine/blocks/list/src/adapters/markdown.ts similarity index 100% rename from packages/affine/blocks/block-list/src/adapters/markdown.ts rename to packages/affine/blocks/list/src/adapters/markdown.ts diff --git a/packages/affine/blocks/block-list/src/adapters/notion-html.ts b/packages/affine/blocks/list/src/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-list/src/adapters/notion-html.ts rename to packages/affine/blocks/list/src/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-list/src/adapters/plain-text.ts b/packages/affine/blocks/list/src/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-list/src/adapters/plain-text.ts rename to packages/affine/blocks/list/src/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-list/src/commands/convert-to-numbered-list.ts b/packages/affine/blocks/list/src/commands/convert-to-numbered-list.ts similarity index 100% rename from packages/affine/blocks/block-list/src/commands/convert-to-numbered-list.ts rename to packages/affine/blocks/list/src/commands/convert-to-numbered-list.ts diff --git a/packages/affine/blocks/block-list/src/commands/dedent-list.ts b/packages/affine/blocks/list/src/commands/dedent-list.ts similarity index 100% rename from packages/affine/blocks/block-list/src/commands/dedent-list.ts rename to packages/affine/blocks/list/src/commands/dedent-list.ts diff --git a/packages/affine/blocks/block-list/src/commands/indent-list.ts b/packages/affine/blocks/list/src/commands/indent-list.ts similarity index 100% rename from packages/affine/blocks/block-list/src/commands/indent-list.ts rename to packages/affine/blocks/list/src/commands/indent-list.ts diff --git a/packages/affine/blocks/block-list/src/commands/index.ts b/packages/affine/blocks/list/src/commands/index.ts similarity index 100% rename from packages/affine/blocks/block-list/src/commands/index.ts rename to packages/affine/blocks/list/src/commands/index.ts diff --git a/packages/affine/blocks/block-list/src/commands/list-to-paragraph.ts b/packages/affine/blocks/list/src/commands/list-to-paragraph.ts similarity index 100% rename from packages/affine/blocks/block-list/src/commands/list-to-paragraph.ts rename to packages/affine/blocks/list/src/commands/list-to-paragraph.ts diff --git a/packages/affine/blocks/block-list/src/commands/split-list.ts b/packages/affine/blocks/list/src/commands/split-list.ts similarity index 100% rename from packages/affine/blocks/block-list/src/commands/split-list.ts rename to packages/affine/blocks/list/src/commands/split-list.ts diff --git a/packages/affine/blocks/block-list/src/commands/utils.ts b/packages/affine/blocks/list/src/commands/utils.ts similarity index 100% rename from packages/affine/blocks/block-list/src/commands/utils.ts rename to packages/affine/blocks/list/src/commands/utils.ts diff --git a/packages/affine/blocks/block-list/src/effects.ts b/packages/affine/blocks/list/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-list/src/effects.ts rename to packages/affine/blocks/list/src/effects.ts diff --git a/packages/affine/blocks/block-list/src/index.ts b/packages/affine/blocks/list/src/index.ts similarity index 100% rename from packages/affine/blocks/block-list/src/index.ts rename to packages/affine/blocks/list/src/index.ts diff --git a/packages/affine/blocks/block-list/src/list-block.ts b/packages/affine/blocks/list/src/list-block.ts similarity index 100% rename from packages/affine/blocks/block-list/src/list-block.ts rename to packages/affine/blocks/list/src/list-block.ts diff --git a/packages/affine/blocks/block-list/src/list-keymap.ts b/packages/affine/blocks/list/src/list-keymap.ts similarity index 100% rename from packages/affine/blocks/block-list/src/list-keymap.ts rename to packages/affine/blocks/list/src/list-keymap.ts diff --git a/packages/affine/blocks/block-list/src/list-spec.ts b/packages/affine/blocks/list/src/list-spec.ts similarity index 100% rename from packages/affine/blocks/block-list/src/list-spec.ts rename to packages/affine/blocks/list/src/list-spec.ts diff --git a/packages/affine/blocks/block-list/src/styles.ts b/packages/affine/blocks/list/src/styles.ts similarity index 100% rename from packages/affine/blocks/block-list/src/styles.ts rename to packages/affine/blocks/list/src/styles.ts diff --git a/packages/affine/blocks/block-list/src/turbo/list-layout-handler.ts b/packages/affine/blocks/list/src/turbo/list-layout-handler.ts similarity index 87% rename from packages/affine/blocks/block-list/src/turbo/list-layout-handler.ts rename to packages/affine/blocks/list/src/turbo/list-layout-handler.ts index b6aff940b47c..4459dc90679c 100644 --- a/packages/affine/blocks/block-list/src/turbo/list-layout-handler.ts +++ b/packages/affine/blocks/list/src/turbo/list-layout-handler.ts @@ -6,8 +6,9 @@ import { segmentSentences, } from '@blocksuite/affine-gfx-turbo-renderer'; import type { Container } from '@blocksuite/global/di'; -import type { GfxBlockComponent } from '@blocksuite/std'; -import { clientToModelCoord } from '@blocksuite/std/gfx'; +import type { EditorHost, GfxBlockComponent } from '@blocksuite/std'; +import { clientToModelCoord, type ViewportRecord } from '@blocksuite/std/gfx'; +import type { BlockModel } from '@blocksuite/store'; import type { ListLayout } from './list-painter.worker'; @@ -21,24 +22,27 @@ export class ListLayoutHandlerExtension extends BlockLayoutHandlerExtension { diff --git a/packages/affine/blocks/block-list/src/turbo/list-painter.worker.ts b/packages/affine/blocks/list/src/turbo/list-painter.worker.ts similarity index 94% rename from packages/affine/blocks/block-list/src/turbo/list-painter.worker.ts rename to packages/affine/blocks/list/src/turbo/list-painter.worker.ts index c6a3e7c9ece8..67de99931a74 100644 --- a/packages/affine/blocks/block-list/src/turbo/list-painter.worker.ts +++ b/packages/affine/blocks/list/src/turbo/list-painter.worker.ts @@ -77,10 +77,15 @@ class ListLayoutPainter implements BlockLayoutPainter { return; } - if (!isListLayout(layout)) return; + if (!isListLayout(layout)) { + console.warn( + 'Expected list layout but received different format:', + layout + ); + return; + } const renderedPositions = new Set(); - layout.items.forEach(item => { const fontSize = item.fontSize; const baselineY = getBaseline(fontSize); diff --git a/packages/affine/blocks/block-list/src/utils/forward-delete.ts b/packages/affine/blocks/list/src/utils/forward-delete.ts similarity index 100% rename from packages/affine/blocks/block-list/src/utils/forward-delete.ts rename to packages/affine/blocks/list/src/utils/forward-delete.ts diff --git a/packages/affine/blocks/block-list/src/utils/get-list-icon.ts b/packages/affine/blocks/list/src/utils/get-list-icon.ts similarity index 100% rename from packages/affine/blocks/block-list/src/utils/get-list-icon.ts rename to packages/affine/blocks/list/src/utils/get-list-icon.ts diff --git a/packages/affine/blocks/block-list/src/utils/get-number-prefix.ts b/packages/affine/blocks/list/src/utils/get-number-prefix.ts similarity index 100% rename from packages/affine/blocks/block-list/src/utils/get-number-prefix.ts rename to packages/affine/blocks/list/src/utils/get-number-prefix.ts diff --git a/packages/affine/blocks/block-list/tsconfig.json b/packages/affine/blocks/list/tsconfig.json similarity index 100% rename from packages/affine/blocks/block-list/tsconfig.json rename to packages/affine/blocks/list/tsconfig.json diff --git a/packages/affine/blocks/block-note/package.json b/packages/affine/blocks/note/package.json similarity index 89% rename from packages/affine/blocks/block-note/package.json rename to packages/affine/blocks/note/package.json index d59a7d530d93..0ca3c5d448ce 100644 --- a/packages/affine/blocks/block-note/package.json +++ b/packages/affine/blocks/note/package.json @@ -14,6 +14,7 @@ "@blocksuite/affine-block-surface": "workspace:*", "@blocksuite/affine-components": "workspace:*", "@blocksuite/affine-fragment-doc-title": "workspace:*", + "@blocksuite/affine-gfx-turbo-renderer": "workspace:*", "@blocksuite/affine-inline-preset": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", @@ -37,7 +38,8 @@ }, "exports": { ".": "./src/index.ts", - "./effects": "./src/effects.ts" + "./effects": "./src/effects.ts", + "./turbo-painter": "./src/turbo/note-painter.worker.ts" }, "files": [ "src", diff --git a/packages/affine/blocks/block-note/src/adapters/html.ts b/packages/affine/blocks/note/src/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-note/src/adapters/html.ts rename to packages/affine/blocks/note/src/adapters/html.ts diff --git a/packages/affine/blocks/block-note/src/adapters/index.ts b/packages/affine/blocks/note/src/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-note/src/adapters/index.ts rename to packages/affine/blocks/note/src/adapters/index.ts diff --git a/packages/affine/blocks/block-note/src/adapters/markdown.ts b/packages/affine/blocks/note/src/adapters/markdown.ts similarity index 100% rename from packages/affine/blocks/block-note/src/adapters/markdown.ts rename to packages/affine/blocks/note/src/adapters/markdown.ts diff --git a/packages/affine/blocks/block-note/src/adapters/plain-text.ts b/packages/affine/blocks/note/src/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-note/src/adapters/plain-text.ts rename to packages/affine/blocks/note/src/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-note/src/commands/block-type.ts b/packages/affine/blocks/note/src/commands/block-type.ts similarity index 100% rename from packages/affine/blocks/block-note/src/commands/block-type.ts rename to packages/affine/blocks/note/src/commands/block-type.ts diff --git a/packages/affine/blocks/block-note/src/commands/change-note-display-mode.ts b/packages/affine/blocks/note/src/commands/change-note-display-mode.ts similarity index 100% rename from packages/affine/blocks/block-note/src/commands/change-note-display-mode.ts rename to packages/affine/blocks/note/src/commands/change-note-display-mode.ts diff --git a/packages/affine/blocks/block-note/src/commands/dedent-block-to-root.ts b/packages/affine/blocks/note/src/commands/dedent-block-to-root.ts similarity index 100% rename from packages/affine/blocks/block-note/src/commands/dedent-block-to-root.ts rename to packages/affine/blocks/note/src/commands/dedent-block-to-root.ts diff --git a/packages/affine/blocks/block-note/src/commands/dedent-block.ts b/packages/affine/blocks/note/src/commands/dedent-block.ts similarity index 100% rename from packages/affine/blocks/block-note/src/commands/dedent-block.ts rename to packages/affine/blocks/note/src/commands/dedent-block.ts diff --git a/packages/affine/blocks/block-note/src/commands/dedent-blocks-to-root.ts b/packages/affine/blocks/note/src/commands/dedent-blocks-to-root.ts similarity index 100% rename from packages/affine/blocks/block-note/src/commands/dedent-blocks-to-root.ts rename to packages/affine/blocks/note/src/commands/dedent-blocks-to-root.ts diff --git a/packages/affine/blocks/block-note/src/commands/dedent-blocks.ts b/packages/affine/blocks/note/src/commands/dedent-blocks.ts similarity index 100% rename from packages/affine/blocks/block-note/src/commands/dedent-blocks.ts rename to packages/affine/blocks/note/src/commands/dedent-blocks.ts diff --git a/packages/affine/blocks/block-note/src/commands/indent-block.ts b/packages/affine/blocks/note/src/commands/indent-block.ts similarity index 100% rename from packages/affine/blocks/block-note/src/commands/indent-block.ts rename to packages/affine/blocks/note/src/commands/indent-block.ts diff --git a/packages/affine/blocks/block-note/src/commands/indent-blocks.ts b/packages/affine/blocks/note/src/commands/indent-blocks.ts similarity index 100% rename from packages/affine/blocks/block-note/src/commands/indent-blocks.ts rename to packages/affine/blocks/note/src/commands/indent-blocks.ts diff --git a/packages/affine/blocks/block-note/src/commands/index.ts b/packages/affine/blocks/note/src/commands/index.ts similarity index 100% rename from packages/affine/blocks/block-note/src/commands/index.ts rename to packages/affine/blocks/note/src/commands/index.ts diff --git a/packages/affine/blocks/block-note/src/commands/select-block.ts b/packages/affine/blocks/note/src/commands/select-block.ts similarity index 100% rename from packages/affine/blocks/block-note/src/commands/select-block.ts rename to packages/affine/blocks/note/src/commands/select-block.ts diff --git a/packages/affine/blocks/block-note/src/commands/select-blocks-between.ts b/packages/affine/blocks/note/src/commands/select-blocks-between.ts similarity index 100% rename from packages/affine/blocks/block-note/src/commands/select-blocks-between.ts rename to packages/affine/blocks/note/src/commands/select-blocks-between.ts diff --git a/packages/affine/blocks/block-note/src/components/edgeless-note-background.css.ts b/packages/affine/blocks/note/src/components/edgeless-note-background.css.ts similarity index 100% rename from packages/affine/blocks/block-note/src/components/edgeless-note-background.css.ts rename to packages/affine/blocks/note/src/components/edgeless-note-background.css.ts diff --git a/packages/affine/blocks/block-note/src/components/edgeless-note-background.ts b/packages/affine/blocks/note/src/components/edgeless-note-background.ts similarity index 100% rename from packages/affine/blocks/block-note/src/components/edgeless-note-background.ts rename to packages/affine/blocks/note/src/components/edgeless-note-background.ts diff --git a/packages/affine/blocks/block-note/src/components/edgeless-note-border-dropdown-menu.ts b/packages/affine/blocks/note/src/components/edgeless-note-border-dropdown-menu.ts similarity index 100% rename from packages/affine/blocks/block-note/src/components/edgeless-note-border-dropdown-menu.ts rename to packages/affine/blocks/note/src/components/edgeless-note-border-dropdown-menu.ts diff --git a/packages/affine/blocks/block-note/src/components/edgeless-note-display-mode-dropdown-menu.ts b/packages/affine/blocks/note/src/components/edgeless-note-display-mode-dropdown-menu.ts similarity index 100% rename from packages/affine/blocks/block-note/src/components/edgeless-note-display-mode-dropdown-menu.ts rename to packages/affine/blocks/note/src/components/edgeless-note-display-mode-dropdown-menu.ts diff --git a/packages/affine/blocks/block-note/src/components/edgeless-note-mask.ts b/packages/affine/blocks/note/src/components/edgeless-note-mask.ts similarity index 100% rename from packages/affine/blocks/block-note/src/components/edgeless-note-mask.ts rename to packages/affine/blocks/note/src/components/edgeless-note-mask.ts diff --git a/packages/affine/blocks/block-note/src/components/edgeless-note-shadow-dropdown-menu.ts b/packages/affine/blocks/note/src/components/edgeless-note-shadow-dropdown-menu.ts similarity index 100% rename from packages/affine/blocks/block-note/src/components/edgeless-note-shadow-dropdown-menu.ts rename to packages/affine/blocks/note/src/components/edgeless-note-shadow-dropdown-menu.ts diff --git a/packages/affine/blocks/block-note/src/components/edgeless-page-block-title.css.ts b/packages/affine/blocks/note/src/components/edgeless-page-block-title.css.ts similarity index 100% rename from packages/affine/blocks/block-note/src/components/edgeless-page-block-title.css.ts rename to packages/affine/blocks/note/src/components/edgeless-page-block-title.css.ts diff --git a/packages/affine/blocks/block-note/src/components/edgeless-page-block-title.ts b/packages/affine/blocks/note/src/components/edgeless-page-block-title.ts similarity index 100% rename from packages/affine/blocks/block-note/src/components/edgeless-page-block-title.ts rename to packages/affine/blocks/note/src/components/edgeless-page-block-title.ts diff --git a/packages/affine/blocks/block-note/src/components/icons.ts b/packages/affine/blocks/note/src/components/icons.ts similarity index 100% rename from packages/affine/blocks/block-note/src/components/icons.ts rename to packages/affine/blocks/note/src/components/icons.ts diff --git a/packages/affine/blocks/block-note/src/components/more-indicator.ts b/packages/affine/blocks/note/src/components/more-indicator.ts similarity index 100% rename from packages/affine/blocks/block-note/src/components/more-indicator.ts rename to packages/affine/blocks/note/src/components/more-indicator.ts diff --git a/packages/affine/blocks/block-note/src/components/view-in-page-notify.css.ts b/packages/affine/blocks/note/src/components/view-in-page-notify.css.ts similarity index 100% rename from packages/affine/blocks/block-note/src/components/view-in-page-notify.css.ts rename to packages/affine/blocks/note/src/components/view-in-page-notify.css.ts diff --git a/packages/affine/blocks/block-note/src/config.ts b/packages/affine/blocks/note/src/config.ts similarity index 100% rename from packages/affine/blocks/block-note/src/config.ts rename to packages/affine/blocks/note/src/config.ts diff --git a/packages/affine/blocks/block-note/src/configs/slash-menu.ts b/packages/affine/blocks/note/src/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-note/src/configs/slash-menu.ts rename to packages/affine/blocks/note/src/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-note/src/configs/toolbar.ts b/packages/affine/blocks/note/src/configs/toolbar.ts similarity index 100% rename from packages/affine/blocks/block-note/src/configs/toolbar.ts rename to packages/affine/blocks/note/src/configs/toolbar.ts diff --git a/packages/affine/blocks/block-note/src/configs/tooltips.ts b/packages/affine/blocks/note/src/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-note/src/configs/tooltips.ts rename to packages/affine/blocks/note/src/configs/tooltips.ts diff --git a/packages/affine/blocks/block-note/src/edgeless-clipboard-config.ts b/packages/affine/blocks/note/src/edgeless-clipboard-config.ts similarity index 100% rename from packages/affine/blocks/block-note/src/edgeless-clipboard-config.ts rename to packages/affine/blocks/note/src/edgeless-clipboard-config.ts diff --git a/packages/affine/blocks/block-note/src/effects.ts b/packages/affine/blocks/note/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-note/src/effects.ts rename to packages/affine/blocks/note/src/effects.ts diff --git a/packages/affine/blocks/block-note/src/index.ts b/packages/affine/blocks/note/src/index.ts similarity index 75% rename from packages/affine/blocks/block-note/src/index.ts rename to packages/affine/blocks/note/src/index.ts index 2bb0100eb5f3..5264807b5792 100644 --- a/packages/affine/blocks/block-note/src/index.ts +++ b/packages/affine/blocks/note/src/index.ts @@ -6,3 +6,5 @@ export * from './edgeless-clipboard-config'; export * from './note-block'; export * from './note-edgeless-block'; export * from './note-spec'; +export * from './turbo/note-layout-handler'; +export * from './turbo/note-painter.worker'; diff --git a/packages/affine/blocks/block-note/src/move-block.ts b/packages/affine/blocks/note/src/move-block.ts similarity index 100% rename from packages/affine/blocks/block-note/src/move-block.ts rename to packages/affine/blocks/note/src/move-block.ts diff --git a/packages/affine/blocks/block-note/src/note-block.ts b/packages/affine/blocks/note/src/note-block.ts similarity index 100% rename from packages/affine/blocks/block-note/src/note-block.ts rename to packages/affine/blocks/note/src/note-block.ts diff --git a/packages/affine/blocks/block-note/src/note-edgeless-block.css.ts b/packages/affine/blocks/note/src/note-edgeless-block.css.ts similarity index 100% rename from packages/affine/blocks/block-note/src/note-edgeless-block.css.ts rename to packages/affine/blocks/note/src/note-edgeless-block.css.ts diff --git a/packages/affine/blocks/block-note/src/note-edgeless-block.ts b/packages/affine/blocks/note/src/note-edgeless-block.ts similarity index 100% rename from packages/affine/blocks/block-note/src/note-edgeless-block.ts rename to packages/affine/blocks/note/src/note-edgeless-block.ts diff --git a/packages/affine/blocks/block-note/src/note-keymap.ts b/packages/affine/blocks/note/src/note-keymap.ts similarity index 100% rename from packages/affine/blocks/block-note/src/note-keymap.ts rename to packages/affine/blocks/note/src/note-keymap.ts diff --git a/packages/affine/blocks/block-note/src/note-spec.ts b/packages/affine/blocks/note/src/note-spec.ts similarity index 100% rename from packages/affine/blocks/block-note/src/note-spec.ts rename to packages/affine/blocks/note/src/note-spec.ts diff --git a/packages/affine/blocks/block-note/src/quick-action.ts b/packages/affine/blocks/note/src/quick-action.ts similarity index 100% rename from packages/affine/blocks/block-note/src/quick-action.ts rename to packages/affine/blocks/note/src/quick-action.ts diff --git a/packages/affine/blocks/note/src/turbo/note-layout-handler.ts b/packages/affine/blocks/note/src/turbo/note-layout-handler.ts new file mode 100644 index 000000000000..daf9de4babdd --- /dev/null +++ b/packages/affine/blocks/note/src/turbo/note-layout-handler.ts @@ -0,0 +1,81 @@ +import type { Rect } from '@blocksuite/affine-gfx-turbo-renderer'; +import { + BlockLayoutHandlerExtension, + BlockLayoutHandlersIdentifier, +} from '@blocksuite/affine-gfx-turbo-renderer'; +import { + ColorScheme, + type NoteBlockModel, + resolveColor, +} from '@blocksuite/affine-model'; +import type { Container } from '@blocksuite/global/di'; +import type { EditorHost, GfxBlockComponent } from '@blocksuite/std'; +import { clientToModelCoord, type ViewportRecord } from '@blocksuite/std/gfx'; +import type { BlockModel } from '@blocksuite/store'; + +import type { NoteLayout } from './note-painter.worker'; + +export class NoteLayoutHandlerExtension extends BlockLayoutHandlerExtension { + readonly blockType = 'affine:note'; + + static override setup(di: Container) { + di.addImpl( + BlockLayoutHandlersIdentifier('note'), + NoteLayoutHandlerExtension + ); + } + + override queryLayout( + model: BlockModel, + host: EditorHost, + viewportRecord: ViewportRecord + ): NoteLayout | null { + const component = host.std.view.getBlock(model.id) as GfxBlockComponent; + if (!component) return null; + + // Get the note container element + const noteContainer = component.querySelector('.affine-note-mask'); + if (!noteContainer) return null; + + // Get the bounding client rect of the note container + const clientRect = noteContainer.getBoundingClientRect(); + + // Convert client coordinates to model coordinates + const [modelX, modelY] = clientToModelCoord(viewportRecord, [ + clientRect.x, + clientRect.y, + ]); + + const { zoom, viewScale } = viewportRecord; + + // Cast model to NoteBlockModel to access background property from props + const noteModel = model as NoteBlockModel; + const background = noteModel.props.background; + // Resolve the color to a string + const backgroundString = resolveColor(background, ColorScheme.Light); + + // Create the note layout object + const noteLayout: NoteLayout = { + type: 'affine:note', + blockId: model.id, + rect: { + x: modelX, + y: modelY, + w: clientRect.width / zoom / viewScale, + h: clientRect.height / zoom / viewScale, + }, + background: backgroundString, + }; + + return noteLayout; + } + + calculateBound(layout: NoteLayout) { + const rect: Rect = layout.rect; + + return { + rect, + subRects: [rect], // The note is represented by a single rectangle + }; + } +} diff --git a/packages/affine/blocks/note/src/turbo/note-painter.worker.ts b/packages/affine/blocks/note/src/turbo/note-painter.worker.ts new file mode 100644 index 000000000000..6c95400d330c --- /dev/null +++ b/packages/affine/blocks/note/src/turbo/note-painter.worker.ts @@ -0,0 +1,49 @@ +import type { + BlockLayout, + BlockLayoutPainter, + WorkerToHostMessage, +} from '@blocksuite/affine-gfx-turbo-renderer'; +import { BlockLayoutPainterExtension } from '@blocksuite/affine-gfx-turbo-renderer/painter'; + +export interface NoteLayout extends BlockLayout { + type: 'affine:note'; + background?: string; +} + +function isNoteLayout(layout: BlockLayout): layout is NoteLayout { + return layout.type === 'affine:note'; +} + +class NoteLayoutPainter implements BlockLayoutPainter { + paint( + ctx: OffscreenCanvasRenderingContext2D, + layout: BlockLayout, + layoutBaseX: number, + layoutBaseY: number + ): void { + if (!isNoteLayout(layout)) { + const message: WorkerToHostMessage = { + type: 'paintError', + error: 'Invalid layout format', + blockType: 'affine:note', + }; + self.postMessage(message); + return; + } + + // Get the layout rectangle + const x = layout.rect.x - layoutBaseX; + const y = layout.rect.y - layoutBaseY; + const width = layout.rect.w; + const height = layout.rect.h; + + ctx.fillStyle = layout.background || 'rgb(255, 255, 255)'; + ctx.fillRect(x, y, width, height); + ctx.strokeRect(x, y, width, height); + } +} + +export const NoteLayoutPainterExtension = BlockLayoutPainterExtension( + 'affine:note', + NoteLayoutPainter +); diff --git a/packages/affine/blocks/block-note/tsconfig.json b/packages/affine/blocks/note/tsconfig.json similarity index 73% rename from packages/affine/blocks/block-note/tsconfig.json rename to packages/affine/blocks/note/tsconfig.json index 6342c799396f..60ff8f32d32f 100644 --- a/packages/affine/blocks/block-note/tsconfig.json +++ b/packages/affine/blocks/note/tsconfig.json @@ -7,15 +7,16 @@ }, "include": ["./src"], "references": [ - { "path": "../block-embed" }, - { "path": "../block-surface" }, + { "path": "../embed" }, + { "path": "../surface" }, { "path": "../../components" }, - { "path": "../../fragments/fragment-doc-title" }, + { "path": "../../fragments/doc-title" }, + { "path": "../../gfx/turbo-renderer" }, { "path": "../../inlines/preset" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-slash-menu" }, + { "path": "../../widgets/slash-menu" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/blocks/block-paragraph/package.json b/packages/affine/blocks/paragraph/package.json similarity index 100% rename from packages/affine/blocks/block-paragraph/package.json rename to packages/affine/blocks/paragraph/package.json diff --git a/packages/affine/blocks/block-paragraph/src/adapters/extension.ts b/packages/affine/blocks/paragraph/src/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/adapters/extension.ts rename to packages/affine/blocks/paragraph/src/adapters/extension.ts diff --git a/packages/affine/blocks/block-paragraph/src/adapters/html.ts b/packages/affine/blocks/paragraph/src/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/adapters/html.ts rename to packages/affine/blocks/paragraph/src/adapters/html.ts diff --git a/packages/affine/blocks/block-paragraph/src/adapters/index.ts b/packages/affine/blocks/paragraph/src/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/adapters/index.ts rename to packages/affine/blocks/paragraph/src/adapters/index.ts diff --git a/packages/affine/blocks/block-paragraph/src/adapters/markdown.ts b/packages/affine/blocks/paragraph/src/adapters/markdown.ts similarity index 99% rename from packages/affine/blocks/block-paragraph/src/adapters/markdown.ts rename to packages/affine/blocks/paragraph/src/adapters/markdown.ts index d01622d941b2..c7faae1a5c07 100644 --- a/packages/affine/blocks/block-paragraph/src/adapters/markdown.ts +++ b/packages/affine/blocks/paragraph/src/adapters/markdown.ts @@ -71,6 +71,7 @@ export const paragraphBlockMarkdownAdapterMatcher: BlockMarkdownAdapterMatcher = 'children' ) .closeNode(); + walkerContext.skipAllChildren(); break; } case 'heading': { diff --git a/packages/affine/blocks/block-paragraph/src/adapters/notion-html.ts b/packages/affine/blocks/paragraph/src/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/adapters/notion-html.ts rename to packages/affine/blocks/paragraph/src/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-paragraph/src/adapters/plain-text.ts b/packages/affine/blocks/paragraph/src/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/adapters/plain-text.ts rename to packages/affine/blocks/paragraph/src/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-paragraph/src/commands/add-paragraph.ts b/packages/affine/blocks/paragraph/src/commands/add-paragraph.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/commands/add-paragraph.ts rename to packages/affine/blocks/paragraph/src/commands/add-paragraph.ts diff --git a/packages/affine/blocks/block-paragraph/src/commands/append-paragraph.ts b/packages/affine/blocks/paragraph/src/commands/append-paragraph.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/commands/append-paragraph.ts rename to packages/affine/blocks/paragraph/src/commands/append-paragraph.ts diff --git a/packages/affine/blocks/block-paragraph/src/commands/dedent-paragraph.ts b/packages/affine/blocks/paragraph/src/commands/dedent-paragraph.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/commands/dedent-paragraph.ts rename to packages/affine/blocks/paragraph/src/commands/dedent-paragraph.ts diff --git a/packages/affine/blocks/block-paragraph/src/commands/indent-paragraph.ts b/packages/affine/blocks/paragraph/src/commands/indent-paragraph.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/commands/indent-paragraph.ts rename to packages/affine/blocks/paragraph/src/commands/indent-paragraph.ts diff --git a/packages/affine/blocks/block-paragraph/src/commands/index.ts b/packages/affine/blocks/paragraph/src/commands/index.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/commands/index.ts rename to packages/affine/blocks/paragraph/src/commands/index.ts diff --git a/packages/affine/blocks/block-paragraph/src/commands/split-paragraph.ts b/packages/affine/blocks/paragraph/src/commands/split-paragraph.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/commands/split-paragraph.ts rename to packages/affine/blocks/paragraph/src/commands/split-paragraph.ts diff --git a/packages/affine/blocks/block-paragraph/src/effects.ts b/packages/affine/blocks/paragraph/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/effects.ts rename to packages/affine/blocks/paragraph/src/effects.ts diff --git a/packages/affine/blocks/block-paragraph/src/heading-icon.ts b/packages/affine/blocks/paragraph/src/heading-icon.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/heading-icon.ts rename to packages/affine/blocks/paragraph/src/heading-icon.ts diff --git a/packages/affine/blocks/block-paragraph/src/index.ts b/packages/affine/blocks/paragraph/src/index.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/index.ts rename to packages/affine/blocks/paragraph/src/index.ts diff --git a/packages/affine/blocks/block-paragraph/src/paragraph-block-config.ts b/packages/affine/blocks/paragraph/src/paragraph-block-config.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/paragraph-block-config.ts rename to packages/affine/blocks/paragraph/src/paragraph-block-config.ts diff --git a/packages/affine/blocks/block-paragraph/src/paragraph-block.ts b/packages/affine/blocks/paragraph/src/paragraph-block.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/paragraph-block.ts rename to packages/affine/blocks/paragraph/src/paragraph-block.ts diff --git a/packages/affine/blocks/block-paragraph/src/paragraph-keymap.ts b/packages/affine/blocks/paragraph/src/paragraph-keymap.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/paragraph-keymap.ts rename to packages/affine/blocks/paragraph/src/paragraph-keymap.ts diff --git a/packages/affine/blocks/block-paragraph/src/paragraph-spec.ts b/packages/affine/blocks/paragraph/src/paragraph-spec.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/paragraph-spec.ts rename to packages/affine/blocks/paragraph/src/paragraph-spec.ts diff --git a/packages/affine/blocks/block-paragraph/src/styles.ts b/packages/affine/blocks/paragraph/src/styles.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/styles.ts rename to packages/affine/blocks/paragraph/src/styles.ts diff --git a/packages/affine/blocks/block-paragraph/src/turbo/paragraph-layout-handler.ts b/packages/affine/blocks/paragraph/src/turbo/paragraph-layout-handler.ts similarity index 53% rename from packages/affine/blocks/block-paragraph/src/turbo/paragraph-layout-handler.ts rename to packages/affine/blocks/paragraph/src/turbo/paragraph-layout-handler.ts index a35b3192c345..fd024d7c6314 100644 --- a/packages/affine/blocks/block-paragraph/src/turbo/paragraph-layout-handler.ts +++ b/packages/affine/blocks/paragraph/src/turbo/paragraph-layout-handler.ts @@ -6,8 +6,9 @@ import { segmentSentences, } from '@blocksuite/affine-gfx-turbo-renderer'; import type { Container } from '@blocksuite/global/di'; -import type { GfxBlockComponent } from '@blocksuite/std'; -import { clientToModelCoord } from '@blocksuite/std/gfx'; +import type { EditorHost, GfxBlockComponent } from '@blocksuite/std'; +import { clientToModelCoord, type ViewportRecord } from '@blocksuite/std/gfx'; +import type { BlockModel } from '@blocksuite/store'; import type { ParagraphLayout } from './paragraph-painter.worker'; @@ -21,58 +22,54 @@ export class ParagraphLayoutHandlerExtension extends BlockLayoutHandlerExtension ); } - queryLayout(component: GfxBlockComponent): ParagraphLayout | null { + override queryLayout( + model: BlockModel, + host: EditorHost, + viewportRecord: ViewportRecord + ): ParagraphLayout | null { + const component = host.std.view.getBlock(model.id) as GfxBlockComponent; const paragraphSelector = '.affine-paragraph-rich-text-wrapper [data-v-text="true"]'; - const paragraphNodes = component.querySelectorAll(paragraphSelector); - - if (paragraphNodes.length === 0) return null; - - const viewportRecord = component.gfx.viewport.deserializeRecord( - component.dataset.viewportState - ); - - if (!viewportRecord) return null; + const paragraphNode = component.querySelector(paragraphSelector); + if (!paragraphNode) return null; const { zoom, viewScale } = viewportRecord; const paragraph: ParagraphLayout = { type: 'affine:paragraph', sentences: [], + blockId: model.id, + rect: { x: 0, y: 0, w: 0, h: 0 }, }; - paragraphNodes.forEach(paragraphNode => { - const computedStyle = window.getComputedStyle(paragraphNode); - const fontSizeStr = computedStyle.fontSize; - const fontSize = parseInt(fontSizeStr); - - const sentences = segmentSentences(paragraphNode.textContent || ''); - const sentenceLayouts = sentences.map(sentence => { - const sentenceRects = getSentenceRects(paragraphNode, sentence); - const rects = sentenceRects.map(({ text, rect }) => { - const [modelX, modelY] = clientToModelCoord(viewportRecord, [ - rect.x, - rect.y, - ]); - return { - text, - rect: { - x: modelX, - y: modelY, - w: rect.w / zoom / viewScale, - h: rect.h / zoom / viewScale, - }, - }; - }); + const computedStyle = window.getComputedStyle(paragraphNode); + const fontSizeStr = computedStyle.fontSize; + const fontSize = parseInt(fontSizeStr); + + const sentences = segmentSentences(paragraphNode.textContent || ''); + const sentenceLayouts = sentences.map(sentence => { + const sentenceRects = getSentenceRects(paragraphNode, sentence); + const rects = sentenceRects.map(({ text, rect }) => { + const [modelX, modelY] = clientToModelCoord(viewportRecord, [ + rect.x, + rect.y, + ]); return { - text: sentence, - rects, - fontSize, + text, + rect: { + x: modelX, + y: modelY, + w: rect.w / zoom / viewScale, + h: rect.h / zoom / viewScale, + }, }; }); - - paragraph.sentences.push(...sentenceLayouts); + return { + text: sentence, + rects, + fontSize, + }; }); - + paragraph.sentences.push(...sentenceLayouts); return paragraph; } diff --git a/packages/affine/blocks/block-paragraph/src/turbo/paragraph-painter.worker.ts b/packages/affine/blocks/paragraph/src/turbo/paragraph-painter.worker.ts similarity index 94% rename from packages/affine/blocks/block-paragraph/src/turbo/paragraph-painter.worker.ts rename to packages/affine/blocks/paragraph/src/turbo/paragraph-painter.worker.ts index 4cac0f0e67cc..17b2b7bd9f23 100644 --- a/packages/affine/blocks/block-paragraph/src/turbo/paragraph-painter.worker.ts +++ b/packages/affine/blocks/paragraph/src/turbo/paragraph-painter.worker.ts @@ -73,10 +73,15 @@ class ParagraphLayoutPainter implements BlockLayoutPainter { return; } - if (!isParagraphLayout(layout)) return; // cast to ParagraphLayout + if (!isParagraphLayout(layout)) { + console.warn( + 'Expected paragraph layout but received different format:', + layout + ); + return; + } const renderedPositions = new Set(); - layout.sentences.forEach(sentence => { const fontSize = sentence.fontSize; const baselineY = getBaseline(fontSize); diff --git a/packages/affine/blocks/block-paragraph/src/utils/forward-delete.ts b/packages/affine/blocks/paragraph/src/utils/forward-delete.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/utils/forward-delete.ts rename to packages/affine/blocks/paragraph/src/utils/forward-delete.ts diff --git a/packages/affine/blocks/block-paragraph/src/utils/merge-with-prev.ts b/packages/affine/blocks/paragraph/src/utils/merge-with-prev.ts similarity index 100% rename from packages/affine/blocks/block-paragraph/src/utils/merge-with-prev.ts rename to packages/affine/blocks/paragraph/src/utils/merge-with-prev.ts diff --git a/packages/affine/blocks/block-paragraph/tsconfig.json b/packages/affine/blocks/paragraph/tsconfig.json similarity index 100% rename from packages/affine/blocks/block-paragraph/tsconfig.json rename to packages/affine/blocks/paragraph/tsconfig.json diff --git a/packages/affine/blocks/block-root/package.json b/packages/affine/blocks/root/package.json similarity index 98% rename from packages/affine/blocks/block-root/package.json rename to packages/affine/blocks/root/package.json index bb2001e94dfd..f6efdef4adcd 100644 --- a/packages/affine/blocks/block-root/package.json +++ b/packages/affine/blocks/root/package.json @@ -46,6 +46,7 @@ "@blocksuite/affine-widget-edgeless-auto-connect": "workspace:*", "@blocksuite/affine-widget-edgeless-toolbar": "workspace:*", "@blocksuite/affine-widget-frame-title": "workspace:*", + "@blocksuite/affine-widget-linked-doc": "workspace:*", "@blocksuite/affine-widget-remote-selection": "workspace:*", "@blocksuite/affine-widget-scroll-anchoring": "workspace:*", "@blocksuite/affine-widget-slash-menu": "workspace:*", diff --git a/packages/affine/blocks/block-root/src/adapters/extension.ts b/packages/affine/blocks/root/src/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-root/src/adapters/extension.ts rename to packages/affine/blocks/root/src/adapters/extension.ts diff --git a/packages/affine/blocks/block-root/src/adapters/html.ts b/packages/affine/blocks/root/src/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-root/src/adapters/html.ts rename to packages/affine/blocks/root/src/adapters/html.ts diff --git a/packages/affine/blocks/block-root/src/adapters/index.ts b/packages/affine/blocks/root/src/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-root/src/adapters/index.ts rename to packages/affine/blocks/root/src/adapters/index.ts diff --git a/packages/affine/blocks/block-root/src/adapters/markdown.ts b/packages/affine/blocks/root/src/adapters/markdown.ts similarity index 100% rename from packages/affine/blocks/block-root/src/adapters/markdown.ts rename to packages/affine/blocks/root/src/adapters/markdown.ts diff --git a/packages/affine/blocks/block-root/src/adapters/notion-html.ts b/packages/affine/blocks/root/src/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-root/src/adapters/notion-html.ts rename to packages/affine/blocks/root/src/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-root/src/clipboard/index.ts b/packages/affine/blocks/root/src/clipboard/index.ts similarity index 100% rename from packages/affine/blocks/block-root/src/clipboard/index.ts rename to packages/affine/blocks/root/src/clipboard/index.ts diff --git a/packages/affine/blocks/block-root/src/clipboard/page-clipboard.ts b/packages/affine/blocks/root/src/clipboard/page-clipboard.ts similarity index 100% rename from packages/affine/blocks/block-root/src/clipboard/page-clipboard.ts rename to packages/affine/blocks/root/src/clipboard/page-clipboard.ts diff --git a/packages/affine/blocks/block-root/src/clipboard/readonly-clipboard.ts b/packages/affine/blocks/root/src/clipboard/readonly-clipboard.ts similarity index 98% rename from packages/affine/blocks/block-root/src/clipboard/readonly-clipboard.ts rename to packages/affine/blocks/root/src/clipboard/readonly-clipboard.ts index 3e8e24ef1076..0f75d379fe69 100644 --- a/packages/affine/blocks/block-root/src/clipboard/readonly-clipboard.ts +++ b/packages/affine/blocks/root/src/clipboard/readonly-clipboard.ts @@ -34,12 +34,6 @@ const NotionClipboardConfig = ClipboardAdapterConfigExtension({ priority: 95, }); -const HtmlClipboardConfig = ClipboardAdapterConfigExtension({ - mimeType: 'text/html', - adapter: HtmlAdapter, - priority: 90, -}); - const imageClipboardConfigs = [ 'image/apng', 'image/avif', @@ -52,14 +46,20 @@ const imageClipboardConfigs = [ return ClipboardAdapterConfigExtension({ mimeType, adapter: ImageAdapter, - priority: 80, + priority: 85, }); }); const PlainTextClipboardConfig = ClipboardAdapterConfigExtension({ mimeType: 'text/plain', adapter: MixTextAdapter, - priority: 70, + priority: 80, +}); + +const HtmlClipboardConfig = ClipboardAdapterConfigExtension({ + mimeType: 'text/html', + adapter: HtmlAdapter, + priority: 75, }); const AttachmentClipboardConfig = ClipboardAdapterConfigExtension({ diff --git a/packages/affine/blocks/block-root/src/common-specs/index.ts b/packages/affine/blocks/root/src/common-specs/index.ts similarity index 91% rename from packages/affine/blocks/block-root/src/common-specs/index.ts rename to packages/affine/blocks/root/src/common-specs/index.ts index 6aaa3dca1d58..bc5364d0533a 100644 --- a/packages/affine/blocks/block-root/src/common-specs/index.ts +++ b/packages/affine/blocks/root/src/common-specs/index.ts @@ -23,6 +23,7 @@ import { } from '@blocksuite/affine-gfx-text'; import { NoteBlockSchema } from '@blocksuite/affine-model'; import { + AutoClearSelectionService, DNDAPIExtension, DocModeService, EmbedOptionService, @@ -32,6 +33,7 @@ import { ToolbarRegistryExtension, } from '@blocksuite/affine-shared/services'; import { dragHandleWidget } from '@blocksuite/affine-widget-drag-handle'; +import { linkedDocWidget } from '@blocksuite/affine-widget-linked-doc'; import { docRemoteSelectionWidget } from '@blocksuite/affine-widget-remote-selection'; import { scrollAnchoringWidget } from '@blocksuite/affine-widget-scroll-anchoring'; import { SlashMenuExtension } from '@blocksuite/affine-widget-slash-menu'; @@ -42,12 +44,8 @@ import type { ExtensionType } from '@blocksuite/store'; import { RootBlockAdapterExtensions } from '../adapters/extension'; import { clipboardConfigs } from '../clipboard'; import { builtinToolbarConfig } from '../configs/toolbar'; -import { - innerModalWidget, - linkedDocWidget, - modalWidget, - viewportOverlayWidget, -} from './widgets'; +import { fallbackKeymap } from '../keyboard/keymap'; +import { modalWidget, viewportOverlayWidget } from './widgets'; /** * Why do we add these extensions into CommonSpecs? @@ -81,12 +79,12 @@ export const CommonSpecs: ExtensionType[] = [ DNDAPIExtension, FileDropExtension, ToolbarRegistryExtension, + AutoClearSelectionService, ...RootBlockAdapterExtensions, ...clipboardConfigs, ...EdgelessElementViews, ...EdgelessElementRendererExtension, modalWidget, - innerModalWidget, SlashMenuExtension, linkedDocWidget, dragHandleWidget, @@ -94,6 +92,7 @@ export const CommonSpecs: ExtensionType[] = [ viewportOverlayWidget, scrollAnchoringWidget, toolbarWidget, + fallbackKeymap, ToolbarModuleExtension({ id: BlockFlavourIdentifier(NoteBlockSchema.model.flavour), diff --git a/packages/affine/blocks/block-root/src/common-specs/widgets.ts b/packages/affine/blocks/root/src/common-specs/widgets.ts similarity index 55% rename from packages/affine/blocks/block-root/src/common-specs/widgets.ts rename to packages/affine/blocks/root/src/common-specs/widgets.ts index 47d9216d0a22..7ea96b397dbc 100644 --- a/packages/affine/blocks/block-root/src/common-specs/widgets.ts +++ b/packages/affine/blocks/root/src/common-specs/widgets.ts @@ -1,8 +1,6 @@ import { WidgetViewExtension } from '@blocksuite/std'; import { literal, unsafeStatic } from 'lit/static-html.js'; -import { AFFINE_INNER_MODAL_WIDGET } from '../widgets/inner-modal/inner-modal.js'; -import { AFFINE_LINKED_DOC_WIDGET } from '../widgets/linked-doc/config.js'; import { AFFINE_MODAL_WIDGET } from '../widgets/modal/modal.js'; import { AFFINE_VIEWPORT_OVERLAY_WIDGET } from '../widgets/viewport-overlay/viewport-overlay.js'; @@ -11,16 +9,6 @@ export const modalWidget = WidgetViewExtension( AFFINE_MODAL_WIDGET, literal`${unsafeStatic(AFFINE_MODAL_WIDGET)}` ); -export const innerModalWidget = WidgetViewExtension( - 'affine:page', - AFFINE_INNER_MODAL_WIDGET, - literal`${unsafeStatic(AFFINE_INNER_MODAL_WIDGET)}` -); -export const linkedDocWidget = WidgetViewExtension( - 'affine:page', - AFFINE_LINKED_DOC_WIDGET, - literal`${unsafeStatic(AFFINE_LINKED_DOC_WIDGET)}` -); export const viewportOverlayWidget = WidgetViewExtension( 'affine:page', AFFINE_VIEWPORT_OVERLAY_WIDGET, diff --git a/packages/affine/blocks/block-root/src/configs/toolbar.ts b/packages/affine/blocks/root/src/configs/toolbar.ts similarity index 100% rename from packages/affine/blocks/block-root/src/configs/toolbar.ts rename to packages/affine/blocks/root/src/configs/toolbar.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/clipboard/canvas.ts b/packages/affine/blocks/root/src/edgeless/clipboard/canvas.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/clipboard/canvas.ts rename to packages/affine/blocks/root/src/edgeless/clipboard/canvas.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/clipboard/clipboard.ts b/packages/affine/blocks/root/src/edgeless/clipboard/clipboard.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/clipboard/clipboard.ts rename to packages/affine/blocks/root/src/edgeless/clipboard/clipboard.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/clipboard/command.ts b/packages/affine/blocks/root/src/edgeless/clipboard/command.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/clipboard/command.ts rename to packages/affine/blocks/root/src/edgeless/clipboard/command.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/clipboard/utils.ts b/packages/affine/blocks/root/src/edgeless/clipboard/utils.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/clipboard/utils.ts rename to packages/affine/blocks/root/src/edgeless/clipboard/utils.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/auto-complete/auto-complete-panel.ts b/packages/affine/blocks/root/src/edgeless/components/auto-complete/auto-complete-panel.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/auto-complete/auto-complete-panel.ts rename to packages/affine/blocks/root/src/edgeless/components/auto-complete/auto-complete-panel.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/auto-complete/edgeless-auto-complete.ts b/packages/affine/blocks/root/src/edgeless/components/auto-complete/edgeless-auto-complete.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/auto-complete/edgeless-auto-complete.ts rename to packages/affine/blocks/root/src/edgeless/components/auto-complete/edgeless-auto-complete.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/auto-complete/utils.ts b/packages/affine/blocks/root/src/edgeless/components/auto-complete/utils.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/auto-complete/utils.ts rename to packages/affine/blocks/root/src/edgeless/components/auto-complete/utils.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/note-slicer/index.ts b/packages/affine/blocks/root/src/edgeless/components/note-slicer/index.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/note-slicer/index.ts rename to packages/affine/blocks/root/src/edgeless/components/note-slicer/index.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/rects/edgeless-dragging-area-rect.ts b/packages/affine/blocks/root/src/edgeless/components/rects/edgeless-dragging-area-rect.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/rects/edgeless-dragging-area-rect.ts rename to packages/affine/blocks/root/src/edgeless/components/rects/edgeless-dragging-area-rect.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/rects/edgeless-selected-rect.ts b/packages/affine/blocks/root/src/edgeless/components/rects/edgeless-selected-rect.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/rects/edgeless-selected-rect.ts rename to packages/affine/blocks/root/src/edgeless/components/rects/edgeless-selected-rect.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/resize/resize-handles.ts b/packages/affine/blocks/root/src/edgeless/components/resize/resize-handles.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/resize/resize-handles.ts rename to packages/affine/blocks/root/src/edgeless/components/resize/resize-handles.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/resize/resize-manager.ts b/packages/affine/blocks/root/src/edgeless/components/resize/resize-manager.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/resize/resize-manager.ts rename to packages/affine/blocks/root/src/edgeless/components/resize/resize-manager.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/toolbar/common/slide-menu.ts b/packages/affine/blocks/root/src/edgeless/components/toolbar/common/slide-menu.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/toolbar/common/slide-menu.ts rename to packages/affine/blocks/root/src/edgeless/components/toolbar/common/slide-menu.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/toolbar/common/toolbar-arrow-up-icon.ts b/packages/affine/blocks/root/src/edgeless/components/toolbar/common/toolbar-arrow-up-icon.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/toolbar/common/toolbar-arrow-up-icon.ts rename to packages/affine/blocks/root/src/edgeless/components/toolbar/common/toolbar-arrow-up-icon.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/toolbar/default/default-tool-button.ts b/packages/affine/blocks/root/src/edgeless/components/toolbar/default/default-tool-button.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/toolbar/default/default-tool-button.ts rename to packages/affine/blocks/root/src/edgeless/components/toolbar/default/default-tool-button.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/toolbar/link/link-dense-menu.ts b/packages/affine/blocks/root/src/edgeless/components/toolbar/link/link-dense-menu.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/toolbar/link/link-dense-menu.ts rename to packages/affine/blocks/root/src/edgeless/components/toolbar/link/link-dense-menu.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/toolbar/link/link-tool-button.ts b/packages/affine/blocks/root/src/edgeless/components/toolbar/link/link-tool-button.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/toolbar/link/link-tool-button.ts rename to packages/affine/blocks/root/src/edgeless/components/toolbar/link/link-tool-button.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/toolbar/tools.ts b/packages/affine/blocks/root/src/edgeless/components/toolbar/tools.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/toolbar/tools.ts rename to packages/affine/blocks/root/src/edgeless/components/toolbar/tools.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/components/utils.ts b/packages/affine/blocks/root/src/edgeless/components/utils.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/components/utils.ts rename to packages/affine/blocks/root/src/edgeless/components/utils.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/configs/toolbar/alignment.ts b/packages/affine/blocks/root/src/edgeless/configs/toolbar/alignment.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/configs/toolbar/alignment.ts rename to packages/affine/blocks/root/src/edgeless/configs/toolbar/alignment.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/configs/toolbar/index.ts b/packages/affine/blocks/root/src/edgeless/configs/toolbar/index.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/configs/toolbar/index.ts rename to packages/affine/blocks/root/src/edgeless/configs/toolbar/index.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/configs/toolbar/misc.ts b/packages/affine/blocks/root/src/edgeless/configs/toolbar/misc.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/configs/toolbar/misc.ts rename to packages/affine/blocks/root/src/edgeless/configs/toolbar/misc.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/configs/toolbar/more.ts b/packages/affine/blocks/root/src/edgeless/configs/toolbar/more.ts similarity index 99% rename from packages/affine/blocks/block-root/src/edgeless/configs/toolbar/more.ts rename to packages/affine/blocks/root/src/edgeless/configs/toolbar/more.ts index 4d6501861045..be108b32e71c 100644 --- a/packages/affine/blocks/block-root/src/edgeless/configs/toolbar/more.ts +++ b/packages/affine/blocks/root/src/edgeless/configs/toolbar/more.ts @@ -258,7 +258,7 @@ export const moreActions = [ other: 'new doc', }); - moveConnectors(model.id, cardId, edgeless.service); + moveConnectors(model.id, cardId, ctx.std); // Deletes selected note ctx.store.transact(() => { diff --git a/packages/affine/blocks/block-root/src/edgeless/configs/toolbar/render-linked-doc.ts b/packages/affine/blocks/root/src/edgeless/configs/toolbar/render-linked-doc.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/configs/toolbar/render-linked-doc.ts rename to packages/affine/blocks/root/src/edgeless/configs/toolbar/render-linked-doc.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/configs/toolbar/utils.ts b/packages/affine/blocks/root/src/edgeless/configs/toolbar/utils.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/configs/toolbar/utils.ts rename to packages/affine/blocks/root/src/edgeless/configs/toolbar/utils.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/edgeless-builtin-spec.ts b/packages/affine/blocks/root/src/edgeless/edgeless-builtin-spec.ts similarity index 97% rename from packages/affine/blocks/block-root/src/edgeless/edgeless-builtin-spec.ts rename to packages/affine/blocks/root/src/edgeless/edgeless-builtin-spec.ts index 90b8ed768f12..30fcdd5d25c5 100644 --- a/packages/affine/blocks/block-root/src/edgeless/edgeless-builtin-spec.ts +++ b/packages/affine/blocks/root/src/edgeless/edgeless-builtin-spec.ts @@ -19,6 +19,7 @@ import { } from '@blocksuite/affine-gfx-mindmap'; import { NoteTool } from '@blocksuite/affine-gfx-note'; import { ShapeTool } from '@blocksuite/affine-gfx-shape'; +import { TemplateTool } from '@blocksuite/affine-gfx-template'; import { TextTool } from '@blocksuite/affine-gfx-text'; import { ElementTransformManager } from '@blocksuite/std/gfx'; import type { ExtensionType } from '@blocksuite/store'; @@ -30,7 +31,6 @@ import { SnapExtension } from './element-transform/snap-manager.js'; import { DefaultTool } from './gfx-tool/default-tool.js'; import { EmptyTool } from './gfx-tool/empty-tool.js'; import { PanTool } from './gfx-tool/pan-tool.js'; -import { TemplateTool } from './gfx-tool/template-tool.js'; import { EditPropsMiddlewareBuilder } from './middlewares/base.js'; import { SnapOverlay } from './utils/snap-manager.js'; diff --git a/packages/affine/blocks/block-root/src/edgeless/edgeless-keyboard.ts b/packages/affine/blocks/root/src/edgeless/edgeless-keyboard.ts similarity index 99% rename from packages/affine/blocks/block-root/src/edgeless/edgeless-keyboard.ts rename to packages/affine/blocks/root/src/edgeless/edgeless-keyboard.ts index 1df0ce912d30..3fd19d5b9cfd 100644 --- a/packages/affine/blocks/block-root/src/edgeless/edgeless-keyboard.ts +++ b/packages/affine/blocks/root/src/edgeless/edgeless-keyboard.ts @@ -88,6 +88,9 @@ export class EdgelessPageKeyboardManager extends PageKeyboardManager { p: () => { this._setEdgelessTool('brush'); }, + 'Shift-p': () => { + this._setEdgelessTool('highlighter'); + }, e: () => { this._setEdgelessTool('eraser'); }, diff --git a/packages/affine/blocks/block-root/src/edgeless/edgeless-root-block.ts b/packages/affine/blocks/root/src/edgeless/edgeless-root-block.ts similarity index 99% rename from packages/affine/blocks/block-root/src/edgeless/edgeless-root-block.ts rename to packages/affine/blocks/root/src/edgeless/edgeless-root-block.ts index 4495ac182b48..df0fb947abba 100644 --- a/packages/affine/blocks/block-root/src/edgeless/edgeless-root-block.ts +++ b/packages/affine/blocks/root/src/edgeless/edgeless-root-block.ts @@ -45,7 +45,6 @@ import { css, html } from 'lit'; import { query } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; -import type { EdgelessRootBlockWidgetName } from '../types.js'; import type { EdgelessSelectedRectWidget } from './components/rects/edgeless-selected-rect.js'; import { EdgelessPageKeyboardManager } from './edgeless-keyboard.js'; import type { EdgelessRootService } from './edgeless-root-service.js'; @@ -53,8 +52,7 @@ import { isCanvasElement } from './utils/query.js'; export class EdgelessRootBlockComponent extends BlockComponent< RootBlockModel, - EdgelessRootService, - EdgelessRootBlockWidgetName + EdgelessRootService > { static override styles = css` affine-edgeless-root { diff --git a/packages/affine/blocks/block-root/src/edgeless/edgeless-root-preview-block.ts b/packages/affine/blocks/root/src/edgeless/edgeless-root-preview-block.ts similarity index 98% rename from packages/affine/blocks/block-root/src/edgeless/edgeless-root-preview-block.ts rename to packages/affine/blocks/root/src/edgeless/edgeless-root-preview-block.ts index 963342a1432a..e56c4bd873c4 100644 --- a/packages/affine/blocks/block-root/src/edgeless/edgeless-root-preview-block.ts +++ b/packages/affine/blocks/root/src/edgeless/edgeless-root-preview-block.ts @@ -25,14 +25,12 @@ import { css, html } from 'lit'; import { query, state } from 'lit/decorators.js'; import { type StyleInfo, styleMap } from 'lit/directives/style-map.js'; -import type { EdgelessRootBlockWidgetName } from '../types.js'; import type { EdgelessRootService } from './edgeless-root-service.js'; import { isCanvasElement } from './utils/query.js'; export class EdgelessRootPreviewBlockComponent extends BlockComponent< RootBlockModel, - EdgelessRootService, - EdgelessRootBlockWidgetName + EdgelessRootService > { static override styles = css` affine-edgeless-root-preview { diff --git a/packages/affine/blocks/block-root/src/edgeless/edgeless-root-service.ts b/packages/affine/blocks/root/src/edgeless/edgeless-root-service.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/edgeless-root-service.ts rename to packages/affine/blocks/root/src/edgeless/edgeless-root-service.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/edgeless-root-spec.ts b/packages/affine/blocks/root/src/edgeless/edgeless-root-spec.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/edgeless-root-spec.ts rename to packages/affine/blocks/root/src/edgeless/edgeless-root-spec.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/element-transform/dblclick-add-edgeless-text.ts b/packages/affine/blocks/root/src/edgeless/element-transform/dblclick-add-edgeless-text.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/element-transform/dblclick-add-edgeless-text.ts rename to packages/affine/blocks/root/src/edgeless/element-transform/dblclick-add-edgeless-text.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/element-transform/snap-manager.ts b/packages/affine/blocks/root/src/edgeless/element-transform/snap-manager.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/element-transform/snap-manager.ts rename to packages/affine/blocks/root/src/edgeless/element-transform/snap-manager.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/gfx-tool/default-tool-ext/ext.ts b/packages/affine/blocks/root/src/edgeless/gfx-tool/default-tool-ext/ext.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/gfx-tool/default-tool-ext/ext.ts rename to packages/affine/blocks/root/src/edgeless/gfx-tool/default-tool-ext/ext.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/gfx-tool/default-tool.ts b/packages/affine/blocks/root/src/edgeless/gfx-tool/default-tool.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/gfx-tool/default-tool.ts rename to packages/affine/blocks/root/src/edgeless/gfx-tool/default-tool.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/gfx-tool/empty-tool.ts b/packages/affine/blocks/root/src/edgeless/gfx-tool/empty-tool.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/gfx-tool/empty-tool.ts rename to packages/affine/blocks/root/src/edgeless/gfx-tool/empty-tool.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/gfx-tool/index.ts b/packages/affine/blocks/root/src/edgeless/gfx-tool/index.ts similarity index 75% rename from packages/affine/blocks/block-root/src/edgeless/gfx-tool/index.ts rename to packages/affine/blocks/root/src/edgeless/gfx-tool/index.ts index 54c30e114a9b..71f88d98cb58 100644 --- a/packages/affine/blocks/block-root/src/edgeless/gfx-tool/index.ts +++ b/packages/affine/blocks/root/src/edgeless/gfx-tool/index.ts @@ -1,4 +1,3 @@ export { DefaultTool } from './default-tool.js'; export { EmptyTool } from './empty-tool.js'; export { PanTool, type PanToolOption } from './pan-tool.js'; -export { TemplateTool } from './template-tool.js'; diff --git a/packages/affine/blocks/block-root/src/edgeless/gfx-tool/pan-tool.ts b/packages/affine/blocks/root/src/edgeless/gfx-tool/pan-tool.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/gfx-tool/pan-tool.ts rename to packages/affine/blocks/root/src/edgeless/gfx-tool/pan-tool.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/index.ts b/packages/affine/blocks/root/src/edgeless/index.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/index.ts rename to packages/affine/blocks/root/src/edgeless/index.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/middlewares/base.ts b/packages/affine/blocks/root/src/edgeless/middlewares/base.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/middlewares/base.ts rename to packages/affine/blocks/root/src/edgeless/middlewares/base.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/utils/clipboard-utils.ts b/packages/affine/blocks/root/src/edgeless/utils/clipboard-utils.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/utils/clipboard-utils.ts rename to packages/affine/blocks/root/src/edgeless/utils/clipboard-utils.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/utils/clone-utils.ts b/packages/affine/blocks/root/src/edgeless/utils/clone-utils.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/utils/clone-utils.ts rename to packages/affine/blocks/root/src/edgeless/utils/clone-utils.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/utils/connector.ts b/packages/affine/blocks/root/src/edgeless/utils/connector.ts similarity index 63% rename from packages/affine/blocks/block-root/src/edgeless/utils/connector.ts rename to packages/affine/blocks/root/src/edgeless/utils/connector.ts index a33149326531..86807ab17b36 100644 --- a/packages/affine/blocks/block-root/src/edgeless/utils/connector.ts +++ b/packages/affine/blocks/root/src/edgeless/utils/connector.ts @@ -1,6 +1,8 @@ -import { EdgelessCRUDIdentifier } from '@blocksuite/affine-block-surface'; - -import type { EdgelessRootService } from '../edgeless-root-service.js'; +import { + EdgelessCRUDIdentifier, + getSurfaceBlock, +} from '@blocksuite/affine-block-surface'; +import type { BlockStdScope } from '@blocksuite/std'; /** * move connectors from origin to target @@ -11,10 +13,12 @@ import type { EdgelessRootService } from '../edgeless-root-service.js'; export function moveConnectors( originId: string, targetId: string, - service: EdgelessRootService + std: BlockStdScope ) { - const connectors = service.surface.getConnectors(originId); - const crud = service.std.get(EdgelessCRUDIdentifier); + const model = getSurfaceBlock(std.store); + if (!model) return; + const connectors = model.getConnectors(originId); + const crud = std.get(EdgelessCRUDIdentifier); connectors.forEach(connector => { if (connector.source.id === originId) { crud.updateElement(connector.id, { diff --git a/packages/affine/blocks/block-root/src/edgeless/utils/consts.ts b/packages/affine/blocks/root/src/edgeless/utils/consts.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/utils/consts.ts rename to packages/affine/blocks/root/src/edgeless/utils/consts.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/utils/crud.ts b/packages/affine/blocks/root/src/edgeless/utils/crud.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/utils/crud.ts rename to packages/affine/blocks/root/src/edgeless/utils/crud.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/utils/cursors.ts b/packages/affine/blocks/root/src/edgeless/utils/cursors.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/utils/cursors.ts rename to packages/affine/blocks/root/src/edgeless/utils/cursors.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/utils/hotkey-utils.ts b/packages/affine/blocks/root/src/edgeless/utils/hotkey-utils.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/utils/hotkey-utils.ts rename to packages/affine/blocks/root/src/edgeless/utils/hotkey-utils.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/utils/panning-utils.ts b/packages/affine/blocks/root/src/edgeless/utils/panning-utils.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/utils/panning-utils.ts rename to packages/affine/blocks/root/src/edgeless/utils/panning-utils.ts diff --git a/packages/affine/blocks/block-root/src/edgeless/utils/query.ts b/packages/affine/blocks/root/src/edgeless/utils/query.ts similarity index 99% rename from packages/affine/blocks/block-root/src/edgeless/utils/query.ts rename to packages/affine/blocks/root/src/edgeless/utils/query.ts index f5b750c5e5b5..b3fb6ae7c1d5 100644 --- a/packages/affine/blocks/block-root/src/edgeless/utils/query.ts +++ b/packages/affine/blocks/root/src/edgeless/utils/query.ts @@ -222,6 +222,7 @@ export function getCursorMode(edgelessTool: GfxToolsFullOptionValue | null) { case 'shape': case 'connector': case 'frame': + case 'affine:note': return 'crosshair'; case 'text': return 'text'; diff --git a/packages/affine/blocks/block-root/src/edgeless/utils/snap-manager.ts b/packages/affine/blocks/root/src/edgeless/utils/snap-manager.ts similarity index 100% rename from packages/affine/blocks/block-root/src/edgeless/utils/snap-manager.ts rename to packages/affine/blocks/root/src/edgeless/utils/snap-manager.ts diff --git a/packages/affine/blocks/block-root/src/effects.ts b/packages/affine/blocks/root/src/effects.ts similarity index 93% rename from packages/affine/blocks/block-root/src/effects.ts rename to packages/affine/blocks/root/src/effects.ts index b1275d763f36..a97b9ebf4f45 100644 --- a/packages/affine/blocks/block-root/src/effects.ts +++ b/packages/affine/blocks/root/src/effects.ts @@ -7,6 +7,7 @@ import { effects as gfxShapeEffects } from '@blocksuite/affine-gfx-shape/effects import { effects as gfxTemplateEffects } from '@blocksuite/affine-gfx-template/effects'; import { effects as gfxCanvasTextEffects } from '@blocksuite/affine-gfx-text/effects'; import { effects as widgetEdgelessToolbarEffects } from '@blocksuite/affine-widget-edgeless-toolbar/effects'; +import { effects as widgetLinkedDocEffects } from '@blocksuite/affine-widget-linked-doc/effects'; import { EdgelessAutoCompletePanel } from './edgeless/components/auto-complete/auto-complete-panel.js'; import { EdgelessAutoComplete } from './edgeless/components/auto-complete/edgeless-auto-complete.js'; @@ -43,13 +44,7 @@ import { } from './widgets/edgeless-zoom-toolbar/index.js'; import { ZoomBarToggleButton } from './widgets/edgeless-zoom-toolbar/zoom-bar-toggle-button.js'; import { EdgelessZoomToolbar } from './widgets/edgeless-zoom-toolbar/zoom-toolbar.js'; -import { - AFFINE_INNER_MODAL_WIDGET, - AffineInnerModalWidget, -} from './widgets/inner-modal/inner-modal.js'; import { effects as widgetMobileToolbarEffects } from './widgets/keyboard-toolbar/effects.js'; -import { effects as widgetLinkedDocEffects } from './widgets/linked-doc/effects.js'; -import { Loader } from './widgets/linked-doc/import-doc/loader.js'; import { AffineCustomModal } from './widgets/modal/custom-modal.js'; import { AFFINE_MODAL_WIDGET } from './widgets/modal/modal.js'; import { @@ -97,7 +92,6 @@ function registerGfxEffects() { } function registerWidgets() { - customElements.define(AFFINE_INNER_MODAL_WIDGET, AffineInnerModalWidget); customElements.define(AFFINE_MODAL_WIDGET, AffineModalWidget); customElements.define( AFFINE_PAGE_DRAGGING_AREA_WIDGET, @@ -132,9 +126,6 @@ function registerMiscComponents() { // Modal and menu components customElements.define('affine-custom-modal', AffineCustomModal); - // Loading and preview components - customElements.define('loader-element', Loader); - // Toolbar and UI components customElements.define('edgeless-zoom-toolbar', EdgelessZoomToolbar); customElements.define('zoom-bar-toggle-button', ZoomBarToggleButton); @@ -185,6 +176,5 @@ declare global { 'edgeless-zoom-toolbar': EdgelessZoomToolbar; [AFFINE_EDGELESS_ZOOM_TOOLBAR_WIDGET]: AffineEdgelessZoomToolbarWidget; - [AFFINE_INNER_MODAL_WIDGET]: AffineInnerModalWidget; } } diff --git a/packages/affine/blocks/block-root/src/index.ts b/packages/affine/blocks/root/src/index.ts similarity index 93% rename from packages/affine/blocks/block-root/src/index.ts rename to packages/affine/blocks/root/src/index.ts index f099922e26be..1623f7d5bd5d 100644 --- a/packages/affine/blocks/block-root/src/index.ts +++ b/packages/affine/blocks/root/src/index.ts @@ -10,7 +10,6 @@ export * from './page/page-root-spec.js'; export * from './preview/preview-root-block.js'; export * from './root-config.js'; export { RootService } from './root-service.js'; -export * from './transformers/index.js'; export * from './types.js'; export * from './utils/index.js'; export * from './widgets/index.js'; diff --git a/packages/affine/blocks/block-root/src/keyboard/keyboard-manager.ts b/packages/affine/blocks/root/src/keyboard/keyboard-manager.ts similarity index 100% rename from packages/affine/blocks/block-root/src/keyboard/keyboard-manager.ts rename to packages/affine/blocks/root/src/keyboard/keyboard-manager.ts diff --git a/packages/affine/blocks/root/src/keyboard/keymap.ts b/packages/affine/blocks/root/src/keyboard/keymap.ts new file mode 100644 index 000000000000..6acb3d27db32 --- /dev/null +++ b/packages/affine/blocks/root/src/keyboard/keymap.ts @@ -0,0 +1,16 @@ +import { KeymapExtension } from '@blocksuite/std'; + +export const fallbackKeymap = KeymapExtension(() => { + return { + Tab: ctx => { + const event = ctx.get('defaultState').event; + event.stopPropagation(); + event.preventDefault(); + }, + 'Shift-Tab': ctx => { + const event = ctx.get('defaultState').event; + event.stopPropagation(); + event.preventDefault(); + }, + }; +}); diff --git a/packages/affine/blocks/block-root/src/page/page-root-block.ts b/packages/affine/blocks/root/src/page/page-root-block.ts similarity index 99% rename from packages/affine/blocks/block-root/src/page/page-root-block.ts rename to packages/affine/blocks/root/src/page/page-root-block.ts index 522b02c98028..013d892b5483 100644 --- a/packages/affine/blocks/block-root/src/page/page-root-block.ts +++ b/packages/affine/blocks/root/src/page/page-root-block.ts @@ -27,7 +27,6 @@ import { css, html } from 'lit'; import { query } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; -import type { PageRootBlockWidgetName } from '../index.js'; import { PageKeyboardManager } from '../keyboard/keyboard-manager.js'; import type { PageRootService } from './page-root-service.js'; @@ -52,8 +51,7 @@ function testClickOnBlankArea( export class PageRootBlockComponent extends BlockComponent< RootBlockModel, - PageRootService, - PageRootBlockWidgetName + PageRootService > { static override styles = css` editor-host:has(> affine-page-root, * > affine-page-root) { diff --git a/packages/affine/blocks/block-root/src/page/page-root-service.ts b/packages/affine/blocks/root/src/page/page-root-service.ts similarity index 100% rename from packages/affine/blocks/block-root/src/page/page-root-service.ts rename to packages/affine/blocks/root/src/page/page-root-service.ts diff --git a/packages/affine/blocks/block-root/src/page/page-root-spec.ts b/packages/affine/blocks/root/src/page/page-root-spec.ts similarity index 93% rename from packages/affine/blocks/block-root/src/page/page-root-spec.ts rename to packages/affine/blocks/root/src/page/page-root-spec.ts index 373105f4320f..fd4ddab5cfe8 100644 --- a/packages/affine/blocks/block-root/src/page/page-root-spec.ts +++ b/packages/affine/blocks/root/src/page/page-root-spec.ts @@ -1,4 +1,5 @@ import { ViewportElementExtension } from '@blocksuite/affine-shared/services'; +import { IS_MOBILE } from '@blocksuite/global/env'; import { BlockViewExtension, WidgetViewExtension } from '@blocksuite/std'; import type { ExtensionType } from '@blocksuite/store'; import { literal, unsafeStatic } from 'lit/static-html.js'; @@ -31,7 +32,7 @@ const PageCommonExtension: ExtensionType[] = [ export const PageRootBlockSpec: ExtensionType[] = [ ...PageCommonExtension, BlockViewExtension('affine:page', literal`affine-page-root`), - keyboardToolbarWidget, + IS_MOBILE ? [keyboardToolbarWidget] : [], PageClipboard, ].flat(); diff --git a/packages/affine/blocks/block-root/src/preview/preview-root-block.ts b/packages/affine/blocks/root/src/preview/preview-root-block.ts similarity index 100% rename from packages/affine/blocks/block-root/src/preview/preview-root-block.ts rename to packages/affine/blocks/root/src/preview/preview-root-block.ts diff --git a/packages/affine/blocks/block-root/src/root-config.ts b/packages/affine/blocks/root/src/root-config.ts similarity index 73% rename from packages/affine/blocks/block-root/src/root-config.ts rename to packages/affine/blocks/root/src/root-config.ts index 9c12d9ec5952..d75005611f54 100644 --- a/packages/affine/blocks/block-root/src/root-config.ts +++ b/packages/affine/blocks/root/src/root-config.ts @@ -1,10 +1,8 @@ import { ConfigExtensionFactory } from '@blocksuite/std'; import type { KeyboardToolbarConfig } from './widgets/keyboard-toolbar/config.js'; -import type { LinkedWidgetConfig } from './widgets/linked-doc/index.js'; export interface RootBlockConfig { - linkedWidget?: Partial; keyboardToolbar?: Partial; } diff --git a/packages/affine/blocks/block-root/src/root-service.ts b/packages/affine/blocks/root/src/root-service.ts similarity index 100% rename from packages/affine/blocks/block-root/src/root-service.ts rename to packages/affine/blocks/root/src/root-service.ts diff --git a/packages/affine/blocks/root/src/types.ts b/packages/affine/blocks/root/src/types.ts new file mode 100644 index 000000000000..f43732745cf2 --- /dev/null +++ b/packages/affine/blocks/root/src/types.ts @@ -0,0 +1,6 @@ +import type { EdgelessRootBlockComponent } from './edgeless/edgeless-root-block.js'; +import type { PageRootBlockComponent } from './page/page-root-block.js'; + +export type RootBlockComponent = + | PageRootBlockComponent + | EdgelessRootBlockComponent; diff --git a/packages/affine/blocks/block-root/src/utils/callback.ts b/packages/affine/blocks/root/src/utils/callback.ts similarity index 100% rename from packages/affine/blocks/block-root/src/utils/callback.ts rename to packages/affine/blocks/root/src/utils/callback.ts diff --git a/packages/affine/blocks/block-root/src/utils/index.ts b/packages/affine/blocks/root/src/utils/index.ts similarity index 100% rename from packages/affine/blocks/block-root/src/utils/index.ts rename to packages/affine/blocks/root/src/utils/index.ts diff --git a/packages/affine/blocks/block-root/src/utils/query.ts b/packages/affine/blocks/root/src/utils/query.ts similarity index 100% rename from packages/affine/blocks/block-root/src/utils/query.ts rename to packages/affine/blocks/root/src/utils/query.ts diff --git a/packages/affine/blocks/block-root/src/utils/types.ts b/packages/affine/blocks/root/src/utils/types.ts similarity index 100% rename from packages/affine/blocks/block-root/src/utils/types.ts rename to packages/affine/blocks/root/src/utils/types.ts diff --git a/packages/affine/blocks/block-root/src/widgets/edgeless-navigator-bg/index.ts b/packages/affine/blocks/root/src/widgets/edgeless-navigator-bg/index.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/edgeless-navigator-bg/index.ts rename to packages/affine/blocks/root/src/widgets/edgeless-navigator-bg/index.ts diff --git a/packages/affine/blocks/block-root/src/widgets/edgeless-zoom-toolbar/index.ts b/packages/affine/blocks/root/src/widgets/edgeless-zoom-toolbar/index.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/edgeless-zoom-toolbar/index.ts rename to packages/affine/blocks/root/src/widgets/edgeless-zoom-toolbar/index.ts diff --git a/packages/affine/blocks/block-root/src/widgets/edgeless-zoom-toolbar/zoom-bar-toggle-button.ts b/packages/affine/blocks/root/src/widgets/edgeless-zoom-toolbar/zoom-bar-toggle-button.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/edgeless-zoom-toolbar/zoom-bar-toggle-button.ts rename to packages/affine/blocks/root/src/widgets/edgeless-zoom-toolbar/zoom-bar-toggle-button.ts diff --git a/packages/affine/blocks/block-root/src/widgets/edgeless-zoom-toolbar/zoom-toolbar.ts b/packages/affine/blocks/root/src/widgets/edgeless-zoom-toolbar/zoom-toolbar.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/edgeless-zoom-toolbar/zoom-toolbar.ts rename to packages/affine/blocks/root/src/widgets/edgeless-zoom-toolbar/zoom-toolbar.ts diff --git a/packages/affine/blocks/block-root/src/widgets/index.ts b/packages/affine/blocks/root/src/widgets/index.ts similarity index 50% rename from packages/affine/blocks/block-root/src/widgets/index.ts rename to packages/affine/blocks/root/src/widgets/index.ts index 286eee9dfb1e..73616f6158e5 100644 --- a/packages/affine/blocks/block-root/src/widgets/index.ts +++ b/packages/affine/blocks/root/src/widgets/index.ts @@ -1,18 +1,5 @@ export { AffineEdgelessZoomToolbarWidget } from './edgeless-zoom-toolbar/index.js'; -export { AffineInnerModalWidget } from './inner-modal/inner-modal.js'; export * from './keyboard-toolbar/index.js'; -export { - type LinkedMenuAction, - type LinkedMenuGroup, - type LinkedMenuItem, - type LinkedWidgetConfig, - LinkedWidgetUtils, -} from './linked-doc/config.js'; -export { - // It's used in the AFFiNE! - showImportModal, -} from './linked-doc/import-doc/index.js'; -export { AffineLinkedDocWidget } from './linked-doc/index.js'; export { AffineModalWidget } from './modal/modal.js'; export { AffinePageDraggingAreaWidget } from './page-dragging-area/page-dragging-area.js'; export * from './viewport-overlay/viewport-overlay.js'; diff --git a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/config.ts b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/config.ts similarity index 95% rename from packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/config.ts rename to packages/affine/blocks/root/src/widgets/keyboard-toolbar/config.ts index 91472af50c42..7f845408d6ed 100644 --- a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/config.ts +++ b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/config.ts @@ -34,10 +34,7 @@ import { toggleUnderline, } from '@blocksuite/affine-inline-preset'; import type { FrameBlockModel } from '@blocksuite/affine-model'; -import { - getInlineEditorByModel, - insertContent, -} from '@blocksuite/affine-rich-text'; +import { insertContent } from '@blocksuite/affine-rich-text'; import { copySelectedModelsCommand, deleteSelectedModelsCommand, @@ -55,6 +52,7 @@ import { openFileOrFiles, type Signal, } from '@blocksuite/affine-shared/utils'; +import type { AffineLinkedDocWidget } from '@blocksuite/affine-widget-linked-doc'; import { viewPresets } from '@blocksuite/data-view/view-presets'; import { assertType } from '@blocksuite/global/utils'; import { @@ -105,7 +103,6 @@ import { cssVarV2 } from '@toeverything/theme/v2'; import type { TemplateResult } from 'lit'; import type { PageRootBlockComponent } from '../../page/page-root-block.js'; -import type { AffineLinkedDocWidget } from '../linked-doc/index.js'; import { FigmaDuotoneIcon, HeadingIcon, @@ -348,35 +345,11 @@ const pageToolGroup: KeyboardToolPanelGroup = { ); if (!linkedDocWidget) return; assertType(linkedDocWidget); - - const triggerKey = linkedDocWidget.config.triggerKeys[0]; - - std.command - .chain() - .pipe(getSelectedModelsCommand) - .pipe(ctx => { - const { selectedModels } = ctx; - if (!selectedModels?.length) return; - - const currentModel = selectedModels[0]; - insertContent(std, currentModel, triggerKey); - - const inlineEditor = getInlineEditorByModel(std, currentModel); - // Wait for range to be updated - if (inlineEditor) { - const subscription = inlineEditor.slots.inlineRangeSync.subscribe( - () => { - subscription.unsubscribe(); - linkedDocWidget.show({ - mode: 'mobile', - addTriggerKey: true, - }); - closeToolPanel(); - } - ); - } - }) - .run(); + linkedDocWidget.show({ + mode: 'mobile', + addTriggerKey: true, + }); + closeToolPanel(); }, }, ], @@ -428,8 +401,7 @@ const contentMediaToolGroup: KeyboardToolPanelGroup = { { name: 'Attachment', icon: AttachmentIcon(), - showWhen: ({ std }) => - std.store.schema.flavourSchemaMap.has('affine:attachment'), + showWhen: () => false, action: async ({ std }) => { const [_, { selectedModels }] = std.command.exec( getSelectedModelsCommand @@ -1029,8 +1001,7 @@ export const defaultKeyboardToolbarConfig: KeyboardToolbarConfig = { { name: 'Attachment', icon: AttachmentIcon(), - showWhen: ({ std }) => - std.store.schema.flavourSchemaMap.has('affine:attachment'), + showWhen: () => false, action: async ({ std }) => { const [_, { selectedModels }] = std.command.exec( getSelectedModelsCommand diff --git a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/effects.ts b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/effects.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/effects.ts rename to packages/affine/blocks/root/src/widgets/keyboard-toolbar/effects.ts diff --git a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/icons.ts b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/icons.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/icons.ts rename to packages/affine/blocks/root/src/widgets/keyboard-toolbar/icons.ts diff --git a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/index.ts b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/index.ts similarity index 82% rename from packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/index.ts rename to packages/affine/blocks/root/src/widgets/keyboard-toolbar/index.ts index bab0abbfc2a1..3b94214cfd1c 100644 --- a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/index.ts +++ b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/index.ts @@ -2,6 +2,7 @@ import { getDocTitleByEditorHost } from '@blocksuite/affine-fragment-doc-title'; import type { RootBlockModel } from '@blocksuite/affine-model'; import { FeatureFlagService, + isVirtualKeyboardProviderWithAction, VirtualKeyboardProvider, type VirtualKeyboardProviderWithAction, } from '@blocksuite/affine-shared/services'; @@ -10,7 +11,6 @@ import { WidgetComponent } from '@blocksuite/std'; import { effect, signal } from '@preact/signals-core'; import { html, nothing } from 'lit'; -import type { PageRootBlockComponent } from '../../page/page-root-block.js'; import { RootBlockConfigExtension } from '../../root-config.js'; import { defaultKeyboardToolbarConfig } from './config.js'; @@ -18,10 +18,7 @@ export * from './config.js'; export const AFFINE_KEYBOARD_TOOLBAR_WIDGET = 'affine-keyboard-toolbar-widget'; -export class AffineKeyboardToolbarWidget extends WidgetComponent< - RootBlockModel, - PageRootBlockComponent -> { +export class AffineKeyboardToolbarWidget extends WidgetComponent { private readonly _close = (blur: boolean) => { if (blur) { if (document.activeElement === this._docTitle?.inlineEditorContainer) { @@ -38,7 +35,10 @@ export class AffineKeyboardToolbarWidget extends WidgetComponent< private _initialInputMode: string = ''; - get keyboard(): VirtualKeyboardProviderWithAction { + get keyboard(): VirtualKeyboardProviderWithAction & { fallback?: boolean } { + const provider = this.std.get(VirtualKeyboardProvider); + if (isVirtualKeyboardProviderWithAction(provider)) return provider; + return { // fallback keyboard actions show: () => { @@ -53,7 +53,7 @@ export class AffineKeyboardToolbarWidget extends WidgetComponent< rootComponent.inputMode = 'none'; } }, - ...this.std.get(VirtualKeyboardProvider), + ...provider, }; } @@ -74,10 +74,6 @@ export class AffineKeyboardToolbarWidget extends WidgetComponent< const rootComponent = this.block?.rootComponent; if (rootComponent) { - this._initialInputMode = rootComponent.inputMode; - this.disposables.add(() => { - rootComponent.inputMode = this._initialInputMode; - }); this.disposables.addFromEvent(rootComponent, 'focus', () => { this._show$.value = true; }); @@ -85,14 +81,20 @@ export class AffineKeyboardToolbarWidget extends WidgetComponent< this._show$.value = false; }); - this.disposables.add( - effect(() => { - // recover input mode when keyboard toolbar is hidden - if (!this._show$.value) { - rootComponent.inputMode = this._initialInputMode; - } - }) - ); + if (this.keyboard.fallback) { + this._initialInputMode = rootComponent.inputMode; + this.disposables.add(() => { + rootComponent.inputMode = this._initialInputMode; + }); + this.disposables.add( + effect(() => { + // recover input mode when keyboard toolbar is hidden + if (!this._show$.value) { + rootComponent.inputMode = this._initialInputMode; + } + }) + ); + } } if (this._docTitle) { diff --git a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/keyboard-tool-panel.ts b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/keyboard-tool-panel.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/keyboard-tool-panel.ts rename to packages/affine/blocks/root/src/widgets/keyboard-toolbar/keyboard-tool-panel.ts diff --git a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/keyboard-toolbar.ts b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/keyboard-toolbar.ts similarity index 95% rename from packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/keyboard-toolbar.ts rename to packages/affine/blocks/root/src/widgets/keyboard-toolbar/keyboard-toolbar.ts index 45e646cdea40..0f45cf92b4bf 100644 --- a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/keyboard-toolbar.ts +++ b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/keyboard-toolbar.ts @@ -55,10 +55,8 @@ export class AffineKeyboardToolbar extends SignalWatcher( } private readonly _closeToolPanel = () => { - if (!this.panelOpened) return; - this._currentPanelIndex$.value = -1; - this.keyboard.show(); + if (!this.keyboard.visible$.peek()) this.keyboard.show(); }; private readonly _currentPanelIndex$ = signal(-1); @@ -255,6 +253,16 @@ export class AffineKeyboardToolbar extends SignalWatcher( }) ); + this.disposables.add( + effect(() => { + // sometime the keyboard will auto show when user click into different paragraph in Android, + // so we need to close the tool panel explicitly when the keyboard is visible + if (this.keyboard.visible$.value) { + this._closeToolPanel(); + } + }) + ); + this._watchAutoShow(); } diff --git a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/position-controller.ts b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/position-controller.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/position-controller.ts rename to packages/affine/blocks/root/src/widgets/keyboard-toolbar/position-controller.ts diff --git a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/styles.ts b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/styles.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/styles.ts rename to packages/affine/blocks/root/src/widgets/keyboard-toolbar/styles.ts diff --git a/packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/utils.ts b/packages/affine/blocks/root/src/widgets/keyboard-toolbar/utils.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/keyboard-toolbar/utils.ts rename to packages/affine/blocks/root/src/widgets/keyboard-toolbar/utils.ts diff --git a/packages/affine/blocks/block-root/src/widgets/modal/custom-modal.ts b/packages/affine/blocks/root/src/widgets/modal/custom-modal.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/modal/custom-modal.ts rename to packages/affine/blocks/root/src/widgets/modal/custom-modal.ts diff --git a/packages/affine/blocks/block-root/src/widgets/modal/modal.ts b/packages/affine/blocks/root/src/widgets/modal/modal.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/modal/modal.ts rename to packages/affine/blocks/root/src/widgets/modal/modal.ts diff --git a/packages/affine/blocks/block-root/src/widgets/page-dragging-area/page-dragging-area.ts b/packages/affine/blocks/root/src/widgets/page-dragging-area/page-dragging-area.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/page-dragging-area/page-dragging-area.ts rename to packages/affine/blocks/root/src/widgets/page-dragging-area/page-dragging-area.ts diff --git a/packages/affine/blocks/block-root/src/widgets/viewport-overlay/viewport-overlay.ts b/packages/affine/blocks/root/src/widgets/viewport-overlay/viewport-overlay.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/viewport-overlay/viewport-overlay.ts rename to packages/affine/blocks/root/src/widgets/viewport-overlay/viewport-overlay.ts diff --git a/packages/affine/blocks/root/tsconfig.json b/packages/affine/blocks/root/tsconfig.json new file mode 100644 index 000000000000..3cb7cf260ea6 --- /dev/null +++ b/packages/affine/blocks/root/tsconfig.json @@ -0,0 +1,56 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" + }, + "include": ["./src"], + "references": [ + { "path": "../attachment" }, + { "path": "../bookmark" }, + { "path": "../data-view" }, + { "path": "../database" }, + { "path": "../edgeless-text" }, + { "path": "../embed" }, + { "path": "../frame" }, + { "path": "../image" }, + { "path": "../latex" }, + { "path": "../list" }, + { "path": "../note" }, + { "path": "../paragraph" }, + { "path": "../surface" }, + { "path": "../surface-ref" }, + { "path": "../table" }, + { "path": "../../components" }, + { "path": "../../fragments/doc-title" }, + { "path": "../../gfx/brush" }, + { "path": "../../gfx/connector" }, + { "path": "../../gfx/group" }, + { "path": "../../gfx/mindmap" }, + { "path": "../../gfx/note" }, + { "path": "../../gfx/shape" }, + { "path": "../../gfx/template" }, + { "path": "../../gfx/text" }, + { "path": "../../inlines/latex" }, + { "path": "../../inlines/link" }, + { "path": "../../inlines/preset" }, + { "path": "../../inlines/reference" }, + { "path": "../../model" }, + { "path": "../../rich-text" }, + { "path": "../../shared" }, + { "path": "../../widgets/drag-handle" }, + { "path": "../../widgets/edgeless-auto-connect" }, + { "path": "../../widgets/edgeless-toolbar" }, + { "path": "../../widgets/frame-title" }, + { "path": "../../widgets/linked-doc" }, + { "path": "../../widgets/remote-selection" }, + { "path": "../../widgets/scroll-anchoring" }, + { "path": "../../widgets/slash-menu" }, + { "path": "../../widgets/toolbar" }, + { "path": "../../data-view" }, + { "path": "../../../framework/global" }, + { "path": "../../../framework/std" }, + { "path": "../../../framework/store" } + ] +} diff --git a/packages/affine/blocks/block-surface-ref/package.json b/packages/affine/blocks/surface-ref/package.json similarity index 100% rename from packages/affine/blocks/block-surface-ref/package.json rename to packages/affine/blocks/surface-ref/package.json diff --git a/packages/affine/blocks/block-surface-ref/src/commands.ts b/packages/affine/blocks/surface-ref/src/commands.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/commands.ts rename to packages/affine/blocks/surface-ref/src/commands.ts diff --git a/packages/affine/blocks/block-surface-ref/src/components/index.ts b/packages/affine/blocks/surface-ref/src/components/index.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/components/index.ts rename to packages/affine/blocks/surface-ref/src/components/index.ts diff --git a/packages/affine/blocks/block-surface-ref/src/components/placeholder.ts b/packages/affine/blocks/surface-ref/src/components/placeholder.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/components/placeholder.ts rename to packages/affine/blocks/surface-ref/src/components/placeholder.ts diff --git a/packages/affine/blocks/block-surface-ref/src/components/surface-ref-toolbar-title.ts b/packages/affine/blocks/surface-ref/src/components/surface-ref-toolbar-title.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/components/surface-ref-toolbar-title.ts rename to packages/affine/blocks/surface-ref/src/components/surface-ref-toolbar-title.ts diff --git a/packages/affine/blocks/block-surface-ref/src/configs/slash-menu.ts b/packages/affine/blocks/surface-ref/src/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/configs/slash-menu.ts rename to packages/affine/blocks/surface-ref/src/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-surface-ref/src/configs/toolbar.ts b/packages/affine/blocks/surface-ref/src/configs/toolbar.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/configs/toolbar.ts rename to packages/affine/blocks/surface-ref/src/configs/toolbar.ts diff --git a/packages/affine/blocks/block-surface-ref/src/configs/tooltips.ts b/packages/affine/blocks/surface-ref/src/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/configs/tooltips.ts rename to packages/affine/blocks/surface-ref/src/configs/tooltips.ts diff --git a/packages/affine/blocks/block-surface-ref/src/effects.ts b/packages/affine/blocks/surface-ref/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/effects.ts rename to packages/affine/blocks/surface-ref/src/effects.ts diff --git a/packages/affine/blocks/block-surface-ref/src/icons.ts b/packages/affine/blocks/surface-ref/src/icons.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/icons.ts rename to packages/affine/blocks/surface-ref/src/icons.ts diff --git a/packages/affine/blocks/block-surface-ref/src/index.ts b/packages/affine/blocks/surface-ref/src/index.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/index.ts rename to packages/affine/blocks/surface-ref/src/index.ts diff --git a/packages/affine/blocks/block-surface-ref/src/portal/generic-block.ts b/packages/affine/blocks/surface-ref/src/portal/generic-block.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/portal/generic-block.ts rename to packages/affine/blocks/surface-ref/src/portal/generic-block.ts diff --git a/packages/affine/blocks/block-surface-ref/src/portal/note.ts b/packages/affine/blocks/surface-ref/src/portal/note.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/portal/note.ts rename to packages/affine/blocks/surface-ref/src/portal/note.ts diff --git a/packages/affine/blocks/block-surface-ref/src/surface-ref-block-edgeless.ts b/packages/affine/blocks/surface-ref/src/surface-ref-block-edgeless.ts similarity index 100% rename from packages/affine/blocks/block-surface-ref/src/surface-ref-block-edgeless.ts rename to packages/affine/blocks/surface-ref/src/surface-ref-block-edgeless.ts diff --git a/packages/affine/blocks/block-surface-ref/src/surface-ref-block.ts b/packages/affine/blocks/surface-ref/src/surface-ref-block.ts similarity index 95% rename from packages/affine/blocks/block-surface-ref/src/surface-ref-block.ts rename to packages/affine/blocks/surface-ref/src/surface-ref-block.ts index eadbdeb16ddf..f93c8b547826 100644 --- a/packages/affine/blocks/block-surface-ref/src/surface-ref-block.ts +++ b/packages/affine/blocks/surface-ref/src/surface-ref-block.ts @@ -49,7 +49,7 @@ import { import type { BaseSelection, Store } from '@blocksuite/store'; import { effect, signal } from '@preact/signals-core'; import { css, html, nothing } from 'lit'; -import { query, state } from 'lit/decorators.js'; +import { query } from 'lit/decorators.js'; import { classMap } from 'lit/directives/class-map.js'; import { guard } from 'lit/directives/guard.js'; import { styleMap } from 'lit/directives/style-map.js'; @@ -103,17 +103,12 @@ export class SurfaceRefBlockComponent extends BlockComponent { this.selection.update(() => { return [this.selection.create(BlockSelection, { blockId: this.blockId })]; }); - } + }; private _initHotkey() { const selection = this.host.selection; @@ -178,7 +173,7 @@ export class SurfaceRefBlockComponent extends BlockComponent { - if (!this._focused) return; + if (!this.selected$.value) return; addParagraph(); return true; }, @@ -260,17 +255,6 @@ export class SurfaceRefBlockComponent extends BlockComponent { - this._focused = selList.some( - sel => sel.blockId === this.blockId && sel.is(BlockSelection) - ); - }) - ); - } - private _initViewport() { const refreshViewport = () => { if (!this._referenceXYWH$.value) return; @@ -436,7 +420,6 @@ export class SurfaceRefBlockComponent extends BlockComponent ${content}
@@ -488,9 +471,6 @@ export class SurfaceRefBlockComponent extends BlockComponent [x + offset[0] * w, y + offset[1] * h] as IVec) + .map(offset => [x + offset[0] * w, y + offset[1] * h]) .map(point => getPointFromBoundsWithRotation(bounds, point)) .reduce( (prev, curr, index) => { @@ -99,7 +98,7 @@ export function calculateNearestLocation( return prev; }, [...locations[0]] - ) as IVec; + ); } function rBound(ele: GfxModel, anti = false): IBound { @@ -139,21 +138,19 @@ export function getAnchors(ele: GfxModel) { const anchors: { point: PointLocation; coord: IVec }[] = []; const rotate = ele.rotate; - [ - [bound.center[0], bound.y - offset], - [bound.center[0], bound.maxY + offset], - [bound.x - offset, bound.center[1]], - [bound.maxX + offset, bound.center[1]], - ] - .map(vec => - getPointFromBoundsWithRotation({ ...bound, rotate }, vec as IVec) - ) + ( + [ + [bound.center[0], bound.y - offset], + [bound.center[0], bound.maxY + offset], + [bound.x - offset, bound.center[1]], + [bound.maxX + offset, bound.center[1]], + ] satisfies IVec[] + ) + .map(vec => getPointFromBoundsWithRotation({ ...bound, rotate }, vec)) .forEach(vec => { - const rst = ele.getLineIntersections(bound.center as IVec, vec as IVec); - if (!rst) { - console.error(`Failed to get line intersections for ${ele.id}`); - return; - } + const rst = ele.getLineIntersections(bound.center, vec); + if (!rst) return; + const originPoint = getPointFromBoundsWithRotation( { ...bound, rotate: -rotate }, rst[0] @@ -164,7 +161,7 @@ export function getAnchors(ele: GfxModel) { } function getConnectableRelativePosition(connectable: GfxModel, position: IVec) { - const location = connectable.getRelativePointLocation(position as IVec); + const location = connectable.getRelativePointLocation(position); if (isVecZero(Vec.sub(position, [0, 0.5]))) location.tangent = Vec.rot([0, -1], toRadian(connectable.rotate)); else if (isVecZero(Vec.sub(position, [1, 0.5]))) @@ -184,7 +181,11 @@ export function getNearestConnectableAnchor(ele: Connectable, point: IVec) { ); } -function closestPoint(points: PointLocation[], point: IVec) { +function closestPoint( + points: PointLocation[], + point: IVec +): PointLocation | null { + if (points.length === 0) return null; const rst = points.map(p => ({ p, d: Vec.dist(p, point) })); rst.sort((a, b) => a.d - b.d); return rst[0].p; @@ -245,7 +246,7 @@ function filterConnectablePoints( ): T[] { return points.filter(point => { if (!bound) return true; - return !bound.isPointInBound(point as IVec); + return !bound.isPointInBound([point[0], point[1]]); }); } @@ -368,15 +369,17 @@ function pushGapMidPoint( bound.lowerLine, bound2.upperLine, bound2.lowerLine, - ].map(line => { - return lineIntersects( - point as unknown as IVec, - [point[0], point[1] + 1], - line[0], - line[1], - true - ) as IVec; - }); + ] + .map(line => { + return lineIntersects( + [point[0], point[1]], + [point[0], point[1] + 1], + line[0], + line[1], + true + ); + }) + .filter(p => p !== null); rst.sort((a, b) => a[1] - b[1]); const midPoint = Vec.lrp(rst[1], rst[2], 0.5); pushWithPriority(points, [midPoint], 6); @@ -399,15 +402,17 @@ function pushGapMidPoint( bound.rightLine, bound2.leftLine, bound2.rightLine, - ].map(line => { - return lineIntersects( - point as unknown as IVec, - [point[0] + 1, point[1]], - line[0], - line[1], - true - ) as IVec; - }); + ] + .map(line => { + return lineIntersects( + [point[0], point[1]], + [point[0] + 1, point[1]], + line[0], + line[1], + true + ); + }) + .filter(p => p !== null); rst.sort((a, b) => a[0] - b[0]); const midPoint = Vec.lrp(rst[1], rst[2], 0.5); pushWithPriority(points, [midPoint], 6); @@ -480,14 +485,14 @@ function getConnectablePoints( expandEndBound: Bound | null ) { const lineBound = Bound.fromPoints([ - startPoint, - endPoint, - ] as unknown[] as IVec[]); + [startPoint[0], startPoint[1]], + [endPoint[0], endPoint[1]], + ]); const outerBound = expandStartBound && expandEndBound && expandStartBound.unite(expandEndBound); - let points = [nextStartPoint, lastEndPoint] as IVec3[]; + let points = [nextStartPoint, lastEndPoint]; pushWithPriority(points, lineBound.getVerticesAndMidpoints()); if (!startBound || !endBound) { @@ -534,7 +539,7 @@ function getConnectablePoints( pushWithPriority(points, expandStartBound.getVerticesAndMidpoints()); pushWithPriority( points, - expandStartBound.include(lastEndPoint as unknown as IVec).points + expandStartBound.include([lastEndPoint[0], lastEndPoint[1]]).points ); } @@ -542,7 +547,7 @@ function getConnectablePoints( pushWithPriority(points, expandEndBound.getVerticesAndMidpoints()); pushWithPriority( points, - expandEndBound.include(nextStartPoint as unknown as IVec).points + expandEndBound.include([nextStartPoint[0], nextStartPoint[1]]).points ); } @@ -561,7 +566,7 @@ function getConnectablePoints( almostEqual(item[0], point[0], 0.02) && almostEqual(item[1], point[1], 0.02) ); - }) as IVec3[]; + }); if (!startEnds[0] || !startEnds[1]) { throw new BlockSuiteError( BlockSuiteError.ErrorCode.ValueNotExists, @@ -603,7 +608,9 @@ function mergePath(points: IVec[] | IVec3[]) { continue; result.push([cur[0], cur[1]]); } - result.push(last(points as IVec[]) as IVec); + if (points.length !== 0) { + result.push([points[points.length - 1][0], points[points.length - 1][1]]); + } for (let i = 0; i < result.length - 1; i++) { const cur = result[i]; const next = result[i + 1]; @@ -687,7 +694,7 @@ function getNextPoint( offsetW = 10, offsetH = 10 ) { - const result: IVec = Array.from(point) as IVec; + const result: IVec = [point[0], point[1]]; if (almostEqual(bound.x, result[0])) result[0] -= offsetX; else if (almostEqual(bound.y, result[1])) result[1] -= offsetY; else if (almostEqual(bound.maxX, result[0])) result[0] += offsetW; @@ -993,7 +1000,7 @@ export class ConnectionOverlay extends Overlay { this.highlightPoint = anchor.point; result = { id: connectable.id, - position: anchor.coord as IVec, + position: anchor.coord, }; } } @@ -1001,7 +1008,7 @@ export class ConnectionOverlay extends Overlay { if (shortestDistance < 8 && result) break; // if not, check if closes to bound - const nearestPoint = connectable.getNearestPoint(point as IVec) as IVec; + const nearestPoint = connectable.getNearestPoint(point); if (Vec.dist(nearestPoint, point) < 8) { this.highlightPoint = nearestPoint; @@ -1013,9 +1020,7 @@ export class ConnectionOverlay extends Overlay { target.push(connectable); result = { id: connectable.id, - position: bound - .toRelative(originPoint) - .map(n => clamp(n, 0, 1)) as IVec, + position: Vec.clampV(bound.toRelative(originPoint), 0, 1), }; } @@ -1048,7 +1053,7 @@ export class ConnectionOverlay extends Overlay { // at last, if not, just return the point if (!result) { result = { - position: point as IVec, + position: point, }; } @@ -1383,7 +1388,7 @@ export class ConnectorPathGenerator extends PathGenerator { const eb = Bound.deserialize(end.xywh); const startPoint = getNearestConnectableAnchor(start, eb.center); const endPoint = getNearestConnectableAnchor(end, sb.center); - return [startPoint, endPoint]; + return (startPoint && endPoint && [startPoint, endPoint]) ?? []; } else { const endPoint = this._getConnectionPoint(connector, 'target'); const startPoint = this._getConnectionPoint(connector, 'source'); diff --git a/packages/affine/blocks/block-surface/src/renderer/canvas-renderer.ts b/packages/affine/blocks/surface/src/renderer/canvas-renderer.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/renderer/canvas-renderer.ts rename to packages/affine/blocks/surface/src/renderer/canvas-renderer.ts diff --git a/packages/affine/blocks/block-surface/src/renderer/elements/index.ts b/packages/affine/blocks/surface/src/renderer/elements/index.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/renderer/elements/index.ts rename to packages/affine/blocks/surface/src/renderer/elements/index.ts diff --git a/packages/affine/blocks/block-surface/src/renderer/elements/type.ts b/packages/affine/blocks/surface/src/renderer/elements/type.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/renderer/elements/type.ts rename to packages/affine/blocks/surface/src/renderer/elements/type.ts diff --git a/packages/affine/blocks/block-surface/src/renderer/overlay.ts b/packages/affine/blocks/surface/src/renderer/overlay.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/renderer/overlay.ts rename to packages/affine/blocks/surface/src/renderer/overlay.ts diff --git a/packages/affine/blocks/block-surface/src/renderer/tool-overlay.ts b/packages/affine/blocks/surface/src/renderer/tool-overlay.ts similarity index 88% rename from packages/affine/blocks/block-surface/src/renderer/tool-overlay.ts rename to packages/affine/blocks/surface/src/renderer/tool-overlay.ts index a753e934d2f5..5aaa256bb137 100644 --- a/packages/affine/blocks/block-surface/src/renderer/tool-overlay.ts +++ b/packages/affine/blocks/surface/src/renderer/tool-overlay.ts @@ -1,6 +1,7 @@ import { DisposableGroup } from '@blocksuite/global/disposable'; import { noop } from '@blocksuite/global/utils'; import type { GfxController } from '@blocksuite/std/gfx'; +import { startWith } from 'rxjs'; import type { RoughCanvas } from '../utils/rough/canvas'; import { Overlay } from './overlay'; @@ -18,10 +19,11 @@ export class ToolOverlay extends Overlay { super(gfx); this.x = 0; this.y = 0; - this.globalAlpha = 0; + this.globalAlpha = 1; this.gfx = gfx; + this.disposables.add( - this.gfx.viewport.viewportUpdated.subscribe(() => { + this.gfx.viewport.viewportUpdated.pipe(startWith(null)).subscribe(() => { // when viewport is updated, we should keep the overlay in the same position // to get last mouse position and convert it to model coordinates const pos = this.gfx.tool.lastMousePos$.value; diff --git a/packages/affine/blocks/block-surface/src/surface-block-void.ts b/packages/affine/blocks/surface/src/surface-block-void.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/surface-block-void.ts rename to packages/affine/blocks/surface/src/surface-block-void.ts diff --git a/packages/affine/blocks/block-surface/src/surface-block.ts b/packages/affine/blocks/surface/src/surface-block.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/surface-block.ts rename to packages/affine/blocks/surface/src/surface-block.ts diff --git a/packages/affine/blocks/block-surface/src/surface-model.ts b/packages/affine/blocks/surface/src/surface-model.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/surface-model.ts rename to packages/affine/blocks/surface/src/surface-model.ts diff --git a/packages/affine/blocks/block-surface/src/surface-spec.ts b/packages/affine/blocks/surface/src/surface-spec.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/surface-spec.ts rename to packages/affine/blocks/surface/src/surface-spec.ts diff --git a/packages/affine/blocks/block-surface/src/surface-transformer.ts b/packages/affine/blocks/surface/src/surface-transformer.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/surface-transformer.ts rename to packages/affine/blocks/surface/src/surface-transformer.ts diff --git a/packages/affine/blocks/block-surface/src/utils/a-star.ts b/packages/affine/blocks/surface/src/utils/a-star.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/a-star.ts rename to packages/affine/blocks/surface/src/utils/a-star.ts diff --git a/packages/affine/blocks/block-surface/src/utils/add-note.ts b/packages/affine/blocks/surface/src/utils/add-note.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/add-note.ts rename to packages/affine/blocks/surface/src/utils/add-note.ts diff --git a/packages/affine/blocks/block-surface/src/utils/font.ts b/packages/affine/blocks/surface/src/utils/font.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/font.ts rename to packages/affine/blocks/surface/src/utils/font.ts diff --git a/packages/affine/blocks/block-surface/src/utils/get-bg-grip-gap.ts b/packages/affine/blocks/surface/src/utils/get-bg-grip-gap.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/get-bg-grip-gap.ts rename to packages/affine/blocks/surface/src/utils/get-bg-grip-gap.ts diff --git a/packages/affine/blocks/block-surface/src/utils/get-last-props-key.ts b/packages/affine/blocks/surface/src/utils/get-last-props-key.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/get-last-props-key.ts rename to packages/affine/blocks/surface/src/utils/get-last-props-key.ts diff --git a/packages/affine/blocks/block-surface/src/utils/get-surface-block.ts b/packages/affine/blocks/surface/src/utils/get-surface-block.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/get-surface-block.ts rename to packages/affine/blocks/surface/src/utils/get-surface-block.ts diff --git a/packages/affine/blocks/block-surface/src/utils/graph.ts b/packages/affine/blocks/surface/src/utils/graph.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/graph.ts rename to packages/affine/blocks/surface/src/utils/graph.ts diff --git a/packages/affine/blocks/block-surface/src/utils/index.ts b/packages/affine/blocks/surface/src/utils/index.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/index.ts rename to packages/affine/blocks/surface/src/utils/index.ts diff --git a/packages/affine/blocks/block-surface/src/utils/path-data-parser/LICENSE b/packages/affine/blocks/surface/src/utils/path-data-parser/LICENSE similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/path-data-parser/LICENSE rename to packages/affine/blocks/surface/src/utils/path-data-parser/LICENSE diff --git a/packages/affine/blocks/block-surface/src/utils/path-data-parser/absolutize.ts b/packages/affine/blocks/surface/src/utils/path-data-parser/absolutize.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/path-data-parser/absolutize.ts rename to packages/affine/blocks/surface/src/utils/path-data-parser/absolutize.ts diff --git a/packages/affine/blocks/block-surface/src/utils/path-data-parser/normalize.ts b/packages/affine/blocks/surface/src/utils/path-data-parser/normalize.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/path-data-parser/normalize.ts rename to packages/affine/blocks/surface/src/utils/path-data-parser/normalize.ts diff --git a/packages/affine/blocks/block-surface/src/utils/path-data-parser/parser.ts b/packages/affine/blocks/surface/src/utils/path-data-parser/parser.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/path-data-parser/parser.ts rename to packages/affine/blocks/surface/src/utils/path-data-parser/parser.ts diff --git a/packages/affine/blocks/block-surface/src/utils/points-on-curve/LICENSE b/packages/affine/blocks/surface/src/utils/points-on-curve/LICENSE similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/points-on-curve/LICENSE rename to packages/affine/blocks/surface/src/utils/points-on-curve/LICENSE diff --git a/packages/affine/blocks/block-surface/src/utils/points-on-curve/curve-to-bezier.ts b/packages/affine/blocks/surface/src/utils/points-on-curve/curve-to-bezier.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/points-on-curve/curve-to-bezier.ts rename to packages/affine/blocks/surface/src/utils/points-on-curve/curve-to-bezier.ts diff --git a/packages/affine/blocks/block-surface/src/utils/points-on-curve/index.ts b/packages/affine/blocks/surface/src/utils/points-on-curve/index.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/points-on-curve/index.ts rename to packages/affine/blocks/surface/src/utils/points-on-curve/index.ts diff --git a/packages/affine/blocks/block-surface/src/utils/points-on-path/LICENSE b/packages/affine/blocks/surface/src/utils/points-on-path/LICENSE similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/points-on-path/LICENSE rename to packages/affine/blocks/surface/src/utils/points-on-path/LICENSE diff --git a/packages/affine/blocks/block-surface/src/utils/points-on-path/index.ts b/packages/affine/blocks/surface/src/utils/points-on-path/index.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/points-on-path/index.ts rename to packages/affine/blocks/surface/src/utils/points-on-path/index.ts diff --git a/packages/affine/blocks/block-surface/src/utils/priority-queue.ts b/packages/affine/blocks/surface/src/utils/priority-queue.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/priority-queue.ts rename to packages/affine/blocks/surface/src/utils/priority-queue.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/LICENSE b/packages/affine/blocks/surface/src/utils/rough/LICENSE similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/LICENSE rename to packages/affine/blocks/surface/src/utils/rough/LICENSE diff --git a/packages/affine/blocks/block-surface/src/utils/rough/canvas.ts b/packages/affine/blocks/surface/src/utils/rough/canvas.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/canvas.ts rename to packages/affine/blocks/surface/src/utils/rough/canvas.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/core.ts b/packages/affine/blocks/surface/src/utils/rough/core.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/core.ts rename to packages/affine/blocks/surface/src/utils/rough/core.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/fillers/dashed-filler.ts b/packages/affine/blocks/surface/src/utils/rough/fillers/dashed-filler.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/fillers/dashed-filler.ts rename to packages/affine/blocks/surface/src/utils/rough/fillers/dashed-filler.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/fillers/dot-filler.ts b/packages/affine/blocks/surface/src/utils/rough/fillers/dot-filler.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/fillers/dot-filler.ts rename to packages/affine/blocks/surface/src/utils/rough/fillers/dot-filler.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/fillers/filler-interface.ts b/packages/affine/blocks/surface/src/utils/rough/fillers/filler-interface.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/fillers/filler-interface.ts rename to packages/affine/blocks/surface/src/utils/rough/fillers/filler-interface.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/fillers/filler.ts b/packages/affine/blocks/surface/src/utils/rough/fillers/filler.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/fillers/filler.ts rename to packages/affine/blocks/surface/src/utils/rough/fillers/filler.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/fillers/hachure-filler.ts b/packages/affine/blocks/surface/src/utils/rough/fillers/hachure-filler.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/fillers/hachure-filler.ts rename to packages/affine/blocks/surface/src/utils/rough/fillers/hachure-filler.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/fillers/hatch-filler.ts b/packages/affine/blocks/surface/src/utils/rough/fillers/hatch-filler.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/fillers/hatch-filler.ts rename to packages/affine/blocks/surface/src/utils/rough/fillers/hatch-filler.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/fillers/scan-line-hachure.ts b/packages/affine/blocks/surface/src/utils/rough/fillers/scan-line-hachure.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/fillers/scan-line-hachure.ts rename to packages/affine/blocks/surface/src/utils/rough/fillers/scan-line-hachure.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/fillers/zigzag-filler.ts b/packages/affine/blocks/surface/src/utils/rough/fillers/zigzag-filler.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/fillers/zigzag-filler.ts rename to packages/affine/blocks/surface/src/utils/rough/fillers/zigzag-filler.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/fillers/zigzag-line-filler.ts b/packages/affine/blocks/surface/src/utils/rough/fillers/zigzag-line-filler.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/fillers/zigzag-line-filler.ts rename to packages/affine/blocks/surface/src/utils/rough/fillers/zigzag-line-filler.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/generator.ts b/packages/affine/blocks/surface/src/utils/rough/generator.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/generator.ts rename to packages/affine/blocks/surface/src/utils/rough/generator.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/geometry.ts b/packages/affine/blocks/surface/src/utils/rough/geometry.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/geometry.ts rename to packages/affine/blocks/surface/src/utils/rough/geometry.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/math.ts b/packages/affine/blocks/surface/src/utils/rough/math.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/math.ts rename to packages/affine/blocks/surface/src/utils/rough/math.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/renderer.ts b/packages/affine/blocks/surface/src/utils/rough/renderer.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/renderer.ts rename to packages/affine/blocks/surface/src/utils/rough/renderer.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/rough.ts b/packages/affine/blocks/surface/src/utils/rough/rough.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/rough.ts rename to packages/affine/blocks/surface/src/utils/rough/rough.ts diff --git a/packages/affine/blocks/block-surface/src/utils/rough/svg.ts b/packages/affine/blocks/surface/src/utils/rough/svg.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/rough/svg.ts rename to packages/affine/blocks/surface/src/utils/rough/svg.ts diff --git a/packages/affine/blocks/block-surface/src/utils/sort.ts b/packages/affine/blocks/surface/src/utils/sort.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/sort.ts rename to packages/affine/blocks/surface/src/utils/sort.ts diff --git a/packages/affine/blocks/block-surface/src/utils/update-xywh.ts b/packages/affine/blocks/surface/src/utils/update-xywh.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/utils/update-xywh.ts rename to packages/affine/blocks/surface/src/utils/update-xywh.ts diff --git a/packages/affine/blocks/block-surface/src/watchers/connector.ts b/packages/affine/blocks/surface/src/watchers/connector.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/watchers/connector.ts rename to packages/affine/blocks/surface/src/watchers/connector.ts diff --git a/packages/affine/blocks/block-surface/src/watchers/group.ts b/packages/affine/blocks/surface/src/watchers/group.ts similarity index 100% rename from packages/affine/blocks/block-surface/src/watchers/group.ts rename to packages/affine/blocks/surface/src/watchers/group.ts diff --git a/packages/affine/blocks/block-surface/tsconfig.json b/packages/affine/blocks/surface/tsconfig.json similarity index 100% rename from packages/affine/blocks/block-surface/tsconfig.json rename to packages/affine/blocks/surface/tsconfig.json diff --git a/packages/affine/blocks/block-table/package.json b/packages/affine/blocks/table/package.json similarity index 100% rename from packages/affine/blocks/block-table/package.json rename to packages/affine/blocks/table/package.json diff --git a/packages/affine/blocks/block-table/src/adapters/extension.ts b/packages/affine/blocks/table/src/adapters/extension.ts similarity index 100% rename from packages/affine/blocks/block-table/src/adapters/extension.ts rename to packages/affine/blocks/table/src/adapters/extension.ts diff --git a/packages/affine/blocks/block-table/src/adapters/html.ts b/packages/affine/blocks/table/src/adapters/html.ts similarity index 100% rename from packages/affine/blocks/block-table/src/adapters/html.ts rename to packages/affine/blocks/table/src/adapters/html.ts diff --git a/packages/affine/blocks/block-table/src/adapters/index.ts b/packages/affine/blocks/table/src/adapters/index.ts similarity index 100% rename from packages/affine/blocks/block-table/src/adapters/index.ts rename to packages/affine/blocks/table/src/adapters/index.ts diff --git a/packages/affine/blocks/block-table/src/adapters/markdown.ts b/packages/affine/blocks/table/src/adapters/markdown.ts similarity index 100% rename from packages/affine/blocks/block-table/src/adapters/markdown.ts rename to packages/affine/blocks/table/src/adapters/markdown.ts diff --git a/packages/affine/blocks/block-table/src/adapters/notion-html.ts b/packages/affine/blocks/table/src/adapters/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-table/src/adapters/notion-html.ts rename to packages/affine/blocks/table/src/adapters/notion-html.ts diff --git a/packages/affine/blocks/block-table/src/adapters/plain-text.ts b/packages/affine/blocks/table/src/adapters/plain-text.ts similarity index 100% rename from packages/affine/blocks/block-table/src/adapters/plain-text.ts rename to packages/affine/blocks/table/src/adapters/plain-text.ts diff --git a/packages/affine/blocks/block-table/src/adapters/utils.ts b/packages/affine/blocks/table/src/adapters/utils.ts similarity index 100% rename from packages/affine/blocks/block-table/src/adapters/utils.ts rename to packages/affine/blocks/table/src/adapters/utils.ts diff --git a/packages/affine/blocks/block-table/src/add-button.css.ts b/packages/affine/blocks/table/src/add-button.css.ts similarity index 100% rename from packages/affine/blocks/block-table/src/add-button.css.ts rename to packages/affine/blocks/table/src/add-button.css.ts diff --git a/packages/affine/blocks/block-table/src/add-button.ts b/packages/affine/blocks/table/src/add-button.ts similarity index 100% rename from packages/affine/blocks/block-table/src/add-button.ts rename to packages/affine/blocks/table/src/add-button.ts diff --git a/packages/affine/blocks/block-table/src/color.ts b/packages/affine/blocks/table/src/color.ts similarity index 100% rename from packages/affine/blocks/block-table/src/color.ts rename to packages/affine/blocks/table/src/color.ts diff --git a/packages/affine/blocks/block-table/src/commands.ts b/packages/affine/blocks/table/src/commands.ts similarity index 100% rename from packages/affine/blocks/block-table/src/commands.ts rename to packages/affine/blocks/table/src/commands.ts diff --git a/packages/affine/blocks/block-table/src/configs/slash-menu.ts b/packages/affine/blocks/table/src/configs/slash-menu.ts similarity index 100% rename from packages/affine/blocks/block-table/src/configs/slash-menu.ts rename to packages/affine/blocks/table/src/configs/slash-menu.ts diff --git a/packages/affine/blocks/block-table/src/configs/tooltips.ts b/packages/affine/blocks/table/src/configs/tooltips.ts similarity index 100% rename from packages/affine/blocks/block-table/src/configs/tooltips.ts rename to packages/affine/blocks/table/src/configs/tooltips.ts diff --git a/packages/affine/blocks/block-table/src/consts.ts b/packages/affine/blocks/table/src/consts.ts similarity index 100% rename from packages/affine/blocks/block-table/src/consts.ts rename to packages/affine/blocks/table/src/consts.ts diff --git a/packages/affine/blocks/block-table/src/effects.ts b/packages/affine/blocks/table/src/effects.ts similarity index 100% rename from packages/affine/blocks/block-table/src/effects.ts rename to packages/affine/blocks/table/src/effects.ts diff --git a/packages/affine/blocks/block-table/src/index.ts b/packages/affine/blocks/table/src/index.ts similarity index 100% rename from packages/affine/blocks/block-table/src/index.ts rename to packages/affine/blocks/table/src/index.ts diff --git a/packages/affine/blocks/block-table/src/selection-controller.ts b/packages/affine/blocks/table/src/selection-controller.ts similarity index 100% rename from packages/affine/blocks/block-table/src/selection-controller.ts rename to packages/affine/blocks/table/src/selection-controller.ts diff --git a/packages/affine/blocks/block-table/src/selection-layer.ts b/packages/affine/blocks/table/src/selection-layer.ts similarity index 100% rename from packages/affine/blocks/block-table/src/selection-layer.ts rename to packages/affine/blocks/table/src/selection-layer.ts diff --git a/packages/affine/blocks/block-table/src/selection-schema.ts b/packages/affine/blocks/table/src/selection-schema.ts similarity index 100% rename from packages/affine/blocks/block-table/src/selection-schema.ts rename to packages/affine/blocks/table/src/selection-schema.ts diff --git a/packages/affine/blocks/block-table/src/table-block.css.ts b/packages/affine/blocks/table/src/table-block.css.ts similarity index 100% rename from packages/affine/blocks/block-table/src/table-block.css.ts rename to packages/affine/blocks/table/src/table-block.css.ts diff --git a/packages/affine/blocks/block-table/src/table-block.ts b/packages/affine/blocks/table/src/table-block.ts similarity index 100% rename from packages/affine/blocks/block-table/src/table-block.ts rename to packages/affine/blocks/table/src/table-block.ts diff --git a/packages/affine/blocks/block-table/src/table-cell.css.ts b/packages/affine/blocks/table/src/table-cell.css.ts similarity index 100% rename from packages/affine/blocks/block-table/src/table-cell.css.ts rename to packages/affine/blocks/table/src/table-cell.css.ts diff --git a/packages/affine/blocks/block-table/src/table-cell.ts b/packages/affine/blocks/table/src/table-cell.ts similarity index 100% rename from packages/affine/blocks/block-table/src/table-cell.ts rename to packages/affine/blocks/table/src/table-cell.ts diff --git a/packages/affine/blocks/block-table/src/table-data-manager.ts b/packages/affine/blocks/table/src/table-data-manager.ts similarity index 100% rename from packages/affine/blocks/block-table/src/table-data-manager.ts rename to packages/affine/blocks/table/src/table-data-manager.ts diff --git a/packages/affine/blocks/block-table/src/table-spec.ts b/packages/affine/blocks/table/src/table-spec.ts similarity index 100% rename from packages/affine/blocks/block-table/src/table-spec.ts rename to packages/affine/blocks/table/src/table-spec.ts diff --git a/packages/affine/blocks/block-table/src/utils.ts b/packages/affine/blocks/table/src/utils.ts similarity index 100% rename from packages/affine/blocks/block-table/src/utils.ts rename to packages/affine/blocks/table/src/utils.ts diff --git a/packages/affine/blocks/block-table/tsconfig.json b/packages/affine/blocks/table/tsconfig.json similarity index 92% rename from packages/affine/blocks/block-table/tsconfig.json rename to packages/affine/blocks/table/tsconfig.json index b36236205294..96f5018babb6 100644 --- a/packages/affine/blocks/block-table/tsconfig.json +++ b/packages/affine/blocks/table/tsconfig.json @@ -13,7 +13,7 @@ { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-slash-menu" }, + { "path": "../../widgets/slash-menu" }, { "path": "../../data-view" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, diff --git a/packages/affine/components/src/icons/text.ts b/packages/affine/components/src/icons/text.ts index 713b122d55ca..89b3515730f8 100644 --- a/packages/affine/components/src/icons/text.ts +++ b/packages/affine/components/src/icons/text.ts @@ -340,10 +340,6 @@ export const FontFamilyIcon = icons.FontIcon({ height: '20', }); -export const AttachmentIcon = icons.AttachmentIcon({ - width: '20', - height: '20', -}); export const AttachmentIcon16 = icons.AttachmentIcon({ width: '16', height: '16', diff --git a/packages/affine/components/src/toggle-switch/index.ts b/packages/affine/components/src/toggle-switch/index.ts index 2597cf5f32f3..0e60bf5df175 100644 --- a/packages/affine/components/src/toggle-switch/index.ts +++ b/packages/affine/components/src/toggle-switch/index.ts @@ -38,11 +38,11 @@ const styles = css` transition: 0.1s; } - label.subscribe { + label.on { background: var(--affine-primary-color); } - label.subscribe:after { + label.on:after { left: calc(100% - 1px); transform: translateX(-100%); } diff --git a/packages/affine/components/src/toolbar/menu-button.ts b/packages/affine/components/src/toolbar/menu-button.ts index 2f83d5365283..314ea22504e9 100644 --- a/packages/affine/components/src/toolbar/menu-button.ts +++ b/packages/affine/components/src/toolbar/menu-button.ts @@ -46,6 +46,12 @@ export class EditorMenuButton extends WithDisposable(LitElement) { composed: true, }) ); + + if (opened) { + this.dataset.open = 'true'; + } else { + delete this.dataset.open; + } }, mainAxis: 0, offsetHeight: 6 * 4, diff --git a/packages/affine/components/src/tooltip-content-with-shortcut/index.ts b/packages/affine/components/src/tooltip-content-with-shortcut/index.ts index 730fc07afbe7..a46483d8ef4f 100644 --- a/packages/affine/components/src/tooltip-content-with-shortcut/index.ts +++ b/packages/affine/components/src/tooltip-content-with-shortcut/index.ts @@ -1,5 +1,6 @@ import { css, html, LitElement } from 'lit'; import { property } from 'lit/decorators.js'; +import { repeat } from 'lit-html/directives/repeat.js'; export class TooltipContentWithShortcut extends LitElement { static override styles = css` @@ -9,6 +10,10 @@ export class TooltipContentWithShortcut extends LitElement { align-items: center; gap: 10px; } + .tooltip__shortcuts { + display: flex; + gap: 2px; + } .tooltip__shortcut { font-size: 12px; position: relative; @@ -28,19 +33,30 @@ export class TooltipContentWithShortcut extends LitElement { opacity: 0.2; } .tooltip__label { + display: flex; + flex: 1; white-space: pre; } `; + get shortcuts() { + let shortcut = this.shortcut; + if (!shortcut) return []; + return shortcut.split(' '); + } + override render() { - const { tip, shortcut, postfix } = this; + const { tip, shortcuts, postfix } = this; return html`
${tip} - ${shortcut - ? html`${shortcut}` - : ''} +
+ ${repeat( + shortcuts, + shortcut => html`${shortcut}` + )} +
${postfix ? html`${postfix}` : ''}
`; diff --git a/packages/affine/fragments/fragment-doc-title/package.json b/packages/affine/fragments/doc-title/package.json similarity index 100% rename from packages/affine/fragments/fragment-doc-title/package.json rename to packages/affine/fragments/doc-title/package.json diff --git a/packages/affine/fragments/fragment-doc-title/src/doc-title.ts b/packages/affine/fragments/doc-title/src/doc-title.ts similarity index 92% rename from packages/affine/fragments/fragment-doc-title/src/doc-title.ts rename to packages/affine/fragments/doc-title/src/doc-title.ts index 6ed17ec82799..18236ff07a7c 100644 --- a/packages/affine/fragments/fragment-doc-title/src/doc-title.ts +++ b/packages/affine/fragments/doc-title/src/doc-title.ts @@ -69,7 +69,7 @@ export class DocTitle extends WithDisposable(ShadowlessElement) { `; private _getOrCreateFirstPageVisibleNote() { - const note = this._rootModel.children.find( + const note = this._rootModel?.children.find( (child): child is NoteBlockModel => matchModels(child, [NoteBlockModel]) && child.props.displayMode !== NoteDisplayMode.EdgelessOnly @@ -91,7 +91,7 @@ export class DocTitle extends WithDisposable(ShadowlessElement) { const inlineRange = this.inlineEditor?.getInlineRange(); if (inlineRange) { - const rightText = this._rootModel.props.title.split(inlineRange.index); + const rightText = this._rootModel?.props.title.split(inlineRange.index); const newFirstParagraphId = this.doc.addBlock( 'affine:paragraph', { text: rightText }, @@ -131,6 +131,7 @@ export class DocTitle extends WithDisposable(ShadowlessElement) { }; private readonly _updateTitleInMeta = () => { + if (!this._rootModel) return; this.doc.workspace.meta.setDocMeta(this.doc.id, { title: this._rootModel.props.title.toString(), }); @@ -141,7 +142,7 @@ export class DocTitle extends WithDisposable(ShadowlessElement) { } private get _rootModel() { - return this.doc.root as RootBlockModel; + return this.doc.root as RootBlockModel | null; } private get _viewport() { @@ -191,14 +192,14 @@ export class DocTitle extends WithDisposable(ShadowlessElement) { this._updateTitleInMeta(); this.requestUpdate(); }; - this._rootModel.props.title.yText.observe(updateMetaTitle); + this._rootModel?.props.title.yText.observe(updateMetaTitle); this._disposables.add(() => { - this._rootModel.props.title.yText.unobserve(updateMetaTitle); + this._rootModel?.props.title.yText.unobserve(updateMetaTitle); }); } override render() { - const isEmpty = !this._rootModel.props.title.length && !this._isComposing; + const isEmpty = !this._rootModel?.props.title.length && !this._isComposing; return html`
this._viewport} .readonly=${this.doc.readonly} diff --git a/packages/affine/fragments/fragment-doc-title/src/effects.ts b/packages/affine/fragments/doc-title/src/effects.ts similarity index 100% rename from packages/affine/fragments/fragment-doc-title/src/effects.ts rename to packages/affine/fragments/doc-title/src/effects.ts diff --git a/packages/affine/fragments/fragment-doc-title/src/index.ts b/packages/affine/fragments/doc-title/src/index.ts similarity index 100% rename from packages/affine/fragments/fragment-doc-title/src/index.ts rename to packages/affine/fragments/doc-title/src/index.ts diff --git a/packages/affine/fragments/fragment-doc-title/src/utils.ts b/packages/affine/fragments/doc-title/src/utils.ts similarity index 100% rename from packages/affine/fragments/fragment-doc-title/src/utils.ts rename to packages/affine/fragments/doc-title/src/utils.ts diff --git a/packages/affine/fragments/fragment-outline/tsconfig.json b/packages/affine/fragments/doc-title/tsconfig.json similarity index 85% rename from packages/affine/fragments/fragment-outline/tsconfig.json rename to packages/affine/fragments/doc-title/tsconfig.json index 9cad3fde2801..3116812f2da4 100644 --- a/packages/affine/fragments/fragment-outline/tsconfig.json +++ b/packages/affine/fragments/doc-title/tsconfig.json @@ -7,9 +7,9 @@ }, "include": ["./src"], "references": [ - { "path": "../../blocks/block-note" }, + { "path": "../../blocks/frame" }, + { "path": "../../blocks/surface" }, { "path": "../../components" }, - { "path": "../fragment-doc-title" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/packages/affine/fragments/fragment-frame-panel/package.json b/packages/affine/fragments/frame-panel/package.json similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/package.json rename to packages/affine/fragments/frame-panel/package.json diff --git a/packages/affine/fragments/fragment-frame-panel/src/body/frame-panel-body.ts b/packages/affine/fragments/frame-panel/src/body/frame-panel-body.ts similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/src/body/frame-panel-body.ts rename to packages/affine/fragments/frame-panel/src/body/frame-panel-body.ts diff --git a/packages/affine/fragments/fragment-frame-panel/src/card/frame-card-title-editor.ts b/packages/affine/fragments/frame-panel/src/card/frame-card-title-editor.ts similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/src/card/frame-card-title-editor.ts rename to packages/affine/fragments/frame-panel/src/card/frame-card-title-editor.ts diff --git a/packages/affine/fragments/fragment-frame-panel/src/card/frame-card-title.ts b/packages/affine/fragments/frame-panel/src/card/frame-card-title.ts similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/src/card/frame-card-title.ts rename to packages/affine/fragments/frame-panel/src/card/frame-card-title.ts diff --git a/packages/affine/fragments/fragment-frame-panel/src/card/frame-card.ts b/packages/affine/fragments/frame-panel/src/card/frame-card.ts similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/src/card/frame-card.ts rename to packages/affine/fragments/frame-panel/src/card/frame-card.ts diff --git a/packages/affine/fragments/fragment-frame-panel/src/card/frame-preview.ts b/packages/affine/fragments/frame-panel/src/card/frame-preview.ts similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/src/card/frame-preview.ts rename to packages/affine/fragments/frame-panel/src/card/frame-preview.ts diff --git a/packages/affine/fragments/fragment-frame-panel/src/effects.ts b/packages/affine/fragments/frame-panel/src/effects.ts similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/src/effects.ts rename to packages/affine/fragments/frame-panel/src/effects.ts diff --git a/packages/affine/fragments/fragment-frame-panel/src/frame-panel.ts b/packages/affine/fragments/frame-panel/src/frame-panel.ts similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/src/frame-panel.ts rename to packages/affine/fragments/frame-panel/src/frame-panel.ts diff --git a/packages/affine/fragments/fragment-frame-panel/src/header/frame-panel-header.ts b/packages/affine/fragments/frame-panel/src/header/frame-panel-header.ts similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/src/header/frame-panel-header.ts rename to packages/affine/fragments/frame-panel/src/header/frame-panel-header.ts diff --git a/packages/affine/fragments/fragment-frame-panel/src/header/frames-setting-menu.ts b/packages/affine/fragments/frame-panel/src/header/frames-setting-menu.ts similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/src/header/frames-setting-menu.ts rename to packages/affine/fragments/frame-panel/src/header/frames-setting-menu.ts diff --git a/packages/affine/fragments/fragment-frame-panel/src/index.ts b/packages/affine/fragments/frame-panel/src/index.ts similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/src/index.ts rename to packages/affine/fragments/frame-panel/src/index.ts diff --git a/packages/affine/fragments/fragment-frame-panel/src/utils/drag.ts b/packages/affine/fragments/frame-panel/src/utils/drag.ts similarity index 100% rename from packages/affine/fragments/fragment-frame-panel/src/utils/drag.ts rename to packages/affine/fragments/frame-panel/src/utils/drag.ts diff --git a/packages/affine/fragments/fragment-frame-panel/tsconfig.json b/packages/affine/fragments/frame-panel/tsconfig.json similarity index 84% rename from packages/affine/fragments/fragment-frame-panel/tsconfig.json rename to packages/affine/fragments/frame-panel/tsconfig.json index 3e2a49bff61c..3116812f2da4 100644 --- a/packages/affine/fragments/fragment-frame-panel/tsconfig.json +++ b/packages/affine/fragments/frame-panel/tsconfig.json @@ -7,8 +7,8 @@ }, "include": ["./src"], "references": [ - { "path": "../../blocks/block-frame" }, - { "path": "../../blocks/block-surface" }, + { "path": "../../blocks/frame" }, + { "path": "../../blocks/surface" }, { "path": "../../components" }, { "path": "../../model" }, { "path": "../../rich-text" }, diff --git a/packages/affine/fragments/fragment-outline/package.json b/packages/affine/fragments/outline/package.json similarity index 100% rename from packages/affine/fragments/fragment-outline/package.json rename to packages/affine/fragments/outline/package.json diff --git a/packages/affine/fragments/fragment-outline/src/body/outline-notice.css.ts b/packages/affine/fragments/outline/src/body/outline-notice.css.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/body/outline-notice.css.ts rename to packages/affine/fragments/outline/src/body/outline-notice.css.ts diff --git a/packages/affine/fragments/fragment-outline/src/body/outline-notice.ts b/packages/affine/fragments/outline/src/body/outline-notice.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/body/outline-notice.ts rename to packages/affine/fragments/outline/src/body/outline-notice.ts diff --git a/packages/affine/fragments/fragment-outline/src/body/outline-panel-body.css.ts b/packages/affine/fragments/outline/src/body/outline-panel-body.css.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/body/outline-panel-body.css.ts rename to packages/affine/fragments/outline/src/body/outline-panel-body.css.ts diff --git a/packages/affine/fragments/fragment-outline/src/body/outline-panel-body.ts b/packages/affine/fragments/outline/src/body/outline-panel-body.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/body/outline-panel-body.ts rename to packages/affine/fragments/outline/src/body/outline-panel-body.ts diff --git a/packages/affine/fragments/fragment-outline/src/card/outline-card.css.ts b/packages/affine/fragments/outline/src/card/outline-card.css.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/card/outline-card.css.ts rename to packages/affine/fragments/outline/src/card/outline-card.css.ts diff --git a/packages/affine/fragments/fragment-outline/src/card/outline-card.ts b/packages/affine/fragments/outline/src/card/outline-card.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/card/outline-card.ts rename to packages/affine/fragments/outline/src/card/outline-card.ts diff --git a/packages/affine/fragments/fragment-outline/src/card/outline-preview.css.ts b/packages/affine/fragments/outline/src/card/outline-preview.css.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/card/outline-preview.css.ts rename to packages/affine/fragments/outline/src/card/outline-preview.css.ts diff --git a/packages/affine/fragments/fragment-outline/src/card/outline-preview.ts b/packages/affine/fragments/outline/src/card/outline-preview.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/card/outline-preview.ts rename to packages/affine/fragments/outline/src/card/outline-preview.ts diff --git a/packages/affine/fragments/fragment-outline/src/config.ts b/packages/affine/fragments/outline/src/config.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/config.ts rename to packages/affine/fragments/outline/src/config.ts diff --git a/packages/affine/fragments/fragment-outline/src/effects.ts b/packages/affine/fragments/outline/src/effects.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/effects.ts rename to packages/affine/fragments/outline/src/effects.ts diff --git a/packages/affine/fragments/fragment-outline/src/header/outline-panel-header.css.ts b/packages/affine/fragments/outline/src/header/outline-panel-header.css.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/header/outline-panel-header.css.ts rename to packages/affine/fragments/outline/src/header/outline-panel-header.css.ts diff --git a/packages/affine/fragments/fragment-outline/src/header/outline-panel-header.ts b/packages/affine/fragments/outline/src/header/outline-panel-header.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/header/outline-panel-header.ts rename to packages/affine/fragments/outline/src/header/outline-panel-header.ts diff --git a/packages/affine/fragments/fragment-outline/src/header/outline-setting-menu.css.ts b/packages/affine/fragments/outline/src/header/outline-setting-menu.css.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/header/outline-setting-menu.css.ts rename to packages/affine/fragments/outline/src/header/outline-setting-menu.css.ts diff --git a/packages/affine/fragments/fragment-outline/src/header/outline-setting-menu.ts b/packages/affine/fragments/outline/src/header/outline-setting-menu.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/header/outline-setting-menu.ts rename to packages/affine/fragments/outline/src/header/outline-setting-menu.ts diff --git a/packages/affine/fragments/fragment-outline/src/index.ts b/packages/affine/fragments/outline/src/index.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/index.ts rename to packages/affine/fragments/outline/src/index.ts diff --git a/packages/affine/fragments/fragment-outline/src/mobile-outline-panel.ts b/packages/affine/fragments/outline/src/mobile-outline-panel.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/mobile-outline-panel.ts rename to packages/affine/fragments/outline/src/mobile-outline-panel.ts diff --git a/packages/affine/fragments/fragment-outline/src/outline-panel.css.ts b/packages/affine/fragments/outline/src/outline-panel.css.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/outline-panel.css.ts rename to packages/affine/fragments/outline/src/outline-panel.css.ts diff --git a/packages/affine/fragments/fragment-outline/src/outline-panel.ts b/packages/affine/fragments/outline/src/outline-panel.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/outline-panel.ts rename to packages/affine/fragments/outline/src/outline-panel.ts diff --git a/packages/affine/fragments/fragment-outline/src/outline-viewer.ts b/packages/affine/fragments/outline/src/outline-viewer.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/outline-viewer.ts rename to packages/affine/fragments/outline/src/outline-viewer.ts diff --git a/packages/affine/fragments/fragment-outline/src/utils/custom-events.ts b/packages/affine/fragments/outline/src/utils/custom-events.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/utils/custom-events.ts rename to packages/affine/fragments/outline/src/utils/custom-events.ts diff --git a/packages/affine/fragments/fragment-outline/src/utils/drag.ts b/packages/affine/fragments/outline/src/utils/drag.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/utils/drag.ts rename to packages/affine/fragments/outline/src/utils/drag.ts diff --git a/packages/affine/fragments/fragment-outline/src/utils/query.ts b/packages/affine/fragments/outline/src/utils/query.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/utils/query.ts rename to packages/affine/fragments/outline/src/utils/query.ts diff --git a/packages/affine/fragments/fragment-outline/src/utils/scroll.ts b/packages/affine/fragments/outline/src/utils/scroll.ts similarity index 100% rename from packages/affine/fragments/fragment-outline/src/utils/scroll.ts rename to packages/affine/fragments/outline/src/utils/scroll.ts diff --git a/packages/affine/fragments/fragment-doc-title/tsconfig.json b/packages/affine/fragments/outline/tsconfig.json similarity index 84% rename from packages/affine/fragments/fragment-doc-title/tsconfig.json rename to packages/affine/fragments/outline/tsconfig.json index 3e2a49bff61c..e2ecab3748db 100644 --- a/packages/affine/fragments/fragment-doc-title/tsconfig.json +++ b/packages/affine/fragments/outline/tsconfig.json @@ -7,9 +7,9 @@ }, "include": ["./src"], "references": [ - { "path": "../../blocks/block-frame" }, - { "path": "../../blocks/block-surface" }, + { "path": "../../blocks/note" }, { "path": "../../components" }, + { "path": "../doc-title" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/packages/affine/gfx/brush/src/toolbar/components/pen/consts.ts b/packages/affine/gfx/brush/src/toolbar/components/pen/consts.ts new file mode 100644 index 000000000000..2e1df31d8af2 --- /dev/null +++ b/packages/affine/gfx/brush/src/toolbar/components/pen/consts.ts @@ -0,0 +1,29 @@ +import { + EdgelessBrushDarkIcon, + EdgelessBrushLightIcon, + EdgelessHighlighterDarkIcon, + EdgelessHighlighterLightIcon, +} from './icons'; +import type { Pen } from './types'; + +export const penIconMap = { + dark: { + brush: EdgelessBrushDarkIcon, + highlighter: EdgelessHighlighterDarkIcon, + }, + light: { + brush: EdgelessBrushLightIcon, + highlighter: EdgelessHighlighterLightIcon, + }, +}; + +export const penInfoMap: { [k in Pen]: { tip: string; shortcut: string } } = { + brush: { + tip: 'Pen', + shortcut: 'P', + }, + highlighter: { + tip: 'Highlighter', + shortcut: '⇧ P', + }, +}; diff --git a/packages/affine/gfx/brush/src/toolbar/components/pen/pen-menu.ts b/packages/affine/gfx/brush/src/toolbar/components/pen/pen-menu.ts index 5bc6a922b8d5..92c5e7470602 100644 --- a/packages/affine/gfx/brush/src/toolbar/components/pen/pen-menu.ts +++ b/packages/affine/gfx/brush/src/toolbar/components/pen/pen-menu.ts @@ -7,11 +7,16 @@ import { import type { ColorEvent } from '@blocksuite/affine-shared/utils'; import { EdgelessToolbarToolMixin } from '@blocksuite/affine-widget-edgeless-toolbar'; import { SignalWatcher } from '@blocksuite/global/lit'; -import { computed, type Signal } from '@preact/signals-core'; +import { + computed, + type ReadonlySignal, + type Signal, +} from '@preact/signals-core'; import { css, html, LitElement, type TemplateResult } from 'lit'; import { property } from 'lit/decorators.js'; import { styleMap } from 'lit/directives/style-map.js'; +import { penInfoMap } from './consts'; import type { Pen, PenMap } from './types'; export class EdgelessPenMenu extends EdgelessToolbarToolMixin( @@ -26,8 +31,14 @@ export class EdgelessPenMenu extends EdgelessToolbarToolMixin( .pens { display: flex; + height: 100%; padding: 0 4px; - align-items: center; + align-items: flex-end; + + edgeless-tool-icon-button { + display: flex; + align-self: flex-start; + } .pen-wrapper { display: flex; @@ -36,7 +47,7 @@ export class EdgelessPenMenu extends EdgelessToolbarToolMixin( align-items: flex-end; justify-content: center; position: relative; - transform: translateY(10px); + transform: translateY(-2px); transition-property: color, transform; transition-duration: 300ms; transition-timing-function: ease-in-out; @@ -46,7 +57,7 @@ export class EdgelessPenMenu extends EdgelessToolbarToolMixin( .pen-wrapper:hover, .pen-wrapper:active, .pen-wrapper[data-active] { - transform: translateY(-10px); + transform: translateY(-22px); } } @@ -56,6 +67,8 @@ export class EdgelessPenMenu extends EdgelessToolbarToolMixin( } menu-divider { + display: flex; + align-self: center; height: 24px; margin: 0 9px; } @@ -83,42 +96,64 @@ export class EdgelessPenMenu extends EdgelessToolbarToolMixin( override render() { const { _theme$: { value: theme }, - color$: { value: currentColor }, colors$: { value: { brush: brushColor, highlighter: highlighterColor }, }, - pen$: { value: pen }, penIconMap$: { value: { brush: brushIcon, highlighter: highlighterIcon }, }, + penInfo$: { + value: { type, color }, + }, } = this; return html`
-
`} + .tooltipOffset=${20} + .hover=${false} @click=${() => this._onPickPen('brush')} > - ${brushIcon} -
-
+ ${brushIcon} +
+ + + `} + .tooltipOffset=${20} + .hover=${false} @click=${() => this._onPickPen('highlighter')} > - ${highlighterIcon} -
+
+ ${highlighterIcon} +
+
diff --git a/packages/affine/gfx/note/tsconfig.json b/packages/affine/gfx/note/tsconfig.json index a3099fe8a75a..a5aa6e1e81fc 100644 --- a/packages/affine/gfx/note/tsconfig.json +++ b/packages/affine/gfx/note/tsconfig.json @@ -7,15 +7,15 @@ }, "include": ["./src"], "references": [ - { "path": "../../blocks/block-attachment" }, - { "path": "../../blocks/block-bookmark" }, - { "path": "../../blocks/block-image" }, - { "path": "../../blocks/block-surface" }, + { "path": "../../blocks/attachment" }, + { "path": "../../blocks/bookmark" }, + { "path": "../../blocks/image" }, + { "path": "../../blocks/surface" }, { "path": "../../components" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-edgeless-toolbar" }, + { "path": "../../widgets/edgeless-toolbar" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/gfx/shape/src/draggable/shape-draggable.ts b/packages/affine/gfx/shape/src/draggable/shape-draggable.ts index 0a06f44e96e6..da17df0c86a9 100644 --- a/packages/affine/gfx/shape/src/draggable/shape-draggable.ts +++ b/packages/affine/gfx/shape/src/draggable/shape-draggable.ts @@ -236,30 +236,39 @@ export class EdgelessToolbarShapeDraggable extends EdgelessToolbarToolMixin( const locked = this.gfx.viewport.locked; const selection = this.gfx.selection; if (locked || selection.editing) return; + if ( + this.gfx.tool.dragging$.peek() && + this.gfx.tool.currentToolName$.peek() === 'shape' + ) { + return; + } - if (this.readyToDrop) { - const activeIndex = shapes.findIndex( - s => s.name === this.draggingShape - ); - const nextIndex = (activeIndex + 1) % shapes.length; - const next = shapes[nextIndex]; - this.draggingShape = next.name; + const activeIndex = shapes.findIndex( + s => s.name === this.draggingShape + ); + const nextIndex = (activeIndex + 1) % shapes.length; + const next = shapes[nextIndex]; + this.draggingShape = next.name; + if (this.readyToDrop) { this.draggableController.cancelWithoutAnimation(); + const el = this.shapeContainer.querySelector( + `.shape.${this.draggingShape}` + ) as HTMLElement; + if (!el) { + console.error('Edgeless toolbar Shape element not found'); + return; + } + const { x, y } = this.gfx.tool.lastMousePos$.peek(); + const { viewport } = this.edgeless.std.get(ViewportElementProvider); + const { left, top } = viewport; + const clientPos = { x: x + left, y: y + top }; + this.draggableController.dragAndMoveTo(el, clientPos); + } else { + this.setEdgelessTool('shape', { + shapeName: this.draggingShape, + }); } - - const el = this.shapeContainer.querySelector( - `.shape.${this.draggingShape}` - ) as HTMLElement; - if (!el) { - console.error('Edgeless toolbar Shape element not found'); - return; - } - const { x, y } = this.gfx.tool.lastMousePos$.peek(); - const { viewport } = this.edgeless.std.get(ViewportElementProvider); - const { left, top } = viewport; - const clientPos = { x: x + left, y: y + top }; - this.draggableController.dragAndMoveTo(el, clientPos); }, }, { global: true } diff --git a/packages/affine/gfx/shape/src/shape-tool.ts b/packages/affine/gfx/shape/src/shape-tool.ts index b26ef0e115fd..bba7e4db5a8e 100644 --- a/packages/affine/gfx/shape/src/shape-tool.ts +++ b/packages/affine/gfx/shape/src/shape-tool.ts @@ -89,7 +89,6 @@ export class ShapeTool extends BaseTool { private _hideOverlay() { if (!this._shapeOverlay) return; - this._shapeOverlay.globalAlpha = 0; (this.gfx.surfaceComponent as SurfaceBlockComponent)?.refresh(); } diff --git a/packages/affine/gfx/shape/src/view.ts b/packages/affine/gfx/shape/src/view.ts index 7a423322d111..e4ed7e7e843f 100644 --- a/packages/affine/gfx/shape/src/view.ts +++ b/packages/affine/gfx/shape/src/view.ts @@ -13,9 +13,9 @@ export class ShapeElementView extends GfxElementModelView { } private _initDblClickToEdit(): void { - const edgeless = this.std.view.getBlock(this.std.store.root!.id); - this.on('dblclick', () => { + const edgeless = this.std.view.getBlock(this.std.store.root!.id); + if (edgeless && !this.model.isLocked()) { mountShapeTextEditor(this.model, edgeless); } diff --git a/packages/affine/gfx/shape/tsconfig.json b/packages/affine/gfx/shape/tsconfig.json index a0e6d2481683..1cd15403e9c3 100644 --- a/packages/affine/gfx/shape/tsconfig.json +++ b/packages/affine/gfx/shape/tsconfig.json @@ -7,13 +7,13 @@ }, "include": ["./src"], "references": [ - { "path": "../../blocks/block-surface" }, + { "path": "../../blocks/surface" }, { "path": "../../components" }, { "path": "../text" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-edgeless-toolbar" }, + { "path": "../../widgets/edgeless-toolbar" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/gfx/template/tsconfig.json b/packages/affine/gfx/template/tsconfig.json index a0e6d2481683..1cd15403e9c3 100644 --- a/packages/affine/gfx/template/tsconfig.json +++ b/packages/affine/gfx/template/tsconfig.json @@ -7,13 +7,13 @@ }, "include": ["./src"], "references": [ - { "path": "../../blocks/block-surface" }, + { "path": "../../blocks/surface" }, { "path": "../../components" }, { "path": "../text" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-edgeless-toolbar" }, + { "path": "../../widgets/edgeless-toolbar" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/gfx/text/tsconfig.json b/packages/affine/gfx/text/tsconfig.json index df6d3f773466..4af984eb190c 100644 --- a/packages/affine/gfx/text/tsconfig.json +++ b/packages/affine/gfx/text/tsconfig.json @@ -7,12 +7,12 @@ }, "include": ["./src"], "references": [ - { "path": "../../blocks/block-surface" }, + { "path": "../../blocks/surface" }, { "path": "../../components" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, - { "path": "../../widgets/widget-edgeless-toolbar" }, + { "path": "../../widgets/edgeless-toolbar" }, { "path": "../../../framework/global" }, { "path": "../../../framework/std" }, { "path": "../../../framework/store" } diff --git a/packages/affine/gfx/turbo-renderer/src/layout/block-layout-provider.ts b/packages/affine/gfx/turbo-renderer/src/layout/block-layout-provider.ts index 0017293c259b..6c1d5af92cb7 100644 --- a/packages/affine/gfx/turbo-renderer/src/layout/block-layout-provider.ts +++ b/packages/affine/gfx/turbo-renderer/src/layout/block-layout-provider.ts @@ -1,5 +1,7 @@ import { createIdentifier } from '@blocksuite/global/di'; -import type { GfxBlockComponent } from '@blocksuite/std'; +import type { EditorHost } from '@blocksuite/std'; +import type { ViewportRecord } from '@blocksuite/std/gfx'; +import type { BlockModel } from '@blocksuite/store'; import { Extension } from '@blocksuite/store'; import type { BlockLayout, Rect } from '../types'; @@ -8,7 +10,13 @@ export abstract class BlockLayoutHandlerExtension< T extends BlockLayout = BlockLayout, > extends Extension { abstract readonly blockType: string; - abstract queryLayout(component: GfxBlockComponent): T | null; + + abstract queryLayout( + model: BlockModel, + host: EditorHost, + viewportRecord: ViewportRecord + ): T | null; + abstract calculateBound(layout: T): { rect: Rect; subRects: Rect[]; diff --git a/packages/affine/gfx/turbo-renderer/src/painter/painter.worker.ts b/packages/affine/gfx/turbo-renderer/src/painter/painter.worker.ts index 5d1d14f3c294..4a1c58043ba1 100644 --- a/packages/affine/gfx/turbo-renderer/src/painter/painter.worker.ts +++ b/packages/affine/gfx/turbo-renderer/src/painter/painter.worker.ts @@ -7,8 +7,9 @@ import type { ExtensionType } from '@blocksuite/store'; import type { BlockLayoutPainter, + BlockLayoutTreeNode, HostToWorkerMessage, - ViewportLayout, + ViewportLayoutTree, WorkerToHostMessage, } from '../types'; @@ -33,8 +34,8 @@ export class ViewportLayoutPainter { private zoom = 1; public provider: ServiceProvider; - getPainter(type: string): BlockLayoutPainter | undefined { - return this.provider.get(BlockPainterProvider(type)); + getPainter(type: string): BlockLayoutPainter | null { + return this.provider.getOptional(BlockPainterProvider(type)); } constructor(extensions: ExtensionType[]) { @@ -66,24 +67,28 @@ export class ViewportLayoutPainter { this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height); } - paint(layout: ViewportLayout, version: number) { + paint(layout: ViewportLayoutTree, version: number) { const { canvas, ctx } = this; if (!canvas || !ctx) return; - if (layout.rect.w === 0 || layout.rect.h === 0) { - console.warn('empty layout rect'); - return; - } - this.clearBackground(); + this.paintTree(layout, version); + } + paintTree(layout: ViewportLayoutTree, version: number) { + const { canvas, ctx } = this; + const { overallRect } = layout; + if (!canvas || !ctx) return; + + this.clearBackground(); ctx.scale(this.zoom, this.zoom); - layout.blocks.forEach(blockLayout => { - const painter = this.getPainter(blockLayout.type); - if (!painter) return; - painter.paint(ctx, blockLayout, layout.rect.x, layout.rect.y); - }); + const paintNode = (node: BlockLayoutTreeNode) => { + const painter = this.getPainter(node.type); + painter?.paint(ctx, node.layout, overallRect.x, overallRect.y); + node.children.forEach(paintNode); + }; + layout.roots.forEach(root => paintNode(root)); const bitmap = canvas.transferToImageBitmap(); const message: WorkerToHostMessage = { type: 'bitmapPainted', diff --git a/packages/affine/gfx/turbo-renderer/src/renderer-utils.ts b/packages/affine/gfx/turbo-renderer/src/renderer-utils.ts index e26c05436235..7c20bca75f2d 100644 --- a/packages/affine/gfx/turbo-renderer/src/renderer-utils.ts +++ b/packages/affine/gfx/turbo-renderer/src/renderer-utils.ts @@ -1,12 +1,14 @@ import type { EditorHost, GfxBlockComponent } from '@blocksuite/std'; -import { - GfxBlockElementModel, - GfxControllerIdentifier, - type Viewport, -} from '@blocksuite/std/gfx'; +import { type Viewport } from '@blocksuite/std/gfx'; +import type { BlockModel } from '@blocksuite/store'; import { BlockLayoutHandlersIdentifier } from './layout/block-layout-provider'; -import type { BlockLayout, RenderingState, ViewportLayout } from './types'; +import type { + BlockLayout, + BlockLayoutTreeNode, + RenderingState, + ViewportLayoutTree, +} from './types'; export function syncCanvasSize(canvas: HTMLCanvasElement, host: HTMLElement) { const hostRect = host.getBoundingClientRect(); @@ -21,33 +23,10 @@ export function syncCanvasSize(canvas: HTMLCanvasElement, host: HTMLElement) { canvas.style.pointerEvents = 'none'; } -function getBlockLayouts(host: EditorHost): BlockLayout[] { - const gfx = host.std.get(GfxControllerIdentifier); - const models = gfx.gfxElements.filter(e => e instanceof GfxBlockElementModel); - const components = models - .map(model => gfx.view.get(model.id)) - .filter(Boolean) as GfxBlockComponent[]; - - const layouts: BlockLayout[] = []; - components.forEach(component => { - const layoutHandlers = host.std.provider.getAll( - BlockLayoutHandlersIdentifier - ); - const handlersArray = Array.from(layoutHandlers.values()); - for (const handler of handlersArray) { - const layout = handler.queryLayout(component); - if (layout) { - layouts.push(layout); - } - } - }); - return layouts; -} - -export function getViewportLayout( +export function getViewportLayoutTree( host: EditorHost, viewport: Viewport -): ViewportLayout { +): ViewportLayoutTree { const zoom = viewport.zoom; let layoutMinX = Infinity; @@ -55,36 +34,106 @@ export function getViewportLayout( let layoutMaxX = -Infinity; let layoutMaxY = -Infinity; - const blockLayouts = getBlockLayouts(host); + const store = host.std.store; + const rootModel = store.root; + + if (!rootModel) { + return { roots: [], overallRect: { x: 0, y: 0, w: 0, h: 0 } }; + } const providers = host.std.provider.getAll(BlockLayoutHandlersIdentifier); const providersArray = Array.from(providers.values()); - blockLayouts.forEach(blockLayout => { - const provider = providersArray.find(p => p.blockType === blockLayout.type); - if (!provider) return; + // Recursive function to build the tree structure + const buildLayoutTreeNode = ( + model: BlockModel, + ancestorViewportState?: string | null + ): BlockLayoutTreeNode | null => { + const baseLayout: BlockLayout = { + blockId: model.id, + type: model.flavour, + rect: { x: 0, y: 0, w: 0, h: 0 }, + }; + + const handler = providersArray.find(p => p.blockType === model.flavour); + + // Determine the correct viewport state to use + const component = host.std.view.getBlock(model.id) as GfxBlockComponent; + const currentViewportState = component?.dataset.viewportState; + const effectiveViewportState = + currentViewportState ?? ancestorViewportState; + const defaultViewportState = { + left: 0, + top: 0, + viewportX: 0, + viewportY: 0, + zoom: 1, + viewScale: 1, + }; + + const viewportRecord = effectiveViewportState + ? viewport.deserializeRecord(effectiveViewportState) || + defaultViewportState + : defaultViewportState; + + const layoutData = handler?.queryLayout(model, host, viewportRecord); + + if (handler && layoutData) { + const { rect } = handler.calculateBound(layoutData); + baseLayout.rect = rect; + layoutMinX = Math.min(layoutMinX, rect.x); + layoutMinY = Math.min(layoutMinY, rect.y); + layoutMaxX = Math.max(layoutMaxX, rect.x + rect.w); + layoutMaxY = Math.max(layoutMaxY, rect.y + rect.h); + } - const { rect } = provider.calculateBound(blockLayout); + const children: BlockLayoutTreeNode[] = []; + for (const childModel of model.children) { + const childNode = buildLayoutTreeNode(childModel, effectiveViewportState); + if (childNode) { + children.push(childNode); + } + } - layoutMinX = Math.min(layoutMinX, rect.x); - layoutMinY = Math.min(layoutMinY, rect.y); - layoutMaxX = Math.max(layoutMaxX, rect.x + rect.w); - layoutMaxY = Math.max(layoutMaxY, rect.y + rect.h); - }); + // Create node for this block - ALWAYS return a node + // Return the node structure including the layout (either real or fallback) + return { + blockId: model.id, + type: model.flavour, + layout: layoutData ? { ...baseLayout, ...layoutData } : baseLayout, + children, + }; + }; - const layoutModelCoord = [layoutMinX, layoutMinY]; + const roots: BlockLayoutTreeNode[] = []; + const rootNode = buildLayoutTreeNode(rootModel); + if (rootNode) { + roots.push(rootNode); + } + + // If no valid layouts were found, use default values + if (layoutMinX === Infinity) { + layoutMinX = 0; + layoutMinY = 0; + layoutMaxX = 0; + layoutMaxY = 0; + } + + // Calculate overall rectangle const w = (layoutMaxX - layoutMinX) / zoom / viewport.viewScale; const h = (layoutMaxY - layoutMinY) / zoom / viewport.viewScale; - const layout: ViewportLayout = { - blocks: blockLayouts, - rect: { - x: layoutModelCoord[0], - y: layoutModelCoord[1], + + const result = { + roots, + overallRect: { + x: layoutMinX, + y: layoutMinY, w: Math.max(w, 0), h: Math.max(h, 0), }, }; - return layout; + + return result; } export function debugLog(message: string, state: RenderingState) { @@ -98,14 +147,15 @@ export function debugLog(message: string, state: RenderingState) { export function paintPlaceholder( host: EditorHost, canvas: HTMLCanvasElement, - layout: ViewportLayout | null, + layout: ViewportLayoutTree | null, viewport: Viewport ) { const ctx = canvas.getContext('2d'); - if (!ctx) return; - if (!layout) return; + if (!ctx || !layout) return; + const dpr = window.devicePixelRatio; - const layoutViewCoord = viewport.toViewCoord(layout.rect.x, layout.rect.y); + const { overallRect } = layout; + const layoutViewCoord = viewport.toViewCoord(overallRect.x, overallRect.y); const offsetX = layoutViewCoord[0]; const offsetY = layoutViewCoord[1]; @@ -120,30 +170,28 @@ export function paintPlaceholder( ); const handlersArray = Array.from(layoutHandlers.values()); - layout.blocks.forEach((blockLayout, blockIndex) => { - ctx.fillStyle = colors[blockIndex % colors.length]; - const renderedPositions = new Set(); - - const handler = handlersArray.find(h => h.blockType === blockLayout.type); - if (!handler) return; - const { subRects } = handler.calculateBound(blockLayout); - - subRects.forEach(rect => { - const x = ((rect.x - layout.rect.x) * viewport.zoom + offsetX) * dpr; - const y = ((rect.y - layout.rect.y) * viewport.zoom + offsetY) * dpr; - + const paintNode = (node: BlockLayoutTreeNode, depth: number = 0) => { + const { layout: nodeLayout, type } = node; + const handler = handlersArray.find(h => h.blockType === type); + if (handler) { + ctx.fillStyle = colors[depth % colors.length]; + const rect = nodeLayout.rect; + const x = ((rect.x - overallRect.x) * viewport.zoom + offsetX) * dpr; + const y = ((rect.y - overallRect.y) * viewport.zoom + offsetY) * dpr; const width = rect.w * viewport.zoom * dpr; const height = rect.h * viewport.zoom * dpr; - const posKey = `${x},${y}`; - if (renderedPositions.has(posKey)) return; ctx.fillRect(x, y, width, height); if (width > 10 && height > 5) { ctx.strokeStyle = 'rgba(150, 150, 150, 0.3)'; ctx.strokeRect(x, y, width, height); } + } + + if (node.children.length > 0) { + node.children.forEach(childNode => paintNode(childNode, depth + 1)); + } + }; - renderedPositions.add(posKey); - }); - }); + layout.roots.forEach(rootNode => paintNode(rootNode)); } diff --git a/packages/affine/gfx/turbo-renderer/src/turbo-renderer.ts b/packages/affine/gfx/turbo-renderer/src/turbo-renderer.ts index b2f10002958d..ddf652a47ab8 100644 --- a/packages/affine/gfx/turbo-renderer/src/turbo-renderer.ts +++ b/packages/affine/gfx/turbo-renderer/src/turbo-renderer.ts @@ -19,7 +19,7 @@ import { debounceTime } from 'rxjs/operators'; import { debugLog, - getViewportLayout, + getViewportLayoutTree, paintPlaceholder, syncCanvasSize, } from './renderer-utils'; @@ -28,7 +28,7 @@ import type { RendererOptions, RenderingState, TurboRendererConfig, - ViewportLayout, + ViewportLayoutTree, WorkerToHostMessage, } from './types'; @@ -42,6 +42,34 @@ const defaultOptions: RendererOptions = { export const TurboRendererConfigFactory = ConfigExtensionFactory('viewport-turbo-renderer'); +/** + * Manages the Turbo Rendering process for the viewport, coordinating between the main thread and a painter worker. + * Turbo Rendering optimizes performance by rendering block content onto a canvas bitmap, + * falling back to standard DOM rendering during interactions. + * + * To add Turbo Rendering support for a new block type (e.g., 'affine:my-block'): + * + * 1. **In the block's package (e.g., `blocksuite/affine/blocks/my-block`):** + * a. Add `@blocksuite/affine/gfx/turbo-renderer` as a dependency in `package.json` and create a `src/turbo` directory. + * b. Implement the Layout Handler (e.g., `MyBlockLayoutHandlerExtension`) and Painter Worker (e.g., `MyBlockLayoutPainterExtension`). Refer to `ParagraphLayoutHandlerExtension` and `ParagraphLayoutPainterExtension` in `blocksuite/affine/blocks/block-paragraph` for implementation examples. + * c. Export the Layout Handler and Painter Worker extensions from the block package's main `src/index.ts` by adding these two explicit export statements: + * ```typescript + * export * from './turbo/my-block-layout-handler'; + * export * from './turbo/my-block-painter.worker'; + * ``` + * d. Add an export mapping for the painter worker in `package.json` under the `exports` field (e.g., `"./turbo-painter": "./src/turbo/my-block-painter.worker.ts"`). + * e. Add a TypeScript project reference to `blocksuite/affine/gfx/turbo-renderer` in `tsconfig.json`. + * + * 2. **In the application integration point (e.g., `packages/frontend/core/src/blocksuite/extensions` and `blocksuite/integration-test/src/__tests__/utils/renderer-entry.ts`):** + * a. In `turbo-renderer.ts` (or the file setting up `TurboRendererConfigFactory`): + * - Import and add the new Layout Handler extension to the `patchTurboRendererExtension` array (or equivalent DI setup). See how `ParagraphLayoutHandlerExtension` is added as a reference. + * b. In `turbo-painter.worker.ts` (the painter worker entry point): + * - Import and add the new Painter Worker extension to the `ViewportLayoutPainter` constructor's extension array. See how `ParagraphLayoutPainterExtension` is added as a reference. + * + * 3. **Run `yarn affine init`** from the workspace root to update generated configuration files (`workspace.gen.ts`) and the lockfile (`yarn.lock`). + * + * **Note:** Always ensure the directory structure and export patterns match the `paragraph` block (`blocksuite/affine/blocks/block-paragraph`) for consistency. + */ export class ViewportTurboRendererExtension extends GfxExtension { static override key = 'viewportTurboRenderer'; @@ -49,7 +77,7 @@ export class ViewportTurboRendererExtension extends GfxExtension { public readonly canvas: HTMLCanvasElement = document.createElement('canvas'); private readonly worker: Worker; private readonly disposables = new DisposableGroup(); - private layoutCacheData: ViewportLayout | null = null; + private layoutCacheData: ViewportLayoutTree | null = null; private layoutVersion = 0; private bitmap: ImageBitmap | null = null; private viewportElement: GfxViewportElement | null = null; @@ -172,9 +200,9 @@ export class ViewportTurboRendererExtension extends GfxExtension { get layoutCache() { if (this.layoutCacheData) return this.layoutCacheData; - const layout = getViewportLayout(this.std.host, this.viewport); + const layoutTree = getViewportLayoutTree(this.std.host, this.viewport); this.debugLog('Layout cache updated'); - return (this.layoutCacheData = layout); + return (this.layoutCacheData = layoutTree); } async refresh() { @@ -248,8 +276,8 @@ export class ViewportTurboRendererExtension extends GfxExtension { type: 'paintLayout', data: { layout, - width: layout.rect.w, - height: layout.rect.h, + width: layout.overallRect.w, + height: layout.overallRect.h, dpr, zoom: this.viewport.zoom, version: currentVersion, @@ -316,17 +344,18 @@ export class ViewportTurboRendererExtension extends GfxExtension { if (!ctx) return; this.clearCanvas(); + const layoutViewCoord = this.viewport.toViewCoord( - layout.rect.x, - layout.rect.y + layout.overallRect.x, + layout.overallRect.y ); ctx.drawImage( bitmap, layoutViewCoord[0] * window.devicePixelRatio, layoutViewCoord[1] * window.devicePixelRatio, - layout.rect.w * window.devicePixelRatio * this.viewport.zoom, - layout.rect.h * window.devicePixelRatio * this.viewport.zoom + layout.overallRect.w * window.devicePixelRatio * this.viewport.zoom, + layout.overallRect.h * window.devicePixelRatio * this.viewport.zoom ); this.debugLog('Bitmap drawn to canvas'); diff --git a/packages/affine/gfx/turbo-renderer/src/types.ts b/packages/affine/gfx/turbo-renderer/src/types.ts index 146efc3e549a..efb79be69b42 100644 --- a/packages/affine/gfx/turbo-renderer/src/types.ts +++ b/packages/affine/gfx/turbo-renderer/src/types.ts @@ -14,13 +14,14 @@ export interface ViewportState { } export interface BlockLayout extends Record { + blockId: string; type: string; - rect?: Rect; -} - -export interface ViewportLayout { - blocks: BlockLayout[]; - rect: Rect; + rect: { + x: number; + y: number; + w: number; + h: number; + }; } export interface TextRect { @@ -60,7 +61,7 @@ export type WorkerToHostMessage = MessageBitmapPainted | MessagePaintError; export type MessagePaint = { type: 'paintLayout'; data: { - layout: ViewportLayout; + layout: ViewportLayoutTree; width: number; height: number; dpr: number; @@ -89,3 +90,15 @@ export interface TurboRendererConfig { } export type HostToWorkerMessage = MessagePaint; + +export interface BlockLayoutTreeNode { + blockId: string; + type: string; + layout: BlockLayout; + children: BlockLayoutTreeNode[]; +} + +export interface ViewportLayoutTree { + roots: BlockLayoutTreeNode[]; + overallRect: BlockLayout['rect']; +} diff --git a/packages/affine/inlines/footnote/src/footnote-node/footnote-node.ts b/packages/affine/inlines/footnote/src/footnote-node/footnote-node.ts index 7d0eadf95868..9aa7a3394c3b 100644 --- a/packages/affine/inlines/footnote/src/footnote-node/footnote-node.ts +++ b/packages/affine/inlines/footnote/src/footnote-node/footnote-node.ts @@ -12,8 +12,8 @@ import { import { INLINE_ROOT_ATTR, type InlineRootElement, - ZERO_WIDTH_NON_JOINER, - ZERO_WIDTH_SPACE, + ZERO_WIDTH_FOR_EMBED_NODE, + ZERO_WIDTH_FOR_EMPTY_LINE, } from '@blocksuite/std/inline'; import type { DeltaInsert } from '@blocksuite/store'; import { shift } from '@floating-ui/dom'; @@ -186,7 +186,7 @@ export class AffineFootnoteNode extends WithDisposable(ShadowlessElement) { return html`${node}${node}`; } @@ -195,7 +195,7 @@ export class AffineFootnoteNode extends WithDisposable(ShadowlessElement) { @property({ type: Object }) accessor delta: DeltaInsert = { - insert: ZERO_WIDTH_SPACE, + insert: ZERO_WIDTH_FOR_EMPTY_LINE, attributes: {}, }; diff --git a/packages/affine/inlines/latex/src/latex-node/latex-editor-unit.ts b/packages/affine/inlines/latex/src/latex-node/latex-editor-unit.ts index ac0fce9d0652..803dc84b4149 100644 --- a/packages/affine/inlines/latex/src/latex-node/latex-editor-unit.ts +++ b/packages/affine/inlines/latex/src/latex-node/latex-editor-unit.ts @@ -1,6 +1,6 @@ import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { ShadowlessElement } from '@blocksuite/std'; -import { ZERO_WIDTH_SPACE } from '@blocksuite/std/inline'; +import { ZERO_WIDTH_FOR_EMPTY_LINE } from '@blocksuite/std/inline'; import type { DeltaInsert } from '@blocksuite/store'; import { html } from 'lit'; import { property } from 'lit/decorators.js'; @@ -50,6 +50,6 @@ export class LatexEditorUnit extends ShadowlessElement { @property({ attribute: false }) accessor delta: DeltaInsert = { - insert: ZERO_WIDTH_SPACE, + insert: ZERO_WIDTH_FOR_EMPTY_LINE, }; } diff --git a/packages/affine/inlines/latex/src/latex-node/latex-node.ts b/packages/affine/inlines/latex/src/latex-node/latex-node.ts index c1a59312197d..1767bb3176d0 100644 --- a/packages/affine/inlines/latex/src/latex-node/latex-node.ts +++ b/packages/affine/inlines/latex/src/latex-node/latex-node.ts @@ -9,8 +9,8 @@ import { } from '@blocksuite/std'; import { type InlineEditor, - ZERO_WIDTH_NON_JOINER, - ZERO_WIDTH_SPACE, + ZERO_WIDTH_FOR_EMBED_NODE, + ZERO_WIDTH_FOR_EMPTY_LINE, } from '@blocksuite/std/inline'; import type { DeltaInsert } from '@blocksuite/store'; import { signal } from '@preact/signals-core'; @@ -178,7 +178,7 @@ export class AffineLatexNode extends SignalWatcher( override render() { return html`
-
`; } @@ -244,7 +244,7 @@ export class AffineLatexNode extends SignalWatcher( @property({ attribute: false }) accessor delta: DeltaInsert = { - insert: ZERO_WIDTH_SPACE, + insert: ZERO_WIDTH_FOR_EMPTY_LINE, }; @property({ attribute: false }) diff --git a/packages/affine/inlines/link/src/link-node/affine-link.ts b/packages/affine/inlines/link/src/link-node/affine-link.ts index 0fed7e141224..b78e1dd79711 100644 --- a/packages/affine/inlines/link/src/link-node/affine-link.ts +++ b/packages/affine/inlines/link/src/link-node/affine-link.ts @@ -13,7 +13,7 @@ import { BLOCK_ID_ATTR, ShadowlessElement } from '@blocksuite/std'; import { INLINE_ROOT_ATTR, type InlineRootElement, - ZERO_WIDTH_SPACE, + ZERO_WIDTH_FOR_EMPTY_LINE, } from '@blocksuite/std/inline'; import type { DeltaInsert } from '@blocksuite/store'; import { css, html } from 'lit'; @@ -177,7 +177,7 @@ export class AffineLink extends WithDisposable(ShadowlessElement) { @property({ type: Object }) accessor delta: DeltaInsert = { - insert: ZERO_WIDTH_SPACE, + insert: ZERO_WIDTH_FOR_EMPTY_LINE, }; @property({ attribute: false }) diff --git a/packages/affine/inlines/link/src/link-node/link-popup/link-popup.ts b/packages/affine/inlines/link/src/link-node/link-popup/link-popup.ts index 5bf30119f0e6..194977febb55 100644 --- a/packages/affine/inlines/link/src/link-node/link-popup/link-popup.ts +++ b/packages/affine/inlines/link/src/link-node/link-popup/link-popup.ts @@ -13,7 +13,13 @@ import { TextSelection, } from '@blocksuite/std'; import type { InlineRange } from '@blocksuite/std/inline'; -import { computePosition, inline, offset, shift } from '@floating-ui/dom'; +import { + autoUpdate, + computePosition, + inline, + offset, + shift, +} from '@floating-ui/dom'; import { html } from 'lit'; import { property, query } from 'lit/decorators.js'; import { choose } from 'lit/directives/choose.js'; @@ -184,6 +190,36 @@ export class LinkPopup extends WithDisposable(ShadowlessElement) { this.confirmButton.requestUpdate(); } + private updateMockSelection(rects: DOMRect[]) { + if (!this.mockSelectionContainer) { + return; + } + + this.mockSelectionContainer + .querySelectorAll('div') + .forEach(e => e.remove()); + + const fragment = document.createDocumentFragment(); + + rects.forEach(domRect => { + const mockSelection = document.createElement('div'); + mockSelection.classList.add('mock-selection'); + + // Get the container's bounding rect to account for its position + const containerRect = this.mockSelectionContainer.getBoundingClientRect(); + + // Adjust the position by subtracting the container's offset + mockSelection.style.left = `${domRect.left - containerRect.left}px`; + mockSelection.style.top = `${domRect.top - containerRect.top}px`; + mockSelection.style.width = `${domRect.width}px`; + mockSelection.style.height = `${domRect.height}px`; + + fragment.append(mockSelection); + }); + + this.mockSelectionContainer.append(fragment); + } + override connectedCallback() { super.connectedCallback(); @@ -213,6 +249,40 @@ export class LinkPopup extends WithDisposable(ShadowlessElement) { this.std.host.selection.setGroup('note', []); this.abortController.abort(); }); + + const range = this.inlineEditor.toDomRange(this.targetInlineRange); + if (!range) { + return; + } + + const visualElement = { + getBoundingClientRect: () => range.getBoundingClientRect(), + getClientRects: () => range.getClientRects(), + }; + const popover = this.popoverContainer; + + this.disposables.add( + autoUpdate(visualElement, popover, () => { + computePosition(visualElement, popover, { + middleware: [ + offset(10), + inline(), + shift({ + padding: 6, + }), + ], + }) + .then(({ x, y }) => { + popover.style.left = `${x}px`; + popover.style.top = `${y}px`; + + this.updateMockSelection( + Array.from(visualElement.getClientRects()) + ); + }) + .catch(console.error); + }) + ); } override render() { @@ -230,55 +300,6 @@ export class LinkPopup extends WithDisposable(ShadowlessElement) { `; } - override updated() { - const range = this.inlineEditor.toDomRange(this.targetInlineRange); - if (!range) { - return; - } - - const domRects = range.getClientRects(); - - Object.values(domRects).forEach(domRect => { - if (!this.mockSelectionContainer) { - return; - } - const mockSelection = document.createElement('div'); - mockSelection.classList.add('mock-selection'); - - // Get the container's bounding rect to account for its position - const containerRect = this.mockSelectionContainer.getBoundingClientRect(); - - // Adjust the position by subtracting the container's offset - mockSelection.style.left = `${domRect.left - containerRect.left}px`; - mockSelection.style.top = `${domRect.top - containerRect.top}px`; - mockSelection.style.width = `${domRect.width}px`; - mockSelection.style.height = `${domRect.height}px`; - - this.mockSelectionContainer.append(mockSelection); - }); - - const visualElement = { - getBoundingClientRect: () => range.getBoundingClientRect(), - getClientRects: () => range.getClientRects(), - }; - const popover = this.popoverContainer; - - computePosition(visualElement, popover, { - middleware: [ - offset(10), - inline(), - shift({ - padding: 6, - }), - ], - }) - .then(({ x, y }) => { - popover.style.left = `${x}px`; - popover.style.top = `${y}px`; - }) - .catch(console.error); - } - @property({ attribute: false }) accessor abortController!: AbortController; diff --git a/packages/affine/inlines/link/src/link-node/link-popup/styles.ts b/packages/affine/inlines/link/src/link-node/link-popup/styles.ts index ad7ea885adb8..311da9459924 100644 --- a/packages/affine/inlines/link/src/link-node/link-popup/styles.ts +++ b/packages/affine/inlines/link/src/link-node/link-popup/styles.ts @@ -1,4 +1,4 @@ -import { fontXSStyle, panelBaseStyle } from '@blocksuite/affine-shared/styles'; +import { fontSMStyle, panelBaseStyle } from '@blocksuite/affine-shared/styles'; import { css } from 'lit'; const editLinkStyle = css` @@ -13,18 +13,18 @@ const editLinkStyle = css` align-items: center; width: 320px; gap: 8px 12px; - padding: 12px; + padding: 8px; box-sizing: content-box; } - ${fontXSStyle('.affine-link-edit-popover label')} + ${fontSMStyle('.affine-link-edit-popover label')} .affine-link-edit-popover label { box-sizing: border-box; color: var(--affine-icon-color); font-weight: 400; } - ${fontXSStyle('.affine-link-edit-popover input')} + ${fontSMStyle('.affine-link-edit-popover input')} .affine-link-edit-popover input { color: inherit; padding: 0; @@ -116,8 +116,7 @@ export const linkPopupStyle = css` } } - .overlay-mask, - .mock-selection-container { + .overlay-root { position: fixed; top: 0; left: 0; @@ -133,7 +132,7 @@ export const linkPopupStyle = css` .affine-link-popover.create { display: flex; gap: 12px; - padding: 12px; + padding: 8px; color: var(--affine-text-primary-color); } @@ -150,7 +149,7 @@ export const linkPopupStyle = css` border-color: var(--affine-border-color); color: var(--affine-text-primary-color); } - ${fontXSStyle('.affine-link-popover-input')} + ${fontSMStyle('.affine-link-popover-input')} .affine-link-popover-input::placeholder { color: var(--affine-placeholder-color); } diff --git a/packages/affine/inlines/mention/src/affine-mention.ts b/packages/affine/inlines/mention/src/affine-mention.ts index f91bfc0b5f90..4e647c653d26 100644 --- a/packages/affine/inlines/mention/src/affine-mention.ts +++ b/packages/affine/inlines/mention/src/affine-mention.ts @@ -5,8 +5,8 @@ import { SignalWatcher, WithDisposable } from '@blocksuite/global/lit'; import type { BlockStdScope } from '@blocksuite/std'; import { ShadowlessElement } from '@blocksuite/std'; import { - ZERO_WIDTH_NON_JOINER, - ZERO_WIDTH_SPACE, + ZERO_WIDTH_FOR_EMBED_NODE, + ZERO_WIDTH_FOR_EMPTY_LINE, } from '@blocksuite/std/inline'; import type { DeltaInsert } from '@blocksuite/store'; import { css, html } from 'lit'; @@ -29,6 +29,7 @@ export class AffineMention extends SignalWatcher( line-height: 24px; /* 160% */ padding: 0 4px; border-radius: 4px; + user-select: none; } .affine-mention:hover { background: var(--affine-hover-color); @@ -87,7 +88,7 @@ export class AffineMention extends SignalWatcher( data-selected=${this.selected} data-type="error" class="affine-mention" - >@Unknown Member@Unknown Member`; const userService = this.std.getOptional(UserProvider); @@ -106,7 +107,7 @@ export class AffineMention extends SignalWatcher( data-selected=${this.selected} data-type="removed" class="affine-mention" - >@Inactive Member@Inactive Member`; } else { return html`@${userInfo$.value.name ?? 'Unknown'}`; } @@ -128,7 +129,7 @@ export class AffineMention extends SignalWatcher( >@loading...`; } @@ -137,7 +138,7 @@ export class AffineMention extends SignalWatcher( @property({ type: Object }) accessor delta: DeltaInsert = { - insert: ZERO_WIDTH_SPACE, + insert: ZERO_WIDTH_FOR_EMPTY_LINE, attributes: {}, }; diff --git a/packages/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts b/packages/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts index 923aa5c417f4..6385f1a0c65d 100644 --- a/packages/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts +++ b/packages/affine/inlines/preset/src/adapters/markdown/markdown-inline.ts @@ -79,6 +79,17 @@ export const markdownListToDeltaMatcher = MarkdownASTToDeltaExtension({ toDelta: () => [], }); +export const markdownHtmlToDeltaMatcher = MarkdownASTToDeltaExtension({ + name: 'html', + match: ast => ast.type === 'html', + toDelta: ast => { + if (!('value' in ast)) { + return []; + } + return [{ insert: ast.value }]; + }, +}); + export const MarkdownInlineToDeltaAdapterExtensions = [ markdownTextToDeltaMatcher, markdownInlineCodeToDeltaMatcher, @@ -89,4 +100,5 @@ export const MarkdownInlineToDeltaAdapterExtensions = [ markdownInlineMathToDeltaMatcher, markdownListToDeltaMatcher, markdownFootnoteReferenceToDeltaMatcher, + markdownHtmlToDeltaMatcher, ]; diff --git a/packages/affine/inlines/preset/src/nodes/affine-text.ts b/packages/affine/inlines/preset/src/nodes/affine-text.ts index 8333e130e6db..8bb104d00b08 100644 --- a/packages/affine/inlines/preset/src/nodes/affine-text.ts +++ b/packages/affine/inlines/preset/src/nodes/affine-text.ts @@ -1,7 +1,7 @@ import { affineTextStyles } from '@blocksuite/affine-shared/styles'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { ShadowlessElement } from '@blocksuite/std'; -import { ZERO_WIDTH_SPACE } from '@blocksuite/std/inline'; +import { ZERO_WIDTH_FOR_EMPTY_LINE } from '@blocksuite/std/inline'; import type { DeltaInsert } from '@blocksuite/store'; import { html } from 'lit'; import { property } from 'lit/decorators.js'; @@ -30,6 +30,6 @@ export class AffineText extends ShadowlessElement { @property({ type: Object }) accessor delta: DeltaInsert = { - insert: ZERO_WIDTH_SPACE, + insert: ZERO_WIDTH_FOR_EMPTY_LINE, }; } diff --git a/packages/affine/inlines/reference/src/reference-node/reference-node.ts b/packages/affine/inlines/reference/src/reference-node/reference-node.ts index 923eb36c2c9d..619ddd6d1a7b 100644 --- a/packages/affine/inlines/reference/src/reference-node/reference-node.ts +++ b/packages/affine/inlines/reference/src/reference-node/reference-node.ts @@ -22,8 +22,8 @@ import { BLOCK_ID_ATTR, ShadowlessElement } from '@blocksuite/std'; import { INLINE_ROOT_ATTR, type InlineRootElement, - ZERO_WIDTH_NON_JOINER, - ZERO_WIDTH_SPACE, + ZERO_WIDTH_FOR_EMBED_NODE, + ZERO_WIDTH_FOR_EMPTY_LINE, } from '@blocksuite/std/inline'; import type { DeltaInsert, DocMeta, Store } from '@blocksuite/store'; import { css, html, nothing } from 'lit'; @@ -274,14 +274,14 @@ export class AffineReference extends WithDisposable(ShadowlessElement) { >${title}`; - // we need to add `` in an + // we need to add `` in an // embed element to make sure inline range calculation is correct return html` this.open({ event })} - >${content}${content}`; } @@ -299,7 +299,7 @@ export class AffineReference extends WithDisposable(ShadowlessElement) { @property({ type: Object }) accessor delta: DeltaInsert = { - insert: ZERO_WIDTH_SPACE, + insert: ZERO_WIDTH_FOR_EMPTY_LINE, attributes: {}, }; diff --git a/packages/affine/model/src/elements/brush/brush.ts b/packages/affine/model/src/elements/brush/brush.ts index 8c78e7238d55..604e08cc338d 100644 --- a/packages/affine/model/src/elements/brush/brush.ts +++ b/packages/affine/model/src/elements/brush/brush.ts @@ -130,7 +130,7 @@ export class BrushElementModel extends GfxPrimitiveElementModel { instance['_local'].delete('commands'); }) @derive((lineWidth: number, instance: Instance) => { - const oldBound = instance.elementBound; + const oldBound = Bound.fromXYWH(instance.deserializedXYWH); if ( lineWidth === instance.lineWidth || diff --git a/packages/affine/model/src/elements/mindmap/mindmap.ts b/packages/affine/model/src/elements/mindmap/mindmap.ts index fe3cd36c57af..a8c9f3b736cf 100644 --- a/packages/affine/model/src/elements/mindmap/mindmap.ts +++ b/packages/affine/model/src/elements/mindmap/mindmap.ts @@ -743,7 +743,7 @@ export class MindmapElementModel extends GfxGroupLikeElementModel { this.childElements.forEach(el => { diff --git a/packages/affine/shared/src/adapters/middlewares/paste.ts b/packages/affine/shared/src/adapters/middlewares/paste.ts index 057ce81f5dd1..6c1617672ece 100644 --- a/packages/affine/shared/src/adapters/middlewares/paste.ts +++ b/packages/affine/shared/src/adapters/middlewares/paste.ts @@ -124,6 +124,13 @@ class PasteTr { private readonly _mergeCode = () => { const deltas: DeltaOperation[] = [{ retain: this.pointState.point.index }]; + // if there is text selection, delete the text selected + if (this.pointState.text.length - this.pointState.point.index > 0) { + deltas.push({ + delete: this.pointState.text.length - this.pointState.point.index, + }); + } + // paste the text from the snapshot to code block this.snapshot.content.forEach((blockSnapshot, i) => { if (blockSnapshot.props.text) { const text = this._textFromSnapshot(blockSnapshot); @@ -133,6 +140,11 @@ class PasteTr { deltas.push(...text.delta); } }); + // paste the text after the text selection from the snapshot to code block + const { toDelta } = this._getDeltas(); + if (toDelta.length > 0) { + deltas.push(...toDelta); + } this.pointState.text.applyDelta(deltas); this.snapshot.content = []; }; @@ -490,13 +502,13 @@ class PasteTr { } merge() { - if (this.pointState.model.flavour === 'affine:code') { - this._mergeCode(); + if (this.firstSnapshot === this.lastSnapshot) { + this._mergeSingle(); return; } - if (this.firstSnapshot === this.lastSnapshot) { - this._mergeSingle(); + if (this.pointState.model.flavour === 'affine:code') { + this._mergeCode(); return; } diff --git a/packages/affine/shared/src/adapters/middlewares/surface-ref-to-embed.ts b/packages/affine/shared/src/adapters/middlewares/surface-ref-to-embed.ts index 6a96d07aaebd..2ccff6426b5c 100644 --- a/packages/affine/shared/src/adapters/middlewares/surface-ref-to-embed.ts +++ b/packages/affine/shared/src/adapters/middlewares/surface-ref-to-embed.ts @@ -11,12 +11,16 @@ export const surfaceRefToEmbed = } }); slots.beforeImport.subscribe(payload => { + // only handle surface-ref block snapshot if ( - pageId && - payload.type === 'block' && - payload.snapshot.flavour === 'affine:surface-ref' && - !std.store.hasBlock(payload.snapshot.id) - ) { + payload.type !== 'block' || + payload.snapshot.flavour !== 'affine:surface-ref' + ) + return; + + // turn into embed-linked-doc if the current doc is different from the pageId of the surface-ref block + const isNotSameDoc = pageId !== std.store.doc.id; + if (pageId && isNotSameDoc) { // The blockId of the original surface-ref block const blockId = payload.snapshot.id; payload.snapshot.id = std.workspace.idGenerator(); diff --git a/packages/affine/shared/src/services/auto-clear-selection-service.ts b/packages/affine/shared/src/services/auto-clear-selection-service.ts new file mode 100644 index 000000000000..13630f9e8c98 --- /dev/null +++ b/packages/affine/shared/src/services/auto-clear-selection-service.ts @@ -0,0 +1,12 @@ +import { LifeCycleWatcher } from '@blocksuite/std'; + +// Auto Clear selection when switching doc mode. +export class AutoClearSelectionService extends LifeCycleWatcher { + static override readonly key = 'auto-clear-selection-service'; + + override unmounted() { + if (this.std.store.readonly) return; + + this.std.selection.clear(); + } +} diff --git a/packages/affine/shared/src/services/index.ts b/packages/affine/shared/src/services/index.ts index 994115272377..f15160447ab0 100644 --- a/packages/affine/shared/src/services/index.ts +++ b/packages/affine/shared/src/services/index.ts @@ -1,3 +1,4 @@ +export * from './auto-clear-selection-service'; export * from './block-meta-service'; export * from './doc-display-meta-service'; export * from './doc-mode-service'; diff --git a/packages/affine/shared/src/services/virtual-keyboard-service.ts b/packages/affine/shared/src/services/virtual-keyboard-service.ts index c086cad05dbe..e4dee0e3e3c7 100644 --- a/packages/affine/shared/src/services/virtual-keyboard-service.ts +++ b/packages/affine/shared/src/services/virtual-keyboard-service.ts @@ -15,3 +15,9 @@ export interface VirtualKeyboardProviderWithAction export const VirtualKeyboardProvider = createIdentifier< VirtualKeyboardProvider | VirtualKeyboardProviderWithAction >('VirtualKeyboardProvider'); + +export function isVirtualKeyboardProviderWithAction( + provider: VirtualKeyboardProvider +): provider is VirtualKeyboardProviderWithAction { + return 'show' in provider && 'hide' in provider; +} diff --git a/packages/affine/widgets/widget-drag-handle/package.json b/packages/affine/widgets/drag-handle/package.json similarity index 100% rename from packages/affine/widgets/widget-drag-handle/package.json rename to packages/affine/widgets/drag-handle/package.json diff --git a/packages/affine/widgets/widget-drag-handle/src/components/edgeless-preview/preview.ts b/packages/affine/widgets/drag-handle/src/components/edgeless-preview/preview.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/components/edgeless-preview/preview.ts rename to packages/affine/widgets/drag-handle/src/components/edgeless-preview/preview.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/config.ts b/packages/affine/widgets/drag-handle/src/config.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/config.ts rename to packages/affine/widgets/drag-handle/src/config.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/consts.ts b/packages/affine/widgets/drag-handle/src/consts.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/consts.ts rename to packages/affine/widgets/drag-handle/src/consts.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/drag-handle.ts b/packages/affine/widgets/drag-handle/src/drag-handle.ts similarity index 98% rename from packages/affine/widgets/widget-drag-handle/src/drag-handle.ts rename to packages/affine/widgets/drag-handle/src/drag-handle.ts index 51900509da2d..1eccbb64d7ad 100644 --- a/packages/affine/widgets/widget-drag-handle/src/drag-handle.ts +++ b/packages/affine/widgets/drag-handle/src/drag-handle.ts @@ -99,9 +99,6 @@ export class AffineDragHandleWidget extends WidgetComponent { } this._anchorModelDisposables = new DisposableGroup(); - this._anchorModelDisposables.add( - blockModel.propsUpdated.subscribe(() => this.hide()) - ); this._anchorModelDisposables.add( blockModel.deleted.subscribe(() => this.hide()) diff --git a/packages/affine/widgets/widget-drag-handle/src/effects.ts b/packages/affine/widgets/drag-handle/src/effects.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/effects.ts rename to packages/affine/widgets/drag-handle/src/effects.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/helpers/preview-helper.ts b/packages/affine/widgets/drag-handle/src/helpers/preview-helper.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/helpers/preview-helper.ts rename to packages/affine/widgets/drag-handle/src/helpers/preview-helper.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/helpers/rect-helper.ts b/packages/affine/widgets/drag-handle/src/helpers/rect-helper.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/helpers/rect-helper.ts rename to packages/affine/widgets/drag-handle/src/helpers/rect-helper.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/helpers/selection-helper.ts b/packages/affine/widgets/drag-handle/src/helpers/selection-helper.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/helpers/selection-helper.ts rename to packages/affine/widgets/drag-handle/src/helpers/selection-helper.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/index.ts b/packages/affine/widgets/drag-handle/src/index.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/index.ts rename to packages/affine/widgets/drag-handle/src/index.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/middleware/blocks-filter.ts b/packages/affine/widgets/drag-handle/src/middleware/blocks-filter.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/middleware/blocks-filter.ts rename to packages/affine/widgets/drag-handle/src/middleware/blocks-filter.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/middleware/new-id-cross-doc.ts b/packages/affine/widgets/drag-handle/src/middleware/new-id-cross-doc.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/middleware/new-id-cross-doc.ts rename to packages/affine/widgets/drag-handle/src/middleware/new-id-cross-doc.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/middleware/reorder-list.ts b/packages/affine/widgets/drag-handle/src/middleware/reorder-list.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/middleware/reorder-list.ts rename to packages/affine/widgets/drag-handle/src/middleware/reorder-list.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/styles.ts b/packages/affine/widgets/drag-handle/src/styles.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/styles.ts rename to packages/affine/widgets/drag-handle/src/styles.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/utils.ts b/packages/affine/widgets/drag-handle/src/utils.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/utils.ts rename to packages/affine/widgets/drag-handle/src/utils.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/watchers/drag-event-watcher.ts b/packages/affine/widgets/drag-handle/src/watchers/drag-event-watcher.ts similarity index 91% rename from packages/affine/widgets/widget-drag-handle/src/watchers/drag-event-watcher.ts rename to packages/affine/widgets/drag-handle/src/watchers/drag-event-watcher.ts index 27e9ebf7d77a..c6805bc4cd7e 100644 --- a/packages/affine/widgets/widget-drag-handle/src/watchers/drag-event-watcher.ts +++ b/packages/affine/widgets/drag-handle/src/watchers/drag-event-watcher.ts @@ -195,25 +195,25 @@ export class DragEventWatcher { dragPayload: DragBlockPayload, dropPayload: DropPayload ): DropResult | null => { - const model = dropBlock.model; + const dropModel = dropBlock.model; const snapshot = dragPayload?.bsEntity?.snapshot; if ( !snapshot || snapshot.content.length === 0 || !dragPayload?.from || - matchModels(model, [DatabaseBlockModel]) + matchModels(dropModel, [DatabaseBlockModel]) ) return null; - const isDropOnNoteBlock = matchModels(model, [NoteBlockModel]); + const isDropOnNoteBlock = matchModels(dropModel, [NoteBlockModel]); const schema = this.std.store.schema; const edge = dropPayload.edge; const scale = this.widget.scale.peek(); let result: DropResult | null = null; - if (edge === 'right' && matchModels(dropBlock.model, [ListBlockModel])) { + if (edge === 'right' && matchModels(dropModel, [ListBlockModel])) { const domRect = getRectByBlockComponent(dropBlock); const placement = 'in'; @@ -279,7 +279,7 @@ export class DragEventWatcher { placement, rect: Rect.fromLWTH(domRect.left, domRect.width, y, 3 * scale), modelState: { - model, + model: dropModel, rect: domRect, element: dropBlock, }, @@ -548,157 +548,159 @@ export class DragEventWatcher { if (!parent) return; - if (dragPayload.bsEntity?.fromMode === 'gfx') { - if (!matchModels(parent, [NoteBlockModel])) { - return; + // drop on the same place, do nothing + if ( + (dragPayload.from?.docId === this.widget.doc.id && + result.placement === 'after' && + parent.children[index]?.id === snapshot.content[0].id) || + (result.placement === 'before' && + parent.children[index - 1]?.id === last(snapshot.content)!.id) + ) { + return; + } + + // drop a note on other note + if ( + matchModels(parent, [NoteBlockModel]) && + snapshot.content.every(block => block.flavour === 'affine:note') + ) { + snapshot.content = snapshot.content.filter( + block => + dragPayload.from?.docId !== this.widget.doc.id || + block.id !== parent.id + ); + if (snapshot.content.length) { + this._onDropNoteOnNote(snapshot, parent.id, index); } + return; + } - // if not all blocks can be dropped in note block, merge the snapshot to the current doc - if ( - !snapshot.content.every(block => - schema.safeValidate(block.flavour, 'affine:note') - ) && - // if all blocks are note blocks, merge it to the current parent note - !snapshot.content.every(block => block.flavour === 'affine:note') - ) { - // merge the snapshot to the current doc if the snapshot comes from other doc - if (dragPayload.from?.docId !== this.widget.doc.id) { - this._mergeSnapshotToCurDoc(snapshot) - .then(idRemap => { - let largestElem!: { - size: number; - id: string; - flavour: string; - }; - - idRemap.forEach(val => { - const gfxElement = this.gfx.getElementById(val) as GfxModel; - - if (gfxElement?.elementBound) { - const elemBound = gfxElement.elementBound; - const flavour = isPrimitiveModel(gfxElement) - ? gfxElement.type - : gfxElement.flavour; - - largestElem = - (largestElem?.size ?? 0) < elemBound.w * elemBound.h - ? { size: elemBound.w * elemBound.h, id: val, flavour } - : largestElem; - } - }); + // all blocks can be safely dropped in the target parent + if ( + snapshot.content.every(block => + schema.safeValidate(block.flavour, parent.flavour) + ) + ) { + this._dropToModel(snapshot, parent.id, index).catch(console.error); + return; + } - if (!largestElem) { - store.addBlock( - 'affine:embed-linked-doc', - { - pageId: store.doc.id, - }, - parent.id, - index - ); - } else { - store.addBlock( - 'affine:surface-ref', - { - reference: largestElem.id, - refFlavour: largestElem.flavour, - }, - parent.id, - index - ); - } - }) - .catch(console.error); - } - // otherwise, just to create a surface-ref block - else { - let largestElem!: { - size: number; - id: string; - flavour: string; - }; + if ( + dragPayload.bsEntity?.fromMode === 'gfx' && + matchModels(parent, [NoteBlockModel]) + ) { + // if the snapshot comes from the same doc, just create a surface-ref block + if (dragPayload.from?.docId === this.widget.doc.id) { + let largestElem!: { + size: number; + id: string; + flavour: string; + }; - const walk = (block: BlockSnapshot) => { - if (block.flavour === 'affine:surface') { - Object.values( - block.props.elements as Record< - string, - { id: string; xywh: SerializedXYWH; type: string } - > - ).forEach(elem => { - if (elem.xywh) { - const bound = Bound.deserialize(elem.xywh); - const size = bound.w * bound.h; - if ((largestElem?.size ?? 0) < size) { - largestElem = { size, id: elem.id, flavour: elem.type }; - } - } - }); - block.children.forEach(walk); - } else { - if (block.props.xywh) { - const bound = Bound.deserialize( - block.props.xywh as SerializedXYWH - ); + const walk = (block: BlockSnapshot) => { + if (block.flavour === 'affine:surface') { + Object.values( + block.props.elements as Record< + string, + { id: string; xywh: SerializedXYWH; type: string } + > + ).forEach(elem => { + if (elem.xywh) { + const bound = Bound.deserialize(elem.xywh); const size = bound.w * bound.h; if ((largestElem?.size ?? 0) < size) { - largestElem = { size, id: block.id, flavour: block.flavour }; + largestElem = { size, id: elem.id, flavour: elem.type }; } } - } - }; - - snapshot.content.forEach(walk); - - if (largestElem) { - store.addBlock( - 'affine:surface-ref', - { - reference: largestElem.id, - refFlavour: largestElem.flavour, - }, - parent.id, - index - ); + }); + block.children.forEach(walk); } else { - store.addBlock( - 'affine:embed-linked-doc', - { - pageId: store.doc.id, - }, - parent.id, - index - ); + if (block.props.xywh) { + const bound = Bound.deserialize( + block.props.xywh as SerializedXYWH + ); + const size = bound.w * bound.h; + if ((largestElem?.size ?? 0) < size) { + largestElem = { size, id: block.id, flavour: block.flavour }; + } + } } - } + }; - return; - } - } + snapshot.content.forEach(walk); - // drop a note on other note - if (matchModels(parent, [NoteBlockModel])) { - const [first] = snapshot.content; - if (first.flavour === 'affine:note') { - if (parent.id !== first.id) { - this._onDropNoteOnNote(snapshot, parent.id, index); + if (largestElem) { + store.addBlock( + 'affine:surface-ref', + { + reference: largestElem.id, + refFlavour: largestElem.flavour, + }, + parent.id, + index + ); + } else { + store.addBlock( + 'affine:embed-linked-doc', + { + pageId: store.doc.id, + }, + parent.id, + index + ); } - return; } - } + // otherwise, merge the snapshot into the current doc + // and create a surface-ref block or embed-linked-doc block + else { + this._mergeSnapshotToCurDoc(snapshot) + .then(idRemap => { + let largestElem!: { + size: number; + id: string; + flavour: string; + }; + + idRemap.forEach(val => { + const gfxElement = this.gfx.getElementById(val) as GfxModel; + + if (gfxElement?.elementBound) { + const elemBound = gfxElement.elementBound; + const flavour = isPrimitiveModel(gfxElement) + ? gfxElement.type + : gfxElement.flavour; + + largestElem = + (largestElem?.size ?? 0) < elemBound.w * elemBound.h + ? { size: elemBound.w * elemBound.h, id: val, flavour } + : largestElem; + } + }); - // drop on the same place, do nothing - if ( - (dragPayload.from?.docId === this.widget.doc.id && - result.placement === 'after' && - parent.children[index]?.id === snapshot.content[0].id) || - (result.placement === 'before' && - parent.children[index - 1]?.id === last(snapshot.content)!.id) - ) { - return; + if (!largestElem) { + store.addBlock( + 'affine:embed-linked-doc', + { + pageId: store.doc.id, + }, + parent.id, + index + ); + } else { + store.addBlock( + 'affine:surface-ref', + { + reference: largestElem.id, + refFlavour: largestElem.flavour, + }, + parent.id, + index + ); + } + }) + .catch(console.error); + } } - - this._dropToModel(snapshot, parent.id, index).catch(console.error); }; private readonly _onDrop = ( diff --git a/packages/affine/widgets/widget-drag-handle/src/watchers/edgeless-watcher.ts b/packages/affine/widgets/drag-handle/src/watchers/edgeless-watcher.ts similarity index 89% rename from packages/affine/widgets/widget-drag-handle/src/watchers/edgeless-watcher.ts rename to packages/affine/widgets/drag-handle/src/watchers/edgeless-watcher.ts index 377338b6f325..76dc4a871730 100644 --- a/packages/affine/widgets/widget-drag-handle/src/watchers/edgeless-watcher.ts +++ b/packages/affine/widgets/drag-handle/src/watchers/edgeless-watcher.ts @@ -1,7 +1,4 @@ -import { - EdgelessLegacySlotIdentifier, - type SurfaceBlockComponent, -} from '@blocksuite/affine-block-surface'; +import { EdgelessLegacySlotIdentifier } from '@blocksuite/affine-block-surface'; import { getSelectedRect } from '@blocksuite/affine-shared/utils'; import { type IVec, Rect } from '@blocksuite/global/gfx'; import { @@ -54,20 +51,14 @@ export class EdgelessWatcher { } if (this.widget.isGfxDragHandleVisible) { - this._showDragHandle().catch(console.error); + this._showDragHandle(); this._updateDragHoverRectTopLevelBlock(); } else if (this.widget.activeDragHandle) { this.widget.hide(); } }; - private readonly _showDragHandle = async () => { - const surfaceModel = this.widget.doc.getModelsByFlavour('affine:surface'); - const surface = this.widget.std.view.getBlock( - surfaceModel[0]!.id - ) as SurfaceBlockComponent; - await surface.updateComplete; - + private readonly _showDragHandle = () => { if (!this.widget.anchorBlockId) return; const container = this.widget.dragHandleContainer; @@ -119,7 +110,7 @@ export class EdgelessWatcher { this.widget.anchorBlockId.value = selectedElement.id; - this._showDragHandle().catch(console.error); + this._showDragHandle(); }; get hoveredElemAreaRect() { @@ -212,11 +203,27 @@ export class EdgelessWatcher { }) ); + disposables.add( + std.store.slots.blockUpdated.subscribe(payload => { + if ( + this.widget.isGfxDragHandleVisible && + payload.id === this.widget.anchorBlockId.peek() + ) { + if (payload.type === 'delete') { + this.widget.hide(); + } + if (payload.type === 'update') { + this._showDragHandle(); + } + } + }) + ); + if (surface) { disposables.add( surface.elementUpdated.subscribe(() => { if (this.widget.isGfxDragHandleVisible) { - this._showDragHandle().catch(console.error); + this._showDragHandle(); } }) ); diff --git a/packages/affine/widgets/widget-drag-handle/src/watchers/handle-event-watcher.ts b/packages/affine/widgets/drag-handle/src/watchers/handle-event-watcher.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/watchers/handle-event-watcher.ts rename to packages/affine/widgets/drag-handle/src/watchers/handle-event-watcher.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/watchers/keyboard-event-watcher.ts b/packages/affine/widgets/drag-handle/src/watchers/keyboard-event-watcher.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/watchers/keyboard-event-watcher.ts rename to packages/affine/widgets/drag-handle/src/watchers/keyboard-event-watcher.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/watchers/page-watcher.ts b/packages/affine/widgets/drag-handle/src/watchers/page-watcher.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/watchers/page-watcher.ts rename to packages/affine/widgets/drag-handle/src/watchers/page-watcher.ts diff --git a/packages/affine/widgets/widget-drag-handle/src/watchers/pointer-event-watcher.ts b/packages/affine/widgets/drag-handle/src/watchers/pointer-event-watcher.ts similarity index 100% rename from packages/affine/widgets/widget-drag-handle/src/watchers/pointer-event-watcher.ts rename to packages/affine/widgets/drag-handle/src/watchers/pointer-event-watcher.ts diff --git a/packages/affine/widgets/drag-handle/tsconfig.json b/packages/affine/widgets/drag-handle/tsconfig.json new file mode 100644 index 000000000000..51215efe4eb0 --- /dev/null +++ b/packages/affine/widgets/drag-handle/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" + }, + "include": ["./src"], + "references": [ + { "path": "../../blocks/callout" }, + { "path": "../../blocks/embed" }, + { "path": "../../blocks/list" }, + { "path": "../../blocks/note" }, + { "path": "../../blocks/paragraph" }, + { "path": "../../blocks/surface" }, + { "path": "../../components" }, + { "path": "../../model" }, + { "path": "../../shared" }, + { "path": "../../../framework/global" }, + { "path": "../../../framework/std" }, + { "path": "../../../framework/store" } + ] +} diff --git a/packages/affine/widgets/widget-edgeless-auto-connect/package.json b/packages/affine/widgets/edgeless-auto-connect/package.json similarity index 100% rename from packages/affine/widgets/widget-edgeless-auto-connect/package.json rename to packages/affine/widgets/edgeless-auto-connect/package.json diff --git a/packages/affine/widgets/widget-edgeless-auto-connect/src/effects.ts b/packages/affine/widgets/edgeless-auto-connect/src/effects.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-auto-connect/src/effects.ts rename to packages/affine/widgets/edgeless-auto-connect/src/effects.ts diff --git a/packages/affine/widgets/widget-edgeless-auto-connect/src/index.ts b/packages/affine/widgets/edgeless-auto-connect/src/index.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-auto-connect/src/index.ts rename to packages/affine/widgets/edgeless-auto-connect/src/index.ts diff --git a/packages/affine/widgets/widget-edgeless-auto-connect/tsconfig.json b/packages/affine/widgets/edgeless-auto-connect/tsconfig.json similarity index 81% rename from packages/affine/widgets/widget-edgeless-auto-connect/tsconfig.json rename to packages/affine/widgets/edgeless-auto-connect/tsconfig.json index 517eee6a0ce2..f8632a4156ea 100644 --- a/packages/affine/widgets/widget-edgeless-auto-connect/tsconfig.json +++ b/packages/affine/widgets/edgeless-auto-connect/tsconfig.json @@ -7,8 +7,8 @@ }, "include": ["./src"], "references": [ - { "path": "../../blocks/block-note" }, - { "path": "../../blocks/block-surface" }, + { "path": "../../blocks/note" }, + { "path": "../../blocks/surface" }, { "path": "../../components" }, { "path": "../../model" }, { "path": "../../shared" }, diff --git a/packages/affine/widgets/widget-edgeless-toolbar/package.json b/packages/affine/widgets/edgeless-toolbar/package.json similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/package.json rename to packages/affine/widgets/edgeless-toolbar/package.json diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/button/tool-icon-button.ts b/packages/affine/widgets/edgeless-toolbar/src/button/tool-icon-button.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/button/tool-icon-button.ts rename to packages/affine/widgets/edgeless-toolbar/src/button/tool-icon-button.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/button/toolbar-button.ts b/packages/affine/widgets/edgeless-toolbar/src/button/toolbar-button.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/button/toolbar-button.ts rename to packages/affine/widgets/edgeless-toolbar/src/button/toolbar-button.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/config/consts.ts b/packages/affine/widgets/edgeless-toolbar/src/config/consts.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/config/consts.ts rename to packages/affine/widgets/edgeless-toolbar/src/config/consts.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/config/index.ts b/packages/affine/widgets/edgeless-toolbar/src/config/index.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/config/index.ts rename to packages/affine/widgets/edgeless-toolbar/src/config/index.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/config/types.ts b/packages/affine/widgets/edgeless-toolbar/src/config/types.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/config/types.ts rename to packages/affine/widgets/edgeless-toolbar/src/config/types.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/config/utils.ts b/packages/affine/widgets/edgeless-toolbar/src/config/utils.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/config/utils.ts rename to packages/affine/widgets/edgeless-toolbar/src/config/utils.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/context.ts b/packages/affine/widgets/edgeless-toolbar/src/context.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/context.ts rename to packages/affine/widgets/edgeless-toolbar/src/context.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/create-popper.ts b/packages/affine/widgets/edgeless-toolbar/src/create-popper.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/create-popper.ts rename to packages/affine/widgets/edgeless-toolbar/src/create-popper.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/draggable/draggable-element.controller.ts b/packages/affine/widgets/edgeless-toolbar/src/draggable/draggable-element.controller.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/draggable/draggable-element.controller.ts rename to packages/affine/widgets/edgeless-toolbar/src/draggable/draggable-element.controller.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/draggable/event-resolver.ts b/packages/affine/widgets/edgeless-toolbar/src/draggable/event-resolver.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/draggable/event-resolver.ts rename to packages/affine/widgets/edgeless-toolbar/src/draggable/event-resolver.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/draggable/index.ts b/packages/affine/widgets/edgeless-toolbar/src/draggable/index.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/draggable/index.ts rename to packages/affine/widgets/edgeless-toolbar/src/draggable/index.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/draggable/overlay-factory.ts b/packages/affine/widgets/edgeless-toolbar/src/draggable/overlay-factory.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/draggable/overlay-factory.ts rename to packages/affine/widgets/edgeless-toolbar/src/draggable/overlay-factory.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/draggable/types.ts b/packages/affine/widgets/edgeless-toolbar/src/draggable/types.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/draggable/types.ts rename to packages/affine/widgets/edgeless-toolbar/src/draggable/types.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/edgeless-toolbar.ts b/packages/affine/widgets/edgeless-toolbar/src/edgeless-toolbar.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/edgeless-toolbar.ts rename to packages/affine/widgets/edgeless-toolbar/src/edgeless-toolbar.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/effects.ts b/packages/affine/widgets/edgeless-toolbar/src/effects.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/effects.ts rename to packages/affine/widgets/edgeless-toolbar/src/effects.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/extension/index.ts b/packages/affine/widgets/edgeless-toolbar/src/extension/index.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/extension/index.ts rename to packages/affine/widgets/edgeless-toolbar/src/extension/index.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/index.ts b/packages/affine/widgets/edgeless-toolbar/src/index.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/index.ts rename to packages/affine/widgets/edgeless-toolbar/src/index.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/mixins/index.ts b/packages/affine/widgets/edgeless-toolbar/src/mixins/index.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/mixins/index.ts rename to packages/affine/widgets/edgeless-toolbar/src/mixins/index.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/mixins/quick-tool.mixin.ts b/packages/affine/widgets/edgeless-toolbar/src/mixins/quick-tool.mixin.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/mixins/quick-tool.mixin.ts rename to packages/affine/widgets/edgeless-toolbar/src/mixins/quick-tool.mixin.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/mixins/tool.mixin.ts b/packages/affine/widgets/edgeless-toolbar/src/mixins/tool.mixin.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/mixins/tool.mixin.ts rename to packages/affine/widgets/edgeless-toolbar/src/mixins/tool.mixin.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/mixins/toolbar-button-with-menu.mixin.ts b/packages/affine/widgets/edgeless-toolbar/src/mixins/toolbar-button-with-menu.mixin.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/mixins/toolbar-button-with-menu.mixin.ts rename to packages/affine/widgets/edgeless-toolbar/src/mixins/toolbar-button-with-menu.mixin.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/panel/font-family-panel.ts b/packages/affine/widgets/edgeless-toolbar/src/panel/font-family-panel.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/panel/font-family-panel.ts rename to packages/affine/widgets/edgeless-toolbar/src/panel/font-family-panel.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/src/panel/font-weight-and-style-panel.ts b/packages/affine/widgets/edgeless-toolbar/src/panel/font-weight-and-style-panel.ts similarity index 100% rename from packages/affine/widgets/widget-edgeless-toolbar/src/panel/font-weight-and-style-panel.ts rename to packages/affine/widgets/edgeless-toolbar/src/panel/font-weight-and-style-panel.ts diff --git a/packages/affine/widgets/widget-edgeless-toolbar/tsconfig.json b/packages/affine/widgets/edgeless-toolbar/tsconfig.json similarity index 90% rename from packages/affine/widgets/widget-edgeless-toolbar/tsconfig.json rename to packages/affine/widgets/edgeless-toolbar/tsconfig.json index 38f2853bad03..55ba24cb4bbc 100644 --- a/packages/affine/widgets/widget-edgeless-toolbar/tsconfig.json +++ b/packages/affine/widgets/edgeless-toolbar/tsconfig.json @@ -7,7 +7,7 @@ }, "include": ["./src"], "references": [ - { "path": "../../blocks/block-surface" }, + { "path": "../../blocks/surface" }, { "path": "../../components" }, { "path": "../../model" }, { "path": "../../rich-text" }, diff --git a/packages/affine/widgets/widget-frame-title/package.json b/packages/affine/widgets/frame-title/package.json similarity index 100% rename from packages/affine/widgets/widget-frame-title/package.json rename to packages/affine/widgets/frame-title/package.json diff --git a/packages/affine/widgets/widget-frame-title/src/affine-frame-title-widget.ts b/packages/affine/widgets/frame-title/src/affine-frame-title-widget.ts similarity index 100% rename from packages/affine/widgets/widget-frame-title/src/affine-frame-title-widget.ts rename to packages/affine/widgets/frame-title/src/affine-frame-title-widget.ts diff --git a/packages/affine/widgets/widget-frame-title/src/edgeless-frame-title-editor.ts b/packages/affine/widgets/frame-title/src/edgeless-frame-title-editor.ts similarity index 100% rename from packages/affine/widgets/widget-frame-title/src/edgeless-frame-title-editor.ts rename to packages/affine/widgets/frame-title/src/edgeless-frame-title-editor.ts diff --git a/packages/affine/widgets/widget-frame-title/src/effects.ts b/packages/affine/widgets/frame-title/src/effects.ts similarity index 100% rename from packages/affine/widgets/widget-frame-title/src/effects.ts rename to packages/affine/widgets/frame-title/src/effects.ts diff --git a/packages/affine/widgets/widget-frame-title/src/frame-title.ts b/packages/affine/widgets/frame-title/src/frame-title.ts similarity index 100% rename from packages/affine/widgets/widget-frame-title/src/frame-title.ts rename to packages/affine/widgets/frame-title/src/frame-title.ts diff --git a/packages/affine/widgets/widget-frame-title/src/index.ts b/packages/affine/widgets/frame-title/src/index.ts similarity index 100% rename from packages/affine/widgets/widget-frame-title/src/index.ts rename to packages/affine/widgets/frame-title/src/index.ts diff --git a/packages/affine/widgets/widget-frame-title/src/mount-frame-title-editor.ts b/packages/affine/widgets/frame-title/src/mount-frame-title-editor.ts similarity index 100% rename from packages/affine/widgets/widget-frame-title/src/mount-frame-title-editor.ts rename to packages/affine/widgets/frame-title/src/mount-frame-title-editor.ts diff --git a/packages/affine/widgets/widget-frame-title/src/styles.ts b/packages/affine/widgets/frame-title/src/styles.ts similarity index 100% rename from packages/affine/widgets/widget-frame-title/src/styles.ts rename to packages/affine/widgets/frame-title/src/styles.ts diff --git a/packages/affine/widgets/widget-frame-title/tsconfig.json b/packages/affine/widgets/frame-title/tsconfig.json similarity index 100% rename from packages/affine/widgets/widget-frame-title/tsconfig.json rename to packages/affine/widgets/frame-title/tsconfig.json diff --git a/packages/affine/widgets/linked-doc/package.json b/packages/affine/widgets/linked-doc/package.json new file mode 100644 index 000000000000..c4ecd826cd21 --- /dev/null +++ b/packages/affine/widgets/linked-doc/package.json @@ -0,0 +1,43 @@ +{ + "name": "@blocksuite/affine-widget-linked-doc", + "description": "Affine linked doc widget.", + "type": "module", + "scripts": { + "build": "tsc" + }, + "sideEffects": false, + "keywords": [], + "author": "toeverything", + "license": "MIT", + "dependencies": { + "@blocksuite/affine-block-image": "workspace:*", + "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-inline-reference": "workspace:*", + "@blocksuite/affine-model": "workspace:*", + "@blocksuite/affine-rich-text": "workspace:*", + "@blocksuite/affine-shared": "workspace:*", + "@blocksuite/global": "workspace:*", + "@blocksuite/icons": "^2.2.10", + "@blocksuite/std": "workspace:*", + "@blocksuite/store": "workspace:*", + "@lit/context": "^1.1.2", + "@preact/signals-core": "^1.8.0", + "@toeverything/theme": "^1.1.12", + "@types/lodash-es": "^4.17.12", + "fflate": "^0.8.2", + "lit": "^3.2.0", + "lodash-es": "^4.17.21", + "rxjs": "^7.8.1" + }, + "exports": { + ".": "./src/index.ts", + "./effects": "./src/effects.ts" + }, + "files": [ + "src", + "dist", + "!src/__tests__", + "!dist/__tests__" + ], + "version": "0.21.0" +} diff --git a/packages/affine/blocks/block-root/src/widgets/linked-doc/config.ts b/packages/affine/widgets/linked-doc/src/config.ts similarity index 72% rename from packages/affine/blocks/block-root/src/widgets/linked-doc/config.ts rename to packages/affine/widgets/linked-doc/src/config.ts index 2015cb9586a6..54ebc442202b 100644 --- a/packages/affine/blocks/block-root/src/widgets/linked-doc/config.ts +++ b/packages/affine/widgets/linked-doc/src/config.ts @@ -16,7 +16,12 @@ import { isFuzzyMatch, type Signal, } from '@blocksuite/affine-shared/utils'; -import type { BlockStdScope, EditorHost } from '@blocksuite/std'; +import { IS_MOBILE } from '@blocksuite/global/env'; +import { + type BlockStdScope, + ConfigExtensionFactory, + type EditorHost, +} from '@blocksuite/std'; import type { InlineRange } from '@blocksuite/std/inline'; import type { TemplateResult } from 'lit'; @@ -107,6 +112,7 @@ export type LinkedDocContext = { std: BlockStdScope; inlineEditor: AffineInlineEditor; startRange: InlineRange; + startNativeRange: Range; triggerKey: string; config: LinkedWidgetConfig; close: () => void; @@ -171,73 +177,77 @@ export function createNewDocMenuGroup( docName.slice(0, DISPLAY_NAME_LENGTH) + (docName.length > DISPLAY_NAME_LENGTH ? '..' : ''); - return { - name: 'New Doc', - items: [ - { - key: 'create', - name: `Create "${displayDocName}" doc`, - icon: NewDocIcon, - action: () => { - abort(); - const docName = query; - const newDoc = createDefaultDoc(doc.workspace, { - title: docName, - }); - insertLinkedNode({ - inlineEditor, - docId: newDoc.id, - }); - const telemetryService = - editorHost.std.getOptional(TelemetryProvider); - telemetryService?.track('LinkedDocCreated', { - control: 'new doc', - module: 'inline @', - type: 'doc', - other: 'new doc', - }); - telemetryService?.track('DocCreated', { - control: 'new doc', - module: 'inline @', - type: 'doc', - }); - }, + const items: LinkedMenuItem[] = [ + { + key: 'create', + name: `Create "${displayDocName}" doc`, + icon: NewDocIcon, + action: () => { + abort(); + const docName = query; + const newDoc = createDefaultDoc(doc.workspace, { + title: docName, + }); + insertLinkedNode({ + inlineEditor, + docId: newDoc.id, + }); + const telemetryService = editorHost.std.getOptional(TelemetryProvider); + telemetryService?.track('LinkedDocCreated', { + control: 'new doc', + module: 'inline @', + type: 'doc', + other: 'new doc', + }); + telemetryService?.track('DocCreated', { + control: 'new doc', + module: 'inline @', + type: 'doc', + }); }, - { - key: 'import', - name: 'Import', - icon: ImportIcon, - action: () => { - abort(); - const onSuccess = ( - docIds: string[], - options: { - importedCount: number; - } - ) => { - toast( - editorHost, - `Successfully imported ${options.importedCount} Doc${options.importedCount > 1 ? 's' : ''}.` - ); - for (const docId of docIds) { - insertLinkedNode({ - inlineEditor, - docId, - }); - } - }; - const onFail = (message: string) => { - toast(editorHost, message); - }; - showImportModal({ - collection: doc.workspace, - schema: doc.schema, - onSuccess, - onFail, - }); - }, + }, + ]; + + if (!IS_MOBILE) { + items.push({ + key: 'import', + name: 'Import', + icon: ImportIcon, + action: () => { + abort(); + const onSuccess = ( + docIds: string[], + options: { + importedCount: number; + } + ) => { + toast( + editorHost, + `Successfully imported ${options.importedCount} Doc${options.importedCount > 1 ? 's' : ''}.` + ); + for (const docId of docIds) { + insertLinkedNode({ + inlineEditor, + docId, + }); + } + }; + const onFail = (message: string) => { + toast(editorHost, message); + }; + showImportModal({ + collection: doc.workspace, + schema: doc.schema, + onSuccess, + onFail, + }); }, - ], + }); + } + + return { + name: 'New Doc', + items, }; } @@ -260,3 +270,7 @@ export const LinkedWidgetUtils = { }; export const AFFINE_LINKED_DOC_WIDGET = 'affine-linked-doc-widget'; + +export const LinkedWidgetConfigExtension = ConfigExtensionFactory< + Partial +>('affine:widget-linked-doc'); diff --git a/packages/affine/blocks/block-root/src/widgets/linked-doc/effects.ts b/packages/affine/widgets/linked-doc/src/effects.ts similarity index 86% rename from packages/affine/blocks/block-root/src/widgets/linked-doc/effects.ts rename to packages/affine/widgets/linked-doc/src/effects.ts index 2496ea492618..bb8306736884 100644 --- a/packages/affine/blocks/block-root/src/widgets/linked-doc/effects.ts +++ b/packages/affine/widgets/linked-doc/src/effects.ts @@ -1,5 +1,6 @@ import { AFFINE_LINKED_DOC_WIDGET } from './config.js'; import { ImportDoc } from './import-doc/import-doc.js'; +import { Loader } from './import-doc/loader.js'; import { AffineLinkedDocWidget } from './index.js'; import { LinkedDocPopover } from './linked-doc-popover.js'; import { AffineMobileLinkedDocMenu } from './mobile-linked-doc-menu.js'; @@ -8,9 +9,9 @@ export function effects() { customElements.define('affine-linked-doc-popover', LinkedDocPopover); customElements.define(AFFINE_LINKED_DOC_WIDGET, AffineLinkedDocWidget); customElements.define('import-doc', ImportDoc); - customElements.define( 'affine-mobile-linked-doc-menu', AffineMobileLinkedDocMenu ); + customElements.define('loader-element', Loader); } diff --git a/packages/affine/blocks/block-root/src/widgets/linked-doc/import-doc/import-doc.ts b/packages/affine/widgets/linked-doc/src/import-doc/import-doc.ts similarity index 97% rename from packages/affine/blocks/block-root/src/widgets/linked-doc/import-doc/import-doc.ts rename to packages/affine/widgets/linked-doc/src/import-doc/import-doc.ts index c791fcf22155..bdb54f28f4da 100644 --- a/packages/affine/blocks/block-root/src/widgets/linked-doc/import-doc/import-doc.ts +++ b/packages/affine/widgets/linked-doc/src/import-doc/import-doc.ts @@ -12,9 +12,9 @@ import type { Schema, Workspace } from '@blocksuite/store'; import { html, LitElement, type PropertyValues } from 'lit'; import { query, state } from 'lit/decorators.js'; -import { HtmlTransformer } from '../../../transformers/html.js'; -import { MarkdownTransformer } from '../../../transformers/markdown.js'; -import { NotionHtmlTransformer } from '../../../transformers/notion-html.js'; +import { HtmlTransformer } from '../transformers/html.js'; +import { MarkdownTransformer } from '../transformers/markdown.js'; +import { NotionHtmlTransformer } from '../transformers/notion-html.js'; import { styles } from './styles.js'; export type OnSuccessHandler = ( diff --git a/packages/affine/blocks/block-root/src/widgets/linked-doc/import-doc/index.ts b/packages/affine/widgets/linked-doc/src/import-doc/index.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/linked-doc/import-doc/index.ts rename to packages/affine/widgets/linked-doc/src/import-doc/index.ts diff --git a/packages/affine/blocks/block-root/src/widgets/linked-doc/import-doc/loader.ts b/packages/affine/widgets/linked-doc/src/import-doc/loader.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/linked-doc/import-doc/loader.ts rename to packages/affine/widgets/linked-doc/src/import-doc/loader.ts diff --git a/packages/affine/blocks/block-root/src/widgets/linked-doc/import-doc/styles.ts b/packages/affine/widgets/linked-doc/src/import-doc/styles.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/linked-doc/import-doc/styles.ts rename to packages/affine/widgets/linked-doc/src/import-doc/styles.ts diff --git a/packages/affine/widgets/linked-doc/src/index.ts b/packages/affine/widgets/linked-doc/src/index.ts new file mode 100644 index 000000000000..780febb383e0 --- /dev/null +++ b/packages/affine/widgets/linked-doc/src/index.ts @@ -0,0 +1,4 @@ +export * from './config'; +export * from './import-doc'; +export * from './transformers'; +export * from './widget'; diff --git a/packages/affine/blocks/block-root/src/widgets/linked-doc/linked-doc-popover.ts b/packages/affine/widgets/linked-doc/src/linked-doc-popover.ts similarity index 97% rename from packages/affine/blocks/block-root/src/widgets/linked-doc/linked-doc-popover.ts rename to packages/affine/widgets/linked-doc/src/linked-doc-popover.ts index 5ef338829384..f122244f3ea1 100644 --- a/packages/affine/blocks/block-root/src/widgets/linked-doc/linked-doc-popover.ts +++ b/packages/affine/widgets/linked-doc/src/linked-doc-popover.ts @@ -7,7 +7,6 @@ import { import { unsafeCSSVar } from '@blocksuite/affine-shared/theme'; import { createKeydownObserver, - getCurrentNativeRange, getPopperPosition, getViewportElement, } from '@blocksuite/affine-shared/utils'; @@ -160,11 +159,15 @@ export class LinkedDocPopover extends SignalWatcher( // init this._updateLinkedDocGroup().catch(console.error); - this._disposables.addFromEvent(this, 'mousedown', e => { + this._disposables.addFromEvent(this, 'pointerdown', e => { // Prevent input from losing focus e.preventDefault(); }); - this._disposables.addFromEvent(window, 'mousedown', e => { + this._disposables.addFromEvent(this, 'mousedown', e => { + // Prevent input from losing focus in electron + e.preventDefault(); + }); + this._disposables.addFromEvent(window, 'pointerdown', e => { if (e.target === this) return; // We don't clear the query when clicking outside the popover this.context.close(); @@ -338,11 +341,8 @@ export class LinkedDocPopover extends SignalWatcher( override willUpdate() { if (!this.hasUpdated) { - const curRange = getCurrentNativeRange(); - if (!curRange) return; - const updatePosition = throttle(() => { - this._position = getPopperPosition(this, curRange); + this._position = getPopperPosition(this, this.context.startNativeRange); }, 10); this.disposables.addFromEvent(window, 'resize', updatePosition); diff --git a/packages/affine/blocks/block-root/src/widgets/linked-doc/mobile-linked-doc-menu.ts b/packages/affine/widgets/linked-doc/src/mobile-linked-doc-menu.ts similarity index 78% rename from packages/affine/blocks/block-root/src/widgets/linked-doc/mobile-linked-doc-menu.ts rename to packages/affine/widgets/linked-doc/src/mobile-linked-doc-menu.ts index 2ffd5df74a54..813e0bfc019e 100644 --- a/packages/affine/blocks/block-root/src/widgets/linked-doc/mobile-linked-doc-menu.ts +++ b/packages/affine/widgets/linked-doc/src/mobile-linked-doc-menu.ts @@ -3,10 +3,7 @@ import { getTextContentFromInlineRange, } from '@blocksuite/affine-rich-text'; import { VirtualKeyboardProvider } from '@blocksuite/affine-shared/services'; -import { - createKeydownObserver, - getViewportElement, -} from '@blocksuite/affine-shared/utils'; +import { getViewportElement } from '@blocksuite/affine-shared/utils'; import { SignalWatcher, WithDisposable } from '@blocksuite/global/lit'; import { MoreHorizontalIcon } from '@blocksuite/icons/lit'; import { PropTypes, requiredProperties } from '@blocksuite/std'; @@ -16,7 +13,6 @@ import { property } from 'lit/decorators.js'; import { join } from 'lit/directives/join.js'; import { repeat } from 'lit/directives/repeat.js'; -import { PageRootBlockComponent } from '../../index.js'; import type { LinkedDocContext, LinkedMenuGroup, @@ -29,7 +25,6 @@ export const AFFINE_MOBILE_LINKED_DOC_MENU = 'affine-mobile-linked-doc-menu'; @requiredProperties({ context: PropTypes.object, - rootComponent: PropTypes.instanceOf(PageRootBlockComponent), }) export class AffineMobileLinkedDocMenu extends SignalWatcher( WithDisposable(LitElement) @@ -38,8 +33,6 @@ export class AffineMobileLinkedDocMenu extends SignalWatcher( private readonly _expand = new Set(); - private _firstActionItem: LinkedMenuItem | null = null; - private readonly _linkedDocGroup$ = signal([]); private readonly _renderGroup = (group: LinkedMenuGroup) => { @@ -189,42 +182,14 @@ export class AffineMobileLinkedDocMenu extends SignalWatcher( const keydownObserverAbortController = new AbortController(); this._disposables.add(() => keydownObserverAbortController.abort()); - createKeydownObserver({ - target: eventSource, - signal: keydownObserverAbortController.signal, - onInput: isComposition => { - if (isComposition) { - this._updateLinkedDocGroup().catch(console.error); - } else { - const subscription = inlineEditor.slots.renderComplete.subscribe( - () => { - subscription.unsubscribe(); - this._updateLinkedDocGroup().catch(console.error); - } - ); - } - }, - onDelete: () => { - const subscription = inlineEditor.slots.renderComplete.subscribe( - () => { - subscription.unsubscribe(); - const curRange = inlineEditor.getInlineRange(); - - if (!this.context.startRange || !curRange) return; - - if (curRange.index < this.context.startRange.index) { - this.context.close(); - } - this._updateLinkedDocGroup().catch(console.error); - } - ); - }, - onConfirm: () => { - this._firstActionItem?.action()?.catch(console.error); - }, - onAbort: () => { + // we need use beforeinput because the event.key of keypress event usually is `Unidentified` in Android + this.disposables.addFromEvent(eventSource, 'beforeinput', () => { + const curRange = inlineEditor.getInlineRange(); + if (curRange && curRange.index < this.context.startRange.index) { this.context.close(); - }, + return; + } + this._updateLinkedDocGroup().catch(console.error); }); } } @@ -239,8 +204,6 @@ export class AffineMobileLinkedDocMenu extends SignalWatcher( return nothing; } - this._firstActionItem = resolveSignal(groups[0].items)[0]; - this.style.bottom = `${this.keyboard.height$.value}px`; return html` @@ -250,7 +213,4 @@ export class AffineMobileLinkedDocMenu extends SignalWatcher( @property({ attribute: false }) accessor context!: LinkedDocContext; - - @property({ attribute: false }) - accessor rootComponent!: PageRootBlockComponent; } diff --git a/packages/affine/blocks/block-root/src/widgets/linked-doc/styles.ts b/packages/affine/widgets/linked-doc/src/styles.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/linked-doc/styles.ts rename to packages/affine/widgets/linked-doc/src/styles.ts diff --git a/packages/affine/blocks/block-root/src/transformers/html.ts b/packages/affine/widgets/linked-doc/src/transformers/html.ts similarity index 100% rename from packages/affine/blocks/block-root/src/transformers/html.ts rename to packages/affine/widgets/linked-doc/src/transformers/html.ts diff --git a/packages/affine/blocks/block-root/src/transformers/index.ts b/packages/affine/widgets/linked-doc/src/transformers/index.ts similarity index 100% rename from packages/affine/blocks/block-root/src/transformers/index.ts rename to packages/affine/widgets/linked-doc/src/transformers/index.ts diff --git a/packages/affine/blocks/block-root/src/transformers/markdown.ts b/packages/affine/widgets/linked-doc/src/transformers/markdown.ts similarity index 100% rename from packages/affine/blocks/block-root/src/transformers/markdown.ts rename to packages/affine/widgets/linked-doc/src/transformers/markdown.ts diff --git a/packages/affine/blocks/block-root/src/transformers/notion-html.ts b/packages/affine/widgets/linked-doc/src/transformers/notion-html.ts similarity index 100% rename from packages/affine/blocks/block-root/src/transformers/notion-html.ts rename to packages/affine/widgets/linked-doc/src/transformers/notion-html.ts diff --git a/packages/affine/blocks/block-root/src/transformers/utils.ts b/packages/affine/widgets/linked-doc/src/transformers/utils.ts similarity index 100% rename from packages/affine/blocks/block-root/src/transformers/utils.ts rename to packages/affine/widgets/linked-doc/src/transformers/utils.ts diff --git a/packages/affine/blocks/block-root/src/transformers/zip.ts b/packages/affine/widgets/linked-doc/src/transformers/zip.ts similarity index 98% rename from packages/affine/blocks/block-root/src/transformers/zip.ts rename to packages/affine/widgets/linked-doc/src/transformers/zip.ts index 7e80f2a26521..224fd1c3a261 100644 --- a/packages/affine/blocks/block-root/src/transformers/zip.ts +++ b/packages/affine/widgets/linked-doc/src/transformers/zip.ts @@ -6,7 +6,7 @@ import { sha } from '@blocksuite/global/utils'; import type { DocSnapshot, Schema, Store, Workspace } from '@blocksuite/store'; import { extMimeMap, getAssetName, Transformer } from '@blocksuite/store'; -import { download, Unzip, Zip } from '../transformers/utils.js'; +import { download, Unzip, Zip } from './utils.js'; async function exportDocs( collection: Workspace, diff --git a/packages/affine/blocks/block-root/src/widgets/linked-doc/utils.ts b/packages/affine/widgets/linked-doc/src/utils.ts similarity index 100% rename from packages/affine/blocks/block-root/src/widgets/linked-doc/utils.ts rename to packages/affine/widgets/linked-doc/src/utils.ts diff --git a/packages/affine/blocks/block-root/src/widgets/linked-doc/index.ts b/packages/affine/widgets/linked-doc/src/widget.ts similarity index 86% rename from packages/affine/blocks/block-root/src/widgets/linked-doc/index.ts rename to packages/affine/widgets/linked-doc/src/widget.ts index 8ddb2778adc1..53d0e9d5ecd4 100644 --- a/packages/affine/blocks/block-root/src/widgets/linked-doc/index.ts +++ b/packages/affine/widgets/linked-doc/src/widget.ts @@ -7,7 +7,11 @@ import { FeatureFlagService } from '@blocksuite/affine-shared/services'; import { getViewportElement } from '@blocksuite/affine-shared/utils'; import { IS_MOBILE } from '@blocksuite/global/env'; import type { BlockComponent } from '@blocksuite/std'; -import { BLOCK_ID_ATTR, WidgetComponent } from '@blocksuite/std'; +import { + BLOCK_ID_ATTR, + WidgetComponent, + WidgetViewExtension, +} from '@blocksuite/std'; import { GfxControllerIdentifier } from '@blocksuite/std/gfx'; import { INLINE_ROOT_ATTR, @@ -19,22 +23,18 @@ import { html, nothing } from 'lit'; import { choose } from 'lit/directives/choose.js'; import { repeat } from 'lit/directives/repeat.js'; import { styleMap } from 'lit/directives/style-map.js'; +import { literal, unsafeStatic } from 'lit/static-html.js'; -import type { PageRootBlockComponent } from '../../page/page-root-block.js'; -import { RootBlockConfigExtension } from '../../root-config.js'; import { - type AFFINE_LINKED_DOC_WIDGET, + AFFINE_LINKED_DOC_WIDGET, getMenus, type LinkedDocContext, type LinkedWidgetConfig, + LinkedWidgetConfigExtension, } from './config.js'; import { linkedDocWidgetStyles } from './styles.js'; -export { type LinkedWidgetConfig } from './config.js'; -export class AffineLinkedDocWidget extends WidgetComponent< - RootBlockModel, - PageRootBlockComponent -> { +export class AffineLinkedDocWidget extends WidgetComponent { static override styles = linkedDocWidgetStyles; private _context: LinkedDocContext | null = null; @@ -43,6 +43,19 @@ export class AffineLinkedDocWidget extends WidgetComponent< private readonly _mode$ = signal<'desktop' | 'mobile' | 'none'>('none'); + private _addTriggerKey(inlineEditor: InlineEditor, triggerKey: string) { + const inlineRange = inlineEditor.getInlineRange(); + if (!inlineRange) return; + inlineEditor.insertText( + { index: inlineRange.index, length: 0 }, + triggerKey + ); + inlineEditor.setInlineRange({ + index: inlineRange.index + triggerKey.length, + length: 0, + }); + } + private _updateInputRects() { if (!this._context) return; const { inlineEditor, startRange, triggerKey } = this._context; @@ -217,8 +230,7 @@ export class AffineLinkedDocWidget extends WidgetComponent< scrollContainer: getViewportElement(this.std.host) ?? window, scrollTopOffset: 46, }, - ...this.std.getOptional(RootBlockConfigExtension.identifier) - ?.linkedWidget, + ...this.std.getOptional(LinkedWidgetConfigExtension.identifier), }; } @@ -259,27 +271,30 @@ export class AffineLinkedDocWidget extends WidgetComponent< inlineEditor = props.inlineEditor; } - const inlineRange = inlineEditor.getInlineRange(); - if (!inlineRange) return; - if (addTriggerKey) { - inlineEditor.insertText( - { index: inlineRange.index, length: 0 }, - primaryTriggerKey - ); - inlineEditor.setInlineRange({ - index: inlineRange.index + primaryTriggerKey.length, - length: 0, + this._addTriggerKey(inlineEditor, primaryTriggerKey); + // we need to wait the range sync to get the correct startNativeRange + const subscription = inlineEditor.slots.inlineRangeSync.subscribe(() => { + this.show({ ...props, addTriggerKey: false }); + subscription.unsubscribe(); }); + return; } + const startRange = inlineEditor.getInlineRange(); + if (!startRange) return; + + const startNativeRange = inlineEditor.getNativeRange(); + if (!startNativeRange) return; + const disposable = inlineEditor.slots.renderComplete.subscribe(() => { this._updateInputRects(); }); this._context = { std: this.std, inlineEditor, - startRange: inlineRange, + startRange, + startNativeRange, triggerKey: primaryTriggerKey, config: this.config, close: () => { @@ -316,6 +331,12 @@ export class AffineLinkedDocWidget extends WidgetComponent< } } +export const linkedDocWidget = WidgetViewExtension( + 'affine:page', + AFFINE_LINKED_DOC_WIDGET, + literal`${unsafeStatic(AFFINE_LINKED_DOC_WIDGET)}` +); + declare global { interface HTMLElementTagNameMap { [AFFINE_LINKED_DOC_WIDGET]: AffineLinkedDocWidget; diff --git a/packages/affine/widgets/linked-doc/tsconfig.json b/packages/affine/widgets/linked-doc/tsconfig.json new file mode 100644 index 000000000000..3844e51b0d4a --- /dev/null +++ b/packages/affine/widgets/linked-doc/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" + }, + "include": ["./src"], + "references": [ + { "path": "../../blocks/image" }, + { "path": "../../components" }, + { "path": "../../inlines/reference" }, + { "path": "../../model" }, + { "path": "../../rich-text" }, + { "path": "../../shared" }, + { "path": "../../../framework/global" }, + { "path": "../../../framework/std" }, + { "path": "../../../framework/store" } + ] +} diff --git a/packages/affine/widgets/widget-remote-selection/package.json b/packages/affine/widgets/remote-selection/package.json similarity index 100% rename from packages/affine/widgets/widget-remote-selection/package.json rename to packages/affine/widgets/remote-selection/package.json diff --git a/packages/affine/widgets/widget-remote-selection/src/doc/config.ts b/packages/affine/widgets/remote-selection/src/doc/config.ts similarity index 100% rename from packages/affine/widgets/widget-remote-selection/src/doc/config.ts rename to packages/affine/widgets/remote-selection/src/doc/config.ts diff --git a/packages/affine/widgets/widget-remote-selection/src/doc/doc-remote-selection.ts b/packages/affine/widgets/remote-selection/src/doc/doc-remote-selection.ts similarity index 100% rename from packages/affine/widgets/widget-remote-selection/src/doc/doc-remote-selection.ts rename to packages/affine/widgets/remote-selection/src/doc/doc-remote-selection.ts diff --git a/packages/affine/widgets/widget-remote-selection/src/doc/index.ts b/packages/affine/widgets/remote-selection/src/doc/index.ts similarity index 100% rename from packages/affine/widgets/widget-remote-selection/src/doc/index.ts rename to packages/affine/widgets/remote-selection/src/doc/index.ts diff --git a/packages/affine/widgets/widget-remote-selection/src/doc/utils.ts b/packages/affine/widgets/remote-selection/src/doc/utils.ts similarity index 100% rename from packages/affine/widgets/widget-remote-selection/src/doc/utils.ts rename to packages/affine/widgets/remote-selection/src/doc/utils.ts diff --git a/packages/affine/widgets/widget-remote-selection/src/edgeless/index.ts b/packages/affine/widgets/remote-selection/src/edgeless/index.ts similarity index 100% rename from packages/affine/widgets/widget-remote-selection/src/edgeless/index.ts rename to packages/affine/widgets/remote-selection/src/edgeless/index.ts diff --git a/packages/affine/widgets/widget-remote-selection/src/effects.ts b/packages/affine/widgets/remote-selection/src/effects.ts similarity index 100% rename from packages/affine/widgets/widget-remote-selection/src/effects.ts rename to packages/affine/widgets/remote-selection/src/effects.ts diff --git a/packages/affine/widgets/widget-remote-selection/src/index.ts b/packages/affine/widgets/remote-selection/src/index.ts similarity index 100% rename from packages/affine/widgets/widget-remote-selection/src/index.ts rename to packages/affine/widgets/remote-selection/src/index.ts diff --git a/packages/affine/widgets/widget-remote-selection/src/manager/color-picker.ts b/packages/affine/widgets/remote-selection/src/manager/color-picker.ts similarity index 100% rename from packages/affine/widgets/widget-remote-selection/src/manager/color-picker.ts rename to packages/affine/widgets/remote-selection/src/manager/color-picker.ts diff --git a/packages/affine/widgets/widget-remote-selection/src/manager/remote-color-manager.ts b/packages/affine/widgets/remote-selection/src/manager/remote-color-manager.ts similarity index 100% rename from packages/affine/widgets/widget-remote-selection/src/manager/remote-color-manager.ts rename to packages/affine/widgets/remote-selection/src/manager/remote-color-manager.ts diff --git a/packages/affine/widgets/widget-remote-selection/tsconfig.json b/packages/affine/widgets/remote-selection/tsconfig.json similarity index 89% rename from packages/affine/widgets/widget-remote-selection/tsconfig.json rename to packages/affine/widgets/remote-selection/tsconfig.json index 1a8d83137ced..15b96d287f02 100644 --- a/packages/affine/widgets/widget-remote-selection/tsconfig.json +++ b/packages/affine/widgets/remote-selection/tsconfig.json @@ -7,7 +7,7 @@ }, "include": ["./src"], "references": [ - { "path": "../../blocks/block-surface" }, + { "path": "../../blocks/surface" }, { "path": "../../components" }, { "path": "../../model" }, { "path": "../../shared" }, diff --git a/packages/affine/widgets/widget-scroll-anchoring/package.json b/packages/affine/widgets/scroll-anchoring/package.json similarity index 100% rename from packages/affine/widgets/widget-scroll-anchoring/package.json rename to packages/affine/widgets/scroll-anchoring/package.json diff --git a/packages/affine/widgets/widget-scroll-anchoring/src/effects.ts b/packages/affine/widgets/scroll-anchoring/src/effects.ts similarity index 100% rename from packages/affine/widgets/widget-scroll-anchoring/src/effects.ts rename to packages/affine/widgets/scroll-anchoring/src/effects.ts diff --git a/packages/affine/widgets/widget-scroll-anchoring/src/index.ts b/packages/affine/widgets/scroll-anchoring/src/index.ts similarity index 100% rename from packages/affine/widgets/widget-scroll-anchoring/src/index.ts rename to packages/affine/widgets/scroll-anchoring/src/index.ts diff --git a/packages/affine/widgets/widget-scroll-anchoring/src/scroll-anchoring.ts b/packages/affine/widgets/scroll-anchoring/src/scroll-anchoring.ts similarity index 100% rename from packages/affine/widgets/widget-scroll-anchoring/src/scroll-anchoring.ts rename to packages/affine/widgets/scroll-anchoring/src/scroll-anchoring.ts diff --git a/packages/affine/widgets/widget-scroll-anchoring/tsconfig.json b/packages/affine/widgets/scroll-anchoring/tsconfig.json similarity index 100% rename from packages/affine/widgets/widget-scroll-anchoring/tsconfig.json rename to packages/affine/widgets/scroll-anchoring/tsconfig.json diff --git a/packages/affine/widgets/widget-slash-menu/README.md b/packages/affine/widgets/slash-menu/README.md similarity index 100% rename from packages/affine/widgets/widget-slash-menu/README.md rename to packages/affine/widgets/slash-menu/README.md diff --git a/packages/affine/widgets/widget-slash-menu/package.json b/packages/affine/widgets/slash-menu/package.json similarity index 100% rename from packages/affine/widgets/widget-slash-menu/package.json rename to packages/affine/widgets/slash-menu/package.json diff --git a/packages/affine/widgets/widget-slash-menu/src/config.ts b/packages/affine/widgets/slash-menu/src/config.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/config.ts rename to packages/affine/widgets/slash-menu/src/config.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/consts.ts b/packages/affine/widgets/slash-menu/src/consts.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/consts.ts rename to packages/affine/widgets/slash-menu/src/consts.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/effects.ts b/packages/affine/widgets/slash-menu/src/effects.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/effects.ts rename to packages/affine/widgets/slash-menu/src/effects.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/extensions.ts b/packages/affine/widgets/slash-menu/src/extensions.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/extensions.ts rename to packages/affine/widgets/slash-menu/src/extensions.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/index.ts b/packages/affine/widgets/slash-menu/src/index.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/index.ts rename to packages/affine/widgets/slash-menu/src/index.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/slash-menu-popover.ts b/packages/affine/widgets/slash-menu/src/slash-menu-popover.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/slash-menu-popover.ts rename to packages/affine/widgets/slash-menu/src/slash-menu-popover.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/styles.ts b/packages/affine/widgets/slash-menu/src/styles.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/styles.ts rename to packages/affine/widgets/slash-menu/src/styles.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/tooltips/copy.ts b/packages/affine/widgets/slash-menu/src/tooltips/copy.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/tooltips/copy.ts rename to packages/affine/widgets/slash-menu/src/tooltips/copy.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/tooltips/delete.ts b/packages/affine/widgets/slash-menu/src/tooltips/delete.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/tooltips/delete.ts rename to packages/affine/widgets/slash-menu/src/tooltips/delete.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/tooltips/empty.ts b/packages/affine/widgets/slash-menu/src/tooltips/empty.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/tooltips/empty.ts rename to packages/affine/widgets/slash-menu/src/tooltips/empty.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/tooltips/index.ts b/packages/affine/widgets/slash-menu/src/tooltips/index.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/tooltips/index.ts rename to packages/affine/widgets/slash-menu/src/tooltips/index.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/tooltips/move-down.ts b/packages/affine/widgets/slash-menu/src/tooltips/move-down.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/tooltips/move-down.ts rename to packages/affine/widgets/slash-menu/src/tooltips/move-down.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/tooltips/move-up.ts b/packages/affine/widgets/slash-menu/src/tooltips/move-up.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/tooltips/move-up.ts rename to packages/affine/widgets/slash-menu/src/tooltips/move-up.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/tooltips/now.ts b/packages/affine/widgets/slash-menu/src/tooltips/now.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/tooltips/now.ts rename to packages/affine/widgets/slash-menu/src/tooltips/now.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/tooltips/today.ts b/packages/affine/widgets/slash-menu/src/tooltips/today.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/tooltips/today.ts rename to packages/affine/widgets/slash-menu/src/tooltips/today.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/tooltips/tomorrow.ts b/packages/affine/widgets/slash-menu/src/tooltips/tomorrow.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/tooltips/tomorrow.ts rename to packages/affine/widgets/slash-menu/src/tooltips/tomorrow.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/tooltips/yesterday.ts b/packages/affine/widgets/slash-menu/src/tooltips/yesterday.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/tooltips/yesterday.ts rename to packages/affine/widgets/slash-menu/src/tooltips/yesterday.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/types.ts b/packages/affine/widgets/slash-menu/src/types.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/types.ts rename to packages/affine/widgets/slash-menu/src/types.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/utils.ts b/packages/affine/widgets/slash-menu/src/utils.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/utils.ts rename to packages/affine/widgets/slash-menu/src/utils.ts diff --git a/packages/affine/widgets/widget-slash-menu/src/widget.ts b/packages/affine/widgets/slash-menu/src/widget.ts similarity index 100% rename from packages/affine/widgets/widget-slash-menu/src/widget.ts rename to packages/affine/widgets/slash-menu/src/widget.ts diff --git a/packages/affine/widgets/widget-slash-menu/tsconfig.json b/packages/affine/widgets/slash-menu/tsconfig.json similarity index 100% rename from packages/affine/widgets/widget-slash-menu/tsconfig.json rename to packages/affine/widgets/slash-menu/tsconfig.json diff --git a/packages/affine/widgets/widget-toolbar/package.json b/packages/affine/widgets/toolbar/package.json similarity index 100% rename from packages/affine/widgets/widget-toolbar/package.json rename to packages/affine/widgets/toolbar/package.json diff --git a/packages/affine/widgets/widget-toolbar/src/effects.ts b/packages/affine/widgets/toolbar/src/effects.ts similarity index 100% rename from packages/affine/widgets/widget-toolbar/src/effects.ts rename to packages/affine/widgets/toolbar/src/effects.ts diff --git a/packages/affine/widgets/widget-toolbar/src/index.ts b/packages/affine/widgets/toolbar/src/index.ts similarity index 100% rename from packages/affine/widgets/widget-toolbar/src/index.ts rename to packages/affine/widgets/toolbar/src/index.ts diff --git a/packages/affine/widgets/widget-toolbar/src/toolbar.ts b/packages/affine/widgets/toolbar/src/toolbar.ts similarity index 98% rename from packages/affine/widgets/widget-toolbar/src/toolbar.ts rename to packages/affine/widgets/toolbar/src/toolbar.ts index 145b25044be8..2052b641ad5c 100644 --- a/packages/affine/widgets/widget-toolbar/src/toolbar.ts +++ b/packages/affine/widgets/toolbar/src/toolbar.ts @@ -3,6 +3,7 @@ import { EdgelessLegacySlotIdentifier } from '@blocksuite/affine-block-surface'; import { TableSelection } from '@blocksuite/affine-block-table'; import { darkToolbarStyles, + type EditorMenuButton, EditorToolbar, lightToolbarStyles, } from '@blocksuite/affine-components/toolbar'; @@ -618,7 +619,7 @@ export class AffineToolbarWidget extends WidgetComponent { }) ); - // Update layout when placement changing to `inner` + // Updates layout when placement changing to `inner` disposables.add( effect(() => { toolbar.dataset.placement = placement$.value; @@ -632,6 +633,10 @@ export class AffineToolbarWidget extends WidgetComponent { // Hides toolbar if (Flag.None === value || flags.check(Flag.Hiding, value)) { if (toolbar.dataset.open) delete toolbar.dataset.open; + // Closes dropdown menus + toolbar + .querySelector('editor-menu-button[data-open]') + ?.hide(); return; } diff --git a/packages/affine/widgets/widget-toolbar/src/utils.ts b/packages/affine/widgets/toolbar/src/utils.ts similarity index 98% rename from packages/affine/widgets/widget-toolbar/src/utils.ts rename to packages/affine/widgets/toolbar/src/utils.ts index cfff88b6c780..3d9f2fb3f68e 100644 --- a/packages/affine/widgets/widget-toolbar/src/utils.ts +++ b/packages/affine/widgets/toolbar/src/utils.ts @@ -1,4 +1,5 @@ import { + type EditorMenuButton, type EditorToolbar, renderToolbarSeparator, } from '@blocksuite/affine-components/toolbar'; @@ -129,6 +130,10 @@ export function autoUpdatePosition( if (toolbar.dataset.open) { if (middlewareData.hide.referenceHidden) { delete toolbar.dataset.open; + // Closes dropdown menus + toolbar + .querySelector('editor-menu-button[data-open]') + ?.hide(); } } else { toolbar.dataset.open = 'true'; diff --git a/packages/affine/widgets/widget-toolbar/tsconfig.json b/packages/affine/widgets/toolbar/tsconfig.json similarity index 74% rename from packages/affine/widgets/widget-toolbar/tsconfig.json rename to packages/affine/widgets/toolbar/tsconfig.json index 6ebfc103fe6c..025ba43f5454 100644 --- a/packages/affine/widgets/widget-toolbar/tsconfig.json +++ b/packages/affine/widgets/toolbar/tsconfig.json @@ -7,9 +7,9 @@ }, "include": ["./src"], "references": [ - { "path": "../../blocks/block-database" }, - { "path": "../../blocks/block-surface" }, - { "path": "../../blocks/block-table" }, + { "path": "../../blocks/database" }, + { "path": "../../blocks/surface" }, + { "path": "../../blocks/table" }, { "path": "../../components" }, { "path": "../../model" }, { "path": "../../shared" }, diff --git a/packages/affine/widgets/widget-drag-handle/tsconfig.json b/packages/affine/widgets/widget-drag-handle/tsconfig.json deleted file mode 100644 index 0a906357d04e..000000000000 --- a/packages/affine/widgets/widget-drag-handle/tsconfig.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": "../../../tsconfig.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist", - "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" - }, - "include": ["./src"], - "references": [ - { "path": "../../blocks/block-callout" }, - { "path": "../../blocks/block-embed" }, - { "path": "../../blocks/block-list" }, - { "path": "../../blocks/block-note" }, - { "path": "../../blocks/block-paragraph" }, - { "path": "../../blocks/block-surface" }, - { "path": "../../components" }, - { "path": "../../model" }, - { "path": "../../shared" }, - { "path": "../../../framework/global" }, - { "path": "../../../framework/std" }, - { "path": "../../../framework/store" } - ] -} diff --git a/packages/docs/api/@blocksuite/std/gfx/functions/generateKeyBetween.md b/packages/docs/api/@blocksuite/std/gfx/functions/generateKeyBetween.md index 17d94119087c..3b514853236e 100644 --- a/packages/docs/api/@blocksuite/std/gfx/functions/generateKeyBetween.md +++ b/packages/docs/api/@blocksuite/std/gfx/functions/generateKeyBetween.md @@ -6,7 +6,7 @@ # Function: generateKeyBetween() -> **generateKeyBetween**(`a`, `b`, `digits`?): `string` +> **generateKeyBetween**(`a`, `b`, `digits?`): `string` ## Parameters diff --git a/packages/docs/api/@blocksuite/std/gfx/functions/generateNKeysBetween.md b/packages/docs/api/@blocksuite/std/gfx/functions/generateNKeysBetween.md index 5117f66aca6a..72d7a0dbb409 100644 --- a/packages/docs/api/@blocksuite/std/gfx/functions/generateNKeysBetween.md +++ b/packages/docs/api/@blocksuite/std/gfx/functions/generateNKeysBetween.md @@ -6,7 +6,7 @@ # Function: generateNKeysBetween() -> **generateNKeysBetween**(`a`, `b`, `n`, `digits`?): `string`[] +> **generateNKeysBetween**(`a`, `b`, `n`, `digits?`): `string`[] same preconditions as generateKeysBetween. n >= 0. diff --git a/packages/docs/api/@blocksuite/std/index/functions/KeymapExtension.md b/packages/docs/api/@blocksuite/std/index/functions/KeymapExtension.md index b78af328c4e3..3174ecad9022 100644 --- a/packages/docs/api/@blocksuite/std/index/functions/KeymapExtension.md +++ b/packages/docs/api/@blocksuite/std/index/functions/KeymapExtension.md @@ -6,7 +6,7 @@ # Function: KeymapExtension() -> **KeymapExtension**(`keymapFactory`, `options`?): `ExtensionType` +> **KeymapExtension**(`keymapFactory`, `options?`): `ExtensionType` Create a keymap extension. diff --git a/packages/docs/api/@blocksuite/store/classes/Store.md b/packages/docs/api/@blocksuite/store/classes/Store.md index a003ee0547d1..3e670af595d5 100644 --- a/packages/docs/api/@blocksuite/store/classes/Store.md +++ b/packages/docs/api/@blocksuite/store/classes/Store.md @@ -118,7 +118,7 @@ Get the root block of the store. ### addBlock() -> **addBlock**(`flavour`, `blockProps`, `parent`?, `parentIndex`?): `string` +> **addBlock**(`flavour`, `blockProps`, `parent?`, `parentIndex?`): `string` Creates and adds a new block to the store @@ -162,7 +162,7 @@ When store is in readonly mode ### addBlocks() -> **addBlocks**(`blocks`, `parent`?, `parentIndex`?): `string`[] +> **addBlocks**(`blocks`, `parent?`, `parentIndex?`): `string`[] Add multiple blocks to the store @@ -598,7 +598,7 @@ When the block is not found or schema validation fails #### Get Signature -> **get** **get**(): \<`T`\>(`identifier`, `options`?) => `T` +> **get** **get**(): \<`T`\>(`identifier`, `options?`) => `T` Get an extension instance from the store @@ -612,7 +612,7 @@ const extension = store.get(SomeExtension); The extension instance -> \<`T`\>(`identifier`, `options`?): `T` +> \<`T`\>(`identifier`, `options?`): `T` ###### Type Parameters @@ -640,7 +640,7 @@ The extension instance #### Get Signature -> **get** **getOptional**(): \<`T`\>(`identifier`, `options`?) => `null` \| `T` +> **get** **getOptional**(): \<`T`\>(`identifier`, `options?`) => `null` \| `T` Optional get an extension instance from the store. The major difference between `get` and `getOptional` is that `getOptional` will not throw an error if the extension is not found. @@ -655,7 +655,7 @@ const extension = store.getOptional(SomeExtension); The extension instance -> \<`T`\>(`identifier`, `options`?): `null` \| `T` +> \<`T`\>(`identifier`, `options?`): `null` \| `T` ###### Type Parameters @@ -805,7 +805,7 @@ Reset the history of the store. #### Get Signature -> **get** **transact**(): (`fn`, `shouldTransact`?) => `void` +> **get** **transact**(): (`fn`, `shouldTransact?`) => `void` Execute a transaction. @@ -820,7 +820,7 @@ store.transact(() => { ##### Returns -> (`fn`, `shouldTransact`?): `void` +> (`fn`, `shouldTransact?`): `void` ###### Parameters @@ -971,7 +971,7 @@ Disposes the store and releases all resources ### load() -> **load**(`initFn`?): `Store` +> **load**(`initFn?`): `Store` Initializes and loads the store diff --git a/packages/docs/api/@blocksuite/store/classes/Text.md b/packages/docs/api/@blocksuite/store/classes/Text.md index cd4c1ab6b0d8..7f10a1843c45 100644 --- a/packages/docs/api/@blocksuite/store/classes/Text.md +++ b/packages/docs/api/@blocksuite/store/classes/Text.md @@ -26,7 +26,7 @@ Text [delta](https://docs.yjs.dev/api/delta-format) is a format from Y.js. ### Constructor -> **new Text**(`input`?): `Text` +> **new Text**(`input?`): `Text` #### Parameters @@ -176,7 +176,7 @@ text.format(7, 1, { bold: true }); ### insert() -> **insert**(`content`, `index`, `attributes`?): `void` +> **insert**(`content`, `index`, `attributes?`): `void` Insert content at the specified index. @@ -241,7 +241,7 @@ text.join(other); ### replace() -> **replace**(`index`, `length`, `content`, `attributes`?): `void` +> **replace**(`index`, `length`, `content`, `attributes?`): `void` Replace the text content with a new content. @@ -286,7 +286,7 @@ text.replace(7, 1, ' blocksuite'); ### sliceToDelta() -> **sliceToDelta**(`begin`, `end`?): `DeltaOperation`[] +> **sliceToDelta**(`begin`, `end?`): `DeltaOperation`[] Slice the text to a delta. diff --git a/packages/framework/global/src/gfx/math.ts b/packages/framework/global/src/gfx/math.ts index faa2a36f118f..b63e4bd56216 100644 --- a/packages/framework/global/src/gfx/math.ts +++ b/packages/framework/global/src/gfx/math.ts @@ -11,6 +11,24 @@ export function randomSeed(): number { return Math.floor(Math.random() * 2 ** 31); } +/** + * Calculates the intersection point of two line segments. + * + * @param sp - Start point of the first line segment [x, y] + * @param ep - End point of the first line segment [x, y] + * @param sp2 - Start point of the second line segment [x, y] + * @param ep2 - End point of the second line segment [x, y] + * @param infinite - If true, treats the lines as infinite lines rather than line segments + * @returns The intersection point [x, y] if the lines intersect, null if they are parallel or coincident + * + * @example + * const intersection = lineIntersects([0, 0], [2, 2], [0, 2], [2, 0]); + * // Returns [1, 1] - the intersection point of the two line segments + * + * @example + * const parallel = lineIntersects([0, 0], [2, 2], [0, 1], [2, 3], true); + * // Returns null - the lines are parallel + */ export function lineIntersects( sp: IVec, ep: IVec, @@ -45,10 +63,23 @@ export function lineIntersects( return null; } +/** + * Finds the nearest point on a polygon to a given point. + * + * @param points - Array of points defining the polygon vertices [x, y][] + * @param point - The point to find the nearest point to [x, y] + * @returns The nearest point on the polygon to the given point + * @throws Error if points array is empty or has less than 2 points + */ export function polygonNearestPoint(points: IVec[], point: IVec) { const len = points.length; - let rst: IVec; - let dis = Infinity; + if (len < 2) { + throw new Error('Polygon must have at least 2 points'); + } + + let rst: IVec = points[0]; // Initialize with first point as fallback + let dis = Vec.dist(points[0], point); + for (let i = 0; i < len; i++) { const p = points[i]; const p2 = points[(i + 1) % len]; @@ -59,7 +90,7 @@ export function polygonNearestPoint(points: IVec[], point: IVec) { rst = temp; } } - return rst!; + return rst; } export function polygonPointDistance(points: IVec[], point: IVec) { diff --git a/packages/framework/global/src/gfx/model/bound.ts b/packages/framework/global/src/gfx/model/bound.ts index c50b95579534..3951fcc11817 100644 --- a/packages/framework/global/src/gfx/model/bound.ts +++ b/packages/framework/global/src/gfx/model/bound.ts @@ -341,8 +341,15 @@ export class Bound implements IBound { return serializeXYWH(this.x, this.y, this.w, this.h); } + /** + * Convert a point to relative coordinates. + * @param point - The point to convert. + * @returns The normalized relative coordinates of the point. + */ toRelative([x, y]: IVec): IVec { - return [(x - this.x) / this.w, (y - this.y) / this.h]; + const normalizedX = this.w === 0 ? 0 : (x - this.x) / this.w; + const normalizedY = this.h === 0 ? 0 : (y - this.y) / this.h; + return [normalizedX, normalizedY]; } toXYWH(): XYWH { diff --git a/packages/framework/global/src/gfx/model/vec.ts b/packages/framework/global/src/gfx/model/vec.ts index fa1ca1f3be9b..d4e5dfcaa7f3 100644 --- a/packages/framework/global/src/gfx/model/vec.ts +++ b/packages/framework/global/src/gfx/model/vec.ts @@ -565,6 +565,8 @@ export class Vec { * @param n * @param min */ + static clampV(A: IVec, min: number, max?: number): IVec; + static clampV(A: number[], min: number): number[]; // eslint-disable-next-line @typescript-eslint/unified-signatures diff --git a/packages/framework/std/src/__tests__/editor-host.unit.spec.ts b/packages/framework/std/src/__tests__/editor-host.unit.spec.ts index d35e5087ddd3..6e292960b103 100644 --- a/packages/framework/std/src/__tests__/editor-host.unit.spec.ts +++ b/packages/framework/std/src/__tests__/editor-host.unit.spec.ts @@ -11,6 +11,7 @@ import { HeadingBlockSchemaExtension, NoteBlockSchemaExtension, RootBlockSchemaExtension, + SurfaceBlockSchemaExtension, } from './test-schema.js'; import { testSpecs } from './test-spec.js'; @@ -20,6 +21,7 @@ const extensions = [ RootBlockSchemaExtension, NoteBlockSchemaExtension, HeadingBlockSchemaExtension, + SurfaceBlockSchemaExtension, ]; function createTestOptions() { diff --git a/packages/framework/std/src/__tests__/gfx/surface.unit.spec.ts b/packages/framework/std/src/__tests__/gfx/surface.unit.spec.ts new file mode 100644 index 000000000000..a056465c7d25 --- /dev/null +++ b/packages/framework/std/src/__tests__/gfx/surface.unit.spec.ts @@ -0,0 +1,358 @@ +import { + createAutoIncrementIdGenerator, + TestWorkspace, +} from '@blocksuite/store/test'; +import { describe, expect, test, vi } from 'vitest'; + +import { effects } from '../../effects.js'; +import type { TestShapeElement } from '../test-gfx-element.js'; +import { + RootBlockSchemaExtension, + type SurfaceBlockModel, + SurfaceBlockSchemaExtension, +} from '../test-schema.js'; + +effects(); + +const extensions = [RootBlockSchemaExtension, SurfaceBlockSchemaExtension]; + +function createTestOptions() { + const idGenerator = createAutoIncrementIdGenerator(); + return { id: 'test-collection', idGenerator }; +} + +const commonSetup = () => { + const collection = new TestWorkspace(createTestOptions()); + + collection.meta.initialize(); + const doc = collection.createDoc('home'); + const store = doc.getStore({ extensions }); + doc.load(); + + const rootId = store.addBlock('test:page'); + const surfaceId = store.addBlock('test:surface', {}, rootId); + + const surfaceBlock = store.getBlock(surfaceId)!; + + return { + surfaceId, + surfaceModel: surfaceBlock.model as SurfaceBlockModel, + }; +}; + +describe('surface basic', () => { + test('addElement should work correctly', () => { + const { surfaceModel: model } = commonSetup(); + const id = model.addElement({ + type: 'testShape', + }); + + expect(model.elementModels[0].id).toBe(id); + }); + + test('removeElement should work correctly', () => { + const { surfaceModel: model } = commonSetup(); + const id = model.addElement({ + type: 'testShape', + }); + + model.deleteElement(id); + + expect(model.elementModels.length).toBe(0); + }); + + test('updateElement should work correctly', () => { + const { surfaceModel: model } = commonSetup(); + const id = model.addElement({ + type: 'testShape', + }); + + model.updateElement(id, { xywh: '[10,10,200,200]' }); + + expect(model.elementModels[0].xywh).toBe('[10,10,200,200]'); + }); + + test('getElementById should return element', () => { + const { surfaceModel: model } = commonSetup(); + + const id = model.addElement({ + type: 'testShape', + }); + + expect(model.getElementById(id)).not.toBeNull(); + }); + + test('getElementById should return null if not found', () => { + const { surfaceModel: model } = commonSetup(); + + expect(model.getElementById('not-found')).toBeNull(); + }); + + test('created observer should be called', () => { + const { surfaceModel } = commonSetup(); + + let expectPayload; + const elementAddedCallback = vi.fn(payload => (expectPayload = payload)); + + surfaceModel.elementAdded.subscribe(elementAddedCallback); + + const shapeId = surfaceModel.addElement({ + type: 'testShape', + rotate: 0, + xywh: '[0, 0, 10, 10]', + }); + + expect(elementAddedCallback).toHaveBeenCalled(); + expect(expectPayload).toMatchObject({ + id: shapeId, + }); + }); + + test('update and props observer should be called', () => { + const { surfaceModel } = commonSetup(); + + const shapeId = surfaceModel.addElement({ + type: 'testShape', + rotate: 0, + xywh: '[0, 0, 10, 10]', + }); + const shapeModel = surfaceModel.getElementById(shapeId)!; + + let expectPayload; + const elementUpdatedCallback = vi.fn(payload => (expectPayload = payload)); + let propsUpdatedPayload; + const propsUpdatedCallback = vi.fn(payload => { + propsUpdatedPayload = payload; + }); + + surfaceModel.elementUpdated.subscribe(elementUpdatedCallback); + shapeModel.propsUpdated.subscribe(propsUpdatedCallback); + + surfaceModel.updateElement(shapeId, { + rotate: 10, + }); + + expect(elementUpdatedCallback).toHaveBeenCalled(); + expect(propsUpdatedCallback).toHaveBeenCalled(); + expect(expectPayload).toMatchObject({ + id: shapeId, + props: { + rotate: 10, + }, + oldValues: { + rotate: 0, + }, + }); + expect(propsUpdatedPayload).toMatchObject({ + key: 'rotate', + }); + }); + + test('delete observer should be called', () => { + const { surfaceModel } = commonSetup(); + + const shapeId = surfaceModel.addElement({ + type: 'testShape', + rotate: 0, + xywh: '[0, 0, 10, 10]', + }); + + let expectPayload; + const deletedCallback = vi.fn(payload => (expectPayload = payload)); + + surfaceModel.elementRemoved.subscribe(deletedCallback); + surfaceModel.deleteElement(shapeId); + + expect(deletedCallback).toHaveBeenCalled(); + expect(expectPayload).toMatchObject({ + id: shapeId, + type: 'testShape', + }); + }); +}); + +describe('element model', () => { + test('default value should work correctly', () => { + const { surfaceModel: model } = commonSetup(); + const id = model.addElement({ + type: 'testShape', + }); + + const element = model.getElementById(id)! as TestShapeElement; + + expect(element.rotate).toBe(0); + expect(element.xywh).toBe('[0,0,10,10]'); + }); + + test('defined prop should not be overwritten by default value', () => { + const { surfaceModel: model } = commonSetup(); + const id = model.addElement({ + type: 'testShape', + rotate: 20, + }); + + const element = model.getElementById(id)! as TestShapeElement; + + expect(element.rotate).toBe(20); + }); + + test('assign value to model property should update ymap directly', () => { + const { surfaceModel: model } = commonSetup(); + const id = model.addElement({ + type: 'testShape', + }); + + const element = model.getElementById(id)! as TestShapeElement; + + expect(element.yMap.get('rotate')).toBe(0); + element.rotate = 30; + expect(element.yMap.get('rotate')).toBe(30); + }); +}); + +describe('stash/pop', () => { + const { surfaceModel: model } = commonSetup(); + test('stash and pop should work correctly', () => { + const id = model.addElement({ + type: 'testShape', + }); + const elementModel = model.getElementById(id)! as TestShapeElement; + + expect(elementModel.rotate).toBe(0); + + elementModel.stash('rotate'); + elementModel.rotate = 10; + expect(elementModel.rotate).toBe(10); + expect(elementModel.yMap.get('rotate')).toBe(0); + + elementModel.pop('rotate'); + expect(elementModel.rotate).toBe(10); + expect(elementModel.yMap.get('rotate')).toBe(10); + + elementModel.rotate = 6; + expect(elementModel.rotate).toBe(6); + expect(elementModel.yMap.get('rotate')).toBe(6); + }); + + test('assign stashed property should emit event', () => { + const id = model.addElement({ + type: 'testShape', + rotate: 4, + }); + const elementModel = model.getElementById(id)! as TestShapeElement; + + elementModel.stash('rotate'); + + const onchange = vi.fn(); + const subscription = model.elementUpdated.subscribe(({ id }) => { + subscription.unsubscribe(); + onchange(id); + }); + + elementModel.rotate = 10; + expect(onchange).toHaveBeenCalledWith(id); + }); + + test('stashed property should also trigger derive decorator', () => { + const id = model.addElement({ + type: 'testShape', + rotate: 20, + }); + const elementModel = model.getElementById(id)! as TestShapeElement; + + elementModel.stash('shapeType'); + elementModel.shapeType = 'triangle'; + + // rotation should be 0 'cause of derive decorator + expect(elementModel.rotate).toBe(0); + }); + + test('non-field property should not allow stash/pop, and should fail silently ', () => { + const id = model.addElement({ + type: 'testShape', + }); + const elementModel = model.getElementById(id)! as TestShapeElement; + + // opacity is a local property, so it should not be stashed + elementModel.stash('opacity'); + expect(elementModel['_stashed'].has('opacity')).toBe(false); + + // pop the `opacity` should not affect yMap + elementModel.opacity = 0.5; + elementModel.pop('opacity'); + expect(elementModel.yMap.has('opacity')).toBe(false); + }); +}); + +describe('derive decorator', () => { + test('derived decorator should work correctly', () => { + const { surfaceModel: model } = commonSetup(); + const id = model.addElement({ + type: 'testShape', + rotate: 20, + }); + const elementModel = model.getElementById(id)! as TestShapeElement; + + elementModel.shapeType = 'triangle'; + + expect(elementModel.rotate).toBe(0); + }); +}); + +describe('local decorator', () => { + test('local decorator should work correctly', () => { + const { surfaceModel: model } = commonSetup(); + const id = model.addElement({ + type: 'testShape', + }); + const elementModel = model.getElementById(id)! as TestShapeElement; + + expect(elementModel.display).toBe(true); + + elementModel.display = false; + expect(elementModel.display).toBe(false); + + elementModel.opacity = 0.5; + expect(elementModel.opacity).toBe(0.5); + }); + + test('assign local property should emit event', () => { + const { surfaceModel: model } = commonSetup(); + const id = model.addElement({ + type: 'testShape', + }); + const elementModel = model.getElementById(id)! as TestShapeElement; + + const onchange = vi.fn(); + const subscription = model.elementUpdated.subscribe(({ id }) => { + subscription.unsubscribe(); + onchange(id); + }); + + const onPropChange = vi.fn(); + elementModel.propsUpdated.subscribe(({ key }) => { + onPropChange(key); + }); + + elementModel.display = false; + + expect(elementModel.display).toBe(false); + expect(onchange).toHaveBeenCalledWith(id); + expect(onPropChange).toHaveBeenCalledWith('display'); + }); +}); + +describe('convert decorator', () => { + test('convert decorator', () => { + const { surfaceModel: model } = commonSetup(); + const id = model.addElement({ + type: 'testShape', + }); + const elementModel = model.getElementById(id)! as TestShapeElement; + + // @ts-expect-error test needed + elementModel.shapeType = 'otherImpossibleType'; + + expect(elementModel.shapeType).toBe('rect'); + }); +}); diff --git a/packages/framework/std/src/__tests__/gfx/view.unit.spec.ts b/packages/framework/std/src/__tests__/gfx/view.unit.spec.ts new file mode 100644 index 000000000000..ad645edfd86b --- /dev/null +++ b/packages/framework/std/src/__tests__/gfx/view.unit.spec.ts @@ -0,0 +1,134 @@ +import { + createAutoIncrementIdGenerator, + TestWorkspace, +} from '@blocksuite/store/test'; +import { describe, expect, test } from 'vitest'; + +import { effects } from '../../effects.js'; +import { GfxControllerIdentifier } from '../../gfx/identifiers.js'; +import { TestEditorContainer } from '../test-editor.js'; +import { TestLocalElement } from '../test-gfx-element.js'; +import { + RootBlockSchemaExtension, + type SurfaceBlockModel, + SurfaceBlockSchemaExtension, + TestGfxBlockSchemaExtension, +} from '../test-schema.js'; +import { testSpecs } from '../test-spec.js'; + +effects(); + +const extensions = [ + RootBlockSchemaExtension, + SurfaceBlockSchemaExtension, + TestGfxBlockSchemaExtension, +]; + +function createTestOptions() { + const idGenerator = createAutoIncrementIdGenerator(); + return { id: 'test-collection', idGenerator }; +} + +const commonSetup = async () => { + const collection = new TestWorkspace(createTestOptions()); + + collection.meta.initialize(); + const doc = collection.createDoc('home'); + const store = doc.getStore({ extensions }); + doc.load(); + + const rootId = store.addBlock('test:page'); + const surfaceId = store.addBlock('test:surface', {}, rootId); + + const surfaceBlock = store.getBlock(surfaceId)!; + + const editorContainer = new TestEditorContainer(); + editorContainer.doc = store; + editorContainer.specs = testSpecs; + document.body.append(editorContainer); + + await editorContainer.updateComplete; + + const gfx = editorContainer.std.get(GfxControllerIdentifier); + + return { + gfx, + surfaceId, + rootId, + surfaceModel: surfaceBlock.model as SurfaceBlockModel, + }; +}; + +describe('gfx element view basic', () => { + test('view should be created', async () => { + const { gfx, surfaceModel } = await commonSetup(); + + const id = surfaceModel.addElement({ + type: 'testShape', + }); + const shapeView = gfx.view.get(id); + + expect(shapeView).not.toBeNull(); + expect(shapeView!.model.id).toBe(id); + expect(shapeView!.isConnected).toBe(true); + }); + + test('view should be removed', async () => { + const { gfx, surfaceModel } = await commonSetup(); + + const id = surfaceModel.addElement({ + type: 'testShape', + }); + const shapeView = gfx.view.get(id); + + expect(shapeView).not.toBeNull(); + expect(shapeView!.model.id).toBe(id); + + surfaceModel.deleteElement(id); + expect(gfx.view.get(id)).toBeNull(); + expect(shapeView!.isConnected).toBe(false); + }); + + test('query gfx block view should work', async () => { + const { gfx, surfaceId, rootId } = await commonSetup(); + + const waitGfxViewConnected = (id: string) => { + const { promise, resolve } = Promise.withResolvers(); + const subscription = gfx.std.view.viewUpdated.subscribe(payload => { + if ( + payload.id === id && + payload.type === 'block' && + payload.method === 'add' + ) { + subscription.unsubscribe(); + resolve(); + } + }); + + return promise; + }; + const id = gfx.std.store.addBlock('test:gfx-block', undefined, surfaceId); + await waitGfxViewConnected(id); + const gfxBlockView = gfx.view.get(id); + expect(gfxBlockView).not.toBeNull(); + + const rootView = gfx.view.get(rootId); + // root is not a gfx block, so it should be null + expect(rootView).toBeNull(); + }); + + test('local element view should be created', async () => { + const { gfx, surfaceModel } = await commonSetup(); + const localElement = new TestLocalElement(surfaceModel); + localElement.id = 'test-local-element'; + + surfaceModel.addLocalElement(localElement); + + const localView = gfx.view.get(localElement); + expect(localView).not.toBeNull(); + expect(localView!.isConnected).toBe(true); + + surfaceModel.deleteLocalElement(localElement); + expect(localView!.isConnected).toBe(false); + }); +}); diff --git a/packages/framework/std/src/__tests__/test-block.ts b/packages/framework/std/src/__tests__/test-block.ts index 5d008b0c65a3..3c5cea5ae909 100644 --- a/packages/framework/std/src/__tests__/test-block.ts +++ b/packages/framework/std/src/__tests__/test-block.ts @@ -1,11 +1,13 @@ import { html } from 'lit'; import { customElement } from 'lit/decorators.js'; -import { BlockComponent } from '../view/index.js'; +import { BlockComponent, GfxBlockComponent } from '../view/index.js'; import type { HeadingBlockModel, NoteBlockModel, RootBlockModel, + SurfaceBlockModel, + TestGfxBlockModel, } from './test-schema.js'; @customElement('test-root-block') @@ -39,3 +41,21 @@ export class HeadingH2BlockComponent extends BlockComponent { return html`
${this.model.text}
`; } } + +@customElement('test-surface-block') +export class SurfaceBlockComponent extends BlockComponent { + override renderBlock() { + return html` +
${this.renderChildren(this.model)}
+ `; + } +} + +@customElement('test-gfx-block') +export class TestGfxBlockComponent extends GfxBlockComponent { + override renderGfxBlock() { + return html` +
${this.renderChildren(this.model)}
+ `; + } +} diff --git a/packages/framework/std/src/__tests__/test-gfx-element.ts b/packages/framework/std/src/__tests__/test-gfx-element.ts new file mode 100644 index 000000000000..83b5716a40b8 --- /dev/null +++ b/packages/framework/std/src/__tests__/test-gfx-element.ts @@ -0,0 +1,44 @@ +import type { SerializedXYWH } from '@blocksuite/global/gfx'; + +import { + convert, + derive, + field, + GfxLocalElementModel, + GfxPrimitiveElementModel, +} from '../gfx/index.js'; + +export class TestShapeElement extends GfxPrimitiveElementModel { + get type() { + return 'testShape'; + } + + @field() + accessor rotate: number = 0; + + @field() + accessor xywh: SerializedXYWH = '[0,0,10,10]'; + + @convert(val => { + if (['rect', 'triangle'].includes(val)) { + return val; + } + + return 'rect'; + }) + @derive(val => { + if (val === 'triangle') { + return { + rotate: 0, + }; + } + + return {}; + }) + @field() + accessor shapeType: 'rect' | 'triangle' = 'rect'; +} + +export class TestLocalElement extends GfxLocalElementModel { + override type: string = 'testLocal'; +} diff --git a/packages/framework/std/src/__tests__/test-schema.ts b/packages/framework/std/src/__tests__/test-schema.ts index 5bd854c31fa1..af5198801ebe 100644 --- a/packages/framework/std/src/__tests__/test-schema.ts +++ b/packages/framework/std/src/__tests__/test-schema.ts @@ -1,8 +1,17 @@ +import type { SerializedXYWH } from '@blocksuite/global/gfx'; import { BlockModel, BlockSchemaExtension, defineBlockSchema, } from '@blocksuite/store'; +import * as Y from 'yjs'; + +import { SurfaceBlockModel as BaseSurfaceModel } from '../gfx/index.js'; +import { + GfxCompatibleBlockModel, + type GfxCompatibleProps, +} from '../gfx/model/gfx-block-model.js'; +import { TestShapeElement } from './test-gfx-element.js'; export const RootBlockSchema = defineBlockSchema({ flavour: 'test:page', @@ -15,7 +24,7 @@ export const RootBlockSchema = defineBlockSchema({ metadata: { version: 2, role: 'root', - children: ['test:note'], + children: ['test:note', 'test:surface'], }, }); @@ -61,3 +70,58 @@ export const HeadingBlockSchemaExtension = export class HeadingBlockModel extends BlockModel< ReturnType<(typeof HeadingBlockSchema)['model']['props']> > {} + +export const SurfaceBlockSchema = defineBlockSchema({ + flavour: 'test:surface', + props: internal => ({ + elements: internal.Boxed>>(new Y.Map()), + }), + metadata: { + version: 1, + role: 'hub', + parent: ['test:page'], + }, + toModel: () => new SurfaceBlockModel(), +}); + +export const SurfaceBlockSchemaExtension = + BlockSchemaExtension(SurfaceBlockSchema); + +export class SurfaceBlockModel extends BaseSurfaceModel { + override _init() { + this._extendElement({ + testShape: TestShapeElement, + }); + super._init(); + } +} + +type GfxTestBlockProps = { + xywh: SerializedXYWH; + rotate: number; + index: string; +} & GfxCompatibleProps; + +export const TestGfxBlockSchema = defineBlockSchema({ + flavour: 'test:gfx-block', + props: () => + ({ + xywh: '[0,0,10,10]' as SerializedXYWH, + rotate: 0, + index: 'a0', + lockedBySelf: false, + }) as GfxTestBlockProps, + metadata: { + version: 1, + role: 'content', + parent: ['test:surface'], + }, + toModel: () => new TestGfxBlockModel(), +}); + +export const TestGfxBlockSchemaExtension = + BlockSchemaExtension(TestGfxBlockSchema); + +export class TestGfxBlockModel extends GfxCompatibleBlockModel( + BlockModel +) {} diff --git a/packages/framework/std/src/__tests__/test-spec.ts b/packages/framework/std/src/__tests__/test-spec.ts index 3f5871481ca6..8f814cb4d2e9 100644 --- a/packages/framework/std/src/__tests__/test-spec.ts +++ b/packages/framework/std/src/__tests__/test-spec.ts @@ -20,4 +20,8 @@ export const testSpecs: ExtensionType[] = [ return literal`test-h2-block`; }), + + BlockViewExtension('test:surface', literal`test-surface-block`), + + BlockViewExtension('test:gfx-block', literal`test-gfx-block`), ]; diff --git a/packages/framework/std/src/gfx/element-transform/transform-manager.ts b/packages/framework/std/src/gfx/element-transform/transform-manager.ts index 0c039888079e..55e7d4c5ac57 100644 --- a/packages/framework/std/src/gfx/element-transform/transform-manager.ts +++ b/packages/framework/std/src/gfx/element-transform/transform-manager.ts @@ -115,8 +115,8 @@ export class ElementTransformManager extends GfxExtension { fallback: lockedElement !== picked, }; - view?.onSelected(context); - return true; + const selected = view?.onSelected(context); + return selected ?? true; } return false; diff --git a/packages/framework/std/src/gfx/view/view.ts b/packages/framework/std/src/gfx/view/view.ts index a75893034eaf..f7b8f470b1dd 100644 --- a/packages/framework/std/src/gfx/view/view.ts +++ b/packages/framework/std/src/gfx/view/view.ts @@ -193,13 +193,15 @@ export class GfxElementModelView< this.model.xywh = currentBound.moveDelta(dx, dy).serialize(); } - onSelected(context: SelectedContext) { + onSelected(context: SelectedContext): void | boolean { if (this.model instanceof GfxPrimitiveElementModel) { if (context.multiSelect) { this.gfx.selection.toggle(this.model); } else { this.gfx.selection.set({ elements: [this.model.id] }); } + + return true; } } diff --git a/packages/framework/std/src/gfx/viewport.ts b/packages/framework/std/src/gfx/viewport.ts index 5f7ea2258288..725498282c14 100644 --- a/packages/framework/std/src/gfx/viewport.ts +++ b/packages/framework/std/src/gfx/viewport.ts @@ -214,7 +214,12 @@ export class Viewport { * This property is used to calculate the scale of the editor. */ get viewScale() { - if (!this._shell || this._cachedOffsetWidth === null) return 1; + if ( + !this._shell || + this._cachedOffsetWidth === null || + this._cachedOffsetWidth === 0 + ) + return 1; return this.boundingClientRect.width / this._cachedOffsetWidth; } diff --git a/packages/framework/std/src/inline/components/v-element.ts b/packages/framework/std/src/inline/components/v-element.ts index 530913b4131f..5bd2a020be7f 100644 --- a/packages/framework/std/src/inline/components/v-element.ts +++ b/packages/framework/std/src/inline/components/v-element.ts @@ -7,7 +7,7 @@ import { html, LitElement } from 'lit'; import { property } from 'lit/decorators.js'; import { styleMap } from 'lit/directives/style-map.js'; -import { ZERO_WIDTH_SPACE } from '../consts.js'; +import { ZERO_WIDTH_FOR_EMPTY_LINE } from '../consts.js'; import type { InlineEditor } from '../inline-editor.js'; import { isInlineRangeIntersect } from '../utils/inline-range.js'; @@ -90,7 +90,7 @@ export class VElement< @property({ type: Object }) accessor delta: DeltaInsert = { - insert: ZERO_WIDTH_SPACE, + insert: ZERO_WIDTH_FOR_EMPTY_LINE, }; @property({ attribute: false }) diff --git a/packages/framework/std/src/inline/components/v-line.ts b/packages/framework/std/src/inline/components/v-line.ts index 1c9ec99e5299..a2f6af624701 100644 --- a/packages/framework/std/src/inline/components/v-line.ts +++ b/packages/framework/std/src/inline/components/v-line.ts @@ -4,7 +4,7 @@ import { html, LitElement, type TemplateResult } from 'lit'; import { property } from 'lit/decorators.js'; import { styleMap } from 'lit/directives/style-map.js'; -import { INLINE_ROOT_ATTR, ZERO_WIDTH_SPACE } from '../consts.js'; +import { INLINE_ROOT_ATTR, ZERO_WIDTH_FOR_EMPTY_LINE } from '../consts.js'; import type { InlineRootElement } from '../inline-editor.js'; import { EmbedGap } from './embed-gap.js'; @@ -89,7 +89,9 @@ export class VLine extends LitElement { renderVElements() { if (this.elements.length === 0) { // don't use v-element because it not correspond to the actual delta - return html`
`; + return html` +
+ `; } const inlineEditor = this.inlineEditor; diff --git a/packages/framework/std/src/inline/components/v-text.ts b/packages/framework/std/src/inline/components/v-text.ts index 9e6b2586d1cc..4e0ce4ae020a 100644 --- a/packages/framework/std/src/inline/components/v-text.ts +++ b/packages/framework/std/src/inline/components/v-text.ts @@ -2,7 +2,7 @@ import { html, LitElement } from 'lit'; import { property } from 'lit/decorators.js'; import { styleMap } from 'lit/directives/style-map.js'; -import { ZERO_WIDTH_SPACE } from '../consts.js'; +import { ZERO_WIDTH_FOR_EMPTY_LINE } from '../consts.js'; export class VText extends LitElement { override createRenderRoot() { @@ -24,7 +24,7 @@ export class VText extends LitElement { } @property({ attribute: false }) - accessor str: string = ZERO_WIDTH_SPACE; + accessor str: string = ZERO_WIDTH_FOR_EMPTY_LINE; } declare global { diff --git a/packages/framework/std/src/inline/consts.ts b/packages/framework/std/src/inline/consts.ts index 81568c1a02b2..d626dea0772d 100644 --- a/packages/framework/std/src/inline/consts.ts +++ b/packages/framework/std/src/inline/consts.ts @@ -1,7 +1,6 @@ import { IS_SAFARI } from '@blocksuite/global/env'; -export const ZERO_WIDTH_SPACE = IS_SAFARI ? '\u200C' : '\u200B'; -// see https://en.wikipedia.org/wiki/Zero-width_non-joiner -export const ZERO_WIDTH_NON_JOINER = '\u200C'; +export const ZERO_WIDTH_FOR_EMPTY_LINE = IS_SAFARI ? '\u200C' : '\u200B'; +export const ZERO_WIDTH_FOR_EMBED_NODE = IS_SAFARI ? '\u200B' : '\u200C'; export const INLINE_ROOT_ATTR = 'data-v-root'; diff --git a/packages/framework/std/src/inline/range/range-binding.ts b/packages/framework/std/src/inline/range/range-binding.ts index 22681e998bb6..6cf0f9d3ddca 100644 --- a/packages/framework/std/src/inline/range/range-binding.ts +++ b/packages/framework/std/src/inline/range/range-binding.ts @@ -219,8 +219,8 @@ export class RangeBinding { const closestExclude = el.closest(`[${RANGE_SYNC_EXCLUDE_ATTR}="true"]`); if (closestExclude) return; - const closestEditable = el.closest('[contenteditable="false"]'); - if (closestEditable) return; + const closestEditable = el.closest('[contenteditable]'); + if (!closestEditable) return; const startElement = getElement(range.startContainer); const endElement = getElement(range.endContainer); diff --git a/packages/framework/std/src/inline/utils/point-conversion.ts b/packages/framework/std/src/inline/utils/point-conversion.ts index 7e891b289a1e..dd0a7bf65969 100644 --- a/packages/framework/std/src/inline/utils/point-conversion.ts +++ b/packages/framework/std/src/inline/utils/point-conversion.ts @@ -1,7 +1,7 @@ import { BlockSuiteError, ErrorCode } from '@blocksuite/global/exceptions'; import type { VElement, VLine } from '../components/index.js'; -import { INLINE_ROOT_ATTR, ZERO_WIDTH_SPACE } from '../consts.js'; +import { INLINE_ROOT_ATTR, ZERO_WIDTH_FOR_EMPTY_LINE } from '../consts.js'; import type { DomPoint, TextPoint } from '../types.js'; import { isInlineRoot, @@ -76,7 +76,7 @@ export function textPointToDomPoint( index += calculateTextLength(text); } - if (text.wholeText !== ZERO_WIDTH_SPACE) { + if (text.wholeText !== ZERO_WIDTH_FOR_EMPTY_LINE) { index += offset; } diff --git a/packages/framework/std/src/inline/utils/text.ts b/packages/framework/std/src/inline/utils/text.ts index edbeedcc777c..a9534c72d9ec 100644 --- a/packages/framework/std/src/inline/utils/text.ts +++ b/packages/framework/std/src/inline/utils/text.ts @@ -1,7 +1,7 @@ -import { ZERO_WIDTH_SPACE } from '../consts.js'; +import { ZERO_WIDTH_FOR_EMPTY_LINE } from '../consts.js'; export function calculateTextLength(text: Text): number { - if (text.wholeText === ZERO_WIDTH_SPACE) { + if (text.wholeText === ZERO_WIDTH_FOR_EMPTY_LINE) { return 0; } else { return text.wholeText.length; diff --git a/packages/framework/std/src/view/element/block-component.ts b/packages/framework/std/src/view/element/block-component.ts index 3a059cef8894..37473e453644 100644 --- a/packages/framework/std/src/view/element/block-component.ts +++ b/packages/framework/std/src/view/element/block-component.ts @@ -53,7 +53,7 @@ export class BlockComponent< options?: { global?: boolean; flavour?: boolean } ) => { this._disposables.add( - this.host.event.add(name, handler, { + this.std.event.add(name, handler, { flavour: options?.global ? undefined : options?.flavour @@ -135,12 +135,12 @@ export class BlockComponent< if (!rootId) { return null; } - const rootComponent = this.host.view.getBlock(rootId); + const rootComponent = this.std.view.getBlock(rootId); return rootComponent ?? null; } get selection() { - return this.host.selection; + return this.std.selection; } get service(): Service { @@ -162,7 +162,7 @@ export class BlockComponent< return Object.keys(this.widgets).reduce( (mapping, key) => ({ ...mapping, - [key]: this.host.view.getWidget(key, this.blockId), + [key]: this.std.view.getWidget(key, this.blockId), }), {} ); @@ -197,7 +197,7 @@ export class BlockComponent< keymap: Record, options?: { global?: boolean; flavour?: boolean } ) { - const dispose = this.host.event.bindHotkey(keymap, { + const dispose = this.std.event.bindHotkey(keymap, { flavour: options?.global ? undefined : options?.flavour diff --git a/packages/framework/std/src/view/element/gfx-block-component.ts b/packages/framework/std/src/view/element/gfx-block-component.ts index 0b514f7e28c4..1d4eee375b40 100644 --- a/packages/framework/std/src/view/element/gfx-block-component.ts +++ b/packages/framework/std/src/view/element/gfx-block-component.ts @@ -103,12 +103,14 @@ export abstract class GfxBlockComponent< this.model.pop('xywh'); } - onSelected(context: SelectedContext) { + onSelected(context: SelectedContext): void | boolean { if (context.multiSelect) { this.gfx.selection.toggle(this.model); } else { this.gfx.selection.set({ elements: [this.model.id] }); } + + return true; } onRotate() {} @@ -219,12 +221,14 @@ export function toGfxBlockComponent< } // eslint-disable-next-line sonarjs/no-identical-functions - onSelected(context: SelectedContext) { + onSelected(context: SelectedContext): void | boolean { if (context.multiSelect) { this.gfx.selection.toggle(this.model); } else { this.gfx.selection.set({ elements: [this.model.id] }); } + + return true; } onRotate() {} diff --git a/packages/framework/tsconfig.json b/packages/framework/tsconfig.json deleted file mode 100644 index 0fe47e737d04..000000000000 --- a/packages/framework/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": "../tsconfig.json", - "include": [], - "references": [ - { - "path": "./global" - }, - { - "path": "./inline" - }, - { - "path": "./std" - }, - { - "path": "./store" - }, - { - "path": "./sync" - } - ] -} diff --git a/packages/integration-test/src/__tests__/edgeless/surface-model.spec.ts b/packages/integration-test/src/__tests__/edgeless/surface-model.spec.ts index 596d4af24c08..091f28eeb857 100644 --- a/packages/integration-test/src/__tests__/edgeless/surface-model.spec.ts +++ b/packages/integration-test/src/__tests__/edgeless/surface-model.spec.ts @@ -2,10 +2,8 @@ import type { SurfaceBlockModel } from '@blocksuite/affine/blocks/surface'; import type { BrushElementModel, GroupElementModel, - ShapeElementModel, } from '@blocksuite/affine/model'; -import { DefaultTheme } from '@blocksuite/affine/model'; -import { beforeEach, describe, expect, test, vi } from 'vitest'; +import { beforeEach, describe, expect, test } from 'vitest'; import { wait } from '../utils/common.js'; import { setupEditor } from '../utils/setup.js'; @@ -23,88 +21,19 @@ beforeEach(async () => { return cleanup; }); -describe('elements management', () => { - test('addElement should work correctly', () => { - const id = model.addElement({ - type: 'shape', - }); - - expect(model.elementModels[0].id).toBe(id); - }); - - test('removeElement should work correctly', () => { - const id = model.addElement({ - type: 'shape', - }); - - model.deleteElement(id); - - expect(model.elementModels.length).toBe(0); - }); - - test('updateElement should work correctly', () => { - const id = model.addElement({ - type: 'shape', - }); - - model.updateElement(id, { xywh: '[10,10,200,200]' }); - - expect(model.elementModels[0].xywh).toBe('[10,10,200,200]'); - }); - - test('getElementById should return element', () => { - const id = model.addElement({ - type: 'shape', - }); - - expect(model.getElementById(id)).not.toBeNull(); - }); - - test('getElementById should return null if not found', () => { - expect(model.getElementById('not-found')).toBeNull(); - }); -}); - -describe('element model', () => { - test('default value should work correctly', () => { - const id = model.addElement({ - type: 'shape', - }); - - const element = model.getElementById(id)! as ShapeElementModel; - - expect(element.index).toBe('a0'); - expect(element.strokeColor).toBe(DefaultTheme.shapeStrokeColor); - expect(element.strokeWidth).toBe(4); - }); - - test('defined prop should not be overwritten by default value', () => { - const id = model.addElement({ - type: 'shape', - strokeColor: '--affine-palette-line-black', - }); - - const element = model.getElementById(id)! as ShapeElementModel; - - expect(element.strokeColor).toBe('--affine-palette-line-black'); - }); - - test('assign value to model property should update ymap directly', () => { +describe('group', () => { + test('empty group should have all zero xywh', () => { const id = model.addElement({ - type: 'shape', + type: 'group', }); + const group = model.getElementById(id)! as GroupElementModel; - const element = model.getElementById(id)! as ShapeElementModel; - - expect(element.yMap.get('strokeColor')).toBe(DefaultTheme.shapeStrokeColor); - - element.strokeColor = '--affine-palette-line-black'; - expect(element.yMap.get('strokeColor')).toBe('--affine-palette-line-black'); - expect(element.strokeColor).toBe('--affine-palette-line-black'); + expect(group.x).toBe(0); + expect(group.y).toBe(0); + expect(group.w).toBe(0); + expect(group.h).toBe(0); }); -}); -describe('group', () => { test('should get group', () => { const id = model.addElement({ type: 'shape', @@ -323,185 +252,6 @@ describe('connector', () => { }); }); -describe('stash/pop', () => { - test('stash and pop should work correctly', () => { - const id = model.addElement({ - type: 'shape', - strokeWidth: 4, - }); - const elementModel = model.getElementById(id)! as ShapeElementModel; - - expect(elementModel.strokeWidth).toBe(4); - - elementModel.stash('strokeWidth'); - elementModel.strokeWidth = 10; - expect(elementModel.strokeWidth).toBe(10); - expect(elementModel.yMap.get('strokeWidth')).toBe(4); - - elementModel.pop('strokeWidth'); - expect(elementModel.strokeWidth).toBe(10); - expect(elementModel.yMap.get('strokeWidth')).toBe(10); - - elementModel.strokeWidth = 6; - expect(elementModel.strokeWidth).toBe(6); - expect(elementModel.yMap.get('strokeWidth')).toBe(6); - }); - - test('assign stashed property should emit event', () => { - const id = model.addElement({ - type: 'shape', - strokeWidth: 4, - }); - const elementModel = model.getElementById(id)! as ShapeElementModel; - - elementModel.stash('strokeWidth'); - - const onchange = vi.fn(); - const subscription = model.elementUpdated.subscribe(({ id }) => { - subscription.unsubscribe(); - onchange(id); - }); - - elementModel.strokeWidth = 10; - expect(onchange).toHaveBeenCalledWith(id); - }); - - test('stashed property should also trigger derive decorator', () => { - const id = model.addElement({ - type: 'brush', - points: [ - [0, 0], - [100, 100], - [120, 150], - ], - }); - const elementModel = model.getElementById(id)! as BrushElementModel; - - elementModel.stash('points'); - elementModel.points = [ - [0, 0], - [50, 50], - [135, 145], - [150, 170], - [200, 180], - ]; - const points = elementModel.points; - - expect(elementModel.w).toBe(200 + elementModel.lineWidth); - expect(elementModel.h).toBe(180 + elementModel.lineWidth); - - expect(elementModel.yMap.get('points')).not.toEqual(points); - expect(elementModel.w).toBe(200 + elementModel.lineWidth); - expect(elementModel.h).toBe(180 + elementModel.lineWidth); - }); - - test('non-field property should not allow stash/pop, and should failed silently ', () => { - const id = model.addElement({ - type: 'group', - }); - const elementModel = model.getElementById(id)! as GroupElementModel; - - elementModel.stash('xywh'); - elementModel.xywh = '[10,10,200,200]'; - - expect(elementModel['_stashed'].has('xywh')).toBe(false); - - elementModel.pop('xywh'); - - expect(elementModel['_stashed'].has('xywh')).toBe(false); - expect(elementModel.yMap.has('xywh')).toBe(false); - }); -}); - -describe('derive decorator', () => { - test('derived decorator should work correctly', () => { - const id = model.addElement({ - type: 'brush', - points: [ - [0, 0], - [100, 100], - [120, 150], - ], - }); - const elementModel = model.getElementById(id)! as BrushElementModel; - - expect(elementModel.w).toBe(120 + elementModel.lineWidth); - expect(elementModel.h).toBe(150 + elementModel.lineWidth); - }); -}); - -describe('local decorator', () => { - test('local decorator should work correctly', () => { - const id = model.addElement({ - type: 'shape', - }); - const elementModel = model.getElementById(id)! as BrushElementModel; - - expect(elementModel.display).toBe(true); - - elementModel.display = false; - expect(elementModel.display).toBe(false); - - elementModel.opacity = 0.5; - expect(elementModel.opacity).toBe(0.5); - }); - - test('assign local property should emit event', () => { - const id = model.addElement({ - type: 'shape', - }); - const elementModel = model.getElementById(id)! as BrushElementModel; - - const onchange = vi.fn(); - - const subscription = model.elementUpdated.subscribe(({ id }) => { - subscription.unsubscribe(); - onchange(id); - }); - elementModel.display = false; - - expect(elementModel.display).toBe(false); - expect(onchange).toHaveBeenCalledWith(id); - }); -}); - -describe('convert decorator', () => { - test('convert decorator', () => { - const id = model.addElement({ - type: 'brush', - points: [ - [50, 25], - [200, 200], - [300, 300], - ], - }); - const elementModel = model.getElementById(id)! as BrushElementModel; - const halfLineWidth = elementModel.lineWidth / 2; - const xOffset = 50 - halfLineWidth; - const yOffset = 25 - halfLineWidth; - - expect(elementModel.points).toEqual([ - [50 - xOffset, 25 - yOffset], - [200 - xOffset, 200 - yOffset], - [300 - xOffset, 300 - yOffset], - ]); - }); -}); - -describe('basic property', () => { - test('empty group should have all zero xywh', () => { - const id = model.addElement({ - type: 'group', - }); - const group = model.getElementById(id)! as GroupElementModel; - - expect(group.x).toBe(0); - expect(group.y).toBe(0); - expect(group.w).toBe(0); - expect(group.h).toBe(0); - }); -}); - describe('brush', () => { test('same lineWidth should have same xywh', () => { const id = model.addElement({ diff --git a/packages/integration-test/src/__tests__/main/snapshot.spec.ts b/packages/integration-test/src/__tests__/main/snapshot.spec.ts index 632094634f09..5674e194a2a4 100644 --- a/packages/integration-test/src/__tests__/main/snapshot.spec.ts +++ b/packages/integration-test/src/__tests__/main/snapshot.spec.ts @@ -1,6 +1,6 @@ -import { ZipTransformer } from '@blocksuite/affine/blocks/root'; import type { SurfaceBlockModel } from '@blocksuite/affine/blocks/surface'; import { AffineSchemas } from '@blocksuite/affine/schemas'; +import { ZipTransformer } from '@blocksuite/affine/widgets/linked-doc'; import type { PointLocation } from '@blocksuite/global/gfx'; import { Schema } from '@blocksuite/store'; import { beforeEach, expect, test } from 'vitest'; diff --git a/packages/integration-test/src/__tests__/utils/renderer-entry.ts b/packages/integration-test/src/__tests__/utils/renderer-entry.ts index 182cc55be266..d8ceea9bbe44 100644 --- a/packages/integration-test/src/__tests__/utils/renderer-entry.ts +++ b/packages/integration-test/src/__tests__/utils/renderer-entry.ts @@ -1,3 +1,5 @@ +import { ImageLayoutHandlerExtension } from '@blocksuite/affine/blocks/image'; +import { ListLayoutHandlerExtension } from '@blocksuite/affine/blocks/list'; import { ParagraphLayoutHandlerExtension } from '@blocksuite/affine/blocks/paragraph'; import { TurboRendererConfigFactory, @@ -11,6 +13,8 @@ import { createPainterWorker, setupEditor } from './setup.js'; async function init() { setupEditor('edgeless', [ ParagraphLayoutHandlerExtension, + ListLayoutHandlerExtension, + ImageLayoutHandlerExtension, TurboRendererConfigFactory({ painterWorkerEntry: createPainterWorker, }), diff --git a/packages/integration-test/src/__tests__/utils/setup.ts b/packages/integration-test/src/__tests__/utils/setup.ts index 660f2b30aba5..f24a8e19de70 100644 --- a/packages/integration-test/src/__tests__/utils/setup.ts +++ b/packages/integration-test/src/__tests__/utils/setup.ts @@ -103,7 +103,7 @@ async function createEditor( export function createPainterWorker() { const worker = new Worker( - new URL('./turbo-painter-entry.worker.ts', import.meta.url), + new URL('./turbo-painter.worker.ts', import.meta.url), { type: 'module', } diff --git a/packages/integration-test/src/__tests__/utils/turbo-painter-entry.worker.ts b/packages/integration-test/src/__tests__/utils/turbo-painter-entry.worker.ts deleted file mode 100644 index 58bc63fb1bf4..000000000000 --- a/packages/integration-test/src/__tests__/utils/turbo-painter-entry.worker.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { ParagraphLayoutPainterExtension } from '@blocksuite/affine-block-paragraph/turbo-painter'; -import { ViewportLayoutPainter } from '@blocksuite/affine-gfx-turbo-renderer/painter'; - -new ViewportLayoutPainter([ParagraphLayoutPainterExtension]); diff --git a/packages/integration-test/src/__tests__/utils/turbo-painter.worker.ts b/packages/integration-test/src/__tests__/utils/turbo-painter.worker.ts new file mode 100644 index 000000000000..08b49680befa --- /dev/null +++ b/packages/integration-test/src/__tests__/utils/turbo-painter.worker.ts @@ -0,0 +1,12 @@ +import { ImageLayoutPainterExtension } from '@blocksuite/affine-block-image/turbo-painter'; +import { ListLayoutPainterExtension } from '@blocksuite/affine-block-list/turbo-painter'; +import { NoteLayoutPainterExtension } from '@blocksuite/affine-block-note/turbo-painter'; +import { ParagraphLayoutPainterExtension } from '@blocksuite/affine-block-paragraph/turbo-painter'; +import { ViewportLayoutPainter } from '@blocksuite/affine-gfx-turbo-renderer/painter'; + +new ViewportLayoutPainter([ + ParagraphLayoutPainterExtension, + ListLayoutPainterExtension, + NoteLayoutPainterExtension, + ImageLayoutPainterExtension, +]); diff --git a/packages/playground/apps/_common/components/starter-debug-menu.ts b/packages/playground/apps/_common/components/starter-debug-menu.ts index b1658c0205d1..50eaf7bb324f 100644 --- a/packages/playground/apps/_common/components/starter-debug-menu.ts +++ b/packages/playground/apps/_common/components/starter-debug-menu.ts @@ -17,14 +17,6 @@ import '@shoelace-style/shoelace/dist/themes/dark.css'; import './left-side-panel.js'; import { defaultImageProxyMiddleware } from '@blocksuite/affine/blocks/image'; -import { - createAssetsArchive, - download, - HtmlTransformer, - MarkdownTransformer, - NotionHtmlTransformer, - ZipTransformer, -} from '@blocksuite/affine/blocks/root'; import { ExportManager } from '@blocksuite/affine/blocks/surface'; import { toast } from '@blocksuite/affine/components/toast'; import { @@ -55,6 +47,14 @@ import { Text, type Workspace, } from '@blocksuite/affine/store'; +import { + createAssetsArchive, + download, + HtmlTransformer, + MarkdownTransformer, + NotionHtmlTransformer, + ZipTransformer, +} from '@blocksuite/affine/widgets/linked-doc'; import { NotionHtmlAdapter } from '@blocksuite/affine-shared/adapters'; import type { AffineTextAttributes } from '@blocksuite/affine-shared/types'; import { TestAffineEditorContainer } from '@blocksuite/integration-test'; diff --git a/packages/playground/apps/starter/data/affine-snapshot.ts b/packages/playground/apps/starter/data/affine-snapshot.ts index 7cb2ea51339f..a95ce83c30c8 100644 --- a/packages/playground/apps/starter/data/affine-snapshot.ts +++ b/packages/playground/apps/starter/data/affine-snapshot.ts @@ -1,6 +1,6 @@ -import { ZipTransformer } from '@blocksuite/affine/blocks/root'; import { AffineSchemas } from '@blocksuite/affine/schemas'; import { Schema, Text, type Workspace } from '@blocksuite/affine/store'; +import { ZipTransformer } from '@blocksuite/affine/widgets/linked-doc'; export async function affineSnapshot(collection: Workspace, id: string) { const doc = collection.createDoc(id); doc.load(); diff --git a/packages/playground/apps/starter/data/preset.ts b/packages/playground/apps/starter/data/preset.ts index 833a5a395e7e..385a7cb61c64 100644 --- a/packages/playground/apps/starter/data/preset.ts +++ b/packages/playground/apps/starter/data/preset.ts @@ -1,5 +1,5 @@ -import { MarkdownTransformer } from '@blocksuite/affine/blocks/root'; import { Text, type Workspace } from '@blocksuite/affine/store'; +import { MarkdownTransformer } from '@blocksuite/affine/widgets/linked-doc'; import type { InitFn } from './utils.js'; diff --git a/packages/playground/apps/starter/data/synced.ts b/packages/playground/apps/starter/data/synced.ts index b3d8ca12ad54..b8bc3c4c3208 100644 --- a/packages/playground/apps/starter/data/synced.ts +++ b/packages/playground/apps/starter/data/synced.ts @@ -1,5 +1,5 @@ -import { MarkdownTransformer } from '@blocksuite/affine/blocks/root'; import { Text, type Workspace } from '@blocksuite/affine/store'; +import { MarkdownTransformer } from '@blocksuite/affine/widgets/linked-doc'; import type { InitFn } from './utils'; diff --git a/packages/playground/examples/inline/test-page.ts b/packages/playground/examples/inline/test-page.ts index 626a27854a88..062730aa73f7 100644 --- a/packages/playground/examples/inline/test-page.ts +++ b/packages/playground/examples/inline/test-page.ts @@ -5,7 +5,7 @@ import { effects } from '@blocksuite/affine/std/effects'; import { type AttributeRenderer, InlineEditor, - ZERO_WIDTH_NON_JOINER, + ZERO_WIDTH_FOR_EMBED_NODE, } from '@blocksuite/affine/std/inline'; import { type BaseTextAttributes, @@ -62,7 +62,7 @@ const attributeRenderer: AttributeRenderer = ({ delta, selected }) => { border: selected ? '1px solid #eb763a' : '', background: 'rgba(135,131,120,0.15)', })} - >@flrande@flrande`; } @@ -227,6 +227,13 @@ export class CustomToolbar extends ShadowlessElement { } `; + override connectedCallback() { + super.connectedCallback(); + this.addEventListener('pointerdown', e => { + e.preventDefault(); + }); + } + override firstUpdated() { const boldButton = this.querySelector('.bold'); const italicButton = this.querySelector('.italic'); From e58853eff07faa9af07dafdacf698f1762c417f6 Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Mon, 14 Apr 2025 08:45:57 +0800 Subject: [PATCH 2/2] chore: update lock --- yarn.lock | 150 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 90 insertions(+), 60 deletions(-) diff --git a/yarn.lock b/yarn.lock index d8c215b0194e..a49a86d319ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -459,9 +459,9 @@ __metadata: languageName: node linkType: hard -"@blocksuite/affine-block-attachment@workspace:*, @blocksuite/affine-block-attachment@workspace:packages/affine/blocks/block-attachment": +"@blocksuite/affine-block-attachment@workspace:*, @blocksuite/affine-block-attachment@workspace:packages/affine/blocks/attachment": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-attachment@workspace:packages/affine/blocks/block-attachment" + resolution: "@blocksuite/affine-block-attachment@workspace:packages/affine/blocks/attachment" dependencies: "@blocksuite/affine-block-embed": "workspace:*" "@blocksuite/affine-block-surface": "workspace:*" @@ -485,9 +485,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-bookmark@workspace:*, @blocksuite/affine-block-bookmark@workspace:packages/affine/blocks/block-bookmark": +"@blocksuite/affine-block-bookmark@workspace:*, @blocksuite/affine-block-bookmark@workspace:packages/affine/blocks/bookmark": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-bookmark@workspace:packages/affine/blocks/block-bookmark" + resolution: "@blocksuite/affine-block-bookmark@workspace:packages/affine/blocks/bookmark" dependencies: "@blocksuite/affine-block-embed": "workspace:*" "@blocksuite/affine-block-surface": "workspace:*" @@ -510,9 +510,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-callout@workspace:*, @blocksuite/affine-block-callout@workspace:packages/affine/blocks/block-callout": +"@blocksuite/affine-block-callout@workspace:*, @blocksuite/affine-block-callout@workspace:packages/affine/blocks/callout": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-callout@workspace:packages/affine/blocks/block-callout" + resolution: "@blocksuite/affine-block-callout@workspace:packages/affine/blocks/callout" dependencies: "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-inline-preset": "workspace:*" @@ -538,11 +538,12 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-code@workspace:*, @blocksuite/affine-block-code@workspace:packages/affine/blocks/block-code": +"@blocksuite/affine-block-code@workspace:*, @blocksuite/affine-block-code@workspace:packages/affine/blocks/code": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-code@workspace:packages/affine/blocks/block-code" + resolution: "@blocksuite/affine-block-code@workspace:packages/affine/blocks/code" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-gfx-turbo-renderer": "workspace:*" "@blocksuite/affine-inline-latex": "workspace:*" "@blocksuite/affine-inline-link": "workspace:*" "@blocksuite/affine-inline-preset": "workspace:*" @@ -567,9 +568,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-data-view@workspace:*, @blocksuite/affine-block-data-view@workspace:packages/affine/blocks/block-data-view": +"@blocksuite/affine-block-data-view@workspace:*, @blocksuite/affine-block-data-view@workspace:packages/affine/blocks/data-view": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-data-view@workspace:packages/affine/blocks/block-data-view" + resolution: "@blocksuite/affine-block-data-view@workspace:packages/affine/blocks/data-view" dependencies: "@blocksuite/affine-block-database": "workspace:*" "@blocksuite/affine-components": "workspace:*" @@ -593,9 +594,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-database@workspace:*, @blocksuite/affine-block-database@workspace:packages/affine/blocks/block-database": +"@blocksuite/affine-block-database@workspace:*, @blocksuite/affine-block-database@workspace:packages/affine/blocks/database": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-database@workspace:packages/affine/blocks/block-database" + resolution: "@blocksuite/affine-block-database@workspace:packages/affine/blocks/database" dependencies: "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-inline-preset": "workspace:*" @@ -625,9 +626,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-divider@workspace:*, @blocksuite/affine-block-divider@workspace:packages/affine/blocks/block-divider": +"@blocksuite/affine-block-divider@workspace:*, @blocksuite/affine-block-divider@workspace:packages/affine/blocks/divider": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-divider@workspace:packages/affine/blocks/block-divider" + resolution: "@blocksuite/affine-block-divider@workspace:packages/affine/blocks/divider" dependencies: "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-model": "workspace:*" @@ -647,9 +648,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-edgeless-text@workspace:*, @blocksuite/affine-block-edgeless-text@workspace:packages/affine/blocks/block-edgeless-text": +"@blocksuite/affine-block-edgeless-text@workspace:*, @blocksuite/affine-block-edgeless-text@workspace:packages/affine/blocks/edgeless-text": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-edgeless-text@workspace:packages/affine/blocks/block-edgeless-text" + resolution: "@blocksuite/affine-block-edgeless-text@workspace:packages/affine/blocks/edgeless-text" dependencies: "@blocksuite/affine-block-surface": "workspace:*" "@blocksuite/affine-components": "workspace:*" @@ -674,9 +675,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-embed@workspace:*, @blocksuite/affine-block-embed@workspace:packages/affine/blocks/block-embed": +"@blocksuite/affine-block-embed@workspace:*, @blocksuite/affine-block-embed@workspace:packages/affine/blocks/embed": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-embed@workspace:packages/affine/blocks/block-embed" + resolution: "@blocksuite/affine-block-embed@workspace:packages/affine/blocks/embed" dependencies: "@blocksuite/affine-block-surface": "workspace:*" "@blocksuite/affine-components": "workspace:*" @@ -704,9 +705,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-frame@workspace:*, @blocksuite/affine-block-frame@workspace:packages/affine/blocks/block-frame": +"@blocksuite/affine-block-frame@workspace:*, @blocksuite/affine-block-frame@workspace:packages/affine/blocks/frame": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-frame@workspace:packages/affine/blocks/block-frame" + resolution: "@blocksuite/affine-block-frame@workspace:packages/affine/blocks/frame" dependencies: "@blocksuite/affine-block-surface": "workspace:*" "@blocksuite/affine-components": "workspace:*" @@ -731,13 +732,14 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-image@workspace:*, @blocksuite/affine-block-image@workspace:packages/affine/blocks/block-image": +"@blocksuite/affine-block-image@workspace:*, @blocksuite/affine-block-image@workspace:packages/affine/blocks/image": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-image@workspace:packages/affine/blocks/block-image" + resolution: "@blocksuite/affine-block-image@workspace:packages/affine/blocks/image" dependencies: "@blocksuite/affine-block-note": "workspace:*" "@blocksuite/affine-block-surface": "workspace:*" "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-gfx-turbo-renderer": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-shared": "workspace:*" "@blocksuite/affine-widget-slash-menu": "workspace:*" @@ -757,9 +759,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-latex@workspace:*, @blocksuite/affine-block-latex@workspace:packages/affine/blocks/block-latex": +"@blocksuite/affine-block-latex@workspace:*, @blocksuite/affine-block-latex@workspace:packages/affine/blocks/latex": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-latex@workspace:packages/affine/blocks/block-latex" + resolution: "@blocksuite/affine-block-latex@workspace:packages/affine/blocks/latex" dependencies: "@blocksuite/affine-block-note": "workspace:*" "@blocksuite/affine-components": "workspace:*" @@ -787,9 +789,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-list@workspace:*, @blocksuite/affine-block-list@workspace:packages/affine/blocks/block-list": +"@blocksuite/affine-block-list@workspace:*, @blocksuite/affine-block-list@workspace:packages/affine/blocks/list": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-list@workspace:packages/affine/blocks/block-list" + resolution: "@blocksuite/affine-block-list@workspace:packages/affine/blocks/list" dependencies: "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-gfx-turbo-renderer": "workspace:*" @@ -814,14 +816,15 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-note@workspace:*, @blocksuite/affine-block-note@workspace:packages/affine/blocks/block-note": +"@blocksuite/affine-block-note@workspace:*, @blocksuite/affine-block-note@workspace:packages/affine/blocks/note": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-note@workspace:packages/affine/blocks/block-note" + resolution: "@blocksuite/affine-block-note@workspace:packages/affine/blocks/note" dependencies: "@blocksuite/affine-block-embed": "workspace:*" "@blocksuite/affine-block-surface": "workspace:*" "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-fragment-doc-title": "workspace:*" + "@blocksuite/affine-gfx-turbo-renderer": "workspace:*" "@blocksuite/affine-inline-preset": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" @@ -845,9 +848,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-paragraph@workspace:*, @blocksuite/affine-block-paragraph@workspace:packages/affine/blocks/block-paragraph": +"@blocksuite/affine-block-paragraph@workspace:*, @blocksuite/affine-block-paragraph@workspace:packages/affine/blocks/paragraph": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-paragraph@workspace:packages/affine/blocks/block-paragraph" + resolution: "@blocksuite/affine-block-paragraph@workspace:packages/affine/blocks/paragraph" dependencies: "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-gfx-turbo-renderer": "workspace:*" @@ -870,9 +873,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-root@workspace:*, @blocksuite/affine-block-root@workspace:packages/affine/blocks/block-root": +"@blocksuite/affine-block-root@workspace:*, @blocksuite/affine-block-root@workspace:packages/affine/blocks/root": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-root@workspace:packages/affine/blocks/block-root" + resolution: "@blocksuite/affine-block-root@workspace:packages/affine/blocks/root" dependencies: "@blocksuite/affine-block-attachment": "workspace:*" "@blocksuite/affine-block-bookmark": "workspace:*" @@ -910,6 +913,7 @@ __metadata: "@blocksuite/affine-widget-edgeless-auto-connect": "workspace:*" "@blocksuite/affine-widget-edgeless-toolbar": "workspace:*" "@blocksuite/affine-widget-frame-title": "workspace:*" + "@blocksuite/affine-widget-linked-doc": "workspace:*" "@blocksuite/affine-widget-remote-selection": "workspace:*" "@blocksuite/affine-widget-scroll-anchoring": "workspace:*" "@blocksuite/affine-widget-slash-menu": "workspace:*" @@ -939,9 +943,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-surface-ref@workspace:*, @blocksuite/affine-block-surface-ref@workspace:packages/affine/blocks/block-surface-ref": +"@blocksuite/affine-block-surface-ref@workspace:*, @blocksuite/affine-block-surface-ref@workspace:packages/affine/blocks/surface-ref": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-surface-ref@workspace:packages/affine/blocks/block-surface-ref" + resolution: "@blocksuite/affine-block-surface-ref@workspace:packages/affine/blocks/surface-ref" dependencies: "@blocksuite/affine-block-frame": "workspace:*" "@blocksuite/affine-block-surface": "workspace:*" @@ -968,9 +972,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-surface@workspace:*, @blocksuite/affine-block-surface@workspace:packages/affine/blocks/block-surface": +"@blocksuite/affine-block-surface@workspace:*, @blocksuite/affine-block-surface@workspace:packages/affine/blocks/surface": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-surface@workspace:packages/affine/blocks/block-surface" + resolution: "@blocksuite/affine-block-surface@workspace:packages/affine/blocks/surface" dependencies: "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-model": "workspace:*" @@ -996,9 +1000,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-block-table@workspace:*, @blocksuite/affine-block-table@workspace:packages/affine/blocks/block-table": +"@blocksuite/affine-block-table@workspace:*, @blocksuite/affine-block-table@workspace:packages/affine/blocks/table": version: 0.0.0-use.local - resolution: "@blocksuite/affine-block-table@workspace:packages/affine/blocks/block-table" + resolution: "@blocksuite/affine-block-table@workspace:packages/affine/blocks/table" dependencies: "@atlaskit/pragmatic-drag-and-drop": "npm:^1.4.0" "@blocksuite/affine-components": "workspace:*" @@ -1055,9 +1059,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-fragment-doc-title@workspace:*, @blocksuite/affine-fragment-doc-title@workspace:packages/affine/fragments/fragment-doc-title": +"@blocksuite/affine-fragment-doc-title@workspace:*, @blocksuite/affine-fragment-doc-title@workspace:packages/affine/fragments/doc-title": version: 0.0.0-use.local - resolution: "@blocksuite/affine-fragment-doc-title@workspace:packages/affine/fragments/fragment-doc-title" + resolution: "@blocksuite/affine-fragment-doc-title@workspace:packages/affine/fragments/doc-title" dependencies: "@blocksuite/affine-block-frame": "workspace:*" "@blocksuite/affine-block-surface": "workspace:*" @@ -1080,9 +1084,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-fragment-frame-panel@workspace:*, @blocksuite/affine-fragment-frame-panel@workspace:packages/affine/fragments/fragment-frame-panel": +"@blocksuite/affine-fragment-frame-panel@workspace:*, @blocksuite/affine-fragment-frame-panel@workspace:packages/affine/fragments/frame-panel": version: 0.0.0-use.local - resolution: "@blocksuite/affine-fragment-frame-panel@workspace:packages/affine/fragments/fragment-frame-panel" + resolution: "@blocksuite/affine-fragment-frame-panel@workspace:packages/affine/fragments/frame-panel" dependencies: "@blocksuite/affine-block-frame": "workspace:*" "@blocksuite/affine-block-surface": "workspace:*" @@ -1107,9 +1111,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-fragment-outline@workspace:*, @blocksuite/affine-fragment-outline@workspace:packages/affine/fragments/fragment-outline": +"@blocksuite/affine-fragment-outline@workspace:*, @blocksuite/affine-fragment-outline@workspace:packages/affine/fragments/outline": version: 0.0.0-use.local - resolution: "@blocksuite/affine-fragment-outline@workspace:packages/affine/fragments/fragment-outline" + resolution: "@blocksuite/affine-fragment-outline@workspace:packages/affine/fragments/outline" dependencies: "@blocksuite/affine-block-note": "workspace:*" "@blocksuite/affine-components": "workspace:*" @@ -1647,9 +1651,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-widget-drag-handle@workspace:*, @blocksuite/affine-widget-drag-handle@workspace:packages/affine/widgets/widget-drag-handle": +"@blocksuite/affine-widget-drag-handle@workspace:*, @blocksuite/affine-widget-drag-handle@workspace:packages/affine/widgets/drag-handle": version: 0.0.0-use.local - resolution: "@blocksuite/affine-widget-drag-handle@workspace:packages/affine/widgets/widget-drag-handle" + resolution: "@blocksuite/affine-widget-drag-handle@workspace:packages/affine/widgets/drag-handle" dependencies: "@blocksuite/affine-block-callout": "workspace:*" "@blocksuite/affine-block-embed": "workspace:*" @@ -1677,9 +1681,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-widget-edgeless-auto-connect@workspace:*, @blocksuite/affine-widget-edgeless-auto-connect@workspace:packages/affine/widgets/widget-edgeless-auto-connect": +"@blocksuite/affine-widget-edgeless-auto-connect@workspace:*, @blocksuite/affine-widget-edgeless-auto-connect@workspace:packages/affine/widgets/edgeless-auto-connect": version: 0.0.0-use.local - resolution: "@blocksuite/affine-widget-edgeless-auto-connect@workspace:packages/affine/widgets/widget-edgeless-auto-connect" + resolution: "@blocksuite/affine-widget-edgeless-auto-connect@workspace:packages/affine/widgets/edgeless-auto-connect" dependencies: "@blocksuite/affine-block-note": "workspace:*" "@blocksuite/affine-block-surface": "workspace:*" @@ -1696,9 +1700,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-widget-edgeless-toolbar@workspace:*, @blocksuite/affine-widget-edgeless-toolbar@workspace:packages/affine/widgets/widget-edgeless-toolbar": +"@blocksuite/affine-widget-edgeless-toolbar@workspace:*, @blocksuite/affine-widget-edgeless-toolbar@workspace:packages/affine/widgets/edgeless-toolbar": version: 0.0.0-use.local - resolution: "@blocksuite/affine-widget-edgeless-toolbar@workspace:packages/affine/widgets/widget-edgeless-toolbar" + resolution: "@blocksuite/affine-widget-edgeless-toolbar@workspace:packages/affine/widgets/edgeless-toolbar" dependencies: "@blocksuite/affine-block-surface": "workspace:*" "@blocksuite/affine-components": "workspace:*" @@ -1719,27 +1723,52 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-widget-frame-title@workspace:*, @blocksuite/affine-widget-frame-title@workspace:packages/affine/widgets/widget-frame-title": +"@blocksuite/affine-widget-frame-title@workspace:*, @blocksuite/affine-widget-frame-title@workspace:packages/affine/widgets/frame-title": + version: 0.0.0-use.local + resolution: "@blocksuite/affine-widget-frame-title@workspace:packages/affine/widgets/frame-title" + dependencies: + "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-model": "workspace:*" + "@blocksuite/affine-rich-text": "workspace:*" + "@blocksuite/affine-shared": "workspace:*" + "@blocksuite/global": "workspace:*" + "@blocksuite/std": "workspace:*" + "@lit/context": "npm:^1.1.2" + "@preact/signals-core": "npm:^1.8.0" + "@toeverything/theme": "npm:^1.1.12" + lit: "npm:^3.2.0" + rxjs: "npm:^7.8.1" + languageName: unknown + linkType: soft + +"@blocksuite/affine-widget-linked-doc@workspace:*, @blocksuite/affine-widget-linked-doc@workspace:packages/affine/widgets/linked-doc": version: 0.0.0-use.local - resolution: "@blocksuite/affine-widget-frame-title@workspace:packages/affine/widgets/widget-frame-title" + resolution: "@blocksuite/affine-widget-linked-doc@workspace:packages/affine/widgets/linked-doc" dependencies: + "@blocksuite/affine-block-image": "workspace:*" "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-inline-reference": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*" "@blocksuite/global": "workspace:*" + "@blocksuite/icons": "npm:^2.2.10" "@blocksuite/std": "workspace:*" + "@blocksuite/store": "workspace:*" "@lit/context": "npm:^1.1.2" "@preact/signals-core": "npm:^1.8.0" "@toeverything/theme": "npm:^1.1.12" + "@types/lodash-es": "npm:^4.17.12" + fflate: "npm:^0.8.2" lit: "npm:^3.2.0" + lodash-es: "npm:^4.17.21" rxjs: "npm:^7.8.1" languageName: unknown linkType: soft -"@blocksuite/affine-widget-remote-selection@workspace:*, @blocksuite/affine-widget-remote-selection@workspace:packages/affine/widgets/widget-remote-selection": +"@blocksuite/affine-widget-remote-selection@workspace:*, @blocksuite/affine-widget-remote-selection@workspace:packages/affine/widgets/remote-selection": version: 0.0.0-use.local - resolution: "@blocksuite/affine-widget-remote-selection@workspace:packages/affine/widgets/widget-remote-selection" + resolution: "@blocksuite/affine-widget-remote-selection@workspace:packages/affine/widgets/remote-selection" dependencies: "@blocksuite/affine-block-surface": "workspace:*" "@blocksuite/affine-components": "workspace:*" @@ -1757,9 +1786,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-widget-scroll-anchoring@workspace:*, @blocksuite/affine-widget-scroll-anchoring@workspace:packages/affine/widgets/widget-scroll-anchoring": +"@blocksuite/affine-widget-scroll-anchoring@workspace:*, @blocksuite/affine-widget-scroll-anchoring@workspace:packages/affine/widgets/scroll-anchoring": version: 0.0.0-use.local - resolution: "@blocksuite/affine-widget-scroll-anchoring@workspace:packages/affine/widgets/widget-scroll-anchoring" + resolution: "@blocksuite/affine-widget-scroll-anchoring@workspace:packages/affine/widgets/scroll-anchoring" dependencies: "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-shared": "workspace:*" @@ -1772,9 +1801,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-widget-slash-menu@workspace:*, @blocksuite/affine-widget-slash-menu@workspace:packages/affine/widgets/widget-slash-menu": +"@blocksuite/affine-widget-slash-menu@workspace:*, @blocksuite/affine-widget-slash-menu@workspace:packages/affine/widgets/slash-menu": version: 0.0.0-use.local - resolution: "@blocksuite/affine-widget-slash-menu@workspace:packages/affine/widgets/widget-slash-menu" + resolution: "@blocksuite/affine-widget-slash-menu@workspace:packages/affine/widgets/slash-menu" dependencies: "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" @@ -1793,9 +1822,9 @@ __metadata: languageName: unknown linkType: soft -"@blocksuite/affine-widget-toolbar@workspace:*, @blocksuite/affine-widget-toolbar@workspace:packages/affine/widgets/widget-toolbar": +"@blocksuite/affine-widget-toolbar@workspace:*, @blocksuite/affine-widget-toolbar@workspace:packages/affine/widgets/toolbar": version: 0.0.0-use.local - resolution: "@blocksuite/affine-widget-toolbar@workspace:packages/affine/widgets/widget-toolbar" + resolution: "@blocksuite/affine-widget-toolbar@workspace:packages/affine/widgets/toolbar" dependencies: "@blocksuite/affine-block-database": "workspace:*" "@blocksuite/affine-block-surface": "workspace:*" @@ -1870,6 +1899,7 @@ __metadata: "@blocksuite/affine-widget-edgeless-auto-connect": "workspace:*" "@blocksuite/affine-widget-edgeless-toolbar": "workspace:*" "@blocksuite/affine-widget-frame-title": "workspace:*" + "@blocksuite/affine-widget-linked-doc": "workspace:*" "@blocksuite/affine-widget-remote-selection": "workspace:*" "@blocksuite/affine-widget-scroll-anchoring": "workspace:*" "@blocksuite/affine-widget-slash-menu": "workspace:*"