From b66d2d58a18b3455b1eea2506011b5e07346fa1f Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Thu, 24 Apr 2025 09:47:35 +0000 Subject: [PATCH] feat(editor): surface block extension (#11961) Closes: BS-3204 --- blocksuite/affine/all/package.json | 4 +- .../blocks/{surface.ts => surface/index.ts} | 0 .../affine/all/src/blocks/surface/store.ts | 1 + .../affine/all/src/blocks/surface/view.ts | 1 + .../affine/all/src/extensions/effects.ts | 2 - .../all/src/extensions/migrating-store.ts | 2 - .../affine/all/src/extensions/migrating.ts | 30 ++------------ blocksuite/affine/all/src/extensions/store.ts | 2 + blocksuite/affine/all/src/extensions/view.ts | 2 + blocksuite/affine/blocks/surface/package.json | 5 ++- blocksuite/affine/blocks/surface/src/store.ts | 17 ++++++++ blocksuite/affine/blocks/surface/src/view.ts | 41 +++++++++++++++++++ .../affine/blocks/surface/tsconfig.json | 1 + tools/utils/src/workspace.gen.ts | 1 + yarn.lock | 1 + 15 files changed, 78 insertions(+), 32 deletions(-) rename blocksuite/affine/all/src/blocks/{surface.ts => surface/index.ts} (100%) create mode 100644 blocksuite/affine/all/src/blocks/surface/store.ts create mode 100644 blocksuite/affine/all/src/blocks/surface/view.ts create mode 100644 blocksuite/affine/blocks/surface/src/store.ts create mode 100644 blocksuite/affine/blocks/surface/src/view.ts diff --git a/blocksuite/affine/all/package.json b/blocksuite/affine/all/package.json index e07a7d5fd9..942b36c2ef 100644 --- a/blocksuite/affine/all/package.json +++ b/blocksuite/affine/all/package.json @@ -134,7 +134,9 @@ "./blocks/paragraph/store": "./src/blocks/paragraph/store.ts", "./blocks/paragraph/view": "./src/blocks/paragraph/view.ts", "./blocks/root": "./src/blocks/root.ts", - "./blocks/surface": "./src/blocks/surface.ts", + "./blocks/surface": "./src/blocks/surface/index.ts", + "./blocks/surface/store": "./src/blocks/surface/store.ts", + "./blocks/surface/view": "./src/blocks/surface/view.ts", "./blocks/surface-ref": "./src/blocks/surface-ref/index.ts", "./blocks/surface-ref/store": "./src/blocks/surface-ref/store.ts", "./blocks/surface-ref/view": "./src/blocks/surface-ref/view.ts", diff --git a/blocksuite/affine/all/src/blocks/surface.ts b/blocksuite/affine/all/src/blocks/surface/index.ts similarity index 100% rename from blocksuite/affine/all/src/blocks/surface.ts rename to blocksuite/affine/all/src/blocks/surface/index.ts diff --git a/blocksuite/affine/all/src/blocks/surface/store.ts b/blocksuite/affine/all/src/blocks/surface/store.ts new file mode 100644 index 0000000000..8f6d114814 --- /dev/null +++ b/blocksuite/affine/all/src/blocks/surface/store.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-block-surface/store'; diff --git a/blocksuite/affine/all/src/blocks/surface/view.ts b/blocksuite/affine/all/src/blocks/surface/view.ts new file mode 100644 index 0000000000..ea1df9ea9d --- /dev/null +++ b/blocksuite/affine/all/src/blocks/surface/view.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-block-surface/view'; diff --git a/blocksuite/affine/all/src/extensions/effects.ts b/blocksuite/affine/all/src/extensions/effects.ts index 68430248c9..00da3a5875 100644 --- a/blocksuite/affine/all/src/extensions/effects.ts +++ b/blocksuite/affine/all/src/extensions/effects.ts @@ -1,5 +1,4 @@ import { effects as blockRootEffects } from '@blocksuite/affine-block-root/effects'; -import { effects as blockSurfaceEffects } from '@blocksuite/affine-block-surface/effects'; import { BlockSelection } from '@blocksuite/affine-components/block-selection'; import { BlockZeroWidth } from '@blocksuite/affine-components/block-zero-width'; import { effects as componentCaptionEffects } from '@blocksuite/affine-components/caption'; @@ -46,7 +45,6 @@ export function effects() { dataViewEffects(); richTextEffects(); - blockSurfaceEffects(); blockRootEffects(); componentCaptionEffects(); diff --git a/blocksuite/affine/all/src/extensions/migrating-store.ts b/blocksuite/affine/all/src/extensions/migrating-store.ts index dae7ad054e..32236fe04d 100644 --- a/blocksuite/affine/all/src/extensions/migrating-store.ts +++ b/blocksuite/affine/all/src/extensions/migrating-store.ts @@ -4,7 +4,6 @@ import { RootBlockMarkdownAdapterExtension, RootBlockNotionHtmlAdapterExtension, } from '@blocksuite/affine-block-root'; -import { SurfaceBlockSchemaExtension } from '@blocksuite/affine-block-surface'; import { type StoreExtensionContext, StoreExtensionProvider, @@ -69,7 +68,6 @@ function getNotionHtmlAdapterExtensions(): ExtensionType[] { const MigratingStoreExtensions: ExtensionType[] = [ RootBlockSchemaExtension, - SurfaceBlockSchemaExtension, TranscriptionBlockSchemaExtension, BlockSelectionExtension, diff --git a/blocksuite/affine/all/src/extensions/migrating.ts b/blocksuite/affine/all/src/extensions/migrating.ts index 348385a96f..2b79d2c6e4 100644 --- a/blocksuite/affine/all/src/extensions/migrating.ts +++ b/blocksuite/affine/all/src/extensions/migrating.ts @@ -5,13 +5,6 @@ import { PreviewPageRootBlockSpec, ReadOnlyClipboard, } from '@blocksuite/affine-block-root'; -import { - EdgelessSurfaceBlockAdapterExtensions, - EdgelessSurfaceBlockSpec, - PageSurfaceBlockSpec, - SurfaceBlockAdapterExtensions, -} from '@blocksuite/affine-block-surface'; -import { inlinePresetExtensions } from '@blocksuite/affine-inline-preset'; import { DefaultOpenDocExtension, DocDisplayMetaService, @@ -21,45 +14,30 @@ import { import type { ExtensionType } from '@blocksuite/store'; const CommonBlockSpecs: ExtensionType[] = [ - inlinePresetExtensions, DocDisplayMetaService, EditPropsStore, DefaultOpenDocExtension, FontLoaderService, ].flat(); -const PageFirstPartyBlockSpecs: ExtensionType[] = [ - CommonBlockSpecs, - PageSurfaceBlockSpec, - - ...SurfaceBlockAdapterExtensions, -].flat(); - -const EdgelessFirstPartyBlockSpecs: ExtensionType[] = [ - CommonBlockSpecs, - EdgelessSurfaceBlockSpec, - - ...EdgelessSurfaceBlockAdapterExtensions, -].flat(); - export const MigratingEdgelessEditorBlockSpecs: ExtensionType[] = [ EdgelessBuiltInSpecs, - EdgelessFirstPartyBlockSpecs, + CommonBlockSpecs, ].flat(); export const MigratingPageEditorBlockSpecs: ExtensionType[] = [ PageRootBlockSpec, - PageFirstPartyBlockSpecs, + CommonBlockSpecs, ].flat(); export const MigratingPreviewEdgelessEditorBlockSpecs: ExtensionType[] = [ PreviewEdgelessRootBlockSpec, - EdgelessFirstPartyBlockSpecs, + CommonBlockSpecs, ReadOnlyClipboard, ].flat(); export const MigratingPreviewPageEditorBlockSpecs: ExtensionType[] = [ PreviewPageRootBlockSpec, - PageFirstPartyBlockSpecs, + CommonBlockSpecs, ReadOnlyClipboard, ].flat(); diff --git a/blocksuite/affine/all/src/extensions/store.ts b/blocksuite/affine/all/src/extensions/store.ts index a9919566b6..00b9f4622f 100644 --- a/blocksuite/affine/all/src/extensions/store.ts +++ b/blocksuite/affine/all/src/extensions/store.ts @@ -13,6 +13,7 @@ import { LatexStoreExtension } from '@blocksuite/affine-block-latex/store'; import { ListStoreExtension } from '@blocksuite/affine-block-list/store'; import { NoteStoreExtension } from '@blocksuite/affine-block-note/store'; import { ParagraphStoreExtension } from '@blocksuite/affine-block-paragraph/store'; +import { SurfaceStoreExtension } from '@blocksuite/affine-block-surface/store'; import { SurfaceRefStoreExtension } from '@blocksuite/affine-block-surface-ref/store'; import { TableStoreExtension } from '@blocksuite/affine-block-table/store'; import { BrushStoreExtension } from '@blocksuite/affine-gfx-brush/store'; @@ -48,6 +49,7 @@ export function getInternalStoreExtensions() { ParagraphStoreExtension, SurfaceRefStoreExtension, TableStoreExtension, + SurfaceStoreExtension, FootnoteStoreExtension, LinkStoreExtension, diff --git a/blocksuite/affine/all/src/extensions/view.ts b/blocksuite/affine/all/src/extensions/view.ts index 7d0b40e347..586e34832a 100644 --- a/blocksuite/affine/all/src/extensions/view.ts +++ b/blocksuite/affine/all/src/extensions/view.ts @@ -13,6 +13,7 @@ import { LatexViewExtension } from '@blocksuite/affine-block-latex/view'; import { ListViewExtension } from '@blocksuite/affine-block-list/view'; import { NoteViewExtension } from '@blocksuite/affine-block-note/view'; import { ParagraphViewExtension } from '@blocksuite/affine-block-paragraph/view'; +import { SurfaceViewExtension } from '@blocksuite/affine-block-surface/view'; import { SurfaceRefViewExtension } from '@blocksuite/affine-block-surface-ref/view'; import { TableViewExtension } from '@blocksuite/affine-block-table/view'; import { BrushViewExtension } from '@blocksuite/affine-gfx-brush/view'; @@ -62,6 +63,7 @@ export function getInternalViewExtensions() { ParagraphViewExtension, SurfaceRefViewExtension, TableViewExtension, + SurfaceViewExtension, // Inline FootnoteViewExtension, diff --git a/blocksuite/affine/blocks/surface/package.json b/blocksuite/affine/blocks/surface/package.json index dfa125c585..0050cbd2d0 100644 --- a/blocksuite/affine/blocks/surface/package.json +++ b/blocksuite/affine/blocks/surface/package.json @@ -11,6 +11,7 @@ "license": "MIT", "dependencies": { "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-ext-loader": "workspace:*", "@blocksuite/affine-model": "workspace:*", "@blocksuite/affine-rich-text": "workspace:*", "@blocksuite/affine-shared": "workspace:*", @@ -36,7 +37,9 @@ }, "exports": { ".": "./src/index.ts", - "./effects": "./src/effects.ts" + "./effects": "./src/effects.ts", + "./store": "./src/store.ts", + "./view": "./src/view.ts" }, "files": [ "src", diff --git a/blocksuite/affine/blocks/surface/src/store.ts b/blocksuite/affine/blocks/surface/src/store.ts new file mode 100644 index 0000000000..ade81d7d9d --- /dev/null +++ b/blocksuite/affine/blocks/surface/src/store.ts @@ -0,0 +1,17 @@ +import { + type StoreExtensionContext, + StoreExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { EdgelessSurfaceBlockAdapterExtensions } from './adapters'; +import { SurfaceBlockSchemaExtension } from './surface-model'; + +export class SurfaceStoreExtension extends StoreExtensionProvider { + override name = 'affine-surface-block'; + + override setup(context: StoreExtensionContext) { + super.setup(context); + context.register(SurfaceBlockSchemaExtension); + context.register(EdgelessSurfaceBlockAdapterExtensions); + } +} diff --git a/blocksuite/affine/blocks/surface/src/view.ts b/blocksuite/affine/blocks/surface/src/view.ts new file mode 100644 index 0000000000..5644dcfd9f --- /dev/null +++ b/blocksuite/affine/blocks/surface/src/view.ts @@ -0,0 +1,41 @@ +import { + type ViewExtensionContext, + ViewExtensionProvider, +} from '@blocksuite/affine-ext-loader'; +import { BlockViewExtension, FlavourExtension } from '@blocksuite/std'; +import { literal } from 'lit/static-html.js'; + +import { effects } from './effects'; +import { + EdgelessCRUDExtension, + EdgelessLegacySlotExtension, +} from './extensions'; +import { ExportManagerExtension } from './extensions/export-manager/export-manager'; + +export class SurfaceViewExtension extends ViewExtensionProvider { + override name = 'affine-surface-block'; + + override effect() { + super.effect(); + effects(); + } + + override setup(context: ViewExtensionContext) { + super.setup(context); + context.register([ + FlavourExtension('affine:surface'), + EdgelessCRUDExtension, + EdgelessLegacySlotExtension, + ExportManagerExtension, + ]); + if (this.isEdgeless(context.scope)) { + context.register( + BlockViewExtension('affine:surface', literal`affine-surface`) + ); + } else { + context.register( + BlockViewExtension('affine:surface', literal`affine-surface-void`) + ); + } + } +} diff --git a/blocksuite/affine/blocks/surface/tsconfig.json b/blocksuite/affine/blocks/surface/tsconfig.json index 63067b9805..45d028d7e6 100644 --- a/blocksuite/affine/blocks/surface/tsconfig.json +++ b/blocksuite/affine/blocks/surface/tsconfig.json @@ -8,6 +8,7 @@ "include": ["./src"], "references": [ { "path": "../../components" }, + { "path": "../../ext-loader" }, { "path": "../../model" }, { "path": "../../rich-text" }, { "path": "../../shared" }, diff --git a/tools/utils/src/workspace.gen.ts b/tools/utils/src/workspace.gen.ts index 707678848d..f227058e7e 100644 --- a/tools/utils/src/workspace.gen.ts +++ b/tools/utils/src/workspace.gen.ts @@ -364,6 +364,7 @@ export const PackageList = [ name: '@blocksuite/affine-block-surface', workspaceDependencies: [ 'blocksuite/affine/components', + 'blocksuite/affine/ext-loader', 'blocksuite/affine/model', 'blocksuite/affine/rich-text', 'blocksuite/affine/shared', diff --git a/yarn.lock b/yarn.lock index d1571417cc..7378a74eff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2914,6 +2914,7 @@ __metadata: resolution: "@blocksuite/affine-block-surface@workspace:blocksuite/affine/blocks/surface" dependencies: "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-ext-loader": "workspace:*" "@blocksuite/affine-model": "workspace:*" "@blocksuite/affine-rich-text": "workspace:*" "@blocksuite/affine-shared": "workspace:*"