diff --git a/packages/common/env/package.json b/packages/common/env/package.json index 759043b082..bc0d96097e 100644 --- a/packages/common/env/package.json +++ b/packages/common/env/package.json @@ -3,8 +3,8 @@ "private": true, "type": "module", "devDependencies": { - "@blocksuite/global": "0.17.8", - "@blocksuite/store": "0.17.8", + "@blocksuite/global": "0.17.9", + "@blocksuite/store": "0.17.9", "react": "18.3.1", "react-dom": "18.3.1", "vitest": "2.0.5" diff --git a/packages/common/infra/package.json b/packages/common/infra/package.json index ec07ee6ce3..ac97f5bb0e 100644 --- a/packages/common/infra/package.json +++ b/packages/common/infra/package.json @@ -14,10 +14,10 @@ "@affine/debug": "workspace:*", "@affine/env": "workspace:*", "@affine/templates": "workspace:*", - "@blocksuite/blocks": "0.17.8", - "@blocksuite/global": "0.17.8", - "@blocksuite/presets": "0.17.8", - "@blocksuite/store": "0.17.8", + "@blocksuite/blocks": "0.17.9", + "@blocksuite/global": "0.17.9", + "@blocksuite/presets": "0.17.9", + "@blocksuite/store": "0.17.9", "@datastructures-js/binary-search-tree": "^5.3.2", "foxact": "^0.2.33", "fuse.js": "^7.0.0", @@ -34,8 +34,8 @@ "devDependencies": { "@affine-test/fixtures": "workspace:*", "@affine/templates": "workspace:*", - "@blocksuite/block-std": "0.17.8", - "@blocksuite/presets": "0.17.8", + "@blocksuite/block-std": "0.17.9", + "@blocksuite/presets": "0.17.9", "@testing-library/react": "^16.0.0", "async-call-rpc": "^6.4.0", "fake-indexeddb": "^6.0.0", diff --git a/packages/frontend/apps/electron/package.json b/packages/frontend/apps/electron/package.json index 2cc5bbda06..9dc190b1fc 100644 --- a/packages/frontend/apps/electron/package.json +++ b/packages/frontend/apps/electron/package.json @@ -29,10 +29,10 @@ "@affine/env": "workspace:*", "@affine/i18n": "workspace:*", "@affine/native": "workspace:*", - "@blocksuite/block-std": "0.17.8", - "@blocksuite/blocks": "0.17.8", - "@blocksuite/presets": "0.17.8", - "@blocksuite/store": "0.17.8", + "@blocksuite/block-std": "0.17.9", + "@blocksuite/blocks": "0.17.9", + "@blocksuite/presets": "0.17.9", + "@blocksuite/store": "0.17.9", "@electron-forge/cli": "^7.3.0", "@electron-forge/core": "^7.3.0", "@electron-forge/core-utils": "^7.3.0", diff --git a/packages/frontend/apps/mobile/package.json b/packages/frontend/apps/mobile/package.json index e942e709bf..1890ac42c2 100644 --- a/packages/frontend/apps/mobile/package.json +++ b/packages/frontend/apps/mobile/package.json @@ -15,7 +15,7 @@ "@affine/env": "workspace:*", "@affine/graphql": "workspace:*", "@affine/i18n": "workspace:*", - "@blocksuite/blocks": "^0.17.6", + "@blocksuite/blocks": "0.17.9", "@blocksuite/icons": "^2.1.66", "@radix-ui/react-collapsible": "^1.0.3", "@sentry/react": "^8.0.0", diff --git a/packages/frontend/apps/mobile/src/pages/workspace/detail/mobile-detail-page.tsx b/packages/frontend/apps/mobile/src/pages/workspace/detail/mobile-detail-page.tsx index 9dcad9e54b..2c90d22852 100644 --- a/packages/frontend/apps/mobile/src/pages/workspace/detail/mobile-detail-page.tsx +++ b/packages/frontend/apps/mobile/src/pages/workspace/detail/mobile-detail-page.tsx @@ -11,7 +11,6 @@ import { EditorService } from '@affine/core/modules/editor'; import { WorkbenchService } from '@affine/core/modules/workbench'; import { ViewService } from '@affine/core/modules/workbench/services/view'; import { DetailPageWrapper } from '@affine/core/pages/workspace/detail-page/detail-page-wrapper'; -import type { PageRootService } from '@blocksuite/blocks'; import { BookmarkBlockService, customImageProxyMiddleware, @@ -19,6 +18,7 @@ import { EmbedLoomBlockService, EmbedYoutubeBlockService, ImageBlockService, + RefNodeSlotsProvider, } from '@blocksuite/blocks'; import { DisposableGroup } from '@blocksuite/global/utils'; import { type AffineEditorContainer } from '@blocksuite/presets'; @@ -59,7 +59,7 @@ const DetailPageImpl = () => { const mode = useLiveData(editor.mode$); const isInTrash = useLiveData(doc.meta$.map(meta => meta.trash)); - const { openPage, jumpToPageBlock, jumpToTag } = useNavigateHelper(); + const { openPage, jumpToPageBlock } = useNavigateHelper(); const editorContainer = useLiveData(editor.editorContainer$); const { setDocReadonly } = useDocMetaHelper(); @@ -129,12 +129,11 @@ const DetailPageImpl = () => { ); // provide page mode and updated date to blocksuite - const pageService = - editorHost?.std.getService('affine:page'); + const refNodeService = editorHost?.std.getOptional(RefNodeSlotsProvider); const disposable = new DisposableGroup(); - if (pageService) { + if (refNodeService) { disposable.add( - pageService.slots.docLinkClicked.on(({ pageId, params }) => { + refNodeService.docLinkClicked.on(({ pageId, params }) => { if (params) { const { mode, blockIds, elementIds } = params; return jumpToPageBlock( @@ -149,11 +148,6 @@ const DetailPageImpl = () => { return openPage(docCollection.id, pageId); }) ); - disposable.add( - pageService.slots.tagClicked.on(({ tagId }) => { - jumpToTag(workspace.id, tagId); - }) - ); } editor.setEditorContainer(editorContainer); @@ -162,14 +156,7 @@ const DetailPageImpl = () => { disposable.dispose(); }; }, - [ - editor, - jumpToPageBlock, - docCollection.id, - openPage, - jumpToTag, - workspace.id, - ] + [docCollection.id, editor, jumpToPageBlock, openPage] ); return ( diff --git a/packages/frontend/component/package.json b/packages/frontend/component/package.json index a6b0005a50..9f68c01e6f 100644 --- a/packages/frontend/component/package.json +++ b/packages/frontend/component/package.json @@ -81,12 +81,12 @@ "zod": "^3.22.4" }, "devDependencies": { - "@blocksuite/block-std": "0.17.8", - "@blocksuite/blocks": "0.17.8", - "@blocksuite/global": "0.17.8", + "@blocksuite/block-std": "0.17.9", + "@blocksuite/blocks": "0.17.9", + "@blocksuite/global": "0.17.9", "@blocksuite/icons": "2.1.67", - "@blocksuite/presets": "0.17.8", - "@blocksuite/store": "0.17.8", + "@blocksuite/presets": "0.17.9", + "@blocksuite/store": "0.17.9", "@chromatic-com/storybook": "^1", "@storybook/addon-actions": "^8.2.9", "@storybook/addon-essentials": "^8.2.9", diff --git a/packages/frontend/core/package.json b/packages/frontend/core/package.json index 4b3ddc914d..1f9393e672 100644 --- a/packages/frontend/core/package.json +++ b/packages/frontend/core/package.json @@ -15,14 +15,14 @@ "@affine/graphql": "workspace:*", "@affine/i18n": "workspace:*", "@affine/templates": "workspace:*", - "@blocksuite/affine-block-surface": "0.17.8", - "@blocksuite/block-std": "0.17.8", - "@blocksuite/blocks": "0.17.8", - "@blocksuite/global": "0.17.8", + "@blocksuite/affine-block-surface": "0.17.9", + "@blocksuite/block-std": "0.17.9", + "@blocksuite/blocks": "0.17.9", + "@blocksuite/global": "0.17.9", "@blocksuite/icons": "2.1.67", - "@blocksuite/inline": "0.17.8", - "@blocksuite/presets": "0.17.8", - "@blocksuite/store": "0.17.8", + "@blocksuite/inline": "0.17.9", + "@blocksuite/presets": "0.17.9", + "@blocksuite/store": "0.17.9", "@dnd-kit/core": "^6.1.0", "@dnd-kit/modifiers": "^7.0.0", "@dnd-kit/sortable": "^8.0.0", diff --git a/packages/frontend/core/src/blocksuite/presets/ai/_common/chat-actions-handle.ts b/packages/frontend/core/src/blocksuite/presets/ai/_common/chat-actions-handle.ts index 986c894f53..fa95460cfe 100644 --- a/packages/frontend/core/src/blocksuite/presets/ai/_common/chat-actions-handle.ts +++ b/packages/frontend/core/src/blocksuite/presets/ai/_common/chat-actions-handle.ts @@ -4,17 +4,21 @@ import type { EditorHost, TextSelection, } from '@blocksuite/block-std'; +import type { + DocMode, + EdgelessRootService, + ImageSelection, + RootService, +} from '@blocksuite/blocks'; import { - type DocMode, + BlocksUtils, DocModeProvider, - type EdgelessRootService, EditPropsStore, - type ImageSelection, + NoteDisplayMode, NotificationProvider, - type PageRootService, + RefNodeSlotsProvider, TelemetryProvider, } from '@blocksuite/blocks'; -import { BlocksUtils, NoteDisplayMode } from '@blocksuite/blocks'; import { Bound, getElementsBound, @@ -110,10 +114,7 @@ export async function constructRootChatBlockMessages( return constructUserInfoWithMessages(forkMessages, userInfo); } -function getViewportCenter( - mode: DocMode, - rootService: PageRootService | EdgelessRootService -) { +function getViewportCenter(mode: DocMode, rootService: RootService) { const center = { x: 400, y: 50 }; if (mode === 'page') { const viewport = rootService.std.get(EditPropsStore).getStorage('viewport'); @@ -310,7 +311,7 @@ const SAVE_CHAT_TO_BLOCK_ACTION: ChatAction = { const curMode = docModeService.getEditorMode() || 'page'; const viewportCenter = getViewportCenter( curMode, - rootService as PageRootService + rootService as RootService ); const newBlockIndex = layer.generateIndex('affine:embed-ai-chat'); // If current mode is not edgeless, switch to edgeless mode first @@ -430,7 +431,7 @@ const CREATE_AS_DOC = { newDoc.addBlock('affine:surface', {}, rootId); const noteId = newDoc.addBlock('affine:note', {}, rootId); - host.std.getService('affine:page')?.slots.docLinkClicked.emit({ + host.std.getOptional(RefNodeSlotsProvider)?.docLinkClicked.emit({ pageId: newDoc.id, }); let complete = false; diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-editor/ai/setup-provider.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-editor/ai/setup-provider.tsx index 9a3bc06904..818a341304 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-editor/ai/setup-provider.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-editor/ai/setup-provider.tsx @@ -42,7 +42,7 @@ const processTypeToPromptName = new Map( }) ); -function setupAIProvider() { +export function setupAIProvider() { // a single workspace should have only a single chat session // user-id:workspace-id:doc-id -> chat session id const chatSessions = new Map>(); @@ -490,5 +490,3 @@ Could you make a new website based on these notes and send back just the html fi setupTracker(); } - -setupAIProvider(); diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-editor/blocksuite-editor-container.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-editor/blocksuite-editor-container.tsx index 64efa78a9c..8a7143f470 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-editor/blocksuite-editor-container.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-editor/blocksuite-editor-container.tsx @@ -1,4 +1,3 @@ -import type { ReferenceInfo } from '@blocksuite/affine-model'; import type { DocMode } from '@blocksuite/blocks'; import type { AffineEditorContainer, @@ -21,21 +20,6 @@ import { import { BlocksuiteDocEditor, BlocksuiteEdgelessEditor } from './lit-adaper'; import * as styles from './styles.css'; -// copy forwardSlot from blocksuite, but it seems we need to dispose the pipe -// after the component is unmounted right? -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function forwardSlot>>( - from: T, - to: Partial -) { - Object.entries(from).forEach(([key, slot]) => { - const target = to[key]; - if (target) { - slot.pipe(target); - } - }); -} - interface BlocksuiteEditorContainerProps { page: Doc; mode: DocMode; @@ -65,38 +49,15 @@ export const BlocksuiteEditorContainer = forwardRef< const slots: BlocksuiteEditorContainerRef['slots'] = useMemo(() => { return { - docLinkClicked: new Slot(), editorModeSwitched: new Slot(), docUpdated: new Slot(), - tagClicked: new Slot(), }; }, []); - // forward the slot to the webcomponent - useLayoutEffect(() => { - requestAnimationFrame(() => { - const docPage = rootRef.current?.querySelector('affine-page-root'); - const edgelessPage = rootRef.current?.querySelector( - 'affine-edgeless-root' - ); - if (docPage) { - forwardSlot(docPage.slots, slots); - } - - if (edgelessPage) { - forwardSlot(edgelessPage.slots, slots); - } - }); - }, [page, slots]); - useLayoutEffect(() => { slots.docUpdated.emit({ newDocId: page.id }); }, [page, slots.docUpdated]); - useLayoutEffect(() => { - slots.editorModeSwitched.emit(mode); - }, [mode, slots.editorModeSwitched]); - /** * mimic an AffineEditorContainer using proxy */ diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-editor/index.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-editor/index.tsx index b69c729cff..89f05ebff3 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-editor/index.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-editor/index.tsx @@ -1,5 +1,13 @@ export * from './blocksuite-editor'; export { getFontConfigExtension } from './specs/font-extension'; -import './ai/setup-provider'; -import './specs/preview'; +import { effects as blocksEffects } from '@blocksuite/blocks/effects'; +import { effects as presetsEffects } from '@blocksuite/presets/effects'; + +import { setupAIProvider } from './ai/setup-provider'; +import { effects as patchEffects } from './specs/preview'; + +blocksEffects(); +presetsEffects(); +patchEffects(); +setupAIProvider(); diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-editor/lit-adaper.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-editor/lit-adaper.tsx index 2c7d2f6c87..9cf2df388e 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-editor/lit-adaper.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-editor/lit-adaper.tsx @@ -38,6 +38,7 @@ import { patchEdgelessClipboard, patchForSharedPage, patchNotificationService, + patchParseDocUrlExtension, patchPeekViewService, patchQuickSearchService, patchReferenceRenderer, @@ -118,9 +119,8 @@ const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => { patched = patched.concat(patchNotificationService(confirmModal)); patched = patched.concat(patchPeekViewService(peekViewService)); patched = patched.concat(patchEdgelessClipboard()); - if (!page.readonly) { - patched = patched.concat(patchQuickSearchService(framework)); - } + patched = patched.concat(patchParseDocUrlExtension(framework)); + patched = patched.concat(patchQuickSearchService(framework)); if (shared) { patched = patched.concat(patchForSharedPage()); } @@ -134,7 +134,6 @@ const usePatchSpecs = (page: Doc, shared: boolean, mode: DocMode) => { docsService, editorService, framework, - page.readonly, peekViewService, reactToLit, referenceRenderer, diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/common.ts b/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/common.ts index 54e6738603..6e093d810f 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/common.ts +++ b/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/common.ts @@ -22,6 +22,7 @@ import { LatexBlockSpec, ListBlockSpec, ParagraphBlockSpec, + RefNodeSlotsExtension, RichTextExtensions, } from '@blocksuite/blocks'; import { AIChatBlockSpec } from '@blocksuite/presets'; @@ -29,6 +30,7 @@ import { AIChatBlockSpec } from '@blocksuite/presets'; import { CustomAttachmentBlockSpec } from './custom/attachment-block'; const CommonBlockSpecs: ExtensionType[] = [ + RefNodeSlotsExtension(), EditPropsStore, RichTextExtensions, LatexBlockSpec, diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/custom/spec-patchers.tsx b/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/custom/spec-patchers.tsx index e22d019c0b..9a19927a6e 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/custom/spec-patchers.tsx +++ b/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/custom/spec-patchers.tsx @@ -8,7 +8,6 @@ import { type useConfirmModal, } from '@affine/component'; import { track } from '@affine/core/mixpanel'; -import { DocsSearchService } from '@affine/core/modules/docs-search'; import type { EditorService } from '@affine/core/modules/editor'; import { resolveLinkToDoc } from '@affine/core/modules/navigation'; import type { PeekViewService } from '@affine/core/modules/peek-view'; @@ -20,6 +19,7 @@ import { QuickSearchService, RecentDocsQuickSearchSession, } from '@affine/core/modules/quicksearch'; +import { ExternalLinksQuickSearchSession } from '@affine/core/modules/quicksearch/impls/external-links'; import { DebugLogger } from '@affine/debug'; import { type BlockService, @@ -43,6 +43,7 @@ import { EmbedLinkedDocBlockComponent, EmbedOptionProvider, NotificationExtension, + ParseDocUrlExtension, PeekViewExtension, QuickSearchExtension, QuickSearchProvider, @@ -54,6 +55,7 @@ import { type DocService, DocsService, type FrameworkProvider, + WorkspaceService, } from '@toeverything/infra'; import { type TemplateResult } from 'lit'; import { customElement } from 'lit/decorators.js'; @@ -282,109 +284,84 @@ export function patchDocModeService( export function patchQuickSearchService(framework: FrameworkProvider) { const QuickSearch = QuickSearchExtension({ - async searchDoc(options) { + async openQuickSearch() { let searchResult: QuickSearchResult = null; - if (options.skipSelection) { - const query = options.userInput; - if (!query) { - logger.error('No user input provided'); - } else { - const resolvedDoc = resolveLinkToDoc(query); - if (resolvedDoc) { - searchResult = { - docId: resolvedDoc.docId, - }; - } else if ( - query.startsWith('http://') || - query.startsWith('https://') - ) { - searchResult = { - userInput: query, - }; - } else { - const searchedDoc = ( - await framework.get(DocsSearchService).search(query) - ).at(0); - if (searchedDoc) { - searchResult = { - docId: searchedDoc.docId, - }; + searchResult = await new Promise(resolve => + framework.get(QuickSearchService).quickSearch.show( + [ + framework.get(RecentDocsQuickSearchSession), + framework.get(CreationQuickSearchSession), + framework.get(DocsQuickSearchSession), + framework.get(LinksQuickSearchSession), + framework.get(ExternalLinksQuickSearchSession), + ], + result => { + if (result === null) { + resolve(null); + return; } - } - } - } else { - searchResult = await new Promise(resolve => - framework.get(QuickSearchService).quickSearch.show( - [ - framework.get(RecentDocsQuickSearchSession), - framework.get(CreationQuickSearchSession), - framework.get(DocsQuickSearchSession), - framework.get(LinksQuickSearchSession), - ], - result => { - if (result === null) { - resolve(null); - return; - } - if (result.source === 'docs') { - resolve({ - docId: result.payload.docId, - }); - return; - } + if (result.source === 'docs') { + resolve({ + docId: result.payload.docId, + }); + return; + } - if (result.source === 'recent-doc') { - resolve({ - docId: result.payload.docId, - }); - return; - } + if (result.source === 'recent-doc') { + resolve({ + docId: result.payload.docId, + }); + return; + } - if (result.source === 'link') { - if (result.payload.external) { - const userInput = result.payload.external.url; - resolve({ userInput }); - return; - } + if (result.source === 'link') { + const { docId, blockIds, elementIds, mode } = result.payload; + resolve({ + docId, + params: { + blockIds, + elementIds, + mode, + }, + }); + return; + } - if (result.payload.internal) { - const { docId, params } = result.payload.internal; - resolve({ docId, params }); - } - return; - } + if (result.source === 'external-link') { + const externalUrl = result.payload.url; + resolve({ externalUrl }); + return; + } - if (result.source === 'creation') { - const docsService = framework.get(DocsService); - const mode = - result.id === 'creation:create-edgeless' - ? 'edgeless' - : 'page'; - const newDoc = docsService.createDoc({ - primaryMode: mode, - title: result.payload.title, - }); + if (result.source === 'creation') { + const docsService = framework.get(DocsService); + const mode = + result.id === 'creation:create-edgeless' ? 'edgeless' : 'page'; + const newDoc = docsService.createDoc({ + primaryMode: mode, + title: result.payload.title, + }); + track.doc.editor.quickSearch.createDoc({ + mode, + }); - resolve({ - docId: newDoc.id, - isNewDoc: true, - }); - return; - } + resolve({ + docId: newDoc.id, + }); + return; + } + }, + { + label: { + key: 'com.affine.cmdk.insert-links', }, - { - defaultQuery: options.userInput, - label: { - key: 'com.affine.cmdk.insert-links', - }, - placeholder: { - key: 'com.affine.cmdk.docs.placeholder', - }, - } - ) - ); - } + placeholder: { + key: 'com.affine.cmdk.docs.placeholder', + }, + } + ) + ); return searchResult; }, @@ -408,7 +385,7 @@ export function patchQuickSearchService(framework: FrameworkProvider) { if (!quickSearchService) return oldAction({ model, rootComponent }); - const result = await quickSearchService.searchDoc({}); + const result = await quickSearchService.openQuickSearch(); if (result === null) return; if ('docId' in result) { @@ -424,28 +401,23 @@ export function patchQuickSearchService(framework: FrameworkProvider) { pageId: linkedDoc.id, }; - if (!result.isNewDoc && result.params) { + if (result.params) { props.params = result.params; } host.doc.addSiblingBlocks(model, [props]); - if (result.isNewDoc) { - track.doc.editor.slashMenu.createDoc({ control: 'linkDoc' }); - track.doc.editor.slashMenu.linkDoc({ control: 'createDoc' }); - } else { - track.doc.editor.slashMenu.linkDoc({ control: 'linkDoc' }); - } - } else if ('userInput' in result) { + track.doc.editor.slashMenu.linkDoc({ control: 'linkDoc' }); + } else if (result.externalUrl) { const embedOptions = std .get(EmbedOptionProvider) - .getEmbedBlockOptions(result.userInput); + .getEmbedBlockOptions(result.externalUrl); if (!embedOptions) return; host.doc.addSiblingBlocks(model, [ { flavour: embedOptions.flavour, - url: result.userInput, + url: result.externalUrl, }, ]); } @@ -458,6 +430,25 @@ export function patchQuickSearchService(framework: FrameworkProvider) { return [QuickSearch, SlashMenuQuickSearchExtension]; } +export function patchParseDocUrlExtension(framework: FrameworkProvider) { + const workspaceService = framework.get(WorkspaceService); + const ParseDocUrl = ParseDocUrlExtension({ + parseDocUrl(url) { + const info = resolveLinkToDoc(url); + if (!info || info.workspaceId !== workspaceService.workspace.id) return; + + return { + docId: info.docId, + blockIds: info.blockIds, + elementIds: info.elementIds, + mode: info.mode, + }; + }, + }); + + return [ParseDocUrl]; +} + export function patchEdgelessClipboard() { class EdgelessClipboardWatcher extends BlockServiceWatcher { static override readonly flavour = 'affine:page'; diff --git a/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/preview.ts b/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/preview.ts index fae031be53..8f9da9114f 100644 --- a/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/preview.ts +++ b/packages/frontend/core/src/components/blocksuite/block-suite-editor/specs/preview.ts @@ -9,5 +9,7 @@ function patchPreviewSpec(id: string, specs: ExtensionType[]) { specProvider.extendSpec(id, specs); } -// Patch edgeless preview spec for blocksuite surface-ref and embed-synced-doc -patchPreviewSpec('edgeless:preview', CustomSpecs); +export function effects() { + // Patch edgeless preview spec for blocksuite surface-ref and embed-synced-doc + patchPreviewSpec('edgeless:preview', CustomSpecs); +} diff --git a/packages/frontend/core/src/hooks/affine/use-export-page.ts b/packages/frontend/core/src/hooks/affine/use-export-page.ts index 8ffe666d76..e6c78922f5 100644 --- a/packages/frontend/core/src/hooks/affine/use-export-page.ts +++ b/packages/frontend/core/src/hooks/affine/use-export-page.ts @@ -6,8 +6,8 @@ import { import { track } from '@affine/core/mixpanel'; import { EditorService } from '@affine/core/modules/editor'; import { useI18n } from '@affine/i18n'; -import type { PageRootService } from '@blocksuite/blocks'; import { + ExportManager, HtmlTransformer, MarkdownTransformer, printToPdf, @@ -34,27 +34,22 @@ async function exportHandler({ editorContainer, }: ExportHandlerOptions) { const editorRoot = document.querySelector('editor-host'); - let pageService: PageRootService | null = null; - if (editorRoot) { - pageService = editorRoot.std.getService('affine:page'); - } track.$.sharePanel.$.export({ type, }); switch (type) { case 'html': await HtmlTransformer.exportDoc(page); - break; + return; case 'markdown': await MarkdownTransformer.exportDoc(page); - break; + return; case 'pdf': await printToPdf(editorContainer); return; case 'png': { - if (!pageService) return; - await pageService.exportManager.exportPng(); - break; + await editorRoot?.std.get(ExportManager).exportPng(); + return; } } } diff --git a/packages/frontend/core/src/mixpanel/events.ts b/packages/frontend/core/src/mixpanel/events.ts index 292c1d695f..4f85f575f7 100644 --- a/packages/frontend/core/src/mixpanel/events.ts +++ b/packages/frontend/core/src/mixpanel/events.ts @@ -264,6 +264,7 @@ const PageEvents = { editor: { slashMenu: ['linkDoc', 'createDoc'], atMenu: ['linkDoc'], + quickSearch: ['createDoc'], formatToolbar: ['bold'], pageRef: ['navigate'], toolbar: ['copyBlockToLink'], diff --git a/packages/frontend/core/src/modules/editor/entities/editor.ts b/packages/frontend/core/src/modules/editor/entities/editor.ts index 837ea71d47..b1b4afa8d4 100644 --- a/packages/frontend/core/src/modules/editor/entities/editor.ts +++ b/packages/frontend/core/src/modules/editor/entities/editor.ts @@ -1,5 +1,5 @@ import type { DocMode, EdgelessRootService } from '@blocksuite/blocks'; -import type { InlineEditor } from '@blocksuite/inline/inline-editor'; +import type { InlineEditor } from '@blocksuite/inline'; import type { AffineEditorContainer, DocTitle } from '@blocksuite/presets'; import type { DocService, WorkspaceService } from '@toeverything/infra'; import { Entity, LiveData } from '@toeverything/infra'; diff --git a/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx b/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx index e042a59ad4..48248fb94a 100644 --- a/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx +++ b/packages/frontend/core/src/modules/peek-view/view/doc-preview/doc-peek-view.tsx @@ -7,7 +7,11 @@ import { EditorOutlineViewer } from '@affine/core/components/blocksuite/outline- import { EditorService } from '@affine/core/modules/editor'; import { PageNotFound } from '@affine/core/pages/404'; import { DebugLogger } from '@affine/debug'; -import type { DocMode, EdgelessRootService } from '@blocksuite/blocks'; +import { + type DocMode, + type EdgelessRootService, + RefNodeSlotsProvider, +} from '@blocksuite/blocks'; import { Bound, DisposableGroup } from '@blocksuite/global/utils'; import type { AffineEditorContainer } from '@blocksuite/presets'; import { @@ -87,13 +91,12 @@ function DocPeekPreviewEditor({ return; } const disposableGroup = new DisposableGroup(); - const rootService = editorContainer.host.std.getService('affine:page'); - if (!rootService) { - return; - } + const refNodeSlots = + editorContainer.host.std.getOptional(RefNodeSlotsProvider); + if (!refNodeSlots) return; // doc change event inside peek view should be handled by peek view disposableGroup.add( - rootService.slots.docLinkClicked.on(options => { + refNodeSlots.docLinkClicked.on(options => { peekView .open({ type: 'doc', diff --git a/packages/frontend/core/src/modules/quicksearch/impls/external-links.ts b/packages/frontend/core/src/modules/quicksearch/impls/external-links.ts new file mode 100644 index 0000000000..4e843f7ab0 --- /dev/null +++ b/packages/frontend/core/src/modules/quicksearch/impls/external-links.ts @@ -0,0 +1,55 @@ +import { LinkIcon } from '@blocksuite/icons/rc'; +import type { WorkspaceService } from '@toeverything/infra'; +import { Entity, LiveData } from '@toeverything/infra'; + +import { resolveLinkToDoc } from '../../navigation'; +import type { QuickSearchSession } from '../providers/quick-search-provider'; +import type { QuickSearchItem } from '../types/item'; + +type ExternalLinkPayload = { + url: string; +}; + +export class ExternalLinksQuickSearchSession + extends Entity + implements QuickSearchSession<'external-link', ExternalLinkPayload> +{ + constructor(private readonly workspaceService: WorkspaceService) { + super(); + } + + query$ = new LiveData(''); + + items$ = LiveData.computed(get => { + const query = get(this.query$); + if (!query) return []; + + const isLink = query.startsWith('http://') || query.startsWith('https://'); + if (!isLink) return []; + + const resolvedDoc = resolveLinkToDoc(query); + if ( + resolvedDoc && + resolvedDoc.workspaceId === this.workspaceService.workspace.id + ) { + // is doc url + return []; + } + + return [ + { + id: 'external-link:' + query, + source: 'external-link', + icon: LinkIcon, + label: { + key: 'com.affine.cmdk.affine.insert-link', + }, + payload: { url: query }, + } as QuickSearchItem<'external-link', ExternalLinkPayload>, + ]; + }); + + query(query: string) { + this.query$.next(query); + } +} diff --git a/packages/frontend/core/src/modules/quicksearch/impls/links.ts b/packages/frontend/core/src/modules/quicksearch/impls/links.ts index f2d853d1ea..2fb5593759 100644 --- a/packages/frontend/core/src/modules/quicksearch/impls/links.ts +++ b/packages/frontend/core/src/modules/quicksearch/impls/links.ts @@ -1,8 +1,8 @@ -import type { ReferenceParams } from '@blocksuite/blocks'; -import { BlockLinkIcon, LinkIcon } from '@blocksuite/icons/rc'; -import type { DocsService } from '@toeverything/infra'; +import type { DocMode } from '@blocksuite/blocks'; +import { BlockLinkIcon, EdgelessIcon, PageIcon } from '@blocksuite/icons/rc'; +import type { DocsService, WorkspaceService } from '@toeverything/infra'; import { Entity, LiveData } from '@toeverything/infra'; -import { isEmpty, pick, truncate } from 'lodash-es'; +import { truncate } from 'lodash-es'; import { resolveLinkToDoc } from '../../navigation'; import type { QuickSearchSession } from '../providers/quick-search-provider'; @@ -10,16 +10,10 @@ import type { DocDisplayMetaService } from '../services/doc-display-meta'; import type { QuickSearchItem } from '../types/item'; type LinkPayload = { - internal?: { - docId: string; - title?: string; - blockId?: string; - blockContent?: string; - params?: ReferenceParams; - }; - external?: { - url: string; - }; + docId: string; + blockIds?: string[]; + elementIds?: string[]; + mode?: DocMode; }; export class LinksQuickSearchSession @@ -27,6 +21,7 @@ export class LinksQuickSearchSession implements QuickSearchSession<'link', LinkPayload> { constructor( + private readonly workspaceService: WorkspaceService, private readonly docsService: DocsService, private readonly docDisplayMetaService: DocDisplayMetaService ) { @@ -43,44 +38,25 @@ export class LinksQuickSearchSession if (!isLink) return []; const resolvedDoc = resolveLinkToDoc(query); - if (!resolvedDoc) { - return [ - { - id: 'link', - source: 'link', - icon: LinkIcon, - label: { - key: 'com.affine.cmdk.affine.insert-link', - }, - payload: { external: { url: query } }, - } as QuickSearchItem<'link', LinkPayload>, - ]; + if ( + !resolvedDoc || + resolvedDoc.workspaceId !== this.workspaceService.workspace.id + ) { + return []; } const docId = resolvedDoc.docId; const doc = this.docsService.list.doc$(docId).value; if (!doc || get(doc.trash$)) return []; - const params = pick(resolvedDoc, ['mode', 'blockIds', 'elementIds']); const { title, icon, updatedDate } = this.docDisplayMetaService.getDocDisplayMeta(doc); - const blockId = params?.blockIds?.[0]; - const linkToNode = Boolean(blockId); + const linkToNode = resolvedDoc.blockIds || resolvedDoc.elementIds; const score = 100; - const internal = { - docId, - score, - blockId, - blockContent: '', - }; - - if (linkToNode && !isEmpty(params)) { - Object.assign(internal, { params }); - } return [ { - id: ['doc', doc.id, linkToNode ? blockId : ''].join(':'), + id: 'links:doc:' + doc.id, source: 'link', group: { id: 'docs', @@ -94,9 +70,20 @@ export class LinksQuickSearchSession title: title, }, score, - icon: linkToNode ? BlockLinkIcon : icon, + icon: linkToNode + ? BlockLinkIcon + : resolvedDoc.mode === 'page' + ? PageIcon + : resolvedDoc.mode === 'edgeless' + ? EdgelessIcon + : icon, timestamp: updatedDate, - payload: { internal }, + payload: { + docId, + blockIds: resolvedDoc.blockIds, + elementIds: resolvedDoc.elementIds, + mode: resolvedDoc.mode, + }, } as QuickSearchItem<'link', LinkPayload>, ]; }); diff --git a/packages/frontend/core/src/modules/quicksearch/index.ts b/packages/frontend/core/src/modules/quicksearch/index.ts index 528dcd6cc1..3b85afd626 100644 --- a/packages/frontend/core/src/modules/quicksearch/index.ts +++ b/packages/frontend/core/src/modules/quicksearch/index.ts @@ -4,6 +4,7 @@ import { GlobalContextService, WorkspaceLocalState, WorkspaceScope, + WorkspaceService, } from '@toeverything/infra'; import { CollectionService } from '../collection'; @@ -16,6 +17,7 @@ import { CollectionsQuickSearchSession } from './impls/collections'; import { CommandsQuickSearchSession } from './impls/commands'; import { CreationQuickSearchSession } from './impls/creation'; import { DocsQuickSearchSession } from './impls/docs'; +import { ExternalLinksQuickSearchSession } from './impls/external-links'; import { LinksQuickSearchSession } from './impls/links'; import { RecentDocsQuickSearchSession } from './impls/recent-docs'; import { TagsQuickSearchSession } from './impls/tags'; @@ -30,6 +32,7 @@ export { CollectionsQuickSearchSession } from './impls/collections'; export { CommandsQuickSearchSession } from './impls/commands'; export { CreationQuickSearchSession } from './impls/creation'; export { DocsQuickSearchSession } from './impls/docs'; +export { ExternalLinksQuickSearchSession } from './impls/external-links'; export { LinksQuickSearchSession } from './impls/links'; export { RecentDocsQuickSearchSession } from './impls/recent-docs'; export { TagsQuickSearchSession } from './impls/tags'; @@ -55,7 +58,12 @@ export function configureQuickSearchModule(framework: Framework) { DocsService, DocDisplayMetaService, ]) - .entity(LinksQuickSearchSession, [DocsService, DocDisplayMetaService]) + .entity(LinksQuickSearchSession, [ + WorkspaceService, + DocsService, + DocDisplayMetaService, + ]) + .entity(ExternalLinksQuickSearchSession, [WorkspaceService]) .entity(CreationQuickSearchSession) .entity(CollectionsQuickSearchSession, [CollectionService]) .entity(TagsQuickSearchSession, [TagService]) diff --git a/packages/frontend/core/src/modules/quicksearch/services/cmdk.ts b/packages/frontend/core/src/modules/quicksearch/services/cmdk.ts index 226c5ea2e1..92e7e585fd 100644 --- a/packages/frontend/core/src/modules/quicksearch/services/cmdk.ts +++ b/packages/frontend/core/src/modules/quicksearch/services/cmdk.ts @@ -48,13 +48,13 @@ export class CMDKQuickSearchService extends Service { } if (result.source === 'link') { - if (result.payload.internal) { - const { docId, params } = result.payload.internal; - this.workbenchService.workbench.openDoc({ - docId, - ...params, - }); - } + const { docId, blockIds, elementIds, mode } = result.payload; + this.workbenchService.workbench.openDoc({ + docId, + blockIds, + elementIds, + mode, + }); return; } diff --git a/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx b/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx index dd754c900d..3cda71e210 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx +++ b/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx @@ -9,7 +9,7 @@ import { useDocMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta'; import { EditorService } from '@affine/core/modules/editor'; import { RecentDocsService } from '@affine/core/modules/quicksearch'; import { ViewService } from '@affine/core/modules/workbench/services/view'; -import type { PageRootService } from '@blocksuite/blocks'; +import { RefNodeSlotsProvider } from '@blocksuite/blocks'; import { DisposableGroup } from '@blocksuite/global/utils'; import { AiIcon, FrameIcon, TocIcon, TodayIcon } from '@blocksuite/icons/rc'; import { type AffineEditorContainer } from '@blocksuite/presets'; @@ -164,26 +164,28 @@ const DetailPageImpl = memo(function DetailPageImpl() { // blocksuite editor host const editorHost = editorContainer.host; - const pageService = - editorHost?.std.getService('affine:page'); + const std = editorHost?.std; const disposable = new DisposableGroup(); - if (pageService) { - disposable.add( - pageService.slots.docLinkClicked.on(({ pageId, params }) => { - if (params) { - const { mode, blockIds, elementIds } = params; - return jumpToPageBlock( - docCollection.id, - pageId, - mode, - blockIds, - elementIds - ); - } + if (std) { + const refNodeSlots = std.getOptional(RefNodeSlotsProvider); + if (refNodeSlots) { + disposable.add( + refNodeSlots.docLinkClicked.on(({ pageId, params }) => { + if (params) { + const { mode, blockIds, elementIds } = params; + return jumpToPageBlock( + docCollection.id, + pageId, + mode, + blockIds, + elementIds + ); + } - return openPage(docCollection.id, pageId); - }) - ); + return openPage(docCollection.id, pageId); + }) + ); + } } editor.setEditorContainer(editorContainer); diff --git a/packages/frontend/core/src/pages/workspace/detail-page/tabs/chat.tsx b/packages/frontend/core/src/pages/workspace/detail-page/tabs/chat.tsx index d99d457235..e07df7dc1e 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/tabs/chat.tsx +++ b/packages/frontend/core/src/pages/workspace/detail-page/tabs/chat.tsx @@ -1,5 +1,5 @@ import { ChatPanel } from '@affine/core/blocksuite/presets/ai'; -import { DocModeProvider } from '@blocksuite/blocks'; +import { DocModeProvider, RefNodeSlotsProvider } from '@blocksuite/blocks'; import { assertExists } from '@blocksuite/global/utils'; import type { AffineEditorContainer } from '@blocksuite/presets'; import { forwardRef, useCallback, useEffect, useRef } from 'react'; @@ -46,19 +46,21 @@ export const EditorChatPanel = forwardRef(function EditorChatPanel( const pageService = editor.host?.std.getService('affine:page'); if (!pageService) return; const docModeService = editor.host?.std.get(DocModeProvider); - if (!docModeService) return; + const refNodeService = editor.host?.std.getOptional(RefNodeSlotsProvider); const disposable = [ - pageService.slots.docLinkClicked.on(() => { - (chatPanelRef.current as ChatPanel).doc = editor.doc; - }), - docModeService.onPrimaryModeChange(() => { - if (!editor.host) return; - (chatPanelRef.current as ChatPanel).host = editor.host; - }, editor.doc.id), + refNodeService && + refNodeService.docLinkClicked.on(() => { + (chatPanelRef.current as ChatPanel).doc = editor.doc; + }), + docModeService && + docModeService.onPrimaryModeChange(() => { + if (!editor.host) return; + (chatPanelRef.current as ChatPanel).host = editor.host; + }, editor.doc.id), ]; - return () => disposable.forEach(d => d.dispose()); + return () => disposable.forEach(d => d?.dispose()); }, [editor]); if (!editor) { diff --git a/tools/cli/package.json b/tools/cli/package.json index 383d5329fd..df1be82c8a 100644 --- a/tools/cli/package.json +++ b/tools/cli/package.json @@ -6,7 +6,7 @@ "@affine/env": "workspace:*", "@affine/templates": "workspace:*", "@aws-sdk/client-s3": "^3.620.0", - "@blocksuite/presets": "0.17.8", + "@blocksuite/presets": "0.17.9", "@clack/core": "^0.3.4", "@clack/prompts": "^0.7.0", "@magic-works/i18n-codegen": "^0.6.0", diff --git a/yarn.lock b/yarn.lock index ec88f881db..5f97c80c79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -253,7 +253,7 @@ __metadata: "@affine/env": "workspace:*" "@affine/templates": "workspace:*" "@aws-sdk/client-s3": "npm:^3.620.0" - "@blocksuite/presets": "npm:0.17.8" + "@blocksuite/presets": "npm:0.17.9" "@clack/core": "npm:^0.3.4" "@clack/prompts": "npm:^0.7.0" "@magic-works/i18n-codegen": "npm:^0.6.0" @@ -312,12 +312,12 @@ __metadata: "@affine/i18n": "workspace:*" "@atlaskit/pragmatic-drag-and-drop": "npm:^1.2.1" "@atlaskit/pragmatic-drag-and-drop-hitbox": "npm:^1.0.3" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/blocks": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/blocks": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" "@blocksuite/icons": "npm:2.1.67" - "@blocksuite/presets": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/presets": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@chromatic-com/storybook": "npm:^1" "@dnd-kit/core": "npm:^6.1.0" "@dnd-kit/modifiers": "npm:^7.0.0" @@ -413,14 +413,14 @@ __metadata: "@affine/graphql": "workspace:*" "@affine/i18n": "workspace:*" "@affine/templates": "workspace:*" - "@blocksuite/affine-block-surface": "npm:0.17.8" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/blocks": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" + "@blocksuite/affine-block-surface": "npm:0.17.9" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/blocks": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" "@blocksuite/icons": "npm:2.1.67" - "@blocksuite/inline": "npm:0.17.8" - "@blocksuite/presets": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/inline": "npm:0.17.9" + "@blocksuite/presets": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@dnd-kit/core": "npm:^6.1.0" "@dnd-kit/modifiers": "npm:^7.0.0" "@dnd-kit/sortable": "npm:^8.0.0" @@ -553,10 +553,10 @@ __metadata: "@affine/env": "workspace:*" "@affine/i18n": "workspace:*" "@affine/native": "workspace:*" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/blocks": "npm:0.17.8" - "@blocksuite/presets": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/blocks": "npm:0.17.9" + "@blocksuite/presets": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@electron-forge/cli": "npm:^7.3.0" "@electron-forge/core": "npm:^7.3.0" "@electron-forge/core-utils": "npm:^7.3.0" @@ -612,8 +612,8 @@ __metadata: version: 0.0.0-use.local resolution: "@affine/env@workspace:packages/common/env" dependencies: - "@blocksuite/global": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/global": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" lit: "npm:^3.1.2" react: "npm:18.3.1" react-dom: "npm:18.3.1" @@ -672,7 +672,7 @@ __metadata: "@affine/env": "workspace:*" "@affine/graphql": "workspace:*" "@affine/i18n": "workspace:*" - "@blocksuite/blocks": "npm:^0.17.6" + "@blocksuite/blocks": "npm:0.17.9" "@blocksuite/icons": "npm:^2.1.66" "@radix-ui/react-collapsible": "npm:^1.0.3" "@sentry/react": "npm:^8.0.0" @@ -3459,17 +3459,17 @@ __metadata: languageName: node linkType: hard -"@blocksuite/affine-block-list@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/affine-block-list@npm:0.17.8" +"@blocksuite/affine-block-list@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/affine-block-list@npm:0.17.9" dependencies: - "@blocksuite/affine-components": "npm:0.17.8" - "@blocksuite/affine-model": "npm:0.17.8" - "@blocksuite/affine-shared": "npm:0.17.8" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" - "@blocksuite/inline": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/affine-components": "npm:0.17.9" + "@blocksuite/affine-model": "npm:0.17.9" + "@blocksuite/affine-shared": "npm:0.17.9" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" + "@blocksuite/inline": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@floating-ui/dom": "npm:^1.6.10" "@lit-labs/preact-signals": "npm:^1.0.2" "@lit/context": "npm:^1.1.2" @@ -3477,21 +3477,21 @@ __metadata: lit: "npm:^3.2.0" minimatch: "npm:^10.0.1" zod: "npm:^3.23.8" - checksum: 10/68f4c62ec562d21c206e54fb6113e2aba54986844e6b146c8a77f3b91a92ae22ad80ac0f54c9d1454d25e115164c3db796fd69abd8b204d4cb5a4d53dbcb9a40 + checksum: 10/c6b701aa8a29208166ced47d8584ab059280a3bed6bed12e5839bb0e08975c0aa0e82e848c009dfa031bcde8a7c99ce32696ac7fcc3586a292a79536582f8e13 languageName: node linkType: hard -"@blocksuite/affine-block-paragraph@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/affine-block-paragraph@npm:0.17.8" +"@blocksuite/affine-block-paragraph@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/affine-block-paragraph@npm:0.17.9" dependencies: - "@blocksuite/affine-components": "npm:0.17.8" - "@blocksuite/affine-model": "npm:0.17.8" - "@blocksuite/affine-shared": "npm:0.17.8" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" - "@blocksuite/inline": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/affine-components": "npm:0.17.9" + "@blocksuite/affine-model": "npm:0.17.9" + "@blocksuite/affine-shared": "npm:0.17.9" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" + "@blocksuite/inline": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@floating-ui/dom": "npm:^1.6.10" "@lit-labs/preact-signals": "npm:^1.0.2" "@lit/context": "npm:^1.1.2" @@ -3499,20 +3499,20 @@ __metadata: lit: "npm:^3.2.0" minimatch: "npm:^10.0.1" zod: "npm:^3.23.8" - checksum: 10/b0bd8eea9e267478d2fddbd0eb22908e110a322fa77144cdfa68db884dfa8d60b29834d2a637050c96823c3916692a1008c0da225113b82c239778f3da3fb659 + checksum: 10/f541305d56addd4327f0e8575bf0d325c8477e432e8c1a308a7cc0f807f4e8500859d085f08acec2285c04e8d808bff33224dc16d4876f12e646f15b903aa814 languageName: node linkType: hard -"@blocksuite/affine-block-surface@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/affine-block-surface@npm:0.17.8" +"@blocksuite/affine-block-surface@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/affine-block-surface@npm:0.17.9" dependencies: - "@blocksuite/affine-components": "npm:0.17.8" - "@blocksuite/affine-model": "npm:0.17.8" - "@blocksuite/affine-shared": "npm:0.17.8" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/affine-components": "npm:0.17.9" + "@blocksuite/affine-model": "npm:0.17.9" + "@blocksuite/affine-shared": "npm:0.17.9" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@lit-labs/preact-signals": "npm:^1.0.2" "@lit/context": "npm:^1.1.2" "@toeverything/theme": "npm:^1.0.8" @@ -3522,21 +3522,21 @@ __metadata: lodash.merge: "npm:^4.6.2" nanoid: "npm:^5.0.7" zod: "npm:^3.23.8" - checksum: 10/94d8992df283977aa3a43ef7a0c7c4d1b9c318a8d892b1c50d9d0313b469df3390846e276811a097dea5afaa30636e7da7e4656c73b9f42d780a61f05c274d43 + checksum: 10/81aab96baf0b3594d4221e61311a4ddc31f2a21a118f625de0f8f68a9b8d5061d667c6c95eb5b9eaefc65dd79a8099871a84284f11044b82a3f23b6ffe7349df languageName: node linkType: hard -"@blocksuite/affine-components@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/affine-components@npm:0.17.8" +"@blocksuite/affine-components@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/affine-components@npm:0.17.9" dependencies: - "@blocksuite/affine-model": "npm:0.17.8" - "@blocksuite/affine-shared": "npm:0.17.8" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" + "@blocksuite/affine-model": "npm:0.17.9" + "@blocksuite/affine-shared": "npm:0.17.9" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" "@blocksuite/icons": "npm:^2.1.67" - "@blocksuite/inline": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/inline": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@floating-ui/dom": "npm:^1.6.10" "@lit-labs/preact-signals": "npm:^1.0.2" "@lit/context": "npm:^1.1.2" @@ -3547,32 +3547,32 @@ __metadata: lit: "npm:^3.2.0" shiki: "npm:^1.12.0" zod: "npm:^3.23.8" - checksum: 10/646c7724388bdd0dc5b8529cb8a54d0252517cbd9ce4ee07ac0a2f3bc35c1bafbf00f38574242f5a86069927faf017091745a08a41042aae9da6c4fd553d2210 + checksum: 10/feab7d2d96e100f71d3dcf431ec12fc1cc69348fa180859fb153281f345a3ffd375b54e8f163dbffecd637b88c1458cc76dc341b7529a29e2583ad713f295d42 languageName: node linkType: hard -"@blocksuite/affine-model@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/affine-model@npm:0.17.8" +"@blocksuite/affine-model@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/affine-model@npm:0.17.9" dependencies: - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" - "@blocksuite/inline": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" + "@blocksuite/inline": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" zod: "npm:^3.23.8" - checksum: 10/9061af4e24aca2d88ddd3e659cf3d720dacd2b71f89e93b0ea15869b07e01d4574063910dc49e33aace97281c723abe9dc4dbc0a3cd20708403a06b9c0cbc2b1 + checksum: 10/85cb13308938e594e25380d922b7f63188132aae755c905a25f43509c66fe98ddc69e3e7af0e56caf24e71d9febe80235686d0f1fe71d4c12747793147a7b79e languageName: node linkType: hard -"@blocksuite/affine-shared@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/affine-shared@npm:0.17.8" +"@blocksuite/affine-shared@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/affine-shared@npm:0.17.9" dependencies: - "@blocksuite/affine-model": "npm:0.17.8" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" - "@blocksuite/inline": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/affine-model": "npm:0.17.9" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" + "@blocksuite/inline": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@floating-ui/dom": "npm:^1.6.10" "@lit-labs/preact-signals": "npm:^1.0.2" "@lit/context": "npm:^1.1.2" @@ -3580,17 +3580,17 @@ __metadata: lit: "npm:^3.2.0" minimatch: "npm:^10.0.1" zod: "npm:^3.23.8" - checksum: 10/3d23ccf99515ec986943fb99c12bdb17056fa9dae8606d0928ddde22159afd79581257a05b260b91dda9fb38a9b8ab5228607e50105bafaa02f0e0203662c58e + checksum: 10/ca033985da018d13c52ba045e96579894541222fe8a1bb630a7803df97bc04f56c25da65c115e0c4363aa09ce8b7fb7582af1eacf9ed77551d7cdcc9578745d7 languageName: node linkType: hard -"@blocksuite/block-std@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/block-std@npm:0.17.8" +"@blocksuite/block-std@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/block-std@npm:0.17.9" dependencies: - "@blocksuite/global": "npm:0.17.8" - "@blocksuite/inline": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/global": "npm:0.17.9" + "@blocksuite/inline": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@lit-labs/preact-signals": "npm:^1.0.2" "@lit/context": "npm:^1.1.2" "@types/hast": "npm:^3.0.4" @@ -3602,26 +3602,26 @@ __metadata: unified: "npm:^11.0.5" w3c-keyname: "npm:^2.2.8" zod: "npm:^3.23.8" - checksum: 10/b58cd1a66117f2685258d49132544c413d2e8ff3857195a9f8f230945b4890e394f69d731945c81c31ff8a2365754c708100cf7d594f9d9637288ee1450440ff + checksum: 10/732b5e97adcc0ae5110f7dfb9baa39950d27e1be1c9ce875c1e2789be6a9467f7af08379e2c542dd4f07c936621fe1a8e893bef938e68665cbfea00c69153174 languageName: node linkType: hard -"@blocksuite/blocks@npm:0.17.8, @blocksuite/blocks@npm:^0.17.6": - version: 0.17.8 - resolution: "@blocksuite/blocks@npm:0.17.8" +"@blocksuite/blocks@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/blocks@npm:0.17.9" dependencies: - "@blocksuite/affine-block-list": "npm:0.17.8" - "@blocksuite/affine-block-paragraph": "npm:0.17.8" - "@blocksuite/affine-block-surface": "npm:0.17.8" - "@blocksuite/affine-components": "npm:0.17.8" - "@blocksuite/affine-model": "npm:0.17.8" - "@blocksuite/affine-shared": "npm:0.17.8" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/data-view": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" + "@blocksuite/affine-block-list": "npm:0.17.9" + "@blocksuite/affine-block-paragraph": "npm:0.17.9" + "@blocksuite/affine-block-surface": "npm:0.17.9" + "@blocksuite/affine-components": "npm:0.17.9" + "@blocksuite/affine-model": "npm:0.17.9" + "@blocksuite/affine-shared": "npm:0.17.9" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/data-view": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" "@blocksuite/icons": "npm:^2.1.67" - "@blocksuite/inline": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/inline": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@floating-ui/dom": "npm:^1.6.10" "@lit-labs/preact-signals": "npm:^1.0.2" "@lit/context": "npm:^1.1.2" @@ -3662,20 +3662,20 @@ __metadata: sortablejs: "npm:^1.15.2" unified: "npm:^11.0.5" zod: "npm:^3.23.8" - checksum: 10/4484968250f30e6ecf03e59c924471dbced9b8bb1520086a067997cbf66a8f3901772794a6c139e9aa65174046748e3369bd6dbfeeb9d3f85c6db7b19b30aab3 + checksum: 10/7e8fc2c5a7374cd03f291ecbdd3ca6c93917024d6ad052e65f3b75d30d7a1268ce583a53ec4482d8af5958999469bf3c009e8fa9485a8ef8b094e938fba66dae languageName: node linkType: hard -"@blocksuite/data-view@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/data-view@npm:0.17.8" +"@blocksuite/data-view@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/data-view@npm:0.17.9" dependencies: - "@blocksuite/affine-components": "npm:0.17.8" - "@blocksuite/affine-shared": "npm:0.17.8" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" + "@blocksuite/affine-components": "npm:0.17.9" + "@blocksuite/affine-shared": "npm:0.17.9" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" "@blocksuite/icons": "npm:^2.1.67" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/store": "npm:0.17.9" "@floating-ui/dom": "npm:^1.6.10" "@lit-labs/preact-signals": "npm:^1.0.2" "@lit/context": "npm:^1.1.2" @@ -3684,17 +3684,17 @@ __metadata: lit: "npm:^3.2.0" sortablejs: "npm:^1.15.2" zod: "npm:^3.23.8" - checksum: 10/21efbf665fbd46dd4a694fd848e9e2e30b2e8099bd5edab13c047b54cfa0977720357a41754fb7af0c5312e409da2388dc70696b632f255d2faf09c5f6e049ba + checksum: 10/7fa5f4efb076e3cc6ce146f674d5999d3a0d8cfbf578f2219fb0b197bdd38f0786395757c172ae1b2eef6fc4e43428197f87dc65c85c925a726d4b49cc386992 languageName: node linkType: hard -"@blocksuite/global@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/global@npm:0.17.8" +"@blocksuite/global@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/global@npm:0.17.9" dependencies: lib0: "npm:^0.2.97" zod: "npm:^3.23.8" - checksum: 10/0659b46eb7464d677a75482fc836f4335dbbb390f9d05fc9f27510640c9cea0dd2b3628f166ba5050bfaf08d105835c2ed08bb9511ad6c924443125f4dac7904 + checksum: 10/3a7ddfd571639ff4c59798f2ff1e05e8a78e78ce5756ca7043e949632c1cb7b8d3a0a973c01f33fe0e4e6b6156e7a1ecf5fea42f8a3a4b3b3317ec14a85899fb languageName: node linkType: hard @@ -3714,47 +3714,47 @@ __metadata: languageName: node linkType: hard -"@blocksuite/inline@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/inline@npm:0.17.8" +"@blocksuite/inline@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/inline@npm:0.17.9" dependencies: - "@blocksuite/global": "npm:0.17.8" + "@blocksuite/global": "npm:0.17.9" zod: "npm:^3.23.8" peerDependencies: lit: ^3.2.0 yjs: ^13.6.18 - checksum: 10/f37ed31a600e83bf687d61f2fd7330916164813339949a63454f7b1cc1418d7b47ffd938c030b99527231315cd27576c3d4cb055cbdc40265336cc5afc482f27 + checksum: 10/9e38c030c484e076890a3fccb61320f8919d3b6eb39d08c5408878487a8a0529661c99f6c369c449152fe5d39b89b4c9865144b5ad984a5f5d2ca0b85962a442 languageName: node linkType: hard -"@blocksuite/presets@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/presets@npm:0.17.8" +"@blocksuite/presets@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/presets@npm:0.17.9" dependencies: - "@blocksuite/affine-block-surface": "npm:0.17.8" - "@blocksuite/affine-shared": "npm:0.17.8" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/blocks": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" - "@blocksuite/inline": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/affine-block-surface": "npm:0.17.9" + "@blocksuite/affine-shared": "npm:0.17.9" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/blocks": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" + "@blocksuite/inline": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@floating-ui/dom": "npm:^1.6.10" "@lit-labs/preact-signals": "npm:^1.0.2" "@lottiefiles/dotlottie-wc": "npm:^0.2.16" "@toeverything/theme": "npm:^1.0.8" lit: "npm:^3.2.0" zod: "npm:^3.23.8" - checksum: 10/97ef7c0b47634acf042a333b1b7ca0282796d58489c31e24f04b8fb56f70811ba61ea05fa85bc066a117af4b815c308e4d983756bd64348262e59307a3c83d4b + checksum: 10/d4c48c4a7a5108cc9364a215d92d35134ca7b9180b768d766b5e7ca30aa8ae3e2e64ec964d85c9be901d7328d6e2c9dc37842a57ee894972997cbeb0719fdaf8 languageName: node linkType: hard -"@blocksuite/store@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/store@npm:0.17.8" +"@blocksuite/store@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/store@npm:0.17.9" dependencies: - "@blocksuite/global": "npm:0.17.8" - "@blocksuite/inline": "npm:0.17.8" - "@blocksuite/sync": "npm:0.17.8" + "@blocksuite/global": "npm:0.17.9" + "@blocksuite/inline": "npm:0.17.9" + "@blocksuite/sync": "npm:0.17.9" "@preact/signals-core": "npm:^1.8.0" "@types/flexsearch": "npm:^0.7.6" "@types/lodash.ismatch": "npm:^4.4.9" @@ -3769,21 +3769,21 @@ __metadata: zod: "npm:^3.23.8" peerDependencies: yjs: ^13.6.18 - checksum: 10/f6e96d4d85b8b0ce4ff476b42c8d9cfd7b42fdda37228e0c41156b04d2c72f83ab83bf600c48a17ee56b6e26389ad9c465620f9ef78c239198708da8d518c0ca + checksum: 10/a8ec135ee0f67316867f8215e99af278a55f8b3e59cff2fd0840315f7e3e9185dc3843854c53002e8a03ca248bca985d84cf178a0cc01aa5f474df2622cc2b7e languageName: node linkType: hard -"@blocksuite/sync@npm:0.17.8": - version: 0.17.8 - resolution: "@blocksuite/sync@npm:0.17.8" +"@blocksuite/sync@npm:0.17.9": + version: 0.17.9 + resolution: "@blocksuite/sync@npm:0.17.9" dependencies: - "@blocksuite/global": "npm:0.17.8" + "@blocksuite/global": "npm:0.17.9" idb: "npm:^8.0.0" idb-keyval: "npm:^6.2.1" y-protocols: "npm:^1.0.6" peerDependencies: yjs: ^13.6.15 - checksum: 10/1eef8465eef48d8b18082458cecd37747bcb1759c5a57a473b06b2d2fb9d403a8d9b31fb0f2e035cdb97ddd7f1d466a9367de01c9c88ba004e8c3cae77b76b2c + checksum: 10/a727ebbfeaa8ec4976219d463b5c6fdf3201abb089ebc10f0c841e4b3230f5d2297076b36123a02bafdfb238b7593ca5016296fa336d95c2d842d5bb188960fb languageName: node linkType: hard @@ -14216,11 +14216,11 @@ __metadata: "@affine/debug": "workspace:*" "@affine/env": "workspace:*" "@affine/templates": "workspace:*" - "@blocksuite/block-std": "npm:0.17.8" - "@blocksuite/blocks": "npm:0.17.8" - "@blocksuite/global": "npm:0.17.8" - "@blocksuite/presets": "npm:0.17.8" - "@blocksuite/store": "npm:0.17.8" + "@blocksuite/block-std": "npm:0.17.9" + "@blocksuite/blocks": "npm:0.17.9" + "@blocksuite/global": "npm:0.17.9" + "@blocksuite/presets": "npm:0.17.9" + "@blocksuite/store": "npm:0.17.9" "@datastructures-js/binary-search-tree": "npm:^5.3.2" "@testing-library/react": "npm:^16.0.0" async-call-rpc: "npm:^6.4.0"