From 3fdab1bec6e6256b7c4a5d553ade90e84282143d Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Mon, 28 Apr 2025 06:38:42 +0000 Subject: [PATCH] feat(editor): add bs affine foundation module (#12012) ## Summary by CodeRabbit - **New Features** - Introduced the Affine Foundation package, providing a centralized layer for initializing core UI effects, custom elements, and foundational services. - Added new foundational store and view extensions to improve core service registration and UI effect setup. - **Refactor** - Streamlined and reorganized block, store, and view extension arrays to rely on the new foundation layer, reducing duplication and simplifying extension management. - Removed redundant or now-centralized services and UI effects from existing modules. - **Chores** - Updated configuration files and workspace dependencies to support the new Affine Foundation package. --- blocksuite/affine/all/package.json | 1 + .../affine/all/src/extensions/effects.ts | 62 ------------------ .../all/src/extensions/migrating-store.ts | 50 --------------- .../affine/all/src/extensions/migrating.ts | 17 ----- blocksuite/affine/all/src/extensions/store.ts | 3 + blocksuite/affine/all/src/extensions/view.ts | 3 + blocksuite/affine/all/tsconfig.json | 1 + .../blocks/root/src/common-specs/index.ts | 20 +----- .../src/edgeless/edgeless-builtin-spec.ts | 4 -- .../root/src/edgeless/edgeless-root-spec.ts | 3 +- blocksuite/affine/foundation/package.json | 45 +++++++++++++ blocksuite/affine/foundation/src/effects.ts | 64 +++++++++++++++++++ blocksuite/affine/foundation/src/index.ts | 1 + blocksuite/affine/foundation/src/store.ts | 58 +++++++++++++++++ blocksuite/affine/foundation/src/view.ts | 52 +++++++++++++++ blocksuite/affine/foundation/tsconfig.json | 20 ++++++ tools/utils/src/workspace.gen.ts | 16 +++++ tsconfig.json | 1 + yarn.lock | 27 ++++++++ 19 files changed, 294 insertions(+), 154 deletions(-) create mode 100644 blocksuite/affine/foundation/package.json create mode 100644 blocksuite/affine/foundation/src/effects.ts create mode 100644 blocksuite/affine/foundation/src/index.ts create mode 100644 blocksuite/affine/foundation/src/store.ts create mode 100644 blocksuite/affine/foundation/src/view.ts create mode 100644 blocksuite/affine/foundation/tsconfig.json diff --git a/blocksuite/affine/all/package.json b/blocksuite/affine/all/package.json index 548af81d21..94a0e9f568 100644 --- a/blocksuite/affine/all/package.json +++ b/blocksuite/affine/all/package.json @@ -31,6 +31,7 @@ "@blocksuite/affine-block-table": "workspace:*", "@blocksuite/affine-components": "workspace:*", "@blocksuite/affine-ext-loader": "workspace:*", + "@blocksuite/affine-foundation": "workspace:*", "@blocksuite/affine-fragment-doc-title": "workspace:*", "@blocksuite/affine-fragment-frame-panel": "workspace:*", "@blocksuite/affine-fragment-outline": "workspace:*", diff --git a/blocksuite/affine/all/src/extensions/effects.ts b/blocksuite/affine/all/src/extensions/effects.ts index d5ee1b0979..55dce15038 100644 --- a/blocksuite/affine/all/src/extensions/effects.ts +++ b/blocksuite/affine/all/src/extensions/effects.ts @@ -1,74 +1,12 @@ import { effects as blockRootEffects } from '@blocksuite/affine-block-root/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'; -import { effects as componentCardStyleDropdownMenuEffects } from '@blocksuite/affine-components/card-style-dropdown-menu'; -import { effects as componentColorPickerEffects } from '@blocksuite/affine-components/color-picker'; -import { effects as componentContextMenuEffects } from '@blocksuite/affine-components/context-menu'; -import { effects as componentDatePickerEffects } from '@blocksuite/affine-components/date-picker'; -import { effects as componentDropIndicatorEffects } from '@blocksuite/affine-components/drop-indicator'; -import { effects as componentEdgelessLineStylesEffects } from '@blocksuite/affine-components/edgeless-line-styles-panel'; -import { effects as componentEdgelessLineWidthEffects } from '@blocksuite/affine-components/edgeless-line-width-panel'; -import { effects as componentEdgelessShapeColorPickerEffects } from '@blocksuite/affine-components/edgeless-shape-color-picker'; -import { effects as componentEmbedCardModalEffects } from '@blocksuite/affine-components/embed-card-modal'; -import { FilterableListComponent } from '@blocksuite/affine-components/filterable-list'; -import { effects as componentHighlightDropdownMenuEffects } from '@blocksuite/affine-components/highlight-dropdown-menu'; -import { IconButton } from '@blocksuite/affine-components/icon-button'; -import { effects as componentLinkPreviewEffects } from '@blocksuite/affine-components/link-preview'; -import { effects as componentLinkedDocTitleEffects } from '@blocksuite/affine-components/linked-doc-title'; -import { effects as componentOpenDocDropdownMenuEffects } from '@blocksuite/affine-components/open-doc-dropdown-menu'; -import { effects as componentPortalEffects } from '@blocksuite/affine-components/portal'; -import { effects as componentSizeDropdownMenuEffects } from '@blocksuite/affine-components/size-dropdown-menu'; -import { SmoothCorner } from '@blocksuite/affine-components/smooth-corner'; -import { effects as componentToggleButtonEffects } from '@blocksuite/affine-components/toggle-button'; -import { ToggleSwitch } from '@blocksuite/affine-components/toggle-switch'; -import { effects as componentToolbarEffects } from '@blocksuite/affine-components/toolbar'; -import { effects as componentTooltipContentWithShortcutEffects } from '@blocksuite/affine-components/tooltip-content-with-shortcut'; -import { effects as componentViewDropdownMenuEffects } from '@blocksuite/affine-components/view-dropdown-menu'; import { effects as fragmentDocTitleEffects } from '@blocksuite/affine-fragment-doc-title/effects'; import { effects as fragmentFramePanelEffects } from '@blocksuite/affine-fragment-frame-panel/effects'; import { effects as fragmentOutlineEffects } from '@blocksuite/affine-fragment-outline/effects'; -import { effects as richTextEffects } from '@blocksuite/affine-rich-text/effects'; -import { effects as dataViewEffects } from '@blocksuite/data-view/effects'; -import { effects as stdEffects } from '@blocksuite/std/effects'; export function effects() { - stdEffects(); - - dataViewEffects(); - richTextEffects(); - blockRootEffects(); - componentCaptionEffects(); - componentContextMenuEffects(); - componentDatePickerEffects(); - componentPortalEffects(); - componentToolbarEffects(); - componentDropIndicatorEffects(); - componentToggleButtonEffects(); - componentColorPickerEffects(); - componentEmbedCardModalEffects(); - componentLinkPreviewEffects(); - componentLinkedDocTitleEffects(); - componentCardStyleDropdownMenuEffects(); - componentHighlightDropdownMenuEffects(); - componentViewDropdownMenuEffects(); - componentTooltipContentWithShortcutEffects(); - componentSizeDropdownMenuEffects(); - componentEdgelessLineWidthEffects(); - componentEdgelessLineStylesEffects(); - componentEdgelessShapeColorPickerEffects(); - componentOpenDocDropdownMenuEffects(); - fragmentDocTitleEffects(); fragmentFramePanelEffects(); fragmentOutlineEffects(); - - customElements.define('icon-button', IconButton); - customElements.define('smooth-corner', SmoothCorner); - customElements.define('toggle-switch', ToggleSwitch); - customElements.define('affine-filterable-list', FilterableListComponent); - customElements.define('block-zero-width', BlockZeroWidth); - customElements.define('affine-block-selection', BlockSelection); } diff --git a/blocksuite/affine/all/src/extensions/migrating-store.ts b/blocksuite/affine/all/src/extensions/migrating-store.ts index 18ea7f1269..d490a45592 100644 --- a/blocksuite/affine/all/src/extensions/migrating-store.ts +++ b/blocksuite/affine/all/src/extensions/migrating-store.ts @@ -1,4 +1,3 @@ -import { DatabaseSelectionExtension } from '@blocksuite/affine-block-database'; import { RootBlockHtmlAdapterExtension, RootBlockMarkdownAdapterExtension, @@ -9,41 +8,8 @@ import { StoreExtensionProvider, } from '@blocksuite/affine-ext-loader'; import { RootBlockSchemaExtension } from '@blocksuite/affine-model'; -import { - HtmlAdapterFactoryExtension, - ImageProxyService, - MarkdownAdapterFactoryExtension, - MixTextAdapterFactoryExtension, - NotionHtmlAdapterFactoryExtension, - NotionTextAdapterFactoryExtension, - PlainTextAdapterFactoryExtension, -} from '@blocksuite/affine-shared/adapters'; -import { HighlightSelectionExtension } from '@blocksuite/affine-shared/selection'; -import { - BlockMetaService, - FeatureFlagService, - FileSizeLimitService, - LinkPreviewerService, -} from '@blocksuite/affine-shared/services'; -import { - BlockSelectionExtension, - CursorSelectionExtension, - SurfaceSelectionExtension, - TextSelectionExtension, -} from '@blocksuite/std'; import type { ExtensionType } from '@blocksuite/store'; -function getAdapterFactoryExtensions(): ExtensionType[] { - return [ - MarkdownAdapterFactoryExtension, - PlainTextAdapterFactoryExtension, - HtmlAdapterFactoryExtension, - NotionTextAdapterFactoryExtension, - NotionHtmlAdapterFactoryExtension, - MixTextAdapterFactoryExtension, - ]; -} - const defaultBlockHtmlAdapterMatchers = [RootBlockHtmlAdapterExtension]; const defaultBlockMarkdownAdapterMatchers = [RootBlockMarkdownAdapterExtension]; @@ -67,25 +33,9 @@ function getNotionHtmlAdapterExtensions(): ExtensionType[] { const MigratingStoreExtensions: ExtensionType[] = [ RootBlockSchemaExtension, - BlockSelectionExtension, - TextSelectionExtension, - SurfaceSelectionExtension, - CursorSelectionExtension, - HighlightSelectionExtension, - DatabaseSelectionExtension, - getHtmlAdapterExtensions(), getMarkdownAdapterExtensions(), getNotionHtmlAdapterExtensions(), - getAdapterFactoryExtensions(), - - FeatureFlagService, - BlockMetaService, - - // TODO(@mirone): maybe merge these services into a file setting service - LinkPreviewerService, - FileSizeLimitService, - ImageProxyService, ].flat(); export class MigratingStoreExtension extends StoreExtensionProvider { diff --git a/blocksuite/affine/all/src/extensions/migrating.ts b/blocksuite/affine/all/src/extensions/migrating.ts index 2b79d2c6e4..2cae8c0525 100644 --- a/blocksuite/affine/all/src/extensions/migrating.ts +++ b/blocksuite/affine/all/src/extensions/migrating.ts @@ -5,39 +5,22 @@ import { PreviewPageRootBlockSpec, ReadOnlyClipboard, } from '@blocksuite/affine-block-root'; -import { - DefaultOpenDocExtension, - DocDisplayMetaService, - EditPropsStore, - FontLoaderService, -} from '@blocksuite/affine-shared/services'; import type { ExtensionType } from '@blocksuite/store'; -const CommonBlockSpecs: ExtensionType[] = [ - DocDisplayMetaService, - EditPropsStore, - DefaultOpenDocExtension, - FontLoaderService, -].flat(); - export const MigratingEdgelessEditorBlockSpecs: ExtensionType[] = [ EdgelessBuiltInSpecs, - CommonBlockSpecs, ].flat(); export const MigratingPageEditorBlockSpecs: ExtensionType[] = [ PageRootBlockSpec, - CommonBlockSpecs, ].flat(); export const MigratingPreviewEdgelessEditorBlockSpecs: ExtensionType[] = [ PreviewEdgelessRootBlockSpec, - CommonBlockSpecs, ReadOnlyClipboard, ].flat(); export const MigratingPreviewPageEditorBlockSpecs: ExtensionType[] = [ PreviewPageRootBlockSpec, - CommonBlockSpecs, ReadOnlyClipboard, ].flat(); diff --git a/blocksuite/affine/all/src/extensions/store.ts b/blocksuite/affine/all/src/extensions/store.ts index 00b9f4622f..cdc733a470 100644 --- a/blocksuite/affine/all/src/extensions/store.ts +++ b/blocksuite/affine/all/src/extensions/store.ts @@ -16,6 +16,7 @@ import { ParagraphStoreExtension } from '@blocksuite/affine-block-paragraph/stor 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 { FoundationStoreExtension } from '@blocksuite/affine-foundation/store'; import { BrushStoreExtension } from '@blocksuite/affine-gfx-brush/store'; import { ConnectorStoreExtension } from '@blocksuite/affine-gfx-connector/store'; import { GroupStoreExtension } from '@blocksuite/affine-gfx-group/store'; @@ -32,6 +33,8 @@ import { MigratingStoreExtension } from './migrating-store'; export function getInternalStoreExtensions() { return [ + FoundationStoreExtension, + AttachmentStoreExtension, BookmarkStoreExtension, CalloutStoreExtension, diff --git a/blocksuite/affine/all/src/extensions/view.ts b/blocksuite/affine/all/src/extensions/view.ts index 63fe87be98..64662c08d7 100644 --- a/blocksuite/affine/all/src/extensions/view.ts +++ b/blocksuite/affine/all/src/extensions/view.ts @@ -16,6 +16,7 @@ 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 { FoundationViewExtension } from '@blocksuite/affine-foundation/view'; import { BrushViewExtension } from '@blocksuite/affine-gfx-brush/view'; import { ConnectorViewExtension } from '@blocksuite/affine-gfx-connector/view'; import { GroupViewExtension } from '@blocksuite/affine-gfx-group/view'; @@ -46,6 +47,8 @@ import { MigratingViewExtension } from './migrating-view'; export function getInternalViewExtensions() { return [ + FoundationViewExtension, + // Gfx PointerViewExtension, GfxNoteViewExtension, diff --git a/blocksuite/affine/all/tsconfig.json b/blocksuite/affine/all/tsconfig.json index 728c2c602f..7f20f73bd7 100644 --- a/blocksuite/affine/all/tsconfig.json +++ b/blocksuite/affine/all/tsconfig.json @@ -28,6 +28,7 @@ { "path": "../blocks/table" }, { "path": "../components" }, { "path": "../ext-loader" }, + { "path": "../foundation" }, { "path": "../fragments/doc-title" }, { "path": "../fragments/frame-panel" }, { "path": "../fragments/outline" }, diff --git a/blocksuite/affine/blocks/root/src/common-specs/index.ts b/blocksuite/affine/blocks/root/src/common-specs/index.ts index 0350e6a3fa..829a39b6c3 100644 --- a/blocksuite/affine/blocks/root/src/common-specs/index.ts +++ b/blocksuite/affine/blocks/root/src/common-specs/index.ts @@ -1,15 +1,5 @@ -import { FileDropExtension } from '@blocksuite/affine-components/drop-indicator'; import { NoteBlockSchema } from '@blocksuite/affine-model'; -import { - AutoClearSelectionService, - DNDAPIExtension, - DocModeService, - EmbedOptionService, - PageViewportServiceExtension, - ThemeService, - ToolbarModuleExtension, - ToolbarRegistryExtension, -} from '@blocksuite/affine-shared/services'; +import { ToolbarModuleExtension } from '@blocksuite/affine-shared/services'; import { BlockFlavourIdentifier, FlavourExtension } from '@blocksuite/std'; import type { ExtensionType } from '@blocksuite/store'; @@ -21,14 +11,6 @@ import { viewportOverlayWidget } from './widgets'; export const CommonSpecs: ExtensionType[] = [ FlavourExtension('affine:page'), - DocModeService, - ThemeService, - EmbedOptionService, - PageViewportServiceExtension, - DNDAPIExtension, - FileDropExtension, - ToolbarRegistryExtension, - AutoClearSelectionService, ...RootBlockAdapterExtensions, ...clipboardConfigs, viewportOverlayWidget, diff --git a/blocksuite/affine/blocks/root/src/edgeless/edgeless-builtin-spec.ts b/blocksuite/affine/blocks/root/src/edgeless/edgeless-builtin-spec.ts index 7e9b51d36b..02248c6511 100644 --- a/blocksuite/affine/blocks/root/src/edgeless/edgeless-builtin-spec.ts +++ b/blocksuite/affine/blocks/root/src/edgeless/edgeless-builtin-spec.ts @@ -1,12 +1,9 @@ -import { InteractivityManager } from '@blocksuite/std/gfx'; import type { ExtensionType } from '@blocksuite/store'; import { EdgelessElementToolbarExtension } from './configs/toolbar'; import { EdgelessRootBlockSpec } from './edgeless-root-spec.js'; import { AltCloneExtension } from './interact-extensions/clone-ext.js'; -export const EdgelessEditExtensions: ExtensionType[] = [InteractivityManager]; - export const EdgelessBuiltInManager: ExtensionType[] = [ AltCloneExtension, EdgelessElementToolbarExtension, @@ -15,5 +12,4 @@ export const EdgelessBuiltInManager: ExtensionType[] = [ export const EdgelessBuiltInSpecs: ExtensionType[] = [ EdgelessRootBlockSpec, EdgelessBuiltInManager, - EdgelessEditExtensions, ].flat(); diff --git a/blocksuite/affine/blocks/root/src/edgeless/edgeless-root-spec.ts b/blocksuite/affine/blocks/root/src/edgeless/edgeless-root-spec.ts index 507d3fb2d4..9c8392c1a9 100644 --- a/blocksuite/affine/blocks/root/src/edgeless/edgeless-root-spec.ts +++ b/blocksuite/affine/blocks/root/src/edgeless/edgeless-root-spec.ts @@ -4,7 +4,7 @@ import { LifeCycleWatcher, WidgetViewExtension, } from '@blocksuite/std'; -import { GfxControllerIdentifier, ToolController } from '@blocksuite/std/gfx'; +import { GfxControllerIdentifier } from '@blocksuite/std/gfx'; import type { ExtensionType } from '@blocksuite/store'; import { literal, unsafeStatic } from 'lit/static-html.js'; @@ -49,7 +49,6 @@ class EdgelessLocker extends LifeCycleWatcher { const EdgelessCommonExtension: ExtensionType[] = [ CommonSpecs, - ToolController, EdgelessRootService, ViewportElementExtension('.affine-edgeless-viewport'), ...quickTools, diff --git a/blocksuite/affine/foundation/package.json b/blocksuite/affine/foundation/package.json new file mode 100644 index 0000000000..9a635427d0 --- /dev/null +++ b/blocksuite/affine/foundation/package.json @@ -0,0 +1,45 @@ +{ + "name": "@blocksuite/affine-foundation", + "description": "Foundation extensions for affine.", + "type": "module", + "scripts": { + "build": "tsc" + }, + "sideEffects": false, + "keywords": [], + "author": "toeverything", + "license": "MIT", + "dependencies": { + "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-ext-loader": "workspace:*", + "@blocksuite/affine-rich-text": "workspace:*", + "@blocksuite/affine-shared": "workspace:*", + "@blocksuite/data-view": "workspace:*", + "@blocksuite/global": "workspace:*", + "@blocksuite/icons": "^2.2.12", + "@blocksuite/std": "workspace:*", + "@blocksuite/store": "workspace:*", + "@floating-ui/dom": "^1.6.13", + "@lit/context": "^1.1.2", + "@preact/signals-core": "^1.8.0", + "@toeverything/theme": "^1.1.12", + "@types/lodash-es": "^4.17.12", + "lit": "^3.2.0", + "lodash-es": "^4.17.21", + "rxjs": "^7.8.1", + "yjs": "^13.6.21", + "zod": "^3.23.8" + }, + "exports": { + ".": "./src/index.ts", + "./store": "./src/store.ts", + "./view": "./src/view.ts" + }, + "files": [ + "src", + "dist", + "!src/__tests__", + "!dist/__tests__" + ], + "version": "0.21.0" +} diff --git a/blocksuite/affine/foundation/src/effects.ts b/blocksuite/affine/foundation/src/effects.ts new file mode 100644 index 0000000000..ac8c5897b2 --- /dev/null +++ b/blocksuite/affine/foundation/src/effects.ts @@ -0,0 +1,64 @@ +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'; +import { effects as componentCardStyleDropdownMenuEffects } from '@blocksuite/affine-components/card-style-dropdown-menu'; +import { effects as componentColorPickerEffects } from '@blocksuite/affine-components/color-picker'; +import { effects as componentContextMenuEffects } from '@blocksuite/affine-components/context-menu'; +import { effects as componentDatePickerEffects } from '@blocksuite/affine-components/date-picker'; +import { effects as componentDropIndicatorEffects } from '@blocksuite/affine-components/drop-indicator'; +import { effects as componentEdgelessLineStylesEffects } from '@blocksuite/affine-components/edgeless-line-styles-panel'; +import { effects as componentEdgelessLineWidthEffects } from '@blocksuite/affine-components/edgeless-line-width-panel'; +import { effects as componentEdgelessShapeColorPickerEffects } from '@blocksuite/affine-components/edgeless-shape-color-picker'; +import { effects as componentEmbedCardModalEffects } from '@blocksuite/affine-components/embed-card-modal'; +import { FilterableListComponent } from '@blocksuite/affine-components/filterable-list'; +import { effects as componentHighlightDropdownMenuEffects } from '@blocksuite/affine-components/highlight-dropdown-menu'; +import { IconButton } from '@blocksuite/affine-components/icon-button'; +import { effects as componentLinkPreviewEffects } from '@blocksuite/affine-components/link-preview'; +import { effects as componentLinkedDocTitleEffects } from '@blocksuite/affine-components/linked-doc-title'; +import { effects as componentOpenDocDropdownMenuEffects } from '@blocksuite/affine-components/open-doc-dropdown-menu'; +import { effects as componentPortalEffects } from '@blocksuite/affine-components/portal'; +import { effects as componentSizeDropdownMenuEffects } from '@blocksuite/affine-components/size-dropdown-menu'; +import { SmoothCorner } from '@blocksuite/affine-components/smooth-corner'; +import { effects as componentToggleButtonEffects } from '@blocksuite/affine-components/toggle-button'; +import { ToggleSwitch } from '@blocksuite/affine-components/toggle-switch'; +import { effects as componentToolbarEffects } from '@blocksuite/affine-components/toolbar'; +import { effects as componentTooltipContentWithShortcutEffects } from '@blocksuite/affine-components/tooltip-content-with-shortcut'; +import { effects as componentViewDropdownMenuEffects } from '@blocksuite/affine-components/view-dropdown-menu'; +import { effects as richTextEffects } from '@blocksuite/affine-rich-text/effects'; +import { effects as dataViewEffects } from '@blocksuite/data-view/effects'; +import { effects as stdEffects } from '@blocksuite/std/effects'; + +export function effects() { + stdEffects(); + + dataViewEffects(); + richTextEffects(); + + componentCaptionEffects(); + componentContextMenuEffects(); + componentDatePickerEffects(); + componentPortalEffects(); + componentToolbarEffects(); + componentDropIndicatorEffects(); + componentToggleButtonEffects(); + componentColorPickerEffects(); + componentEmbedCardModalEffects(); + componentLinkPreviewEffects(); + componentLinkedDocTitleEffects(); + componentCardStyleDropdownMenuEffects(); + componentHighlightDropdownMenuEffects(); + componentViewDropdownMenuEffects(); + componentTooltipContentWithShortcutEffects(); + componentSizeDropdownMenuEffects(); + componentEdgelessLineWidthEffects(); + componentEdgelessLineStylesEffects(); + componentEdgelessShapeColorPickerEffects(); + componentOpenDocDropdownMenuEffects(); + + customElements.define('icon-button', IconButton); + customElements.define('smooth-corner', SmoothCorner); + customElements.define('toggle-switch', ToggleSwitch); + customElements.define('affine-filterable-list', FilterableListComponent); + customElements.define('block-zero-width', BlockZeroWidth); + customElements.define('affine-block-selection', BlockSelection); +} diff --git a/blocksuite/affine/foundation/src/index.ts b/blocksuite/affine/foundation/src/index.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/blocksuite/affine/foundation/src/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/blocksuite/affine/foundation/src/store.ts b/blocksuite/affine/foundation/src/store.ts new file mode 100644 index 0000000000..14ffac00e3 --- /dev/null +++ b/blocksuite/affine/foundation/src/store.ts @@ -0,0 +1,58 @@ +import { + type StoreExtensionContext, + StoreExtensionProvider, +} from '@blocksuite/affine-ext-loader'; +import { + HtmlAdapterFactoryExtension, + ImageProxyService, + MarkdownAdapterFactoryExtension, + MixTextAdapterFactoryExtension, + NotionHtmlAdapterFactoryExtension, + NotionTextAdapterFactoryExtension, + PlainTextAdapterFactoryExtension, +} from '@blocksuite/affine-shared/adapters'; +import { HighlightSelectionExtension } from '@blocksuite/affine-shared/selection'; +import { + BlockMetaService, + FeatureFlagService, + FileSizeLimitService, + LinkPreviewerService, +} from '@blocksuite/affine-shared/services'; +import { + BlockSelectionExtension, + CursorSelectionExtension, + SurfaceSelectionExtension, + TextSelectionExtension, +} from '@blocksuite/std'; + +export class FoundationStoreExtension extends StoreExtensionProvider { + override name = 'foundation'; + + override setup(context: StoreExtensionContext) { + super.setup(context); + context.register([ + // predefined selections + BlockSelectionExtension, + TextSelectionExtension, + SurfaceSelectionExtension, + CursorSelectionExtension, + HighlightSelectionExtension, + + // predefined adapters + MarkdownAdapterFactoryExtension, + PlainTextAdapterFactoryExtension, + HtmlAdapterFactoryExtension, + NotionTextAdapterFactoryExtension, + NotionHtmlAdapterFactoryExtension, + MixTextAdapterFactoryExtension, + + // shared services + FeatureFlagService, + BlockMetaService, + // TODO(@mirone): maybe merge these services into a file setting service + LinkPreviewerService, + FileSizeLimitService, + ImageProxyService, + ]); + } +} diff --git a/blocksuite/affine/foundation/src/view.ts b/blocksuite/affine/foundation/src/view.ts new file mode 100644 index 0000000000..5c9da7d829 --- /dev/null +++ b/blocksuite/affine/foundation/src/view.ts @@ -0,0 +1,52 @@ +import { FileDropExtension } from '@blocksuite/affine-components/drop-indicator'; +import { + type ViewExtensionContext, + ViewExtensionProvider, +} from '@blocksuite/affine-ext-loader'; +import { + AutoClearSelectionService, + DefaultOpenDocExtension, + DNDAPIExtension, + DocDisplayMetaService, + DocModeService, + EditPropsStore, + EmbedOptionService, + FontLoaderService, + PageViewportServiceExtension, + ThemeService, + ToolbarRegistryExtension, +} from '@blocksuite/affine-shared/services'; +import { InteractivityManager, ToolController } from '@blocksuite/std/gfx'; + +import { effects } from './effects'; + +export class FoundationViewExtension extends ViewExtensionProvider { + override name = 'foundation'; + + override effect() { + super.effect(); + effects(); + } + + override setup(context: ViewExtensionContext) { + super.setup(context); + context.register([ + DocDisplayMetaService, + EditPropsStore, + DefaultOpenDocExtension, + FontLoaderService, + + DocModeService, + ThemeService, + EmbedOptionService, + PageViewportServiceExtension, + DNDAPIExtension, + FileDropExtension, + ToolbarRegistryExtension, + AutoClearSelectionService, + ]); + if (this.isEdgeless(context.scope)) { + context.register([InteractivityManager, ToolController]); + } + } +} diff --git a/blocksuite/affine/foundation/tsconfig.json b/blocksuite/affine/foundation/tsconfig.json new file mode 100644 index 0000000000..99feedf990 --- /dev/null +++ b/blocksuite/affine/foundation/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "noUncheckedIndexedAccess": true, + "rootDir": "./src", + "outDir": "./dist", + "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" + }, + "include": ["./src"], + "references": [ + { "path": "../components" }, + { "path": "../ext-loader" }, + { "path": "../rich-text" }, + { "path": "../shared" }, + { "path": "../data-view" }, + { "path": "../../framework/global" }, + { "path": "../../framework/std" }, + { "path": "../../framework/store" } + ] +} diff --git a/tools/utils/src/workspace.gen.ts b/tools/utils/src/workspace.gen.ts index 2cbe69ada2..2a55628dfb 100644 --- a/tools/utils/src/workspace.gen.ts +++ b/tools/utils/src/workspace.gen.ts @@ -26,6 +26,7 @@ export const PackageList = [ 'blocksuite/affine/blocks/table', 'blocksuite/affine/components', 'blocksuite/affine/ext-loader', + 'blocksuite/affine/foundation', 'blocksuite/affine/fragments/doc-title', 'blocksuite/affine/fragments/frame-panel', 'blocksuite/affine/fragments/outline', @@ -432,6 +433,20 @@ export const PackageList = [ 'blocksuite/framework/store', ], }, + { + location: 'blocksuite/affine/foundation', + name: '@blocksuite/affine-foundation', + workspaceDependencies: [ + 'blocksuite/affine/components', + 'blocksuite/affine/ext-loader', + 'blocksuite/affine/rich-text', + 'blocksuite/affine/shared', + 'blocksuite/affine/data-view', + 'blocksuite/framework/global', + 'blocksuite/framework/std', + 'blocksuite/framework/store', + ], + }, { location: 'blocksuite/affine/fragments/doc-title', name: '@blocksuite/affine-fragment-doc-title', @@ -1314,6 +1329,7 @@ export type PackageName = | '@blocksuite/affine-components' | '@blocksuite/data-view' | '@blocksuite/affine-ext-loader' + | '@blocksuite/affine-foundation' | '@blocksuite/affine-fragment-doc-title' | '@blocksuite/affine-fragment-frame-panel' | '@blocksuite/affine-fragment-outline' diff --git a/tsconfig.json b/tsconfig.json index 6b507a34fd..12f50a7957 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -73,6 +73,7 @@ { "path": "./blocksuite/affine/components" }, { "path": "./blocksuite/affine/data-view" }, { "path": "./blocksuite/affine/ext-loader" }, + { "path": "./blocksuite/affine/foundation" }, { "path": "./blocksuite/affine/fragments/doc-title" }, { "path": "./blocksuite/affine/fragments/frame-panel" }, { "path": "./blocksuite/affine/fragments/outline" }, diff --git a/yarn.lock b/yarn.lock index 1b30ae6405..53c69e946b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3018,6 +3018,32 @@ __metadata: languageName: unknown linkType: soft +"@blocksuite/affine-foundation@workspace:*, @blocksuite/affine-foundation@workspace:blocksuite/affine/foundation": + version: 0.0.0-use.local + resolution: "@blocksuite/affine-foundation@workspace:blocksuite/affine/foundation" + dependencies: + "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-ext-loader": "workspace:*" + "@blocksuite/affine-rich-text": "workspace:*" + "@blocksuite/affine-shared": "workspace:*" + "@blocksuite/data-view": "workspace:*" + "@blocksuite/global": "workspace:*" + "@blocksuite/icons": "npm:^2.2.12" + "@blocksuite/std": "workspace:*" + "@blocksuite/store": "workspace:*" + "@floating-ui/dom": "npm:^1.6.13" + "@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" + lit: "npm:^3.2.0" + lodash-es: "npm:^4.17.21" + rxjs: "npm:^7.8.1" + yjs: "npm:^13.6.21" + zod: "npm:^3.23.8" + languageName: unknown + linkType: soft + "@blocksuite/affine-fragment-doc-title@workspace:*, @blocksuite/affine-fragment-doc-title@workspace:blocksuite/affine/fragments/doc-title": version: 0.0.0-use.local resolution: "@blocksuite/affine-fragment-doc-title@workspace:blocksuite/affine/fragments/doc-title" @@ -3926,6 +3952,7 @@ __metadata: "@blocksuite/affine-block-table": "workspace:*" "@blocksuite/affine-components": "workspace:*" "@blocksuite/affine-ext-loader": "workspace:*" + "@blocksuite/affine-foundation": "workspace:*" "@blocksuite/affine-fragment-doc-title": "workspace:*" "@blocksuite/affine-fragment-frame-panel": "workspace:*" "@blocksuite/affine-fragment-outline": "workspace:*"