From 4c84e6bac78964f2f4cf8aac032d9420bd7852c3 Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Tue, 29 Apr 2025 03:19:37 +0000 Subject: [PATCH] feat(editor): gfx link extension (#12046) Closes: BS-3368 ## Summary by CodeRabbit - **New Features** - Introduced a new link tool extension, enabling enhanced link-related functionality within the edgeless workspace. - Added a new view extension for link tools, improving integration and usability in edgeless mode. - **Chores** - Added a new package for link tool functionality with appropriate dependencies and exports. - Registered new custom elements for edgeless toolbars and link tools to support modular UI components. - Updated project configurations and workspace dependencies to include the new link tool module. - **Refactor** - Removed unused quick tool exports and toolbar component registrations to streamline the edgeless extension codebase. --- blocksuite/affine/all/package.json | 3 ++ blocksuite/affine/all/src/extensions/view.ts | 2 + blocksuite/affine/all/src/gfx/link/index.ts | 1 + blocksuite/affine/all/src/gfx/link/view.ts | 1 + blocksuite/affine/all/tsconfig.json | 1 + .../root/src/edgeless/edgeless-root-spec.ts | 2 - blocksuite/affine/blocks/root/src/effects.ts | 18 ------- blocksuite/affine/gfx/link/package.json | 50 +++++++++++++++++++ blocksuite/affine/gfx/link/src/effects.ts | 5 ++ blocksuite/affine/gfx/link/src/index.ts | 1 + .../tools.ts => gfx/link/src/link-tool.ts} | 6 +-- .../link/src/toolbar}/link-dense-menu.ts | 0 .../link/src/toolbar}/link-tool-button.ts | 3 ++ blocksuite/affine/gfx/link/src/view.ts | 23 +++++++++ blocksuite/affine/gfx/link/tsconfig.json | 24 +++++++++ .../widgets/edgeless-toolbar/src/effects.ts | 6 +++ .../edgeless-toolbar/src/menu}/slide-menu.ts | 9 ++-- .../src/menu}/toolbar-arrow-up-icon.ts | 0 tools/utils/src/workspace.gen.ts | 21 ++++++++ tsconfig.json | 1 + yarn.lock | 32 ++++++++++++ 21 files changed, 181 insertions(+), 28 deletions(-) create mode 100644 blocksuite/affine/all/src/gfx/link/index.ts create mode 100644 blocksuite/affine/all/src/gfx/link/view.ts create mode 100644 blocksuite/affine/gfx/link/package.json create mode 100644 blocksuite/affine/gfx/link/src/effects.ts create mode 100644 blocksuite/affine/gfx/link/src/index.ts rename blocksuite/affine/{blocks/root/src/edgeless/components/toolbar/tools.ts => gfx/link/src/link-tool.ts} (60%) rename blocksuite/affine/{blocks/root/src/edgeless/components/toolbar/link => gfx/link/src/toolbar}/link-dense-menu.ts (100%) rename blocksuite/affine/{blocks/root/src/edgeless/components/toolbar/link => gfx/link/src/toolbar}/link-tool-button.ts (95%) create mode 100644 blocksuite/affine/gfx/link/src/view.ts create mode 100644 blocksuite/affine/gfx/link/tsconfig.json rename blocksuite/affine/{blocks/root/src/edgeless/components/toolbar/common => widgets/edgeless-toolbar/src/menu}/slide-menu.ts (99%) rename blocksuite/affine/{blocks/root/src/edgeless/components/toolbar/common => widgets/edgeless-toolbar/src/menu}/toolbar-arrow-up-icon.ts (100%) diff --git a/blocksuite/affine/all/package.json b/blocksuite/affine/all/package.json index b510e390b4..0f1fdcfb1b 100644 --- a/blocksuite/affine/all/package.json +++ b/blocksuite/affine/all/package.json @@ -38,6 +38,7 @@ "@blocksuite/affine-gfx-brush": "workspace:*", "@blocksuite/affine-gfx-connector": "workspace:*", "@blocksuite/affine-gfx-group": "workspace:*", + "@blocksuite/affine-gfx-link": "workspace:*", "@blocksuite/affine-gfx-mindmap": "workspace:*", "@blocksuite/affine-gfx-note": "workspace:*", "@blocksuite/affine-gfx-pointer": "workspace:*", @@ -205,6 +206,8 @@ "./gfx/shape": "./src/gfx/shape/index.ts", "./gfx/shape/store": "./src/gfx/shape/store.ts", "./gfx/shape/view": "./src/gfx/shape/view.ts", + "./gfx/link": "./src/gfx/link/index.ts", + "./gfx/link/view": "./src/gfx/link/view.ts", "./gfx/note": "./src/gfx/note/index.ts", "./gfx/note/view": "./src/gfx/note/view.ts", "./gfx/mindmap": "./src/gfx/mindmap/index.ts", diff --git a/blocksuite/affine/all/src/extensions/view.ts b/blocksuite/affine/all/src/extensions/view.ts index 52d38576ec..69d931f722 100644 --- a/blocksuite/affine/all/src/extensions/view.ts +++ b/blocksuite/affine/all/src/extensions/view.ts @@ -20,6 +20,7 @@ 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'; +import { LinkViewExtension as GfxLinkViewExtension } from '@blocksuite/affine-gfx-link/view'; import { MindmapViewExtension } from '@blocksuite/affine-gfx-mindmap/view'; import { NoteViewExtension as GfxNoteViewExtension } from '@blocksuite/affine-gfx-note/view'; import { PointerViewExtension } from '@blocksuite/affine-gfx-pointer/view'; @@ -62,6 +63,7 @@ export function getInternalViewExtensions() { GroupViewExtension, TextViewExtension, TemplateViewExtension, + GfxLinkViewExtension, // Block AttachmentViewExtension, diff --git a/blocksuite/affine/all/src/gfx/link/index.ts b/blocksuite/affine/all/src/gfx/link/index.ts new file mode 100644 index 0000000000..1270c60a2f --- /dev/null +++ b/blocksuite/affine/all/src/gfx/link/index.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-gfx-link'; diff --git a/blocksuite/affine/all/src/gfx/link/view.ts b/blocksuite/affine/all/src/gfx/link/view.ts new file mode 100644 index 0000000000..9ebdf3e851 --- /dev/null +++ b/blocksuite/affine/all/src/gfx/link/view.ts @@ -0,0 +1 @@ +export * from '@blocksuite/affine-gfx-link/view'; diff --git a/blocksuite/affine/all/tsconfig.json b/blocksuite/affine/all/tsconfig.json index 9dd823ff14..2922c06a1e 100644 --- a/blocksuite/affine/all/tsconfig.json +++ b/blocksuite/affine/all/tsconfig.json @@ -35,6 +35,7 @@ { "path": "../gfx/brush" }, { "path": "../gfx/connector" }, { "path": "../gfx/group" }, + { "path": "../gfx/link" }, { "path": "../gfx/mindmap" }, { "path": "../gfx/note" }, { "path": "../gfx/pointer" }, 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 3678d0aca5..2800d35842 100644 --- a/blocksuite/affine/blocks/root/src/edgeless/edgeless-root-spec.ts +++ b/blocksuite/affine/blocks/root/src/edgeless/edgeless-root-spec.ts @@ -13,7 +13,6 @@ import { EdgelessClipboardController } from './clipboard/clipboard.js'; import { NOTE_SLICER_WIDGET } from './components/note-slicer/index.js'; import { EDGELESS_DRAGGING_AREA_WIDGET } from './components/rects/edgeless-dragging-area-rect.js'; import { EDGELESS_SELECTED_RECT_WIDGET } from './components/rects/edgeless-selected-rect.js'; -import { quickTools } from './components/toolbar/tools.js'; import { EdgelessRootService } from './edgeless-root-service.js'; export const edgelessDraggingAreaWidget = WidgetViewExtension( @@ -45,7 +44,6 @@ const EdgelessCommonExtension: ExtensionType[] = [ CommonSpecs, EdgelessRootService, ViewportElementExtension('.affine-edgeless-viewport'), - ...quickTools, ].flat(); export const EdgelessRootBlockSpec: ExtensionType[] = [ diff --git a/blocksuite/affine/blocks/root/src/effects.ts b/blocksuite/affine/blocks/root/src/effects.ts index 0ab77045c6..cdee8ebe42 100644 --- a/blocksuite/affine/blocks/root/src/effects.ts +++ b/blocksuite/affine/blocks/root/src/effects.ts @@ -12,9 +12,6 @@ import { EDGELESS_SELECTED_RECT_WIDGET, EdgelessSelectedRectWidget, } from './edgeless/components/rects/edgeless-selected-rect.js'; -import { EdgelessSlideMenu } from './edgeless/components/toolbar/common/slide-menu.js'; -import { ToolbarArrowUpIcon } from './edgeless/components/toolbar/common/toolbar-arrow-up-icon.js'; -import { EdgelessLinkToolButton } from './edgeless/components/toolbar/link/link-tool-button.js'; import { EdgelessRootBlockComponent, EdgelessRootPreviewBlockComponent, @@ -25,7 +22,6 @@ import { export function effects() { // Register components by category registerRootComponents(); - registerEdgelessToolbarComponents(); registerMiscComponents(); } @@ -39,17 +35,6 @@ function registerRootComponents() { ); } -function registerEdgelessToolbarComponents() { - // Tool buttons - customElements.define('edgeless-link-tool-button', EdgelessLinkToolButton); - - // Menus - customElements.define('edgeless-slide-menu', EdgelessSlideMenu); - - // Toolbar components - customElements.define('toolbar-arrow-up-icon', ToolbarArrowUpIcon); -} - function registerMiscComponents() { // Auto-complete components customElements.define( @@ -81,9 +66,6 @@ declare global { 'note-slicer': NoteSlicer; 'edgeless-dragging-area-rect': EdgelessDraggingAreaRectWidget; 'edgeless-selected-rect': EdgelessSelectedRectWidget; - 'edgeless-slide-menu': EdgelessSlideMenu; - 'toolbar-arrow-up-icon': ToolbarArrowUpIcon; - 'edgeless-link-tool-button': EdgelessLinkToolButton; 'affine-page-root': PageRootBlockComponent; } } diff --git a/blocksuite/affine/gfx/link/package.json b/blocksuite/affine/gfx/link/package.json new file mode 100644 index 0000000000..22fd5a4393 --- /dev/null +++ b/blocksuite/affine/gfx/link/package.json @@ -0,0 +1,50 @@ +{ + "name": "@blocksuite/affine-gfx-link", + "description": "Gfx link for BlockSuite.", + "type": "module", + "scripts": { + "build": "tsc" + }, + "sideEffects": false, + "keywords": [], + "author": "toeverything", + "license": "MIT", + "dependencies": { + "@blocksuite/affine-block-bookmark": "workspace:*", + "@blocksuite/affine-block-embed": "workspace:*", + "@blocksuite/affine-block-surface": "workspace:*", + "@blocksuite/affine-components": "workspace:*", + "@blocksuite/affine-ext-loader": "workspace:*", + "@blocksuite/affine-gfx-pointer": "workspace:*", + "@blocksuite/affine-model": "workspace:*", + "@blocksuite/affine-rich-text": "workspace:*", + "@blocksuite/affine-shared": "workspace:*", + "@blocksuite/affine-widget-edgeless-toolbar": "workspace:*", + "@blocksuite/global": "workspace:*", + "@blocksuite/icons": "^2.2.12", + "@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", + "lit": "^3.2.0", + "lodash-es": "^4.17.21", + "minimatch": "^10.0.1", + "rxjs": "^7.8.1", + "yjs": "^13.6.21", + "zod": "^3.23.8" + }, + "exports": { + ".": "./src/index.ts", + "./effects": "./src/effects.ts", + "./view": "./src/view.ts" + }, + "files": [ + "src", + "dist", + "!src/__tests__", + "!dist/__tests__" + ], + "version": "0.21.0" +} diff --git a/blocksuite/affine/gfx/link/src/effects.ts b/blocksuite/affine/gfx/link/src/effects.ts new file mode 100644 index 0000000000..138a109a6f --- /dev/null +++ b/blocksuite/affine/gfx/link/src/effects.ts @@ -0,0 +1,5 @@ +import { EdgelessLinkToolButton } from './toolbar/link-tool-button'; + +export function effects() { + customElements.define('edgeless-link-tool-button', EdgelessLinkToolButton); +} diff --git a/blocksuite/affine/gfx/link/src/index.ts b/blocksuite/affine/gfx/link/src/index.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/blocksuite/affine/gfx/link/src/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/blocksuite/affine/blocks/root/src/edgeless/components/toolbar/tools.ts b/blocksuite/affine/gfx/link/src/link-tool.ts similarity index 60% rename from blocksuite/affine/blocks/root/src/edgeless/components/toolbar/tools.ts rename to blocksuite/affine/gfx/link/src/link-tool.ts index 8edd82adda..f56e7412e7 100644 --- a/blocksuite/affine/blocks/root/src/edgeless/components/toolbar/tools.ts +++ b/blocksuite/affine/gfx/link/src/link-tool.ts @@ -1,9 +1,9 @@ import { QuickToolExtension } from '@blocksuite/affine-widget-edgeless-toolbar'; import { html } from 'lit'; -import { buildLinkDenseMenu } from './link/link-dense-menu.js'; +import { buildLinkDenseMenu } from './toolbar/link-dense-menu'; -const linkQuickTool = QuickToolExtension('link', ({ block, gfx }) => { +export const linkQuickTool = QuickToolExtension('link', ({ block, gfx }) => { return { content: html` { menu: buildLinkDenseMenu(block, gfx), }; }); - -export const quickTools = [linkQuickTool]; diff --git a/blocksuite/affine/blocks/root/src/edgeless/components/toolbar/link/link-dense-menu.ts b/blocksuite/affine/gfx/link/src/toolbar/link-dense-menu.ts similarity index 100% rename from blocksuite/affine/blocks/root/src/edgeless/components/toolbar/link/link-dense-menu.ts rename to blocksuite/affine/gfx/link/src/toolbar/link-dense-menu.ts diff --git a/blocksuite/affine/blocks/root/src/edgeless/components/toolbar/link/link-tool-button.ts b/blocksuite/affine/gfx/link/src/toolbar/link-tool-button.ts similarity index 95% rename from blocksuite/affine/blocks/root/src/edgeless/components/toolbar/link/link-tool-button.ts rename to blocksuite/affine/gfx/link/src/toolbar/link-tool-button.ts index a3f7c2653d..785285f5a3 100644 --- a/blocksuite/affine/blocks/root/src/edgeless/components/toolbar/link/link-tool-button.ts +++ b/blocksuite/affine/gfx/link/src/toolbar/link-tool-button.ts @@ -2,10 +2,13 @@ import { insertLinkByQuickSearchCommand } from '@blocksuite/affine-block-bookmar import { insertEmbedCard } from '@blocksuite/affine-block-embed'; import { toggleEmbedCardCreateModal } from '@blocksuite/affine-components/embed-card-modal'; import { LinkIcon } from '@blocksuite/affine-components/icons'; +import type * as PointerEffect from '@blocksuite/affine-gfx-pointer'; import { TelemetryProvider } from '@blocksuite/affine-shared/services'; import { QuickToolMixin } from '@blocksuite/affine-widget-edgeless-toolbar'; import { css, html, LitElement } from 'lit'; +declare type _GLOBAL_ = typeof PointerEffect; + export class EdgelessLinkToolButton extends QuickToolMixin(LitElement) { static override styles = css` .link-icon, diff --git a/blocksuite/affine/gfx/link/src/view.ts b/blocksuite/affine/gfx/link/src/view.ts new file mode 100644 index 0000000000..b0358987d9 --- /dev/null +++ b/blocksuite/affine/gfx/link/src/view.ts @@ -0,0 +1,23 @@ +import { + type ViewExtensionContext, + ViewExtensionProvider, +} from '@blocksuite/affine-ext-loader'; + +import { effects } from './effects'; +import { linkQuickTool } from './link-tool'; + +export class LinkViewExtension extends ViewExtensionProvider { + override name = 'affine-link-gfx'; + + override effect() { + super.effect(); + effects(); + } + + override setup(context: ViewExtensionContext) { + super.setup(context); + if (this.isEdgeless(context.scope)) { + context.register(linkQuickTool); + } + } +} diff --git a/blocksuite/affine/gfx/link/tsconfig.json b/blocksuite/affine/gfx/link/tsconfig.json new file mode 100644 index 0000000000..f57151ece2 --- /dev/null +++ b/blocksuite/affine/gfx/link/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "tsBuildInfoFile": "./dist/tsconfig.tsbuildinfo" + }, + "include": ["./src"], + "references": [ + { "path": "../../blocks/bookmark" }, + { "path": "../../blocks/embed" }, + { "path": "../../blocks/surface" }, + { "path": "../../components" }, + { "path": "../../ext-loader" }, + { "path": "../pointer" }, + { "path": "../../model" }, + { "path": "../../rich-text" }, + { "path": "../../shared" }, + { "path": "../../widgets/edgeless-toolbar" }, + { "path": "../../../framework/global" }, + { "path": "../../../framework/std" }, + { "path": "../../../framework/store" } + ] +} diff --git a/blocksuite/affine/widgets/edgeless-toolbar/src/effects.ts b/blocksuite/affine/widgets/edgeless-toolbar/src/effects.ts index c0d3436dfe..a3edba787c 100644 --- a/blocksuite/affine/widgets/edgeless-toolbar/src/effects.ts +++ b/blocksuite/affine/widgets/edgeless-toolbar/src/effects.ts @@ -4,6 +4,8 @@ import { EDGELESS_TOOLBAR_WIDGET, EdgelessToolbarWidget, } from './edgeless-toolbar'; +import { EdgelessSlideMenu } from './menu/slide-menu'; +import { ToolbarArrowUpIcon } from './menu/toolbar-arrow-up-icon'; import { EdgelessFontFamilyPanel } from './panel/font-family-panel'; import { EdgelessFontWeightAndStylePanel } from './panel/font-weight-and-style-panel'; @@ -16,6 +18,8 @@ export function effects() { EdgelessFontWeightAndStylePanel ); customElements.define('edgeless-font-family-panel', EdgelessFontFamilyPanel); + customElements.define('edgeless-slide-menu', EdgelessSlideMenu); + customElements.define('toolbar-arrow-up-icon', ToolbarArrowUpIcon); } declare global { @@ -25,5 +29,7 @@ declare global { 'edgeless-toolbar-widget': EdgelessToolbarWidget; 'edgeless-font-weight-and-style-panel': EdgelessFontWeightAndStylePanel; 'edgeless-font-family-panel': EdgelessFontFamilyPanel; + 'edgeless-slide-menu': EdgelessSlideMenu; + 'toolbar-arrow-up-icon': ToolbarArrowUpIcon; } } diff --git a/blocksuite/affine/blocks/root/src/edgeless/components/toolbar/common/slide-menu.ts b/blocksuite/affine/widgets/edgeless-toolbar/src/menu/slide-menu.ts similarity index 99% rename from blocksuite/affine/blocks/root/src/edgeless/components/toolbar/common/slide-menu.ts rename to blocksuite/affine/widgets/edgeless-toolbar/src/menu/slide-menu.ts index 029a6aa31d..15f09a41f2 100644 --- a/blocksuite/affine/blocks/root/src/edgeless/components/toolbar/common/slide-menu.ts +++ b/blocksuite/affine/widgets/edgeless-toolbar/src/menu/slide-menu.ts @@ -1,7 +1,3 @@ -import { - type EdgelessToolbarSlots, - edgelessToolbarSlotsContext, -} from '@blocksuite/affine-widget-edgeless-toolbar'; import { WithDisposable } from '@blocksuite/global/lit'; import { ArrowRightSmallIcon } from '@blocksuite/icons/lit'; import { consume } from '@lit/context'; @@ -9,6 +5,11 @@ import { css, html, LitElement } from 'lit'; import { property, query } from 'lit/decorators.js'; import { styleMap } from 'lit/directives/style-map.js'; +import { + type EdgelessToolbarSlots, + edgelessToolbarSlotsContext, +} from '../index'; + export class EdgelessSlideMenu extends WithDisposable(LitElement) { static override styles = css` :host { diff --git a/blocksuite/affine/blocks/root/src/edgeless/components/toolbar/common/toolbar-arrow-up-icon.ts b/blocksuite/affine/widgets/edgeless-toolbar/src/menu/toolbar-arrow-up-icon.ts similarity index 100% rename from blocksuite/affine/blocks/root/src/edgeless/components/toolbar/common/toolbar-arrow-up-icon.ts rename to blocksuite/affine/widgets/edgeless-toolbar/src/menu/toolbar-arrow-up-icon.ts diff --git a/tools/utils/src/workspace.gen.ts b/tools/utils/src/workspace.gen.ts index ae362e0002..33b12504c2 100644 --- a/tools/utils/src/workspace.gen.ts +++ b/tools/utils/src/workspace.gen.ts @@ -33,6 +33,7 @@ export const PackageList = [ 'blocksuite/affine/gfx/brush', 'blocksuite/affine/gfx/connector', 'blocksuite/affine/gfx/group', + 'blocksuite/affine/gfx/link', 'blocksuite/affine/gfx/mindmap', 'blocksuite/affine/gfx/note', 'blocksuite/affine/gfx/pointer', @@ -546,6 +547,25 @@ export const PackageList = [ 'blocksuite/framework/store', ], }, + { + location: 'blocksuite/affine/gfx/link', + name: '@blocksuite/affine-gfx-link', + workspaceDependencies: [ + 'blocksuite/affine/blocks/bookmark', + 'blocksuite/affine/blocks/embed', + 'blocksuite/affine/blocks/surface', + 'blocksuite/affine/components', + 'blocksuite/affine/ext-loader', + 'blocksuite/affine/gfx/pointer', + 'blocksuite/affine/model', + 'blocksuite/affine/rich-text', + 'blocksuite/affine/shared', + 'blocksuite/affine/widgets/edgeless-toolbar', + 'blocksuite/framework/global', + 'blocksuite/framework/std', + 'blocksuite/framework/store', + ], + }, { location: 'blocksuite/affine/gfx/mindmap', name: '@blocksuite/affine-gfx-mindmap', @@ -1377,6 +1397,7 @@ export type PackageName = | '@blocksuite/affine-gfx-brush' | '@blocksuite/affine-gfx-connector' | '@blocksuite/affine-gfx-group' + | '@blocksuite/affine-gfx-link' | '@blocksuite/affine-gfx-mindmap' | '@blocksuite/affine-gfx-note' | '@blocksuite/affine-gfx-pointer' diff --git a/tsconfig.json b/tsconfig.json index 4a921b966d..7414a9452d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -80,6 +80,7 @@ { "path": "./blocksuite/affine/gfx/brush" }, { "path": "./blocksuite/affine/gfx/connector" }, { "path": "./blocksuite/affine/gfx/group" }, + { "path": "./blocksuite/affine/gfx/link" }, { "path": "./blocksuite/affine/gfx/mindmap" }, { "path": "./blocksuite/affine/gfx/note" }, { "path": "./blocksuite/affine/gfx/pointer" }, diff --git a/yarn.lock b/yarn.lock index 5804586fbc..b2eb23aecf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3209,6 +3209,37 @@ __metadata: languageName: unknown linkType: soft +"@blocksuite/affine-gfx-link@workspace:*, @blocksuite/affine-gfx-link@workspace:blocksuite/affine/gfx/link": + version: 0.0.0-use.local + resolution: "@blocksuite/affine-gfx-link@workspace:blocksuite/affine/gfx/link" + dependencies: + "@blocksuite/affine-block-bookmark": "workspace:*" + "@blocksuite/affine-block-embed": "workspace:*" + "@blocksuite/affine-block-surface": "workspace:*" + "@blocksuite/affine-components": "workspace:*" + "@blocksuite/affine-ext-loader": "workspace:*" + "@blocksuite/affine-gfx-pointer": "workspace:*" + "@blocksuite/affine-model": "workspace:*" + "@blocksuite/affine-rich-text": "workspace:*" + "@blocksuite/affine-shared": "workspace:*" + "@blocksuite/affine-widget-edgeless-toolbar": "workspace:*" + "@blocksuite/global": "workspace:*" + "@blocksuite/icons": "npm:^2.2.12" + "@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" + lit: "npm:^3.2.0" + lodash-es: "npm:^4.17.21" + minimatch: "npm:^10.0.1" + rxjs: "npm:^7.8.1" + yjs: "npm:^13.6.21" + zod: "npm:^3.23.8" + languageName: unknown + linkType: soft + "@blocksuite/affine-gfx-mindmap@workspace:*, @blocksuite/affine-gfx-mindmap@workspace:blocksuite/affine/gfx/mindmap": version: 0.0.0-use.local resolution: "@blocksuite/affine-gfx-mindmap@workspace:blocksuite/affine/gfx/mindmap" @@ -4020,6 +4051,7 @@ __metadata: "@blocksuite/affine-gfx-brush": "workspace:*" "@blocksuite/affine-gfx-connector": "workspace:*" "@blocksuite/affine-gfx-group": "workspace:*" + "@blocksuite/affine-gfx-link": "workspace:*" "@blocksuite/affine-gfx-mindmap": "workspace:*" "@blocksuite/affine-gfx-note": "workspace:*" "@blocksuite/affine-gfx-pointer": "workspace:*"